Sonntag, 13. Mai 2018

Bad Practices - Ein schlechtes Beispiel für SSH Key Authentication

Heute kam mir beim Lesen einer von Hakin9 auf Facebook geteilten Anleitung eine Idee: Ich werde ab sofort regelmäßig schlechte und unsichere Tutorials/Howtos und Tipps kommentieren und erklären wie man es besser macht. Wenn sogar ein "IT Security Magazin" wie Hakin9 schlechte Anleitungen teilt ohne auf die Probleme darin aufmerksam zu machen, gehe ich davon aus, dass ich für diese Serie mehr als genug Vorlagen finden werde.

Den Anfang in dieser Serie macht folgende Anleitung: https://linux.tips/tutorials/how-to-login-ssh-with-private-key (Stand: 13. Mai 2018).
Ein wichtiger Hinweis vorweg: Key Authentication ist natürlich bei weitem sicherer als eine Passwort-basierte Variante und sollte, besonders für SSH-Zugriffe über das Internet, immer die erste Wahl sein. Der Grund, warum ich mir genau diese Anleitung als Anfang herausgesucht habe, ist der, dass der Inhalt schon seit Ewigkeiten bekannt ist und es schon tausende Anleitungen dazu gibt. Somit ist die verlinkte Anleitung bestenfalls redundant und schlimmstenfalls ein schlechte Kopie (wenn man in angegebenen Referenzen reinschaut sieht man sofort, dass viel Inhalt Copy&Paste von hier war). Zusätzlich sind in der Anleitung einige Stellen veraltet, es fehlen wichtige Informationen und notwendige Sicherheitsmaßnahmen.

Fangen wir mit Step 1. Generate SSH Key Pair on the client machine an:
cd ~/.ssh
ssh-keygen -t rsa
Wie man in der Ausgabe in der Anleitung sehen kann, erzeugt der Aufruf ssh-keygen -t rsa einen RSA Schlüssel mit einer Länge von 2048bit. Das entspricht den heutigen minimal Längen die man noch sicher verwenden kann. Github empfiehlt zum Beispiel aktuell 4096bit. Darüber, ob ein Schlüssel bereits heute so lang sein muss, kann man  sich streiten. Aber, solange man nicht auf einem embedded System ist, tut es nicht weh und somit sollte es zumindest die Empfehlung sein. Für eine Anleitung die im Mai 2018 veröffentlicht wird ist es auf jeden Fall zu kurz.

Ich persönlich erzeuge meine Schlüssel zur Zeit mit folgendem Befehl:
ssh-keygen -t ed25519
Damit erzeuge ich einen asym. Key-Paar mit der Länge von nur 256bit. Da ich allerdings an Stelle von RSA den Algorithmus ed25519 verwende, erreiche ich damit ein Sicherheitsniveau welches RSA mit ca. 3072bit entspricht! Neben der kleineren Schlüssellänge ist ed25519 auch in der Berechnung schneller als RSA mit einer vergleichbaren Sicherheit. Somit ist das auch eine Variante, die auf embedded Systemen mit begrenzen Ressourcen gut und sicher funktioniert.

In Step 1. geht der Autor zusätzlich auch noch auf die "optionale" Passphrase ein:
When asked for passphrase, leave it blank or enter your desired passphrase. Having a passphrase makes automation difficult for some of the processes.
Er rät somit mehr oder weniger von dem Setzen eine Passphrase ab. Er hat zwar recht mit seinem Hinweis das eine Passphrase eine automatisierte Verwendung des Schlüssel erschweren kann, allerdings erklärt er nicht was eine Passphrase bringt und was man beachten sollte, wenn man sie nicht setzt:
Wenn keine Passphrase gesetzt ist, liegt der private Schlüssel unverschlüsselt im Dateisystem. Jeder der Zugriff auf die Datei erlangte hat somit automatisch auch Zugriff auf den Inhalt. Auf einem Single-User-System ist das vielleicht nicht so kritisch, aber auf einem Multi-User-System oder auf Server-System sollte man mit SSH-Schlüsseln ohne Passphrase sehr vorsichtig umgehen.

