So überwachen Sie den Netzwerkverkehr auf einem LAMP-Server mit sysdig unter CentOS 7

Einführung

sysdig ist ein brandneues Explorations- und Fehlerbehebungs-Tool auf Systemebene, das die Vorteile bekannter Dienstprogramme wie strace, tcpdump und lsof in einer einzigen Anwendung vereint. Und als ob dies nicht genug wäre, bietet sysdig auch die Möglichkeit, die Systemaktivität zu speichern, um Dateien für spätere Analysen zu verfolgen.

Darüber hinaus wird zusammen mit der Installation eine umfangreiche Skriptbibliothek (chisels) bereitgestellt, mit deren Hilfe Sie häufig auftretende Probleme lösen oder die Überwachungsanforderungen erfüllen können, angefangen von der Anzeige fehlgeschlagener E / A-Vorgänge bis hin zum Auffinden der Dateien, in denen ein bestimmter Prozess die meisten Ausgaben getätigt hat Zeit und alles dazwischen. Sie können auch Ihre eigenen Skripte schreiben, um sysdig noch weiter nach Ihren Bedürfnissen zu verbessern.

In diesem Artikel werden wir zunächst die grundlegende Verwendung von sysdig vorstellen und dann die Netzwerkanalyse mit sysdig untersuchen, einschließlich eines Beispiels für die Überwachung des Netzwerkverkehrs auf einem CentOS 7 LAMP-Server. Bitte beachten Sie, dass das in den Beispielen verwendete VPS nicht nennenswert belastet wurde, es jedoch ausreicht, um die Grundlagen der vorliegenden Überwachungsaufgaben zu veranschaulichen.

Voraussetzungen

Bevor Sie beginnen, stellen Sie bitte sicher, dass Sie diese Voraussetzungen haben.

  • CentOS 7 Droplet

  • Richten Sie einen LAMP-Server auf Ihrem CentOS 7 VPS ein. Anweisungen hierzu finden Sie unter this article

  • Darüber hinaus sollten Sie ein Nicht-Root-Benutzerkonto mit sudo haben access, mit dem sysdig ausgeführt wird

Sysdig installieren

Melden Sie sich bei Ihrem Server an und führen Sie die folgenden Schritte aus:

Schritt 1 - Vertrauen Sie dem Draios GPG-Schlüssel

Draios ist die Firma hinter sysdig.

Bevor Sie mit der Installation fortfahren, überprüfen Sie mit diesem Schlüssel die Echtheit des herunterzuladenden Pakets.

Um den Draios-Schlüssel manuell zu Ihrem RPM-Schlüsselbund hinzuzufügen, verwenden Sie das Werkzeug "+ rpm " mit dem Flag " - import +":

sudo rpm --import https://s3.amazonaws.com/download.draios.com/DRAIOS-GPG-KEY.public

Laden Sie dann das Draios-Repository herunter und konfigurieren Sie yum, um es zu verwenden:

sudo curl -s -o /etc/yum.repos.d/draios.repo http://download.draios.com/stable/rpm/draios.repo

Schritt 2 - Aktivieren Sie das EPEL-Repository

Extra Packages für Enterprise Linux (EPEL) ist ein Repository für hochwertige freie und Open-Source-Software, die vom Fedora-Projekt verwaltet wird, und ist zu 100% kompatibel mit seinen Ausgründungen wie Red Hat Enterprise Linux und CentOS. Dieses Repository wird benötigt, um das Dynamic Kernel Module Support (DKMS) -Paket herunterzuladen, das von sysdig benötigt wird, und um andere Abhängigkeiten herunterzuladen.

sudo yum -y install epel-release

Schritt 3 - Installieren Sie die Kernel-Header

Dies ist erforderlich, da sysdig ein angepasstes Kernelmodul (mit dem Namen "+ sysdig-probe +") erstellen und für den Betrieb verwenden muss.

sudo yum -y install kernel-devel-$(uname -r)

Schritt 4 - Installieren Sie das sysdig-Paket

Jetzt können wir sysdig installieren.

sudo yum -y install sysdig

Schritt 5 - Führen Sie sysdig als Nicht-Root-Benutzer aus

Aus Sicherheitsgründen ist es am besten, einen Benutzer ohne Rootberechtigung zu haben, um sysdig auszuführen. Erstellen Sie eine benutzerdefinierte Gruppe für sysdig:

sudo groupadd sysdig

