Debo admitir que me gustan los servidores sin contraseñas en algunos casos. Un servidor típico es vulnerable a cualquiera que tenga acceso físico a él. Entonces, en algunos casos es práctico bloquearlo físicamente y desde entonces confiar en cualquier acceso físico.
Conceptos básicos
En teoría, cuando llegue físicamente a dicho servidor, debería poder realizar tareas de administración sin contraseña simplemente escribiendo root
como inicio de sesión y no se me debe pedir una contraseña. Lo mismo puede aplicarse a las cuentas de usuario, pero en realidad no se accedería físicamente a ellas. Por lo tanto, no se necesitan contraseñas del sistema para el acceso local (ocasional).
Al acceder al servidor de forma remota, ya sea para la administración o para la cuenta de usuario, espero usar siempre una clave privada SSH. Es muy fácil configurar una clave SSH para una cuenta recién creada y, por lo tanto, no se necesitan contraseñas del sistema para el acceso remoto (regular).
# user=...
#
# useradd -m "$user"
# sudo -i -u "$user"
$ keyurl=...
$
$ mkdir -p .ssh
$ curl -o .ssh/authorized_keys "$keyurl"
La conclusión es que, en teoría, no necesitaríamos ninguna contraseña del sistema para casos de uso como ese. Entonces, la pregunta es, ¿cómo configuramos el sistema y las cuentas de usuario para que suceda de una manera consistente y segura?
Detalles de acceso local
¿Cómo nos aseguramos de que se pueda acceder localmente a la cuenta raíz sin una contraseña? No creo que podamos usarlo, passwd -d
ya que esto hará que el acceso a la raíz sea demasiado permisivo y un usuario sin privilegios podría cambiar a la raíz de forma gratuita, lo cual está mal. No podemos usarlo passwd -l
ya que nos impide iniciar sesión.
Tenga en cuenta que el acceso local se trata exclusivamente del acceso mediante el teclado local. Por lo tanto, una solución válida no debe permitir ningún cambio de usuario (ya sea usando su
o sudo
).
Detalles de acceso remoto
Hasta hace poco, la solución anterior funcionaría, pero ahora SSH comenzó a buscar cuentas de usuario bloqueadas. Probablemente no podamos usarlo passwd -d
por las mismas razones. No podemos usarlo, passwd -u
ya que solo se queja de que conduciría a lo que passwd -d
hace.
Hay una solución alternativa con contraseña ficticia para esta parte.
user=...
echo -ne "$user:`pwgen 16`\n" | chpasswd
También podría ser posible desactivar por completo la cuenta bloqueada en SSH, pero sería mejor retener el soporte de cuentas bloqueadas y simplemente poder desbloquearlas.
Notas finales
Lo que me interesa es una solución que le permita iniciar sesión en la cuenta raíz localmente y en todas las cuentas, incluida la raíz de forma remota, sin ninguna contraseña. Por otro lado, una solución no debe afectar la seguridad, excepto en formas explícitamente descritas, especialmente no permitiendo que los usuarios remotos tengan acceso a la cuenta raíz u otra cuenta de usuario. La solución debe ser lo suficientemente robusta para que no cause problemas de seguridad indirectamente.
Una respuesta aceptada y premiada puede o no describir la configuración detallada de herramientas individuales, pero debe contener los puntos clave para alcanzar los objetivos establecidos. Tenga en cuenta que esto probablemente no puede ser resuelto a través del uso convencional de herramientas como passwd
, ssh
, su
, sudo
y similares.
Más ideas después de leer las primeras respuestas.
Solo una idea: el acceso raíz local podría lograrse iniciando shells raíz en lugar de procesos de inicio de sesión. Pero todavía existe la necesidad de bloquear solo la autenticación de contraseña, no la autenticación de clave pública.
Respuestas:
Requisitos para los cuales ofreceré soluciones, como viñetas:
Los siguientes ejemplos están basados en Debian, ya que eso es lo que tengo aquí para probar. Sin embargo, no veo ninguna razón por la cual los principios no puedan aplicarse a ninguna distribución (o de hecho a cualquier derivado * ix basado en PAM).
Inicio de sesión de consola raíz sin contraseña
Creo que la forma en que abordaría esto sería aprovechar PAM y el
/etc/securetty
archivo de configuración.Como requisito previo, se debe establecer una contraseña raíz "suficientemente segura". Esto no es necesario para iniciar sesión en la consola, pero existe para que los intentos de craqueo por fuerza bruta no sean realistas. La cuenta es, por lo demás, una cuenta raíz perfectamente normal.
En
/etc/pam.d/login
Tengo el siguiente conjunto estándar de líneas para la autenticación (las que comienzan con la palabra claveauth
):El
common-auth
archivo de inclusión al que se hace referencia contiene las siguientes líneas relevantes:El
common-auth
archivo le indica a PAM que omita una regla (la denegación) si un "inicio de sesión UNIX" tiene éxito. Por lo general, esto significa una coincidencia en/etc/shadow
.La
auth ... pam_securetty.so
línea está configurada para evitar inicios de sesión de raíz, excepto en los dispositivos tty especificados en/etc/securetty
. (Este archivo ya incluye todos los dispositivos de la consola).Al modificar
auth
ligeramente esta línea, es posible definir una regla que permita un inicio de sesión raíz sin una contraseña desde un dispositivo tty especificado en/etc/securetty
. Elsuccess=ok
parámetro debe modificarse para queok
se reemplace por el número deauth
líneas que se omitirán en caso de una coincidencia exitosa. En la situación que se muestra aquí, ese número es3
, que salta a laauth ... pam_permit.so
línea:Inicio de sesión remoto root sin contraseña de usuarios preautorizados
Esta es una inclusión directa de claves ssh para aquellos usuarios autorizados que se agregan al
authorized_keys
archivo raíz .Inicio de sesión remoto sin contraseña para cuentas específicas de usuarios preautorizados
Esta es también una inclusión directa de claves ssh para usuarios autorizados que se agregan al
.ssh/authorized_keys
archivo del usuario correspondiente y correspondiente . (El usuario remoto típico chris quiere un inicio de sesión sin contraseña para el escenario chris del usuario local ).Tenga en cuenta que las cuentas pueden permanecer en el estado bloqueado predeterminado después de la creación (es decir, solo
!
en el campo de contraseña/etc/shadow
) pero permiten el inicio de sesión basado en la clave SSH. Esto requiere root para colocar la clave en el.ssh/authorized_keys
archivo del nuevo usuario . Lo que no es tan obvio es que este enfoque solo está disponible cuandoUsePAM Yes
se establece/etc/ssh/sshd_config
. PAM se diferencia!
como "cuenta bloqueada por contraseña pero se pueden permitir otros métodos de acceso" y!...
"cuenta bloqueada. Período". (SiUsePAM No
está configurado, OpenSSH considera cualquier presencia de!
inicio del campo de contraseña para representar una cuenta bloqueada).Inicio de sesión remoto sin contraseña para cualquier cuenta de usuarios autorizados previamente
No estaba del todo claro para mí si querías esta instalación o no. A saber, ciertos usuarios autorizados podrían iniciar sesión ssh sin una contraseña para cualquier cuenta local.
No puedo probar este escenario, pero creo que esto se puede lograr con OpenSSH 5.9 o posterior, lo que permite
authorized_keys
definir múltiples archivos/etc/ssh/sshd_config
. Edite el archivo de configuración para incluir un segundo archivo llamado/etc/ssh/authorized_keys
. Agregue las claves públicas de los usuarios autorizados seleccionados a este archivo, asegurándose de que los permisos sean de propiedad de root y tenga acceso de escritura solo por root (0644).fuente
.ssh/authorized_keys
archivo contenga la clave pública relevante. ¿Esto ayuda?!
en el campo de contraseña en/etc/shadow
. De acuerdo con la página del manual, esto indica una cuenta válida para la cual no puede coincidir ninguna contraseña.Parece que quiere cuentas de usuario reales (no root) con claves ssh y
NOPASSWD
acceso completo a través desudo
(que está disponible de forma predeterminada en la mayoría de las distribuciones de Linux en estos días y también es trivial de instalar manualmente). Puede tener contraseñas en blanco para cada cuenta de usuario (que no funcionará de forma remota), luego el usuario se ejecutasudo -s
o~/.bash_profile
simplemente contiene ese comando.Sudo
Agregue cada usuario al
sudo
grupo UNIX (pusermod -a -G sudo USERNAME
. Ej. , Aunque los sistemas más antiguos tendrán formas menos intuitivas de hacerlo; en el peor de los casos, edita/etc/groups
directamente).En
/etc/sudoers
o/etc/sudoers.d/local
, quieres una línea como esta:Si desea acceso raíz automático, agréguelo al perfil del usuario. Pues
bash
eso sería~/.bash_profile
:Esto le permitirá ver quién ha iniciado sesión (intente
who
olast
) y dejará registros/var/log/auth.log
.Inicio de sesión sin contraseña
En sistemas mucho más antiguos, puede editar
/etc/passwd
(o en sistemas un poco más antiguos/etc/shadow
) y eliminar el hash, por lo que, por ejemplo, sebob:$1$salt$hash:12345:0:99999:7:::
vuelve justobob::12345:0:99999:7:::
. Esto era todo lo que necesitabas. A los sistemas modernos no les gusta esto. Probablemente hay otras formas de hacer esto, pero la forma que acabo de verificar es la siguiente (fuente: Cosas al azar de Leo ) :Abra
/etc/shadow
y observe una cuenta con información real. Esto incluirá tres elementos delimitados por signos de dólar ($
). Estos representan el mecanismo de hash, luego la sal , luego el hash. Tenga en cuenta la sal, luego ejecute esto:(Esto usa MD5 como mecanismo de hash. Es una contraseña en blanco, por lo que no debería importarle). Cuando se le solicite una contraseña, presione enter. Guarde esa cadena, incluidos los puntos finales, y péguela después del primer colon en la línea de ese usuario
/etc/shadow
(esto debería reemplazar cualquier contenido preexistente entre el primer y el segundo colon). (¡No lo uses literalmenteSALT
como tu sal!)SSH
Su
ssh
configuración de demonio vive en/etc/sshd_config
o/etc/ssh/sshd_config
. Para una seguridad adecuada, le recomiendo que incluya estas líneas:Consulte la escritura de Secure Secure Shell para conocer las medidas de seguridad adicionales que puede agregar a su configuración ssh para fortalecerla mejor contra los atacantes sofisticados.
Ahora sus usuarios no pueden iniciar sesión a través
ssh
de tener contraseñas vacías (esta es una medida de seguridad necesaria). Esto significa que solo pueden iniciar sesión con claves ssh.Cada usuario, para cada uno de sus sistemas cliente, debe crear un par de claves ssh, p. Ej.
Esto produce una clave privada en
$HOME/.ssh/id_rsa
y una clave pública en$HOME/.ssh/id_rsa.pub
. Haga que ese usuario le envíe sus claves públicas y las agregue a las de este servidor$HOME/.ssh/authorized_keys
(tenga en cuenta que cada usuario$HOME/.ssh
debe estar en modo 700, por ejemplomkdir -p ~user/.ssh && chmod 700 ~user/.ssh
).Los usuarios que no desean claves ssh pueden ser dirigidos al sistema físico. Allí, su contraseña en blanco los iniciará sesión, momento en el que pueden escribir
passwd
desde el shell y establecer una contraseña, lo que les permite el acceso remoto.(De hecho, utilicé esta técnica para dar a las personas acceso a una colección de sistemas cuando dirigía un departamento de TI. Obligó a los usuarios a usar claves ssh y no tuve que darles contraseñas. Sus iniciales
~/.bash_profile
tenían dos líneas en la parte inferior:passwd
y luegomv ~/.bash_profile.real ~/.bash_profile
para que establezcan una nueva contraseña en el primer inicio de sesión).Riesgos
Está depositando plena confianza en sus usuarios. No hay nada que impida que un usuario se meta con el
~/.ssh/authorized_keys
archivo de otro usuario y, por lo tanto, altere su capacidad de revocar y auditar el acceso, pero esto es inevitable si está dando acceso completo a la raíz.Conclusión
Cada usuario ahora es miembro del grupo sudo y tiene acceso completo sin contraseña a un shell raíz. Estos usuarios no tienen contraseñas para sus cuentas y pueden iniciar sesión de forma remota con las teclas ssh.
Si pierde a uno de sus empleados, puede eliminar su cuenta. Si le roban una de las computadoras portátiles de sus empleados, puede eliminar la clave ssh de esa computadora portátil del
authorized_keys
archivo de ese usuario . Si tiene una violación de seguridad, tiene registros que muestran quién inició sesión.fuente
passwd -d
en la pregunta, losu
que permite cambiar a ese usuario sin contraseña. La sección de riesgos describe dos cosas (jugar con los datos de otros usuarios y obtener acceso a la raíz) cuya eliminación es el punto central de la pregunta. Por lo tanto, aunque las secciones individuales están bien escritas, esto no es una respuesta a la pregunta.