Als Alternative zu Passphrase-losen Schlüsseln kann man oft auch auf SSH Agents (sehr einfach mit mittels Keychain nutzbar)  zurückgreifen. Allerdings setzt auch das zumindest eine einmalige Eingabe der Passphrase nach dem Systemstart voraus. Wenn gar keine Benutzerinteraktion möglich ist, kenne ich leider auch keine andere Möglichkeit als einen Schlüssel ohne Passphrase zu verwenden.
Wenn es nicht anders geht als mit einem Schlüssel ohne Passphrase sollte man folgende Maßnahmen umsetzen um das damit verbundene Risiko zu reduzieren:

  • Der Passphrase-lose Schlüssel sollte stark in seinen Berechtigungen eingeschränkt werden. Das lässt sich einfach über die Datei ~/.ssh/authorized_keys auf dem Zielsystem erreichen. Die verfügbaren Optionen sind im SSH Manual sshd(8) unter  AUTHORIZED_KEYS_FILE_FORMAT aufgeführt. Besonders wichtig ist die Option command. Solange die nicht gesetzt ist, könnte man sich mit dem Schlüssel anmelden und die Datei authorized_keys editieren um die Restriktionen wieder aufzuheben.
  • Man sollte für normalen/ nicht automatisierten SSH Zugriff immer einen Schlüssel mit Passphrase verwenden.
  • Der automatisierte Zugriff auf dem Zielsystem  sollte nur auf einen stark limitierten Benutzer erfolgen.
  • Idealerweise sollte für den automatisierten Zugriff über SSH ein eigener Benutzer auf dem Zielsystem eingerichtet werden. In dem Fall kann der SSH Zugriff zentral über die sshd_config für den Benutzer beschränkt werden (robuster als per authorized_keys)

Die folgenden Abschnitte Step 2.-5. können getrost ignoriert werden. Sie lassen sich vollständig mit einem Aufruf von ssh-copy-id ersetzen:
ssh-copy-id -i [PATH-TO-ID.pub] user@target
Zu Step 3: Copy public key file from client to the server machine muss ich allerdings trotzdem noch etwa schreiben. Der Vorschlag in der Anleitung ist es, den pub. Key wie folgt per SCP auf das Zielsystem zu kopieren:
scp -P "ssh-port" ~/.ssh/id_dsa.pub username@serverip-address:~/.ssh
Das geht theoretisch zwar auch, man sollte aber niemals dem Vorschlag aus der Anleitung folgen und den Key direkt nach ~/.ssh zu kopieren. Der Autor geht davon aus, dass ~/.ssh leer ist. Wenn dort bereits ein Key-Paar liegt wird der pub. Key von SCP ohne Rückfrage überschrieben!

Nachdem getestet wurde ob der Zugriff mittels Key funktioniert, sollte als nächstes der Login mittels Password deaktiviert werden. Wie der Autor korrekterweise schreibt, macht dieser Schritt Bruteforce Angriffe nahezu unmöglich. Leider wird in der Anleitung nicht aufgeführt wie das funktioniert: Hierzu muss nur die Option PasswordAuthentication in der Datei /etc/ssh/sshd_config auf no gesetzt werden.

Freitag, 11. Mai 2018

SSH Tricks - Remote Port Forwarding, oder: Support-Zugriff auf den PC der Mutter

Mittels SSH gibt es eine einfache Möglichkeit einen Remote-Zugriff auf Systeme hinter Firewalls/ NAT zu ermöglichen: Remote Port Forwarding - eine besonders nützliche Funktion wenn man bei den Eltern IT-Support macht und nicht ständig hinfahren will ;)

Wie in folgendem Bild zu sehen ist, lässt sich mittels Remote Port Forwarding ein beliebiger lokaler Port auf einem System (in der Grafik TARGET) an einen Port auf einem Remote Server weiterreichen. Alle eingehenden Verbindungen auf diesem Port am Remote Server werden dann automatisch durch die bestehende SSH Verbindung zu dem System hinter der Firewall weitergegeben. Somit kann, trotz NAT und Firewall, eine Verbindung per SSH von SUPPORT zu TARGET aufgebaut werden. 

SSH Remote Port Forwarding

SSH Konfiguration

Hinweis: Im Folgenden werden nur die relevanten Einstellungen für unser Port-Forwarding aufgeführt. Da beide SSH-Dienste über das Internet erreichbar sein werden, sollten deren Konfiguration grundsätzlich gehärtet und sicher sein. Eine gute Anleitung dazu gibt es im Gentoo-Wiki.

Mit folgenden Einstellung lässt sich das Port Forwarding auf dem SERVER aktivieren. Da wir die Verbindung dauerhaft aufrecht erhalten wollen und dabei das Risiko für SERVER so klein wie möglich halten wollen, erstellen wir für das Port Forwarding einen eigenen Benutzer namens remoteport auf SERVER und schränken diesen stark ein. Hierzu legen wir den Benutzer mit minimalen Berechtigungen ohne Gruppenzugehörigkeit an:
SERVER # useradd -m remoteport
Zusätzlich sorgen wir per Konfiguration des SSH-Daemon dafür, dass dieser Benutzer nur Remote Port Forwarding nutzen kann:
  • ForceCommand: Damit wird verhindert das der Benutzer eine shell oder scp/sftp benutzen kann. Stattdessen wird immer und ausschließlich der definierte Befehl ausgeführt.
  • X11Forwarding: Deaktivierung von X11-Weiterleitung durch den SSH-Tunnel
  • PermitTunnel: Deaktivierung der VPN-Funktionalität (Weiterleitung von TUN Interfaces)
  • PermitOpen: Limitierung von Local Port Forwarding. Ohne kann SERVER als Proxy benutzt werden.
