16. Nov 2011 16:37 Unser Linux soll sicherer werdenHallo allerseits, ich möchte in diesem Thread thematisch auf Sicherheit unter Linux eingehen und dazu das ein oder andere Posting machen. Ich würde mich natürlich freuen, wenn auch andere Linux-Fans den ein oder anderen Beitrag beisteuern würden. Malsehen, was bei der Sammlung alles zusammen kommt. *gespanntbin* Ich würde euch übrigens bitten, die Threadstruktur einzuhalten. Sprich Kommentare a-la "Cooler Thread" oder "Das ist alles Blödsinn hier" unterhalb von allgemeine Kommentare unterzubringen oder Netzwerk-Hacks1 halt unterhalb von Netzwerk usw. Außerdem wären halbwegs aussagekräftige Posting-Titel ganz nett. Gruß |
16. Nov 2011 16:37 allgemeine KommentareHier drunter sollten allgemeine Kommentare zum Thread gepostet werden. |
16. Nov 2011 16:38 SystemIn dem Subthread gibts Tipps und Tricks zur Systemabsicherung. |
16. Nov 2011 16:38 NetzwerkPostings zur Absicherung des Netzwerkes (Firewalling usw.). |
16. Nov 2011 16:58 Posix CapabilitiesIn diesem Posting soll es um das Thema Posix Capabilities gehen. Erstmal zur Erklärung vorneweg. Linux unterscheidet ja zwischen root und gewöhnlichen Benutzern. Manche Aufgaben lassen sich aber nur als root erledigen. Wie das Ändern des eigenen Passworts zum Beispiel, weil hierzu die entsprechenden Systemdateien im Verzeichnis Üblicherweise wird das heutzutage in den meisten Distributionen so gelöst, dass das SUID-Bit gesetzt ist. Wenn man ein Programm startet, wo dieses Bit gesetzt ist, dann wird dieses Programm nicht mit den Rechten ausgeführt, die der Benutzer hat, sondern mit den Rechten, die der Besitzer der Programmdatei hat. Im Falle von Eigentlich ist dieses Prinzip aber sicherheitstechnisch nicht wirklich gut. Hat ein Programm ein Bug bzw. eine Sicherheitslücke, so ist das gesamte System gefährdet. Und ein solches Programm braucht normalerweise gar nicht das gesamte Set an Root-Rechten. Es braucht meist nur Bestimmte davon. Was liegt also näher, dieses Programm auf die nötigen Rechte zu beschränken? Und genau hier setzen die sogenannten Posix Capabilities an. Sie bieten eine Alternative zum SUID-Bit an und ermöglichen es gezielt Rechte zu vergeben. Posix Capabilities verfügbar? Vorraussetzung für die Nutzung sind:
Übersicht über die Posix Capabilities
Eine Vollständige Übersicht über alle unterstützten Posix Capabilities erhält man mit: Posix Capabilities abfragen/setzen/löschen Zunächst sollte man dem betreffenden Programm natürlich das SUID-Bit entziehen. Die Programme getcap bzw. setcap erlauben es für ein Programm Posix Capabilities abzufragen oder welche zu setzen. Diese Programme sind üblicher4weise nur für den Benutzer root aufrufbar. Mit Statt dem = gibt kann man auch ein - einsetzen, um gezielt ein Capabilitiy wegzunehmen. Es gibt dann auch noch ein + und neben e und p noch ein i. Aber darauf will ich an dieser Stelle nicht eingehen (Postinglänge!). Details dazu finden sich aber im weiterführenden Link. Sämtliche Posix Capabilities lassen sich mit Dateien mit gesetztem SUID-Bit finden
Benötigte Capabilities ermitteln Nachdem man dem Programm das SUID-Bit entzogen hat, besteht nun die Schwierigkeit darin, die benötigten Posix Capabilities zu ermitteln. Glücklicherweise gibts dafür ein Kernel-Modul namens capable_probe: Prüfen, ob das Modul geladen ist: Angeforderte Capabilities tauchen dann in der Logdatei /var/log/messages auf. Entladen des Moduls geht dann mit: Praktische Beispiel Einsatz am Beispiel von Das Programm wird ja gerne für Diagnosezwecke eingesetzt, um zu prüfen, ob sich ein anderer Rechner "anpingen" lässt sprich ob er über das Netzwerk prinzipiell erreichbar ist.
Mit dieser Möglichkeit lassen von normalen Benutzern aber Rootrechte brauchenden Programme beschneiden, um im Falle einer Sicherheitslücke oder eines Bugs die Auswirkungen zu begrenzen. Das ist zwar kein Allheilmittel und man muss beim Einsatz trotzdem Umsicht walten lassen aber kann ein sinnvoller Teil des Sicherheitskonzeptes sein. Das soll jetzt erstmal als Einführung genügen. Weiterführende Informationen finden sich unter: http://www.friedhoff.org/posixfilecaps.html Vielleicht hat jemand noch Tipps für andere "SUID-Befehle" und kann die entsprechend benötigten Posix Capabilities dazu nennen. Gruß |
16. Nov 2011 17:01 capable_probe.cQuelltext von capable_probe.c. Dem Linux-Kernel-Modul, mit denen man angeforderte Posix-Capabilities ermitteln kann.
1 /* taken from 2 * http://www.ibm.com/developerworks/linux/library/l-posixcap. 3 html#resources 4 * Author: Serge E. Hallyn sergeh@us.ibm.com 5 * 16 Oct 2007 6 */ 7 #include <linux/kernel.h> 8 #include <linux/module.h> 9 #include <linux/kprobes.h> 10 #include <linux/sched.h> 11 12 static const char *probed_func = "cap_capable"; 13 14 int cr_capable (struct task_struct *tsk, int cap) 15 { 16 printk(KERN_NOTICE "%s: asking for capability %d for %s\n", 17 __FUNCTION__, cap, tsk->comm); 18 jprobe_return(); 19 return 0; 20 } 21 22 static struct jprobe jp = 23 { 24 .entry = JPROBE_ENTRY(cr_capable) 25 }; 26 27 static int __init kprobe_init(void) 28 { 29 int ret; 30 jp.kp.symbol_name = (char *)probed_func; 31 32 if ((ret = register_jprobe(&jp)) < 0) 33 { 34 printk("%s: register_jprobe failed, returned %d\n", 35 __FUNCTION__, ret); 36 return -1; 37 } 38 return 0; 39 } 40 41 static void __exit kprobe_exit(void) 42 { 43 unregister_jprobe(&jp); 44 printk("capable kprobes unregistered\n"); 45 } 46 47 module_init(kprobe_init); 48 module_exit(kprobe_exit); 49 50 MODULE_LICENSE("GPL"); |
16. Nov 2011 19:23 netter EinfallDu lässt also ein Forum als virtuelle Maschine in einem anderen Forum laufen.. ;) |
16. Nov 2011 19:26 Sozusagen> Du lässt also ein Forum als virtuelle Maschine in einem |
16. Nov 2011 22:54 Netzwerkschnittstelle absichernViele werden ihre Linux-Kiste in einem privaten Netz hinter einem Home-Router betreiben. Für die sind folgende Tipps also vielleicht nicht ganz so von Belang (wenn auch nicht völlig Ohne). Viele dieser Einstellung werden über das /proc-Dateisystem vorgenommen und gehen beim nächsten Reboot verloren. Man sollte also die benötigten Einstellung via einer Autostart-Datei wie beispielsweise /etc/rc.local vornehmen. Alternativ dazu lassen sich auch entsprechende Optionen in der /etc/sysctl.conf setzen. Doch kommen wir nun zu den möglichen Angriffsszenarien und wie man sie erschwert. TCP-Verbindungen haben die angenehme Eigenschaft sich nach außen hin als Kanal-Verbindung zu präsentieren, obwohl auch dabei ja nur IP-Pakete hin- und hergeschickt werden. Um eine TCP-Verbindung einzuleiten, geschieht folgendes:
Damit ist die TCP-Verbindung hergestellt. Ein mögliches Angriffsszenario besteht nun darin, dem Server ganz viele dieser SYN-Pakete zu schicken. Die Beabsichtigte Wirkung besteht darin, den Server zu überfluten. Dieser behandelt ja jedes einzelne SYN und schickt daraufhin die Antwort zurück und wartet auf die Rückanwort des Clients. In der Zeit sind aber Resourcen für die Verbindung belegt (er muss sich ja merken, dass da Verbindungsanforderungen eingegangen sind und dieses merken kostet zumindest RAM). Im Überflutungsfall kann er gar keine neuen Verbindungen annehmen, so dass auch gewollte Verbindungen nicht mehr durchkommen. Um diese Form des Angriffs zu verhindern bedient man sich sogenannter SYN-Cookies. Der Trick besteht vereinfacht gesagt darin, dass der Server sich die Verbindungsanforderung nicht selbst merkt (und somit kein RAM benötigt), sondern in sein Antwortpaket (SYN/ACK) mit eincodiert. Bei einer regulären Verbindung schickt ja der Client ein vom Serverantwort-Paket abgeleitetes Paket, so dass der Server nachprüfen kann, ob es ein legitimes ACK-Paket des Clients ist. Es lässt sich also auch nicht einfach fälschen. Ein Angreifer muss nun tatsächlich die Antwort des Servers auswerten. Simples überhäufen mit Verbindungsanfragen klappt nicht mehr. Damit Linux SYN-Cookies verwendet, muss die Variable /proc/sys/net/ipv4/tcp_syncookies auf 1 gesetzt werden z.B. mit: Einer der beliebtesten Schutzmaßnahmen ist die Antwort auf "pings" zu unterdrücken. Kommen solche Pakete, kann man sie mit einfach ignorieren. Eine weitere Angriffsmöglichkeit die sich mit ping-Paketen bewerkstelligen lässt, ist eine sogenannte "Smurf-Attacke". Es gibt natürlich noch viele weitere Einstellungen. Ich will es zunächst bei dieser Aufzählung belassen. Evtl. schreibe ich irgendwann noch eine Ergänzung dazu. Vielleicht ja auch wer anders. :-) Gruß |
24. Nov 2011 01:45 mhAlso.... ich bin ja so nett, und halte mich mal an deine "Regeln".... aber.... also ganz ehrlich? Ich hab bisher deine Expertise geschaetzt, aber das sieht jetzt heir irgendwie aus wie auf gulli, wo irgendwelche teens moechtegern-howtos frickeln, die sie selbst nicht ganz verstehen. Nimms mir nicht uebel, das war nur so meine erste Assoziation beim ueberfliegen. |
24. Nov 2011 21:44 ganz lautes "hmmmm...."verstehst du, was du da postest/kopierst? Auch wenn der Code von IBM kommt, heisst es nicht automatisch, dass dieser gut ist. tl;dr > Beispiele sollten Beispiele bleiben und nicht in produktiv Umgebungen zum Einsatz kommen. |
25. Nov 2011 09:32 IPtablessuper aussage ... doch zwischen -nutze es- und -nutze es (richtig)- gibts noch immer gewisse - abstaende - poste doch mal, was deinermeinungnach -sichere- IP-Tables sind? von mir aus soll als standartbedingung nur surfen (mit drum und dran) zugelassen werden. Bin mal gespannt... gxn |
27. Nov 2011 19:03 ok> Also.... ich bin ja so nett, und halte mich mal an deine > Ich hab bisher deine Expertise geschaetzt, aber das sieht > Nimms mir nicht uebel, das war nur so meine erste Gruß |
27. Nov 2011 19:11 Kernel-Modul> verstehst du, was du da postest/kopierst? > Auch wenn der Code von IBM kommt, heisst es nicht > solch ein Kernel-Modul wuerde ich nicht laden ... > Als Beispiel mag es gut sein und funktionieren, aber es > tl;dr > Beispiele sollten Beispiele bleiben und nicht in Gruß |
27. Nov 2011 19:21 AW: SELinux> muss man mehr sagen? > Entweder beherrscht du SELinux oder du wirst beherrscht Konkret geht es ja darum, dass man traditionell ja nur Benutzerrechte hat. Das ist schon ein Fortschritt gegenüber keinerlei Restriktionen zu haben (also als Root bzw. Admin zu arbeiten), aber eigentlich heutzutage nicht mehr ausreichend. Und hier setzen Lösungen wie SELinux, AppAmor und Co an, die sozusagen ermöglichen ein Subset an den Benutzerrechten einem Programm zuzuordnen. Wenn dann mal Schadcode eingeschleust wird, ist die Auswirkung dann nicht mehr ganz so gravierend. Gruß |
27. Nov 2011 20:33 Netfilter-Skript (iptables)Da hier schon mal Netfilter bzw. dessen Konfigurationsprogramm iptables genannt wurde, möchte ich auch gleich mal ein Posting dazu machen. Ich beschränke mich aber zunächst auf den schon angesprochenen Standardfall. Definieren uns erstmal ein paar Variablen. Das macht dann auch Anpassungen leichter: 1 NET_IF=eth0 # Netzwerkinterface 2 # (bei W-LAN meist wlan0 usw.) 3 LO_IF=lo # Loopback-Net-Device Alle Regeln löschen: Per default alle Pakete zurückweisen, wenn keine passende iptables-Regel gefunden. Denn lieber alles verbieten und dann nach und nach freigeben als umgekehrt. Wenn man so etwas vergisst, funktionieren bestimmte Dinge nicht. Anders herum hätte man im Vergessensfall ein Loch im Paketfilter.
1 iptables -P INPUT REJECT 2 iptables -P FORWARD REJECT 3 iptables -P OUTPUT REJECT Regeln für eingehende Pakete: 1 # Paket aufs Loopback-Device erlauben 2 iptables -A INPUT -i $LO_IF -j ACCEPT 3 4 5 # bestehende Verbindungen erlauben 6 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 7 8 # Beispielregel für den Zugriff auf einen eigenen Webserver: 9 iptables -A INPUT -i $NET_IF -p tcp --dport 80 -j ACCEPT 10 11 # Pakete von allen definierten Nameservern erlauben 12 for ipadr in $(grep "nameserver" /etc/resolv.conf | awk {'print $2'}); do 13 iptables -A INPUT -p tcp -s $ipadr --sport domain ! --syn -j ACCEPT 14 iptables -A INPUT -p udp -s $ipadr --sport domain -j ACCEPT 15 done 16 17 # Alle anderen Pakete ignorieren 18 iptables -A INPUT -j DROP Regeln für ausgehende Pakete: 1 # vom Loopback-Device alles erlauben 2 iptables -A OUTPUT -o $LO_IF -j ACCEPT 3 4 # Unser Webserver 5 iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT 6 7 # Programme auf unseren PC dürfen zu 8 # (Internet)Webservern Verbindungen aufnehmen. 9 iptables -A OUTPUT -p tcp --sport 1024: --dport 80 -j ACCEPT 10 iptables -A OUTPUT -p tcp --sport 1024: --dport 443 -j ACCEPT # HTTPS 11 12 # ...und zu Mailsservern (POP3 und SMTP) 13 iptables -A OUTPUT -p tcp --sport 1024: --dport 110 -j ACCEPT # POP3 14 iptables -A OUTPUT -p tcp --sport 1024: --dport 25 -j ACCEPT # SMTP 15 16 17 # Den Rest ignorieren aber bei TCP machen wir ein Verbindungs-Reset 18 # damit unser Programm nicht aufs Timeout warten muss 19 iptables -A OUTPUT -p tcp -j REJECT --reject-with tcp-reset 20 iptables -A OUTPUT -j DROP Soviel erstmal in Kürze für heute. Gruß |
30. Nov 2011 12:36 einfache Sandbox für AnwendungsprogrammeDie Sicherheit von sicherheitskritischen Anwendungen wie Browser1 lässt sich erhöhen, indem man diese unter einem eigenen Benutzer(account) laufen lässt. Man kann sogar noch einen Schritt weiter gehen, indem man das Verzeichnis dieses Benutzeraccounts quasi als Read-Only realisiert. Dadurch kann sich auch im Homeordner dieses Nutzers nichts auf Dauer einnisten2. Wie man das Ganze nun praktisch umsetzt, will ich an dem folgenden Beispiel demonstrieren. Dabei wird ein Benutzer namens browser angelegt. Die zu verwendene Applikation ist hier der Firefox. Im Prinzip ist aber alles austauschbar. Zunächst einmal legt man einen neuen User an. Dafür stehen ja diverse Tools zur Verfügung. Auf der Kommandozeile gibts dafür useradd oder das etwas konfortablere addduser. Optimalerweise hat der User auch seine eigene Gruppe der jeder Benutzer in einer Gruppe sein muss, aber bestehende Gruppen nicht verwendet werden sollten, da damit meist besondere zusätzliche Rechte einhergehen. Damit wir uns komfortabel mit diesem Benutzer anmelden können, kann man sudo dahernehmen. Für den Firefox bietet sich zum Beispiel folgender Eintrag in der Datei Das NOPASSWD: verhindert die Abfrage des Passwortes für den Benutzer browser. Dadurch kann man ein beliebig Komplexes wählen, wenn man verhindern will, dass andere sich als browser anmelden ohne es sich merken und eintippen zu müssen. Für die grafische Oberfläche bieten sich die Programme kdesudo bzw. gksudo an. Nimmt man das normale sudo-Kommando, darf der Subprozess in der Regel kein Fenster öffnen (eine Eigenschaft von X-Window aus Sicherheitsgründen).
Soweit so gut. RAMDisk anlegen: Auf den Details, wie man nun die RAM-Disk5 verwaltet usw. gehe ich an dieser Stelle nicht ein. Notfalls einfach fragen. Für das mounten des Union-FS nehme ich fürs Beispiel aufs. Die Syntax für unionfs ist aber fast identisch. Die RAMDisk soll hierbei unter Ab da landen alle Schreibzugriffe auf Die ganzen Mount-Anweisungen lassen sich natürlich auch in die tmpfs /mnt/ramdisk tmpfs noatime,nodiratime 0 0 aufs /home/browser/ aufs dirs=/mnt/ramdisk/:/home/browser/=ro 0 0 Wenn man bestimmte Sachen mal durchschreiben möchte (für Konfigurationen etc.), muss man einfach nur das Union-Dateisystem derweil "unmounten".
Mit dieser Vorgehensweise lässt sich relativ einfach für Programme eine sandboxed-Umgebung schaffen und damit die Sicherheit zu erhöhen. |
15. Dez 2011 17:39 AntwortDas SELinux einfach waere, hab ich nicht geschrieben. oder? Es gibt aber Distributionen, da laeuft SELinux per default. z.B. Fedora ( mehr unter http://fedoraproject.org/wiki/SELinux ) |