現在、cap_net_bind_service MY_USERNAME
を使用しています /etc/security/capability.confにあります。
ここで、cap_net_bind_service+i
を設定する必要があります。 CAP_NET_BIND_SERVICE
を追加できるようにするための私のお気に入りのスクリプト言語のインタプリタ 効果的 libcap[-ng]を介して設定します。
これは問題なく機能しますが、インタプリタバイナリに上限を設定せずに同じことを実現する方法があるのではないかと思います。大きな問題ではありませんが(他のユーザーアカウントには上限がないため、インタープリターバイナリにビットが設定されていても使用できません)、インタープリターが設定されるたびにフラグを再設定する必要があるため、やや面倒です。更新されました。
承認された回答:
通常、機能は子に継承されます。マンページに記載されているように:
fork(2)を介して作成された子は、その親の機能セットのコピーを継承します。
スクリプトの問題は、スクリプトが直接実行可能ではないことです。カーネルはチェックのリストを調べます(カーネルコードはfs / binfmt _ *。cにあります)。それらの1つは「binfmt_script.c」です。これは、最初の行でシバンをチェックしてから、スクリプトを引数として実際のインタープリター(シバンにあるもの)を呼び出します。そのため、標準/共通インタープリターが呼び出され、スクリプトを引数として読み取るだけです。
つまり、スクリプトではなくインタプリタで機能を設定する必要があります。
同じことがsuid
にも当てはまります。 ビット、およびその他の特別なフラグ。
したがって、インタプリタのコピーを作成し、必要な機能を設定して(chmod / chownを介して誰もアクセスできないことも確認してください)、このコピーしたインタプリタをシバンで呼び出します。
setcapを実行することもできます。スクリプト内のロジック。