Logiciel de sécurité supplémentaire pour NAS


La série d'articles s'intitule Construire un NAS sécurisé . Par conséquent, cet article envisagera d'augmenter le niveau de sécurité. De plus, ces outils que je n'ai pas utilisés, mais qu'il est possible d'appliquer, seront décrits.


Qui et comment?


Qui va attaquer le système et comment le fera-t-il?


C'est généralement la première question à laquelle il faut répondre avant de parler de sécurité.
Au moins dans le cas des NAS, une telle réponse est déjà implicite. Mais pour répondre pleinement à cette question, un modèle de menace et un modèle d'intrus sont en cours de construction.


Les entreprises entament une phase de modélisation des menaces dans leurs cycles de développement.
Microsoft a un SDL pour cela, les gens ont d'autres modèles .


Ils impliquent l'utilisation de certaines techniques, comme STRIDE ou DREAD (STRIDE est encore plus général et bien supporté instrumentalement).


Dans STRIDE, par exemple, un modèle est construit sur des flux de données et est généralement volumineux, lourd et mal compris. Néanmoins, l'outil fournit une liste des menaces potentielles, ce qui facilite leur prise en compte.


Le modèle de menace est une information classifiée car il permet à un attaquant d'analyser plus facilement le système et de trouver des faiblesses. S'il reçoit un modèle, il n'aura pas à le construire lui-même, car les analystes se sont déjà occupés de tout.


C'était une minute de publicité.



C'est ainsi que les entreprises sérieuses construisent le modèle. Et si cela est intéressant, je peux en quelque sorte décrire dans un article séparé.


Je décrirai ici ce qu'on appelle le «durcissement» en anglais et traiterai des failles de sécurité qui ont été faites lors de la construction du système.


Fondamentalement, le maintien de la sécurité à ce niveau se fait en fermant les vulnérabilités connues du système, en le surveillant et en le vérifiant périodiquement.


Littérature connexe


Que lire:



Instantanés et Docker


Auparavant, zfs-autosnapshot était installé. Il m'a aidé à plusieurs reprises, car Je pouvais restaurer des configurations corrompues (pour Nextcloud, par exemple) à partir d'instantanés.
Cependant, au fil du temps, le système a commencé à ralentir et plusieurs milliers de clichés se sont multipliés.


Il com.sun:auto-snapshot=false avéré que lors de la création du système de fichiers parent pour les conteneurs, j'ai oublié de définir l'indicateur com.sun:auto-snapshot=false .


Dans l' article d'origine, ce problème a déjà été corrigé, je vais montrer ici comment se débarrasser des instantanés supplémentaires.


Détails sur la façon de corriger l'erreur.

Tout d'abord, désactivez zfs-auto-snapshot sur le système de fichiers parent du docker:


 zfs set com.sun:auto-snapshot=false tank0/docker/lib 

Maintenant, supprimez les conteneurs et les images inutilisés:


 docker container prune docker image prune 

Supprimer des instantanés:


 zfs list -t snapshot -o name -S creation | grep -e ".*docker/lib.*@zfs-auto-snap" | tail -n +1500 | xargs -n 1 zfs destroy -vr 

Et désactivez-les sur tous les systèmes de fichiers image:


 zfs list -t filesystem -o name -S creation | grep -e "tank0/docker/lib" | xargs -n 1 zfs set com.sun:auto-snapshot=false 

Plus de détails peuvent être lus ici .


LDAP


La dernière fois, un seul utilisateur LDAP avec un rôle d'administrateur a été créé.


Mais la plupart des services n'ont rien à changer dans la base de données des utilisateurs. Par conséquent, il serait intéressant d'ajouter un utilisateur en lecture seule. Afin de ne pas créer de rôles manuellement, il est possible d'utiliser un script d'initialisation de conteneur.


