La cuenta que nadie recordaba
Endurecer un servidor es quitarle lo que no necesita, para que haya menos que atacar. Se empieza por las cuentas, SSH y los modos de archivo.
Una tienda pequeña guardaba la cuenta de un proveedor que se fue hace un año. No pedía contraseña, y el servidor dejaba entrar a root por la red.
Nadie la atacó. Un escáner la encontró primero. Arreglarlo llevó cinco minutos, pero había que hacerlo el primer día.
Esta lección enseña a hacer ese trabajo antes de que alguien ataque.
Al final de esta lección
Nota
Puedo encontrar cuentas, ajustes de SSH y modos de archivo débiles en un servidor, y corregirlos.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Endurecimiento | quitar lo que un servidor no necesita, para que haya menos que atacar | |
| Cuenta | un nombre con el que el sistema deja entrar, con sus propios derechos | |
| Modo de archivo | tres cifras que dicen quién puede leer, escribir y ejecutar un archivo | 640 |
| Escribible por todos | un archivo que cualquier usuario de la máquina puede cambiar | |
| SSH | la herramienta que permite entrar a un servidor por la red | |
| Ajuste | una línea de un archivo de configuración: un nombre y un valor |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Lista las cuentas y pregunta quién las usa
No se puede proteger una cuenta que no se conoce. Por eso el endurecimiento empieza con una lista.
Las personas normales tienen un número de cuenta de 1000 o más, el UID. Root tiene el UID 0, y solo él debe tenerlo.
Lista las cuentas normales y su shell
awk -F: '$3 >= 1000 && $3 < 65534 {print $1, $7}' /etc/passwdSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
¿Qué cuentas tienen el UID 0?
awk -F: '$3 == 0 {print $1}' /etc/passwdSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Cómo leer las dos listas
El primer Run escribe una línea por cuenta normal: su nombre y su shell de entrada, por ejemplo /bin/bash. Pregunta en cada línea: ¿alguien aún la necesita?
El segundo Run escribe una sola palabra, root. Un segundo nombre sería un segundo root, y un motivo para abrir un incidente.
Un modo dice quién puede hacer qué
Cada archivo tiene un modo de tres cifras: el propietario, el grupo y todos los demás. Cada cifra suma 4 para leer, 2 para escribir y 1 para ejecutar.
La lista de cuentas es pública, así que todos pueden leerla. El archivo con los hashes de las contraseñas no debe serlo.
Una cuarta cifra delante, como el 2 de 2770, hace que lo nuevo de una carpeta herede su grupo.
Muestra el modo de dos archivos
stat -c '%a %U:%G %n' /etc/passwd /etc/shadowSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Cuenta las cuentas con contraseña vacía
sudo awk -F: '$2 == "" {print $1}' /etc/shadow | wc -lSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejemplo: qué significan cuatro modos
| Modo | Propietario | Grupo | Todos los demás |
|---|---|---|---|
| 644 | leer y escribir | leer | leer |
| 640 | leer y escribir | leer | nada |
| 2770 | leer, escribir y entrar | leer, escribir y entrar | nada |
| 777 | todo | todo | todo, así que escribible por todos |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Qué escribió el terminal
El Run de stat escribió dos líneas: 644 root:root /etc/passwd y 640 root:shadow /etc/shadow. Cualquiera puede leer la lista de cuentas. Solo root y el grupo shadow pueden leer los hashes.
El Run de conteo escribió 0. Cualquier otro número serían cuentas en las que se entra sin contraseña.
SSH: la puerta y su cerradura, los ajustes
El servidor SSH lee un archivo de ajustes. Tres de sus líneas deciden casi todo el riesgo: si root puede entrar, si se permite una contraseña, y si se permite una contraseña vacía.
Vas a practicar con una copia en tu carpeta. El archivo real nunca se toca, así que nadie queda fuera.
Escribe un archivo de práctica débil
printf 'PermitRootLogin yes\nPasswordAuthentication yes\nPermitEmptyPasswords no\n' > sshd-prueba.confSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Encuentra las dos líneas débiles
grep -E '^(PermitRootLogin|PasswordAuthentication) yes' sshd-prueba.confSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Corrige las dos con sed
sed -i 's/^PermitRootLogin yes/PermitRootLogin no/; s/^PasswordAuthentication yes/PasswordAuthentication no/' sshd-prueba.confSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Revisa el archivo otra vez
grep -E '^(PermitRootLogin|PasswordAuthentication)' sshd-prueba.confSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Por qué importa el primer valor
El primer Run del grupo encontró dos líneas. Tras la corrección, las dos dicen no. Entonces se entra con una clave, no con una contraseña, y nadie entra como root.
Una regla más: el servidor SSH usa el primer valor que encuentra para un ajuste. Una línea débil encima de una segura gana.
Mira qué línea cuenta
printf 'PermitRootLogin no\nPermitRootLogin yes\n' | grep -m1 '^PermitRootLogin'Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un error frecuente
Advertencia
Mucha gente cree que la última línea de un archivo de ajustes gana, y añade la línea segura al final. En el servidor SSH gana la primera, y la línea débil de arriba sigue vigente. Edita la línea que ya está. No añadas una segunda.
Borra el archivo de práctica
rm sshd-prueba.confSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Para ir más lejos: la carpeta del laboratorio
Cuando termines la tarea 2 del laboratorio, ejecuta ls -ld /srv/projects y stat -c '%a %U:%G %n' /srv/projects. Di en una frase quién puede entrar, y qué cifra deja fuera a todos los demás.
La comprobación del laboratorio califica el usuario, la carpeta, el trabajo de cron y el servicio. No califica esta lección. La tarea de arriba es su tarea comprobada.