SELinuxのセキュリティ概念
SELinux(Security-Enhanced Linux)はシステムのセキュリティを保護する追加メカニズムです。ある意味では、標準の権限システムと並行して動作する権限システムと見なすことができます。通常のモードでは、プロセスはユーザーとして実行され、システム上のファイルや他のリソースには権限が設定されています(どのユーザーがどのファイルに対してどのアクセス権を持つかを制御)。
SELinuxの別の特徴は、ファイルにアクセスするには、通常のアクセス権とSELinuxアクセス権の両方が必要である点です。そのため、rootとしてプロセスを実行していても、プロセスおよびファイルやリソースのSELinuxセキュリティコンテキストによって、ファイルやリソースへのアクセスが拒否されることがあります。
SELinuxの起動・停止と状態確認
SELinuxの状態は以下のいずれかになります:
- enforcing(強制モード)
- permissive(警告モード)
- disabled(無効状態)
SELinuxの状態を確認するには:
cat /etc/selinux/config
SELinuxの状態を変更するには:
sudo setenforce 0|1
1: enforcing(有効な強制モード)
0: permissive(有効な警告モード)
disabled: 無効状態
有効状態と無効状態の間で切り替える場合は、システムの再起動が必要です。
SELinuxセキュリティコンテキストのアクセスルール
WebサーバーのHTTPDプロセスはSELinuxコンテキストsystem_u:system_r:httpd_tというラベルが設定されています。このコンテキストの重要な部分は、コロンで区切られた3番目のフィールド、つまりSELinuxタイプ(httpd_t)です。
システム上のファイルやリソースにもSELinuxコンテキストラベルが設定されており、重要な部分はSELinuxタイプです。例えば、/var/www/html内のファイルはhttpd_sys_content_tタイプを持っています。/tmpや/var/tmp内のファイルは通常tmp_tタイプです。
SELinuxポリシーには、httpd_tとして実行されるプロセスがhttpd_sys_content_tでラベル付けされたファイルにアクセスを許可するルールがあります。これらのプロセスがtmp_tでラベル付けされたファイルにアクセスするルールは存在しないため、通常のファイル権限がアクセスを許可していても、そのアクセスは拒否されます。
SELinuxが無効になっている場合、vsftpdサービスにはセキュリティラベルがありません。SELinuxが強制モードまたは警告モードの場合、システム再起動時にすべてのサービスにセキュリティラベルが追加されます。
SELinuxの異なるレベルでのファイル管理
- 無効状態の場合:クライアントはpubディレクトリに移動したファイルを確認できます
- 強制モードの場合:クライアントはpubディレクトリに移動したファイルを確認できません
- 警告モードの場合:クライアントはpubディレクトリに移動したファイルを確認できますが、警告ログが生成されます
サーバー側の警告ログには、アクセス試行に関する情報が記録されます。
ファイルのセキュリティコンテキスト設定
実験環境(FTPのデフォルト公開ディレクトリの変更)では、新しいディレクトリとファイルを作成する必要があります。
ディレクトリのセキュリティコンテキストを確認するには:
ls -Zd /ディレクトリのパス
一時的にコンテキストを変更(再起動後は無効になります):
sudo chcon -t 新しいタイプ /ファイルのパス
デフォルトのタイプ(default_t)から変更しない場合、ユーザーがログインしてもファイルは表示されません。
永続的なコンテキスト変更には:
- セキュリティコンテキストリストを確認:
semanage fcontext -l - 指定ディレクトリをセキュリティコンテキストリストに追加:
sudo semanage fcontext -a -t タイプ -r /ディレクトリのパス - セキュリティコンテキストリストを再読み込み:
sudo restorecon -RvvF /ディレクトリのパス
SELinuxブール値の管理
SELinuxブール値はSELinuxポリシーの動作を変更するスイッチです。SELinuxブール値は有効または無効にできるルールです。セキュリティ管理者はSELinuxブール値を使用してポリシーを調整し、特定の要件に合わせて動作を選択的に変更できます。
多くのパッケージには_selinux(8)のmanページがあり、使用されている一部のブール値が詳細に説明されています。これらのマニュアルはman -k '_selinux'で簡単に見つけることができます。
ブール値を表示するにはgetseboolを使用し、変更するにはsetseboolを使用します。setsebool -Pを使用すると、SELinuxポリシーを変更して変更を永続的に保持できます。semanage boolean -lはブール値とその永続的な状態を表示します。
SELinuxでサービスのブール値を確認するには:
getsebool -a
ftp_home_dirがオフの場合、ローカルユーザーはログインしても操作できません。
ブール値を変更してサービスを有効にする:
sudo setsebool -P ftp_home_dir on
(-Pは永続的な変更を意味します。offでサービスを無効にします。)
ftp_home_dir機能を有効にすると、ローカルユーザーはログイン後に関連する権限を持ちます。