_________________ ___________ / _____/\_ ___ \\_ _____/ / \ ___/ \ \/ | __) \ \_\ \ \____| \ \______ /\______ /\___ / \/ \/ \/ The German Computer Freaks www.gcf.de Since 1997 /\ / \ ________________________________________________________________________/ # / Userbegrenzung mit JAIL und QUOTA auf Linux Paper \ / (c) Mathias 'DNode' Pelka / GCF (22.11.2002) \/ Wenn man einen User einsperren moechte - aus welchen Gruenden auch immer - bekommt man leicht Kopfzerbrechen. Eine chroot Umgebung ist schwer einzurichten und bietet bei falscher Konfiguration kein Plus an Sicherheit.. Die Einrichtung von Disk QUOTA ist ebenfalls reicht aufwendig - in der Regel muss man den Kernel neu uebersetzungen und ohne zusaetzliche Programme wird per default nur das veraltete ext2 Dateisystem unterstuetzt. Man kann hier auf zwei Moeglichkeiten zurueckgreifen, Moeglichkeit A waere, wie oben erwaehnt, den Kernel neu zu backen und Disk QUOTA einzubauen, das hat Vorteile, denn die QUOTA sind recht Flexibel und es hat Nachteile denn der Standartkernel unterstuetzt nur QUOTA auf einem ext2 Dateisystem. Moeglichkeit B - die wie ich finde bessere Moeglichkeit - ist, das Plattenimages beim starten des System initialisiert und an das Homeverzeichnis des User gemountet werden. Es ist leicht umzusetzen und man braucht sich nicht um weiteren Konfigurartionsdateien kuemmern. Das Paper geht von zwei Usern aus - Alice und Bob. Bob mag ich nicht darum bekommt Bog mehr Platz auf der Festplatte um die JAIL zu realisieren und Alice bekommt Zugriff auf saemtliche im System vorhandenen Binarys. Zu allererst erzeugen wir zwei leere Dateien - ich nenne sie der Einfachheit halber; 'alice' und 'bob'. ,----[ Shell ] | bash-2.04# dd if=/dev/zero of=~/bob bs=1024 count=30720 | 30720+0 Records ein | 30720+0 Records aus | bash-2.04# ls -lh alice bob | -rw-r--r-- 1 root root 10M Nov 17 16:06 alice | -rw-r--r-- 1 root root 30M Nov 17 16:06 bob | bash-2.04# su - | aggamemnon:~ # pwd | /root | aggamemnon:~ # dd if=/dev/zero of=~/alice bs=1024 count=10240 | 10240+0 records in | 10240+0 records out | aggamemnon:~ # dd if=/dev/zero of=~/bob bs=1024 count=30720 | 30720+0 records in | 30720+0 records out | aggamemnon:~ # ls -lh alice bob | -rw-r--r-- 1 root root 10M Nov 17 16:08 alice | -rw-r--r-- 1 root root 30M Nov 17 16:08 bob | aggamemnon:~ # `---- Damit haben wir zwei Dateien erstellt; 'alice' ist 10MB gross und 'bob' 30MB. Sie wurden mit 'dd' erzeugt. Wem die Parameter fremd sind sollte ein Blick in die Manpage der Programme werfen. Nun wird es Zeit die Dateien mit einem Dateisystem zu bestuecken. ,----[ Shell ] | aggamemnon:~ # mkfs.ext2 bob >> /dev/null | mke2fs 1.19, 13-Jul-2000 for EXT2 FS 0.5b, 95/08/09 | y | aggamemnon:~ # mkfs.ext2 alice >> /dev/null | mke2fs 1.19, 13-Jul-2000 for EXT2 FS 0.5b, 95/08/09 | y | aggamemnon:~ # file alice bob | alice: Linux rev 1.0 ext2 filesystem data | bob: Linux rev 1.0 ext2 filesystem data | aggamemnon:~ # `---- Die Umleitung haette wohl nicht Not getan, aber da ich nur die Standard-Ausgabe umleite und die Fehler-Ausgabe trotzdem auf die Konsole gesetzt ist, ist das nicht weiter dramatisch. Die Image Dateien waeren damit fertig. Ich habe mich fuer ext2 entschieden weil es fuer kleinere Dateisysteme besser geeignet ist. ReiserFS halte ich fuer unbrauchbar weil es erstmal ein 30MB grosses Journal erstellt und mit ext3 hab ich noch keine Erfahrungen, technisch gesehen ist es aber auch egal was fuer ein Dateisystem man benutzt. Nun versuchen wir ob die Platten Image auch korrekt gemountet werden koennen. Falls der Mountvorgang fehlschlaegt kann das daran liegen das kein loop Support im Kernel vorhanden ist. Dann muss man entweder das Modul nachladen oder neu Kompilieren. ,----[ Shell ] | aggamemnon:~ # mount alice /mnt -t ext2 -o loop | aggamemnon:~ # df -h | grep mnt | /root/alice 9.7M 13k 9.1M 1% /mnt | aggamemnon:~ # ls -l /mnt | total 14 | drwxr-xr-x 3 root root 1024 Nov 17 16:13 . | drwxr-xr-x 26 root root 499 Oct 13 20:06 .. | drwxr-xr-x 2 root root 12288 Nov 17 16:13 lost+found | aggamemnon:~ # df | grep mnt | /root/alice 9911 13 9386 1% /mnt | aggamemnon:~ # chown -R alice:users /mnt && umount /mnt | aggamemnon:~ # `---- Der letzte Befehl sorgt dafuer, dass das Plattenimage die richtigen Rechte bekommt, da mkfs.ext2 sie standartmaessig auf root setzt und Alice Schreibrechte benoetigt um vernuepftig arbeiten zu koennen. ,----[ Shell ] | aggamemnon:~ # mount /root/alice /home/alice/ -t ext2 -o loop | aggamemnon:~ # mount | grep alice | /root/alice on /home/alice type ext2 (rw,loop=/dev/loop0) | aggamemnon:~ # su - alice | alice@aggamemnon:~ > cd /home/alice/ | alice@aggamemnon:~ > dd if=/dev/zero of=~/blub bs=1024 count=30000 | dd: writing `/home/alice/blub': Auf dem Geraet ist kein Speicherplatz mehr verfuegbar | 9353+0 Records ein | 9352+0 Records aus | alice@aggamemnon:~ > df -h | grep alice | /root/alice 9.7M 9.2M 0 100% /home/alice | alice@aggamemnon:~ > ls -lh | insgesamt 9.2M | -rw-r--r-- 1 alice users 9.1M Nov 17 16:28 blub | drwxr-xr-x 2 alice users 12k Nov 17 16:13 lost+found | alice@aggamemnon:~ > `---- Klappt doch schon ganz gut. Alice hat nun 10MB zur Verfuegung, wenn man jetzt noch dafuer sorgt das /tmp und /var/tmp korrekt eingestellt sind - sprich auf einer eigenen Partition, kann Alice nichts mehr zuspamme. Zur Not koennte man auch hier wieder ein Image erzeugen, dann linkt man /var/tmp auf /tmp und Mountet das leere Image auf /tmp. Das Image sollte etwa 50MB betragen damit man noch richtig Arbeiten kann. Ein weiteres Problem ist, das Alice und Bob alleine am System arbeiten, und root keine Lust hat jeden Morgen die Images zu mounten. Ein Skript das beim starten und beim runterfahren die jeweiligen Images mountet und spaeter wieder unmountet waere die Ideale Loesung. Die Untenstehenden Skripts gehen davon aus das sich die Images in /root/image befinden, man kann den Pfad anpassen. Realisiert wird es ueber eine Schleife die alle Dateien im Verzeichnis mountet, dazu sollten die Imagedateien so wie die Heimtatverzeichnisse der Benutzer heissen. ,----[ Shellscript - Skript wird beim starten des System ausgefuert ] | #!/bin/bash | cd /root/image | echo "Mounte User Dateisysteme... " | for i in * ; do mount $i /home/$i -t ext2 -o loop ; done `---- ,----[ Shellscript - Skript wird beim runterfahren ausgefuert ] | #!/bin/bash | cd /root/image | echo "Unmounte User Dateisysteme... " | umount * `---- Fuer Bob ist die ganze Sache ein wenig komplizierter - zuallererst brauchen wir die JAIL Software (http://www.gsyc.inf.uc3m.es/~assman/jail/index.html) - die Software wird kompiliert, installiert. Damit die JAIL funktioniert muss die Shell fuer Bob geaendert werden. Diese Shell startet die chroot und verwaltet sie. Die tatsaechliche Shell wird durch die /pfad/zur/chroot/etc/passwd bestimmt. ,----[ Auszug auf /etc/passwd ] | aggamemnon:/ # cat /etc/passwd | grep bob | bob:x:1035:100:Jail User:/home/bob:/usr/local/bin/jail `---- Damit koennen wir die JAIL einrichten. ,----[ Shell ] | aggamemnon:~/image # mkjailenv /home/bob >> /dev/null | aggamemnon:~/image # addjailsw /home/bob >> /dev/null | aggamemnon:~/image # addjailuser /home/bob/ /home/bob /bin/sh bob >> /dev/null `---- Die ganze Sache ist in fuenf Minuten erledigt - danach ist der User keine Bedrohung mehr. Programme kann mit dann mit 'addjailsw' hinzufuegen - die Webseite des Projektes gibt hier ausreichenden Support. Zur Not reicht auch ein Aufruf der Programme ohne Argumente um eine kurze Hilfe zu erhalten. ,----[ Shell ] | aggamemnon:/home/bob # su - bob | jail-2.04$ pwd | /home/bob | jail-2.04$ ls -l / | total 8 | drwxr-xr-x 2 root root 1024 Nov 17 16:08 bin | drwxr-xr-x 3 root root 1024 Nov 17 16:08 dev | drwxr-xr-x 2 root root 1024 Nov 17 16:08 etc | drwxr-xr-x 3 root root 1024 Nov 17 16:08 home | drwxr-xr-x 2 root root 1024 Nov 17 16:08 lib | drwsrwxrwx 2 root root 1024 Nov 17 16:08 tmp | drwxr-xr-x 5 root root 1024 Nov 17 16:08 usr | drwxr-xr-x 3 root root 1024 Nov 17 16:08 var | jail-2.04$ df -h | grep bob | /root/image/bob 29M 4.6M 23M 17% /home/bob `---- Das Ziel des Textes ist erreicht; Bob und Alice sind damit keine Bedrohung mehr fuer das System - zumindest was die Aspekte der Plattenverschwendung und Benutzung von Systembinarys angeht, man sollte dennoch nicht Leichtsinnig werden und darauf hoffen das Alice und Bob diese Speeren nie ueberwinden koennen - wo ein Wille ist da ist auch ein Weg. Damit ist das Ziel dieses Papers erreicht. Falls Fragen oder Anregungen zu dem Text hier bestehen - schreibt mir eine Mail; dnode@gcf.de Bedanken moechte ich mich besonders bei 'dsazta' weil er immer einen guten Tipp fuer mich hatte.