Les données
- Je souhaite que les utilisateurs opérateurs sur cette machine montent leurs propres partages cifs
- Le
sudoers
fichier contient déjà la/bin/mount -t cifs //*/* /media/* -o username=*
commande pour tous les opérateurs - Je veux que les utilisateurs montent un
cifs
partage via un script en tapant le mot de passe une seule fois, pas deux. - Le mot de passe sudo et le mot de passe cifs sont identiques.
Ce que j'ai déjà
Ce script fonctionne:
#!/bin/bash
sudo 'mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'
... mais cela oblige les utilisateurs à taper deux fois le même mot de passe!
- Une fois pour
sudo
- Une fois pour la monture elle-même
Cela fonctionnerait également:
#!/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'
... mais cela m'obligerait à permettre à tous les utilisateurs opérateurs de pouvoirsudo sh
(problème de sécurité majeur)
Question
Comment monter un partage cifs dans bash ¹ sans mettre sh
le sudoers
fichier ni créer un fichier permanent / temporaire ???
Note 1: pas de python, perl, C, Go, ... s'il vous plait?
Remarque 2: je sais que je peux simplement supprimer le mot de passe dans le sudoers
fichier, mais j'essaie de renforcer la sécurité, pas de la desserrer, sans renoncer à la commodité ...
printf "%s\n" "$szPassword" "$szPassword" | sudo -S mount -t cifs / ...
?Réponses:
Vous devriez plutôt faire appel à l'utilisateur en utilisant sudo as
sudo script
. vérifiez simplement si le script est exécuté en tant que root, sinon demandez-leN'essayez pas de capturer le mot de passe de vos utilisateurs.
la source
sudo
puis (après s'être authentifié avec succès) à nouveau parmount
. Dans leur cas d'utilisation, ces mots de passe sont identiques, je peux donc comprendre pourquoi l'OP souhaite que l'utilisateur n'ait à saisir ce mot de passe qu'une seule fois. Je ne pense pas que votre solution y contribue. Je suis d'accord qu'il ne faut pas capturer les mots de passe.1>&2
), est dans le démarrage automatique et il n'était qu'un partage cifs, mais maintenant c'est trois, donc vraiment un mot de passe est nécessaire. (Il contient déjà ce test au cas où quelqu'un d'autre, non membre du groupe des opérateurs,~/.smbcredentials
par exemple), et même sans avoir besoin de sudo (si vous utilisez gvfs, umount ou polkit).Je suis stupide!
Le script suivant:
fonctionne et:
la source
<<<
pourrait également être utilisé à la place deprintf
, mais la meilleure approche serait de supprimerread
complètement et de l'utilisersudo --stdin
tout seul. Quelque chose comme l'$ printf "Type out your password\n" && sudo --stdin apt-get update
utilisateur peut toujours taper le mot de passe sudo. et cela ne le mettra pas dans la liste des processus. Mais bien sûr, il existe une quantité infinie d'autres problèmes de sécurité possibles, comme les enregistreurs de frappe, les vulnérabilités potentielles danssudo
, et bla, et bla, et bla dans l'infiniNe nécessite aucun
sudo
mot de passe pour exécuter cette commande; l'invite de mot de passemount
reste.Dans
sudoers
, incluez quelque chose commeAprès avoir inclus cela,
sudo
ne demandera plus de mot de passe pour cette commande spécifique; l'utilisateur doit toujours fournir un mot de passe à lamount
commande.Remarque : J'ai pris la commande mot pour mot de ce que vous avez inclus dans la question; Je n'ai pas vérifié si ses caractères génériques permettraient aux utilisateurs de faire quelque chose de méchant. Lisez la
sudoers
page de manuel pour des exemples de méchanceté. En particulier, notez que cette lignesudoers
permet à l'utilisateur d'ajouter un nombre quelconque de-o
commutateurs ou d'autres arguments àmount
. Vous voudrez peut-être repenser votre approche, par exemple en ajoutant un script tel que @Braiam le propose et en autorisant son exécutionsudo
sans authentification supplémentaire. Le script garantit ensuite que les utilisateurs ne peuvent exécuter que la forme spécifiquemount
que vous souhaitez qu'ils exécutent.De plus, au lieu de permettre cela à tous les utilisateurs, vous pouvez également limiter cela aux membres d'un certain groupe, par exemple, vous pouvez créer un groupe
cifsmount
et ensuite avoirla source
Une solution générale à ces problèmes consiste à placer le préambule suivant en haut de votre sudo nécessitant des scripts:
Évidemment, cela a un inconvénient en ce sens que si certaines commandes du script ne nécessitent pas d'
sudo
être exécutées, il y a une élévation inutile des privilèges ici.Quoi qu'il en soit, j'ai pensé partager cette petite astuce. La meilleure chose à ce sujet, c'est que si vous êtes déjà root efficace-uid (par exemple si vous l'avez déjà appelé sous sudo), il fait gracieusement la bonne chose. Donner également une erreur et vous forcer à retaper / réexécuter (avec sudo) est moins convivial.
Vous pouvez également vouloir vérifier la
timestamp_timeout
variable dansman 5 sudoers
laquelle indiquesudo
de se souvenir des informations d'identification de l'utilisateur pour un nombre limité de minutes (et peut être fractionnaire).la source
#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
Le fait est qu'il contient également plusieurs montures avec le même mot de passe (encore une fois: supprimé), mais merci quand même ...