Capítulo 4. Autenticación y controles de acceso

Tabla de contenidos

4.1. Acreditación normal de Unix
4.2. Gestionando información de cuentas y contraseñas
4.3. Buenas contraseñas
4.4. Creando una contraseña cifrada
4.5. PAM y NSS
4.5.1. Archivos de configuración utilizados por PAM y NSS
4.5.2. La actual gestión centralizada de sistemas
4.5.3. «Razones por las que GNU no tienen la funcionalidad del grupo wheel«
4.5.4. Regla estricta para contraseñas
4.6. Acreditación de seguridad
4.6.1. Contraseñas seguras en Internet
4.6.2. «Secure Shell«
4.6.3. Medidas extraordinarias de seguridad en Internet
4.6.4. Asegurando la contraseña de root
4.7. Otros controles de acceso
4.7.1. Listas de control de acceso (ACL)
4.7.2. sudo
4.7.3. PolicyKit
4.7.4. Restricción de acceso a algunos servicios del servidor
4.7.5. Características de seguridad de Linux

Cuando una persona (o programa) necesita acceso al sistema, la acreditación confirma que la identidad es confiable.

[Aviso] Aviso

Una configuración errónea de PAM puede bloquearlo en su propio sistema. Debe tener un CD de rescate a mano o configurar una partición de arranque alternativa. Para recuperarlo inicie el sistema con uno de estos y corrija los errores cometidos.

La autenticación Unix normal la proporciona el módulo pam_unix(8) bajo PAM (Módulos de autenticación conectables). Sus 3 archivos de configuración importantes, con entradas separadas ":", son los siguientes.


"/etc/passwd" contiene lo siguiente.

 ...
user1:x:1000:1000:User1 Name,,,:/home/user1:/bin/bash
user2:x:1001:1001:User2 Name,,,:/home/user2:/bin/bash
 ...

Como se explica en contraseña(5), cada entrada separada ":" de este archivo significa lo siguiente.

  • Nombre de acceso

  • Entrada de especificación de contraseña

  • ID de usuario numérico

  • ID numérico de grupo

  • Nombre de usuario o comentario

  • Directorio raíz del usuario

  • Intérprete de órdenes opcional de usuario

La segunda entrada de «/etc/passwd» se usaba para guardar la contraseña cifrada. Después de la introducción de «/etc/shadow», esta entrada se usa para especificar la entrada de la contraseña.


"/etc/shadow" contiene lo siguiente.

 ...
user1:$1$Xop0FYH9$IfxyQwBe9b8tiyIkt2P4F/:13262:0:99999:7:::
user2:$1$vXGZLVbS$ElyErNf/agUDsm1DehJMS/:13261:0:99999:7:::
 ...

Como se explica en shadow(5), cada entrada separada ":" de este archivo significa lo siguiente.

  • Nombre de acceso

  • Contraseña cifrada (El «$1$» inicial indica el uso del cifrado MD5. El carácter "*" indica sin acceso a la cuenta.)

  • Fecha del último cambio de contraseña, expresado en el número de días desde el 1 de Enero de 1970

  • Número de días que el usuario tiene que esperar antes de que se le permita cambiar la contraseña de nuevo

  • Número de días después del cual el usuario puede cambiar su contraseña

  • Número de días antes de que la contraseña deje de ser válida durante los cuales se avisará al usuario de ello

  • Número de días después de que una contraseña ha dejado de ser válida en los cuales la contraseña todavía será aceptada

  • Fecha de expiración de la cuenta, expresada en el número de días desde 1 de Enero de 1970

"/etc/group" contiene lo siguiente.

group1:x:20:user1,user2

Como se explica en grupos(5), cada entrada separada ":" de este archivo significa lo siguiente.

  • Nombre del grupo

  • Contraseña cifrada (no usado)

  • ID numérico de grupo

  • relación de los nombres de usuario separados por ","

[Nota] Nota

«/etc/gshadow» aporta la misma funcionalidad que «/etc/shadow» para «/etc/group» pero no se usa en realidad.

[Nota] Nota

