Qual è la differenza tra / sbin / nologin e / bin / false?


69

Ho sentito spesso raccomandare di disabilitare un account utente impostando la sua shell su /bin/false. Ma, sui miei sistemi Linux esistenti, vedo che un gran numero di account esistenti (tutti account di servizio) hanno invece una shell di /sbin/nologin.

Vedo dalla pagina man che /sbin/nologinstampa un messaggio all'utente dicendo che l'account è disabilitato e quindi esce. Presumibilmente /bin/falsenon stamperebbe nulla.

Vedo anche che /sbin/nologinè elencato in /etc/shells, mentre /bin/falsenon lo è.

La pagina man dice che FTP disabiliterà l'accesso per gli utenti con una shell non elencata /etc/shellse implica che altri programmi possono fare lo stesso. Ciò significa che qualcuno potrebbe accedere FTP con un account che ha /sbin/nologincome shell?

Qual è la differenza qui? Quale di questi dovrei usare per disabilitare un account utente e in quali circostanze? Quali altri effetti ha un elenco in /etc/shells?



1
Come informazioni generali che funzionano. Sto pensando specificamente dal punto di vista dell'amministrazione del sistema.
Michael Hampton

Inteso solo come backgrounder.
dmourati

Risposte:


70

/bin/falseè un programma di utilità associato a /bin/true, utile in senso astratto per garantire che unix sia completo. Tuttavia, sono stati trovati scopi emergenti per questi programmi; considera l'istruzione BASH /some/program || /bin/true, che sarà sempre booleana-valutata su true ( $? = 0) indipendentemente dal ritorno di /some/program.

Un uso emergente di /bin/false, come identificato, è come una shell nulla per gli utenti non autorizzati ad accedere. In questo caso il sistema si comporterà esattamente come se la shell non potesse essere eseguita.

POSIX (anche se potrei sbagliarmi e potrebbe essere il SUS) costringe entrambi questi comandi a fare esattamente nient'altro che restituire il valore booleano appropriato.

/sbin/nologinè un'utilità BSD che ha un comportamento simile a /bin/false(restituisce un valore booleano falso), ma stampa anche l'output, come /bin/falseè vietato. Questo dovrebbe aiutare l'utente a capire cosa è successo, anche se in pratica molti emulatori di terminali si chiuderanno semplicemente quando la shell termina, rendendo il messaggio quasi illeggibile comunque in alcuni casi.

C'è poco scopo alla quotazione /sbin/nologinin /etc/shells. L'effetto standard di /etc/shellsè quello di elencare i programmi consentiti per l'uso chshquando gli utenti cambiano la propria shell (e non vi sono motivi credibili per cambiare la propria shell /sbin/nologin). Il superutente può cambiare la shell di chiunque in qualsiasi cosa. Tuttavia, potresti voler elencare entrambi /sbin/nologine /bin/falsein /etc/rsh, il che proibirà agli utenti con queste shell di cambiare la loro shell usando chshnel malaugurato caso in cui ottengano una shell.

I daemon FTP possono impedire l'accesso agli utenti con una shell non in / etc / shells, oppure possono usare qualsiasi altra logica che desiderano. L'esecuzione di FTP deve essere evitata in ogni caso perché sftp(che fornisce funzionalità simili) è simile ma sicura. Alcuni siti utilizzano /sbin/nologinper disabilitare l'accesso alla shell consentendo l'accesso sftp inserendolo /etc/shells. Questo può aprire una backdoor se l'utente è autorizzato a creare cronjobs.

In entrambi i casi, scpnon funzionerà con una shell non valida. scponlypuò essere usato come shell in questa istanza.

Inoltre, la scelta della shell influisce sul funzionamento di su -(AKA su -l). In particolare, l'output di /sbin/nologinverrà stampato su stdout se si tratta della shell; questo non può essere il caso di /bin/false. In entrambi i casi i comandi eseguiti con su -clfalliranno.

Infine, la risposta:

