Seguridad
LPI 110.1 Tareas de seguridadLPI 110.2 Seguridad del hostLPI 110.3 Cifrado de datos
Último módulo del curso. LPIC-1 no es una certificación de seguridad ofensiva — no esperes nada parecido a GhostOffensive aquí — pero sí exige que un administrador de sistemas sepa las tareas mínimas de higiene de seguridad que le corresponden: quién puede hacer qué, qué servicios están expuestos, y cómo proteger una conexión y unos datos con cifrado real.
- Revisar el sistema en busca de cuentas, permisos y procesos sospechosos.
- Limitar recursos por usuario y delegar privilegios con
sudocorrectamente. - Reducir la superficie de ataque de un host: servicios innecesarios, TCP wrappers, firewall básico.
- Usar SSH con autenticación por clave en vez de contraseña.
- Cifrar y firmar datos con GPG.
1. LPI 110.1 — Tareas de administración de seguridad
1.1 Buscar lo que no debería estar ahí
$ find / -perm -4000 -type f 2>/dev/null
/usr/bin/passwd
/usr/bin/sudo
/usr/bin/sufind -perm -4000 (binarios SUID) en el módulo 104 — aquí es donde ese comando se convierte en una tarea de seguridad real: auditar esa lista periódicamente y preguntarte si cada binario SUID de la lista tiene que estar ahí. Un SUID nuevo que no reconoces, en una ruta rara, es la señal clásica de que algo se ha instalado sin tu conocimiento.$ awk -F: '($2=="") {print $1}' /etc/shadowEse awk busca cuentas con el campo de contraseña vacío en /etc/shadow — es decir, cuentas sin contraseña que permitirían entrar sin credenciales. En un sistema sano, no debería devolver nada.
$ grep -v nologin /etc/passwd | grep -v '/bin/false'
root:x:0:0:root:/root:/bin/bash
jose:x:1001:1001:Jose Perez:/home/jose:/bin/bashÚtil para ver rápidamente qué cuentas pueden iniciar sesión de verdad, descartando las cuentas de servicio que ya bloqueaste con /usr/sbin/nologin en el módulo 107.
1.2 Límites de recursos por usuario
$ ulimit -a
core file size (blocks, -c) 0
open files (-n) 1024
max user processes (-u) 15938
stack size (Kbytes, -s) 8192ulimit fija límites para la sesión actual; para que persistan por usuario/grupo se configuran en /etc/security/limits.conf (parte de PAM, que ya trabaja por debajo de login/sudo/SSH sin que lo veas directamente):
$ cat /etc/security/limits.conf | grep -v '^#' | grep .
jose hard nproc 100
jose soft nofile 2048
@desarrollo hard core 0| Campo | Significado |
|---|---|
| Dominio | Usuario, @grupo, o * (todos) |
soft / hard | Límite blando (el usuario puede subirlo hasta el límite duro) / límite duro (techo absoluto) |
| Tipo | nproc (procesos máximos), nofile (ficheros abiertos), core (tamaño de volcados de memoria)... |
nproc por usuario es justo lo que evita que una fork bomb o un script descontrolado de un solo usuario se coma todos los procesos disponibles del sistema entero — una tarea de seguridad tan de "administración básica" como suena, y literalmente el objetivo que LPI llama "configurar límites de recursos de usuario".1.3 Delegar privilegios con sudo, no con contraseñas compartidas de root
$ visudo
# abre /etc/sudoers con bloqueo y validacion de sintaxis antes de guardar - nunca lo edites con otro editor$ cat /etc/sudoers.d/jose
jose ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginxvisudo y no nano /etc/sudoers? Si guardas una sintaxis rota en /etc/sudoers con un editor normal, puedes dejar a todo el mundo, incluido root, sin poder usar sudo nunca más. visudo valida la sintaxis antes de escribir el fichero de verdad, y si detecta un error te da la opción de corregirlo sin aplicar el cambio roto.La línea del ejemplo le da a jose permiso para reiniciar solo ese servicio concreto, sin pedir contraseña (NOPASSWD) — el principio de mínimo privilegio en la práctica: nunca ALL=(ALL) ALL si con un permiso más estrecho basta.
2. LPI 110.2 — Configurar la seguridad del host
2.1 Reducir la superficie de ataque: apagar lo que no usas
$ systemctl list-units --type=service --state=running
UNIT LOAD ACTIVE SUB DESCRIPTION
ssh.service loaded active running OpenBSD Secure Shell server
cups.service loaded active running CUPS Scheduler
bluetooth.service loaded active running Bluetooth service$ systemctl disable --now bluetooth
# lo para ahora mismo y evita que vuelva a arrancar en el proximo reiniciosystemctl disable y mask en el módulo 101 desde el punto de vista de arranque — aquí es la misma herramienta aplicada como tarea de seguridad: todo servicio en escucha que no necesitas es una puerta más que alguien podría intentar forzar. mask va un paso más allá que disable: impide incluso que otro servicio lo arranque como dependencia.2.2 TCP Wrappers: /etc/hosts.allow y /etc/hosts.deny
Un mecanismo antiguo pero que el examen todavía pregunta, para servicios compilados con soporte libwrap:
$ cat /etc/hosts.deny
ALL: ALL$ cat /etc/hosts.allow
sshd: 192.168.1.0/24
sshd: 10.0.0.5/etc/hosts.allow — si hay coincidencia, se permite y se para ahí. Si no hay coincidencia, se consulta /etc/hosts.deny — si hay coincidencia ahí, se deniega. Si no coincide en ninguno de los dos, se permite por defecto. El patrón ALL: ALL en hosts.deny combinado con reglas específicas en hosts.allow (como el ejemplo) es la forma estándar de "denegar todo salvo lo que permito explícitamente".2.3 Firewall básico: iptables/nftables y ufw
| Herramienta | Nivel |
|---|---|
nftables | El framework de filtrado de paquetes actual en el kernel, sustituto de iptables |
iptables | El framework clásico — en distros modernas, iptables suele ser en realidad una capa de compatibilidad que traduce a nftables por debajo |
ufw (Uncomplicated Firewall) | Interfaz simplificada sobre iptables/nftables, la que de verdad usa casi todo el mundo en Debian/Ubuntu en el día a día |
$ ufw status verbose
Status: active
Default: deny (incoming), allow (outgoing)
To Action From
22/tcp ALLOW Anywhere
80,443/tcp ALLOW Anywhere$ ufw allow 22/tcp
Rule added$ ufw deny from 203.0.113.50
Rule added$ ufw enable
Firewall is active and enabled on system startupPractica más — labs ya publicados en Ghost Academy sobre este tema: 🔥 UFW: firewall (guía)
3. LPI 110.3 — Asegurar datos con cifrado
3.1 SSH: la base de un acceso remoto seguro
El objetivo de examen más denso de todo el módulo. Empieza por la diferencia entre autenticarte con contraseña y con clave:
$ ssh-keygen -t ed25519 -C "jose@lpic1-lab"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/jose/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Your identification has been saved in /home/jose/.ssh/id_ed25519
Your public key has been saved in /home/jose/.ssh/id_ed25519.pub| Fichero | Qué es | ¿Se comparte? |
|---|---|---|
id_ed25519 (o id_rsa) | Clave privada | Nunca, bajo ningún concepto |
id_ed25519.pub | Clave pública | Sí — es la que copias al servidor |
~/.ssh/authorized_keys (en el servidor) | Lista de claves públicas autorizadas a entrar como ese usuario | — |
~/.ssh/known_hosts (en el cliente) | Huellas de servidores a los que ya te has conectado — detecta si la clave del servidor cambia inesperadamente (posible MITM) | — |
$ ssh-copy-id jose@servidor
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'jose@servidor'"
and check to make sure that only the key(s) you wanted were added.$ ssh jose@servidor
# ya no pide contraseña: autentica con la clave privada local contra la publica ya copiadassh-copy-id no hace magia — simplemente añade el contenido de tu .pub al final de ~/.ssh/authorized_keys en el servidor, por SSH, usando la contraseña una última vez. Puedes hacerlo a mano exactamente igual con cat y redirección si no tienes ssh-copy-id disponible.3.2 Configuración del servidor SSH
$ grep -vE '^#|^$' /etc/ssh/sshd_config
Port 22
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
X11Forwarding yes| Directiva | Efecto |
|---|---|
Port | Puerto en el que escucha sshd — cambiarlo del 22 no es "seguridad" real, solo reduce ruido de escaneos automáticos |
PermitRootLogin no | Obliga a entrar como usuario normal y usar sudo después — práctica estándar recomendada |
PasswordAuthentication no | Desactiva login por contraseña por completo, solo admite clave — el endurecimiento más efectivo de todos una vez que ya tienes tu clave funcionando |
PubkeyAuthentication yes | Habilita la autenticación por clave pública (normalmente ya viene activada por defecto) |
X11Forwarding yes | Permite el reenvío de X11 que viste en el módulo 106 (ssh -X) |
PasswordAuthentication no y reinicias sshd. Hacerlo al revés — desactivar contraseña antes de validar la clave — es la forma más clásica de quedarte fuera de tu propio servidor.3.3 Configuración del lado cliente: ~/.ssh/config
$ cat ~/.ssh/config
Host servidor-bd
HostName 192.168.1.20
User jose
Port 2222
IdentityFile ~/.ssh/id_ed25519_bd$ ssh servidor-bd
# usa automaticamente el host, usuario, puerto y clave de la entrada de arriba3.4 GPG: cifrado y firma de datos
GPG (GNU Privacy Guard, implementación libre de OpenPGP) cifra ficheros y correo, y firma digitalmente para demostrar autoría e integridad — con el mismo par de claves pública/privada que ya conoces de SSH, pero para datos en reposo, no para una sesión interactiva.
$ gpg --full-generate-key
Please select what kind of key you want:
(1) RSA and RSA
Requested keysize is 3072 bits
Real name: Jose Perez
Email address: jose@ejemplo.com
...
public and secret key created and signed.$ gpg --list-keys
pub rsa3072 2026-10-02 [SC]
A1B2C3D4E5F6...
uid [ultimate] Jose Perez <jose@ejemplo.com>| Comando | Qué hace |
|---|---|
gpg --encrypt -r destinatario fichero | Cifra un fichero con la clave pública del destinatario — solo su clave privada puede descifrarlo |
gpg --decrypt fichero.gpg | Descifra con tu propia clave privada |
gpg --sign fichero | Firma con tu clave privada — cualquiera con tu clave pública puede verificar que el fichero es tuyo y no se ha modificado |
gpg --verify fichero.sig | Verifica una firma |
gpg --export -a correo > clave.pub | Exporta tu clave pública en formato texto, para compartirla |
gpg --import clave.pub | Importa la clave pública de otra persona para poder cifrarle/verificarla |
gpg -c fichero | Cifrado simétrico con una contraseña compartida, sin pares de claves — más simple, pero hay que compartir la contraseña por un canal aparte |
$ gpg --encrypt -r jose@ejemplo.com informe.pdf
# genera informe.pdf.gpg, cifrado con la clave publica de jose$ gpg --decrypt informe.pdf.gpg > informe.pdf
# pide la frase de paso de tu clave privada para descifrar--encrypt -r) usa un par de claves — pública para cifrar, privada para descifrar — y no requiere compartir ningún secreto de antemano. Cifrado simétrico (-c) usa la misma contraseña para cifrar y descifrar, así que esa contraseña sí hay que transmitirla de forma segura a quien deba descifrar.Práctica guiada
- En tu VM: ejecuta
find / -perm -4000 -type f 2>/dev/nully revisa que reconoces todos los binarios SUID listados. - Genera un par de claves SSH con
ssh-keygen -t ed25519y cópialas a una segunda VM (o a la misma, porlocalhost) conssh-copy-id. - Confirma que entras sin contraseña, y solo entonces pon
PasswordAuthentication noen/etc/ssh/sshd_configy reiniciasshdconsystemctl restart sshd. - Instala
ufwsi no lo tienes, activa el firewall con una regla que permita SSH (ufw allow 22/tcpantes deufw enable, para no quedarte fuera) y revisaufw status verbose. - Genera un par de claves GPG con
gpg --full-generate-key, cifra un fichero de prueba para ti mismo y descífralo. - Añade una entrada a
/etc/sudoers.d/(convisudo -f) que te dé permiso para un único comando concreto sin contraseña, y pruébala.
Resumen de comandos del módulo
| Bloque | Comandos clave |
|---|---|
| 110.1 Tareas de seguridad | find -perm -4000, ulimit, /etc/security/limits.conf, visudo, /etc/sudoers.d/ |
| 110.2 Seguridad del host | systemctl disable/mask, /etc/hosts.allow/.deny, ufw/iptables/nftables |
| 110.3 Cifrado | ssh-keygen, ssh-copy-id, sshd_config, ~/.ssh/config, gpg --encrypt/--decrypt/--sign |
Autoevaluación
- ¿Qué comando de
awkusarías para detectar cuentas con contraseña vacía en/etc/shadow? - ¿Por qué se usa siempre
visudopara editar/etc/sudoersen vez de un editor normal? - Explica el orden exacto de evaluación de
/etc/hosts.allowy/etc/hosts.deny. - ¿Qué pasos debes seguir, en orden, antes de poner
PasswordAuthentication noen un servidor SSH remoto, y por qué ese orden es tan importante? - ¿Qué fichero nunca debes compartir ni copiar a ningún servidor: la clave SSH pública o la privada?
- ¿Qué diferencia hay entre cifrado simétrico (
gpg -c) y asimétrico (gpg --encrypt -r) en cuanto a qué hay que compartir con quién?
🎓 Fin del curso
Con este módulo se completa el temario íntegro de LPIC-1 (exámenes 101-500 y 102-500): los 11 módulos de GhostLinux, de la instalación del sistema a la seguridad básica. El siguiente paso es la validación: repasa los tests temáticos y el simulador oficial de 250 preguntas en Recursos, y cuando encadenes simulacros por encima del 80% de aciertos de forma consistente, reserva el examen oficial con confianza.