Permitir usuario1 a "su - usuario2" sin contraseña

51

Necesito permitir que el usuario martincambie a usuario martin-testsin contraseña

su - martin-test

Creo que esto se puede configurar en /etc/pam.d/su. Ya hay algunas líneas en ese archivo que pueden ser descomentadas. Sin embargo, no me gusta la idea de agregar usuarios martinal grupo wheel. No quiero dar martinmás privilegios que poder cambiar martin-test. Tampoco quiero usar sudo.

¿Cuál sería la mejor manera de hacerlo, manteniendo los privilegios del usuario al martinmínimo?

Martin Vegter
fuente
2
Esto es más fácil de hacer, por sudoejemplo sudo -u martin-test -i. ¿Hay alguna razón por la que pregunte específicamente su?
jordanm
No quiero instalar sudosolo por esto (normalmente no lo uso sudoy no me gusta especialmente). Y creo que usar pames una forma más limpia y transparente de hacerlo.
Martin Vegter
3
@MartinVegter Como puede ver en la respuesta del script, hacer esto a través de algún tipo de mecanismo de pam es muy feo. Realmente esto es exactamente para lo que sudoestaba destinado. Además de no usarlo normalmente, ¿cuáles son las objeciones?
Patrick
1
Si es posible una solución limpia con pam, preferiría eso sudo. Si sudoes la única posibilidad, entonces eso también está bien. Mis objeciones sudoson principalmente ideológicas: no me gusta la idea de que el usuario administre sudo foo. Cuando necesito hacer la administración, inicio sesión como root. De lo contrario, me conecto como usuario. Estos dos roles distintos no deberían mezclarse. Además, ya tengo paminfraestructura instalada. No quiero instalar otro setuidprograma que posiblemente pueda introducir errores de seguridad.
Martin Vegter
55
@MartinVegter No tiene que hacer sudo foopara comandos específicos. Sudo tiene sudo -sque lanzará un proyectil. sudo es una utilidad muy común, lo que significa que su seguridad ha sido examinada a fondo, mucho más de lo que será un truco de pam. También diría que obtener un shell raíz para tareas es mucho más inseguro que lanzar comandos específicos. Cuando inicia un shell, ejecuta todo como root. Si alguna de esas cosas (como una simple ls) tiene una vulnerabilidad de seguridad, entonces acaba de abrir un agujero de seguridad.
Patrick

Respuestas:

61

Agregue las siguientes líneas justo debajo de la pam_rootok.solínea en su /etc/pam.d/su:

auth  [success=ignore default=1] pam_succeed_if.so user = martin-test
auth  sufficient                 pam_succeed_if.so use_uid user = martin

Estas líneas realizan comprobaciones utilizando el pam_succeed_if.somódulo. Consulte también la sintaxis del archivo de configuración Linux-PAM para obtener más información sobre las authlíneas.

  • La primera línea verifica si el usuario objetivo es martin-test. Si es así, no sucede nada ( success=ignore) y continuamos en la siguiente línea para verificar el usuario actual . Si no es así, se omitirá la siguiente línea ( default=1) y continuaremos en las líneas posteriores con los pasos de autenticación habituales.
  • La segunda línea verifica si el usuario actual es martin. Si es así, el sistema considera que el proceso de autenticación es exitoso y devuelve ( sufficient). Si no es así, no pasa nada y continuamos en las líneas posteriores con los pasos de autenticación habituales.

También puede restringir sua un grupo, aquí el grupo allowedpeoplepuede susin una contraseña:

auth sufficient pam_succeed_if.so use_uid user ingroup allowedpeople
GnP
fuente
1
Si desea autorizar si están en un grupo determinado: aumente la cantidad de pam_succeed_if.so usuario ingroup GROUP
shrimpwagon del
@gnp Super gracias !! Trabajando en iCinga con nrpe, ¡tengo que ejecutar algún comando como usuario diferente! Ayudó mucho !!!!!! ¡¡¡¡¡Gracias!!!!!
saravanakumar
@GnP Por favor, ayúdame en askubuntu.com/questions/821793/…
Nullpointer
Sería bueno agregar información sobre cómo aplicar los cambios también.
Kyslik
@Kyslik, ¿qué quieres decir? Las instrucciones sobre cómo editar los archivos necesarios están en la respuesta ...
GnP
12