La pertenencia real a un grupo por parte de un usuario puede ser añadido de forma dinámica si la línea «auth optional pam_group.so» esta añadida en «/etc/pam.d/common-auth» y activada en «/etc/security/group.conf». Ver pam_group(8).

[Nota] Nota

El paquete base-passwd contiene una relación de acreditaciones de usuarios y grupos: «/usr/share/doc/base-passwd/users-and-groups.html».

Aquí están algunas órdenes relevantes para la gestión de información de cuentas.


Puede necesitar privilegios de superusuario para que funcionen alguna operación. Ver crypt(3) sobre el cifrado de la contraseña y datos.

[Nota] Nota

En un sistema configurado con PAM y NSS como el equipo Debian salsa, el contenido local de «/etc/passwd», «/etc/group» y «/etc/shadow» pueden no estar activados en el sistema. Incluso bajo estas circunstancias las órdenes son válidas.

Cuando se crea una cuenta durante la instalación de su sistema o con la orden passwd(1), puede elegir una buena contraseña la cual consiste al menos de 6 a 8 caracteres incluyendo uno o más caracteres de cada uno de los conjuntos siguientes de acuerdo a passwd(1).

  • letras en minúscula

  • Dígitos de 0 hasta 9

  • Signos de puntuación

[Aviso] Aviso

No elija para la contraseña palabras fáciles de adivinar. Nombre de la cuenta, número de la Seguridad Social, nombre del teléfono, dirección, fecha de nacimiento, nombre de los miembros de su familia o mascotas, palabras del diccionario, secuencias simples de caracteres como «12345« o «qwerty«, son una mala elección para la contraseña.

Existen herramientas independientes para generar contraseñas cifradas con una semilla.


Los sistemas modernos similares a Unix (como los sistemas Debian) proporcionan PAM (módulos de autenticación conectables, módulos de autenticación conectables) y NSS (Cambio de servicio de nombres, Cambio de servicio de nombres) mecanismo para administradores de sistemas locales, que les permite configurar sus propios sistemas. Sus funciones se pueden resumir en los siguientes puntos.

  • PAM ofrece mecanismos flexibles de acreditación que los usan las aplicaciones software mediante el intercambio de datos de contraseñas.

  • NSS ofrece un mecanismo de servicios de nombre flexible el cual se usa de forma habitual por la biblioteca C estándar para obtener el nombre del usuario y el grupo para programas como ls(1) e id(1).

Estos sistemas PAM y NSS necesitan configurarse de forma coherente.

Los paquetes importantes en los sistemas PAM y NSS son los siguientes.


  • Es esencial para aprender a configurar PAM «The Linux-PAM System Administrators' Guide« en libpam-doc.

  • El documento principal para aprender a configurar NSS es «System Databases and Name Service Switch« section en glibc-doc-reference.

[Nota] Nota

Puede obtener una relación más completa y actualizada mediante la orden «aptitude search 'libpam-|libnss-'». El acrónimo NSS también tiene el significado de «Servicio de Seguridad de Red (Network Security Service) que es diferente de «Intercambio del Servicio de Nombres« (Name Service Switch).

[Nota] Nota

PAM es la forma fundamental para la inicialización de las variables de entorno para cada programa con un valor diferente al que ofrece el sistema por defecto.

En systemd , se instala el paquete libpam-systemd para administrar los inicios de sesión de los usuarios registrando las sesiones de usuario en la jerarquía del grupo de control systemd para logind . Consulte systemd-logind (8), logind.conf (5) y pam_systemd (8).

Aquí están algunos de los archivos de configuración más importantes usados por PAM y NSS.


Las normas para la selección de contraseñas se desarrolla en los módulos PAM, pam_unix(8) y pam_cracklib(8). Se pueden configurar por sus parámetros.

[Sugerencia] Sugerencia

Los nombres de archivos de los módulos de PAM usan el sufijo «.so».

La gestión moderna de sistemas centralizados puede desplegarse empleando un servidor central LDAP (Protocolo Ligero de Acceso a Directorios) que administre los sistemas en la red, sean estos tipo Unix o de otro tipo. La implementación de código libre de este protocolo es el software OpenLDAP.