Mittels der Option GatewayPorts lässt sich konfigurieren, ob die weitergeleiteten Ports auf dem Server extern zugreifbar sind oder nur über localhost/loopback interface.
Je nachdem was in der sshd_config global erlaubt wurde sollte natürlich noch mehr für den Benutzer deaktiviert werden (z.B. AgentForwarding)

Benötigte Einstellungen: /etc/ssh/sshd_config auf SERVER
PermitRootLogin no
PasswordAuthentication no
Match User remoteport
    AllowTCPForwarding yes
    X11Forwarding no
    PermitTunnel no
    PermitOpen localhost:61234
    GatewayPorts yes
    ForceCommand echo 'Support Account - Login forbidden'
Da durch das Remote Port Forwarding der SSH-Dienst auf TARGET über das Internet erreichbar sein wird, sollten zumindest, zum Schutz vor Bruteforce-Angriffen, keine Passwortbasierte Anmeldung zugelassen werden.

Empfohlene Einstellungen: /etc/ssh/sshd_config auf TARGET
PermitRootLogin no
PasswordAuthentication no
Nachdem wir die Konfiguration gemacht haben, müssen wir nur noch je ein SSH-Key-Paar auf TARGET und SUPPORT erzeugen und die public Keys verteilen:
# ssh-keygen -t ed25529
Die Verteilung der Keys sieht dann wie folgt aus:
  1. id_ed25519.pub von TARGET muss in die Datei ~remoteport/.ssh/authorized_keys auf SERVER eingetragen werden
  2. id_ed25519.pub von SUPPORT muss in die Datei ~support/.ssh/authorized_keys auf TARGET eingetragen werden
Danach kann von TARGET aus der Tunnel zu Server mit folgendem Befehl aufgebaut werden:
# ssh -N -R 60022:localhost:22 remoteport@SERVER  

Automatischer Start des SSH-PortForwarding beim Booten

In meinem Beispiel soll über SSH ein Remote Support für meine Mutter ermöglicht werden. Um es möglichst fehlertolerant zu gestalten, muss der Tunnel automatisch beim System-Start aufgebaut werden. Voraussetzung hierzu ist allerdings, dass der verwendete Schlüssel für die Authentisierung ohne Passphrase abgelegt ist. In dem Fall ist es also umso wichtiger, dass der Benutzer remoteport gut abgesichert ist!

Als erstes legen wir uns ein kleines Script unter /usr/local/bin/remote_port.sh an (natürlich muss es noch als ausführbar markiert werden):
#!/bin/sh
ssh -i [PATH-TO-id_ed25519.pub] -N -R 60022:localhost:22 remoteport@SERVER
Als nächstes müssen wir nur noch dafür sorgen, dass das Script beim System-Start ausgeführt wird. Das geht z.B. bei systemd durch das Erzeugen eines Unit-Files unter /etc/systemd/system/remote_ssh.service:
[Unit]
Description=SSH Remote Port Forwarding
ConditionPathExists=|/usr/bin
After=network.target
[Service]
User=localuser
ExecStart=/usr/local/bin/remote_port.sh
RestartSec=60
Restart=always
[Install]
WantedBy=multi-user.target
Natürlich muss der Unit-File noch "enabled" werden damit er auch beim System-Start ausgeführt wird:
# systemctl enable remote_ssh.service
Bei anderen Init-Systemen ist das ähnlich einfach. Ggf. muss man nur die auto-restart-Funktionalität selber bauen. Das geht z.B. in dem man einfach das Script remote_port.sh beim Aufruf forked und dann im Hintergrund innerhalb einer while true-Schleife das SSH-Kommando einfach neu startet sobald es sich beendet hat.  

Gentoo/Linux - OpenGL fähige 32bit chroot Umgebung für wine

Diese Anleitung basiert auf dem 32-bit chroot Guide aus dem Gentoo-Wiki und erweitert diesen. 

Meine Systeme sind inzwischen alle rein 64bit ohne Multilib/32bit Support. Das geht im Alltag ganz gut, aber leider braucht man speziell für alte Windows-Spiele dann doch eine 32bit Umgebung. Das liegt daran, das Wine (Abkürzung für Wine is not an Emulator) kein Emulator ist, sondern nur eine art API-Wrapper (Übersetzer zwischen Windows Funktionen auf Linux-Funktionen/Syscalls). Somit brauchen 32bit-Windows-Programme auch mit Wine eine 32bit Umgebung.

