Konfigurationsänderungen in Echtzeit überwachen

Alles rund um sicherheitsrelevante Fragen und Probleme.
Benutzeravatar
heisenberg
Beiträge: 3559
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Konfigurationsänderungen in Echtzeit überwachen

Beitrag von heisenberg » 11.10.2019 13:28:47

Hallo zusammen,

ich habe derzeit mit dieser Aufgabe zu tun, die grundsätzlich sehr anspruchsvoll ist:

Die Aufgabe ist, in Echtzeit Änderungen an Konfigurationsdateien zu erkennen mit...
  1. Zeitpunkt der Änderung
  2. integrierter Manipulationssicherheit(ohne 100% Perfektionsanspruch)
  3. Erkennung des Benutzers, der die Änderung durchführt
  4. Inhaltlichem Änderungstext an der Datei
Punkt a) und c) kriege ich durch das Linux-Audit-Log gut raus.

Punkt b) stelle ich mir schwierig vor, wenn es Leute gibt, die grundsätzlich über Root-Berechtigung verfügen. Auch wenn die ursprüngliche User-ID erhalten bleibt(via Linux-Audit), kann man als root natürlich alle Dateien verändern und löschen. Deswegen wäre der Plan hier, die Log-Daten so schnell wie möglich weg vom System zu bekommen(Remote-Audit-Log oder Remote-Syslog). Da kriege ich dann z. B. auch mit, wenn jemand den AuditD per kill abschiesst, bevor er ausgeführt wird, oder wenn Audit-Regeln geändert werden.

Der schwierige Punkt ist d): Da habe ich 2 Fragen, die ich nicht einfach finde:
  1. Wie bekomme ich die Änderungen daran möglichst schnell im Detail(als diff) protokolliert?
  2. Wie bekomme ich die Dateiänderungen zuverlässig den Linux-Audit-Events zugeordnet?
Habt Ihr da Ideen dazu?

Grüße,
h.
Zuletzt geändert von heisenberg am 16.04.2020 17:28:52, insgesamt 3-mal geändert.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Konfigurationsänderungen überwachen

Beitrag von eggy » 11.10.2019 13:31:37

etckeeper kennst Du schon? Das könnte man vielleicht entsprechend extern syncen.

Benutzeravatar
heisenberg
Beiträge: 3559
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Konfigurationsänderungen überwachen

Beitrag von heisenberg » 11.10.2019 13:35:07

Ja. etckeeper und auch changetrack kenne ich.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
heisenberg
Beiträge: 3559
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Konfigurationsänderungen überwachen

Beitrag von heisenberg » 11.10.2019 15:31:11

Sofern ich keinen besseren Weg finde, wie ich die Änderung mit dem verursachenden Benutzer in Verbindung bringen kann, muss ich das wohl über den zeitlichen Zusammenhang regeln.

Ansonsten scheint mir inotifywait eine gute Möglichkeit zu sein.

Hier eine Perl-Demo, die eine audit-message mit dem diff(base64-encoded) erzeugt:

Code: Alles auswählen

#!/usr/bin/perl

#
#       - Track files in /etc
#       - Create audit log message with diff for every changed file
#

use MIME::Base64;

# watch for file changes
open($inotifywait,"inotifywait --recursive --monitor --event modify /etc --format '%T %w%f %e' --timefmt '%s' 2>/dev/null|");

while($line=<$inotifywait>) {


        # exclude irrelevant files
        #       - .git directory (track-loop!)
        #       - .etckeeper file/directory (track-loop!)
        #       - Editor .swap-files

        next if($line =~ /(\/etc\/\.git|\.etckeeper)/);
        next if($line =~ /\.[^\/]+\.swp$/);

        ($time,$fullpath,$event) = split(/[\s]+/,$line);
        ($path,$file)            = $fullpath =~ /(.*)\/([^\/]+)$/;

        $diff = `cd $path && git diff $file`;

        # ignore events with empty diffs
        if($diff ne '') {

                # encode it to base64 to avoid problems with special characters
                $diff = encode_base64($diff);

                #no linebreaks in audit message!
                $diff =~ s/\n/__/g ;

                # commit any changes after detection
                system("cd $path && git commit -m 'auto-commit-".time()."' $file 2>/dev/null >&2");

                # create audit message with encoded diff
                system("auditctl -m 'file_content_tracker $fullpath " .$diff."'");

                print("file change detected: file=$fullpath,time=$time,diff_length=".length($diff)."\n");
        }
}
Kleine Anmerkung: Auf einem System, auf dem man umfassend Linux-Audit einsetzt(also die generelle Kommandoverfolgung davon) sollte man tunlichst nicht zu viele Shellscripte verwenden, da Shellscripte sonst ggf. extrem viele Audit-Meldungen erzeugen(Für jedes: cut,grep,sed,... ca. 6 Zeilen). Das ist einer der Gründe für Perl hier.
Zuletzt geändert von heisenberg am 11.10.2019 16:12:11, insgesamt 1-mal geändert.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
MSfree
Beiträge: 10776
Registriert: 25.09.2007 19:59:30

Re: Konfigurationsänderungen überwachen

