
Die Artikelserie trägt den Titel Erstellen eines sicheren NAS . In diesem Artikel wird daher eine Erhöhung des Sicherheitsniveaus in Betracht gezogen. Außerdem werden die Tools beschrieben, die ich nicht verwendet habe, die aber angewendet werden können.
Wer und wie?
Wer wird das System angreifen und wie wird er es tun?
Dies ist normalerweise die erste Frage, die beantwortet werden muss, bevor über Sicherheit gesprochen wird.
Zumindest im Fall von NAS ist eine solche Antwort bereits implizit. Um diese Frage vollständig zu beantworten, werden jedoch ein Bedrohungsmodell und ein Eindringlingsmodell erstellt.
Unternehmen beginnen in ihren Entwicklungszyklen eine Phase der Bedrohungsmodellierung.
Microsoft hat eine SDL dafür, Leute haben andere Modelle .
Sie implizieren die Verwendung bestimmter Techniken wie STRIDE oder DREAD (STRIDE ist noch allgemeiner und wird instrumentell gut unterstützt).
In STRIDE basiert ein Modell beispielsweise auf Datenströmen und ist normalerweise groß, schwer und schlecht verstanden. Trotzdem bietet das Tool eine Liste potenzieller Bedrohungen, die deren Prüfung erleichtert.
Das Bedrohungsmodell ist eine klassifizierte Information, da es einem Angreifer erleichtert, das System zu analysieren und Schwachstellen zu finden. Wenn er ein Modell erhält, muss er es nicht selbst bauen, da sich die Analysten bereits um alles gekümmert haben.
Es war eine Minute Werbung.