Mein erster Versuch die chroot-Umgebung per Crossdev zu erzeugen ist leider Fehlgeschlagen (theoretisch sollte es aber möglich sein...). Mein zweiter Ansatz war, ein 32bit Gentoo nach Handbuch zu installieren. Dabei muss natürlich auf ein paar Kleinigkeiten geachtet werden:
  1. Wir müssen erstmal ein Verzeichnis anlegen in dem die chroot-Umgebung entstehen soll
  2. Wir brauchen natürlich kein Bootmedium
  3. Wir müssen keine Netzwerkkonfiguration vornehmen
  4. Wir müssen keine Festplatten partitionieren
  5. Nach dem Entpacken vom Basissystem müssen wir uns keinen neuen Portage-Tree-Snapshot runterladen sondern können einfach den Portage-Tree vom Host-System mitbenutzen
  6. Wir können viele Konfigurationsdateien vom Host-System übernehmen
Bitte schaut für Details und Erklärungen zu der Gentoo-Installation in das Gentoo Handbuch. Ich werde hier nur die Abweichungen von der normalen Installation genauer erklären.

Wichtig: Bevor wir anfangen sollten wir sicherstellen, dass unser Host-System auf einem aktuellen Stand ist. Um Probleme zu vermeiden, empfiehlt es sich auch vorher schon mal auf die Stable-Version der nvidia-drivers zu wechseln.

Am Anfang können wir uns, bis darauf das wir kein Boot-Medium benötigen, nach Handbuch vorgehen:
# mkdir -p /usr/gentoo32/usr/portage
# cd /usr/gentoo32
# wget [stage3-file from https://www.gentoo.org/downloads/]
# wget [stage3-file.DIGEST.asc from https://www.gentoo.org/downloads/]
# gpg --verify [stage3-file.DIGESTS.asc]
# tar xpf [stage3-file] --xattrs-include='*.*' --numeric-owner
# chmod 1777 /usr/gentoo32/tmp
# vim /usr/gentoo32/etc/portage/make.conf

Bis hierher war es fast identisch zu der normalen Gentoo Installation. Für die chroot-Umgebung wollen wir jetzt aber möglichst viel vom Host-System wiederverwenden. Besonders wichtig: Damit OpenGL am Ende funktioniert müssen die Grafikkartentreiber in der chroot-Umgebung und außerhalb zusammenpassen. In meinem Fall bedeutet das, dass ich exakt die gleiche nvidia-drivers-Version innerhalb und außerhalb installiert haben muss! Um das zu erreichen, müssen wir sicherstellen, dass wir die gleichen Versionen per Mask/Unmask freigeschaltet haben. Die meiste Zeit über reicht es, wenn wir einfach die entsprechenden Verzeichnisse/ Dateien aus dem Host-System
in die chroot-Umgebung kopieren:
# cp -r /etc/portage/package.keywords /usr/gentoo32/etc/portage
# cp -r /etc/portage/package.unmask /usr/gentoo32/etc/portage
Achtung: Die Einträge innerhalb der kopierten Dateien aus dem Host-System sind natürlich mit dem Keyword ~amd64 versehen. Das kann gut gehen, aber wird auf Dauer sicher zu Problemen führen! Daher sollten wir das beheben:
# cd /usr/gentoo32/etc/portage/package.keywords
# for i in *.keywords; do sed -ri 's/amd64/x86/' $i; done;
Optional: Wenn eine Trennung der Spiel-Umgebung von dem normalen System-Benutzer gewünscht ist, ist jetzt der richtige Zeitpunkt um diesen anzulegen:
 # useradd -m -G audio,video,cdrom player
Bevor wir die chroot-Umgebung fertig einrichten können, müssen wir noch ein kleines Tool auf dem Host-System installieren:
# emerge -av sys-apps/util-linux
In dem Packet steckt das kleine Tool linux32 bzw. setarch. Damit lässt sich die gemeldete Architektur (z.B. von uname) verändern. Das Tool brauchen wir also, damit die Programmen innerhalb der chroot-Umgebung die richtige Architektur sehen.

