Software de seguridad adicional para NAS


La serie de artículos se titula Creación de un NAS seguro . Por lo tanto, este artículo considerará aumentar el nivel de seguridad. Además, se describirán aquellas herramientas que no he usado, pero que es posible aplicar.


Quien y como


¿Quién va a atacar el sistema y cómo lo hará?


Esta suele ser la primera pregunta que debe responderse antes de hablar de seguridad.
Al menos en el caso de NAS, dicha respuesta ya está implícita. Pero para responder completamente a esta pregunta, se están construyendo un modelo de amenaza y un modelo de intrusos.


Las empresas se están embarcando en una fase de modelado de amenazas en sus ciclos de desarrollo.
Microsoft tiene un SDL para esto, las personas tienen otros modelos .


Implican el uso de ciertas técnicas, como STRIDE o DREAD (STRIDE es aún más general y está bien soportado instrumentalmente).


En STRIDE, por ejemplo, un modelo se basa en flujos de datos y generalmente es grande, pesado y poco entendido. Sin embargo, la herramienta proporciona una lista de posibles amenazas, lo que facilita su consideración.


El modelo de amenaza es información clasificada porque facilita que un atacante analice el sistema y encuentre debilidades. Si recibe un modelo, no tendrá que construirlo solo, porque los analistas ya se han ocupado de todo.


Fue un minuto de publicidad.



Así es como las empresas serias construyen el modelo. Y si esto es interesante, de alguna manera puedo describirlo en un artículo separado.


Aquí describiré lo que se llama "endurecimiento" en inglés y trataré las fallas de seguridad que se hicieron durante la construcción del sistema.


Básicamente, el mantenimiento de la seguridad a este nivel se realiza mediante el cierre de vulnerabilidades conocidas del sistema, monitoreándolo y verificándolo periódicamente.


Literatura relacionada


Que leer:



Instantáneas y Docker


Anteriormente, se instaló zfs-autosnapshot. En repetidas ocasiones me ayudó, porque Podría restaurar configuraciones corruptas (para Nextcloud, por ejemplo) a partir de instantáneas.
Sin embargo, con el tiempo, el sistema comenzó a desacelerarse y se multiplicaron varios miles de instantáneas.


com.sun:auto-snapshot=false que al crear el sistema de archivos principal para contenedores, olvidé establecer el indicador com.sun:auto-snapshot=false .


En el artículo original, este problema ya se ha solucionado, aquí mostraré cómo deshacerse de las instantáneas adicionales.


Detalles sobre cómo solucionar el error.

Primero, desactive zfs-auto-snapshot en el sistema de archivos principal de la ventana acoplable:


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

Ahora elimine los contenedores e imágenes no utilizados:


 docker container prune docker image prune 

Eliminar instantáneas:


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

Y apáguelos en todos los sistemas de archivos de imagen:


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

Más detalles se pueden leer aquí .


LDAP


La última vez, solo se creó un usuario LDAP con un rol de administrador.


Pero la mayoría de los servicios no necesitan cambiar nada en la base de datos del usuario. Por lo tanto, sería bueno agregar un usuario de solo lectura. Para no crear roles manualmente, es posible usar un script de inicialización de contenedor.


Primero, agregue la configuración en docker-compose.yml para habilitar al usuario de solo lectura:


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

Archivo completo bajo el 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=" 

Luego, debe volcar y eliminar:


 $ 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 

Para evitar que el servidor se recupere de un volcado por malversación de elementos duplicados, elimine las líneas en el archivo:


 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 

Y restaurar usuarios y grupos:


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

Tal bestia aparecerá en la base de datos:


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

El contenedor creará los roles en la configuración del servidor LDAP.
Realice comprobaciones después de la recuperación y elimine la copia de seguridad:


 $ rm ~/ldap_backup.tgz 

Agregar grupos a LDAP