Tout d'abord, ajoutez les paramètres dans docker-compose.yml pour activer l'utilisateur en lecture seule:


 - "LDAP_READONLY_USER=true" - "LDAP_READONLY_USER_USERNAME=readonly" - "LDAP_READONLY_USER_PASSWORD=READONLY_PASSWORD" 

Dossier complet sous le 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=" 

Ensuite, vous devez vider et supprimer:


 $ 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 

Pour empêcher le serveur de récupérer d'un vidage de jurer sur les éléments en double, supprimez les lignes du fichier:


 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 

Et restaurez les utilisateurs et les groupes:


 $ ldapadd -Wx -D "cn=admin,dc=nas,dc=nas" -H ldap://172.21.0.1 -f ldap_dump.ldif 

Une telle bête apparaîtra dans la base de données:


 dn: cn=readonly,dc=nas,dc=nas cn: readonly objectClass: simpleSecurityObject objectClass: organizationalRole userPassword:: PASSWORD_BASE64 description: LDAP read only user 

Les rôles dans la configuration du serveur LDAP seront créés par le conteneur.
Effectuez des vérifications après la récupération et supprimez la sauvegarde:


 $ rm ~/ldap_backup.tgz 

Ajout de groupes à LDAP


Pratique est la séparation des utilisateurs LDAP en groupes similaires aux groupes POSIX sur Linux.
Par exemple, il est possible de créer des groupes dont les utilisateurs auront accès aux référentiels, l'accès au cloud ou l'accès à la bibliothèque.


Les groupes sont facilement ajoutés à phpLDAPAdmin, et je ne me concentrerai pas là-dessus.


Je note seulement ce qui suit:


  • Le groupe est créé à partir du modèle "Par défaut". Ce n'est pas un groupe POSIX , mais un groupe de noms.
  • Par conséquent, le groupe possède un attribut objectClass qui inclut la valeur de groupOfUniqueNames .

Ajouter un groupe à phpLDAPAdmin


Docker


Dans Docker, presque tout a été fait pour vous.
Par défaut, il utilise la restriction d'appel système , qui est incluse dans le noyau OMV:


 # grep SECCOMP /boot/config-4.16.0-0.bpo.2-amd64 CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP_FILTER=y CONFIG_SECCOMP=y 

Ici, vous pouvez lire plus en détail les règles de base de la sécurité Docker.
De plus, si AppArmor est activé, Docker peut l'intégrer et transmettre ses profils au conteneur .


Réseau


Éliminez la découverte du système d'exploitation


Le réseau est situé derrière le routeur, mais il est possible de faire un exercice curieux en modifiant certains paramètres de la pile réseau afin que le système d'exploitation ne puisse pas être identifié par les réponses.
Il y a peu d'avantages réels à cela, car l'attaquant étudiera les bannières de service et comprendra toujours le système d'exploitation que vous utilisez.


Nmap montre quel système d'exploitation fonctionne sur l'appareil.
 # 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 

Téléchargez les paramètres depuis sysctl.conf:


 # 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 

Et donc ...


Nmap ne peut pas déterminer le système d'exploitation.
 # 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 

Ces paramètres doivent être écrits dans /etc/sysctl.conf , puis à chaque redémarrage, ils seront lus automatiquement.


/Etc/sysctl.conf complet
 ################################################################### # 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 

La protection contre la définition des versions de service est plus utile, pour laquelle un attaquant peut également utiliser Nmap:


 # nmap -sV -sR --allports --version-trace 127.0.0.1 

Le résultat n'est pas très bon pour le système.
 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 

Mais avec le déguisement de services, tout ne se passe pas bien:


  • Pour chaque service, une approche individuelle est nécessaire ici.
  • La possibilité de supprimer la version n'est pas toujours disponible.

Par exemple, pour SSH, il est possible d'ajouter l'option DebianBanner no à /etc/ssh/sshd_confg .


En conséquence:


 22/tcp open ssh OpenSSH 7.4p1 (protocol 2.0) 

