test
という名前の新しいアカウントを作成します :
$ sudo useradd test
テストコード> 現在、パスワードはありません。だから
$ su test
動作しません。試してみると、 test
を求められます のパスワード。ありません。これは、パスワードが空であることと同じではないため、Enterキーを押して空のパスワードを入力すると、「su:認証に失敗しました」というメッセージが表示されます。
ttyに切り替えて、 test
としてログインしようとした場合も同じです。 :空のパスワードは使用できません。
次に、 test
を割り当てます 空のパスワード:
$ sudo passwd -d test
これで、 test
としてログインできます。 パスワードとして空の文字列を提供することにより、ttyで。ただし、試してみると
$ su test
繰り返しになりますが、「su:認証に失敗しました」というメッセージが表示されますが、セッションはユーザーの test
に切り替わりません。 。
なぜですか?
承認された回答:
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
前の行はnullパスワードチェックを扱っていません。これは主にpam_unix
の仕事です。 モジュール。
今/etc/pam.d/common-auth
持っている:
auth [success=1 default=ignore] pam_unix.so nullok_secure
man pam_unix
から :
nullok
このモジュールのデフォルトのアクションは、公式パスワードが空白の場合、ユーザーにサービスへのアクセスを許可しないことです。 nullok引数はこのデフォルトを上書きし、
空白のパスワードを持つすべてのユーザーがサービスにアクセスできるようにします。nullok_secure
このモジュールのデフォルトのアクションは、公式パスワードが空白の場合、ユーザーにサービスへのアクセスを許可しないことです。 nullok_secure引数はこのデフォルトをオーバーライドし、PAM_TTYの値が/ etc / securettyにある値のいずれかに設定されている限り、
パスワードが空白のユーザーがサービスにアクセスできるようにします。
nullok_secure
かどうかを確認できます 環境変数PAM_TTY
でない限り、オプションが設定されます 上記の方法で設定されている場合、パスワードがnullのユーザーは、 su
を使用してログインすることはできません。 。
したがって、パスワードがnullのユーザーが su
を実行できるようにするため 、 nullok
が必要です pam_unix
への引数 モジュール:
auth [success=1 default=ignore] pam_unix.so nullok
これはcommon-auth
として安全ではありません ファイルは、 su
だけでも、他の多くのサービスで使用されます これは行われるべきではありません。 (テストのために、一度設定してから元に戻すことができます。ただし、テストを実行する場合は、すべてのロジックを /etc/pam.d/su
に組み込むことをお勧めします。 ファイルを作成し、 common- *
をいじるのではなく、後で変更を修正します。 ファイル)