Datos
- Quiero que los usuarios operadores en esta máquina monten sus propios recursos compartidos cifs
- El
sudoers
archivo ya contiene el/bin/mount -t cifs //*/* /media/* -o username=*
comando para todos los operadores. - Quiero que los usuarios monten un recurso
cifs
compartido a través de un script que escriba la contraseña solo una vez, no dos veces. - La contraseña de sudo y la contraseña cifs son idénticas.
Lo que ya tengo
Este script funciona:
#!/bin/bash
sudo 'mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'
... ¡ pero requiere que los usuarios escriban la misma contraseña dos veces!
- Una vez para
sudo
- Una vez para el monte mismo
Esto también funcionaría:
#!/bin/bash
echo -n Password:
read -s szPassword
echo $szPassword | sudo -S sh -c 'echo $szPassword | mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'
... pero esto requeriría que permita que todos los usuarios del operador puedansudo sh
(problema de seguridad importante)
Pregunta
¿Cómo montar un recurso compartido cifs en bash ¹ sin poner sh
el sudoers
archivo ni crear un archivo permanente / temporal?
Nota 1: sin python, perl, C, Go, ... por favor?
Nota 2: Sé que puedo eliminar la contraseña a través del sudoers
archivo, pero estoy tratando de reforzar la seguridad, no aflojarla, sin renunciar a la comodidad ...
printf "%s\n" "$szPassword" "$szPassword" | sudo -S mount -t cifs / ...
?Respuestas:
En su lugar, debe hacer que el usuario haga la llamada de usar sudo como
sudo script
. solo verifique si el script se está ejecutando como root, si no, pídaloNo intentes capturar la contraseña de tus usuarios.
fuente
sudo
y luego (al autenticarse con éxito) nuevamentemount
. En su caso de uso, estas contraseñas son idénticas, por lo que puedo ver por qué el OP desea que el usuario solo tenga que ingresar esta contraseña una vez. No creo que su solución ayude con esto. Estoy de acuerdo en que uno no debe capturar contraseñas.1>&2
), está en el inicio automático y solía ser solo un recurso compartido cifs, pero ahora son tres, así que realmente una contraseña es necesario (Ya contiene esa prueba en caso de que alguien más, que no sea miembro del grupo de operadores, intente ejecutarla)~/.smbcredentials
por ejemplo), e incluso sin la necesidad de sudo (si utiliza gvfs, umount o polkit).¡Soy tonto!
El siguiente script:
simplemente funciona y:
fuente
<<<
también podría usarse en lugar deprintf
, pero un mejor enfoque sería abandonarlo porread
completo y usarlosudo --stdin
solo. Algo así como$ printf "Type out your password\n" && sudo --stdin apt-get update
Usuario aún puede escribir la contraseña de sudo. y eso no lo pondrá en la lista de procesos. Pero, por supuesto, hay una cantidad infinita de otros posibles problemas de seguridad, como keyloggers, vulnerabilidades potenciales ensudo
, y bla, y bla, y bla en el infinitoNo requiere
sudo
contraseña para ejecutar este comando; la contraseña solicitamount
restos.En
sudoers
, incluye algo comoDespués de incluir esto,
sudo
ya no pedirá una contraseña para este comando específico; el usuario aún necesita proporcionar una contraseña para elmount
comando.Nota : Tomé el comando textualmente de lo que incluiste en la pregunta; No verifiqué si sus comodines permitirían a los usuarios hacer algo desagradable. Lea la página de
sudoers
manual para ver ejemplos de maldad. En particular, tenga en cuenta que esta líneasudoers
permite al usuario agregar cualquier número de-o
interruptores u otros argumentosmount
. Es posible que desee repensar su enfoque, por ejemplo, agregando un script como @Braiam propone y permita ejecutarlosudo
sin autenticación adicional. Luego, el script garantiza que los usuarios solo puedan ejecutar la forma específica de lamount
que desea que ejecuten.Además, en lugar de permitir esto para todos los usuarios, también puede limitar esto a los miembros de un determinado grupo, por ejemplo, puede crear un grupo
cifsmount
y luego tenerfuente
Una solución general a estos problemas es colocar el siguiente preámbulo en la parte superior de su sudo que requiere scripts:
Obviamente, esto tiene un inconveniente en que si algunos comandos en el script no requieren
sudo
ejecutarse, aquí hay una elevación innecesaria de privilegios.De todos modos, pensé que compartiría este pequeño consejo. Lo mejor de todo es que si ya eres eficaz-uid root (por ejemplo, si ya lo llamaste bajo sudo), hace lo correcto con gracia. También es menos amigable dar un error y obligarlo a volver a escribir / volver a ejecutar (con sudo).
También es posible que desee consultar la
timestamp_timeout
variable en laman 5 sudoers
que se lesudo
recuerda recordar las credenciales del usuario durante un número limitado de minutos (y puede ser fraccional).fuente
#test if root: if not: bail out if [[ $EUID -ne 0 ]]; then echo "This script must be run as root, use sudo "$0" instead" 1>&2 exit 1 fi
El punto es que también contiene múltiples monturas, todas con la misma contraseña (nuevamente: eliminado), pero gracias de todos modos ...