El servidor LDAP proporciona información de la cuenta mediante PAM y NSS con los paquetes libpam-ldap y libnss-ldap del sistema Debian. Se necesitan distintas acciones para activarlo (La siguiente configuración no está comprobada y es información totalmente secundaria. Por favor léala en este contexto).

  • Puede configurar un servidor centralizado LDAP ejecutando un programa como el demonio LDAP centralizado, slapd(8).

  • Cambie los archivos de configuración PAM en el directorio «/etc/pam.d/» para usar «pam_ldap.so» en vez de la opción por defecto «pam_unix.so».

    • Debian utiliza los archivos «/etc/pam_ldap.conf» para la configuración de libpam-ldap y «/etc/pam_ldap.secret» para archivar la contraseña de root.

  • Cambie la configuración NSS en el archivo «/etc/nsswitch.conf» para usar ldap en vez de la opción por defecto («compat» o «file»).

    • Debian utiliza el archivo «/etc/libnss-ldap.conf» para la configuración de libnss-ldap.

  • Una contraseña segura necesita que libpam-ldap use conexiones SSL (o TLS).

  • La integridad de los datos necesita que libnss-ldap utilice conexiones SSL (o TLS) con la sobrecarga de red de LDAP.

  • Debería ejecutar nscd(8) para que la caché almacene cualquier resultado de una búsqueda de LDAP con el fin de reducir el tráfico de red de LDAP.

Consulte los documentos pam_ldap.conf(5) y «/usr/share/doc/libpam-doc/html/» que contiene el paquete libpam-doc e «info libc 'Name Service Switch'» que contiene el paquete glibc-doc.

De forma parecida, se pueden instalar sistemas centralizados para otro métodos.

[Nota] Nota

La información que se facilita aquí puede no ser suficiente para la seguridad que necesita pero puede ser un buen comienzo.

Los servicios de la capa de transporte más usados usan mensajes que incluyen la acreditación mediante contraseñas en texto plano. Es una mala idea emitir contraseñas en texto plano en una red descentralizada donde se pueden interceptar. Puede ejecutar estos servicios sobre la «Capa de Transporte Segura« (TLS) o su predecesor «Secure Sockets Layer« (SSL) para asegurar por medio del cifrado todas las comunicaciones incluidas las contraseñas.


El coste de tiempo de CPU del cifrado. Como alternativa más eficiente para la CPU, se pueden mantener las comunicaciones en texto plano y securizando la contraseña con el protocolo de acreditación como «Protocolo de Acreditación de Oficina de Correos (Authenticated Post Office Protocol, APOP )« para POP y «Mecanismo de acreditación reto-respuesta MD5(Challenge-Response Authentication Mechanism MD5, CRAM-MD5)« para SMTP e IMAP. (Para el envío de mensajes de correo en Internet a su servidor de correo desde su cliente de correo, se ha vuelto usual el uso del puerto 587 para la recepción de mensajes en vez del tradicional puerto 25 SMTP para evitar el bloqueo del puerto 25 por el proveedor de red mientras se acredita con CRAM-MD5.)

El programa Secure Shell (SSH) ofrece comunicaciones cifradas seguras entre dos equipos no confiables sobre una red insegura con acreditación segura. Consiste en el cliente OpenSSH, ssh(1) y el demonio OpenSSH, sshd(8). Este SSH se puede usar para realizar un túnel de un protocolo de comunicación inseguro como es POP y asegurar X sobre Internet con la funcionalidad de reenvío de puerto (port forwarding).

El cliente intenta acreditarse a si mismo usando la acreditación basada en equipos, acreditación de clave pública, acreditación reto-respuesta, o acreditación por contraseña. El uso de acreditación por clave pública permite acceso remoto sin contraseña. Consulte Sección 6.3, “Servidor de acceso remoto (SSH) y utilidades”.

Para evitar que las personas accedan a tu máquina con privilegios de root, debes realizar las siguientes acciones.

  • Impide el acceso físico al disco duro

  • Bloquee UEFI/BIOS y evita el arranque desde los medios extraíbles

  • Asigne una contraseña a las sesiones interactivas de GRUB

  • Bloquee la edición del menú de GRUB