Per disabilitare un account, non dipendere da nessuno di questi, ma impostare la shell su /sbin/nologina scopo informativo (a meno che non /sbin/nologinsia presente /etc/shells, a quel punto è necessario utilizzare /bin/false, cosa che non dovrebbe essere). Invece, imposta il campo password /etc/passwdsu !, che è garantito cryptper essere valido per nessuna password. Valuta di impostare l'hash /etc/shadowallo stesso modo per evitare bug. passwd -llo farà per te.

Un terzo modo per disabilitare un account è impostare il campo della data di scadenza dell'account su una data antica (ad es. usermod --expiredate 1). Ciò impedirà l'accesso nel caso in cui la configurazione consenta agli utenti di autenticarsi sul proprio account unix senza password e il servizio che stanno utilizzando non richiede shell.


9
Mentre questa risposta riassume perfettamente le diverse opzioni (e risponde alla domanda), ho sentito il bisogno di puntare a una risorsa utile per questo caso d'uso, che è disponibile almeno nelle azionari Debian repository, nel titantoolspacchetto di: noshell. Questa pseudo-shell fornisce funzionalità di auditing, registrando i tentativi di syslog di utilizzare gli account noshellcome shell, pur non consentendone l'accesso.
Dawud,

1
Non è affatto apocrifo, ma in realtà è abbastanza comune tra gli amministratori di sistema di una certa annata (tosse), da usare /bin/falsecome shell di accesso per le persone che non dovrebbero accedere.
MadHatter,

2
Apocrifo nel senso che non è l'uso previsto originale. Non ho detto anacronistico; Lo vedo ogni giorno :)
Falcon Momot,

1
La disabilitazione dell'account con password non valida non funziona troppo bene con ssh. Se l'utente fosse riuscito a configurare in precedenza l'autenticazione con chiave pubblica, potrebbe essere in grado di accedere comunque.
joshudson,

3
sshd è documentato per verificare che gli account che sono bloccati in determinati modi (gli hash delle password che iniziano con! sono menzionati in modo specifico) anche con pubkey auth.
Falcon Momot,

13

Dopo aver fatto qualche ricerca su questo, il metodo che usi dipende da cosa devi bloccare. Se un utente accede con questo set alla shell, visualizzerà un messaggio con l'effetto di This account is currently unavailable.Nota che è possibile modificarlo creando il file /etc/nologin.txtalmeno sui derivati ​​RHEL.

Come sai /bin/falsenon è un guscio. Il modo in cui funziona è che restituisce false che si disconnette immediatamente dopo l'uscita binaria. Nota che /bin/trueotterresti lo stesso effetto.

Per quanto riguarda la tua domanda FTP: Sì, lei ha ragione a che avere il guscio impostato /sbin/nologinconsentirà agli utenti di accedere a FTP, mentre /bin/falseo /bin/trueimpedirà completamente l'utente di accedere in qualsiasi servizio.

Pertanto, /bin/falseo /bin/trueè meglio impedire a un utente di accedere a qualsiasi servizio, mentre /sbin/nologinconsentirà comunque agli utenti di accedere a servizi diversi da SSH o console locale fornendo al contempo feedback all'utente che l'account è inattivo e viene utilizzato al meglio quando solo SSH / locale la console deve essere bloccata.


2

Qualcuno ha provato a dimostrare che / bin / false non consentirebbe l'accesso FTP?

Ho appena cambiato la shell del mio utente in / bin / false e sono stato in grado di eseguire l'FTP.

Uso / dev / null per bloccare completamente l'utente (beh, tranne la posta elettronica, possono ancora POP3).


Ce l'hai dentro /etc/shells? Come è configurato il tuo server FTP?
Michael Hampton

non esiste una regola che dice che un utente ha bisogno di una shell per accedere a un server FTP.
Petter H

Non lo consentirà su alcuni demoni FTP, e non altri. Esiste una notevole variazione nella funzionalità tra i vari. L'implementazione classica non consentirà l'accesso a chiunque non abbia una shell, ma ciò non significa che tutte le implementazioni debbano farlo.
Falcon Momot,
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.