web-dev-qa-db-ja.com

パスワードが空のユーザーに切り替えるために `su`を使用できないのはなぜですか?

testという名前の新しいアカウントを作成します。

$ Sudo useradd test

testには現在パスワードがありません。そう

$ su test

動作しません。試してみると、testのパスワードの入力を求められます。ありません。これは、パスワードが空であることと同じではないため、Enterキーを押して空のパスワードを入力すると、「su:認証に失敗しました」というメッセージが表示されます。

Ttyに切り替えて、testとしてログインしようとした場合も、同じことが言えます。空のパスワードは受け入れられません。

次に、testに空のパスワードを割り当てます。

$ Sudo passwd -d test

空の文字列をパスワードとして指定することにより、ttyにtestとしてログインできるようになりました。ただし、試してみると

$ su test

この場合も、「su:認証に失敗しました」というメッセージが表示されますが、セッションはユーザーtestに切り替わりません。

どうしてこれなの?

2
UTF-8

ldd /bin/suの出力から、suバイナリはpamライブラリ(libpam*)でコンパイルされるため、認証、アカウント管理、セッション開始などは次のようになります。 pamによって管理されます。

以下は、典型的なUbuntuシステムのsupamによって管理される方法です。別のディストリビューションを使用している場合は、同様のアプローチを見つける必要があります。

pamsuルールは、ファイル/etc/pam.d/suで定義されています。このファイルには、名前が提案する(および他のpam対応サービスで使用される)タスクをカバーするための一般的なテンプレートと同じディレクトリのcommon-authcommon-passwdcommon-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-*ファイルを使用)

3
heemayl

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には特別な「無効な」パスワードが与えられました。空のパスワードと同じではありません。

逆に言えば、セキュリティホールになります。

1
waltinator