Fügen Sie der Gruppe einen oder mehrere Benutzer hinzu. In unserem Beispiel fügen wir den Benutzer * sammy * hinzu.

sudo usermod -aG sysdig

Suchen Sie die Binärdatei für sysdig:

which sysdig

Möglicherweise erhalten Sie eine Antwort wie

Erteilen Sie allen Mitgliedern der Gruppe * sysdig * die Berechtigung, die ausführbare Datei + sysdig + (und nur diese Binärdatei) auszuführen. Bearbeiten Sie + / etc / sudoers + mit:

sudo visudo

Fügen Sie die folgenden Zeilen für die Gruppe * sysdig * im Abschnitt groups hinzu. Das Hinzufügen der neuen Zeilen nach dem Abschnitt "+% wheel +" ist in Ordnung. Ersetzen Sie den Pfad durch den Speicherort von sysdig auf Ihrem System:

## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL

## sysdig
%sysdig ALL=

Wenn Sie weitere Erläuterungen zur Bearbeitung der Datei "+ / etc / sudoers +" benötigen, empfehlen wir Ihnen einen Blick auf https://www.digitalocean.com/community/tutorials/how-to-add-and-delete- Benutzer-auf-einem-Centos-7-Server [dieser Artikel].

Ausführen von sysdig

Sie können sysdig in zwei Modi ausführen.

Sie können den Echtzeit-Stream der Serveraktivität live anzeigen oder Aufzeichnungen der Systemvorgänge zur späteren Offline-Analyse in einer Datei speichern.

Da Sie höchstwahrscheinlich die zweite Option verwenden möchten, werden wir dies hier behandeln. Beachten Sie, dass sysdig beim Speichern der Systemaktivität in einer Datei einen vollständigen Snapshot des Betriebssystems erstellt, sodass alles, was in diesem Zeitraum auf Ihrem Server passiert, für die Offline-Analyse verfügbar ist.

_ * Hinweis: * Stellen Sie beim Ausführen von sysdig-Befehlen sicher, dass jeder Option ein kurzer Strich vorangestellt ist. Das Kopieren und Einfügen kann zu einem Problem führen, bei dem ein einzelner Bindestrich als langer Bindestrich eingefügt und daher vom Programm nicht erkannt wird. _

Führen Sie einen grundlegenden Befehl sysdig aus, um 1000 Zeilen Serveraktivität zu erfassen.

Führen Sie den folgenden Befehl aus, um die Systemaktivität in einer Datei mit dem Namen "+ act1.scap " zu erfassen und die Ausgabe auf 1000 Ereignisse zu beschränken (lassen Sie den Teil " -n 1000 " aus, wenn Sie "sysdig" für einen nicht festgelegten Zeitraum ausführen möchten ). Der Schalter " -z +" wird verwendet, um die Komprimierung der Tracedatei zu aktivieren.

sudo sysdig -w act1.scap.gz -n 1000 -z

_ * Hinweis: * Wenn Sie im letzten Schritt den Schalter weggelassen haben, können Sie die Ausführung von sysdig durch Drücken der Tastenkombination STRG + C unterbrechen. _

Meißel - Ein Überblick über sysdig-Skripte

Chisels sind sysdig-Skripte. Um eine Liste der verfügbaren Meißel anzuzeigen, müssen Sie den folgenden Befehl ausführen:

sudo sysdig -cl

Um den Netzwerkverkehr auf unserem CentOS 7 LAMP-Server mithilfe der von sysdig erstellten Trace-Datei zu überwachen, verwenden wir die unter der Kategorie "Net" verfügbaren Meißel:

Category: Net
-------------
iobytes_net         Show total network I/O bytes
spy_ip              Show the data exchanged with the given IP address
spy_port            Show the data exchanged using the given IP port number
topconns            top network connections by total bytes
topports_server     Top TCP/UDP server ports by R+W bytes
topprocs_net        Top processes by network I/O

Weitere Informationen zu einem bestimmten Meißel sowie eine Gebrauchsanweisung finden Sie unter:

sudo sysdig -i

Zum Beispiel:

sudo sysdig -i spy_ip

Dies gibt aus:

Category: Net
-------------
spy_ip              Show the data exchanged with the given IP address
shows the network payloads exchanged with an IP endpoint. You can combine this chisel with the -x, -X or -A sysdig command line switches to customize the screen output
Args:
[ipv4] host_ip - the remote host IP address
[string] disable_color - Set to 'disable_colors' if you want to disable color output