So bauen seriöse Unternehmen das Modell. Und wenn das interessant ist, kann ich es irgendwie in einem separaten Artikel beschreiben.
Hier werde ich beschreiben, was auf Englisch als "Härten" bezeichnet wird, und mich mit den Sicherheitslücken befassen, die während des Aufbaus des Systems entstanden sind.
Grundsätzlich wird die Sicherheit auf dieser Ebene aufrechterhalten, indem bekannte Systemschwachstellen geschlossen, überwacht und regelmäßig überprüft werden.
Verwandte Literatur
Was zu lesen:
Schnappschüsse und Docker
Zuvor wurde zfs-autosnapshot installiert. Er hat mir immer wieder geholfen, weil Ich könnte beschädigte Konfigurationen (zum Beispiel für Nextcloud) aus Snapshots wiederherstellen.
Im Laufe der Zeit verlangsamte sich das System jedoch und mehrere tausend Schnappschüsse vervielfachten sich.
Es com.sun:auto-snapshot=false
heraus, dass ich beim Erstellen des übergeordneten Dateisystems für Container vergessen habe, das Flag com.sun:auto-snapshot=false
.
Im Originalartikel wurde dieses Problem bereits behoben. Hier werde ich zeigen, wie Sie zusätzliche Schnappschüsse entfernen können.
Details zur Behebung des Fehlers.Deaktivieren Sie zunächst zfs-auto-snapshot im übergeordneten Dateisystem des Dockers:
zfs set com.sun:auto-snapshot=false tank0/docker/lib
Entfernen Sie nun nicht verwendete Container und Bilder:
docker container prune docker image prune
Schnappschüsse löschen:
zfs list -t snapshot -o name -S creation | grep -e ".*docker/lib.*@zfs-auto-snap" | tail -n +1500 | xargs -n 1 zfs destroy -vr
Und schalten Sie sie auf allen Image-Dateisystemen aus:
zfs list -t filesystem -o name -S creation | grep -e "tank0/docker/lib" | xargs -n 1 zfs set com.sun:auto-snapshot=false
Weitere Details finden Sie hier .
LDAP
Beim letzten Mal wurde nur ein LDAP-Benutzer mit einer Administratorrolle erstellt.
Die meisten Dienste müssen jedoch nichts in der Benutzerdatenbank ändern. Daher wäre es schön, einen schreibgeschützten Benutzer hinzuzufügen. Um Rollen nicht manuell zu erstellen, kann ein Container-Initialisierungsskript verwendet werden.
docker-compose.yml
Sie zunächst die Einstellungen in docker-compose.yml
, um den schreibgeschützten Benutzer zu aktivieren:
- "LDAP_READONLY_USER=true" - "LDAP_READONLY_USER_USERNAME=readonly" - "LDAP_READONLY_USER_PASSWORD=READONLY_PASSWORD"
Vollständige Datei unter dem Spoiler.
docker-compose.yml version: "2" networks: ldap: docker0: external: name: docker0 services: open-ldap: image: "osixia/openldap" hostname: "open-ldap" restart: always environment: - "LDAP_ORGANISATION=NAS" - "LDAP_DOMAIN=nas.nas" - "LDAP_ADMIN_PASSWORD=ADMIN_PASSWORD" - "LDAP_CONFIG_PASSWORD=CONFIG_PASSWORD" - "LDAP_READONLY_USER=true" - "LDAP_READONLY_USER_USERNAME=readonly" - "LDAP_READONLY_USER_PASSWORD=READONLY_PASSWORD" - "LDAP_TLS=true" - "LDAP_TLS_ENFORCE=false" - "LDAP_TLS_CRT_FILENAME=ldap_server.crt" - "LDAP_TLS_KEY_FILENAME=ldap_server.key" - "LDAP_TLS_CA_CRT_FILENAME=ldap_server.crt" volumes: - ./certs:/container/service/slapd/assets/certs - ./ldap_data/var/lib:/var/lib/ldap - ./ldap_data/etc/ldap/slapd.d:/etc/ldap/slapd.d networks: - ldap ports: - 172.21.0.1:389:389 - 172.21.0.1:636:636 phpldapadmin: image: "osixia/phpldapadmin:0.7.1" hostname: "nas.nas" restart: always networks: - ldap - docker0 expose: - 443 links: - open-ldap:open-ldap-server volumes: - ./certs:/container/service/phpldapadmin/assets/apache2/certs environment: - VIRTUAL_HOST=ldap.* - VIRTUAL_PORT=443 - VIRTUAL_PROTO=https - CERT_NAME=NAS.cloudns.cc - "PHPLDAPADMIN_LDAP_HOSTS=open-ldap-server" #- "PHPLDAPADMIN_HTTPS=false" - "PHPLDAPADMIN_HTTPS_CRT_FILENAME=certs/ldap_server.crt" - "PHPLDAPADMIN_HTTPS_KEY_FILENAME=private/ldap_server.key" - "PHPLDAPADMIN_HTTPS_CA_CRT_FILENAME=certs/ldap_server.crt" - "PHPLDAPADMIN_LDAP_CLIENT_TLS_REQCERT=allow" ldap-ssp: image: openfrontier/ldap-ssp:https volumes: - /etc/ssl/certs/ssl-cert-snakeoil.pem:/etc/ssl/certs/ssl-cert-snakeoil.pem - /etc/ssl/private/ssl-cert-snakeoil.key:/etc/ssl/private/ssl-cert-snakeoil.key restart: always networks: - ldap - docker0 expose: - 80 links: - open-ldap:open-ldap-server environment: - VIRTUAL_HOST=ssp.* - VIRTUAL_PORT=80 - VIRTUAL_PROTO=http - CERT_NAME=NAS.cloudns.cc - "LDAP_URL=ldap://open-ldap-server:389" - "LDAP_BINDDN=cn=admin,dc=nas,dc=nas" - "LDAP_BINDPW=ADMIN_PASSWORD" - "LDAP_BASE=ou=users,dc=nas,dc=nas" - "MAIL_FROM=admin@nas.nas" - "PWD_MIN_LENGTH=8" - "PWD_MIN_LOWER=3" - "PWD_MIN_DIGIT=2" - "SMTP_HOST=" - "SMTP_USER=" - "SMTP_PASS="
Dann müssen Sie sichern und löschen:
$ cd /tank0/docker/services/ldap $ tar czf ~/ldap_backup.tgz . $ ldapsearch -Wx -D "cn=admin,dc=nas,dc=nas" -b "dc=nas,dc=nas" -H ldap://172.21.0.1 -LLL > ldap_dump.ldif $ docker-compose down $ rm -rf ldap_data $ docker-compose up -d
Löschen Sie die Zeilen in der Datei, um zu verhindern, dass der Server nach einem Speicherauszug auf doppelte Elemente schwört:
dn: dc=nas,dc=nas objectClass: top objectClass: dcObject objectClass: organization o: NAS dc: nas dn: cn=admin,dc=nas,dc=nas objectClass: simpleSecurityObject objectClass: organizationalRole cn: admin description: LDAP administrator userPassword:: PASSWORD_BASE64
Und Benutzer und Gruppen wiederherstellen:
$ ldapadd -Wx -D "cn=admin,dc=nas,dc=nas" -H ldap://172.21.0.1 -f ldap_dump.ldif
Ein solches Tier wird in der Datenbank erscheinen:
dn: cn=readonly,dc=nas,dc=nas cn: readonly objectClass: simpleSecurityObject objectClass: organizationalRole userPassword:: PASSWORD_BASE64 description: LDAP read only user
Rollen in der LDAP-Serverkonfiguration dafür werden vom Container erstellt.
Führen Sie nach der Wiederherstellung Überprüfungen durch und löschen Sie die Sicherung:
$ rm ~/ldap_backup.tgz
Hinzufügen von Gruppen zu LDAP
Praktisch ist die Aufteilung von LDAP-Benutzern in Gruppen, die POSIX-Gruppen unter Linux ähneln.
Beispielsweise können Gruppen erstellt werden, deren Benutzer Zugriff auf Repositorys, Zugriff auf die Cloud oder Zugriff auf die Bibliothek haben.
Gruppen können leicht zu phpLDAPAdmin hinzugefügt werden, und ich werde mich nicht darauf konzentrieren.
Ich stelle nur Folgendes fest:
- Die Gruppe wird aus der Vorlage "Standard" erstellt. Dies ist keine POSIX- Gruppe, sondern eine Gruppe von Namen.
- Dementsprechend verfügt die Gruppe über ein
objectClass
Attribut, das den Wert von groupOfUniqueNames
.

