web-dev-qa-db-ja.com

ユーザーごとにLinux機能を構成することはできますか?

Linuxカーネルでは fine-grained capabilities がサポートされているようです。これにより、プロセスに特権を付与して、たとえば、プロセスのルート特権を付与せずにrawソケットを開いたり、スレッドの優先順位を上げたりすることができます。

ただし、per-user機能を付与する方法があるかどうかを知りたいです。つまり、非rootおよび非suidプロセスがこれらの機能を取得できるようにします。

32
Alex B

それは一種のlibcapで行うことができます-PAMモジュールpam_cap.soを提供します。しかし、それはかなり単純ではありません:)

各プロセスには3つの機能セットがあります。

  • 効果的(このプロセスが実際に持つ上限)
  • 許可(このプロセスが持つ可能性のある上限-効果のスーパーセット)
  • 継承可能(このプロセスが子プロセスに渡すことができるキャップ)

ファイルには同じ機能セットがあります。新しいバイナリがexec()されると、プロセスの機能は次のルールに従って変化します。

  • pI/pPは、プロセスの初期の継承/許可機能です
  • pI '/ pP'/pE 'はプロセスのnew継承可能/許可済み/有効な機能です
  • fI/fP/fEは、ファイルの継承可能/許可/有効な機能です
  • &は交差を表す
  • |組合を表す

    pI '= pI 
     pP' = fP | (pI&fI)
     pE '= fE&pP'

http://www.friedhoff.org/posixfilecaps.html から簡略化)

ほとんどのシナリオでは、pE 'だけが重要な結果です。 libcapにリンクされているプログラムは、setcap()を呼び出して有効キャップを変更できます(要求しようとするキャップが許可セットに含まれている限り)。ただし、プログラムの大部分は明示的にキャップに触れないため、実行後のキャップが有効になるように調整します。

具体的な例があると、ここを理解するのに役立ちます... openvpnを実行するために「su」をする必要があることにうんざりしていたので、ルートなどの設定を許可するCAP_NET_ADMIN機能を自分自身に付与したいと思いました。

最後のルール(_pE' = fE & pP'_)を見ると、プロセスの有効セットにCAP_NET_ADMINがあることは明らかです。CAP_NET_ADMINmustfile 'にある必要があります■有効なセット。したがって、機能システムでは、「ユーザーsqweekにCAP_NET_ADMINを許可する」と単純に言うことはできません。プログラムの機能は常に重要です。

ただし、ファイルの有効セットに含まれているだけでは十分ではありませんが、キャップはプロセスの新しい許可セットにも含まれている必要があります。そのルールを見てみましょう:pP' = fP | (pI & fI)。したがって、_pP'_でキャップを取得するには2つの方法があります。CAP_NET_ADMINをファイルの許可セットに追加するか、ファイルの継承セットに追加して、プロセスの継承セットにあることを確認します。

それをファイルの許可セットに追加すると、プロセスの初期機能は無関係になります。openvpnは、誰が実行したかに関係なく、実行するたびにCAP_NET_ADMINを取得します。これはsetuidに似ていますが、よりきめの細かいアプローチを提供します。それでも、ユーザーごとの粒度ではないため、他のオプションを見てみましょう。

最初のルール_pI' = pI_に注意してください。プロセスの継承可能な機能は、exec()の影響を受けません。これが意味することは、CAP_NET_ADMINを継承可能なキャップとして設定する単一のlibcap対応プログラムであり、そこから生成されたすべてのプロセスはCAP_NET_ADMIN継承可能にもなります。これはpamモジュールが果たす役割です。ログイン中に継承可能セットを変更し、そのユーザーのすべてのプロセスで継承されます。

要約すると:

  1. Libcapをインストールする
  2. Pam_capモジュールを構成します(_cap_net_admin sqweek_に_/etc/security/capability.conf_の行を追加します。ファイルが以前に存在していなかった場合は、別の行_none *_を追加して適切なデフォルトにします。
  3. ログイン中にPAMモジュールを有効にします(_auth required pam_cap.so_を_/etc/pam.d/login_に追加します)。 PAMを変更するときは、ログアウトする前に別の端末でログインをテストして、ロックアウトされないようにしてください!
  4. CAP_NET_ADMINをopenvpn(_setcap cap_net_admin+ie /usr/sbin/openvpn_)の有効なセットと継承可能なセットに追加する
  5. openvpnipを呼び出してルーティングテーブルなどを変更するため、同じ処理が必要です(_setcap cap_net_admin+ie /sbin/ip_)

_/etc/pam.d/login_はローカルログインのみを管理することに注意してください-たとえば、 _/etc/pam.d/sshd_同様の扱い。また、setcapを介して追加した機能は、パッケージマネージャーがターゲットバイナリの新しいバージョンをインストールするときに消去されるため、再度追加する必要があります。

48
sqweek

はい、setcapを使用して実行可能ファイルの機能セットを指定できます。これにより、その実行可能ファイルの実行時に特定の機能を付与できます。

capabilities(7) manページから:

ファイル機能カーネル2.6.24以降、カーネルはsetcap(8)を使用して機能セットを実行可能ファイルに関連付けることをサポートしています。ファイル機能セットは、security.capabilityという名前の拡張属性(setxattr(2)を参照)に格納されます。この拡張属性への書き込みには、CAP_SETFCAP機能が必要です。ファイル機能セットは、スレッドの機能セットとともに、execve(2)の後のスレッドの機能を決定します。


ユーザーごと(またはグループごと)の機能を付与する方法は、PAMモジュールを使用することです。 sqweekの回答 は、pam_capを使用してこれを行う方法を示しています。

12
caf

確認していませんが、SELinuxのこの側面があなたの答えになると思います:

http://www.lurking-grue.org/writingselinuxpolicyHOWTO.html#userpol5.1

6
gahooa

CapOver を見てください-それはあなたが望むことをするはずです。

注:これは(まだ?)2.6.30ishカーネルAPIに移植されていないため、使用していません。

3
Druiloor