Hackerangriffe bei lokal aktivem Apache/MySQL?
Yadgar
- webserver
0 Steffi0 Yadgar0 Vinzenz Mai0 fastix®
0 Harlequin
0 Alexander (HH)0 Yadgar
High!
Eine Frage, die mir schon seit längerem auf den Nägeln brennt: bin ich (unter Linux, Firewall ist aktiv) Angriffen aus dem Netz ungeschützt ausgesetzt, wenn
a) lokal der Apache-Server läuft (den ich nur als root starten kann - wobei ich den Superuser-Mode nach Ausführen des Startkommandos natürlich wieder verlasse)
und/oder
b) ich als root MySQL benutze?
Bis bald im Khyberspace - oder in Yadgars Textwelten!
Yadgar
Absolut! Du bist dann offen wie ein Scheunentor!!! Mach das bloß
nicht.
Aber ist ja eigentlich ganz einfach: Wenn Du mit lokalem Server
arbeitest, dann einfach vorher vom Netz trennen.
High!
Absolut! Du bist dann offen wie ein Scheunentor!!! Mach das bloß
nicht.
Aber ist ja eigentlich ganz einfach: Wenn Du mit lokalem Server
arbeitest, dann einfach vorher vom Netz trennen.
Nur solange ich in der Konsole als "root" eingeloggt bin oder auch danach? Bei MySQL erscheint es mir logisch, da muss ich ja ständig (jedenfalls, solange ich mir keinen "Arbeits-User" mit eingeschränkten Privilegien konfiguriert habe) als root drin sein...
Bis bald im Khyberspace!
Yadgar
Hallo Yadgar,
Nur solange ich in der Konsole als "root" eingeloggt bin oder auch danach? Bei MySQL erscheint es mir logisch, da muss ich ja ständig (jedenfalls, solange ich mir keinen "Arbeits-User" mit eingeschränkten Privilegien konfiguriert habe) als root drin sein...
der MySQL-Benutzer root hat im Allgemeinen nichts mit dem Systembenutzer root zu
tun. Selbstverständlich kannst Du, auch wenn Du an Deiner Linuxkiste mit einem
normalen Benutzerkonto angemeldet bist, als MySQL-Benutzer root arbeiten:
mysql -u root -p
Wenn Deine Firewallregeln keinen Zugriff von außen erlauben, dann bist Du auch
nicht offen wie ein Scheunentor. Wenn diese den normalen Zugriff über Port 80 (apache) bzw. Port 3306 (MySQL) erlauben, bist Du auch noch nicht offen wie ein
Scheunentor. Für Testserver halte ich die Erreichbarkeit aus dem Internet jedoch
für eine schlechte Idee. Der Zugriff von außen auf MySQL wird insbesondere bei
"Homeservern" sowieso nicht benötigt.
Freundliche Grüße
Vinzenz
Moin!
Nur solange ich in der Konsole als "root" eingeloggt bin oder auch danach? Bei MySQL erscheint es mir logisch, da muss ich ja ständig (jedenfalls, solange ich mir keinen "Arbeits-User" mit eingeschränkten Privilegien konfiguriert habe) als root drin sein...
Du meinst wahrscheinlich nicht den root Deines Betriebssystems, sondern den des DBMS MySQL. Dann besteht hauptsächlich die Gefahr, dass Du mittels Deiner Allmacht selbst versehentlich Daten vernichtest. Aus Sicht des Betriebssystems hast Du möglicherweise zwei verschiedene Nutzerkennungen. Die des MySQL-Demons ('Select Into Outfile ...' kann ggf. Systemdateien überschreiben) und die Kennung, unter Dein Client effektiv aufgerufen wurde. Das regelmäßig ist die Kennung mit der Du Dich am OS angemeldet hast.
Generelle Nebengefahren ergeben sich beispielhaft aus Angriffsmöglichkeiten auf den X-Server oder Dein OS (Keylogger etc.)
Solltest Du den Server (Apache, MySQL, ... jeder andere) als root und nicht als Dienst gestartet haben, so ergibt sich in von mehreren Personen genutzten Räumen das Problem, dass ein unberechtigter Dritter das Programm beendet, Deine Shell benutzt, das Programm wieder startet. Verwende also statt einer root-shell den Befehl sudo.
Im Regelfall empfiehlt es sich also die Server mit:
~> sudo /etc/init.d/mysql start|stop|restart|reload
~> sudo /etc/init.d/apache|httpd|apache2|httpd2 start|stop|restart|reload
(Das Pipe-Symbol '|' kennzeichnet Alternativen.)
... zu steuern oder wie schon beschrieben auf unprivilegierten Ports laufen zu lassen.
Mit welchem Benutzer MySQL oder der Apache effektiv laufen kannst Du mit
~> ps axu |grep httpd
oder
~> ps axu |grep mysqld
herausbekommen. Hinweis hierzu: Beim Apache (prefork) läuft genau ein Prozess, der die Arbeitsprozesse steuert, mit root-Rechten, beantwortet aber keine Webanfragen.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
Yerf!
Absolut! Du bist dann offen wie ein Scheunentor!!! Mach das bloß
nicht.
Aha... Woher beziehst du diese Weisheit?
Aber ist ja eigentlich ganz einfach: Wenn Du mit lokalem Server
arbeitest, dann einfach vorher vom Netz trennen.
Diese Trennung muss aber nicht das Ziehen des Netzwerkkabels bedeuten. Ein loakler Server muss ja nicht auf Anfragen aus dem Netzwerk antworten.
@Yadgar:
a) wie ist der Apache eingerichtet, hört er nur auf localhost (127.0.0.1) oder auch auf das Netzwerkinterface?
b) gleiche Frage zu MySQL?
c) was bedeutet für dich "Firewall ist aktiv"?
Diese Fragen gilt es zu klären.
Wobei selbst ein aus dem Netzt erreichbarer Server noch lange keine Sicherheitslücke sein muss, wenn alle Sicherheitspatches eingespielt sind und sich keine kritischen Skripte darauf befinden. (Ansonsten würden ja laufend alle Webserver der Welt gehackt werden...)
Gruß,
Harlequin
Moin Moin!
a) lokal der Apache-Server läuft (den ich nur als root starten kann - wobei ich den Superuser-Mode nach Ausführen des Startkommandos natürlich wieder verlasse)
Der Apache schaltet normalerweise nach dem accept()-Call die Privilegen ab und wechselt zu einem unpriviligierten User (nobody, www, wwwrun, daemon, o.ä.). Wenn Dich die Paranoia packt, startest Du den Apachen von einem unpriviligierten Account, mußt dann aber die Portnummer auf einen Wert zwischen 1024 und 65535 setzen (die Ports 0 bis 1023 sind root vorbehalten). Außerdem kannst Du den Apachen so konfigurieren, dass er nur auf der Loopback-Adresse (127.0.0.0/255.0.0.0, interface lo) auf Anfragen reagiert, nicht aber auf anderen Adressen (z.B. der Ethernet-Karte). Stichwort: Listen 127.0.0.1:8080, bei neueren Apaches heißt das Port 127.0.0.1:80, wenn mich nicht alles täuscht.
b) ich als root MySQL benutze?
Nutzen oder starten?
Beim Starten sollte mysql eigentlich auch zu einem unpriviligierten Account wechseln. Auch hier kannst Du mysql von einem unpriviligiertem Account starten, der MySQL-Standard-Port 3306 ist ohnehin ohne root-Privilegien erreichbar. Laß also MySQL als unpriviligierten User starten.
MySQL kannst Du auch über Unix Sockets (statt TCP/IP Sockets) erreichen, wenn es auf der selben Maschine läuft. Damit sind Angriffe von außen augeschlossen.
Nutzen solltest Du mysql als root gar nicht. Die Front-Ends benötigen keine root-Rechte.
Alexander
High!
Der Apache schaltet normalerweise nach dem accept()-Call die Privilegen ab und wechselt zu einem unpriviligierten User (nobody, www, wwwrun, daemon, o.ä.). Wenn Dich die Paranoia packt, startest Du den Apachen von einem unpriviligierten Account, mußt dann aber die Portnummer auf einen Wert zwischen 1024 und 65535 setzen (die Ports 0 bis 1023 sind root vorbehalten). Außerdem kannst Du den Apachen so konfigurieren, dass er nur auf der Loopback-Adresse (127.0.0.0/255.0.0.0, interface lo) auf Anfragen reagiert, nicht aber auf anderen Adressen (z.B. der Ethernet-Karte). Stichwort: Listen 127.0.0.1:8080, bei neueren Apaches heißt das Port 127.0.0.1:80, wenn mich nicht alles täuscht.
Habe ich versucht, funktioniert leider nicht... trotz Listen 127.0.0.1:1024 in ports.config ist apache2ctl Nicht-Superusern gar nicht bekannt!
Bis bald im Khyberspace!
Yadgar
Moin Moin!
Habe ich versucht, funktioniert leider nicht... trotz Listen 127.0.0.1:1024 in ports.config ist apache2ctl Nicht-Superusern gar nicht bekannt!
Das eine hat mit dem anderen so absolut gar nichts zu tun. Listen regelt, auf welcher Adresse und welchem Port der Apache-Server auf Requests wartet. apache2ctl bzw. apachectl ist ein Kommandozeilen-Tool, das den Server-Prozess starten und stoppen kann. Weil es normalerweise eben nur von root gestartet werden soll, liegt es typischerweise in /usr/sbin. Dieses Verzeichnis (wie auch /sbin) liegt bei normalen Usern nicht im PATH.
Tipp als root mal "which apache2ctl", merk' Dir, wo apache2ctl liegt, und rufe es dann als Normaluser auf. Es wird vielleicht noch etwas Theater geben, weil der Apache unter Deinem Account nicht in die gewohnten Verzeichnisse loggen darf, und evtl. mag er auch nicht mehr daemon oder www werden, aber das läßt sich per httpd.conf beseitigen.
Alexander
High!
Nachdem ich die beiden Log-Files auf chmod 777 gesetzt habe, kann ich auch als Normaluser apache2ctl (mit dem Pfad) starten... auf http://localhost kann ich mit dem Browser (Iceweasel/Firefox) nach wie vor nicht zugreifen!
Bis bald im Khyberspace!
Yadgar
Moin!
... hilft dann weiter.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
Moin!
Nachdem ich die beiden Log-Files auf chmod 777 gesetzt habe...
Du machst Dir über Sicherheit Sorgen? So schafft man erst Angriffspunkte!
Mach das mit chmod 600 *log wieder weg!
besser wäre:
fsetacl -m user:users:rw
gewesen
siehe: [http://www.fastix.de/r/Benutzerrechte_Access-Control-Lists_ACL.pdf]
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
Moin!
fsetacl -m user:users:rw
~> fsetacl -m user:users:rw datei
natürlich...
siehe: http://www.fastix.de/r/Benutzerrechte_Access-Control-Lists_ACL.pdf
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
Moin!
Nachdem ich die beiden Log-Files auf chmod 777 gesetzt habe...
Du machst Dir über Sicherheit Sorgen? So schafft man erst Angriffspunkte!Mach das mit chmod 600 *log wieder weg!
Ich finde die Log-Dateien nicht mehr... vielleicht bin ich einfach zu erkältet, um mich mit derart hochdiffizilem Zeug zu beschäftigen!
SCHEISSE!!!
Uärgl!
Moin!
Ich finde die Log-Dateien nicht mehr...
Im Normalfall in folgenden Verzeichnissen:
/var/log/httpd[2]
oder
/var/log/apache[2]
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
High!
/var/log/httpd[2]
oder
/var/log/apache[2]
Und was soll die [2]? Ich fürchte, ich bin einfach nicht Nerd genug, um das alles zu verstehen... und ich werde es auf meine alten Tage (*1969) wohl auch nicht mehr!
Uärgl!
Yadgar
Moin!
High!
/var/log/httpd[2]
oder
/var/log/apache[2]Und was soll die [2]
In eckigen Klammern werden regelmäßig optionale Bestandteile dargestellt.
Hier heisst die: möglicherweise '/var/log/apache' oder '/var/log/apache2' weil das voreingestellte Verzeichnis sich von Distribution zu Distribution (auch: Version zu Version) unterscheidet.
Du selbst kannst es ja auch nach '/tmp/hotzenplotz.logfile' verlegen...
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
Moin!
Nachdem ich die beiden Log-Files auf chmod 777 gesetzt habe, kann ich auch als Normaluser apache2ctl (mit dem Pfad) starten... auf http://localhost kann ich mit dem Browser (Iceweasel/Firefox) nach wie vor nicht zugreifen!
Ein schönes Beispiel, wie man durch diffuse Angst und unsachgemäße Aktionen aufgrund von nicht verstandener externer Ratschläge erst Schwachpunkte schaffen kann.
Mal als genereller Kommentar zu diesem Thread:
Was Steffi dir erzählt hat, ist kompletter Schwachsinn, absolute Panikmache. Und du bist voll drauf reingefallen. :)
Alexanders Infos sind zwar sachlich korrekt, aber sie helfen dir auch nicht weiter. Damit erzeugst du dir höchstens Probleme, wenn es darum geht, deine dann nicht mehr standardkonforme Installation irgendwann mal an Updates anzupassen oder Probleme zu beheben.
Es spricht absolut nichts dagegen, sowohl MySQL als auch Apache vom root-Useraccount aus starten zu lassen. Beide Daemons verlieren schnellstmöglich nach ihrem Start diese Superuser-Rechte und laufen dann mit ihrem eigenen Benutzerkonto und eingeschränkten Rechten. Und das schon seit vielen Jahren ohne große Auffälligkeiten oder Sicherheitsprobleme.
Was MySQL angeht, ist es nicht notwendig, TCP/IP überhaupt zu benutzen, sofern alle Skripte und Programme, die MySQL benutzen sollen, sich ebenfalls auf dem Server befinden.
Was Apache angeht, ist es eine gute Idee, ihn gegen Zugriffe aus dem Internet abzuschirmen. Wie das genau aussehen kann, hängt von deinen lokalen Gegebenheiten ab, über die du nichts erzählt hast. Hängt dein Server direkt am Internet und hat eine öffentliche IP? Das wäre dann das Worst-Case-Szenario, und denkbare Gegenmittel gibt es viele:
- Sven Rautenberg
High!
Was Steffi dir erzählt hat, ist kompletter Schwachsinn, absolute Panikmache. Und du bist voll drauf reingefallen. :)
Tja, ich bin halt kein Nerd und werde es wohl auch nicht mehr, dazu habe ich in den vergangenen 20 Jahren viel zu wenig Rechenzentrumsluft inhaliert...
Alexanders Infos sind zwar sachlich korrekt, aber sie helfen dir auch nicht weiter. Damit erzeugst du dir höchstens Probleme, wenn es darum geht, deine dann nicht mehr standardkonforme Installation irgendwann mal an Updates anzupassen oder Probleme zu beheben.
Es spricht absolut nichts dagegen, sowohl MySQL als auch Apache vom root-Useraccount aus starten zu lassen. Beide Daemons verlieren schnellstmöglich nach ihrem Start diese Superuser-Rechte und laufen dann mit ihrem eigenen Benutzerkonto und eingeschränkten Rechten. Und das schon seit vielen Jahren ohne große Auffälligkeiten oder Sicherheitsprobleme.
Na, wenn das so ist, reicht es ja, wenn ich zum Starten des Apachen kurz die Netzstrippe aus der DSL-Box ziehe, in den Superuser-Modus wechsele, "apache2ctl start", anschließend "exit" eingebe und das Kabul wieder einstöpsele... da der Rechner, wenn ich erst mal vor meinen PHP-Büchern sitze bzw. an meinem Datenbankprojekt herumfrickele sowieso etliche Stunden am Stück läuft, dürfte dieser Aufwand vertretbar sein... cooler wäre es natürlich, wenn der Apache beim Hochfahren von Linux automatisch als Dienst startet (wie ich es von XAMPP für Windows kenne)!
Bis bald im Khyberspace!
Yadgar
Moin!
Na, wenn das so ist, reicht es ja, wenn ich zum Starten des Apachen kurz die Netzstrippe aus der DSL-Box ziehe, in den Superuser-Modus wechsele, "apache2ctl start", anschließend "exit" eingebe und das Kabul wieder einstöpsele...
Wieso das denn?
Egal ob du per SSH oder lokaler Konsole als Superuser eingeloggt bist - das trägt absolut nichts zur Gefährdung bei.
Ich administriere unsere SELFHTML-Server eigentlich grundsätzlich als root - und die sind währenddessen zwangsläufig mit dem Internet verbunden. :)
cooler wäre es natürlich, wenn der Apache beim Hochfahren von Linux automatisch als Dienst startet (wie ich es von XAMPP für Windows kenne)!
Das ist absolut keine Hexerei, du mußt die von dir gewünschten Server lediglich in die Startskripte integrieren. Wie das geht, hängt von der Distribution ab, die du installiert hast.
- Sven Rautenberg
High!
Das ist absolut keine Hexerei, du mußt die von dir gewünschten Server lediglich in die Startskripte integrieren. Wie das geht, hängt von der Distribution ab, die du installiert hast.
Und da fängt es möglicherweise an, schwierig zu werden - meine Distribution ist Sidux Chaos (ein Debian-Abkömmling) und bei früheren Gelegenheiten musste ich hier erfahren, dass diese Distri als Entwickler-Version hochgradig instabil (was ich aus der Praxis nicht bestätigen kann, mein Linux läuft mittlerweile seit acht Monaten ohne nennenswerte Zwischenfälle, erheblich stabiler als XP) und für Nicht-Nerds (also Leute, die partout keinen Bock haben, mehr Zeit mit dem Betriebssystem als mit konkreten Anwendungen zu verbringen) ein absolutes No-No sei...
Bis bald im Khyberspace!
Yadgar
Now playing: Walpurgis (Zara-Thustra)
Moin!
Schau mal, ob Du in /etc einen Ordner init.d findest (also /etc/init.d)
Darin sollte unter anderen ein start/stop-Skript für Deinen Server liegen. (apache oder apache2 oder httpd oder httpd2)
Dann musst Du nur herausfinden, was denn Dein Standard-Runlevel ist.
Bei mir findet sich mit
~> less /etc/inittab
Folgendes:
id:5:initdefault:
^- 5 ist bei mir Standard-Runlevel
Ok. Du kennst Deinen Standard-Runlevel.
Suche, ob sich in /etc/init.d oder in /etc
folgende Ordner befinden:
rc0.d
rc1.d
rc2.d
...
wechsle in den Ordner, der mit Deinem Standard-Runlevel "benummert" ist.
Bei mir wäre es /etc/init.d/rc5.d
Es kann auch /etc/rc5.d sein.
Gibt es beide ist einer Link auf den anderen.
Lass Dir mal informativ dessen Inhalt mit ls -l ausgeben...
Lass Dir diesen Inhalt mit
~> ls -l | grep network ausgeben.
Ergebnis (bei mir):
<code>lrwxrwxrwx 1 root root 10 14. Jun 2007 K17network -> ../network
lrwxrwxrwx 1 root root 10 14. Jun 2007 S05network -> ../network</code>
Fein! Jetzt musst Du nur eines wissen: Die verlinkten Scripte werden in der Reihenfolge der Nummerierung aufgerufen. Beim Betreten des Runlevels (beim Booten) die, die mit "S" beginnen, mit dem Argument "start":
also z.B.
S04irgendwas start
S05network start
Beim Verlassen (herunterfahren), die, die mit "K" (für kill) beginnen, mit dem Argument "stop":
also, z.B.
K17network stop
K18irgendwas stop
Dein Apache braucht das Netzwerk, es ist auch ratsam den syslog, portmap, nfs, mysql-Server vorher zu starten, möglicherweise noch andere (nmb...)
Starte ihn nach dem 'network' und beende ihn vor dem network. Das machst Du durch die Nummerierung, und legst (mit root-rechten!)genau so symbolische Links wie die anderen Programme sie haben:
~> cd /etc/init.d/rc5.d # oder wo Du hinmusst
~> sudo ln -s /etc/init.d/apache2 K09apache2
~> sudo ln -s /etc/init.d/apache2 S13apache2
Nummern, wie bei mir...
Das war es schon. Die gleiche Aktion machst Du für mysql.
~> sudo ln -s /etc/init.d/mysqld K13mysqld
~> sudo ln -s /etc/init.d/mysqld S09mysqld
Nummern, wie bei mir...
Überzeuge Dich, dass alles geklappt hat:
~> ls -l K*
[...]
lrwxrwxrwx 1 root root 10 16. Okt 01:03 K09apache2 -> ../apache2
[...]
lrwxrwxrwx 1 root root 8 22. Okt 22:24 K13mysql -> ../mysql
[...]
~> ls -l S*
[...]
lrwxrwxrwx 1 root root 8 22. Okt 22:24 S09mysql -> ../mysql
[...]
lrwxrwxrwx 1 root root 10 16. Okt 01:03 S13apache2 -> ../apache2
[...]
Ich hoffe ja nicht, dass Dein System schon von der guten alten und hier gezeigten Methode der Runlevel-Konfiguration gänzlich weg ist. Denn dann müsstet Du bitte den Support oder das Manual Deiner Distribution bemühen.
SuSE-Linux hat ein Skript:
~> sudo /sbin/insserv mysql
~> sudo /sbin/insserv apache2
hätten das erledigt...
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®