SELinux対応システムでデーモン(Apache/samba/vsftpd /...)を実行していて、デフォルト以外の場所にあるファイルを使用できるようにする必要があります。標準のファイル許可は、アクセスを許可するように構成されています。
デーモンがpermissiveモードで実行されている場合、すべてが機能します。強制に戻すと機能しなくなり、SELinux AVC拒否メッセージが表示されます。
強制モードでのアクセスを許可するようにシステムを構成するにはどうすればよいですか?
SELinuxは、Linuxシステムに別の権限チェック層を追加します。 SELinux対応システムでは、最初に通常のDAC権限がチェックされ、アクセスが許可されている場合は、SELinuxpolicyが参照されます。 SELinuxポリシーがアクセスを拒否すると、/var/log/audit/audit.log
の監査ログ、またはシステムでauditd
が実行されていない場合はdmesgにログエントリが生成されます。
SELinuxは、システム内のすべてのオブジェクト(ファイル、プロセスなど)にsecurity contextというラベルを割り当てます。
ファイルには、セキュリティコンテキストが拡張属性に格納されています。これらはls -Z
で表示できます。
SELinuxは、データベースのパスパターンをデフォルトのファイルコンテキストにマッピングします。このデータベースは、デフォルトのファイルコンテキストを手動で復元する必要がある場合、またはシステムのラベルが変更された場合に使用されます。このデータベースは semanage
ツールでクエリできます。
プロセスには、実行可能ファイルが実行されるときにセキュリティコンテキストが割り当てられます(execve
syscall)。プロセスのセキュリティコンテキストは、ps Z $PID
などのほとんどのシステム監視ツールで表示できます。
他のラベル付きオブジェクトも存在しますが、この回答には関係ありません。
SELinuxpolicyには、コンテキスト間で許可される操作を指定するrulesが含まれています。 SELinuxはwhitelistルールで動作し、ポリシーによって明示的に許可されていないものはすべて拒否されます。 参照ポリシー には、多くのアプリケーション用のポリシーモジュールが含まれています。これは通常、SELinux対応ディストリビューションで使用されるポリシーです。この回答は主に、配布ポリシーを使用する場合に使用する可能性が最も高い参照ポリシーに基づいてポリシーを操作する方法を説明しています。
アプリケーションを通常のユーザーとして実行する場合、デフォルトの構成ではユーザーがunconfinedコンテキストに配置されるため、おそらくSELinuxに気付かないでしょう。 unconfinedコンテキストで実行されているプロセスには、制限がほとんどありません。制限のないコンテキストでは、ユーザーシェルで問題なくプログラムを実行できる可能性がありますが、initシステムを使用して起動すると、制限されたコンテキストでは機能しない可能性があります。
ファイルがデフォルト以外の場所(デフォルトのポリシーには記載されていない)にある場合、問題は多くの場合、次の理由に関連しています。
ファイルに正しくない/互換性のないファイルコンテキストがあります:mv
で移動されたファイルは、古い場所のファイルセキュリティコンテキストを含むメタデータを保持します。新しい場所に作成されたファイルは、親ディレクトリまたは作成プロセスからコンテキストを継承しました。
同じファイルを使用して複数のデーモンを使用する:デフォルトのポリシーには、問題のセキュリティコンテキスト間の相互作用を許可するルールは含まれていません。
ファイルが別のデーモン(または他の制限されたプロセス)によって使用されておらず、ファイルが保存されている場所が唯一の変更である場合、SELinux構成に必要な変更は次のとおりです。
デフォルトの場所のファイルコンテキストは、新しい場所のテンプレートとして使用できます。ほとんどのポリシーモジュールには、可能な代替ファイルコンテキストとそのアクセスセマンティクスを説明するマニュアルページドキュメント( sepolicy manpages
を使用して生成)が含まれています。
ファイルコンテキストデータベースは正規表現の構文を使用するため、重複する仕様を記述できます。適用されたコンテキストが最後に見つかった仕様であることに注意してください。 [src]。
ファイルコンテキストデータベースに新しいエントリを追加するには:
semanage fcontext -a -t <type> "/path/here/(/.*)?"
新しいコンテキストエントリがデータベースに追加された後、データベースのコンテキストを restorecon <files>
を使用してファイルに適用できます。 restorecon
を-vn
フラグを付けて実行すると、変更を適用せずに変更されるファイルコンテキストが表示されます。
データベースに新しいエントリを追加せずに新しいファイルコンテキストをテストする
chcon
ツールを使用して、コンテキストを手動で変更できます。これは、ファイルコンテキストデータベースにエントリを追加せずに新しいファイルコンテキストをテストする場合に便利です。
新しいファイルコンテキストは、chcon
の引数で指定されます。 --reference=
オプションと一緒に使用すると、参照ファイルのセキュリティコンテキストがターゲットファイルにコピーされます。
特定のコンテキストを使用(default_t
):
chcon -t default_t <target files>
または参照を使用して:
chcon --reference=<path to default location> <target files>
異なるファイルシステムとマウントポイントに関する注意
新しい場所が独自のマウントポイントである場合、コンテキストは mountオプション で設定できます。マウントオプションで設定されたコンテキストはディスクに保存されないため、拡張属性をサポートしていないファイルシステムでも使用できます。
mount <device> <mount point> -o context="<context>"
参照ポリシーには、特定の追加ルールを有効/無効にするbooleansと呼ばれる調整可能なオプションが含まれています。それらの多くは、通常同じファイルを使用しない異なるシステムデーモンの相互運用を可能にします。
調整可能なすべてのオプションとその説明のリストは、semanage boolean -l
を使用してリストできます。 audit2allow
は、有効にする必要があるブール値を直接通知することもできます。
semanage
を使用してブール値を有効/無効にするには:
semanage boolean --on <boolean name>
semanage boolean --off <boolean name>
ブール値は、ポリシーを変更する最も簡単な方法です。ただし、ブール値を切り替えることですべての状況に対処できるわけではありません。一部のブール値は、非常に広いアクセスを許可し、過度に寛容です。
アクセスを許可するブール値が存在しない場合は、カスタムモジュールを追加してポリシーを変更する必要があります。
アクセスを許可するために必要なルールを追加する単純なモジュールは、次の手順でaudit2allow
を使用してログファイルから生成できます。
デーモンのdomain(security context)をpermissive modeに設定します。許容モードでは、ポリシーは強制されませんが、ポリシーは通常拒否するアクセスでログが生成されます。
semanage permissive -a <domain>
通常の操作でデーモンをテストして、ログエントリを生成します。
新しいポリシーモジュールを作成して挿入します。
audit2allow -a -M <name>
semodule -i <name>.pp'
強制モードを再度有効にする
semanage permissive -d <domain>
この方法は、関係するセキュリティコンテキストが少ない場合に最適に機能します。複雑な構成では、おそらく独自のポリシーモジュールを作成する必要があります。はじめにいくつかのリソースは gentoo wiki および reference policy API のドキュメントです。
このコマンドで:
# semanage fcontext -l /oldpath/
システム内のフォルダーのデフォルトのSElinuxコンテキストを確認できるため、そのコマンドを使用して、そのデーモンフォルダーのデフォルトのコンテキストを確認できます。
したがって、コンテンツの移動先のディレクトリで構成する必要があるSELinuxコンテキストを確認できます。
デーモンフォルダーに次のコンテキストがあることがわかります(Apacheコンテキストです)。
# semanage fcontext -l
...
/var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
次に、これらのコンテキストを次のように新しいパスに適用します(Apacheデーモンのデフォルトのセキュリティコンテキストの例)
# semanage fcontext -a -t httpd_sys_content_t '/newpath(/.*)?'
その後、コンテンツが既に新しいパスにあることを考慮して、そのパスの下にあるすべてのものを強制して、そのコンテキストを取得する必要があります。
# restorecon -RFvv /newpath
次のコマンドを使用して、機能したかどうかを確認できます。
# ls -Zd /newpath/
ディレクトリまたはファイルをmvするとセキュリティコンテキストが維持されることに注意してください。フォルダーまたはディレクトリをcpすると、コンテキストが親のコンテキストに設定されます。
マニュアルページで特定のソフトウェアを確認する必要がある場合は、次のコマンドを使用してマニュアルページをインストールできます。
# yum install -y selinux-policy-devel
Man dbのインデックスを再作成するには、このコマンドを実行することを忘れないでください。
# mandb
次に、これを実行して、すべてのselinux manページを確認します。
# man -k selinux
提案、そのパッケージをインストールする前後にこのコマンドを実行して、違いを確認してください:
# man -k selinux | wc -l