私が作成しているアプリケーションにはパスワード変更機能があります。しかし、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.so
rsyslogファイル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に昇格させるためにプログラムのバグを悪用しようとします。
答え2
プライベートグループ(「shadow」など)がシャドウファイルを読み取ることができるようにし、そのファイルでアプリケーションにsetgidを実行させることができます。これにより、システムが破損している場合は、システム内のすべてのファイルではなくユーザーデータベースのみを読み取ることができます。ただし、プロセスがスーパーユーザーである場合、またはその時点で適切な機能が関連付けられてアクティブになっていない場合、アプリケーションはプロセスの資格情報を変更できません。