Mieux, hélas, cela ne fonctionnera pas: la version est utilisée par SSH pour établir quelles fonctionnalités sont prises en charge, et il est possible de la changer uniquement en corrigeant le serveur .


Coup de port


Pas la technique de sécurité la plus connue, permettant à un utilisateur distant qui connaît le secret de se connecter à un port fermé.
Le travail ressemble à un verrou de code : tout le monde sait que les démons de service fonctionnent sur le serveur, mais "ils ne sont pas là" jusqu'à ce que le code soit composé.
Par exemple, pour se connecter à un serveur SSH, un utilisateur doit frapper sur les ports UDP 7000, TCP 7007 et UDP 7777.
Après cela, avec son IP, le pare-feu démarrera sur un port TCP fermé 22.


Vous pouvez en savoir plus sur la façon dont cela fonctionne ici . Et dans le manuel de Debian .


Je ne recommande pas d'utiliser, car fail2ban est généralement suffisant.


Pare-feu


Je configure le pare-feu via l'interface graphique Web OpenMediaVault, que je vous recommande.



Ouvrez les ports nécessaires, tels que 443 et 22, le reste au goût. Il est également conseillé d'activer la journalisation des paquets perdus.


Ssh


Si SSH se bloque sur le port 22, qui est ouvert sur Internet, vous recevrez de nombreux messages intéressants ...
 # 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 

Au risque de paraître banal, je rappelle encore qu'il faut:


  • Interdisez strictement la connexion root.
  • Limitez la connexion aux utilisateurs spécifiés uniquement.
  • Changez le port en non standard.
  • Il est conseillé de désactiver l'authentification par mot de passe, en ne laissant que la clé.

En savoir plus est possible, par exemple ici .


Tout cela se fait facilement depuis l'interface OpenMediaVault via le menu "Services -> SSH".
Sauf que je n'ai pas changé le port en non standard, en laissant 22 sur le réseau local et en remplaçant simplement le port dans le routeur NAT.


Voici une liste intéressante de comptes que j'ai essayé de compiler, jusqu'à ce que je change le port SSHD en un autre que 22.
 # 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 

Une fois cela fait, les tentatives de connexion non autorisées seront effectuées beaucoup moins fréquemment.


Pour améliorer encore la situation, il est possible de bloquer les attaquants de certaines adresses IP après plusieurs tentatives de connexion.


Ce qui peut être utilisé pour:


  • Fail2ban . Un utilitaire populaire qui fonctionne non seulement pour SSH, mais aussi pour de nombreuses autres applications.
  • Denyhosts Ressemble à fail2ban.
  • Sshguard , si vous le souhaitez, vous pouvez essayer de l'utiliser, mais cela ne m'intéressait pas en détail.

J'utilise fail2ban. Il surveillera les journaux pour diverses actions indésirables de la part de certaines adresses IP et les interdira si le nombre de réponses est dépassé:


/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 

Une interdiction est faite en ajoutant une règle de pare-feu. Après un délai spécifié, la règle est supprimée et l'utilisateur peut à nouveau essayer de se connecter.


Initialement, seul SSH est activé, mais il est possible d'activer le contrôle des journaux du serveur Web et d'autres services, au moins du même OMV .
Et aussi, retirez les journaux des conteneurs et définissez également fail2ban sur eux.


Je recommande d'ajouter des services au goût.
Vous pouvez en savoir plus sur la configuration, par exemple ici ou sur le wiki natif .


Journaux


Lwatch


Un petit utilitaire qui doit être installé pour plus de commodité. Il mettra en évidence les journaux et les montrera sous une belle forme.
Il est possible d'utiliser un tel utilitaire , l'essentiel est que les erreurs et les zones problématiques des journaux soient mises en évidence afin de faciliter leur analyse visuelle.


Logcheck


Il vaut la peine d'installer et de configurer logcheck simplement pour que lorsque vous identifiez les problèmes de configuration signalés dans les journaux, vous le voyez immédiatement dans l'e-mail.
Cela aide beaucoup à voir ce qui ne va pas, même si cela nécessite un réglage.


