web-dev-qa-db-ja.com

/ sbin / nologinと/ bin / falseの違いは何ですか?

Shellを/bin/falseに設定して、ユーザーアカウントを無効にすることを推奨することをよく耳にします。しかし、私の既存のLinuxシステムでは、代わりに多数の既存のアカウント(それらすべてがサービスアカウント)に/sbin/nologinのシェルがあることがわかります。

Manページを見ると、/sbin/nologinは、アカウントが無効になっていることを示すメッセージをユーザーに出力して終了します。おそらく/bin/falseは何も出力しません。

また、/sbin/nologin/etc/shellsにリストされていますが、/bin/falseはリストされていません。

マンページは、FTPが/etc/shellsにリストされているシェルnotを持つユーザーのアクセスを無効にすることを示しており、他のプログラムが同じことを行う可能性があることを示唆していますこれは、誰かが/sbin/nologinをシェルとして持つアカウントでFTPでログインできることを意味しますか?

ここの違いは何ですか?ユーザーアカウントを無効にするためにこれらのうちどれを使用する必要がありますか、またどのような状況で使用しますか? /etc/shellsのリストには他にどのような影響がありますか?

71
Michael Hampton

/bin/falseはユーティリティプログラムであり、/bin/trueのコンパニオンです。これは、UNIXが完全な機能であることを確認する抽象的な意味で役立ちます。ただし、これらのプログラムの緊急の目的が見つかりました。 BASHステートメント/some/program || /bin/trueを検討してください。これは、$? = 0が返されても、常にブール値が真(/some/program)に評価されます。

ご指摘のとおり、/bin/falseの緊急使用は、ログインを許可されていないユーザーにとってはヌルシェルとしての役割を果たします。この場合のシステムは、シェルの実行に失敗したかのように動作します。

POSIX(私は間違っている可能性があり、それはSUSかもしれません)は、適切なブール値を返すこと以外にこれらのコマンドの両方が厳密に何もしないように制約します。

/sbin/nologin/bin/false(ブール値falseを返す)と同様の動作をするBSDユーティリティですが、/bin/falseの実行が禁止されているため、出力も出力します。これは、ユーザーが何が起こったかを理解するのに役立つはずですが、実際には、多くのターミナルエミュレーターはシェルが終了すると単純に終了し、場合によってはメッセージを読み取ることができますが、とにかく読めなくなります。

/sbin/nologin/etc/shellsをリストする目的はほとんどありません。 /etc/shellsの標準的な効果は、ユーザーが自分のシェルを変更しているときにchshでの使用が許可されているプログラムをリストすることです(自分のシェルを/sbin/nologinに変更する明確な理由はありません)。 。スーパーユーザーは、誰のシェルも何にでも変更できます。ただし、/sbin/nologin/bin/false/etc/rshの両方をリストすると、これらのシェルを持つユーザーは、不幸なイベントでchshを使用してシェルを変更できなくなります。シェルを取得します。

FTPデーモンは、/ etc/shellsにないシェルを持つユーザーへのアクセスを許可しない場合や、ユーザーが希望する他のロジックを使用する場合があります。 sftp(同様の機能を提供します)は同様ですが安全であるため、FTPの実行はいかなる場合でも避けてください。一部のサイトでは、/sbin/nologinを使用して、sftpアクセスを許可しながらシェルアクセスを無効にし、/etc/shellsに入れています。ユーザーがcronjobsの作成を許可されている場合、これによりバックドアが開かれる可能性があります。

どちらの場合でも、scpは無効なシェルでは動作しません。 scponlyは、このインスタンスでシェルとして使用できます。

さらに、シェルの選択はsu -(別名su -l)の操作に影響します。特に、/sbin/nologinの出力は、シェルの場合はstdoutに出力されます。これは/bin/falseには当てはまりません。どちらの場合でも、su -clで実行されるコマンドは失敗します。

最後に、答え:

アカウントを無効にするには、これらのいずれにも依存しませんが、情報提供のためにシェルを/sbin/nologinに設定します(/sbin/nologin/etc/shellsにある場合を除き、その時点で/bin/falseを使用する必要があります、すべきではありません)。代わりに、/etc/passwdのパスワードフィールドを!に設定します。これは、パスワードがない場合にcryptが有効であることを保証します。バグを回避するために、同じ方法で/etc/shadowにハッシュを設定することを検討してください。 passwd -lがこれを行います。

アカウントを無効にする3番目の方法は、アカウントの有効期限フィールドを古い日付に設定することです(例:usermod --expiredate 1)。これにより、セットアップでユーザーがパスワードなしでUNIXアカウントに対して認証でき、使用しているサービスにシェルが不要な場合に、ログインが防止されます。

74
Falcon Momot

これについていくつかの調査を行った後、使用する方法は何をロックアウトする必要があるかによって異なります。ユーザーがこれをシェルに設定してログインすると、This account is currently unavailable.の効果を示すメッセージが表示されます。少なくともRHELの派生物でファイル/etc/nologin.txtを作成することにより、これを変更できます。

ご存知のように、/bin/falseはシェルではありません。彼らはそれが機能する方法は、バイナリが終了した直後にログアウトするfalseを返すことです。 /bin/trueでも同じ効果が得られることに注意してください。

FTPに関する質問について:はい、シェルを/sbin/nologinに設定すると、ユーザーはFTPにログインできますが、/bin/falseまたは/bin/trueは、ユーザーが完全にログインするのを防ぎます- anyサービス。

したがって、/bin/falseまたは/bin/trueは、ユーザーがサービスにログインできないようにするのが最善ですが、/sbin/nologinは、ユーザーにSSHまたはローカルコンソール以外のサービスへのログインを許可しながら、アカウントが非アクティブであり、SSH /ローカルコンソールのみをロックアウトする必要がある場合に最適に使用されるユーザー。

13
Jacob

ええと、誰かがtry/bin/falseがFTPアクセスを許可しないことを証明しましたか?

ユーザーのシェルを/ bin/falseに変更したところ、問題なくFTPできました。

私は/ dev/nullを使用して完全にユーザーをロックアウトします(電子メールを除いて、彼らはまだPOP3を使用できます)。

3
Jim Dunn