Es conveniente la separación de los usuarios LDAP en grupos similares a los grupos POSIX en Linux.
Por ejemplo, es posible crear grupos cuyos usuarios tendrán acceso a repositorios, acceso a la nube o acceso a la biblioteca.


Los grupos se agregan fácilmente a phpLDAPAdmin, y no me enfocaré en esto.


Solo noto lo siguiente:


  • El grupo se crea a partir de la plantilla "Predeterminada". Este no es un grupo POSIX , sino un grupo de nombres.
  • En consecuencia, el grupo tiene un atributo objectClass que incluye el valor de groupOfUniqueNames .

Agregar un grupo a phpLDAPAdmin


Docker


En Docker, casi todo se ha hecho por ti.
Por defecto, utiliza la restricción de llamadas del sistema , que se incluye en el núcleo 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 

Aquí puede leer sobre las reglas básicas de seguridad de Docker con más detalle.
Además, si AppArmor está habilitado, Docker puede integrarse con él y reenviar sus perfiles al contenedor .


Red


Eliminar el descubrimiento del sistema operativo


La red se encuentra detrás del enrutador, pero es posible hacer un curioso ejercicio cambiando algunos parámetros de la pila de red para que el sistema operativo no pueda ser identificado por las respuestas.
Hay poco beneficio real de esto, porque el atacante estudiará los banners de servicio y aún entenderá qué sistema operativo está utilizando.


Nmap muestra qué sistema operativo se está ejecutando en el dispositivo.
 # 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 

Descargue la configuración de 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 

Y entonces ...


Nmap no puede determinar el sistema operativo.
 # 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 

Estas configuraciones deben escribirse en /etc/sysctl.conf , luego, en cada reinicio, se leerán automáticamente.


/Etc/sysctl.conf completo
 ################################################################### # 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 protección contra la definición de versiones de servicio es más útil, para lo cual un atacante también puede usar Nmap:


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

El resultado no es muy bueno para el sistema.
 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 

Pero con el disfraz de los servicios, no todo es sencillo:


  • Para cada servicio, se necesita un enfoque individual aquí.
  • La capacidad de eliminar la versión no siempre está disponible.

Por ejemplo, para SSH es posible agregar la opción DebianBanner no a /etc/ssh/sshd_confg .


Como resultado:


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

Mejor, por desgracia, no funcionará: SSH usa la versión para establecer qué características son compatibles, y es posible cambiarla solo parcheando el servidor .


Golpe de puerto


No es la técnica de seguridad más conocida, ya que permite que un usuario remoto que conoce el secreto se conecte a un puerto cerrado.
El trabajo se asemeja a un bloqueo de código : todos saben que los demonios de servicio están trabajando en el servidor, pero "no están allí" hasta que se marca el código.
Por ejemplo, para conectarse a un servidor SSH, un usuario debe activar los puertos UDP 7000, TCP 7007 y UDP 7777.
Después de eso, con su IP, el firewall se iniciará en un puerto TCP cerrado 22.


Puede leer más sobre cómo funciona esto aquí . Y en el manual de Debian .


No recomiendo usar, como fail2ban suele ser suficiente.


Cortafuegos


Configuro el cortafuegos a través de la GUI web OpenMediaVault, que te recomiendo.



Abra los puertos necesarios, como 443 y 22, el resto al gusto. También es aconsejable habilitar el registro de paquetes descartados.


Ssh


Si SSH se bloquea en el puerto 22, que está abierto a Internet, recibirá muchos mensajes interesantes ...
 # 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 

A riesgo de parecer trivial, todavía recuerdo que es obligatorio:


  • Prohibir estrictamente el inicio de sesión raíz.
  • Limite el inicio de sesión solo a los usuarios especificados.
  • Cambiar el puerto a no estándar.
  • Es recomendable deshabilitar la autenticación de contraseña, dejando solo la clave.

Leer más es posible, por ejemplo aquí .


