web-dev-qa-db-ja.com

pam_succeed_if.soを使用して、特定のグループにパスワードなしのsuを許可する

サービスユーザー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ファイルでは許可されていません。これを回避する方法はありますか?

2
Niemand

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

ご覧のとおり、構文はひどいので、実際にどこでも使用する前に、構成をテストすることをお勧めします。


もちろん、あるグループのメンバーが別のユーザーの権限でプロセスを実行できるようにするために、必ずしもsuSudoまたはPAMは必要ありません。通常のファイルパーミッションを使用すると、setuidバイナリを作成し、特定のグループのメンバーにのみ実行を許可できます。

# chown srvuser.maintainers ls
# chmod 4510 ls
# ls -l ls
-r-s--x--- 1 srvuser maintainers 118280 Mar 26 19:03 ls

ここでの欠点は、suSudoとは異なり、setuidバイナリの実行はどこにも記録されないこと、およびsetuidバイナリはターゲットユーザーとして実行されているプロセスによって変更または削除できることです。これを回避するには、単純な固定関数ラッパープログラムを作成して、実行をログに記録し、ターゲットにsetuidしてから、実際のコマンドをexecします。

1
ilkkachu