Der Abschnitt "+ Args " gibt an, ob Sie ein Argument an den Meißel übergeben müssen oder nicht. Im Fall von " spy_ip +" müssen Sie eine IP-Adresse als Argument an den Meißel übergeben.

Überwachung des Netzwerkverkehrs (praktisches Beispiel)

Lassen Sie uns ein praktisches Beispiel für die Verwendung von sysdig zur Analyse der Bandbreitennutzung und zur Anzeige detaillierter Informationen zum Netzwerkverkehr zeigen.

Um die besten Ergebnisse aus diesem Test zu erhalten, müssen Sie auf Ihrem Server ein Dummy-Webformular einrichten, damit der entsprechende Datenverkehr generiert wird. Wenn dies ein Server mit einer neuen LAMP-Installation ist, können Sie dieses Formular unter + / var / www / html / index.php + erstellen.

<body>
<form id="loginForm" name="loginForm" method="post" action="login.php">
 <table width="300" border="0" align="center" cellpadding="2" cellspacing="0">
   <tr>
     <td width="112"><b>Username:</b></td>
     <td width="188"><input name="login" type="text" class="textfield" id="login" /></td>
   </tr>
   <tr>
     <td><b>Password:</b></td>
     <td><input name="pass" type="password" class="textfield" id="pass" /></td>
   </tr>
   <tr>
     <td>&nbsp;</td>
     <td><br />
     <input type="submit" name="Submit" value="Login" /></td></tr>
 </table>
</form>
</body>

Dies ist nicht erforderlich, aber um alles zu ordnen, können Sie auch die Seite "+ / var / www / html / login.php +" erstellen:

<body>
   <p>Form submitted.</p>
</body>

_ * Warnung: * Bitte löschen Sie dieses Formular, wenn Sie mit dem Testen fertig sind! _

Schritt 1 - Speichern von Live-Daten für die Offline-Analyse

Wir beginnen mit der Erfassung unserer Protokollsammlung von Daten, indem wir den folgenden Befehl eingeben:

sudo sysdig -w act1.scap.gz -z -s 4096

Lassen Sie sysdig eine angemessene Zeit lang laufen. Ihre Eingabeaufforderung bleibt hängen, während sysdig ausgeführt wird.

Besuchen Sie jetzt die Domain oder IP-Adresse Ihres Servers in Ihrem Webbrowser. Sie können sowohl vorhandene als auch nicht vorhandene Seiten besuchen, um Traffic zu generieren. Wenn Sie möchten, dass dieses spezielle Beispiel funktioniert, sollten Sie die Homepage besuchen, die Anmeldeinformationen mit beliebigen Informationen ausfüllen und das Anmeldeformular einige Male absenden. Sie können auch Anfragen an Ihre MySQL / MariaDB-Datenbank richten.

Drücken Sie nach dem Generieren von Datenverkehr STRG + C, um sysdig zu stoppen. Anschließend können Sie die Analyse-Abfragen ausführen, die später in diesem Lernprogramm behandelt werden.

In einer Produktionsumgebung können Sie die sysdig-Datenerfassung während einer anstrengenden Zeit auf Ihrem Server starten.

Grundlegendes zu Filtern: Klassen und Felder

Bevor wir mit dem Sortieren der sysdig-Daten beginnen, erklären wir einige grundlegende sysdig-Befehlselemente.

Sysdig stellt Klassen und Felder als Filter zur Verfügung. Sie können sich Klassen als Objekte und Felder als Eigenschaften vorstellen, basierend auf einer Analogie der objektorientierten Programmiertheorie.

Sie können die vollständige Liste der Klassen und Felder anzeigen mit:

sudo sysdig -l

Wir werden Klassen und Felder verwenden, um die Ausgabe bei der Analyse einer Tracedatei zu filtern.

Schritt 2 - Durchführen einer Offline-Analyse mithilfe von Tracedateien

Da wir den Netzwerkverkehr von und zu unserem LAMP-Server überwachen möchten, laden wir die Trace-Datei "+ act1.scap.gz +" und führen die folgenden Tests mit sysdig durch:

Anzeigen der Liste der wichtigsten Prozesse, die die Netzwerkbandbreite verwenden

sudo sysdig -r act1.scap.gz -c topprocs_net

