web-dev-qa-db-ja.com

インタープリターバイナリを設定せずにスクリプトで機能を使用できますか?

現在、/ etc/security /capability.confでcap_net_bind_service MY_USERNAMEを使用しています。
ここで、お気に入りのスクリプト言語のインタープリターにcap_net_bind_service+iを設定して、libcap [-ngを介して設定された有効CAP_NET_BIND_SERVICEを追加できるようにする必要があります。 ]。

これは正常に動作しますが、インタープリターバイナリにキャップを設定せずに同じことを達成する方法はあるのでしょうか。大きな問題ではありませんが(他のユーザーアカウントには上限がないため、インタープリターバイナリにビットを設定しても使用できません)、インタープリターが設定されるたびにフラグを再設定する必要があるため、やや面倒です。更新しました。

14
ThiefMaster

通常、機能は子に継承されます。 manpage で述べられているように:

Fork(2)で作成された子は、その親の機能セットのコピーを継承します。

スクリプトの問題は、スクリプトが直接実行可能ではないことです。カーネルはチェックのリストを通過します(カーネルコードはfs/binfmt _ *。cにあります)。それらの1つは "binfmt_script.c"です。これは、シェバンの最初の行をチェックし、スクリプトを引数として実際のインタープリター(シェバンにあるもの)を呼び出します。そのため、標準/共通インタープリターが呼び出され、スクリプトを引数として読み取るだけです。

つまり、スクリプトではなく、インタープリターで機能を設定する必要があります。同じことがsuidビットやその他の特別なフラグにも当てはまります。

したがって、インタプリタのコピーを作成し、必要な機能を設定して(chmod/chownを介して誰もアクセスできないことも確認してください)、このコピーされたインタプリタをShebangで呼び出します。スクリプトでsetcapロジックを実行することもできます。

4
Adrien M.