Logging

alexhell

Benutzer
Sehr erfahren
Mitglied seit
13. Mai 2021
Beiträge
2.831
Punkte für Reaktionen
853
Punkte
154
Hallo zusammen,

ich würde gerne alle Container Logs an einer zentralen Stelle (auf einem anderen Host) speichern, damit ich diese mit Crowdsec auswerten kann. Habt ihr da Empfehlungen was man dafür am Besten einsetzen könnte/sollte? Es geht um drei Docker Hosts. Einmal Synology und zweimal Ubuntu Server.
 

Tommi2day

Benutzer
Mitglied seit
24. Aug 2011
Beiträge
1.187
Punkte für Reaktionen
71
Punkte
68
crowdsec kenne ich nicht, aber ich schicke die Logs mit Filebeat nach Elasticsearch. Filebeat läuft dabei einmalig auch als eigener Container auf dem Dockerhost (nativ als Service ginge auch) mit Zugriff auf die Log Verzeichnisse
 

maxblank

Benutzer
Contributor
Sehr erfahren
Mitglied seit
25. Nov 2022
Beiträge
4.116
Punkte für Reaktionen
2.157
Punkte
289
Hier würde sich ein Syslog Server anbieten.
Da gibt es verschiedene Ansätze.
Ich habe das in einigen Firmen als zentrale Anlaufstelle für alle möglichen Logs implementiert. Wie du es dann auswertest, ist wieder ein anderes und sehr komplexes Thema. Aber da hast du oben bereits einen Ansatz genannt.

Ein Synology NAS ist dafür an sich gut geeignet:

https://kb.synology.com/de-de/DSM/help/LogCenter/logcenter_server?version=7

https://kb.synology.com/de-de/DSM/help/LogCenter/logcenter_client?version=7

https://www.security-insider.de/synology-nas-als-syslog-server-a-04432b7467c002bb6c17c157b324fd62/

https://www.ip-insider.de/synology-nas-als-syslog-server-a-04432b7467c002bb6c17c157b324fd62/
 
  • Like
Reaktionen: alexhell

alexhell

Benutzer
Sehr erfahren
Mitglied seit
13. Mai 2021
Beiträge
2.831
Punkte für Reaktionen
853
Punkte
154
An syslog habe ich gestern auch noch gedacht. Bei mir müsste es unter Ubuntu Server laufen.. am liebsten als Container. Dann guck ich mich mal in der Richtung um. Es ist wichtig, dass die Logs als Datei vorliegen, damit crowdsec die auslesen kann. Das ist quasi sowas wie fail2ban nur dass die Bans und Erkennung durch die Community geschieht.
 

alexhell

