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- * をいじるのではなく、後で変更を修正します。 ファイル)