He escrito un script Python CGI que invoca bash
comandos, y necesita probar un inicio de sesión exitoso en el host.
¿Cómo escribo una prueba para eso?
Por ejemplo, ¿podría crear un bash
script que pruebe una combinación de nombre de usuario y contraseña contra el usuario registrado en el host?
login
programa.Respuestas:
Usar PAM es la mejor solución. Puede escribir código C pequeño o instalar el paquete python-pam y usar un script python que viene con el paquete python-pam. Ver
/usr/share/doc/python-pam/examples/pamtest.py
fuente
/usr/share/doc/packages/python-pam/examples/pamtest.py
El script pamtest.py se puede usar para probar credenciales en sistemas que usan PAM para la autenticación, se incluye en el paquete python-pam (que requiere python), y en algunas distribuciones la ruta completa es/usr/share/doc/python-pam/examples/pamtest.py
.El enfoque correcto para probar si un usuario puede iniciar sesión es realmente iniciar sesión como ese usuario.
Entonces, lo que recomiendo es hacer que el script CGI se use
expect
para ejecutarsu
, pasar una contraseña y ejecutar el comando que debe ejecutarse. Aquí hay un borrador de un script de esperar que hace exactamente esto (advertencia: absolutamente no probado, y no soy fluido en esperar). Sustituya en el nombre de usuario, contraseña y comando (donde escribíbob
,swordfish
ysomecommand
); asegúrese de citar correctamente.Si realmente no desea ejecutar el comando a través de una capa de
su
(por ejemplo, porque lo que hace tiene que ser realizado por el proceso CGI), utilice el comando esperar para ejecutar el comandotrue
y verificar que el estado de retorno sea 0.Otro enfoque sería utilizar PAM directamente en su aplicación, a través del enlace PAM de Python .
fuente
su -c true bob && echo success
es la vergüenza de que su contraseña no aceptan como argumentosu
del script CGI y necesita un terminal para que funcione./bin/true
sería suficiente.Para responder más específicamente: "¿Es posible crear un script bash que pruebe una combinación de nombre de usuario y contraseña en contra del usuario registrado en el host?"
Si.
fuente
shadow
grupo, lo que no es muy recomendable para un CGI: necesitaría otra capa de escalada de privilegios. Y está asumiendo un algoritmo de hashing de contraseña particular (uno compatible con openssl) y una ubicación de almacenamiento de contraseña (/etc/shadow
en lugar de, por ejemplo, NIS o LDAP) que puede o no ser el que realmente se usa para ese usuario en particular.Hay una solución PAM 'C', 'Python' citada aquí, permítanme poner la perl también :-)
Fuente: http://search.cpan.org/~nikip/Authen-PAM-0.16/PAM/FAQ.pod#1._Can_I_authenticate_a_user_non_interactively ?
fuente
Si tiene acceso de root y está utilizando contraseñas md5, y solo necesita comparar las contraseñas, puede usar el módulo perl Crypt :: PasswdMD5 . Tome el MD5 Hash de / etc / shadow, elimine los $ 1 $ y luego divida los $ restantes. Campo 1 = Sal, Campo 2 = texto encriptado. Luego, agregue el ingreso de texto en su CGI, compárelo con el texto encriptado y Bob es su tío.
fuente
shadow
grupo, lo que no es muy recomendable para un CGI: necesitaría otra capa de escalada de privilegios. Y está asumiendo un algoritmo de hashing de contraseña en particular (MD5 y no bcrypt u otro algoritmo recomendado) y una ubicación de almacenamiento de contraseña (/etc/shadow
en lugar de, por ejemplo, NIS o LDAP) que puede o no ser la que realmente se usa para ese usuario en particular.Después de alguna búsqueda, escribí este programa en C que se puede usar desde el script
Lo compilas con:
Puedes usarlo como
fuente
shadow
grupo, lo que no es muy recomendable para un CGI: necesitaría otra capa de escalada de privilegios. Y está asumiendo un algoritmo de hashing de contraseña particular (uno compatible con openssl) y una ubicación de almacenamiento de contraseña (/etc/shadow
en lugar de, por ejemplo, NIS o LDAP) que puede o no ser el que realmente se usa para ese usuario en particular. Use PAM, conoce su trabajo.Como mencionó que está utilizando CGI en python, probablemente sea apropiado suponer que está utilizando Apache como su servidor httpd. Si es así, deje el proceso de autenticación de su programa a Apache y solo permita que las personas autenticadas ejecuten sus scripts / programas cgi.
Existen amplios módulos que pueden realizar la autenticación por usted en Apache, realmente depende del tipo de mecanismo de autenticación que esté buscando. La forma en que citó en la pregunta parece estar relacionada con la autenticación de la cuenta de host local basada en / etc / passwd, archivos shadow. Módulo que viene a mi búsqueda rápida con respecto a esto es
mod_auth_shadow
. La ventaja es que está permitiendo que alguien autorizado (que se ejecuta en el puerto de privilegio 80) autentique el usuario / contraseña por usted y puede confiar en la información autenticada del usuario para ejecutar los comandos en nombre del usuario, si es necesario.Buenos enlaces para comenzar:
http://adam.shand.net/archives/2008/apache_tips_and_tricks/#index5h2
http://mod-auth-shadow.sourceforge.net/
http://www.howtoforge.com/apache_mod_auth_shadow_debian_ubuntu
Otro enfoque es utilizar el módulo SuEXEc de Apache, que ejecuta procesos (programas cgi) en nombre del usuario autenticado.
fuente
Este código usando PAM funcionó para mí:
fuente
Lo mejor que puede hacer, si necesita un script para iniciar sesión en un host, es configurar una clave ssh entre los hosts.
Enlace: http://pkeck.myweb.uga.edu/ssh/
Casi levanté esto de la página
Primero, instale OpenSSH en dos máquinas UNIX, rápido y corpulento. Esto funciona mejor usando claves DSA y SSH2 por defecto hasta donde puedo decir. Todos los otros CÓMO que he visto parecen tratar con claves RSA y SSH1, y las instrucciones no sorprendentemente no funcionan con SSH2. En cada máquina, escriba ssh somemachine.example.com y establezca una conexión con su contraseña habitual. Esto creará un directorio .ssh en su directorio de inicio con los permisos adecuados. En su máquina principal donde desea que vivan sus claves secretas (digamos apresuradamente), escriba
Esto te pedirá una frase secreta. Si esta es su clave de identidad principal, asegúrese de usar una buena frase de contraseña. Si esto funciona correctamente, obtendrá dos archivos llamados id_dsa e id_dsa.pub en su directorio .ssh. Nota: es posible simplemente presionar la tecla Intro cuando se le solicite una frase de contraseña, lo que hará que una tecla sin frase de contraseña. Esta es una Bad Idea ™ para una clave de identidad, ¡así que no lo hagas! Consulte a continuación los usos de las claves sin frases de contraseña.
Copie el archivo id_dsa.pub al directorio .ssh del otro host con el nombre autorizado_claves2. Ahora Burly está listo para aceptar su clave ssh. ¿Cómo decirle qué teclas usar? El comando ssh-add lo hará. Para una prueba, escriba
Esto iniciará el agente ssh, agregará su identidad predeterminada (solicitándole su frase de contraseña) y generará un shell bash. Desde este nuevo shell deberías poder:
Deberías poder iniciar sesión
fuente