¿Cómo hacer que las claves compartidas .ssh / certified_keys y sudo funcionen juntas?

15

He configurado .ssh / Authorizedkeys y puedo iniciar sesión con el nuevo "usuario" utilizando la clave pub / private ... También he agregado "user" a la lista de sudoers ... el problema que tengo ahora es cuándo Intento ejecutar un comando sudo, algo simple como:

$ sudo cd /root

me pedirá mi contraseña, que ingresé, pero no funciona (estoy usando la contraseña de clave privada que configuré)

Además, he deshabilitado la contraseña del usuario usando

$ passwd -l user

¿Qué me estoy perdiendo?

En algún lugar mis comentarios iniciales están siendo mal entendidos ...

Estoy tratando de fortalecer mi sistema ... el objetivo final es usar claves pub / privadas para hacer inicios de sesión en lugar de la autenticación de contraseña simple. He descubierto cómo configurar todo eso a través del archivo autorizado_claves.

Además, en última instancia, evitaré los inicios de sesión del servidor a través de la cuenta raíz. Pero antes de hacerlo, necesito que sudo funcione para un segundo usuario (el usuario con el que iniciaré sesión en el sistema todo el tiempo).

Para este segundo usuario, quiero evitar los inicios de sesión de contraseña regulares y forzar solo los inicios de sesión de pub / clave privada, si no bloqueo al usuario a través de "passwd -l user ... entonces si no uso una clave, aún puedo Entrar en el servidor con una contraseña normal.

Pero lo más importante es que necesito hacer que sudo funcione con una configuración de clave privada / pub con un usuario que tiene su contraseña deshabilitada.


Editar: OK, creo que lo tengo (la solución):

1) Ajusté / etc / ssh / sshd_config y configuré PasswordAuthentication no Esto evitará los inicios de sesión de contraseña ssh (asegúrese de tener una configuración de clave pública / privada que funcione antes de hacer esto

2) Ajusté la lista de sudoers visudoy agregué

root      ALL=(ALL) ALL
dimas     ALL=(ALL) NOPASSWD: ALL

3) root es la única cuenta de usuario que tendrá una contraseña, estoy probando con dos cuentas de usuario "dimas" y "sherry" que no tienen una contraseña establecida (las contraseñas están en blanco passwd -d user)

Lo anterior esencialmente evita que todos inicien sesión en el sistema con contraseñas (se debe configurar una clave pública / privada).

Además, los usuarios en la lista de sudoers tienen habilidades administrativas. También pueden sua diferentes cuentas. Así que, básicamente, "dimas" puede sudo su sherry, sin embargo, "dimas NO puede hacerlo su sherry. Del mismo modo, cualquier usuario que NO esté en la lista de sudoers NO puede hacer su usero sudo su user.

NOTA: Lo anterior funciona, pero se considera poca seguridad. Cualquier script que pueda acceder al código como los usuarios "dimas" o "sherry" podrá ejecutar sudo para obtener acceso root. Un error en ssh que permite a los usuarios remotos iniciar sesión a pesar de la configuración, una ejecución remota de código en algo como Firefox, o cualquier otra falla que permita que se ejecute código no deseado, ya que el usuario ahora podrá ejecutarlo como root. Sudo siempre debe requerir una contraseña o también puede iniciar sesión como root en lugar de algún otro usuario.

farinspace
fuente

Respuestas:

10

sshy sudono tienen nada que ver el uno con el otro. Configurar un sshmétodo de autenticación no va a hacer nada sudo. sudono va a entender una sshcontraseña

passwd -lestá destinado a bloquear la cuenta de un usuario, de modo que ya no pueda autenticarse por contraseña. Eso es casi lo contrario de lo que quieres, lo que permite que el usuario se autentique sin una contraseña.

Creo que lo que quieres es la NOPASSWDopción en tu sudoersarchivo .

(PD, no hay ninguna razón para ejecutar un cdcomando con sudo. cdNo se propaga a los procesos principales, por lo que tan pronto como sudosalga, volverá a donde comenzó).

Editar: sigue diciendo que desea bloquear la contraseña de la cuenta y que sudo entienda las claves públicas / privadas. Lo sentimos, sudo no va a usar claves ssh. No es ssh Si no desea que los usuarios puedan iniciar sesión con sus contraseñas, creo que la respuesta es deshabilitar la autenticación de contraseña ssh , no bloquear la cuenta. Luego, puede conservar una contraseña para los usuarios, que pueden usar para sudo después de iniciar sesión a través de ssh Authorizedkeys.

asesino
fuente
ok, pero ¿el hecho de que el usuario no tenga contraseña a través de: passwd -l user ... hace que el comando sudo no funcione?
farinspace
@farinspace Sí, entiendo mejor la pregunta y he ampliado considerablemente mis comentarios. passwd -lelimina la contraseña en el sentido de que la cuenta está BLOQUEADA, es decir, ninguna contraseña funcionará. Desea desactivar la autenticación de contraseña en sudo.
coneslayer
¿Cómo es esta lógica? Desactivar la contraseña en el archivo sudoers aún sería seguro, ya que el sistema se fortalece a través de los inicios de sesión de pub / clave privada ... y nuevamente solo el administrador podría agregar usuarios a la lista de sudoers
farinspace
cuando se usa una clave privada, es típico establecer una contraseña para ella, o es lo suficientemente segura como para simplemente no tenerla establecida y omitir cualquier entrada de contraseña en el inicio de sesión del servidor
farinspace
44
@coneslayer esta respuesta no es 100% precisa. Como puede ver a continuación, sudo se puede configurar para respetar la autenticación ssh.
Andre de Miranda
18