Benutzer
Sehr erfahren
Mitglied seit
13. Mai 2021
Beiträge
2.831
Punkte für Reaktionen
853
Punkte
154
Ich habe mir Syslog-ng (https://docs.linuxserver.io/images/docker-syslog-ng) eingerichtet und es funktioniert super. Aktuell mit der standard Config (alle Logs landen in der selben Datei) und aktuell reicht es mir so. Aber glaube auf langer Sicht will ich pro Tag eine eigene Datei haben. Dafür muss ich mich aber mit der Config erstmal befassen und verstehen wie die aufgebaut ist.
 
  • Like
Reaktionen: plang.pl

plang.pl

Benutzer
Contributor
Sehr erfahren
Mitglied seit
28. Okt 2020
Beiträge
15.028
Punkte für Reaktionen
5.401
Punkte
564
Würd mich auch interessieren das ganze Thema. Vor einiger Zeit hatte ich mich mal mit Fail2Ban beschäftigt. Habe es dann aber wieder auf Eis gelegt, weil ich nix nach extern freigebe und nur VPN nutze. Spannend finde ich es aber trotzdem. Mittlerweile dürfte CrowdSec aber die bessere Alternative zu Fail2Ban sein
 

alexhell

Benutzer
Sehr erfahren
Mitglied seit
13. Mai 2021
Beiträge
2.831
Punkte für Reaktionen
853
Punkte
154
Meine Fail2Ban Liste ist inzwischen komplett leer, weil CrowdSec es vorher schon bannt. Ich weiß nicht wie die Einrichtung mit dem Nginx Proxy Manager ist, aber bei SWAG war das sehr leicht.
 

plang.pl

Benutzer
Contributor
Sehr erfahren
Mitglied seit
28. Okt 2020
Beiträge
15.028
Punkte für Reaktionen
5.401
Punkte
564
Ach du setzt Fail2Ban noch hinter CrowdSec ein? Macht CrowdSec nicht im Prinzip nicht auch genau das, was Fail2Ban macht (natürlich mit dem Community/Cloud Zusatz)?
 

plang.pl

Benutzer
Contributor
Sehr erfahren
Mitglied seit
28. Okt 2020
Beiträge
15.028
Punkte für Reaktionen
5.401
Punkte
564
"Again what learned"
 

alexhell

Benutzer
Sehr erfahren
Mitglied seit
13. Mai 2021
Beiträge
2.831
Punkte für Reaktionen
853
Punkte
154
Das Dashboard von Crowdec ist auch ganz nett. Da hat man eine gute Übersicht wieso gebannt wurde und wie viele es wirklich sind usw...
Hier mal paar Screenshots:
1.png2.png3.png
 
  • Like
Reaktionen: plang.pl

Ulfhednir

Benutzer
Sehr erfahren
Mitglied seit
26. Aug 2013
Beiträge
3.475
Punkte für Reaktionen
1.087
Punkte
194
Fail2ban ist bei SWAG standardmäßig an. Da muss man nichts für konfigurieren
Naja.... an ist es, die Jails müssen aber trotzdem manuell konfiguriert werden.
Bei mir steht zum Bleistift die Einbindung von Guacamole auf der Agenda. Dazu muss der Log für SWAG erreichbar sein.

Crowdec finde ich in der Tat "ganz nett" und hatte auch schon darüber nachgedacht es mir einzurichten. Allerdings hadere ich beim Mehrwert:
Denn meine Unifi-Appliance macht tatsächlich ähnliches.

WgCdeMw.png
 

Ulfhednir

Benutzer
Sehr erfahren
Mitglied seit
26. Aug 2013
Beiträge
3.475
Punkte für Reaktionen
1.087
Punkte
194
Das ist richtig, die Aussage ist mir aber zu stark pauschalisiert. Insofern könnte sich ein Jemand in Scheinsicherheit wiegen.
Ganz konkret sind die Standards wie folgt:

Code:
[ssh]

enabled = false


[nginx-http-auth]

enabled  = true
filter   = nginx-http-auth
port     = http,https
logpath  = /config/log/nginx/error.log


[nginx-badbots]

enabled  = true
port     = http,https
filter   = nginx-badbots
logpath  = /config/log/nginx/access.log
maxretry = 2


[nginx-botsearch]

enabled  = true
port     = http,https
filter   = nginx-botsearch
logpath  = /config/log/nginx/access.log

[nginx-deny]

enabled  = true
port     = http,https
filter   = nginx-deny
logpath  = /config/log/nginx/error.log

nginx-http-auth sperrt mir Access bei fehlerhaften Basic-Auth.
nginx-badbots sperrt anhand des User-Agents einige Bots aus.
Ob Botsearch über Agents oder IP-Tables geht, habe ich gerade nicht auf dem Schirm.

Faktisch bleibt damit folgendes Problem: Wenn ich eine Webseite OHNE 2FA (Basic-Auth oder Authelia) betreibe und mich "nur" auf die Authentifizierung der Anwendung verlasse, kann diese im schlimmsten Fall gebruteforced werden.
Das Risiko ist durchaus durch Verwendung des Nginx minimiert, aber tatsächlich noch vorhanden. Insofern sollte Fail2Ban nicht als Allheilmittel verschieben werden.


Aktuell mit der standard Config (alle Logs landen in der selben Datei) und aktuell reicht es mir so. Aber glaube auf langer Sicht will ich pro Tag eine eigene Datei haben. Dafür muss ich mich aber mit der Config erstmal befassen und verstehen wie die aufgebaut ist.
Ohne mich jetzt grob mit Docker-Syslog beschäftigt zu haben... folgende Idee: Was wäre denn, wenn du per Task den Container stoppst, die Datei per Task umbenennst und an zentrale Stelle schiebst?
 
  • Like
Reaktionen: alexhell

alexhell

Benutzer
Sehr erfahren
Mitglied seit
13. Mai 2021
Beiträge
2.831
Punkte für Reaktionen
853
Punkte
154
Ja gut, das war wirklich vielleicht zu pauschal. Was ich damit nur sagen wollte, dass man Fail2Ban nicht an sich erst einrichten muss. Aber seine speziellen Jails müssen natürlich angepasst werden. Wobei folgende Jails sind schon dabei und müssten nur aktiviert werden:
1691416109375.png

Was wäre denn, wenn du per Task den Container stoppst, die Datei per Task umbenennst und an zentrale Stelle schiebst?
Was meinst du damit genau? Aktuell wird die Datei zentral abgelegt und ich komme an die Datei auf meiner Maschine von überall ran. Mein Ziel ist es später nur mal eine Datei für Vaultwarden zu haben, eine für forgejo usw....
Im Moment landet halt alles in einer Datei.
Das ist meine standard Config:

Code:
#############################################################################
# Default syslog-ng.conf file which collects all local logs into a
# single file called /var/log/messages tailored to container usage.

@version: 4.1
@include "scl.conf"

source s_local {
  internal();
};

source s_network_tcp {
  syslog(transport(tcp) port(6601));
};

source s_network_udp {
  syslog(transport(udp) port(5514));
};

destination d_local {
  file("/var/log/messages");
  file("/var/log/messages-kv.log" template("$ISODATE $HOST $(format-welf --scope all-nv-pairs)\n") frac-digits(3));
};

log {
  source(s_local);
  source(s_network_tcp);
  source(s_network_udp);
  destination(d_local);
};

Ich habe noch keine Idee wie ich sowas hinbekommen würde file("/var/log/${TAG}");
Aber das bekomme ich noch hin. Muss mich nur mal damit befassen was alles möglich ist :)
 