Beitrag von MSfree » 11.10.2019 15:57:10

Ich werfe hier mal Debiantripwire ein. Allerdings dürfte das nicht ganz deinen Anforderngen entsprechen. Tripwire erkennt Änderungen an Dateien nur anhand von Prüfsummen.

Benutzeravatar
heisenberg
Beiträge: 3559
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Konfigurationsänderungen überwachen

Beitrag von heisenberg » 11.10.2019 16:41:15

@MSfree: Danke für den Hinweis! Tripwire,Suricata,OSSEC,... sind mir zumindest von Namen und Funktion auch ungefähr bekannt.

Das ist in der Tat nicht so das was ich suche. Es geht mir eher um Ideen wie man die beiden Ereignisse(Änderungsinhalt und Änderungs-Audit-Event) zuverlässig zusammenführen kann. Ich weiss nicht, ob das überhaupt möglich ist.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Konfigurationsänderungen überwachen

Beitrag von eggy » 11.10.2019 17:03:49

heisenberg hat geschrieben: ↑ zum Beitrag ↑
11.10.2019 16:41:15
Es geht mir eher um Ideen wie man die beiden Ereignisse(Änderungsinhalt und Änderungs-Audit-Event) zuverlässig zusammenführen kann. Ich weiss nicht, ob das überhaupt möglich ist.
Deswegen dachte ich an etckeeper, damit hättest Du ja den git hash der Objekte und die Zeitstempel. Lies dich mal ein welche Formatierungsmöglichkeiten git log bietet, damit bekommst Du bestimmt ne ausreichend schöne Ausgabe für Deine Dokumentation erzeugt.
Das Einchecken von Änderungen solltest Du auch über inotify triggern können.

Benutzeravatar
heisenberg
Beiträge: 3559
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Konfigurationsänderungen überwachen

Beitrag von heisenberg » 11.10.2019 18:12:34

Deswegen dachte ich an etckeeper, damit hättest Du ja den git hash der Objekte und die Zeitstempel.
Ich glaube da reden wir aneinander vorbei. Den Zeitstempel habe ich bereits. Das Objekt(die Datei) habe ich auch. Ich möchte wissen wer sie geändert hat bzw. ob der Benutzer tatsächlich den gezogenen diff verursacht hat. Wenn zwei Benutzer die Datei in einem Zeitabschnitt geändert haben, dann möchte ich gerne wissen, wer welche Änderungen vorgenommen hat. Das mit dem zeitlichen Zusammenhang könnte funktionieren. Aber es scheint mir ohne exakten Zusammenhang eher Glückssache zu sein.

Als Hintergrund und vielleicht zum allgemeinen Interesse etwas Erläuterung zum Thema Linux-Audit

Die Regeln

Code: Alles auswählen

auditctl -l

-a always,exit -F arch=b32 -S execve -F key=auditcmd
-a always,exit -F arch=b64 -S execve -F key=auditcmd
-w /etc/wichtig.txt -p w -k log-configuration-change
Die ersten beiden Regeln besagen, dass der Aufruf von 32-Bit und 64-Bit Programmen bitte protokolliert werden soll mit dem Schlüsselwort auditcmd. Die 3. Regel besagt, dass der Schreibzugriff auf die Datei /etc/wichtig.txt mit dem Schlüsselwort log-configuration-change protokolliert werden soll.

Der Zugriff

Wenn ich jetzt mit dem vi die /etc/wichtig.txt editiere und speichere, bekomme ich zwei Events mit diversen logzeilen.

Das Log

Code: Alles auswählen

 1 type=SYSCALL msg=audit(1570812463.716:155703): arch=c000003e syscall=59 success=yes exit=0 a0=250dba0 a1=2503db0 a2=24d65a0 a3=7fffe3976ee0 items=2 ppid=3257 pid=3273 auid=1003 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=6017 comm="vi" exe="/usr/bin/vi" key="auditcmd"
 2 type=EXECVE msg=audit(1570812463.716:155703): argc=2 a0="vi" a1="/etc/wichtig.txt"
 3 type=CWD msg=audit(1570812463.716:155703):  cwd="/root"
 4 type=PATH msg=audit(1570812463.716:155703): item=0 name="/bin/vi" inode=924844 dev=fd:01 mode=0100755 ouid=0 ogid=0 rdev=00:00 objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
 5 type=PATH msg=audit(1570812463.716:155703): item=1 name="/lib64/ld-linux-x86-64.so.2" inode=917409 dev=fd:01 mode=0100755 ouid=0 ogid=0 rdev=00:00 objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
 6 type=PROCTITLE msg=audit(1570812463.716:155703): proctitle=7669002F6574632F776963687469672E747874
 7 type=CONFIG_CHANGE msg=audit(1570812465.091:155704): auid=1003 ses=6017 op=updated_rules path="/etc/wichtig.txt" key="log-configuration-audit" list=4 res=1
 8 type=SYSCALL msg=audit(1570812465.091:155705): arch=c000003e syscall=82 success=yes exit=0 a0=219f9d0 a1=219e1a0 a2=fffffffffffffe80 a3=7fff4af2ddd0 items=4 ppid=3257 pid=3273 auid=1003 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=6017 comm="vi" exe="/usr/bin/vi" key="log-configuration-audit"
 9 type=CWD msg=audit(1570812465.091:155705):  cwd="/root"