Installation:


 # apt-get install logcheck 

Immédiatement après l'installation, il enverra des rapports.


Exemple de rapport.
 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 

On peut voir qu'il y a beaucoup de superflu, et un réglage ultérieur se résumera à le filtrer.


Tout d'abord, désactivez hddtemp, qui ne fonctionne pas correctement en raison de caractères non ASCII dans le nom SSD.
Après avoir corrigé le fichier hddtemp, les messages ont cessé de venir:


/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 

Ensuite, il est possible de voir ce que Logcheck dit bloquer le trafic de diffusion par le pare-feu:


 [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 

Par conséquent, vous devez activer le trafic de diffusion à partir du routeur et des conteneurs:


  • Port 35622 du conteneur avec urbackup.
  • Le port 5678 du routeur est la découverte du voisin RouterOS. Il peut être désactivé sur le routeur.
  • Le port 5353 pour l'adresse 224.0.0.251 est mDNS .

Vérifier le logcheck:


 sudo -u logcheck logcheck -t -d 

Enfin, les problèmes deviennent visibles:


 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 

Il s'avère que SAMBA ne démarre pas. En effet, l'analyse a montré que je l'ai déguisé via systemctl, et OMV essayait de le démarrer.


Logcheck continuera de spammer avec divers messages.
Ici, par exemple, zfs-auto-snapshot est passé:


 Oct 21 22:00:57 nas zfs-auto-snap: @zfs-auto-snap_frequent-2018-10-21-1900, 16 created, 16 destroyed, 0 warnings. 

Pour ignorer:


/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 est également ignoré:


/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:]]+$ 

De plus, il est conseillé de supprimer zed s'il n'est toujours pas supprimé:


/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]+\]: .*$ 

Eh bien et ainsi de suite. Beaucoup de gens pensent que logcheck est un utilitaire assez inutile.
Cela est vrai si vous l'utilisez comme quelque chose que vous définissez et oubliez.


Néanmoins, si vous comprenez que logcheck n'est qu'un filtre de journal personnalisé, sans heuristique, magie et algorithmes adaptatifs, la question de sa nécessité ne se pose pas. Itérativement, en analysant ce qu'il envoie et, soit en l'ajoutant pour l'ignorer, soit en le corrigeant, il est progressivement possible d'obtenir des rapports informatifs.


L'utilisation d'un outil automatisé pour l'analyse est beaucoup mieux que d'exécuter les journaux via les mêmes expressions régulières avec vos mains, et souvent mieux que d'utiliser un système d'analyse de données complet comme Splunk.


Logcheck et sa configuration peuvent être lus sur le Wiki Gentoo et ici .


IDS au niveau du nœud


Je me référerai ici à mon propre article "Une brève analyse des solutions dans le domaine du SOC et le développement d'un détecteur d'anomalie de réseau neuronal dans les réseaux de transmission de données" , dans lequel il existe plusieurs exemples.


Vous pouvez lire un examen et une comparaison plus complets d'IDS similaires sur le Wiki .


STIG-4


Un script complexe et volumineux pour l'analyse statique des lacunes connues de RedHat.
Il y a son port dans Debian , que je recommande de télécharger et de lancer au moins une fois.


Exemple de fonctionnement STIG-4
 # 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 

Le processus de travail avec ce script est approximativement le suivant:


  • Débarrassez-vous du script.
  • Recherchez sur Internet chaque ligne avec [ FAIL ] .
  • En règle générale, un lien vers la base de données en ligne STIG sera trouvé.
  • Corrigez, en suivant les instructions de la base de données, en faisant une remise sur le fait qu'il s'agit de Debian.
  • Exécutez à nouveau le script.

Rkhunter


Trop de choses ont été écrites sur RkHunter .
Utilisé depuis longtemps, largement, toujours en développement. Il existe un référentiel Debian.


Tiger


