web-dev-qa-db-ja.com

カスタムSELinuxラベルを作成する方法

私はFedora 24で実行しようとしているサービス/シングルバイナリアプリを作成しました。それはsystemdを使用して実行され、バイナリは/srv/bot

私が書いたこのサービス/アプリは、このディレクトリでファイルを作成/オープン/読み取りして名前を変更する必要があります。

私は最初に基づいて新しいポリシーの作成を開始しました SELinux:プロセスが特定のディレクトリにファイルを作成できるようにします

しかし、私のアプリが名前を変更する必要があるとき、出力には警告がありました:

#!!!! WARNING: 'var_t' is a base type.
allow init_t var_t:file rename;

探し回ったところ、ベースタイプよりも具体的なSELinuxラベルを使用する必要があることがわかりましたが、オンラインのすべての例では、httpd/nginx/etcの既存のラベルが表示されています。

自分のアプリだけにカスタムラベルを作成する方法はありますか?

私のアイデアは、myapp_var_tのようなものを作成することです。

semanage fcontext -a -t my_app_var_t '/srv/bot(/.*)?'
restorecon -R -v /srv/bot

とカスタム.ppこのカスタムタイプを使用するファイル

それを解決するより良い方法があれば、それもうまくいきます。

ありがとう

更新

もっと調べた後、私がやりたいことの適切な用語は、新しいtypesを作成することだと思います https://docs.fedoraproject.org/en-US/Fedora/13 /html/SELinux_FAQ/index.html#id3036916

基本的に言う、実行

sepolgen /path/to/binary

そして、ppファイルにコンパイルして読み込むことができるテンプレートを取得することができましたが、それでもいくつかのエラーが発生しますが、自分がやりたいことに近いように見えます。

動作するようになったら、この投稿を更新します

11
fmpwizard

ランニングの出発点

sepolgen /path/to/binary

あなたに与える:

app.fc
app.sh
app.if
app.spec
app.te

プログラム/デーモンが変更するファイルを保持する親ディレクトリに適用する新しいSELinux file contextを作成するには、app.teファイルを編集して以下を追加します。

type app_var_t;
files_type(app_var_t)

1行目は新しいタイプを宣言し、2行目は何らかのマジックを実行してそれをファイルタイプにするマクロを呼び出します(ファイルまたはディレクトリでプロセスコンテキストラインapp_exec_tを使用できないことがわかります)。詳細は "SELinuxタイプ再訪 " さまざまなタイプの詳細情報

型を宣言したら、アプリがその型を使用できることをSELinuxに通知する必要があります。

allow app_t app_var_t:dir { add_name remove_name write search};
allow app_t app_var_t:file { unlink create open rename write read };

これらの2行は基本的に、アプリのドメインであるapp_tタイプに、コンテキストapp_var_tでディレクトリの書き込み/検索/ etcを許可し、コンテキストapp_var_tでファイルを作成/開く/削除/許可することを許可します

パズルの最後の部分は、SELinuxにどのタイプのファイルと各タイプを取得するかを何らかの方法で伝えることです。これを行うには、app.fcファイルを編集します(fc =>ファイルコンテキスト)

私の場合、このファイルには2行しかありません。

/srv/bot/app        --  gen_context(system_u:object_r:app_exec_t,s0)
/srv/bot(/.*)?          gen_context(system_u:object_r:app_var_t,s0)

最初の行はサーバーにデプロイされたバイナリを直接指しているため、この行はapp_exec_tコンテキストを取得します。

2行目は次のことを意味します。

App_var_tをディレクトリ/ srv/botに適用し、ディレクトリ/ srv/bot内のすべてのファイルにも適用します

最初の行で、パスと--の呼び出しの間にgen_contextがあることに注意してください。 --は、これをファイルのみに適用することを意味します。 2番目のケースでは何もありません(スペースのみ)。つまり、一致するすべてのディレクトリとファイルに適用します。これは私が望んでいることです。別のオプションは、ディレクトリのみを適用する-dを使用することです。

これで動作するポリシーができました。カスタムポリシーを使用してアプリをデプロイすると、すべて機能します。 (私のポリシーの.teファイルにはもっと多くのエントリがありますが、この質問の範囲外です。)

この解決策を得るのに役立つ追加の読み物:

sepolgenで物事を簡単にする

盲目的にaudit2allow -M mydomainを実行する前に考えてください

SELinux FOR Red Hat DEVELOPERS (長いPDF)

SElinuxモジュール(1):タイプとルール

サンプルポリシー(特にpostgresql)

ファイルコンテキストファイルについて

11
fmpwizard