Das war jetzt (erstmal) der letzte Schritt den wir im Host-System durchführen müssen. Jetzt können wir alles notwendige in die chroot-Umgebung einhängen und dann das erstmal Mal den Wechsel hinein vornehmen. Bei den ganzen notwendigen Mount-Befehlen gehen wir auch wieder etwas anders vor als im Handbuch beschrieben:
mount -o bind /dev /usr/gentoo32/dev
mount -o bind /dev/pts /usr/gentoo32/dev/pts
mount -o bind /dev/shm /usr/gentoo32/dev/shm
mount -o bind /proc /usr/gentoo32/proc
mount -o bind /sys /usr/gentoo32/sys
mount -o bind /tmp /usr/gentoo32/tmp
mount -o bind /usr/portage /usr/gentoo32/usr/portage/
mount -o bind /home /usr/gentoo32/home
cp -pf /etc/resolv.conf /usr/gentoo32/etc
cp -pf /etc/passwd /usr/gentoo32/etc
cp -pf /etc/shadow /usr/gentoo32/etc
cp -pf /etc/group /usr/gentoo32/etc
cp -pf /etc/gshadow /usr/gentoo32/etc
cp -pf /etc/hosts /usr/gentoo32/etc
cp -Ppf /etc/localtime /usr/gentoo32/etc
Damit haben wir neben dem Portage-Tree auch alle Home-Verzeichnisse und die Benutzerkonfiguration übernommen. Das stellt sicher, dass auch die Berechtigungen passen und wir die selben Benutzer auf dem Host-System und in der chroot-Umgebung haben. Achtung: Veränderungen der Benutzer/ Benutzer-IDs müssen immer sorgfältig zwischen Host und Chroot-Umgebung synchronisiert werden. Auseinender laufende Berechtigungen können schnell zu security-Problemen führen!

Jetzt können wir zum ersten Mal in die chroot-Umgebung wechseln. Dabei können wir auch direkt noch das Profil richtig setzen und eine erste Aktualisierung durchführen:
# linux32 chroot /mnt/gentoo32 /bin/bash
# export PS1="(chroot32) ${PS1}"
(chroot32) # env-update
(chroot32) # source /etc/profile
(chroot32) # emerge -auDN @world
(chroot32) # emerge -av wine-vanilla
An der Stelle beginnt jetzt der spannende Teil. Wir müssen sicherstellen das wir innerhalb und außerhalb der chroot-Umgebung die gleichen nvidia-driver installiert haben. Um Probleme zu vermeiden, leider kommt es immer wieder vor das Versionen der nvidia-drivers nicht mit den neuesten Kernel-Versionen kompatibel sind, sollten wir auch die Kernel-Quellen auf beiden Seiten in der gleichen Version installiert haben. Bitte prüft bei folgendem Befehlen also genau ob es die gleich Version innerhalb und außerhalb der chroot-Umgebung ist:
(chroot32) # emerge -av gentoo-sources
(chroot32) # emerge -av linux-headers
Die Details Kernel-Configuration überspringe ich hier. Ihr braucht für die chroot-Umgebung zwar keinen vollständigen Kernel bauen, allerdings wollen die nvidia-drivers zumindest einen rudimentäre Kernel-Konfiguration unter /usr/src/linux.
(chroot32) # eselect kernel set [NUMBER]
(chroot32) # cd /usr/src/linux
(chroot32) # make menuconfig
(chroot32) # make prepare
Bevor wir jetzt die nvidia-drivers installieren, sollten wir deren Use-Flags noch anpassen. Schließlich brauchen wir nur den Userspace-Anteil und keine Kernel-Module:
(chroot32) # echo "x11-drivers/nvidia-drivers -driver -tools X" > \
/etc/portage/package.use/nvidia.use
(chroot32) # emerge -av nvidia-drivers
(chroot32) # emerge -av mesa-progs
Jetzt ist unsere chroot-Umgebung fertig. In der chroot-Umgebung mit root ausgeführt, sollten glxgears funktionieren und auch die HW-Beschleunigung nutzen.
Leider funktioniert der X-Zugriff noch nicht für den Benutzer player: Für ihn müssen den Zugriff auf den X-Server des Hosts erlauben (Achtung: Der Befehl muss außerhalb der chroot-Umgebung ausgeführt werden):
# xhost +SI:localuser:player
Danach sollte sich glxgears auch vom Benutzer player innerhalb und außerhalb der chroot-Umgebung starten lassen. Somit haben wir unser Ziel erreicht!

Kleine Helferlein

Folgende Helferlein sollten wir uns noch anlegen um die Benutzung der chroot-Umgebung komfortabler zu machen:

1) openrc-Script zum Vorbereiten der Umgebung beim Systemstart: /etc/init.d/gentoo32
#!/sbin/openrc-run
chroot_dir=/usr/gentoo32
depend() {
   need localmount net bootmisc
   after dhcpd
}
start() {
    ebegin "Mounting 32-bit chroot directories"
    mount -o bind /dev ${chroot_dir}/dev >/dev/null
    mount -o bind /dev/pts ${chroot_dir}/dev/pts >/dev/null &
    mount -o bind /dev/shm ${chroot_dir}/dev/shm >/dev/null &
    mount -o bind /proc ${chroot_dir}/proc >/dev/null
    mount -o bind /sys ${chroot_dir}/sys >/dev/null &
    mount -o bind /tmp ${chroot_dir}/tmp >/dev/null &
    mount -o bind /usr/portage ${chroot_dir}/usr/portage/ >/dev/null &
    mount -o bind /home ${chroot_dir}/home >/dev/null &
    eend $? "An error occured while attempting to mount 32bit chroot directories"
    ebegin "Copying 32bit chroot files"
    cp -pf /etc/resolv.conf ${chroot_dir}/etc >/dev/null &
    cp -pf /etc/passwd ${chroot_dir}/etc >/dev/null &
    cp -pf /etc/shadow ${chroot_dir}/etc >/dev/null &
    cp -pf /etc/group ${chroot_dir}/etc >/dev/null &
    cp -pf /etc/gshadow ${chroot_dir}/etc >/dev/null &
    cp -pf /etc/hosts ${chroot_dir}/etc > /dev/null &
    cp -Ppf /etc/localtime ${chroot_dir}/etc >/dev/null &
    eend $? "An error occured while attempting to copy 32 bits chroot files."
}
stop() {
    ebegin "Unmounting 32-bit chroot directories"
    umount -f ${chroot_dir}/dev/pts >/dev/null
    umount -f ${chroot_dir}/dev/shm >/dev/null
    umount -f ${chroot_dir}/home >/dev/null &
    umount -f ${chroot_dir}/dev >/dev/null &
    umount -f ${chroot_dir}/proc >/dev/null &
    umount -f ${chroot_dir}/sys >/dev/null &
    umount -f ${chroot_dir}/tmp >/dev/null &
    umount -f ${chroot_dir}/usr/portage/ >/dev/null &
    eend $? "An error occured while attempting to unmount 32bit chroot directories"
}
2) Script zum schnellen Wechsel als root: /usr/local/bin/chroot32
#!/bin/sh
chroot_dir=/usr/gentoo32
cp -pf /etc/resolv.conf $chroot_dir/etc
linux32 chroot $chroot_dir /bin/bash
3) Automatisches Profile laden und Environment aktualisieren innerhalb der Umgebung: /usr/gentoo32/root/.bashrc
source /etc/profile
env-update
export PS1="(chroot32) ${PS1}"
4) Script zum schnellen Wechsel in die 32bit-Game Umgebung: /usr/local/bin/play32
#!/bin/sh
chroot_dir=/usr/gentoo32
cp -pf /etc/resolv.conf $chroot_dir/etc
xhost +SI:localuser:player
linux32 chroot $chroot_dir /bin/login -f player 
5) sudo ohne Passwort für den Befehl play32: /etc/sudoers
%wheel ALL= NOPASSWD:/usr/local/bin/play32

Fazit/Rückblick/Praxistauglichkeit

