なぜ「su」を使用して空のパスワードを持つユーザーに切り替えることができないのですか?

なぜ「su」を使用して空のパスワードを持つユーザーに切り替えることができないのですか?

次の名前の新しいアカウントを作成します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/susuバイナリはpamライブラリ(libpam*)を使用してコンパイルされるため、認証、アカウント管理、セッションの開始などの操作はでコンパイルされますpam

以下は、一般的なUbuntuシステムを管理するsu方法ですpam。別のディストリビューションを使用している場合は、同様の方法を見つける必要があります。

pam ルールはsuファイルで定義されています/etc/pam.d/su。このファイルには、名前でわかるタスクを処理するための(そして他のアクティブなサービスで使用するための)通常のテンプレートと同じディレクトリに、、ファイルも含まれていcommon-authますcommon-passwdcommon-sessionpam

私のシステムの/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あります。nullokpam_unix

auth    [success=1 default=ignore]      pam_unix.so nullok

このcommon-authファイルは他の多くのサービスで使用されているため安全ではsuありません。 (テスト用に一度設定した後は元の状態に戻すことができますが、テストするには、ファイルを混乱させる/etc/pam.d/suよりもすべてのロジックをファイルにマージしてから変更を変更することをお勧めしますcommon-*。)

おすすめ記事