Gruppe für chroot erstellen
Zuerst erstellen wir uns eine Gruppe sshjail. In dieser Gruppe werden alle Benutzer aufgenommen, welche via SSH im Chroot kommen.
root:~# groupadd -g 50000 sshjail
root:~# usermod -a -G sshjail tux
Verzeichnisstruktur für chroot erstellen
Nun erstellen wir das Verzeichnis + Verzeichnisstruktur für unseren Chroot.
root:~# mkdir -p /var/jail/{bin,dev,etc,home,lib,lib64,usr}
root:~# mkdir -p /var/jail/usr/{bin,lib}
Nun erstellen wir uns die wichtigsten Gerätedateien.
root:~# cd /var/jail/
root:/var/jail# mknod -m 0666 dev/null c 1 3
root:/var/jail# mknod -m 0666 dev/zero c 1 5
root:/var/jail# mknod -m 0666 dev/random c 1 8
root:/var/jail# mknod -m 0666 dev/urandom c 1 9
root:/var/jail# mknod -m 0666 dev/tty c 5 0
Jetzt kopieren wir uns noch wichtige Konfigurationsdateien.
root:/var/jail# cp /etc/group etc/
root:/var/jail# cp /etc/hosts etc/
root:/var/jail# cp /etc/ld.so.cache etc/
root:/var/jail# cp /etc/ld.so.conf etc/
root:/var/jail# cp /etc/nsswitch.conf etc/
root:/var/jail# cp /etc/passwd etc/
Damit zu den Binaries auch die Librarys kopiert werden, richten wir uns das Skript l2chroot ein.
root:/var/jail# cd /usr/local/bin/
root:/usr/local/bin# wget -O l2chroot http://www.cyberciti.biz/files/lighttpd/l2chroot.txt
root:/usr/local/bin# chmod +x l2chroot
Nun kopieren wir alle benötigten Binaries aus /usr/bin nach /var/jail/usr/bin.
root:/usr/local/bin# cd /var/jail/bin/
root:/var/jail/bin# cp /bin/bash .
root:/var/jail/bin# cp /bin/bunzip2 .
root:/var/jail/bin# cp /bin/bzcat .
root:/var/jail/bin# cp /bin/bzdiff .
root:/var/jail/bin# cp /bin/bzgrep .
root:/var/jail/bin# cp /bin/bzexe .
root:/var/jail/bin# cp /bin/bzip2 .
root:/var/jail/bin# cp /bin/bzmore .
root:/var/jail/bin# cp /bin/cat .
root:/var/jail/bin# cp /bin/chgrp .
root:/var/jail/bin# cp /bin/chmod .
root:/var/jail/bin# cp /bin/chown .
root:/var/jail/bin# cp /bin/cp .
root:/var/jail/bin# cp /bin/cpio .
root:/var/jail/bin# cp /bin/date .
root:/var/jail/bin# cp /bin/dd .
root:/var/jail/bin# cp /bin/df .
root:/var/jail/bin# cp /bin/dmesg .
root:/var/jail/bin# cp /bin/hostname .
root:/var/jail/bin# cp /bin/echo .
root:/var/jail/bin# cp /bin/egrep .
root:/var/jail/bin# cp /bin/false .
root:/var/jail/bin# cp /bin/fgrep .
root:/var/jail/bin# cp /bin/fuser .
root:/var/jail/bin# cp /bin/fusermount .
root:/var/jail/bin# cp /bin/grep .
root:/var/jail/bin# cp /bin/gunzip .
root:/var/jail/bin# cp /bin/gzexe .
root:/var/jail/bin# cp /bin/gzip .
root:/var/jail/bin# cp /bin/ip .
root:/var/jail/bin# cp /bin/kill .
root:/var/jail/bin# cp /bin/less .
root:/var/jail/bin# cp /bin/lessecho .
root:/var/jail/bin# cp /bin/lesspipe .
root:/var/jail/bin# cp /bin/lesskey .
root:/var/jail/bin# cp /bin/ln .
root:/var/jail/bin# cp /bin/login .
root:/var/jail/bin# cp /bin/ls .
root:/var/jail/bin# cp /bin/mkdir .
root:/var/jail/bin# cp /bin/kmod .
root:/var/jail/bin# cp /bin/mknod .
root:/var/jail/bin# cp /bin/mktemp .
root:/var/jail/bin# cp /bin/more .
root:/var/jail/bin# cp /bin/mount .
root:/var/jail/bin# cp /bin/mountpoint .
root:/var/jail/bin# cp /bin/mv .
root:/var/jail/bin# cp /bin/nano .
root:/var/jail/bin# cp /bin/netstat .
root:/var/jail/bin# cp /bin/openvt .
root:/var/jail/bin# cp /bin/ping .
root:/var/jail/bin# cp /bin/ping6 .
root:/var/jail/bin# cp /bin/ps .
root:/var/jail/bin# cp /bin/pwd .
root:/var/jail/bin# cp /bin/readlink .
root:/var/jail/bin# cp /bin/rm .
root:/var/jail/bin# cp /bin/rmdir .
root:/var/jail/bin# cp /bin/sed .
root:/var/jail/bin# cp /bin/dash .
root:/var/jail/bin# cp /bin/sleep .
root:/var/jail/bin# cp /bin/su .
root:/var/jail/bin# cp /bin/sync .
root:/var/jail/bin# cp /bin/tar .
root:/var/jail/bin# cp /bin/touch .
root:/var/jail/bin# cp /bin/true .
root:/var/jail/bin# cp /bin/umount .
root:/var/jail/bin# cp /bin/uname .
root:/var/jail/bin# cp /bin/which .
root:/var/jail/bin# cp /bin/zcat .
root:/var/jail/bin# cp /bin/zcmp .
root:/var/jail/bin# cp /bin/zdiff .
root:/var/jail/bin# cp /bin/zegrep .
root:/var/jail/bin# cp /bin/zfgrep .
root:/var/jail/bin# cp /bin/zless .
root:/var/jail/bin# cp /bin/zmore .
Nun werden mit l2chroot noch die Librarys kopiert.
root:/var/jail/bin# l2chroot /bin/bash
root:/var/jail/bin# l2chroot /bin/bunzip2
root:/var/jail/bin# l2chroot /bin/bzcat
root:/var/jail/bin# l2chroot /bin/bzdiff
root:/var/jail/bin# l2chroot /bin/bzgrep
root:/var/jail/bin# l2chroot /bin/bzexe
root:/var/jail/bin# l2chroot /bin/bzip2
root:/var/jail/bin# l2chroot /bin/bzmore
root:/var/jail/bin# l2chroot /bin/cat
root:/var/jail/bin# l2chroot /bin/chgrp
root:/var/jail/bin# l2chroot /bin/chmod
root:/var/jail/bin# l2chroot /bin/chown
root:/var/jail/bin# l2chroot /bin/cp
root:/var/jail/bin# l2chroot /bin/cpio
root:/var/jail/bin# l2chroot /bin/date
root:/var/jail/bin# l2chroot /bin/dd
root:/var/jail/bin# l2chroot /bin/df
root:/var/jail/bin# l2chroot /bin/dmesg
root:/var/jail/bin# l2chroot /bin/hostname
root:/var/jail/bin# l2chroot /bin/echo
root:/var/jail/bin# l2chroot /bin/egrep
root:/var/jail/bin# l2chroot /bin/false
root:/var/jail/bin# l2chroot /bin/fgrep
root:/var/jail/bin# l2chroot /bin/fuser
root:/var/jail/bin# l2chroot /bin/fusermount
root:/var/jail/bin# l2chroot /bin/grep
root:/var/jail/bin# l2chroot /bin/gunzip
root:/var/jail/bin# l2chroot /bin/gzexe
root:/var/jail/bin# l2chroot /bin/gzip
root:/var/jail/bin# l2chroot /bin/ip
root:/var/jail/bin# l2chroot /bin/kill
root:/var/jail/bin# l2chroot /bin/less
root:/var/jail/bin# l2chroot /bin/lessecho
root:/var/jail/bin# l2chroot /bin/lesspipe
root:/var/jail/bin# l2chroot /bin/lesskey
root:/var/jail/bin# l2chroot /bin/ln
root:/var/jail/bin# l2chroot /bin/login
root:/var/jail/bin# l2chroot /bin/ls
root:/var/jail/bin# l2chroot /bin/mkdir
root:/var/jail/bin# l2chroot /bin/kmod
root:/var/jail/bin# l2chroot /bin/mknod
root:/var/jail/bin# l2chroot /bin/mktemp
root:/var/jail/bin# l2chroot /bin/more
root:/var/jail/bin# l2chroot /bin/mount
root:/var/jail/bin# l2chroot /bin/mountpoint
root:/var/jail/bin# l2chroot /bin/mv
root:/var/jail/bin# l2chroot /bin/nano
root:/var/jail/bin# l2chroot /bin/netstat
root:/var/jail/bin# l2chroot /bin/openvt
root:/var/jail/bin# l2chroot /bin/ping
root:/var/jail/bin# l2chroot /bin/ping6
root:/var/jail/bin# l2chroot /bin/ps
root:/var/jail/bin# l2chroot /bin/pwd
root:/var/jail/bin# l2chroot /bin/readlink
root:/var/jail/bin# l2chroot /bin/rm
root:/var/jail/bin# l2chroot /bin/rmdir
root:/var/jail/bin# l2chroot /bin/sed
root:/var/jail/bin# l2chroot /bin/dash
root:/var/jail/bin# l2chroot /bin/sleep
root:/var/jail/bin# l2chroot /bin/su
root:/var/jail/bin# l2chroot /bin/sync
root:/var/jail/bin# l2chroot /bin/tar
root:/var/jail/bin# l2chroot /bin/touch
root:/var/jail/bin# l2chroot /bin/true
root:/var/jail/bin# l2chroot /bin/umount
root:/var/jail/bin# l2chroot /bin/uname
root:/var/jail/bin# l2chroot /bin/which
root:/var/jail/bin# l2chroot /bin/zcat
root:/var/jail/bin# l2chroot /bin/zcmp
root:/var/jail/bin# l2chroot /bin/zdiff
root:/var/jail/bin# l2chroot /bin/zegrep
root:/var/jail/bin# l2chroot /bin/zfgrep
root:/var/jail/bin# l2chroot /bin/zless
root:/var/jail/bin# l2chroot /bin/zmore
Einige Binaries sind unter einem anderen Namen verlinkt. Hier einige Symliks, die wir wie folgt erstellen.
root:/var/jail/bin# ln -s bzdiff bzcmp
root:/var/jail/bin# ln -s bzgrep bzegrep
root:/var/jail/bin# ln -s bzgrep bzfgrep
root:/var/jail/bin# ln -s bzmore bzless
root:/var/jail/bin# ln -s hostname dnsdomainname
root:/var/jail/bin# ln -s hostname domainname
root:/var/jail/bin# ln -s lesspipe lessfile
root:/var/jail/bin# ln -s kmod lsmod
root:/var/jail/bin# ln -s hostname nisdomainname
root:/var/jail/bin# ln -s openvt open
root:/var/jail/bin# ln -s bash rbash
root:/var/jail/bin# ln -s nano rnano
root:/var/jail/bin# ln -s dash sh
root:/var/jail/bin# ln -s dash sh.distrib
root:/var/jail/bin# ln -s hostname ypdomainname
Nun kopieren wir alle benötigten Binaries aus /usr/bin nach /var/jail/usr/bin.
root:/var/jail/bin# cd /var/jail/usr/bin/
root:/var/jail/usr/bin# cp /usr/bin/ar .
root:/var/jail/usr/bin# cp /usr/bin/basename .
root:/var/jail/usr/bin# cp /usr/bin/clear .
root:/var/jail/usr/bin# cp /usr/bin/clear_console .
root:/var/jail/usr/bin# cp /usr/bin/cmp .
root:/var/jail/usr/bin# cp /usr/bin/crontab .
root:/var/jail/usr/bin# cp /usr/bin/curl .
root:/var/jail/usr/bin# cp /usr/bin/cut .
root:/var/jail/usr/bin# cp /usr/bin/dh .
root:/var/jail/usr/bin# cp /usr/bin/diff .
root:/var/jail/usr/bin# cp /usr/bin/dig .
root:/var/jail/usr/bin# cp /usr/bin/dircolors .
root:/var/jail/usr/bin# cp /usr/bin/dirname .
root:/var/jail/usr/bin# cp /usr/bin/du .
root:/var/jail/usr/bin# cp /usr/bin/expr .
root:/var/jail/usr/bin# cp /usr/bin/find .
root:/var/jail/usr/bin# cp /usr/bin/flock .
root:/var/jail/usr/bin# cp /usr/bin/free .
root:/var/jail/usr/bin# cp /usr/bin/git .
root:/var/jail/usr/bin# cp /usr/bin/head .
root:/var/jail/usr/bin# cp /usr/bin/host .
root:/var/jail/usr/bin# cp /usr/bin/htpasswd .
root:/var/jail/usr/bin# cp /usr/bin/iconv .
root:/var/jail/usr/bin# cp /usr/bin/id .
root:/var/jail/usr/bin# cp /usr/bin/last .
root:/var/jail/usr/bin# cp /usr/bin/locale .
root:/var/jail/usr/bin# cp /usr/bin/logger .
root:/var/jail/usr/bin# cp /usr/bin/logname .
root:/var/jail/usr/bin# cp /usr/bin/lsof .
root:/var/jail/usr/bin# cp /usr/bin/lspci .
root:/var/jail/usr/bin# cp /usr/bin/md5sum .
root:/var/jail/usr/bin# cp /usr/bin/mkpasswd .
root:/var/jail/usr/bin# cp /usr/bin/mysql .
root:/var/jail/usr/bin# cp /usr/bin/mysqldump .
root:/var/jail/usr/bin# cp /usr/bin/nice .
root:/var/jail/usr/bin# cp /usr/bin/nmap .
root:/var/jail/usr/bin# cp /usr/bin/openssl .
root:/var/jail/usr/bin# cp /usr/bin/passwd .
root:/var/jail/usr/bin# cp /usr/bin/perl .
root:/var/jail/usr/bin# cp /usr/bin/rsync .
root:/var/jail/usr/bin# cp /usr/bin/scp .
root:/var/jail/usr/bin# cp /usr/bin/screen .
root:/var/jail/usr/bin# cp /usr/bin/seq .
root:/var/jail/usr/bin# cp /usr/bin/sftp .
root:/var/jail/usr/bin# cp /usr/bin/sort .
root:/var/jail/usr/bin# cp /usr/bin/split .
root:/var/jail/usr/bin# cp /usr/bin/ssh .
root:/var/jail/usr/bin# cp /usr/bin/stat .
root:/var/jail/usr/bin# cp /usr/bin/sudo .
root:/var/jail/usr/bin# cp /usr/bin/svn .
root:/var/jail/usr/bin# cp /usr/bin/svnadmin .
root:/var/jail/usr/bin# cp /usr/bin/svnlook .
root:/var/jail/usr/bin# cp /usr/bin/tee .
root:/var/jail/usr/bin# cp /usr/bin/test .
root:/var/jail/usr/bin# cp /usr/bin/time .
root:/var/jail/usr/bin# cp /usr/bin/top .
root:/var/jail/usr/bin# cp /usr/bin/tr .
root:/var/jail/usr/bin# cp /usr/bin/tty .
root:/var/jail/usr/bin# cp /usr/bin/uniq .
root:/var/jail/usr/bin# cp /usr/bin/unlink .
root:/var/jail/usr/bin# cp /usr/bin/uptime .
root:/var/jail/usr/bin# cp /usr/bin/users .
root:/var/jail/usr/bin# cp /usr/bin/vim.basic .
root:/var/jail/usr/bin# cp /usr/bin/wget .
root:/var/jail/usr/bin# cp /usr/bin/whois .
root:/var/jail/usr/bin# cp /usr/bin/xargs .
Nun werden mit l2chroot noch die Librarys kopiert.
root:/var/jail/usr/bin# l2chroot /usr/bin/ar
root:/var/jail/usr/bin# l2chroot /usr/bin/basename
root:/var/jail/usr/bin# l2chroot /usr/bin/clear
root:/var/jail/usr/bin# l2chroot /usr/bin/clear_console
root:/var/jail/usr/bin# l2chroot /usr/bin/cmp
root:/var/jail/usr/bin# l2chroot /usr/bin/crontab
root:/var/jail/usr/bin# l2chroot /usr/bin/curl
root:/var/jail/usr/bin# l2chroot /usr/bin/cut
root:/var/jail/usr/bin# l2chroot /usr/bin/dh
root:/var/jail/usr/bin# l2chroot /usr/bin/diff
root:/var/jail/usr/bin# l2chroot /usr/bin/dig
root:/var/jail/usr/bin# l2chroot /usr/bin/dircolors
root:/var/jail/usr/bin# l2chroot /usr/bin/dirname
root:/var/jail/usr/bin# l2chroot /usr/bin/du
root:/var/jail/usr/bin# l2chroot /usr/bin/expr
root:/var/jail/usr/bin# l2chroot /usr/bin/find
root:/var/jail/usr/bin# l2chroot /usr/bin/flock
root:/var/jail/usr/bin# l2chroot /usr/bin/free
root:/var/jail/usr/bin# l2chroot /usr/bin/head
root:/var/jail/usr/bin# l2chroot /usr/bin/host
root:/var/jail/usr/bin# l2chroot /usr/bin/htpasswd
root:/var/jail/usr/bin# l2chroot /usr/bin/iconv
root:/var/jail/usr/bin# l2chroot /usr/bin/id
root:/var/jail/usr/bin# l2chroot /usr/bin/last
root:/var/jail/usr/bin# l2chroot /usr/bin/locale
root:/var/jail/usr/bin# l2chroot /usr/bin/logger
root:/var/jail/usr/bin# l2chroot /usr/bin/logname
root:/var/jail/usr/bin# l2chroot /usr/bin/lsof
root:/var/jail/usr/bin# l2chroot /usr/bin/lspci
root:/var/jail/usr/bin# l2chroot /usr/bin/md5sum
root:/var/jail/usr/bin# l2chroot /usr/bin/mkpasswd
root:/var/jail/usr/bin# l2chroot /usr/bin/mysql
root:/var/jail/usr/bin# l2chroot /usr/bin/mysqldump
root:/var/jail/usr/bin# l2chroot /usr/bin/nice
root:/var/jail/usr/bin# l2chroot /usr/bin/nmap
root:/var/jail/usr/bin# l2chroot /usr/bin/openssl
root:/var/jail/usr/bin# l2chroot /usr/bin/passwd
root:/var/jail/usr/bin# l2chroot /usr/bin/perl
root:/var/jail/usr/bin# l2chroot /usr/bin/rsync
root:/var/jail/usr/bin# l2chroot /usr/bin/scp
root:/var/jail/usr/bin# l2chroot /usr/bin/screen
root:/var/jail/usr/bin# l2chroot /usr/bin/seq
root:/var/jail/usr/bin# l2chroot /usr/bin/sftp
root:/var/jail/usr/bin# l2chroot /usr/bin/sort
root:/var/jail/usr/bin# l2chroot /usr/bin/split
root:/var/jail/usr/bin# l2chroot /usr/bin/ssh
root:/var/jail/usr/bin# l2chroot /usr/bin/stat
root:/var/jail/usr/bin# l2chroot /usr/bin/sudo
root:/var/jail/usr/bin# l2chroot /usr/bin/svn
root:/var/jail/usr/bin# l2chroot /usr/bin/svnadmin
root:/var/jail/usr/bin# l2chroot /usr/bin/svnlook
root:/var/jail/usr/bin# l2chroot /usr/bin/tee
root:/var/jail/usr/bin# l2chroot /usr/bin/test
root:/var/jail/usr/bin# l2chroot /usr/bin/time
root:/var/jail/usr/bin# l2chroot /usr/bin/top
root:/var/jail/usr/bin# l2chroot /usr/bin/tr
root:/var/jail/usr/bin# l2chroot /usr/bin/tty
root:/var/jail/usr/bin# l2chroot /usr/bin/uniq
root:/var/jail/usr/bin# l2chroot /usr/bin/unlink
root:/var/jail/usr/bin# l2chroot /usr/bin/uptime
root:/var/jail/usr/bin# l2chroot /usr/bin/users
root:/var/jail/usr/bin# l2chroot /usr/bin/vim.basic
root:/var/jail/usr/bin# l2chroot /usr/bin/wget
root:/var/jail/usr/bin# l2chroot /usr/bin/whois
root:/var/jail/usr/bin# l2chroot /usr/bin/xargs
Einige Binaries sind unter einem anderen Namen verlinkt. Hier einige Symliks, die wir wie folgt erstellen.
root:/var/jail/usr/bin# ln -s git git-receive-pack
root:/var/jail/usr/bin# ln -s git git-shell
root:/var/jail/usr/bin# ln -s git git-upload-archive
root:/var/jail/usr/bin# ln -s git git-upload-pack
Einige Programme wie crontab habe das SUID Bit gesetzt, das machen wir wie folgt.
root:/var/jail/usr/bin# chmod 4755 sudo
root:/var/jail/usr/bin# chmod 2755 screen
root:/var/jail/usr/bin# chmod 4755 passwd
root:/var/jail/usr/bin# chmod 2755 crontab
SSH für chroot konfigurieren
Nun Konfigurieren wir SSH und setzen folgenden Block ans Ende der Datei /etc/ssh/sshd_config. Danach müssen wir noch den sshd neu starten. Am besten man bleibt mit einer root Shell noch eingeloggt, damit man Änderungen wieder rückgängig machen kann.
root:~# vi /etc/ssh/sshd_config
....
Match Group sshjail
ChrootDirectory /var/jail
X11Forwarding no
AllowTcpForwarding no
AuthorizedKeysFile /var/jail/home/%u/.ssh/authorized_keys
root:~# service ssh restart
chroot Home Verzeichnis nach /home mappen
fcgid und Suexec sind so konfiguriert, das die DocumentRoot wie auch das php5-fcgi Binaries innerhalb von /home liegen müssen. Dazu mappen wir /home/tux nach /var/jail/home/tux. Natürlich muss das noch in der /etc/fstab bootfest gemacht werden.
root:~# mkdir -p /home/tux
root:~# chown tux.tux /home/tux
root:~# mount --bind /var/jail/home/tux /home/tux
root:~# echo "/var/jail/home/tux /home/tux none bind" >>/etc/fstab
So sieht nun die Ansicht vom Home-Verzeichnis des Benutzers reparera-dev aus. Als SSH Benutzer bekommt man die gleiche Ansicht (sind ja die gleichen Daten), nur kann der SSH Benutzer sich nicht aus /var/jail
heraus bewegen, da das sein root (sein System) ist.
root~# ls -l /home/tux/
total 8
drwxr-xr-x 3 tux tux 4096 Oct 1 09:25 bin
lrwxrwxrwx 1 tux tux 7 Oct 1 09:26 htdocs -> var/www
drwxr-xr-x 5 tux tux 4096 Oct 1 09:25 var