Articlename: Ein sicheres Linux System aufsetzen Teil 1.0 - Security Enhanced Linux: Installation Keywords: SELinux, SE Linux, Installieren, sicher, Linux Date: 23.01.2006, 11:44 Views: 9236 Categoryname: Security ---------------------------------------- Vorwort ------------------ Diese Tutorialserie beschäftigt sich damit, ein sicheres Linux-System aufzusetzen. Dazu werden wir den NSA Linux Sub-Kernel, SELinux verwenden, der im Kernel 2.6 enthalten ist. In diesem Teil geht es nur darum SELinux zu installieren; wie man es konfiguriert wird im zweiten Teil beschrieben. Tutorials in dieser Artikelserie ------------------ - Teil 1.0 - Security Enhanced Linux: Installation (http://www.online-tutorials.net/security /ein-sicheres-linux-system-aufsetzen-teil-10-security-enhanced-linux-installation/tutorials- t-69-238.html) - Teil 2.0 - Security Enhanced Linux: Konfiguration (http://www.online-tutorials.net/securit y/ein-sicheres-linux-system-aufsetzen-teil-20-security-enhanced-linux-konfiguration/tutorial s-t-69-241.html) - Teil 3.0 - Linux mit /proc härten (http://www.online-tutorials.net/security/ein-sicheres- linux-system-aufsetzen-teil-30-linux-mit-proc-haerten/tutorials-t-69-219.html) Einführung in SELinux ------------------ Security Enhanced Linux, das auch als SELinux bezeichnet wird ist eine Sammlung von Programmen, Programmpatches, und einer Kernelerweiterung, die ein Linux-System sicherer machen soll. Die Haupterweiterung ist ein erweitertes Privilegien-System, ein Mandatory Access Controll (MAC) Systen, das eine stärkere Einschränkung von Benutzern erlaubt. Dadurch können Programme so eingeschränkt werden, das sie nur noch auf Dinge zugreifen können die sie auch wirklich benötigen. Diese Programme können dann nur noch Daten oder Programme lesen, schreiben oder verändern die sie brauchen. Sie können nicht mehr mit anderen Prozessen kommunizieren, auf Netzwerkdevices zugreifen, ... Durch dieses System können Dienste, die kompromittiert wurden so eingeschränkt werden, dass sie keinen Schaden am System anrichten, was ein nützliches Mittel gegen 0-days ist. Wir werden in diesem Teil die Installation von SELinux besprechen. Als erstes kompilieren wir uns einen Kernel, der SELinux unterstützt. Anschließend werden wir die Tools für SELinux installieren und dann die benötigten Patches für weitere Programme einspielen. Die Installation, die ich hier beschreibe ist für Debian stable: sarge, ohne X Server, und mit der Kernelversion 2.6. Bei anderen Betriebssystemen sieht die Installation anders aus, einige Betriebssysteme haben keine Unterstützung für SELinux. Auf google.com finden Sie mehr dazu. Unterstützung für lfs finden sie hier: http://www.blankersfamily.com/lfs/selinux. Der Inhalt von SELinux ------------------ Damit wir SELinux benutzen wollen, müssen wir die folgenden Pakete installieren: - libsepol libsepol stellt die Schnittstelle zum Zugriff auf die binäre policy dar. - libselinux libselinux ist die Schnittstelle zu sicherheitsbewussten Applikationen. - libsemanage libsemanage ist die libary, die die Schnittstelle zum SELinux Management darstellt. - checkpolicy checkpolicy beinhaltet den checkpolicy policy compiler, der die policy in ein binäres Format kompiliert, das vom Kernel benutzt wird. - policycoreutils policycoreutils beinhaltet die core-Elemente der policy, unter anderem load_policy, newrole, setfiles, und run_init. - policy policy beinhaltet eine Beispiel policy, die Flask files, und Konfigurations-Dateien. - Kernel Der Kernel wird verändert, damit SELinux benutzt werden kann. Seit der Version 2.6 ist SELinux standardmäßig im Kernel integriert. - Ausserdem werden noch folgende Programme modifiziert: cp, mv, install, ls und andere Standardprogramme wird modifiziert damit die file labels benutzt werden können. id wird modifiziert, damit die Benutzer Rechte angezeigt werden können. ps kann nach der Modifikation die neuen Rechte der Prozesse anzeigen. Weitere Programme die modifiziert werden: cron, ssh, login, logrotate, pam, andere Programme die /etc/passwd, oder /etc/shadow benutzen Slat, und setools werden in diesem Tutorial nicht benutzt, können aber hilfreich sein: - slat Eine Sammlung von policy Tools, von Tresys Technology. - setools Eine Sammlung von Tools, die für die Analyse der policy, und das Management der Benutzer zuständig ist. Dazu zählen: - SeAudit Ein GUI Tool, für die Analyse von log Einträgen. - Apol Ein Tool zur analyse der policy.conf. - SeCmds Eine Sammlung von nicht-GUI Tools für die Analyse der policy.conf. -SePCuT Ein GUI Tool, das das komfortable Browsen und Editieren von SELinux policy file ermöglicht. - SeUser Eine GUI und ein nicht-GUI Tool, das bei der Verwaltung von SELinux, und Linux-Benutzerkonte n hilft. Kernel builden ------------------ Als erstes kompilieren wir uns den Kernel so, das er selinux unterstützt. Wir ziehen uns den neuesten Kernel, der von Selinux untersützt wird, auf der NSA (http://www.nsa.gov/selinux/) Selinux Seite finden wir den neusten Download: http://www.nsa.gov/selinux/code/download5.cfm. In meinem Fall ist es 2.6.14. Wir laden den Kernel von www.kernel.org, und den Kernelpatch von der NSA Seite herunter. Damit wir make menuconfig machen können, müssen wir libncurses5-dev installieren: ------- Code ------- selinux:/opt# apt-get install libncurses5-dev patch bzip2 ------- End-Code ------- Als nächstes entpacken wir den Kernel, patchen, und konfigurieren ihn: ------- Code ------- selinux:/opt# cd /usr/src selinux:/usr/src# tar jvxf linux-2.6.14.tar.bz2 selinux:/usr/src# gunzip -d 2.6.14-selinux1.patch.gz selinux:/usr/src/linux-2.6.14# cd linux-2.6.14.tar.bz2 selinux:/usr/src/linux-2.6.14# mv ../2.6.14-selinux1.patch ./ selinux:/usr/src/linux-2.6.14# patch -s -p 1 < 2.6.14-selinux1.patch selinux:/usr/src/linux-2.6.14# make menuconfig ------- End-Code ------- Jetzt schmeissen wir alles raus, was wir nicht brauchen, beachten aber, dass wir folgende einkompilieren: Unter Code Maturity muss folgendes aktiviert sein: Prompt for development and/or incomplete code/drivers Unter Devices Drivers -> Character Devices: Unix98 PTY aktivieren Legacy (BSD) PTY support nicht aktivieren Unter File systems: Second extended fs support Ext2 extended attributes Ext2 security labels Ext3 journaling file system support Ext3 extended attributes Ext3 security labels Aktivieren Sie nicht POSIX access controll lists für ext2 oder ext3. Unter Pseudo filesystems: /dev/pts Extended Attributes /dev/pts Secrutiy labels Wählen Sie nicht /dev/file system support aus. Zum Schluss wählen wir noch folgendes unter Security Options aus: Enable different security models Socket and networking security hocks Default Linux capabilities NSA SELinux NSA SELinux boot parameter NSA SELinux Development support Ich muss bei mir noch unter Device Drivers->Parallel port support Parallel port support einkompilieren, und dann unter Device Drivers->Block devices: Parallel port IDE device support und unter Device Drivers->ATA/ATAPI/MFM/RLL support: ATA/ATAPI/MFM/RLL support Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support Include IDE/ATA-2 DISK support generic/default IDE chipset support einkompilieren einstellen. Meine .config Datei kann hier (http://www.online-tutorials.net/home/download-file-58.html) heruntergeladen werden. Jetzt können wir den Kernel kompilieren, und Grub konfigurieren: ------- Code ------- selinux:/usr/src/linux-2.6.14# make bzImage selinux:/usr/src/linux-2.6.14# make modules selinux:/usr/src/linux-2.6.14# make install && make modules_install selinux:/usr/src/linux-2.6.14# cp arch/i386/boot/bzImage /boot selinux:/usr/src/linux-2.6.14# apt-get remove kernel-image-2.6.8-2-386 Yes selinux:/usr/src/linux-2.6.14# nano /boot/grub/menu.lst ------- End-Code ------- Unter Grub fügen wir jetzt die folgenden Zeilen hinzu, und löschen die alten: ------- Code ------- title Debian GNU/Linux, Kernel 2.6.14-selinux1 Permissive root (hd0,0) kernel /boot/vmlinuz root=/dev/hda1 ro savedefault boot title Debian GNU/Linux, Kernel 2.6.14-selinux1 Enforcing root (hd0,0) kernel /boot/vmlinuz root=/dev/hda1 enforcing=1 ro savedefault boot ------- End-Code ------- nach einem reboot sollte der Kernel laufen. Jetzt haben wir die Wahl zwischen vom Backport installieren (nächstes Kapitel), und von den sources installieren (übernächstes Kapitel). SELinux per Backport installieren ------------------ Jetzt installieren wir SELinux, wir verwenden dazu einen inoffiziellen Backport, http://selinux.alioth.debian.org/. ------- Note: Hinweis ------- Für Debian gibt es noch einen anderen Backport von Faye Coker, der allerdings zum Zeitpunkt recherchen für den Artikel nicht verfügbar war. deb http://www.coker.com.au/newselinux/ ./ ------- End-Note ------- Mit nano /etc/apt/sources.list öffnen wir die Datei für die backports, und fügen die folgende Zeile hinzu: deb http://selinux.alioth.debian.org/sesarge ./ Jetzt müssen wir noch apt updaten: ------- Code ------- selinux:/opt# apt-get update selinux:/opt# apt-get autoclean ------- End-Code ------- Als nächstes müssen wir die Installation der SELinux Pakete vorbereiten, wir müssen dafür sorgen das glibc nicht upgedatet wird. Dazu holen wir uns zuerst die Pakete: ------- Code ------- selinux:/opt# dpkg --get-selections > test selinux:/opt# nano test ------- End-Code ------- Jetzt editieren wir libc6, und libc6-dev von install auf hold. Als nächstes fügen wir die Liste wieder zu dpkg hinzu: ------- Code ------- selinux:/opt# dpkg --set-selections < test ------- End-Code ------- Jetzt wird libc6 und libc6-dev immer zurück gehalten wenn es erneuert werden sollte. Als nächstes installieren wir die folgenden Pakete: ------- Code ------- selinux:/opt# apt-get install checkpolicy \ coreutils \ cron \ dpkg \ fileutils \ initscripts \ libpam0g \ libpam0g-dev \ libpam-cracklib \ libpam-doc \ libpam-modules \ libpam-runtime \ libselinux1 \ logrotate \ policycoreutils \ procps \ selinux-doc \ selinux-policy-default \ selinux-utils \ shellutils \ strace \ sysvinit \ sysv-rc \ textutils ------- End-Code ------- Jetzt sollte SELinux installiert sein, als letztes müssen wir noch ein paar Schritte durchführen: ------- Code ------- selinux:/opt# mkdir /selinux selinux:/opt# nano /etc/fstab ------- End-Code ------- Wir fügen den folgende Zeile in /etc/fstab ein: ------- Code ------- none /selinux selinuxfs 0 0 ------- End-Code ------- Ich habe ausserdem noch die root Partition /dev/hda1 per 0 0 so eingestellt, das sie nicht mehr überprüft wird. Zuletzt fügen wir noch folgende Zeile in /etc/pam.d/login, und /etc/pam.d/ssh ein: ------- Code ------- session required pam_selinux.so ------- End-Code ------- und kompilieren noch die policy: ------- Code ------- selinux:/opt# cd /etc/selinux selinux:/etc/selinux# make policy selinux:/etc/selinux# make relabel ------- End-Code ------- Jetzt nochmal neustarten, und das Dateisystem nochmal relabeln: ------- Code ------- selinux:/opt# cd /etc/selinux selinux:/etc/selinux# make relabel ------- End-Code ------- Damit ist die Installation abgeschlossen. Alternative Installation mit den NSA Sources ------------------ Ich beschreibe hier noch einen alternativen Weg, den ich gerne benutze. Ich kompiliere die SELinux-Sources direkt von der NSA, und benutzte die veränderten Programme vom Backport. Wenn Sie lieber alles per Source installieren, finden Sie hier einen Hint für Linux From Scratch, der auch für Debian funktionieren sollte: http://www.blankersfamily.com/lfs/selinux/. Als erstes laden wir uns die Tarballs von der NSA-Seite herunter: http://www.nsa.gov/selinux /code/download5.cfm. Jetzt bereiten wir uns vor. Sie sollten ein installiertes python2.4, python2.4-dev, gcc-3.4 und g++-3.4 haben, beachten Sie das bei der Installation vom gcc nur /usr/bin/gcc-3.4 angelegt wird, allerdings gcc noch einen softlink auf gcc-3.3 hat, mit rm gcc && ln -s gcc-3.4 gcc können Sie einen link erzeugen. Das gleiche gilt für g++ und python. Kopieren Sie die Dateien nach /opt/selinux, nachdem Sie sie heruntergeladen haben. slat, und setools lassen wir vorläufig weg, die brauchen wir im moment nicht. Jetzt entpacken wir libsepol-1.10.tgz, und kompilieren es: ------- Code ------- selinux:/opt/selinux# tar zvxf libsepol-1.10.tgz selinux:/opt/selinux# rm libsepol-1.10.tgz selinux:/opt/selinuxt# cd llibsepol-1.10 selinux:/opt/selinuxt/libsepol-1.10# make all && make install ------- End-Code ------- Jetzt entpacken wir libselinux-1.28.tgz, und kompilieren es: ------- Code ------- selinux:/opt/selinux# tar zvxf libselinux-1.28.tgz selinux:/opt/selinux# rm libselinux-1.28.tgz selinux:/opt/selinux# cd libselinux-1.28 selinux:/opt/selinux/libselinux-1.28# make all && make install ------- End-Code ------- Als nächstes entpacken wir den Tarball libsemanage-1.4.tgz, und kompilieren es: ------- Code ------- selinux:/opt/selinux# tar zvxf libsemanage-1.4.tgz selinux:/opt/selinux# rm libsemanage-1.4.tgz selinux:/opt/selinux# cd libsemanage-1.4 selinux:/opt/selinux/libsemanage-1.4# make all && make install ------- End-Code ------- Und checkpolicy-1.28.tgz: ------- Code ------- selinux:/opt/selinux# tar zvxf checkpolicy-1.28.tgz selinux:/opt/selinux# rm checkpolicy-1.28.tgz selinux:/opt/selinux# cd checkpolicy-1.28 selinux:/opt/selinux/checkpolicy-1.28# make all && make install ------- End-Code ------- Als nächstes installieren wir policycoreutils-1.28.tgz, dazu müssen wir aber zuerst libpam0g-dev und gettext installieren. Da wir jetzt die modifizierte Version von libpam0g-dev brauchen, kommen jetzt die Sources ins Spiel, wir installieren sie mit apt-get. Mit nano /etc/apt/sources.list öffnen wir die Datei für die Backports und fügen die folgende Zeile hinzu: deb http://selinux.alioth.debian.org/sesarge ./ Jetzt müssen wir noch apt updaten: ------- Code ------- selinux:/opt# apt-get update selinux:/opt# apt-get autoclean ------- End-Code ------- Dazu holen wir uns zuerst die Pakete: ------- Code ------- selinux:/opt# dpkg --get-selections > test selinux:/opt# nano test ------- End-Code ------- Jetzt editieren wir libc6, und libc6-dev von install auf hold. Als nächstes fügen wir die Liste wieder zu dpkg hinzu: ------- Code ------- selinux:/opt# dpkg --set-selections < test ------- End-Code ------- Jetzt wird libc6 und libc6-dev immer zurück gehalten, wenn es erneuert werden sollte, wir können die Pakete installieren: ------- Code ------- apt-get install fileutils initscripts libpam-doc libpam-modules libpam-cracklib logrotate procps shellutils strace sysvinit sysv-rc textutils coreutils gettext libpam0g libpam0g-dev libpam-runtime ------- End-Code ------- Dabei wird auch libsepol1, und libselinux1 installiert, da wir die neusten haben, gehen wir nochmal in die beiden Verzeichnisse zurück und fahren mit make install nochmal drüber. Zur Sicherheit auch noch über libsemanage[/] Jetzt gehen wir zurück in das policy-coreutils Verzeichniss, entpacken, und installieren es: ------- Code ------- selinux:# cd /opt/selinux selinux:/opt/selinux# tar zvxf policy-coreutils-1.28.tgz selinux:/opt/selinux# rm policy-coreutils-1.28.tgz selinux:/opt/selinux# cd policy-coreutils-1.28 selinux:/opt/selinux/policy-coreutils-1.28# make all && make install ------- End-Code ------- Jetzt haben wir alles, bis auf die policy installiert. Die installieren wir jetzt: ------- Code ------- selinux:/opt/selinux# tar zvxf policy-1.28.tgz selinux:/opt/selinux# rm policy-1.28.tgz selinux:/opt/selinux# cd policy-1.28 ------- End-Code ------- Jetzt fügen wir die folgende Zeile zu /etc/fstab hinzu: ------- Code ------- none /selinux selinuxfs defaults 0 0 ------- End-Code ------- und ändern die root partition auf 0 0, damit sie nicht überprüft wird. Zuletzt fügen wir noch folgende Zeile in /etc/pam.d/login und /etc/pam.d/ssh ein: ------- Code ------- session required pam_selinux.so ------- End-Code ------- Jetzt mounten wir das /selinux pseudofilesystem, installieren die policy, und relabeln das Dateisystem: ------- Code ------- selinux:/opt/selinux/policy-1.28# mkdir /selinux selinux:/opt/selinux/policy-1.28# mount /selinux ------- End-Code ------- Als nächstes müssen wir noch in der makefile von /opt/selinux/policy-1.28 Type von strict auf targeted umstellen. Jetzt können wir die policy installieren: ------- Code ------- selinux:/opt/selinux/policy-1.28# make all && make install-src && make install selinux:/opt/selinux/policy-1.28# cd /etc/selinux/strict/src/policy selinux:/etc/selinux/targeted/src/policy# make install selinux:/etc/selinux/targeted/src/policy# make relabel ------- End-Code ------- Jetzt können wir neustarten, und danach die neuen Dateien auch relabeln: ------- Code ------- selinux:/etc/selinux/targeted/src/policy# reboot selinux:/# cd /etc/selinux/strict/src/policy selinux:/etc/selinux/targeted/src/policy# make relabel ------- End-Code ------- setools ------------------ Wir haben setools nicht installiert, da das Tutorial bis jetzt nur die Installation ohne X beschreibt. Hier ist noch eine kurzte Beschreibung, falls Sie die policy tools für X benutzen wollen. Als erstes brauchen wir ein paar Programme, welche wir mit den folgenden Befehlen installieren: ------- Code ------- selinux:/# apt-get install python2.4-libxml2 selinux:/# apt-get install libxml2 libxml2-dev selinux:/# apt-get install apt-get install libgtk2.0-0 selinux:/# apt-get install tcl8.4 tcl8.4-dev tk8.4-dev tk8.4 selinux:/# apt-get install pkg-config ------- End-Code ------- Jetzt haben wir noch ein Problem. Die Header von tcl8.4 und tk8.4 liegen in /usr/include/tcl 8.4, SELinux vermutet die Dateien aber, wie in anderen Distributionen üblich in /usr/include. Deshalb müssen Sie entweder die Quellcode Dateien von setools ändern, oder die Header Dateien als Softlink in /usr/include erzeugen. Dies geschieht mit ln -s tcl8.4/datei datei. Wenn das erledigt ist, können Sie setools installieren. ------- Code ------- selinux:# make all && make install ------- End-Code ------- Weblinks ------------------ - http://www.nsa.gov/selinux/ - http://www.coker.com.au/selinux/ - http://selinux.alioth.debian.org/ - http://wiki.debian.org/SELinux - http://en.wikipedia.org/wiki/Selinux - http://www.blankersfamily.com/lfs/selinux/ - http://www.lurking-grue.org/selinuxHOWTO.html - http://selinux.sourceforge.net/resources.php3 - http://www.crypt.gen.nz/selinux/faq.html Schlusswort ------------------ In diesem Kapitel haben Sie, was SELinux ist, und wie man es installiert. Das nächste Kapitel wird beschrieben wie man SELinux konfiguriert.