サービスユーザーsrvuser
とグループmaintainers
があります。 maintainers
コマンドでグループsrvuser
のみをsu
にする方法を教えてください。編集してみました/etc/pam.d/su
:
auth sufficient pam_succeed_if.so use_uid user = maintainers and user ingroup maintainers
しかし、and
は明らかにconfファイルでは許可されていません。これを回避する方法はありますか?
pam_succeed_if
のドキュメントには、複数の接続詞をサポートすることを示しているものはないようです。そのため、モジュールの外部で行う必要があります。
required
ルールを作成している場合、2つの別々のルールを作成してそれらを組み合わせるのは簡単です。
auth required pam_succeed_if.so user = srvuser
auth required pam_succeed_if.so use_uid user ingroup maintainers
しかし、sufficient
ルールでは、肯定的な結果が返されたときに処理を終了するルールのように、これは機能しませんが、代わりにまたは条件に変わります。ただし、PAMは一種のフロー制御をサポートしているため、前のモジュールの戻り値に基づいて一部のルールをスキップできます。 ここのドキュメント を参照してください。
これは、pam_permit
モジュールがtrueを返す限り、pam_succeed_if
ルールに流れますが、success
以外を返す場合は、次のルールにスキップしてください。
auth [success=ok default=2] pam_succeed_if.so user = srvuser
auth [success=ok default=1] pam_succeed_if.so use_uid user ingroup maintainers
auth [success=done default=ignore] pam_permit.so
... # other modules
ご覧のとおり、構文はひどいので、実際にどこでも使用する前に、構成をテストすることをお勧めします。
もちろん、あるグループのメンバーが別のユーザーの権限でプロセスを実行できるようにするために、必ずしもsu
、Sudo
またはPAMは必要ありません。通常のファイルパーミッションを使用すると、setuidバイナリを作成し、特定のグループのメンバーにのみ実行を許可できます。
# chown srvuser.maintainers ls
# chmod 4510 ls
# ls -l ls
-r-s--x--- 1 srvuser maintainers 118280 Mar 26 19:03 ls
ここでの欠点は、su
やSudo
とは異なり、setuidバイナリの実行はどこにも記録されないこと、およびsetuidバイナリはターゲットユーザーとして実行されているプロセスによって変更または削除できることです。これを回避するには、単純な固定関数ラッパープログラムを作成して、実行をログに記録し、ターゲットにsetuid
してから、実際のコマンドをexec
します。