In diesem Beitrag zeigen wir Ihnen, wie Sie einen Linux-Prozess auf dem System mit zwei Tools, den Befehlszeilen-Tools ps und strace, verfolgen und verfolgen. Diese Systemwerkzeuge können Ihnen helfen, reale Systemprozesse und deren Ursprung zu identifizieren.
Auf gemeinsam genutzten Webhosting-Servern kommt es häufig zu Problemen mit Spam und Malware. Diese Probleme können aus vielen Gründen auftreten, und manchmal werden diese ausgehenden Spams oder Angriffe von Systemprozessen wie Perl-Skripten gestartet, die viele CPU-Ressourcen verbrauchen.
In den meisten dieser Fälle handelt es sich anscheinend „nur“ um einen Perl-Prozess, aber hier kommen ein paar interessante Fragen:Woher wissen Sie, woher er kommt? Wie könnte ein Linux-Systemprozess seinen richtigen Namen maskieren? Was ist der einfachste und zuverlässigste Weg, um herauszufinden, wo dieser Linux-Prozess gestartet wurde?
Heute werden wir versuchen, all diese Fragen mit einigen schnellen und einfachen praktischen Beispielen zu beantworten.
Verfolgen Sie einen Linux-Prozess mit dem Befehl ps
Sehen wir uns ein reales Beispiel an, das vor Tagen auf einem dedizierten Server passiert ist, den ich verwalte.
Auf einer bestimmten Website gab es ein ausgehendes Spam-Problem, das viele E-Mails verschickte, aber im Ordner public_html wurde keine Malware gefunden, außerdem wurden alle Passwörter für E-Mail-Postfächer geändert, genau wie das Passwort für das FTP/cPanel-Konto. Trotzdem nutzte der Angreifer das Linux-System, um ausgehende E-Mails zu versenden.
Die Quelle der E-Mails war ein Prozess, der unter dem Benutzer „johndoe“ ausgeführt wurde, der böswillig zu sein schien und nicht das war, was er vorgab:
[[email protected] ~] ps -U johndoe -u johndoe u USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND johndoe 59289 4.0 0.0 43568 9528 ? Ss Jun08 110:01 httpd
Wie Sie sehen, war das erste, was Sie herausfinden mussten, der ps-Befehl, wie Sie unten sehen:
ps -U user -u user u
Ersetzen Sie „Benutzer“ durch Ihren echten Systembenutzer.
Danach, sobald Sie die verdächtigen Prozesse aufgelistet haben, verwenden Sie ll Befehl, um weitere Informationen über seine PID zu erhalten , wie zuvor gesehen:
Wie Sie sehen, gibt der Prozess vor, „httpd“ zu sein, um sich zu verstecken (jeder Prozess kann seinen eigenen Prozesstitel ändern), es ist tatsächlich ein Perl-Prozess:
[[email protected] ~] ll /proc/59289/exe lrwxrwxrwx 1 johndoe johndoe 0 Jun 10 10:05 /proc/59289/exe -> /usr/bin/perl*
Es war jedoch keine Skriptdatei damit verbunden. Das Skript wurde höchstwahrscheinlich in den Perl-Prozess geleitet, um zu vermeiden, dass irgendetwas im Dateisystem abgelegt wird, wo es eine Spur hinterlassen würde.
Ich weiß nicht, wie das Skript unter diesem Benutzer ausgeführt wurde, aber dies war eine anfällige WordPress-Installation mit vielen veralteten Plugins und injizierter Malware, die leicht zu dieser Art von Problemen führen könnte.
In diesem Fall war es am besten, den Rouge-Prozess zu beenden:
kill -9 59289
Ersetzen Sie „59289“ durch die echte Prozess-ID.
Strace:ein weiterer einfacher Weg, einen Systemprozess zu verfolgen
Strich ist ein sehr praktisches und nützliches Tool, das von Systemadministratoren zum Debuggen und Diagnostizieren system- und prozessbezogener Probleme verwendet wird, bei denen die Quelle nicht wirklich klar und auf einen ersten Blick verfügbar ist.
Mit diesem Debug-Tool können Programmierer und Systembenutzer schnell herausfinden, wie ein Programm mit dem Betriebssystem interagiert. Dies geschieht durch Überwachung von Systemaufrufen und -signalen.
Wie wir in den nächsten Beispielen sehen werden, gibt strace jede Zeile im Trace aus, die den Namen des Systemaufrufs, seine Argumente und den Rückgabewert (innerhalb der Klammern) enthält.
Stretch-Beispiel
Lassen Sie uns strace gegen /bin/ls laufen lassen und die Ausgabe in einer Datei namens ls.txt
speichernstrace -o ls.txt /bin/ls
Um die Ausgabe zu lesen, führen Sie einfach Folgendes aus:
more ls.txt
Aber das ist nur ein einfaches Strace-Beispiel. Der interessante Teil kommt, wenn Sie den Webserver-Prozess verfolgen und herausfinden können, was er genau tut. Nehmen wir als Beispiel einen php-fpm-Prozess:
strace -p 18478 -s 80 -o /root/php-fpm.debug.txt
[[email protected]:~]strace -p 18478 -s 80 -o /root/php-fpm.debug.txt Process 18478 attached ^CProcess 18478 detached [[email protected]:~]
Durch Drücken von STRG + C beenden Sie die Ablaufverfolgung und sie wird getrennt.
Sie können auch spezifizieren, was Sie nachverfolgen müssen, zum Beispiel, wenn Sie nur die offenen und gelesenen Systemaufrufe nachverfolgen müssen, sollten Sie das in der Strace-Syntax angeben, wie Sie unten sehen:
strace -e trace=open,read -p 18478 -s 80 -o /root/php-fpm.debug.txt
Dieses schnelle Strace-Beispiel verwendete einige Befehlsoptionen, die hier erklärt werden:
-o filename: used to write the strace output into a file name. -p PID: here you must specify the system process ID. -s SIZE: sets the maximum string size to print (32 is the default).
Um die Ausgabe zu lesen, führen Sie erneut einfach Folgendes aus:
more /root/php-fpm.debug.txt
Jetzt wissen Sie, wie Sie einen Linux-Prozess einfach mit zwei einfachen Befehlen verfolgen können. Mit diesen Informationen können Sie einen Linux-Prozess einfach verfolgen, um herauszufinden, was genau auf Ihrem Server passiert. strace braucht etwas mehr Zeit, um das Handbuch zu verstehen, aber es ist das definitive Werkzeug, um einen Linux-Prozess zu verfolgen.
Weiterführende Literatur:
- man strace
- Strace Hallo Welt
- ps-Befehl