Come inserire la password solo una volta in uno script bash che necessita di sudo


21

Dati

  • Voglio che gli utenti dell'operatore su questa macchina montino le proprie condivisioni cifs
  • Il sudoersfile contiene già il /bin/mount -t cifs //*/* /media/* -o username=*comando per tutti gli operatori
  • Voglio che gli utenti montino una cifscondivisione tramite uno script digitando la password una sola volta, non due volte.
  • La password sudo e la password cifs sono identiche.

Quello che ho già

Questo script funziona:

#!/bin/bash
sudo 'mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'

... ma richiede agli utenti di digitare due volte la stessa password!

  • Una volta per sudo
  • Una volta per il monte stesso

Questo funzionerebbe anche:

#!/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'

... ma questo mi richiederebbe di consentire a tutti gli utenti dell'operatore di essere in gradosudo sh (grave problema di sicurezza)

Domanda

Come montare una condivisione cifs in bash ¹ senza inserire shil sudoersfile né creare un file permanente / temporaneo ???

Nota 1: no python, perl, C, Go, ... per favore?
Nota 2: So che posso semplicemente rimuovere la password attraverso il sudoersfile, ma sto cercando di rafforzare la sicurezza, non di allentarla, senza rinunciare alla comodità ...


2
Che ne dici printf "%s\n" "$szPassword" "$szPassword" | sudo -S mount -t cifs / ...?
Muru,

Provalo adesso! @Muru
Fabby,

Risposte:


24

Dovresti invece fare all'utente la chiamata di usare sudo as sudo script. controlla solo se lo script viene eseguito come root, se non lo chiedi

if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root, use sudo "$0" instead" 1>&2
   exit 1
fi

Non tentare di acquisire la password dei tuoi utenti.


1
Forse mi manca qualcosa, ma puoi spiegare come questo riduce il numero di richieste di password da due a una? Altrimenti non vedo come questo risponda alla domanda.
Oliphaunt: ripristina Monica il

@Oliphaunt Non vedo due richieste di password, puoi spiegarlo? Inoltre, questa risposta non è ciò che OP desidera, ma ciò di cui ha bisogno. È la soluzione pulita e corretta quando è necessario eseguire i comandi come root e come fanno le altre utility (verificare se root, altrimenti salvarsi)
Braiam

1
Il problema del PO (a quanto ho capito) è che all'utente viene richiesta la password sudoe quindi (dopo l'autenticazione riuscita) di nuovo da mount. Nel loro caso d'uso, queste password sono identiche, quindi posso capire perché l'OP vorrebbe che l'utente dovesse inserire questa password una sola volta. Non credo che la tua soluzione sia d'aiuto in questo. Sono d'accordo che non si dovrebbero catturare le password.
Oliphaunt: ripristina Monica il

Grazie, ma potrei aver semplificato un po 'la domanda: è già uno script, contiene già quel test (tranne il 1>&2), è nell'avvio automatico ed era solo una condivisione cifs, ma ora sono tre, quindi davvero una password è necessario. (Contiene già quel test nel caso in cui qualcun altro, non membro del gruppo di operatori, cerchi di eseguirlo)
Fabby,

@Fabby Penso ancora che stai affrontando il problema in modo errato. In questi casi ci sono aiutanti a "ricordare" la password di una condivisione CIFS / SMB in modo sicuro (modifica ~/.smbcredentialsper esempio), e anche senza la necessità di sudo (se usi gvfs, umount o polkit).
Braiam,

7

Sono stupido!

Il seguente script:

#!/bin/bash
read -p "Password: " -s szPassword
printf "%s\n" "$szPassword" | sudo --stdin mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER,password="$szPassword"

funziona e basta:

  1. Non crea alcun file contenente password
  2. Consente all'utente di digitare una sola password per più condivisioni (comprese quelle Windows)
  3. Non ha bisogno di ulteriori privilegi da concedere. :-)

1
1 domanda: questo fa eco al comando nell'elenco dei processi?
Rinzwind,

3
@Rinzwind come built-in, non dovrebbe essere in bash o zsh. Il comando mount potrebbe, però.
Muru,

<<<potrebbe anche essere usato al posto di printf , ma un approccio migliore sarebbe quello di abbandonare del readtutto e usare sudo --stdintutto da solo. Qualcosa come $ printf "Type out your password\n" && sudo --stdin apt-get update User può ancora digitare la password sudo. e questo non lo inserirà nell'elenco dei processi. Ma ovviamente c'è un'infinità di possibili altri problemi di sicurezza, come keylogger, potenziali vulnerabilità in sudo, e blah e blah e blah nell'infinito
Sergiy Kolodyazhnyy,