10 type=PATH msg=audit(1570812465.091:155705): item=0 name="/etc/" inode=130569 dev=fd:01 mode=040755 ouid=0 ogid=0 rdev=00:00 objtype=PARENT cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
11 type=PATH msg=audit(1570812465.091:155705): item=1 name="/etc/" inode=130569 dev=fd:01 mode=040755 ouid=0 ogid=0 rdev=00:00 objtype=PARENT cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
12 type=PATH msg=audit(1570812465.091:155705): item=2 name="/etc/wichtig.txt" inode=137950 dev=fd:01 mode=0100644 ouid=0 ogid=0 rdev=00:00 objtype=DELETE cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
13 type=PATH msg=audit(1570812465.091:155705): item=3 name="/etc/wichtig.txt~" inode=137950 dev=fd:01 mode=0100644 ouid=0 ogid=0 rdev=00:00 objtype=CREATE cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
14 type=PROCTITLE msg=audit(1570812465.091:155705): proctitle=7669002F6574632F776963687469672E747874
15 type=CONFIG_CHANGE msg=audit(1570812465.091:155706): auid=1003 ses=6017 op=updated_rules path="/etc/wichtig.txt" key="log-configuration-audit" list=4 res=1
16 type=SYSCALL msg=audit(1570812465.091:155707): arch=c000003e syscall=2 success=yes exit=3 a0=219f9d0 a1=241 a2=1a4 a3=0 items=2 ppid=3257 pid=3273 auid=1003 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=6017 comm="vi" exe="/usr/bin/vi" key="log-configuration-audit"
17 type=CWD msg=audit(1570812465.091:155707):  cwd="/root"
18 type=PATH msg=audit(1570812465.091:155707): item=0 name="/etc/" inode=130569 dev=fd:01 mode=040755 ouid=0 ogid=0 rdev=00:00 objtype=PARENT cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
19 type=PATH msg=audit(1570812465.091:155707): item=1 name="/etc/wichtig.txt" inode=139512 dev=fd:01 mode=0100644 ouid=0 ogid=0 rdev=00:00 objtype=CREATE cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
20 type=PROCTITLE msg=audit(1570812465.091:155707): proctitle=7669002F6574632F776963687469672E747874
In Zeile 8 habe ich also einen Eintrag mit dem Schlüsselwort "log-configuration-audit". D. h. da hat meine obige Regel gegriffen. In der Zeile steht, dass der Benutzer die id 1003 hatte, als er sich angemeldet hat(=auid) und jetzt mit der id 0 (=root) unterwegs ist und dass da vi ausgeführt wurde.

Wenn ich möchte, kann ich mir jetzt noch über die in Zeile 8 enthaltene PID(pid=3273) den passenden SYSCALL der Befehlsausführung im Eintrag aus Zeile 1 heraussuchen und von diesem mit der audit-id 1570812463.716:155703 auf den EXECVE Call in der Zeile 2 gehen in dem alle Befehlsparameter stehen. Damit habe ich den kompletten Befehl der Änderung.
Zuletzt geändert von heisenberg am 12.10.2019 18:39:35, insgesamt 7-mal geändert.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
MSfree
Beiträge: 10776
Registriert: 25.09.2007 19:59:30

Re: Konfigurationsänderungen überwachen

Beitrag von MSfree » 11.10.2019 18:22:43

heisenberg hat geschrieben: ↑ zum Beitrag ↑
11.10.2019 18:12:34
Ich möchte wissen wer sie geändert hat.
Ich fürchte, das wirst du nicht mit letzter Gewissheit herausbekommen. Unter /etc braucht man root-Rechte für die meisten Dateien, also ist derjenige, der die Datei geändert hat, root. Das kann durch ein echtes Login, su oder sudo passiert sein. Die Verwendung von su und sudo wird zwar gelogt, zwischen dem Aufruf von su(do) und der Dateiänderung kann aber eine eine gewisse Zeit vergehen, sodaß die Zuordnung des Zeitstempels des su(do)-Aufrufes und der Dateiänderung nicht direkt miteinander korrelieren. Wenn sich der Delinquent direkt als root einlogt, hast du überhaupt keine Information, wer der Verursacher war.

Benutzeravatar
heisenberg
Beiträge: 3559
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Konfigurationsänderungen überwachen

Beitrag von heisenberg » 11.10.2019 18:58:02

Ich habe oben nochmal was zu Audit geschrieben, weil das wer nicht wirklich das Problem ist.

Direkte Anmeldung mit root ist nicht erlaubt(Per SSH-Konfiguration unterbunden. Lokale Root-Logins werden alarmiert). Nur für berechtigte Personen sudo/su - eben aus dem Grund der Nachvollziehbarkeit.

Mit der Info ses=6017 in der Zeile 8 kann man sich z. B. auch alle Befehle dieser Shell-Sitzung heraussuchen.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: Konfigurationsänderungen überwachen

Beitrag von ThorstenS » 12.10.2019 06:30:29