Si tienes acceso físico al disco duro, puedes restablecer la contraseña con relativa facilidad siguiendo los siguientes pasos.

  1. Lleve el disco duro a un ordenador que pueda configurar UEFI/BIOS para que arranque desde un CD.

  2. Arranque el sistema con un medio de rescate (disco de arranque Debiam. Knoppix CD, GRUB CD, ...).

  3. Monte la partición raíz con permisos de lectura/escritura.

  4. Edita "/etc/passwd" en la partición root y haz que la segunda entrada para la cuenta root esté vacía.

Si tienes acceso de edición a la entrada del menú del GRUB (consulta Sección 3.1.2, “Fase 2: el cargador de arranque”) para grub-rescue-pc en el momento del arranque, es aún más fácil con los siguientes pasos.

  1. Arranque el sistema con el argumento del núcleo cambiado a algo como «root=/dev/hda6 rw init=/bin/sh».

  2. Edite «/etc/passwd» y cree una segundo registro para una cuenta de root vacía.

  3. Reinicie el sistema.

El intérprete de órdenes del superusuario del sistema es accesible sin contraseña.

[Nota] Nota

Una vez que tiene acceso al intérprete de órdenes del superusuario, tiene acceso a todo en el sistema y puede cambiar cualquier contraseña del sistema. Incluso, se pueden comprometer las contraseñas de todos los usuarios por medio de herramientas de «cracking« de fuerza bruta como los paquetes john y crack packages (ver Sección 9.5.11, “Sistema de seguridad y de comprobación de la integridad”). Estas contraseñas pirateadas pueden servir para comprometer otros sistemas.

La única solución software razonable es evitar lo anterior con la utilización de software que cifra la partición raíz (o la partición «/etc») usando dm-crypt e initramfs (ver Sección 9.9, “Trucos para cifrar información”). Sin embargo, siempre necesitará la contraseña para arrancar el sistema.

Existen controles de acceso al sistema además de la autenticación basada en contraseña y los permisos de archivo.

[Nota] Nota

Ver Sección 9.4.16, “Tecla Alt-SysRq” como limitar la funcionalidad clave de atención segura (SAK) del núcleo.

Las ACL son un superconjunto de los permisos normales, como se explica en Sección 1.2.3, “Permisos del sistema de archivos”.

En los entornos de escritorio modernos, las ACL entran en acción. Cuando un dispositivo de almacenamiento USB formateado se monta automáticamente como, por ejemplo, "/media/penguin/USBSTICK", un usuario normal penguin puede ejecutarlo:

 $ cd /media/penguin
 $ ls -la
total 16
drwxr-x---+ 1 root    root    16 Jan 17 22:55 .
drwxr-xr-x  1 root    root    28 Sep 17 19:03 ..
drwxr-xr-x  1 penguin penguin 18 Jan  6 07:05 USBSTICK

"+" en la undécima columna indica que las ACL están en acción. Sin ACLs, un usuario normal pingüino no debería poder listar así ya que pingüino no está en el grupo root. Puedes ver ACLs como:

 $ getfacl .
# file: .
# owner: root
# group: root
user::rwx
user:penguin:r-x
group::---
mask::r-x
other::---

Aquí:

  • "usuario::rwx", "grupo::---" y "otro::---" corresponden a los permisos normales de propietario, grupo y otro.

  • La ACL "user:penguin:r-x" permite que un usuario normal pingüino tenga permisos "r-x". Esto permite a "ls -la" listar el contenido del directorio.

  • La ACL "mask::r-x" establece el límite superior de los permisos.

Ver "Listas de control de acceso POSIX en Linux", acl(5), getfacl(1) y setfacl(1) para más información.

sudo(8) es un programa diseñado para permitir que el administrador de sistemas conceda ciertos privilegios de superusuario a los usuarios y registre su actividad. sudo necesita únicamente la contraseña del usuario normal. Una vez instalado el paquete sudo la configuración se realiza en el archivo «/etc/sudoers». Ver una configuración de ejemplo en «/usr/share/doc/sudo/examples/sudoers» y Sección 1.1.12, “Configuración de sudo”.