Si no desea cambiar grupos o usar sudo, use un módulo pam llamado pam_execpara ejecutar scripts externos en una etapa pam.

Agregue una línea /etc/pam.d/sudespués de la pam_rootok.solínea:

auth       sufficient pam_exec.so quiet /path/to/script

/path/to/script tiene los permisos 755 (rwxr-xr-x) y el siguiente contenido:

#!/bin/bash
if [ "$PAM_TYPE" == "auth" ] && \
[ "$PAM_USER" == "martin-test" ] && \
[ "$PAM_RUSER" == "martin" ]; then
  exit 0
else
  exit 1
fi

Entonces este script existe con éxito si su:

  • se llama en contexto de autenticación,
  • el usuario llamante es martiny
  • El usuario a autenticar es martin-test.

Ver:

martin@host:~$ su - martin-test
martin-test@host:~$ exit
martin@host:~$ su - otheruser
Password: ****
otheruser@host:~$ 
caos
fuente
1
pam_access se puede usar para proporcionar una funcionalidad similar, sin depender de un script. (esto es lo que pam_access se hizo para hacer)
jsbillings
1
@jsbillings ¿Le darías esa (con algunos detalles) otra respuesta?
Hauke ​​Laging
1
¿Cómo necesitaría modificar mi /etc/pam.d/supara hacer uso de pam_accessmi situación?
Martin Vegter
3
@jsbillings En realidad pam_accessno puedo hacer esto. Cuando supasa por la pila de pam, lo hace según el usuario al que está cambiando, no el usuario del que está cambiando. Entonces, si agrega una regla como + : martin : ALL, permitirá que cualquiera cambie a martin . Incluso si cambias martina martin-test, seguirá permitiendo que cualquiera lo haga. Debe analizar tanto el usuario de donde viene como el usuario al que se está cambiando. Realmente, esto es exactamente lo que sudoes para ...
Patrick
0

Si no tiene acceso a la cuenta raíz, pero tiene la contraseña del usuario que desea usar para ejecutar un comando, puede hacer lo siguiente.

  • Esto le pedirá la contraseña de toto: su - toto -c whoami
  • Esto no lo hará: ssh toto @ localhost whoami

Simplemente instale su clave pública en claves_autorizadas de toto

Patricio
fuente
Respuesta reflexiva ... Sin embargo, el comando que alguien quiere intentar ejecutar ya está en la máquina. Por lo tanto, no tiene sentido enviar un mensaje al mismo servidor.
Raja Anbazhagan
-1

Mi solución simple es:

sudo login -f martin-test

Si desea evitar sudo a toda costa, creo que debería ser posible poner esto en un script:

  1. propiedad de root y con privilegios de root (usando el indicador setuid )
  2. ejecutable por todos, también sin ningún sudo.

Sin embargo, no puedo entender los bits chown rooty chmod +s ToTest.sh, para que esto realmente funcione:

#!/usr/bin/env bash
echo howdy, I am $(whoami)
sudo login -f martin-test

Todavía corro como mi usuario normal, como me dice el eco. Y todavía requiere contraseña sudo. Si se ejecutaba como root, se podría eliminar el sudoen la última línea ...

Frank Nocke
fuente
El indicador setuid en un script de shell (o cualquier otro script) no funcionará en Linux y por buenas razones. Tenga en cuenta que el script anterior con una bandera suid de trabajo sería inmediatamente una trampa: activa bash a través de "env" (bastante autodestructivo, porque si asume que no sabe dónde bashestá, ¿por qué supone que sabe dónde envestá o si incluso existe? Pero al final, no sabes qué bashserá exactamente. Podría provenir del directorio del usuario que invoca y se ha compilado un minuto antes a partir de su código fuente. ¿Ves a dónde voy? O el usuario podría anular whoami...
David Tonhofer
Actualmente, mi cerebro está demasiado lejos de estos problemas para comprenderlos completamente, pero aún así estoy agradecido por las explicaciones detalladas.
Frank Nocke