アプリケーションをrootとして実行せずにLinux PAMを介してパスワードを変更する

アプリケーションをrootとして実行せずにLinux PAMを介してパスワードを変更する

私が作成しているアプリケーションにはパスワード変更機能があります。しかし、rootではなくアカウント管理部分を実行できるかどうかを知りたいです。

管理したいユーザーとして実行すると、パスワードを変更できない問題が発生しました。指定したパスワードで最初に認証し、パスワードが正しいことを確認します。 (認証モジュールの別の部分を別々に呼び出します。)chauthtokユーザーに対して変更を呼び出すと、pamtest会話関数のデバッグ出力が発生します。

START PAM CHANGE PASSWORD
PAM_CONV start [('Changing password for pamtest.', 4)]
PAM_CONV iter: Changing password for pamtest. 4
PAM_CONV end: [('', 0)]
PAM_CONV start [('(current) UNIX password: ', 1)]
PAM_CONV iter: (current) UNIX password:  1
PAM_CONV end: [(u'5ACN5pbmDFBVMHp', 0)]
PAM_CONV start [('Enter new UNIX password: ', 1)]
PAM_CONV iter: Enter new UNIX password:  1
PAM_CONV end: [(u'pdJb7ffsQTHWw4V', 0)]
PAM_CONV start [('Retype new UNIX password: ', 1)]
PAM_CONV iter: Retype new UNIX password:  1
PAM_CONV end: [(u'pdJb7ffsQTHWw4V', 0)]
Pass change failed for pamtest! '' (('Authentication token manipulation error', 20))
response:False

デバッグフラグは、pam_unix.sorsyslogファイルauth.logでこの行を2回提供します。

<date> <time>   <system>    python  pam_unix(passwd:chauthtok): username [pamtest] obtained

これにより、変更されたパスワードをシャドウファイルに書き込むのに問題があると考えられます。ルートが書き込み権限を持つ唯一の人だからかもしれません。ルートとして実行すると、コードが機能します。

これは正しい仮定ですか?それでは、通常はモジュールをrootとして実行することによって実行されますか?または、シャドウファイルにのみ書き込む権限のみを持つ特定のユーザーを作成するなど、他のオプションを使用できますか?

ベストアンサー1

これにより、変更されたパスワードをシャドウファイルに書き込むのに問題があると考えられます。ルートが書き込み権限を持つ唯一の人だからかもしれません。ルートとして実行すると、コードが機能します。

これは正しい仮定ですか?

はい。/etc/shadowルートとしてのみ作成できるため、root権限がある場合にのみプログラムを実行できます。

または、シャドウファイルにのみ書き込み権限を持つ特定のユーザーを作成するなど、他のオプションを使用できますか?

「setuid root」プログラムを書いてください。 setuid は、どのユーザーがプログラムを起動しても、プログラムが常にroot権限を持っていることを意味します。その後、プログラムは以下を保証する必要があります。

  • 電話をかけるユーザーは自分のパスワードのみを変更できます。
  • 電話をかけたユーザーが正しい古いパスワードを入力しました。
  • 呼び出し側のユーザーは、ルートシェルの実行など、まったく異なる操作を実行するためにプログラムを操作することはできません。

もちろん、setuidプログラムを書くときは非常に注意する必要があります。あなたのプログラムは今呼び出すユーザーよりも多くの権限を持っているので、攻撃者は自分の権限をrootに昇格させるためにプログラムのバグを悪用しようとします。

おすすめ記事