@SergiyKolodyazhnyy: sentiti libero di modificare , amico!
Fabby,

3

Non richiede sudopassword per eseguire questo comando; la richiesta di password mountrimane.

In sudoers, includere qualcosa di simile

ALL        ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*

Dopo averlo incluso, sudonon verrà più richiesta una password per questo comando specifico; l'utente deve comunque fornire una password al mountcomando.

Nota : ho preso il comando alla lettera da ciò che hai incluso nella domanda; Non ho verificato se i suoi caratteri jolly consentissero agli utenti di fare qualcosa di brutto. Leggi la sudoersmanpage per esempi di cattiveria. In particolare, si noti che questa riga in sudoersconsente all'utente di aggiungere qualsiasi numero di -oswitch o altri argomenti a mount. Potresti voler ripensare il tuo approccio, ad esempio aggiungendo uno script come @Braiam propone e consentire di eseguirlo sudosenza ulteriore autenticazione. Lo script garantisce quindi che gli utenti possano eseguire solo la forma specifica di mountcui si desidera che vengano eseguiti.

Inoltre, invece di consentire questo per tutti gli utenti, potresti anche limitarlo ai membri di un determinato gruppo, ad esempio potresti creare un gruppo cifsmounte quindi avere

%cifsmount ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*

@Fabby Siamo spiacenti, ma cosa c'è di così pericoloso in questo? Inoltre, potrei rilevare un pizzico di sarcasmo, non sono sicuro.
Oliphaunt: ripristina Monica il

bene, anche se sudo non richiede una password, mount potrebbe comunque richiedere una password. Il file / etc / sudoers potrebbe essere usato per fare in modo che sudo non richieda una password. Ciò non influirebbe sul fatto che mount richieda una password. Se una persona non è riuscita a montare, sudo finirebbe per eseguire un comando che non riesce, il che probabilmente non è un problema.
TOOGAM il

@TOOGAM Questa era la mia intenzione. Una password anziché due.
Oliphaunt: ripristina Monica il

La mia intenzione è quella di mantenere un gruppo "operatore" nel file sudoers, quindi se un operatore tenta di montare i propri elementi, devono comunque digitare una password, ma per montare i montaggi operatore "standard", devono solo digitare la password una volta invece di 5 volte ... Ma la tua soluzione potrebbe funzionare per altri, così votata ... (e rimossi i commenti originali)
Fabby,

1

Una soluzione generale a questi problemi è mettere il seguente preambolo in cima al sudo che richiede script:

#!/bin/bash
case $EUID in
   0) : cool we are already root - fall through ;;
   *) # not root, become root for the rest of this session
      # (and ask for the sudo password only once)
      sudo $0 "$@" ;;
esac
# now the present process is effective-UID  (root)
# so there's no need to put sudo in front of commands

any more commands here will run as superuser ...

Ovviamente, questo ha il rovescio della medaglia nel fatto che se alcuni comandi nello script non necessitano sudodi essere eseguiti, qui c'è un inutile aumento dei privilegi.

Comunque, ho pensato di condividere questo piccolo suggerimento. La cosa più bella al riguardo è che se sei già root-efficace (ad es. Se l'hai già chiamato sotto sudo) fa con grazia la cosa giusta. Anche dare un errore e costringerti a riscrivere / rieseguire (con sudo) è meno amichevole.

Potresti anche voler controllare la timestamp_timeoutvariabile in man 5 sudoerscui dice sudodi ricordare le credenziali dell'utente per un numero limitato di minuti (e può essere frazionario).


Ho semplificato troppo lo script per ottenere una risposta semplice: lo script contiene già: #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 Il punto è che contiene anche più montaggi tutti con la stessa password (di nuovo: rimosso), ma grazie comunque ...
Fabby,

1
Il punto è che la soluzione di cui sopra richiederebbe solo una digitazione della password (per sudo). Non dovrebbe richiedere nessun altro. Inoltre è un generale (e più elegante che dare un errore e dover digitare nuovamente il comando con sudo) per tutti i problemi simili, anche quando richiedono più (più di due) comandi privilegiati.
arielf

Si dovrebbe , ma non è così ! ;-) Questo perché ogni mount condiviso cifs richiede anche una password. (poiché può essere diverso dalla password di Ubuntu, ma in questo caso non è perché gli operatori mantengono sincronizzate le password di Windows e Ubuntu)
Fabby,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.