Die Ausgabe sollte ungefähr so ​​aussehen:

Bytes     Process
------------------------------
331.68KB  httpd
24.14KB   sshd
4.48KB    mysqld

Hier können Sie sehen, dass Apache die meiste Bandbreite verwendet (der "+ httpd +" - Prozess).

Basierend auf dieser Ausgabe können Sie eine informierte und unterstützte Entscheidung treffen, um zu entscheiden, ob Sie die verfügbare Bandbreite erhöhen müssen, um Ihre aktuellen und zukünftigen geschätzten Anforderungen zu erfüllen. Andernfalls möchten Sie möglicherweise die maximale Rate der bereits verfügbaren Bandbreite, die von einem Prozess verwendet werden kann, entsprechend einschränken.

Anzeigen der Netzwerknutzung nach Prozess

Wir möchten möglicherweise auch wissen, welche IPs die von "+ httpd +" verbrauchte Netzwerkbandbreite verwenden, wie im vorherigen Beispiel gezeigt.

Zu diesem Zweck verwenden wir den Meißel "+ topconns " (der die oberen Netzwerkverbindungen nach Gesamtbytes anzeigt) und fügen einen Filter hinzu, der mit der Klasse " proc " und dem Feld " name " gebildet wird, um die Ergebnisse so zu filtern, dass nur "" angezeigt werden http + `Verbindungen. Mit anderen Worten, der folgende Befehl:

sudo sysdig -r act1.scap.gz -c topconns proc.name=httpd

Dies gibt die wichtigsten Netzwerkverbindungen zu Ihrem Server zurück, einschließlich der Quelle, bei der der Prozess, der die Anforderung bedient, "+ httpd +" ist.

Bytes     Proto     Conn
------------------------------
56.24KB   tcp       111.111.111.111:12574->your_server_ip:80
51.94KB   tcp       111.111.111.111:15249->your_server_ip:80
51.57KB   tcp       111.111.111.111:27832->your_server_ip:80
51.26KB   tcp       111.111.222.222:42487->your_server_ip:80
48.20KB   tcp       111.111.222.222:42483->your_server_ip:80
48.20KB   tcp       111.111.222.222:42493->your_server_ip:80
4.17KB    tcp       111.111.111.111:13879->your_server_ip:80
3.14KB    tcp       111.111.111.111:27873->your_server_ip:80
3.06KB    tcp       111.111.222.222:42484->your_server_ip:80
3.06KB    tcp       111.111.222.222:42494->your_server_ip:80

Beachten Sie, dass die ursprünglichen Quell- und Ziel-IP-Adressen aus Datenschutzgründen verdeckt wurden.

Mit dieser Art von Abfrage können Sie Benutzer mit der höchsten Bandbreite finden, die Datenverkehr an Ihren Server senden.

Wenn Sie sich die Ausgabe oben ansehen, denken Sie möglicherweise, dass die Zahlen nach den Quell-IP-Adressen Ports darstellen. Dies ist jedoch nicht der Fall. Diese Nummern geben die Ereignisnummern an, die von sysdig aufgezeichnet wurden.

Schritt 3 - Analysieren von Daten, die zwischen einer bestimmten IP und Apache ausgetauscht wurden

Jetzt werden wir die Verbindungen zwischen einer bestimmten IP-Adresse und Apache genauer untersuchen.

Mit dem Meißel "+ echo_fds " können wir die Daten anzeigen, die von Prozessen gelesen und geschrieben wurden. In Kombination mit einem bestimmten Prozessnamen und einer Client-IP (wie in diesem Fall " proc.name = httpd" und "fd.cip = 111.111.111.111 +") zeigt dieser Meißel die Daten an, die zwischen unserem LAMP-Server und ausgetauscht wurden diese Client-IP-Adresse.

Die Verwendung der folgenden Schalter hilft uns außerdem, die Ergebnisse freundlicher und genauer darzustellen:

  • + -s 4096 +: Liest für jedes Ereignis bis zu 4096 Bytes aus seinem Puffer (dieses Flag kann auch verwendet werden, um festzulegen, wie viele Bytes jedes Datenpuffers auf der Festplatte gespeichert werden sollen, wenn Live-Daten in einer Trace-Datei für gespeichert werden Offline-Analyse)

  • + -A +: Gibt nur den Textteil der Datenpuffer aus und gibt das Zeilenende aus (wir möchten nur von Menschen lesbare Daten anzeigen)

Hier ist der Befehl. Achten Sie darauf, "++" durch eine Client-IP-Adresse aus der vorherigen Ausgabe zu ersetzen.

sudo sysdig -r act1.scap.gz -s 4096 -A -c echo_fds fd.cip= and proc.name=httpd

Abhängig von der Anzahl der Verbindungen, die mit dieser IP-Adresse hergestellt wurden, sollte eine beträchtliche Ausgabe angezeigt werden. Hier ist ein Beispiel, das einen 404-Fehler zeigt:

GET /hi HTTP/1.1
Host: your_server_ip
Connection: keep-alive
Cache-Control: m

------ Write 426B to :39003->your_server_ip:80

HTTP/1.1 404 Not Found
Date: Tue, 02 Dec 2014 19:38:16 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
Content-Length: 200
Keep-Alive: timeout=5, max=99
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /hi was not found on this server.</p>
</body></html>

Diese Art von Abfrage kann Ihnen dabei helfen, genau herauszufinden, welche Arten von Verbindungen von einer IP-Adresse mit maximaler Bandbreite hergestellt wurden. Wenn Sie beispielsweise feststellen, dass die IP-Adresse sehr häufig eine bestimmte Seite erreicht, können Sie die Ressourcen dieser Seite so klein wie möglich halten, um die Bandbreitennutzung zu verringern. Wenn der Datenverkehr nicht legitim zu sein scheint, können Sie eine neue firewall rule erstellen, um Bandbreiten-Hogging zu blockieren IPs.

Schritt 4 - Untersuchen der mit einer IP-Adresse ausgetauschten Daten nach Schlüsselwort

Abhängig von der Serveraktivität während des Erfassungsintervalls enthält die Tracedatei möglicherweise zahlreiche Ereignisse und Informationen. Daher kann es unpraktisch sein, die Ergebnisse des Befehls im vorherigen Abschnitt von Hand durchzuarbeiten. Aus diesem Grund können wir in Ereignispuffern nach bestimmten Wörtern suchen.

Angenommen, wir haben eine Reihe von Webanwendungen auf unserem Webserver ausgeführt und möchten sicherstellen, dass Anmeldeinformationen nicht als einfacher Text über Formulare weitergegeben werden.

Fügen wir dem im vorherigen Beispiel verwendeten Befehl einige Flags hinzu:

sudo sysdig -r act1.scap.gz -A -c echo_fds fd.ip= and proc.name=httpd and evt.is_io_read=true and evt.buffer contains

Hier können wir mit der Klasse "+ evt " zusammen mit dem Feld " is_io_read " nur Leseereignisse untersuchen (aus Sicht des Servers). Außerdem können wir mit ` evt.buffer ` nach einem bestimmten Wort im Ereignispuffer suchen (in diesem Fall ist das Wort `+`). Sie können das Suchwort so ändern, dass es für Ihre eigenen Anwendungen sinnvoll ist.

Die folgende Ausgabe zeigt, dass ein Benutzername und ein Kennwort im Klartext vom Client an den Server übergeben werden (und somit für jeden mit ausreichendem Fachwissen lesbar sind):

------ Read 551B from :41135->your_server_ip:80

POST /login.php HTTP/1.1
Host: your_server_ip
Connection: keep-alive
Content-Length: 35
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: http://104.236.40.111
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://104.236.40.111/
Accept-Encoding: gzip,deflate
Accept-Language: en-US,en;q=0.8

login=&pass=&Submit=Login

Sollten Sie eine ähnliche Sicherheitslücke finden, benachrichtigen Sie sofort Ihr Entwicklerteam.

Fazit

Was Sie mit sysdig beim Überwachen des Netzwerkverkehrs auf einem LAMP-Server erreichen können, hängt hauptsächlich von Ihrer Vorstellungskraft und Ihren Anwendungsanforderungen ab. Wir haben gesehen, wie Sie Benutzer mit der höchsten Bandbreite finden, den Datenverkehr von bestimmten IP-Adressen untersuchen und Verbindungen anhand von Schlüsselwörtern sortieren, die auf Anforderungen Ihrer Anwendungen basieren.

Wenn Sie weitere Fragen zu diesem Artikel haben oder Vorschläge zur Arbeit mit sysdig in Ihrer aktuellen LAMP-Umgebung wünschen, können Sie Ihren Kommentar über das unten stehende Formular abgeben.