Todo esto se hace fácilmente desde la interfaz OpenMediaVault a través del menú "Servicios -> SSH".
Excepto que no cambié el puerto a no estándar, dejando 22 en la red local y simplemente reemplazando el puerto en el enrutador NAT.


Aquí hay una lista interesante de cuentas que intenté compilar, hasta que cambié el puerto SSHD a uno diferente del 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 

Una vez hecho esto, los intentos de inicio de sesión no autorizados se realizarán con mucha menos frecuencia.


Para mejorar aún más la situación, es posible bloquear a los atacantes de ciertas IP después de varios intentos de inicio de sesión.


Para qué se puede utilizar:


  • Fail2ban . Una utilidad popular que funciona no solo para SSH, sino también para muchas otras aplicaciones.
  • Denyhosts Parece que fail2ban.
  • Sshguard , si lo desea, puede intentar usarlo, pero no me interesó en detalle.

Estoy usando fail2ban. Supervisará los registros en busca de varias acciones indeseables por parte de ciertas IP, y las prohibirá si se excede el número de respuestas:


/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 

Se prohíbe agregar una regla de firewall. Después de un tiempo especificado, la regla se elimina y el usuario puede volver a intentar iniciar sesión.


Inicialmente, solo SSH está activado, pero es posible habilitar el control de los registros del servidor web y otros servicios, al menos el mismo OMV .
Y también, saque los registros de los contenedores y establezca fail2ban en ellos también.


Recomiendo agregar servicios al gusto.
Puede leer más sobre la configuración, por ejemplo, aquí o en el Wiki nativo .


Registros


Lwatch


Una pequeña utilidad que debe instalarse para mayor comodidad. Destacará los registros y los mostrará en una forma hermosa.
Es posible utilizar cualquier utilidad de este tipo , lo principal es que los errores y las áreas problemáticas de los registros se resaltan para facilitar su análisis visual.


Logcheck


Vale la pena instalar y configurar logcheck simplemente para que cuando identifique problemas de configuración que se informan en los registros, lo vea inmediatamente en el correo.
Ayuda mucho ver lo que va mal, aunque requiere ajuste.


Instalación:


 # apt-get install logcheck 

Inmediatamente después de la instalación, enviará informes.


Informe de ejemplo.
 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 

Se puede ver que hay muchas cosas superfluas, y una mayor afinación se reducirá al filtrado.


Primero, apague hddtemp, que no funciona correctamente debido a caracteres no ASCII en el nombre de SSD.
Después de arreglar el archivo hddtemp, los mensajes dejaron de llegar:


/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 