alexhell

Benutzer
Sehr erfahren
Mitglied seit
13. Mai 2021
Beiträge
2.831
Punkte für Reaktionen
853
Punkte
154
Ich habs jetzt hinbekommen.. Ist keine generische Lösung, weil der Tag wird entspricht {PROGRAM}, aber wenn ich keinen setze, dann kommt was kryptisches an. Daher habe ich angefangen für meine Dienste per Hand zu pflegen. So sieht meine Config aktuell aus:
Code:
#############################################################################
# Default syslog-ng.conf file which collects all local logs into a
# single file called /var/log/messages tailored to container usage.

@version: 4.1
@include "scl.conf"

## custom local message format (used by default throughout this configuration, also see t_remote_r)
template t_local    { template("${YEAR}-${MONTH}-${DAY} ${HOUR}:${MIN}:${SEC} ${TZOFFSET}; ${HOST}; ${FACILITY}.${PRIORITY}; ${MSG}\n"); template_escape(no); };

source s_local {
  internal();
};

source s_network_tcp {
  syslog(transport(tcp) port(6601));
};

source s_network_udp {
  syslog(transport(udp) port(5514));
};

destination d_local {
  file("/var/log/messages");
  file("/var/log/messages-kv.log" template("$ISODATE $HOST $(format-welf --scope all-nv-pairs)\n") frac-digits(3));
};

## vaultwarden
destination d_vaultwarden { file("/var/log/vaultwarden.log" template(t_local)); };
filter f_vaultwarden { program("^vaultwarden$"); };
log { source(s_network_udp); filter(f_vaultwarden); destination(d_vaultwarden); flags(final); };

## ombi
destination d_ombi { file("/var/log/ombi.log" template(t_local)); };
filter f_ombi { program("^ombi$"); };
log { source(s_network_udp); filter(f_ombi); destination(d_ombi); flags(final); };

## all other stuff
log {
  source(s_local);
  source(s_network_tcp);
  source(s_network_udp);
  destination(d_local);
};

Vaultwarden Logs werden in vaultwarden.log gespeichert, ombi in ombi.log und der Rest landet in messages.
 

alexhell

Benutzer
Sehr erfahren
Mitglied seit
13. Mai 2021
Beiträge
2.831
Punkte für Reaktionen
853
Punkte
154
Nochmal ein Update. Hatte keine Lust das für jeden Tag einzeln zu machen.....

Code:
#############################################################################
# Default syslog-ng.conf file which collects all local logs into a
# single file called /var/log/messages tailored to container usage.

@version: 4.1
@include "scl.conf"

## custom local message format (used by default throughout this configuration, also see t_remote_r)
template t_local    { template("${MSG}\n"); template_escape(no); };

source s_local {
  internal();
};

source s_network_tcp {
  syslog(transport(tcp) port(6601));
};

source s_network_udp {
  syslog(transport(udp) port(5514));
};

destination d_local {
  file("/var/log/messages");
  file("/var/log/messages-kv.log" template("$ISODATE $HOST $(format-welf --scope all-nv-pairs)\n") frac-digits(3));
};

destination d_apps { file("/var/log/${PROGRAM}.log" template(t_local)); };
filter f_apps { in-list("/config/apps.list", value("PROGRAM")); };
log { source(s_network_udp); filter(f_apps); destination(d_apps); flags(final); };

## all other stuff
log {
  source(s_local);
  source(s_network_tcp);
  source(s_network_udp);
  destination(d_local);
};

Das ist jetzt meine aktuelle Config. In apps.list steht einfach nur pro Zeile ein Tag. Alle Tags die drin sind, werden in einer separaten Datei geloggt. Dateiname entspricht dann dem Tag. Alles was nicht in der Datei gefunden wird, landet in messages.
Mit der Lösung bin ich jetzt zufrieden.

Ich habe jetzt alle meine Stacks angepasst und das Logging angegeben. Zusätzlich habe ich mir Tailon noch im Docker aufgesetzt und jetzt kann ich mir alle Logs im Browser in Echtzeit angucken.
 


 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat