test
という名前の新しいアカウントを作成します。
$ Sudo useradd test
test
には現在パスワードがありません。そう
$ su test
動作しません。試してみると、test
のパスワードの入力を求められます。ありません。これは、パスワードが空であることと同じではないため、Enterキーを押して空のパスワードを入力すると、「su:認証に失敗しました」というメッセージが表示されます。
Ttyに切り替えて、test
としてログインしようとした場合も、同じことが言えます。空のパスワードは受け入れられません。
次に、test
に空のパスワードを割り当てます。
$ Sudo passwd -d test
空の文字列をパスワードとして指定することにより、ttyにtest
としてログインできるようになりました。ただし、試してみると
$ su test
この場合も、「su:認証に失敗しました」というメッセージが表示されますが、セッションはユーザーtest
に切り替わりません。
どうしてこれなの?
ldd /bin/su
の出力から、su
バイナリはpam
ライブラリ(libpam*
)でコンパイルされるため、認証、アカウント管理、セッション開始などは次のようになります。 pam
によって管理されます。
以下は、典型的なUbuntuシステムのsu
がpam
によって管理される方法です。別のディストリビューションを使用している場合は、同様のアプローチを見つける必要があります。
pam
のsu
ルールは、ファイル/etc/pam.d/su
で定義されています。このファイルには、名前が提案する(および他のpam
対応サービスで使用される)タスクをカバーするための一般的なテンプレートと同じディレクトリのcommon-auth
、common-passwd
、common-session
ファイルも含まれます。 。
私のシステムでは、/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
を実行できるようにするには、pam_unix
モジュールにnullok
引数を指定する必要があります。
auth [success=1 default=ignore] pam_unix.so nullok
common-auth
ファイルは他の多くのサービスで使用されているため、これは安全ではありません。su
のみの場合でもこれを行うべきではありません。 (テストのために、一度設定してから元に戻すことができます。ただし、テストを実行する場合は、すべてのロジックを/etc/pam.d/su
ファイルに組み込み、変更を変更するのではなく、後で修正することをお勧めします。任意のcommon-*
ファイルを使用)
man useradd
から:
-p, --password PASSWORD
The encrypted password, as returned by crypt(3). The default is to disable the password.
Note: This option is not recommended because the password (or encrypted password) will be visible by users listing the processes.
--password
を使用しなかったため、ユーザーIDには特別な「無効な」パスワードが与えられました。空のパスワードと同じではありません。
逆に言えば、セキュリティホールになります。