Inhaltsverzeichnis

SSH/BASH mit Change Root

Diese Variante aktualisiert automatisch

Hier wird einem Benutzer showlog, der sich mit diesem Rechner nur per ssh verbinden kann und aus sein Home-Verzeichnis nicht raus kommt, der Zugriff auf die Log-Dateien gegeben.

Benutzer anlegen:

> groupadd chroot
> useradd -mg chroot -s /bin/bash showlog
> id showlog
uid=1024(showlog) gid=1025(chroot) Gruppen=1025(chroot)

SSH-Schlüssel ablegen:

> mkdir /home/showlog/.ssh/
> vi /home/showlog/.ssh/authorized_keys
> chown -R showlog:chroot /home/showlog/.ssh
> chmod 0600 /home/showlog/.ssh/authorized_keys
> mkdir /home/showlog/dev/
> for V in dev bin lib lib64 usr/bin ; do mkdir -p /home/showlog/${V} ; echo "/${V} /home/showlog/${V} none bind 0 0" >> /etc/fstab ; mount -B /home/showlog/${V} ; done

globales SFTP-System deaktivieren:

sed -i 's/^Subsystem sftp.*sftp-server/#&/' /etc/ssh/sshd_config

echo "
Match Group chroot
        ChrootDirectory /home/%u
        X11Forwarding no
        AllowTcpForwarding no
" >> /etc/ssh/sshd_config

/etc/init.d/ssh restart

weitere Benutzer kann man mit diesem Skript anlegen

/root/bin/chroot_ssh_user_add.sh
#!/bin/bash
 
#
# Dieses Skript legt einen neuen SSH-Benutzer an,
# der nach dem login immer in eine ChRoot eingesperrt wird.
#
 
if [ -z "${1}" ] ; then
        echo "${0} [Benutzername]"
        exit 1
else
        if [ -e /home/${1} ] ; then
                echo "Dieser Benutzername existiert schon."
                exit 1
        fi
fi
 
BENUTZER="${1}"
 
# groupadd chroot
useradd -mg chroot -s /bin/bash ${BENUTZER}
id ${BENUTZER}
mkdir -p /home/${BENUTZER}/.ssh
touch /home/${BENUTZER}/.ssh/authorized_keys 
# vi /etc/ssh/sshd_config
# service ssh restart
for V in dev bin lib lib64 usr/bin ; do mkdir -p /home/${BENUTZER}/${V} ; echo "/${V} /home/${BENUTZER}/${V} none bind 0 0" >> /etc/fstab ; mount -B /home/${BENUTZER}/${V} ; done
chown -R 0:0 /home/${BENUTZER}
chown -R ${BENUTZER}:chroot /home/${BENUTZER}/.ssh
# vi /etc/fstab
ls -lha /home/${BENUTZER}/

klassische Variante

Damit das funktioniert, müssen alle benötigten Programmteile (wie zum Beispiel die SHELL) in die ChRoot-Umgebung kopiert werden!

Wenn man auf einem Rechner mit Ubuntu-Linux 12.04 LTS die im folgenden beschriebenen Schritte abarbeitet,
dann wird der Benutzer fritz in eine ChRoot eingespert, wenn er sich per SSH auf dem Rechner einlogt.

Er kann dann nur im Arbeitsverzeichnis schreiben!

> useradd -m -s /bin/bash fritz
> mkdir -p /home/fritz/.ssh
> mkdir -p /home/fritz/Arbeitsverzeichnis
> chown -R 0:0 /home/fritz
> chown -R fritz:fritz /home/fritz/.ssh
> chown -R fritz:fritz /home/fritz/.bash*
> chown -R fritz:fritz /home/fritz/Arbeitsverzeichnis

SSH-Schl≠ssel ablegen:

> vi /home/fritz/.ssh/authorized_keys

Bin␍rdateien, die inder ChRoot-Umgebung ben┴tigt werden, dort ablegen:

> tar cvzf - --exclude=/lib/modules /bin/ /lib/ /lib64/ /usr/bin/ | tar xzf - -C /home/fritz/
> cd /home/fritz/
> mkdir dev
> mknod dev/null c 1 3
> mknod dev/zero c 1 5
> chmod 0666 dev/{null,zero}

den SSH-Dienst konfigurieren:

> vi /etc/ssh/sshd_config
...
#------------------------------------------------------------------------------#
Match user fritz
        ChrootDirectory %h
        X11Forwarding no
        AllowTcpForwarding no

#------------------------------------------------------------------------------#

> /etc/init.d/ssh restart

fertig! ;-)

zusätzliche Möglichkeiten

man kann dem Benutzer auch Einblick in andere Verzeichnisse geben, wenn man sie per Bind-Mount in sein Home-Verzeichnis rein-mountet:

> mkdir /home/fritz/mnt
> chown -R fritz:fritz /home/fritz/mnt
> mount -o bind /mnt /home/fritz/mnt

damit der Bind-Mount bereits beim booten ausgeführt wird, genügt dieser Eintrag in der /etc/fstab:

> vi /etc/fstab
/mnt          /home/fritz/mnt    none   bind            0       0