Un script shell modulaire qui effectue un audit système et une détection d'intrusion.
Il est quelque peu similaire à STIG-4.
Il peut utiliser des utilitaires tiers pour analyser les journaux, pour détecter les violations de somme de contrôle.


Se compose d'un grand nombre de modules différents.


Par exemple, il existe un module qui détecte les services qui utilisent des fichiers supprimés, ce qui se produit lorsque les bibliothèques utilisées par le service ont été modifiées au cours du processus de mise à niveau du système, mais le service n'a pas été redémarré pour une raison quelconque.


Il existe des modules pour rechercher les utilisateurs de services qui ne sont plus utilisés, vérifier le système pour l'absence de correctifs de sécurité, vérifier umask, etc.


Plus de détails chez l'homme .


Il ne se développe pas depuis 10 ans (oui, je ne suis pas le seul à abandonner les logiciels).


Samhain


HIDS typiques qui peuvent:


  • Vérifiez l'intégrité de l'ensemble du système par des hachages cryptographiques.
  • Recherchez divers exécutables avec le SUID installé, qui ne doivent pas être installés.
  • Détectez les processus cachés.
  • Signer les journaux et les bases de données.

De plus, il a une surveillance centralisée avec une interface Web et l'envoi centralisé de journaux au serveur.
, .
.


, , . , , , , .


- HIDS: .
Samhain, .


Tripwire


, Samhain, Tripwire — .
, .


Lynis


RkHunter .


, .
.
Tiger , , .
, . , , Lynix Tripwire.


Chkrootkit


. .
:


  • , .
  • .
  • , latslog, wtmp utmp.
  • , , .

.


Ninja


Linux.


ninja-build.


, . UID/GID, Ninja , , (, , ).
(, su).
, .


Ubuntu , Debian.



. . , , , .
Nmap W3af Web-.



Linux ( ) .
. , .


, , , .


" Linux" IBM .


NAS , AppArmor.
, , .
, , , .


Access Control Lists


, .
, ZFS .


ACL ZFS.
  • Autorisation d'ajouter un nouveau fichier au répertoire.
  • Autorisation de créer un sous-répertoire dans un répertoire.
  • Autorisation de supprimer un fichier.
  • Autorisation de supprimer un fichier ou un répertoire dans un répertoire.
  • Autorisation d'exécuter un fichier ou de rechercher le contenu d'un répertoire.
  • Autorisation de répertorier le contenu du répertoire.
  • Autorisation de lecture des ACL (commande ls).
  • Permission de lire les attributs de fichier de base (autres que les ACL, les attributs au niveau de la commande "stat").
  • Autorisation de lire le contenu du fichier.
  • Autorisation de lire les attributs de fichier étendus ou de rechercher dans le répertoire des attributs de fichier étendus.
  • .
  • .
  • , , .
  • ACL chmod.
  • . chown chgrp .
  • , . PRIV_FILE_CHOWN.
  • ACL .
  • ACL .
  • ACL , , . ACL file_inherit, dir_inherit .
  • ACL , .

ACL , , , . .


EXT , ZFS ACL setfacl/getfacl , chmod ls .


AppArmor



.


, , 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, .


SELinux


Architecture SELinux


.
NSA , Debian .


SELinux " " (type enforcement).


, , , SELinux . "".


, , firefox_t .
SELinux , .


Un exemple:


 allow firefox_t user_home_t : file { read write }; 

, , firefox_t , , user_home_t .


Un exemple:


 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 .


GrSecurity


Debian - . , , .
, ( ), — Gentoo . : hardening .


, .


Debian , GrSecurity PaX.


Tomoyo


Tomoyo Debian .


. AppArmor, . 2003 .
, , .
, AppArmor, .



/etc/securetty , root ( ), .


PAM, /etc/security .


, Samhain Tripwire, debsums , .


Conclusion


. , .


, Github , .

Source: https://habr.com/ru/post/fr421279/


All Articles