機能のマニュアルページを参照する場合、現在、これを行う簡単な方法はありません。
During an execve(2), the kernel calculates the new capabilities of the process
using the following algorithm:
P'(permitted) = (P(inheritable) & F(inheritable)) | (F(permitted) & cap_bset)
P'(effective) = F(effective) ? P'(permitted) : 0
P'(inheritable) = P(inheritable) [i.e., unchanged]
where:
P denotes the value of a thread capability set before the execve(2)
P' denotes the value of a capability set after the execve(2)
F denotes a file capability set
cap_bset is the value of the capability bounding set
実行するファイルにfPビットが設定されていない場合、またはfIビットが設定されていない場合、プロセスには許可されていないため、有効な機能がありません。
ファイルシステム全体を許可して継承ビットを設定することは技術的には可能ですが、システムのセキュリティが大幅に低下するため、あまり意味がありません(編集:そしてあなたが言ったように、それは新しい実行可能ファイルでは機能しません)。
確かに、pam_capを使用してユーザーにいくつかの機能を提供することはできますが、それを使用してコンパイルしたばかりのファイルをユーザーに実行させることはできません。機能は、ユーザーではなくプログラムに電力を与えるように設計されたものであり、 Hallynの論文で読むことができます。
重要な洞察は、人ではなくプログラムが特権を行使するという観察です。つまり、コンピューターで行われることはすべてエージェント(プログラム)を介して行われ、これらのプログラムが特権をどう処理するかを知っている場合にのみ、特権を使用することを信頼できます。
POSIX機能を定義するPOSIXドラフト1003.1e、310ページも参照してください。
また、プロセスチェーン(単一のプロセス内の一連のプログラム)に対して、そのチェーンの存続期間を通じて固定され、アクティブなままである一連の機能を確立することも適切ではありません。[...]これは最小特権の原則の適用であり、ユーザーとプロセスに等しく適用されます。
最近(2012年12月)このLinuxカーネルメーリングリストの機能として何をしたいのかを紹介するように言われましたが、非常に興味深い回答がいくつかあります。一部の人々は、継承ルールにファイル機能をドロップするとexec
セキュリティ上の問題が発生し、どのセキュリティ問題が発生するかについての説明がない場合でも、その機能はそのような機能用に設計されていないと主張します。
現在それを行う唯一の方法は、Linuxカーネルで機能が継承される方法を変更することです(変更する2つのファイル、3.7カーネルで正常にテストしました)が、上記のようにそれが保護されているかどうかは明らかではありません。
古いカーネル(2.6.33より前)では、ファイルの機能なしでコンパイルするオプションがありましたが(CONFIG_SECURITY_FILE_CAPABILITIES
)、そのような古いカーネルで作業することはあなたにとってのオプションではないかと思います。