En un sistema monousuario, el uso que yo realizo de sudo (verSección 1.1.12, “Configuración de sudo”) pretende evitar mi propia estupidez. Personalmente, considero el uso de sudo como la mejor alternativa al uso de la cuenta de superusuario de forma constante. Por ejemplo, lo siguiente cambia el dueño de «un_archivo» a «mi_nombre».

$ sudo chown my_name some_file

Desde luego si conoce la contraseña de «root« (como la conoce cualquier usuario que se instala Debian), cualquier orden puede ser ejecutada por «root« desde cualquier cuenta de usuario utilizando «su -c».

PolicyKit es un componente del sistema operativo con el fin de controlar los privilegios del sistema en toda su extensión para sistemas operativos tipo Unix.

Los nuevas aplicaciones de interfaz gráfico de usuario no están diseñadas para ejecutarse como procesos privilegiados. Se comunican con los procesos privilegiados a través de PolicyKit realizando de forma eficiente las operaciones administrativas.

PolicyKit restringe cada operación a cuentas de usuario que pertenecer al grupo sudo en el sistema Debian.

Ver polkit(8).

Para la seguridad del sistema, es una buena idea deshabilitar tantos programas del servidor como sea posible. Esto es crítico en servidores en red. Tener servidores sin utilidad, ejecutándose como demonios o por medio de un programa super servidor, se considera un riesgo de seguridad.

Muchos programas, como sshd(8), utilizan PAM como control de acceso. Existen muchas maneras de limitar el acceso a algunos servicios de servidor.

Ver Sección 3.5, “Gestión del sistema”, Sección 4.5.1, “Archivos de configuración utilizados por PAM y NSS”, y Sección 5.7, “Infraestructura Netfilter”.

[Sugerencia] Sugerencia

Los servicios Sun RPC necesitan estar activos para NFS y otros programas basados en RPC.

[Sugerencia] Sugerencia

Si tiene problemas de acceso remoto en sistemas Debian recientes, comente las configuraciones que lo restringen como «ALL: PARANOID« en «/etc/hosts.deny» si existe. (Pero debe tener cuidado con los riesgos de seguridad que este tipo de acciones tienen.)

El kernel de Linux ha evolucionado y admite características de seguridad que no se encuentran en las implementaciones tradicionales de UNIX.

Linux soporta atributos extendidos que amplían los atributos tradicionales de UNIX (ver xattr(7)).

Linux divide los privilegios tradicionalmente asociados con el superusuario en distintas partes, conocidas como capacidades(7), que se puede habilitar y deshabilitar de forma independiente. Las capacidades son un atributo por subproceso desde la versión 2.2 del kernel.

La infraestructura Linux Security Module (LSM proporciona un mecanismo para varias pruebas de seguridad para que sean unidas por nuevas extensiones del kernel. Por ejemplo:

Dado que estas extensiones pueden endurecer el tipo de privilegio más estricto que las políticas ordinarias de tipo de seguridad similares a las de Unix, incluso se puede restringir el poder de root. Recomendamos leer el documento marco de Linux Security Module (LSM) en kernel.org.

Linux namespaces empaqueta un recurso del sistema global en una abstracción que hace aparecer a los procesos dentro del espacio de nombres que tienen su propia instancia aislada del recurso global. Los cambios en el recurso global son visibles a otros procesos que son miembros del espacio de nombres, pero son invisibles a otros procesos. Desde el kernel 5.6, hay 8 tipos de espacios de nombres (ver namespaces(7), unshare(1), nsenter(1)).

A partir de Debian 11 Bullseye (2021), Debian utiliza jerarquía de grupos unificados (a.k.a. cgroups-v2).

Ejemplos de uso de namespaces con cgroups para aislar sus procesos y permitir el control de recursos son:

Estas funcionalidades no se pueden realizar por Sección 4.1, “Acreditación normal de Unix”. Estos temas avanzados están fuera del alcance de este documento introductorio.