次の名前の新しいアカウントを作成しますtest
。
$ sudo useradd test
test
現在パスワードはありません。だから
$ su test
動作しません。すると、test
パスワードを入力するように求められます。一つもありません。これは空のパスワードとは異なるため、空のパスワードでEnterキーを押すと、「su:Authentication failed」というメッセージが表示されます。
ttyに切り替えて次にログインしようとする場合も同様ですtest
。空のパスワードは許可されません。
次に、test
空のパスワードを指定します。
$ sudo passwd -d test
test
これで、空の文字列をパスワードで提供してttyにログインできるようになりました。しかし試してみると
$ su test
今回も「su:Authentication failed」というメッセージが表示されます。セッションはユーザーに切り替えられませんtest
。
なぜこれですか?
ベストアンサー1
出力結果を見るとldd /bin/su
、su
バイナリはpam
ライブラリ(libpam*
)を使用してコンパイルされるため、認証、アカウント管理、セッションの開始などの操作はでコンパイルされますpam
。
以下は、一般的なUbuntuシステムを管理するsu
方法ですpam
。別のディストリビューションを使用している場合は、同様の方法を見つける必要があります。
pam
ルールはsu
ファイルで定義されています/etc/pam.d/su
。このファイルには、名前でわかるタスクを処理するための(そして他のアクティブなサービスで使用するための)通常のテンプレートと同じディレクトリに、、ファイルも含まれていcommon-auth
ますcommon-passwd
。common-session
pam
私のシステムの/etc/pam.d/su
一番下には次のものがあります。
@include common-auth
@include common-account
@include common-session
最初の数行は空のパスワードチェックを処理せず、主にモジュールpam_unix
の操作です。
以下が/etc/pam.d/common-auth
あります:
auth [success=1 default=ignore] pam_unix.so nullok_secure
からman pam_unix
:
だれ
このモジュールの基本的な作業は、公式のパスワードが空の場合、ユーザーがサービスにアクセスすることを許可しないことです。 nullokパラメーターはこのデフォルト値を無視し、空のパスワードを持つすべてのユーザーがサービスにアクセスできるようにします。
nullok_secure
このモジュールの基本的な作業は、公式のパスワードが空の場合、ユーザーがサービスにアクセスすることを許可しないことです。 nullok_secure パラメーターは、このデフォルト値を無視し、PAM_TTY 値を /etc/securetty の値のいずれかに設定し、空のパスワードを持つすべてのユーザーがサービスにアクセスできるようにします。
ご覧のとおり、nullok_secure
このオプションを設定すると、上記のように環境変数を設定しない限り、PAM_TTY
パスワードが空のユーザーは許可されませんsu
。
したがって、空のパスワードを持つすべてのユーザーがこれを実行できるようにするには、モジュールにパラメータを提供する必要がsu
あります。nullok
pam_unix
auth [success=1 default=ignore] pam_unix.so nullok
このcommon-auth
ファイルは他の多くのサービスで使用されているため安全ではsu
ありません。 (テスト用に一度設定した後は元の状態に戻すことができますが、テストするには、ファイルを混乱させる/etc/pam.d/su
よりもすべてのロジックをファイルにマージしてから変更を変更することをお勧めしますcommon-*
。)