Ich habe das auf diese Art jetzt seit ca. einem Jahr im Einsatz und keine größeren Probleme. Schwierigkeiten gab es bisher nur einmal mal:
Ich hatte Anfangs in beiden Umgebungen das Keyword ~amd64 für die nvidia-drivers gesetzt und die damit freigeschaltete Version wurde einmal erst mit Verspätung für x86-stable veröffentlicht. Dummerweise war zeitgleich die verfügbare Version für x86 nicht lauffähig auf dem aktuellsten Linux Kernel (4.16). Somit musste ich ein Kernel-Update hinauszögern :(

Montag, 11. Mai 2015

Impressum

Angaben gemäß § 5 TMG:

Bernd Wernerus
New-York-Ring 45
71686 Remseck

Kontakt:
scrapyard@bw0x00.de

Verantwortlich für den Inhalt nach § 55 Abs. 2 RStV:
Bernd Wernerus
New-York-Ring 45
71686 Remseck
+49 7141-3099726


DISCLAIMER
1. Warnhinweis zu Inhalten
Die kostenlosen und frei zugänglichen Inhalte dieser Webseite wurden mit größtmöglicher Sorgfalt erstellt. Der Anbieter dieser Webseite übernimmt jedoch keine Gewähr für die Richtigkeit und Aktualität der bereitgestellten kostenlosen und frei zugänglichen journalistischen Ratgeber und Nachrichten. Die Nutzung dieser Webseiteninhalte erfolgt auf eigene Gefahr. Allein durch den Aufruf dieser kostenlosen und frei zugänglichen Inhalte kommt keinerlei Vertragsverhältnis zwischen dem Nutzer und dem Anbieter zustande, insoweit fehlt es am Rechtsbindungswillen des Anbieters.

2. Verlinkungen
Die Webseite enthält Verlinkungen zu anderen Webseiten ("externe Links"). Diese Webseiten unterliegen der Haftung der jeweiligen Seitenbetreiber. Bei Verknüpfung der externen Links waren keine Rechtsverstöße ersichtlich. Auf die aktuelle und künftige Gestaltung der verlinkten Seiten hat der Anbieter keinen Einfluss. Die permanente Überprüfung der externen Links ist für den Anbieter ohne konkrete Hinweise auf Rechtsverstöße nicht zumutbar. Bei Bekanntwerden von Rechtsverstößen werden die betroffenen externen Links unverzüglich gelöscht.

3. Urheberrecht / Leistungsschutzrecht
Die auf dieser Webseite durch den Anbieter veröffentlichten Inhalte unterliegen dem deutschen Urheberrecht und Leistungsschutzrecht. Alle vom deutschen Urheber- und Leistungsschutzrecht nicht zugelassene Verwertung bedarf der vorherigen schriftlichen Zustimmung des Anbieters oder jeweiligen Rechteinhabers. Dies gilt vor allem für Vervielfältigung, Bearbeitung, Übersetzung, Einspeicherung, Verarbeitung bzw. Wiedergabe von Inhalten in Datenbanken oder anderen elektronischen Medien und Systemen. Dabei sind Inhalte und Rechte Dritter als solche gekennzeichnet. Das unerlaubte Kopieren der Webseiteninhalte oder der kompletten Webseite ist nicht gestattet und strafbar. Lediglich die Herstellung von Kopien und Downloads für den persönlichen, privaten und nicht kommerziellen Gebrauch ist erlaubt.

Diese Website darf ohne schriftliche Erlaubnis nicht durch Dritte in Frames oder iFrames dargestellt werden.

4. Keine Werbung
Die Verwendung der Kontaktdaten des Impressums zur gewerblichen Werbung ist ausdrücklich nicht erwünscht, es sei denn der Anbieter hatte zuvor seine schriftliche Einwilligung erteilt oder es besteht bereits eine Geschäftsbeziehung. Der Anbieter und alle auf dieser Website genannten Personen widersprechen hiermit jeder kommerziellen Verwendung und Weitergabe ihrer Daten.

5. Besondere Nutzungsbedingungen
Soweit besondere Bedingungen für einzelne Nutzungen dieser Website von den vorgenannten Nummern 1. bis 4. abweichen, wird an entsprechender Stelle ausdrücklich darauf hingewiesen. In diesem Falle gelten im jeweiligen Einzelfall die besonderen Bedingungen.


Quelle: Disclaimer Vorlage von fachanwalt.de

Privacy Policy

DATENSCHUTZERKLÄRUNG

Verantwortliche Stelle im Sinne der Datenschutzgesetze ist:
Bernd Wernerus
New-York-Ring 45
71686 Remseck
+49 7141-3099726

Diese Webseite verwendet Google Tools und Services.

Erfassung allgemeiner Informationen
Wenn Sie auf unsere Webseite zugreifen, werden automatisch Informationen allgemeiner Natur erfasst. Diese Informationen (Server-Logfiles) beinhalten etwa die Art des Webbrowsers, das verwendete Betriebssystem, den Domainnamen Ihres Internet Service Providers und Ähnliches. Hierbei handelt es sich ausschließlich um Informationen, welche keine Rückschlüsse auf Ihre Person zulassen. Diese Informationen sind technisch notwendig, um von Ihnen angeforderte Inhalte von Webseiten korrekt auszuliefern und fallen bei Nutzung des Internets zwingend an. Anonyme Informationen dieser Art werden von uns statistisch ausgewertet, um unseren Internetauftritt und die dahinterstehende Technik zu optimieren.

SSL-Verschlüsselung
Um die Sicherheit Ihrer Daten bei der Übertragung zu schützen, verwenden wir dem aktuellen Stand der Technik entsprechende Verschlüsselungsverfahren (z. B. SSL) über HTTPS.

Kommentarfunktion
Wenn Nutzer Kommentare im Blog hinterlassen, werden neben diesen Angaben auch der Zeitpunkt ihrer Erstellung und der zuvor durch den Websitebesucher gewählte Nutzername gespeichert. Dies dient unserer Sicherheit, da wir für widerrechtliche Inhalte auf unserer Webseite belangt werden können, auch wenn diese durch Benutzer erstellt wurden.

Löschung bzw. Sperrung der Daten
Wir halten uns an die Grundsätze der Datenvermeidung und Datensparsamkeit. Wir speichern Ihre personenbezogenen Daten daher nur so lange, wie dies zur Erreichung der hier genannten Zwecke erforderlich ist oder wie es die vom Gesetzgeber vorgesehenen vielfältigen Speicherfristen vorsehen. Nach Fortfall des jeweiligen Zweckes bzw. Ablauf dieser Fristen werden die entsprechenden Daten routinemäßig und entsprechend den gesetzlichen Vorschriften gesperrt oder gelöscht.

Social Plugins
Auf unseren Webseiten werden Social Plugins der unten aufgeführten Anbieter eingesetzt. Die Plugins können Sie daran erkennen, dass sie mit dem entsprechenden Logo gekennzeichnet sind.

Über diese Plugins werden unter Umständen Informationen, zu denen auch personenbezogene Daten gehören können, an den Dienstebetreiber gesendet und ggf. von diesem genutzt. Wir verhindern die unbewusste und ungewollte Erfassung und Übertragung von Daten an den Diensteanbieter durch eine 2-Klick-Lösung. Um ein gewünschtes Social Plugin zu aktivieren, muss dieses erst durch Klick auf den entsprechenden Schalter aktiviert werden. Erst durch diese Aktivierung des Plugins wird auch die Erfassung von Informationen und deren Übertragung an den Diensteanbieter ausgelöst. Wir erfassen selbst keine personenbezogenen Daten mittels der Social Plugins oder über deren Nutzung.

Wir haben keinen Einfluss darauf, welche Daten ein aktiviertes Plugin erfasst und wie diese durch den Anbieter verwendet werden. Derzeit muss davon ausgegangen werden, dass eine direkte Verbindung zu den Diensten des Anbieters ausgebaut wird sowie mindestens die IP-Adresse und gerätebezogene Informationen erfasst und genutzt werden. Ebenfalls besteht die Möglichkeit, dass die Diensteanbieter versuchen, Cookies auf dem verwendeten Rechner zu speichern. Welche konkreten Daten hierbei erfasst und wie diese genutzt werden, entnehmen Sie bitte den Datenschutzhinweisen des jeweiligen Diensteanbieters. Hinweis: Falls Sie zeitgleich bei Facebook angemeldet sind, kann Facebook Sie als Besucher einer bestimmten Seite identifizieren.

Wir haben auf unserer Website die Social-Media-Buttons folgender Unternehmen eingebunden:
Facebook Inc. (1601 S. California Ave - Palo Alto - CA 94304 - USA)
Twitter Inc. (795 Folsom St. - Suite 600 - San Francisco - CA 94107 - USA)
Google Plus/Google Inc. (1600 Amphitheatre Parkway - Mountain View - CA 94043 - USA)
Pinterest

Cookies
Drittanbieter, einschließlich Google, verwenden Cookies zur Bereitstellung von Anzeigen auf Basis früherer Aufrufe Ihrer Website oder anderer Websites durch den Nutzer.
Dank der Cookies für Anzeigenvorgaben können Google und seine Partner Ihren Nutzern auf Basis der Aufrufe Ihrer oder anderer Websites Anzeigen bereitstellen.
Mehr Informationen über Cookies und die Deaktivierung finden Sie unter http://www.aboutads.info/choices/.

Ihre Rechte auf Auskunft, Berichtigung, Sperre, Löschung und Widerspruch
Sie haben das Recht, jederzeit Auskunft über Ihre bei uns gespeicherten personenbezogenen Daten zu erhalten. Ebenso haben Sie das Recht auf Berichtigung, Sperrung oder, abgesehen von der vorgeschriebenen Datenspeicherung zur Geschäftsabwicklung, Löschung Ihrer personenbezogenen Daten. Bitte wenden Sie sich dazu an unseren Datenschutzbeauftragten. Die Kontaktdaten finden Sie ganz unten.

Damit eine Sperre von Daten jederzeit berücksichtigt werden kann, müssen diese Daten zu Kontrollzwecken in einer Sperrdatei vorgehalten werden. Sie können auch die Löschung der Daten verlangen, soweit keine gesetzliche Archivierungsverpflichtung besteht. Soweit eine solche Verpflichtung besteht, sperren wir Ihre Daten auf Wunsch.

Sie können Änderungen oder den Widerruf einer Einwilligung durch entsprechende Mitteilung an uns mit Wirkung für die Zukunft vornehmen.

Änderung unserer Datenschutzbestimmungen
Wir behalten uns vor, diese Datenschutzerklärung gelegentlich anzupassen, damit sie stets den aktuellen rechtlichen Anforderungen entspricht oder um Änderungen unserer Leistungen in der Datenschutzerklärung umzusetzen, z. B. bei der Einführung neuer Services. Für Ihren erneuten Besuch gilt dann die neue Datenschutzerklärung.

Fragen an den Datenschutzbeauftragten
Wenn Sie Fragen zum Datenschutz haben, schreiben Sie uns bitte eine E-Mail oder wenden Sie sich direkt an unseren Datenschutzbeauftragten:

Bernd Wernerus
scrapyard@bw0x00.de