Docker
In Docker wurde fast alles für Sie erledigt.
Standardmäßig wird die Systemaufrufbeschränkung verwendet , die im OMV-Kernel enthalten ist:
# grep SECCOMP /boot/config-4.16.0-0.bpo.2-amd64 CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP_FILTER=y CONFIG_SECCOMP=y
Hier können Sie die grundlegenden Docker-Sicherheitsregeln ausführlicher lesen.
Wenn AppArmor aktiviert ist, kann Docker es integrieren und seine Profile an den Container weiterleiten .
Netzwerk
Beseitigen Sie die Betriebssystemerkennung
Das Netzwerk befindet sich hinter dem Router, aber es ist möglich, eine merkwürdige Übung durchzuführen, indem einige Parameter des Netzwerkstapels so geändert werden, dass das Betriebssystem nicht anhand der Antworten identifiziert werden kann.
Dies hat wenig wirklichen Nutzen, da der Angreifer die Service-Banner untersucht und dennoch versteht, welches Betriebssystem Sie verwenden.
Nmap zeigt an, welches Betriebssystem auf dem Gerät ausgeführt wird. # nmap -O localhost Starting Nmap 7.40 ( https://nmap.org ) at 2018-08-26 14:39 MSK Nmap scan report for localhost (127.0.0.1) Host is up (0.000015s latency). Other addresses for localhost (not scanned): ::1 Not shown: 992 closed ports PORT STATE SERVICE 53/tcp open domain 80/tcp open http 443/tcp open https 5432/tcp open postgresql Device type: general purpose Running: Linux 3.X|4.X OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4 OS details: Linux 3.8 - 4.6 Network Distance: 0 hops OS detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 4.07 seconds
Laden Sie die Einstellungen von sysctl.conf herunter:
# sysctl -p /etc/sysctl.conf net.ipv4.conf.all.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.all.accept_source_route = 0 net.ipv6.conf.all.accept_source_route = 0 net.ipv4.tcp_rfc1337 = 1 net.ipv4.ip_default_ttl = 128 net.ipv4.icmp_ratelimit = 900 net.ipv4.tcp_synack_retries = 7 net.ipv4.tcp_syn_retries = 7 net.ipv4.tcp_window_scaling = 1 net.ipv4.tcp_timestamps = 1
Und so ...
Nmap kann das Betriebssystem nicht bestimmen. # nmap -O localhost Starting Nmap 7.40 ( https://nmap.org ) at 2018-08-26 14:40 MSK Nmap scan report for localhost (127.0.0.1) Host is up (0.000026s latency). Other addresses for localhost (not scanned): ::1 Not shown: 992 closed ports PORT STATE SERVICE 53/tcp open domain 80/tcp open http 443/tcp open https 5432/tcp open postgresql No exact OS matches for host (If you know what OS is running on it, see https://nmap.org/submit/ ). TCP/IP fingerprint: OS:SCAN(V=7.40%E=4%D=8/26%OT=53%CT=1%CU=43022%PV=N%DS=0%DC=L%G=Y%TM=5B8291C OS:3%P=x86_64-pc-linux-gnu)SEQ(SP=FA%GCD=1%ISR=105%TI=Z%CI=I%TS=8)OPS(O1=MF OS:FD7ST11NW7%O2=MFFD7ST11NW7%O3=MFFD7NNT11NW7%O4=MFFD7ST11NW7%O5=MFFD7ST11 OS:NW7%O6=MFFD7ST11)WIN(W1=AAAA%W2=AAAA%W3=AAAA%W4=AAAA%W5=AAAA%W6=AAAA)ECN OS:(R=Y%DF=Y%T=80%W=AAAA%O=MFFD7NNSNW7%CC=Y%Q=)T1(R=Y%DF=Y%T=80%S=O%A=S+%F= OS:AS%RD=0%Q=)T2(R=N)T3(R=N)T4(R=Y%DF=Y%T=80%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T5( OS:R=Y%DF=Y%T=80%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=80%W=0%S=A%A=Z% OS:F=R%O=%RD=0%Q=)T7(R=Y%DF=Y%T=80%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)U1(R=Y%DF=N OS:%T=80%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G)IE(R=Y%DFI=N%T=80%C OS:D=S) Network Distance: 0 hops OS detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 19.52 seconds
Diese Einstellungen müssen in /etc/sysctl.conf
geschrieben /etc/sysctl.conf
und werden dann bei jedem Neustart automatisch gelesen.
Vollständig /etc/sysctl.conf ################################################################### # Additional settings - these settings can improve the network # security of the host and prevent against some network attacks # including spoofing attacks and man in the middle attacks through # redirection. Some network environments, however, require that these # settings are disabled so review and enable them as needed. # # Do not accept ICMP redirects (prevent MITM attacks) net.ipv4.conf.default.accept_redirects = 0 net.ipv6.conf.default.accept_redirects = 0 net.ipv4.conf.all.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 # _or_ # Accept ICMP redirects only for gateways listed in our default # gateway list (enabled by default) # net.ipv4.conf.all.secure_redirects = 1 # # Do not send ICMP redirects (we are not a router) net.ipv4.conf.all.send_redirects = 0 # # Do not accept IP source route packets (we are not a router) net.ipv4.conf.all.accept_source_route = 0 net.ipv6.conf.all.accept_source_route = 0 ## protect against tcp time-wait assassination hazards ## drop RST packets for sockets in the time-wait state ## (not widely supported outside of linux, but conforms to RFC) net.ipv4.tcp_rfc1337 = 1 # # Log Martian Packets #net.ipv4.conf.all.log_martians = 1 # ################################################################### # Magic system request Key # 0=disable, 1=enable all # Debian kernels have this set to 0 (disable the key) # See https://www.kernel.org/doc/Documentation/sysrq.txt # for what other values do #kernel.sysrq=1 ################################################################### # Protected links # # Protects against creating or following links under certain conditions # Debian kernels have both set to 1 (restricted) # See https://www.kernel.org/doc/Documentation/sysctl/fs.txt #fs.protected_hardlinks=0 #fs.protected_symlinks=0 vm.overcommit_memory = 1 vm.swappiness = 10 ################################################################### # Anti-fingerprinting. # # Def: 64. net.ipv4.ip_default_ttl = 128 # ICMP ( 1000) net.ipv4.icmp_ratelimit = 900 # , . # Def: 5. net.ipv4.tcp_synack_retries = 7 # Def: 5. net.ipv4.tcp_syn_retries = 7 # TCP window timespamp 1323. net.ipv4.tcp_window_scaling = 1 net.ipv4.tcp_timestamps = 1 # Redis requirement. net.core.somaxconn = 511
Der Schutz vor dem Definieren von Dienstversionen ist nützlicher, für die ein Angreifer auch Nmap verwenden kann:
# nmap -sV -sR --allports --version-trace 127.0.0.1
Das Ergebnis ist nicht sehr gut für das System. Not shown: 991 closed ports PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.4p1 Debian 10+deb9u3 (protocol 2.0) 25/tcp open smtp Postfix smtpd 80/tcp open http nginx 1.13.12 111/tcp open rpcbind 2-4 (RPC #100000) 139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP) 443/tcp open ssl/http nginx 1.13.12 445/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP) 3493/tcp open nut Network UPS Tools upsd 8000/tcp open http Icecast streaming media server 2.4.2 Service Info: Hosts: nas.localdomain, NAS; OS: Linux; CPE: cpe:/o:linux:linux_kernel Final times for host: srtt: 22 rttvar: 1 to: 100000
Aber mit der Verkleidung von Diensten ist nicht alles glatt:
- Für jeden Service ist hier ein individueller Ansatz erforderlich.
- Die Möglichkeit, die Version zu entfernen, ist nicht immer verfügbar.
Für SSH ist es beispielsweise möglich, die Option DebianBanner no
zu /etc/ssh/sshd_confg
.
Ergebend:
22/tcp open ssh OpenSSH 7.4p1 (protocol 2.0)
Besser, leider funktioniert es nicht: Die Version wird von SSH verwendet, um festzustellen, welche Funktionen unterstützt werden, und es ist möglich, sie nur durch Patchen des Servers zu ändern.
Port klopfen
Nicht die bekannteste Sicherheitstechnik, mit der ein entfernter Benutzer, der das Geheimnis kennt, eine Verbindung zu einem geschlossenen Port herstellen kann.
Die Arbeit ähnelt einer Codesperre : Jeder weiß, dass die Service-Daemons auf dem Server arbeiten, aber "sie sind nicht da", bis der Code gewählt wird.
Um beispielsweise eine Verbindung zu einem SSH-Server herzustellen, muss ein Benutzer an die UDP-Ports 7000, TCP 7007 und UDP 7777 klopfen.
Danach wird die Firewall mit ihrer IP an einem geschlossenen TCP-Port 22 gestartet.
Weitere Informationen dazu finden Sie hier . Und im Handbuch für Debian .
Ich empfehle nicht, als zu verwenden fail2ban ist normalerweise genug.
Firewall
Ich konfiguriere die Firewall über die Web-GUI OpenMediaVault, die ich Ihnen empfehle.

Öffnen Sie die erforderlichen Anschlüsse wie 443 und 22, den Rest nach Geschmack. Es ist auch ratsam, die Protokollierung verworfener Pakete zu aktivieren.
Ssh
Wenn SSH an Port 22 hängt, der für das Internet geöffnet ist, erhalten Sie viele interessante Nachrichten ... # grep "invalid user" /var/log/auth.log|head Aug 26 00:07:57 nas sshd[29786]: input_userauth_request: invalid user test [preauth] Aug 26 00:07:59 nas sshd[29786]: Failed password for invalid user test from 185.143.160.137 port 51268 ssh2 Aug 26 00:11:01 nas sshd[5641]: input_userauth_request: invalid user 0 [preauth] Aug 26 00:11:01 nas sshd[5641]: Failed none for invalid user 0 from 5.188.10.180 port 49025 ssh2 Aug 26 00:11:04 nas sshd[5644]: input_userauth_request: invalid user 0101 [preauth] Aug 26 00:11:06 nas sshd[5644]: Failed password for invalid user 0101 from 5.188.10.180 port 59867 ssh2 Aug 26 00:32:55 nas sshd[20367]: input_userauth_request: invalid user ftp [preauth] Aug 26 00:32:56 nas sshd[20367]: Failed password for invalid user ftp from 5.188.10.144 port 47981 ssh2 Aug 26 00:32:57 nas sshd[20495]: input_userauth_request: invalid user guest [preauth] Aug 26 00:32:59 nas sshd[20495]: Failed password for invalid user guest from 5.188.10.144 port 34202 ssh2
Auf die Gefahr hin, trivial zu wirken, erinnere ich mich noch daran, dass dies erforderlich ist:
- Verbieten Sie das Root-Login strikt.
- Beschränken Sie die Anmeldung nur auf bestimmte Benutzer.
- Ändern Sie den Port auf Nicht-Standard.
- Es ist ratsam, die Kennwortauthentifizierung zu deaktivieren und nur den Schlüssel zu belassen.
Lesen Sie mehr ist zum Beispiel hier möglich .
All dies ist einfach über die OpenMediaVault-Oberfläche über das Menü "Dienste -> SSH" möglich.
Abgesehen davon, dass ich den Port nicht auf Nicht-Standard geändert habe, 22 im lokalen Netzwerk belassen und einfach den Port im NAT-Router ersetzt habe.
Hier ist eine interessante Liste von Konten, die ich zu kompilieren versucht habe, bis ich den SSHD-Port von 22 auf einen anderen geändert habe. # grep "invalid user" /var/log/auth.log|sed 's/.*invalid user \([^ ]*\) .*/\1/'|sort|uniq 0 0101 1234 22 admin ADMIN administrateur administrator admins alfred amanda amber Anonymous apache avahi backup@network bcnas benjamin bin cacti callcenter camera cang castis charlotte clamav client cristina cron CSG cvsuser cyrus david db2inst1 debian debug default denis elvira erik fabio fax ftp ftpuser gary gast GEN2 guest I2b2workdata2 incoming jboss john juan matilda max mia miner muhammad mysql nagios nginx noc office oliver operator oracle osmc pavel pi pmd postgres PROCAL prueba RSCS sales sales1 scaner selena student07 sunos support sybase sysadmin teamspeak telecomadmin test test1 test2 test3 test7 tirocu token tomcat tplink ubnt ubuntu user1 vagrant victor volition www-data xghwzp xxx zabbix zimbra
Sobald dies erledigt ist, werden nicht autorisierte Anmeldeversuche viel seltener durchgeführt.
Um die Situation weiter zu verbessern, ist es möglich, Angreifer nach mehreren Anmeldeversuchen von bestimmten IPs abzuhalten.
Wofür kann verwendet werden:
- Fail2ban . Ein beliebtes Dienstprogramm, das nicht nur für SSH, sondern auch für viele andere Anwendungen funktioniert.
- Denyhosts Sieht aus wie fail2ban.
- Sshguard , wenn Sie möchten, können Sie versuchen, es zu verwenden, aber ich war nicht im Detail daran interessiert.
Ich benutze fail2ban. Es überwacht die Protokolle auf verschiedene unerwünschte Aktionen bestimmter IPs und sperrt sie, wenn die Anzahl der Antworten überschritten wird:
/var/log/fail2ban.log. 2018-08-29 21:17:25,351 fail2ban.filter [8650]: INFO [sshd] Found 5.188.10.144 2018-08-29 21:17:25,473 fail2ban.actions [8650]: NOTICE [sshd] Ban 5.188.10.144 2018-08-29 21:17:27,359 fail2ban.filter [8650]: INFO [sshd] Found 5.188.10.144 2018-08-29 21:28:13,128 fail2ban.filter [8650]: INFO [sshd] Found 5.188.10.176 2018-08-29 21:28:13,132 fail2ban.filter [8650]: INFO [sshd] Found 5.188.10.176 2018-08-29 21:28:15,137 fail2ban.filter [8650]: INFO [sshd] Found 5.188.10.176 2018-08-29 21:28:20,145 fail2ban.filter [8650]: INFO [sshd] Found 5.188.10.176 2018-08-29 21:28:25,153 fail2ban.filter [8650]: INFO [sshd] Found 5.188.10.176 2018-08-29 21:28:25,421 fail2ban.actions [8650]: NOTICE [sshd] Ban 5.188.10.176 2018-08-29 21:30:05,272 fail2ban.filter [8650]: INFO [sshd] Found 5.188.10.180 2018-08-29 21:30:05,274 fail2ban.filter [8650]: INFO [sshd] Found 5.188.10.180 2018-08-29 21:30:13,285 fail2ban.filter [8650]: INFO [sshd] Found 5.188.10.180 2018-08-29 21:30:13,286 fail2ban.filter [8650]: INFO [sshd] Found 5.188.10.180 2018-08-29 21:30:15,289 fail2ban.filter [8650]: INFO [sshd] Found 5.188.10.180 2018-08-29 21:30:15,803 fail2ban.actions [8650]: NOTICE [sshd] Ban 5.188.10.180
Ein Verbot wird durch Hinzufügen einer Firewall-Regel vorgenommen. Nach einer bestimmten Zeit wird die Regel gelöscht und der Benutzer kann erneut versuchen, sich anzumelden.
Anfänglich ist nur SSH aktiviert, es ist jedoch möglich, die Steuerung der Protokolle des Webservers und anderer Dienste, zumindest derselben OMV, zu aktivieren.
Nehmen Sie außerdem die Protokolle aus den Containern heraus und setzen Sie fail2ban ebenfalls darauf.
Ich empfehle, Dienstleistungen nach Geschmack hinzuzufügen.
Weitere Informationen zur Konfiguration finden Sie beispielsweise hier oder im nativen Wiki .
Protokolle
Ein kleines Dienstprogramm, das der Einfachheit halber installiert werden sollte. Es werden die Protokolle hervorgehoben und in einer schönen Form angezeigt.
Es ist möglich, ein solches Dienstprogramm zu verwenden. Hauptsache, Fehler und Problembereiche der Protokolle werden hervorgehoben, damit ihre visuelle Analyse erleichtert wird.
Es lohnt sich, logcheck einfach zu installieren und zu konfigurieren, damit Sie Konfigurationsprobleme, die in den Protokollen gemeldet werden, sofort in der E-Mail sehen.
Es hilft sehr zu sehen, was falsch läuft, obwohl es eine Abstimmung erfordert.
Installation:
# apt-get install logcheck
Unmittelbar nach der Installation werden Berichte gesendet.
Beispiel melden. System Events =-=-=-=-=-=-= Oct 2 02:02:15 nas kernel: [793847.981226] [DROPPED] IN=br-ce OUT= PHYSIN=veth6c2a68e MAC=ff:ff:ff:ff:ff:ff: SRC=172.22.0.11 DST=255.255.255.255 LEN=29 TOS=0x00 PREC=0x00 TTL=64 ID=40170 DF PROTO=UDP SPT=35623 DPT=35622 LEN=9 Oct 2 02:02:20 nas hddtemp[13791]: /dev/sdh: Micron_1100 N #020Ђ: 32 C Oct 2 02:02:37 nas kernel: [793869.247128] [DROPPED] IN=br-7ba OUT= MAC= SRC=172.31.0.1 DST=172.31.255.255 LEN=239 TOS=0x00 PREC=0x00 TTL=128 ID=23017 DF PROTO=UDP SPT=138 DPT=138 LEN=219 Oct 2 02:02:37 nas kernel: [793869.247174] [DROPPED] IN=br-7ba OUT= MAC= SRC=172.31.0.1 DST=172.31.255.255 LEN=232 TOS=0x00 PREC=0x00 TTL=128 ID=23018 DF PROTO=UDP SPT=138 DPT=138 LEN=212 Oct 2 02:02:37 nas kernel: [793869.247195] [DROPPED] IN=br-673 OUT= MAC= SRC=192.168.224.1 DST=192.168.239.255 LEN=239 TOS=0x00 PREC=0x00 TTL=128 ID=8959 DF PROTO=UDP SPT=138 DPT=138 LEN=219 Oct 2 02:02:37 nas kernel: [793869.247203] [DROPPED] IN=br-673 OUT= MAC= SRC=192.168.224.1 DST=192.168.239.255 LEN=232 TOS=0x00 PREC=0x00 TTL=128 ID=8960 DF PROTO=UDP SPT=138 DPT=138 LEN=212 Oct 2 02:02:50 nas hddtemp[13791]: /dev/sdh: Micron_1100 N #020Ђ: 32 C
Es ist zu sehen, dass viel überflüssig ist und die weitere Abstimmung darauf hinausläuft, es zu filtern.
Deaktivieren Sie zunächst hddtemp, das aufgrund von Nicht-ASCII-Zeichen im SSD-Namen nicht ordnungsgemäß funktioniert.
Nach dem Korrigieren der hddtemp-Datei kamen keine Nachrichten mehr:
/etc/logcheck/ignore.d.server/hddtemp ^\w{3} [ :0-9]{11} [._[:alnum:]-]+ hddtemp\[[0-9]+\]: /dev/([hs]d[az]|sg[0-9]):.*[0-9]+.*[CF] ^\w{3} [ :0-9]{11} [._[:alnum:]-]+ hddtemp\[[0-9]+\]: /dev/([hs]d[az]|sg[0-9]):.*drive is sleeping
Dann ist es möglich zu sehen, was laut Logcheck den Broadcast-Verkehr durch die Firewall blockiert:
[793869.247128] [DROPPED] IN=br-7ba OUT= MAC= SRC=172.31.0.1 DST=172.31.255.255 LEN=239 TOS=0x00 PREC=0x00 TTL=128 ID=23017 DF PROTO=UDP SPT=138 DPT=138 LEN=219
Daher müssen Sie den Broadcast-Verkehr vom Router und den Containern aktivieren:
- Port 35622 aus dem Container mit urbackup.
- Port 5678 vom Router ist die RouterOS-Nachbarerkennung. Es kann auf dem Router deaktiviert werden.
- Port 5353 an Adresse 224.0.0.251 ist mDNS .
Überprüfen Sie den Logcheck:
sudo -u logcheck logcheck -t -d
Schließlich werden die Probleme sichtbar:
Oct 21 21:58:18 nas systemd[1]: Removed slice User Slice of user. Oct 21 21:58:31 nas systemd[1]: smbd.service: Unit cannot be reloaded because it is inactive. Oct 21 21:58:31 nas root: /etc/dhcp/dhclient-enter-hooks.d/samba returned non-zero exit status 1
Es stellt sich heraus, dass SAMBA nicht startet. In der Tat zeigte die Analyse, dass ich es durch systemctl getarnt habe und OMV versuchte, es zu starten.
Logcheck wird weiterhin mit verschiedenen Nachrichten Spam versenden.
Hier wurde beispielsweise zfs-auto-snapshot übergeben:
Oct 21 22:00:57 nas zfs-auto-snap: @zfs-auto-snap_frequent-2018-10-21-1900, 16 created, 16 destroyed, 0 warnings.
Zu ignorieren:
/etc/logcheck/ignore.d.server/zfs-auto-snapshot ^\w{3} [ :0-9]{11} [._[:alnum:]-]+ zfs-auto-snap: \@zfs-auto-snap_[[:alnum:]-]+, [0-9]+ created, [0-9]+ destroyed, 0 warnings.$
rrdcached wird ebenfalls ignoriert:
/etc/logcheck/ignore.d.server/rrdcached ^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ rrdcached\[[0-9]+\]: flushing old values$ ^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ rrdcached\[[0-9]+\]: rotating journals$ ^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ rrdcached\[[0-9]+\]: started new journal [./[:alnum:]]+$ ^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ rrdcached\[[0-9]+\]: removing old journal [./[:alnum:]]+$
Es ist auch ratsam, zed zu entfernen, wenn es immer noch nicht entfernt wird:
/etc/logcheck/ignore.d.server/zed ^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (/usr/bin/)?zed: .*$ ^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (/usr/bin/)?zed\[[0-9]+\]: .*$
Gut und so weiter. Viele Leute halten Logcheck für ein ziemlich nutzloses Dienstprogramm.
Dies gilt, wenn Sie es als etwas verwenden, das Sie festlegen und vergessen.
Wenn Sie jedoch verstehen, dass Logcheck nur ein benutzerdefinierter Protokollfilter ohne Heuristik, Magie und adaptive Algorithmen ist, stellt sich die Frage nach seiner Notwendigkeit nicht. Durch iteratives Analysieren dessen, was er sendet, und durch Hinzufügen zum Ignorieren oder Korrigieren ist es allmählich möglich, informative Berichte zu erhalten.
Die Verwendung eines automatisierten Analysetools ist viel besser als das Ausführen der Protokolle durch dieselben regulären Ausdrücke mit Ihren Händen und häufig besser als die Verwendung eines vollständigen Datenanalysesystems wie Splunk.
Logcheck und seine Konfiguration können im Wiki Gentoo und hier gelesen werden .
IDS auf Knotenebene
Hier verweise ich auf meinen eigenen Artikel "Eine kurze Analyse von Lösungen auf dem Gebiet des SOC und die Entwicklung eines Anomaliedetektors für neuronale Netze in Datenübertragungsnetzen" , in dem es mehrere Beispiele gibt.
Sie können eine vollständigere Überprüfung und einen Vergleich ähnlicher IDS im Wiki lesen .
Ein komplexes und umfangreiches Skript zur statischen Analyse bekannter Lücken von RedHat.
Es gibt seinen Port in Debian , den ich empfehle, mindestens einmal herunterzuladen und auszuführen.
STIG-4 Betriebsbeispiel # cd root@nas:~# git clone https://github.com/hardenedlinux/STIG-4-Debian Cloning into 'STIG-4-Debian'... remote: Enumerating objects: 572, done. remote: Total 572 (delta 0), reused 0 (delta 0), pack-reused 572 Receiving objects: 100% (572/572), 634.37 KiB | 0 bytes/s, done. Resolving deltas: 100% (316/316), done. root@nas:~# cd STIG-4-Debian/ root@nas:~/STIG-4-Debian# bash stig-4-debian.sh -H Script Run: Mon Nov 12 23:58:34 MSK 2018 Start checking process... [ FAIL ] The cryptographic hash of system files and commands must match vendor values. ... Pass Count: 54 Failed Count: 137
Die Arbeit mit diesem Skript ist ungefähr wie folgt:
- Das Skript loswerden.
- Durchsuchen Sie das Internet in jeder Zeile mit
[ FAIL ]
. - In der Regel wird ein Link zur STIG-Online-Datenbank gefunden.
- Richtig, folgen Sie den Anweisungen in der Datenbank und gewähren Sie einen Rabatt auf die Tatsache, dass es sich um Debian handelt.
- Führen Sie das Skript erneut aus.
Es wurde zu viel über RkHunter geschrieben .
Lange verwendet, weit verbreitet, noch in der Entwicklung. Es gibt ein Debian-Repository.
Ein modulares Shell-Skript, das die Systemprüfung und die Erkennung von Eindringlingen durchführt.
Es ist etwas ähnlich zu STIG-4.
Es kann Dienstprogramme von Drittanbietern verwenden, um Protokolle zu analysieren und Verstöße gegen die Prüfsumme zu erkennen.
Besteht aus einer Vielzahl unterschiedlicher Module.
Beispielsweise gibt es ein Modul, das Dienste erkennt, die gelöschte Dateien verwenden. Dies geschieht, wenn die vom Dienst verwendeten Bibliotheken während des Systemaktualisierungsprozesses geändert wurden, der Dienst jedoch aus irgendeinem Grund nicht neu gestartet wurde.
Es gibt Module zum Suchen von Dienstbenutzern, die nicht mehr verwendet werden, zum Überprüfen des Systems auf fehlende Sicherheitspatches, zum Überprüfen von umask usw.
Weitere Details beim Menschen .
Es wird seit 10 Jahren nicht mehr entwickelt (ja, ich bin nicht der einzige, der auf Software verzichtet).
Typische HIDS, die:
- Überprüfen Sie die Integrität des gesamten Systems durch kryptografische Hashes.
- Suchen Sie mit der installierten SUID nach verschiedenen ausführbaren Dateien, die nicht installiert werden sollen.
- Erkennen Sie versteckte Prozesse.
- Protokolle und Datenbanken signieren.
Darüber hinaus verfügt es über eine zentralisierte Überwachung mit einer Webschnittstelle und ein zentrales Senden von Protokollen an den Server.
, .
.
, , . , , , , .
- HIDS: .
Samhain, .
, Samhain, Tripwire — .
, .
RkHunter .
, .
.
Tiger , , .
, . , , Lynix Tripwire.
Der Name spricht für sich. .
:
- , .
- .
- , latslog, wtmp utmp.
- , , .
.
Linux.
ninja-build.
, . UID/GID, Ninja , , (, , ).
(, su).
, .
Ubuntu , Debian.
. . , , , .
Nmap W3af Web-.
Linux ( ) .
. , .
, , , .
" Linux" IBM .
NAS , AppArmor.
, , .
, , , .
, .
, ZFS .
ACL ZFS.- Berechtigung zum Hinzufügen einer neuen Datei zum Verzeichnis.
- Berechtigung zum Erstellen eines Unterverzeichnisses in einem Verzeichnis.
- Berechtigung zum Löschen einer Datei.
- Berechtigung zum Löschen einer Datei oder eines Verzeichnisses in einem Verzeichnis.
- Berechtigung zum Ausführen einer Datei oder zum Durchsuchen des Inhalts eines Verzeichnisses.
- Berechtigung zum Auflisten von Verzeichnisinhalten.
- Berechtigung zum Lesen von ACLs (Befehl ls).
- Berechtigung zum Lesen grundlegender Dateiattribute (außer ACLs, Attribute auf Befehlsebene "stat").
- Berechtigung zum Lesen des Inhalts der Datei.
- Berechtigung zum Lesen erweiterter Dateiattribute oder zum Durchsuchen des Verzeichnisses nach erweiterten Dateiattributen.
- .
- .
- , , .
- ACL chmod.
- . chown chgrp .
- , . PRIV_FILE_CHOWN.
- ACL .
- ACL .
- ACL , , . ACL file_inherit, dir_inherit .
- ACL , .
ACL , , , . .
EXT , ZFS ACL setfacl/getfacl
, chmod
ls
.

.
, , exec
, , open
, exec
.
, .
AppArmor , .
, .
capabilites.
, . , , , .
ping. #include <tunables/global> profile ping /{usr/,}bin/ping flags=(complain) { #include <abstractions/base> #include <abstractions/consoles> #include <abstractions/nameservice> capability net_raw, capability setuid, network inet raw, network inet6 raw, /{,usr/}bin/ping mixr, /etc/modules.conf r, # Site-specific additions and overrides. See local/README for details. #include <local/bin.ping> }
, , .. . , , ( local/bin.ping
), , .
deb-based .
firejail , .
, , .
Debian, .

.
NSA , Debian .
SELinux " " (type enforcement).
, , , SELinux . "".
, , firefox_t
.
SELinux , .
Ein Beispiel:
allow firefox_t user_home_t : file { read write };
, , firefox_t
, , user_home_t
.
Ein Beispiel:
allow user_t user_home_t:file { create read write unlink };
user_t
, , user_home_t
. user_t
, , .
, .
AppArmor -, , , .
SELinux .- SELinux Linux. su sudo, SELinux . Linux SELinux , 1:1, root.
- , , . " ", "Web-", " ". ,
object_r
.
, . - . — , .
- . , , . ,
user_u:user_r:user_t
, user_u:object_r:user_home_t
. :
user:role:type:range
— SELinux user. — , . — MLS .
, , , user_home_t.
user_home_t
— , , .
- ,
dir
file
, , . , . , file
(create), (read), (write) (unlink), unix_stream_socket object
( UNIX) (create), (connect), (sendto).
, .
. , (, ), .
, AppArmor, permissive , , .
.
, , AppArmor .
SELinux .
.
IBM .
Debian - . , , .
, ( ), — Gentoo . : hardening .
, .
Debian , GrSecurity PaX.
Tomoyo Debian .
. AppArmor, . 2003 .
, , .
, AppArmor, .
/etc/securetty
, root ( ), .
PAM, /etc/security
.
, Samhain Tripwire, debsums , .
Fazit
. , .
, Github , .