Lo que desea hacer es posible, pero requerirá algo de experiencia, ya que tendrá que compilar un módulo PAM llamado pam-ssh-agent-auth .

El proceso es razonablemente simple:

$ sudo aptitude install libssl-dev libpam0g-dev build-essential checkinstall
$ wget "http://downloads.sourceforge.net/project/pamsshagentauth/pam_ssh_agent_auth/v0.9.3/pam_ssh_agent_auth-0.9.3.tar.bz2"
$ tar -xjvf pam_ssh_agent_auth-0.9.3.tar.bz2
$ cd pam_ssh_agent_auth-0.9.3

$ ./configure --libexecdir=/lib/security --with-mantype=man

$ make
$ sudo checkinstall

Editar la configuración de sudo:

$ sudo visudo

Agregue lo siguiente:

Defaults env_keep += SSH_AUTH_SOCK

Continúe cambiando la configuración de sudo PAM:

$ sudo vi /etc/pam.d/sudo

Añadir (justo encima de las líneas @include):

**auth [success=2 default=ignore] pam_ssh_agent_auth.so file=~/.ssh/authorized_keys**
@include common-auth
@include common-account
Andre de Miranda
fuente
44
Esta debería ser la respuesta aceptada
Christopher Monsanto
1
Estas instrucciones (particularmente las /etc/pam.d/sudoinstrucciones) no están actualizadas para las versiones actuales de Ubuntu. He proporcionado instrucciones actualizadas en mi respuesta.
Chris Pick
4

La respuesta de Andre de Miranda proporciona una buena solución usando pam_ssh_agent_auth , pero las partes están desactualizadas. Particularmente las /etc/pam.d/sudoinstrucciones cuando se usan muchas versiones actuales de Linux.

Si está ejecutando Ubuntu 12.04 con precisión, en realidad he simplificado el proceso al proporcionar una compilación pam_ssh_agent_auth a partir de una ppa: ppa: cpick / pam-ssh-agent-auth .

Puede instalar el paquete ejecutando:

sudo add-apt-repository ppa:cpick/pam-ssh-agent-auth
sudo apt-get install pam-ssh-agent-auth

Después de la instalación, si desea utilizar este módulo PAM con sudo, tendrá que configurar los ajustes de sudo y la configuración PAM, en Ubuntu 12.04 preciso puede hacerlo creando los siguientes dos archivos:

/etc/sudoers.d/pam-ssh-agent-auth:

Defaults    env_keep+="SSH_AUTH_SOCK"

/etc/pam.d/sudo:

ent#%PAM-1.0

auth       required   pam_env.so readenv=1 user_readenv=0
auth       required   pam_env.so readenv=1 envfile=/etc/default/locale user_readenv=0
auth       sufficient pam_ssh_agent_auth.so file=/etc/security/authorized_keys
@include common-auth
@include common-account
@include common-session-noninteractive

Si usa chef, el proceso anterior se puede automatizar con mi libro de cocina, que se encuentra en cualquiera de las dos ubicaciones siguientes:
https://github.com/cpick/pam-ssh-agent-auth
http: //community.opscode .com / libros de cocina / pam-ssh-agent-auth .

El filesdirectorio del libro de cocina contiene los archivos /etc/pam.d/sudoy /etc/sudoers.d/pam-ssh-agent-authdescritos anteriormente que funcionan con Ubuntu 12.04 precisa y debería ser un punto de partida útil cuando se usan otras versiones / distribuciones.

Chris Pick
fuente
-1

La única forma en que sé evitar ingresar una contraseña es deshabilitándola en su sudoersarchivo.

Algo como esto dará rooty todos los miembros de acceso wheel completo sin contraseña:

root    ALL=(ALL)   NOPASSWD: ALL
%wheel  ALL=(ALL)   NOPASSWD: ALL

Esto es absolutamente no se recomienda , sin embargo. Si tiene un comando específico para que se ejecute este servidor, deles acceso solo a ese comando. O mejor aún, encuentre una forma diferente de lograr lo que quiere hacer que no requiera perforar un agujero de seguridad.

Jack M.
fuente
No me importa usar la contraseña, el problema parece ser después de deshabilitar la contraseña de usuario a través de: passwd -l user ... Todavía puedo iniciar sesión en el sistema a través de la clave pub / private (la clave privada tiene una contraseña segura) , cuando hago un sudo, me pide una contraseña, pero esta no es la contraseña de la clave privada que parece, ¿dónde se establece esta contraseña si la he desactivado para el usuario? (Prefiero evitar mantener una contraseña en el sistema y en la clave privada)
farinspace
"¿Dónde se establece esta contraseña si la he desactivado para el usuario?" En ninguna parte. No hay una contraseña que pueda escribir que funcione, porque ha bloqueado la cuenta.
coneslayer
Tendría que volver a habilitar la cuenta en el sistema remoto y luego establecer la contraseña. De cualquier manera, debe mantener la contraseña en ambas máquinas. Si no es por otra razón que los inicios de sesión locales en caso de falla.
Jack M.