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