SELinuxで安全な方法で単一のプログラムの特定の危険な動作を許可する


8

私は.soファイルをロードするDockerコンテナー内で実行されているプログラムを持っています。これは、フックとメモリ操作によってプログラムの動作を変更します。この動作はSELinuxによってブロックされ、監査ログに次のメッセージが表示されます。

type = AVC msg = audit(1548166862.066:2419):avc:denied {execheap} for pid = 11171 comm = "myProgram" scontext = system_u:system_r:container_t:s0:c426、c629 tcontext = system_u:system_r:container_t:s0: c426、c629 tclass =プロセスの許容値= 0

audit2allow他の場所でこの特定の動作を許可したくないので、これを実行することは非常にためらっています(非常に危険であるため)。

  • この特定の動作を可能な限り安全な方法で許可するようにSELinuxに指示するにはどうすればよいですか?
  • 今後、同じプログラムを実行するDockerコンテナーをより多く生成できるようにすることはできますか?

回答:


4

audit2allowおそらく許可するルールを生成execheapするためにcontainer_t型プロセスを。ロードする前に、常に最初にモジュールを生成して検査することができます。

考えられる問題は、container_ttypeを持つすべてのプロセスが同じ操作を許可されることです。これを回避するには、独自のカスタムタイプを(container_tテンプレートとして使用して)作成し、execheapこの特別なタイプのみを許可する必要があります。

Dan Walshによるこのブログ投稿では、そのようなカスタムポリシーの記述方法について説明しています。これと組み合わせてaudit2allow、実際のルールを生成することもできます。基本的な手順は次のとおりです。

  1. たとえば、基本的なコンテナポリシーを作成しますcontainer_execheap

    policy_module(container_execheap, 1.0)
    
    virt_sandbox_domain_template(container_execheap_t)
    

    virt_sandbox_domain_templateマクロは新しいタイプcontainer_execheap_tを作成し、新しいタイプをコンテナードメインとして使用できるようにする、Docker操作に必要なルールを作成します。

  2. ポリシーモジュールをコンパイルしてロードします(メイクファイルを含む必要な開発ファイルは、selinux-policy-develパッケージで提供する必要があります)。

    make -f /usr/selinux/devel/Makefile container_execheap.pp
    semodule -i container_execheap.pp
    

    新しいタイプは、寛容なドメインになるように構成できます。

    semanage permissive -a container_execheap_t
    

    寛容なドメインの場合、AVC拒否はログに記録されますが、ルールは適用されません。このようにして、後でを使用して不足しているルールを簡単に生成できaudit2allowます。

  3. このような新しいコンテキストでコンテナを実行します。 docker run ... --security-opt label:type:container_execheap_t ...

  4. 予想されるエラーを生成します。次に、を実行audit2allowして、の操作を許可するルールを生成しますcontainer_execheap_t。同じモジュール.teファイル(バージョン番号を上げることを忘れないでください)を新しいルールで更新できます。更新されたモジュールをコンパイルしてインストールします。

  5. エラーが発生しなくなったら、カスタムコンテナタイプを強制モードに戻しますsemanage -d container_execheap


あなたの答えは進むべき道のようです-残念ながら私は自分でSELinuxポリシーを作成した経験はありませんが。これは、リンク先のブログの投稿やその他のドキュメントを調べて思いついたものです。私はそれを正しく行っていないような気がします...おそらく、私を正しい方向に向けることで私を助けてもらえますか?私の方針はまったく意味がありますか?
Thomas

おかげで、今はうまくいくように見えます!これは私が結局終わったものです。しかし、コンパイル時に重複に関する多くのエラーを受け取りました。これは、自分のポリシーではなく、含まれているポリシーの問題だと思いますか?また、gen_requireステートメント内の文字列を、 `ではなく 'ではなく'で終了する必要がある理由もよくわかりません(後者はエラーをスローしました)。とにかく、助けてくれてありがとう!
トーマス

これらの特定のエラーを無視しても安全だと思います。bugzillaを参照してください。`'を使用した引用は、M4言語での参照方法であり、参照ポリシーモジュールの記述に使用されます。ps axZカスタムポリシーをインストールして構成した後で再確認する場合は、コンテナが正しいコンテキストで実行されていることを(などを使用して)確認できます。
1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.