wow, ein sehr interessanter thread - danke dafür!
Ich tracke bisher ausschließlich mit etckeeper. Über einen hook pushe ich manuell/stündlich die Configänderungen ins gitlab, jeweils in einen branch pro host. Mich hat bisher geärgert, dass ich nicht exakt sehe, WER und WANN die Änderungen vorgenommen hat.

Benutzeravatar
HZB
Beiträge: 490
Registriert: 22.10.2003 11:52:15
Wohnort: Wien

Re: Konfigurationsänderungen überwachen

Beitrag von HZB » 13.10.2019 10:27:38

heisenberg hat geschrieben: ↑ zum Beitrag ↑
11.10.2019 13:28:47
Hallo zusammen,

ich habe derzeit mit dieser Aufgabe zu tun, die grundsätzlich sehr anspruchsvoll ist:

Die Aufgabe ist, in Echtzeit Änderungen an Konfigurationsdateien zu erkennen mit...

Habt Ihr da Ideen dazu?

Grüße,
h.
Ich hoffe Du nimmst es mir nicht böse und verstehst mich nicht falsch, aber was soll das Ergebins sein, bzw was willst Du erreichen ?

Ich verstehe noch nicht ganz warum man Änderungen in Echtzeit überwachen muss.
Änderungen im Sinne eines Change Managements sind gewollt. Alles Andere ist Missbrauch.

Der Prozess des Change Managements sollte klar regeln wie Änderungen auszusehen haben und durchzuführen sind.
Bei uns war das eine riesen Aufgabe das umzusetzen. Aber wir sind mit dem Ergebniss zufrieden ( ISO 27001, ISAE 3402 Typ 2 )

Ohne Ticket gibt es keinen Change.
Ein Change muss immer klar sein.
Ein Change löst einen Vorgang aus ( bei uns zB werden Änderungen mittels Ansible durchgeführt und müssen zeitweise weitere Prozesse durchlaufen erst PREPROD danch PROD usw )
Die Ansible Scripts werden bei manchen Changes durch 2 verschiedene Personen kontrolliert zwecks 4 Augen Prinzip und erst danach deployed.
Jeder direkte Zugriff auf ein System wird ins SIEM geloggt und alerted. ( Das hat am Anfang den meisten Lerneffekt gebracht. Wieso greift Admin X auf Host Y zu ? und jeder bekommt es mit )

Ich gebe zu das dies alles bei Kleinst und Kleinumgebungen vielleicht mit Kanonen auf Spatzen schiessen ist. Aber gerade der letzte Punkt ist extrem einfach umzusetzen und hat heilende Wirkung ;-)

Benutzeravatar
heisenberg
Beiträge: 3559
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Konfigurationsänderungen überwachen

Beitrag von heisenberg » 13.10.2019 17:12:44

@HZB:

Die Beschreibung Deiner Umgebung trifft die Umgebung, die ich hier habe auch recht genau.

Bzgl. des Betriebes der Serverlandschaft ist man hier allerdings noch nicht so weit. Hier ist es noch Tagesgeschäft, dass man oft mit root eingreifen muss. Die Situation, die Du beschreibst ist auch die Zielvorstellung hier.

Was das Echtzeitalarmieren betrifft: Echtzeit heisst vielleicht eher zeitnah. Und was dann alarmiert wird und was nicht, dass ist dann nochmal eine weitere Entscheidung, die ich nicht zu treffen habe. Das SIEM (Security Information and Event Management) ist hier momentan im Aufbau. Meine Vorgabe ist zeitnahe Erkennung von diversen Ereignissen, die in dieses SIEM als Datenquellen einfließen.

Meine persönliche Meinung ist, dass man gewisse Ereignisse, wie z. B. jemand ändert Einstellungen am Audit-System schon auch direkt wissen will und das finde ich jetzt auch so nicht grundfalsch. Es soll halt schon erkannt werden, wenn jemand sicherheitsrelevante Einstellungen vornimmt, so dass es bemerkt wird, bevor da z. B. sensible Daten abgezogen werden.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
heisenberg
Beiträge: 3559
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Konfigurationsänderungen überwachen

Beitrag von heisenberg » 21.10.2019 10:02:07

Eine Möglichkeit der Manipulationssicherheit ist wahrscheinlich die Nutzung von SE-Linux. Damit kann man z. B. auch root den Zugriff auf Dateien verbieten, auch wenn das natürlich andere Konsequenzen hat(Wie verteile ich Dateien, wenn root keine Rechte mehr darauf hat sie zu schreiben?)

Siehe:
http://blog.siphos.be/2013/12/limiting- ... nux-alone/
http://blog.siphos.be/2015/07/restricti ... -a-folder/
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
heisenberg
Beiträge: 3559
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Konfigurationsänderungen überwachen

Beitrag von heisenberg » 22.10.2019 10:08:00

Ich habe mich ja noch gefragt, wie ich das machen kann, dass ich im ganzen System verteilt bestimmte Dateien überwachen kann. Etckeeper überwacht ja nur /etc.

Die Lösung ist für mich, dass ich das ganze System ins git packe, aber dann mit .gitignore erst alles ignoriere und dann wieder selektiv einbinde:

/.gitignore

Code: Alles auswählen

# Alle Basisverzeichnisse ignorieren
/* 

# Einzelnes wieder einbinden
!/etc
!/var/log/yum.log
Wegen der yum.log: Das ist hier ein CentOS. Ich setze da ein tracking drauf, weil ich in dieser Datei eine klare Information habe, was da installiert/deinstalliert/aktualisiert wurde. Schreibt irgend etwas da rein, dann kann ich am Diff der Datei erkennen, welche Aktivität stattgefunden hat.

Siehe auch:
https://stackoverflow.com/questions/987 ... -few-files
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
heisenberg
Beiträge: 3559
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Konfigurationsänderungen überwachen

Beitrag von heisenberg » 25.10.2019 21:12:11

Etwas was mir noch aufgefallen ist: Ich möchte ja die Ausführung diverser Befehle verfolgen.

Es gibt eine Klasse von Befehlen, die man nicht verfolgen kann: Shell-Builtins. Da wird genau einmal er Aufruf der Shell protokolliert und das war's dann.

kill ist bei Bash z. B. ein builtin. Natürlich kann man die Builtins per Shell-Konfiguration abschalten. Es hindert den Benutzer aber nicht daran, es wieder einzuschalten. :(
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
heisenberg
Beiträge: 3559
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Konfigurationsänderungen überwachen

Beitrag von heisenberg » 30.10.2019 16:38:25

Ich schreib' hier einfach mal etwas weiter, auch wenn ich der einzige bin hier ;-). Vielleicht ist es ja für jemanden nützlich.

Das mit dem git ist dann doch nicht ganz so einfach wie gedacht. Wenn ich ein Verzeichnis aufnehmen möchte, z. B. /var/lib/alternatives, dann reicht es nicht das einfach so ins .gitignore einzutragen:

Code: Alles auswählen

/*
!/etc
!/var/lib/alternatives
Denn so ist das Verzeichnis /var/lib/alternatives immer noch ausgeschlossen. Das doch noch reinzubekommen ist dann etwas frickeliger:

Code: Alles auswählen

/*
!/etc
!/var
/var/*
!/var/lib
/var/lib/*
!/var/lib/alternatives
D. h. auf jeder Verzeichnisebene erst das Verzeichnis einschließen, dann den kompletten Inhalt ausschließen und dann wieder das eine was man möchte ausschließen.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
heisenberg
Beiträge: 3559
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Konfigurationsänderungen überwachen

Beitrag von heisenberg » 16.04.2020 15:43:08

Hier ist noch ein Parser, der das Auditlog einliest und als JSON/XML ausgeben kann. Von dem, was ich bisher so dazu gefunden habe, scheint das das beste zu sein.

aushape - https://github.com/Scribery/aushape
github/readme hat geschrieben:Aushape is a tool and a library for converting Linux audit log messages to JSON and XML, allowing both single-shot and streaming conversion. At the moment Aushape can output to stdout, a file, or syslog(3). The latter outputs one document or event per message.
Andere Parser(z. B. fluentd-Plugins) sind da teilweise sehr begrenzt und die setzen das teilweise nur pro Zeile um und nicht pro Event - was ja sehr viele Zeilen umfassen kann - wie aushape.
Zuletzt geändert von heisenberg am 16.04.2020 16:15:04, insgesamt 2-mal geändert.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Konfigurationsänderungen überwachen

Beitrag von eggy » 16.04.2020 16:10:13

heisenberg hat geschrieben: ↑ zum Beitrag ↑
30.10.2019 16:38:25
Ich schreib' hier einfach mal etwas weiter, auch wenn ich der einzige bin hier ;-). Vielleicht ist es ja für jemanden nützlich.
bist nicht alleine, /me liest mit - ist nen interessantes Thema

Benutzeravatar
heisenberg
Beiträge: 3559
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Konfigurationsänderungen überwachen

Beitrag von heisenberg » 09.06.2020 23:26:58

HZB hat geschrieben: ↑ zum Beitrag ↑
13.10.2019 10:27:38
Ich verstehe noch nicht ganz warum man Änderungen in Echtzeit überwachen muss.
Änderungen im Sinne eines Change Managements sind gewollt. Alles Andere ist Missbrauch.

Der Prozess des Change Managements sollte klar regeln wie Änderungen auszusehen haben und durchzuführen sind.
Bei uns war das eine riesen Aufgabe das umzusetzen. Aber wir sind mit dem Ergebniss zufrieden ( ISO 27001, ISAE 3402 Typ 2 )

Ohne Ticket gibt es keinen Change.
Ein Change muss immer klar sein.
Ein Change löst einen Vorgang aus ( bei uns zB werden Änderungen mittels Ansible durchgeführt und müssen zeitweise weitere Prozesse durchlaufen erst PREPROD danch PROD usw )
Die Ansible Scripts werden bei manchen Changes durch 2 verschiedene Personen kontrolliert zwecks 4 Augen Prinzip und erst danach deployed.
Jeder direkte Zugriff auf ein System wird ins SIEM geloggt und alerted. ( Das hat am Anfang den meisten Lerneffekt gebracht. Wieso greift Admin X auf Host Y zu ? und jeder bekommt es mit )

Ich gebe zu das dies alles bei Kleinst und Kleinumgebungen vielleicht mit Kanonen auf Spatzen schiessen ist. Aber gerade der letzte Punkt ist extrem einfach umzusetzen und hat heilende Wirkung ;-)
Nochmal ein Nachtrag dazu:

Ganz genauso war die Anforderung in meiner Umgebung auch.

Ich verstehe aber nicht, warum Du mich nicht verstehst. :mrgreen:

Also Echtzeit musste da nicht unbedingt sein. Aber wenn ich Restriktionen von adminstrativen Tätigkeiten durchsetzen will, dann muss ich doch auch ganz genau bestimmen können, wann ein Verstoß stattgefunden hat und worin dieser Verstoß bestanden hat. Und das ist alles andere als trivial.

Zum Hintergrund der "Echtzeit-" oder "zeitnah-" Anforderung oder auch die Unterscheidung zwischen zentralem und dezentralem Ansatz:

Eine Möglichkeit wäre es jetzt sofort alles überhaupt nur extern zu protokollieren - also zentraler Ansatz. Im Falle von AuditD(was jetzt nur eine der Datenquellen ist) bist Du dann ganz schnell bei Hundertausenden von Logzeilen pro Minute. Man braucht also einen sehr fetten Cluster für die Logauswertung, wenn man 100 - 1000 Server hast.

Alternative wäre, dass die Logauswertung dezentral stattfindet und die Logdatenmenge vor der Weiterleitung nach extern drastisch reduziert wird. Das ist aber widerrum anfällig gegen Manipulation und man muss genau schauen, dass man welche Angriffsmöglichkeiten es dagegen gibt und die alle erkennen und sicher melden können.

Desweiteren kann man gewisse Dinge beim zentralen Ansatz nur viel schwerer umsetzen als bei der dezentralen Lösung. Z. B. die Änderung von privilegierten Dateizugriffen mit Änderungstext.

Insofern interessiert mich da doch, was Ihr bei Eurem Projekt da so umgesetzt habe und wie Ihr das gemacht habt.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

wanne
Moderator
Beiträge: 7465
Registriert: 24.05.2010 12:39:42

Re: Konfigurationsänderungen in Echtzeit überwachen

Beitrag von wanne » 10.06.2020 02:55:27

Mich kotzt das ein bisschen an, dass diese Bullshit Lösungen im Linux-Bereich immer mehr um sich greifen.
Immer mehr Leute, die noch nie Malware auseinander genommen haben bekommen grundliegende Sicherheitskonzepte nicht mal angewendet meinen sie könnten das mit irgend welchen Eigenbastellösungen wieder gerade ziehen. Das ist genau das was Windows in den 90ern dahin geführt hat wo es war.
Deswegen passiert gerade sowas hier:
https://www.heise.de/security/meldung/M ... 21393.html
Nicht auf die reihe bekommen regelmäßig Kernel Updates und Intel Patches einzuspielen aber jetzt wild auf Aktionismus gegen Nutzer mit SSH-Keys gehen und so tun als hätte man verstanden, was das passiert ist:
https://www.heise.de/news/Nach-Angriff- ... 70267.html
Jungs der ist root. Wenn der euren SSH manipuliert, dann nicht weil er das muss, sondern weil er es kann. Der braucht auf euren Systemen weder Keys noch Passwörter. Die nimmt der allenfalls mit weil er sie eventuell noch wo anders gebrauchen kann.

Wenn ihr nicht mal euer /usr und /etc ro bekommt und SELinux selbst unter RHEL zu aufwänig ist, dann braucht ihr mit sicherem logging nicht anfangen...
Ne ist nicht. Einfach Quatsch. Nutzt ausgetretene Wege, bevor ihr irgend welchen fancy scheiß erfindet. Das kosten nutzen Verhältnis ist einfach viel besser wenn es irgend wo einen Weg gäbe mit weniger Aufwand mehr zu erreichen hätten das schon andere vor euch gemacht. An Linux Security sind jetzt wirklich schon ein paar mehr Leute mit mehr Ahnung gesessen.

Wenn Malware den auditd killt dann mindestens sicher per signal() malwareentwickler können nämlich im Gegensatz zum standard-admin C. Und dann hat der auditd genau gar nie eine Chance das noch raus zu schreiben bevor er stirbt das ist nicht mal ne race-Condtion der Kernel regelt das explizit, dass signal schneller als das resceduling ist.

Alle ohne 100% Perfektionsanspruch Maßnahmen sind im Security Bereich einfach Quatsch. Wenn ihr selbst ohne Malwareschreiberfahrung auf Anhieb seht, wie man das umgeht, kannst du dich drauf verlassen, dass Metasploit und jeder andere Baukasten das seit mindestens 20 Jahren drin haben und jedes noch so doofe Scriptkiddie das umgeht ohne was davon zu wissen.

Das gilt insbesondere für euren sodo/su Bullshit da steht aus gutem Grund dran, dass diese log-user nur Informativ sind. Damit könnt ihr einen fahrlässigen Admin erwischen. Aber absolut jeder bösartige Nutzer wird seine Aktionen irgend jemand zu schieben, der sich nach ihm einloggt (oder wenigstens einen 2. Login fälschen). Das macht ganz sicher jede Malware, die root-rechte bekommt. Wer root ist, kann auch Dateien ändern ohne inotify zu triggern. (Wobei das wohl weniger verbreitet ist.) Und der wird auch keine netzwerk-Sockets auf machen, die man irgend wo (netstat) sehen könnte sondern halt direkt selbst kommunizieren. Ganz sicher wird er aber den auditd entweder stumm schalten oder mit falschen Nachrichten füttern inklusive des Datums, dass er irgend wann in die Vergangenheit setzt und der der wird auch git fälschen können.

Ernsthaft: Lasst das. Entweder ihr macht es richtig, wie HZB oder ihr lasst es sein. Aber die Aktion hier klingt für mich wieder nach irgend welchem Zeug das gemacht wird, damit man auch irgend was getan hat und im besten Fall nicht schädlich ist. Aber garantiert wird das nicht den Aufwand wert sein der hier getrieben wird.

Aber dieser ganze Quatsch der von dem braven Admin ausgeht, der sich per ssh anmeldet, mit sudo root wird und dann dann mit der bash und vim arbeitet mag ganz nett für die Dokumentation sein. Die triggern schön eure Events wir ihr das wollt. Gegen Angreifer, die praktisch immer eigene Tools mitbringen, die eben gerade darauf getrimmt sind möglichst klein zu sein und eben keine Spuren zu hinterlassen und keine Events zu triggern ist das absolut sinnlos. Die kommen werden eventuell noch irgend wie Standardkonform root und dann sitzen die mit ihren Tools im RAM und laufen und hinterlassen eben keine Spuren mehr insbesondere werden die keine verdächtigen Systemcalls im eigenen Namen machen. Der macht kein execve sondern manipuliert sich selbst. Der läuft nicht im Hintergrund sondern attatched sich an irgend einen eh schon laufenden "harmlosen" Prozess...
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
HZB
Beiträge: 490
Registriert: 22.10.2003 11:52:15
Wohnort: Wien

Re: Konfigurationsänderungen überwachen

Beitrag von HZB » 10.06.2020 11:03:22

heisenberg hat geschrieben: Nochmal ein Nachtrag dazu:

Ganz genauso war die Anforderung in meiner Umgebung auch.

Ich verstehe aber nicht, warum Du mich nicht verstehst. :mrgreen:
Ich versteh Dich schon, aber mir gefällt der Ansatz und vielleicht die Definitionen noch nicht ganz
heisenberg hat geschrieben:Also Echtzeit musste da nicht unbedingt sein. Aber wenn ich Restriktionen von adminstrativen Tätigkeiten durchsetzen will, dann muss ich doch auch ganz genau bestimmen können, wann ein Verstoß stattgefunden hat und worin dieser Verstoß bestanden hat. Und das ist alles andere als trivial.
Per Definition ist es dann schon zu spät. Klar für eine forensische Analyse ist es notwendig. Aber mal ehrlich. Bevor ich mit Forensik herumschlagen muss, bin ich wohl eine zeitlang beschäftigt die Server komplett neu aufzusetzen und zu konfigurieren usw.

Der Ansatz den man vielleicht hier vergleichen kann, ist wie bei einer Firewall Policy.
Eine Möglichkeit ist, alles zu erlauben und nur explizit Dinge zu verbieten.
Die zweite ist alles zu verbieten und nur sehr selektiv die Dinge zu erlauben.

Und auch bei einer Firewall benötigt man die Logs. Aber genauso wie bei exponierten Servern, sollten mmn Logs NIEMALS auf dem betroffenen Gerät gespeichert werden. Zumindest nicht ausschließlich.

Die größte Arbeit hat man also erstmals zu entscheiden wer was darf und diese Policy ( explizit erlauben und ALLES andere verbieten ) durchzusetzen.
Ich will jetzt nicht behaupten das es egal ist wenn dann einer versucht etwas zu machen was nicht erlaubt ist, aber wenn ich getestet habe, dass er nur minimale Rechte hat ist es nicht mehr so zeitkritisch Ihm auf die Finger zu klopfen.

Das Grundprinzip der ganzen Übung sollte also die Erarbeitung der zwei elementaren Grundsätze sein.
Principal of least privilege und segregation of duty.

Wenn das sichergestellt wurde, kannst Du Dir überlegen welche Verstöße Du überhaupt dokumentieren willst und musst.

Der nächste Schritt ist dann die Automatisierung. Alles was man automatisieren kann wird automatisiert. Das minimiert schlicht und ergreifend die Fehlerquote

Benutzeravatar
heisenberg
Beiträge: 3559
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Konfigurationsänderungen in Echtzeit überwachen

Beitrag von heisenberg » 10.06.2020 12:30:18

@HZB:

Ich vermute die Anforderungen zwischen Deinem und meinem Szenario unterscheiden sich erheblich. Das, was ich von Dir höre, liest sich fast schon trivial, auch wenn Du nicht wirklich viel Konkretes über Deine Umgebung und Umsetzungsdetails preisgegeben hast, weil das höchstwahrscheinlich alles auch unter Vertraulichkeit fällt.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

fossonly
Beiträge: 23
Registriert: 10.06.2020 10:40:38

Re: Konfigurationsänderungen in Echtzeit überwachen

Beitrag von fossonly » 10.06.2020 13:04:16

wanne hat geschrieben: ↑ zum Beitrag ↑
10.06.2020 02:55:27
Mich kotzt das ein bisschen an, dass diese Bullshit Lösungen im Linux-Bereich immer mehr um sich greifen.
Vielen Dank für diesen Post. Es hatte mir schon wahnsinnig in den Fingern gejuckt dies selbst zu tun, und dann kam endlich mal etwas sinnvolles. Ich erlebe es ständig das Leute mit irgendeinem Gefrickel um die Ecke kommen, anstatt sich mal mit der Systembasis richtig auseinanderzusetzen. Ich würde sogar sagen das viele dieser kuriosen Ideen, ihren Ursprung in einer früheren Nutzung von Windows haben, und die Leute daher dem Irrtum unterliegen es wäre sinnvoll dieses Nutzungsparadigma auf ihr GNU/Linux zu übertragen. Und für mich hat dieses Tracking von Veränderungen, diesen typischen Nachgeschmack den man von Antivirenprogrammen her kennt. Dabei könnte man es via Immutable-Bit oder read-only Volumes so einfach haben, und ist prinzipiell nicht darauf angewiesen nach Manipulationen suchen zu müssen. Und mittels "ptrace_scope" oder noch besser Kernel-Lockdown, ist das Thema "Process-Hijacking" auch wirksam vom Tisch. Die meisten sollten auch exzessiver Gebrauch von Firejail machen, und idealer Weise in Kombination mit AppArmor. Einfacher kann man die Sicherheit kaum steigern. Man kann Firejail selbst als Login-Shell definieren, um wirklich mal von einer Restricted-Shell sprechen zu können, die man nicht mit einfachsten Mitteln umgehen kann. Dazu noch den Kernel-Lockdown scharf stellen, womit die Angriffsfläche im allgemeinen schon dramatisch sinkt. Ein gehärteter Linux-Kernel kommt letztlich dem ganzen Systeme zugute. Nimmt man dann noch einen Wayland-Compositor wie Gnome, der vorhandene Sicherheitsmechanismen nützlich ergänzt und mittels Nautilus, Gnome-Tracker und der neuen Kindersicherung Infektionen vorbeugt, dann wird das ganze Sicherheitskonzept noch zusätzlich abgerundet. Bei den anderen Desktops sehe ich keine echte sicherheitstechnische Weiterentwicklung, mit Ausnahme von KDE und Sway hinsichtlich Wayland.

Benutzeravatar
HZB
Beiträge: 490
Registriert: 22.10.2003 11:52:15
Wohnort: Wien

Re: Konfigurationsänderungen in Echtzeit überwachen

Beitrag von HZB » 10.06.2020 14:10:02

heisenberg hat geschrieben: ↑ zum Beitrag ↑
10.06.2020 12:30:18
@HZB:

Ich vermute die Anforderungen zwischen Deinem und meinem Szenario unterscheiden sich erheblich. Das, was ich von Dir höre, liest sich fast schon trivial, auch wenn Du nicht wirklich viel Konkretes über Deine Umgebung und Umsetzungsdetails preisgegeben hast, weil das höchstwahrscheinlich alles auch unter Vertraulichkeit fällt.
Auftraggeber war eine Bank die seitens eines Regulators im Bereich IT geprüft wurde. Auftrag selbst war die Nachvollziehbarkeit von Systemänderungen, speziell bei der Kernbankenapplikation ( Applikationsserver, Oracle Cluster ) und den dazugehörigen Sattelitensystemens ( Meldewesen Software, SFTP Server, Reverse Proxy, Internet Banking, PSD2 Schnittstellen, MQ Series, etc ). Da zu dieser Zeit noch kein Automatisierungstool vorhanden war hat man die Chance gepackt und im Zuge des Projekts Ansible eingeführt. Mit allen Konsequenzen die daraus entanden sind. Zeitweise waren es technische Neueinführungen. Zeitweise war es eine Umstrukturierung von Berechtigungen, oder Abteilungen. Auch wurden Arbeitsschritte neu strukturiert, gestrichen, neue eingeführt. Das klingt vielleicht wirklich alles trivial, aber das war es nicht. Dennoch waren zum Schluss selbst die größten Kritiker des Projekts zufrieden, und seitens des Regulators gab es auch ein OK.

Ob sich das jetzt genau mit Deinen Anforderungen deckt kann ich so nicht beurteilen. Aber es klingt recht ähnlich.
Aus der Ferne betrachtet versuchst Du derzeit alles zu loggen, die Logs zu sammeln und danach Massnahmen zu ergreifen.
Nur welches Ziel verfolgst Du damit ? Zu wissen was passiert ist, wenn der Schaden bereits entstanden ist ? Sorry vielleicht seh ich es noch nicht, aber mir fehlt irgendwie das Gesamtkonzept was Du erreichen möchtest.

Antworten