Entonces, es posible ver lo que dice logcheck está bloqueando el tráfico de transmisión por el firewall:


 [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 

Por lo tanto, debe habilitar el tráfico de difusión desde el enrutador y los contenedores:


  • Puerto 35622 desde el contenedor con urbackup.
  • El puerto 5678 del enrutador es el descubrimiento de vecino RouterOS. Se puede deshabilitar en el enrutador.
  • El puerto 5353 para abordar 224.0.0.251 es mDNS .

Comprobar logcheck:


 sudo -u logcheck logcheck -t -d 

Finalmente, los problemas se hacen 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 

Resulta que SAMBA no se inicia. De hecho, el análisis mostró que lo disfrazé a través de systemctl, y OMV estaba tratando de iniciarlo.


Logcheck seguirá siendo spam con varios mensajes.
Aquí, por ejemplo, se pasó zfs-auto-snapshot:


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

Para ignorar:


/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 también está en ignorar:


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

Además, es aconsejable eliminar zed si aún no se elimina:


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

Bueno y así sucesivamente. Mucha gente piensa que logcheck es una utilidad bastante inútil.
Esto es cierto si lo usa como algo que configura y olvida.


Sin embargo, si comprende que logcheck es solo un filtro de registro personalizado, sin algoritmos heurísticos, mágicos y adaptativos, no surge la cuestión de su necesidad. Iterativamente, analizando lo que envía y, ya sea agregándolo para ignorarlo o corrigiéndolo, es gradualmente posible obtener informes informativos.


Usar una herramienta automatizada para el análisis es mucho mejor que ejecutar los registros a través de las mismas expresiones regulares con las manos, y a menudo es mejor que usar un sistema completo de análisis de datos como Splunk.


Logcheck y su configuración se pueden leer en Wiki Gentoo y aquí .


IDS de nivel de nodo


Aquí me referiré a mi propio artículo "Un breve análisis de soluciones en el campo de SOC y el desarrollo de un detector de anomalías de redes neuronales en redes de transmisión de datos" , en el que hay varios ejemplos.


Puede leer una revisión más completa y una comparación de IDS similares en la Wiki .


STIG-4


Un script complejo y grande para el análisis estático de brechas conocidas de RedHat.
Existe su puerto en Debian , que recomiendo descargar y ejecutar al menos una vez.


Ejemplo de operación 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 

El proceso de trabajar con este script es aproximadamente el siguiente:


  • Deshazte del guión.
  • Busque en Internet todas las líneas con [ FAIL ] .
  • Como regla general, se encontrará un enlace a la base de datos en línea de STIG.
  • Correcto, siguiendo las instrucciones en la base de datos, haciendo un descuento en el hecho de que es Debian.
  • Ejecute el script nuevamente.

Rkhunter


Se ha escrito demasiado sobre RkHunter .
Usado durante mucho tiempo, ampliamente, aún en desarrollo. Hay un repositorio de Debian.


Tigre


Un script de shell modular que realiza la auditoría del sistema y la detección de intrusos.
Es algo similar a STIG-4.
Puede utilizar utilidades de terceros para analizar registros y detectar infracciones de suma de verificación.


Consiste en una gran cantidad de módulos diferentes.


Por ejemplo, hay un módulo que detecta servicios que usan archivos eliminados, lo que sucede cuando las bibliotecas utilizadas por el servicio se cambiaron durante el proceso de actualización del sistema, pero el servicio no se reinició por alguna razón.


Hay módulos para buscar usuarios de servicios que ya no se usan, verificar el sistema por falta de parches de seguridad, verificar umask, etc.


Más detalles en el hombre .


No se ha desarrollado durante 10 años (sí, no soy el único en abandonar el software).


Samhain


HIDS típicos que pueden:


  • Verifique la integridad de todo el sistema mediante hashes criptográficos.
  • Busque varios ejecutables con el SUID instalado, que no debe instalarse.
  • Detectar procesos ocultos.
  • Firmar registros y bases de datos.

Además, tiene monitoreo centralizado con una interfaz web y envío centralizado de registros al servidor.
, .
.


, , . , , , , .


- 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.
  • Permiso para agregar un nuevo archivo al directorio.
  • Permiso para crear un subdirectorio en un directorio.
  • Permiso para eliminar un archivo.
  • Permiso para eliminar un archivo o directorio dentro de un directorio.
  • Permiso para ejecutar un archivo o buscar el contenido de un directorio.
  • Permiso para enumerar los contenidos del directorio.
  • Permiso para leer ACL (comando ls).
  • Permiso para leer los atributos básicos del archivo (que no sean ACL, atributos en el nivel de comando "stat").
  • Permiso para leer el contenido del archivo.
  • Permiso para leer atributos de archivos extendidos o buscar en el directorio atributos de archivos extendidos.
  • .
  • .
  • , , .
  • 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


Arquitectura SELinux


.
NSA , Debian .


SELinux " " (type enforcement).


, , , SELinux . "".


, , firefox_t .
SELinux , .


Un ejemplo:


 allow firefox_t user_home_t : file { read write }; 

, , firefox_t , , user_home_t .


Un ejemplo:


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


Conclusión


. , .


, Github , .

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


All Articles