CentOSをインストールすると標準でSELinuxが有効になりますが、煩わしいという理由で即無効化(SELINUX=disabled)してしまう説明記事を多く見かけます。
SELinuxは不正侵入の防止ではなく、不正侵入後の被害拡大防止が目的です。特別な事情もなくあえてセキュリティリスクを拡大させる必要はないので、極力SELinuxを有効化したまま向き合うようにしています。
実際、自宅サーバ用途(ファイル共有、Webサーバ、開発試験環境)においてドハマりしたのはSambaくらいです。ここではその対処を記録します。
SELinuxの基本的な考え方
SELinuxではプロセス・ポート番号・ファイルに対して、パーミッションやオーナとは別のタイプ属性(ラベル)を付与し、属性同士のアクセス可否をホワイトリストで定義することで不必要なアクセスを拒否します。
上手く付き合うためのポイントは標準で設定されているポリシを可能な限り踏襲することです。
ホームディレクトリへのアクセスが拒否される場合
ホームディレクトリのファイルには user_home_t という特殊なタイプが付与されます。Samba経由でアクセス拒否される場合は、以下の設定を確認します。
# 現在の設定を確認
getsebool samba_enable_home_dirs
# samba_enable_home_dirs --> off
# アクセスを許可
setsebool -P samba_enable_home_dirs 1
# 確認
getsebool samba_enable_home_dirs
# samba_enable_home_dirs --> on
ただし、複数ユーザで共有するディレクトリやファイルをホームに置くのは推奨しません。ホーム以外に配置するだけでかなり楽になります。
共有ディレクトリのタイプ設定
SambaとHTTPDで同一リソースを共有する場合は public_content_rw_t タイプを付与します。
# SELinuxポリシ管理ツールの導入
yum install policycoreutils-python
# タイプの設定(例: /mnt/share1, /mnt/share2)
sudo semanage fcontext -a -t public_content_rw_t '/mnt/share1(/.*)?'
sudo semanage fcontext -a -t public_content_rw_t '/mnt/share2(/.*)?'
# 設定の確認
sudo semanage fcontext -l | grep '/mnt'
# タイプの再付与
sudo restorecon -Rv /mnt
新規作成ファイルは上位ディレクトリのタイプを継承しますが、他のディレクトリから移動したファイルは古いタイプが残るため、restorecon での再付与が必要です。
書き込みを許可する場合
setsebool -P allow_httpd_anon_write 1 # httpd経由の書き込み
setsebool -P allow_smbd_anon_write 1 # samba経由の書き込み
補足: CentOS7でSambaが起動しない場合
CentOS 6.xから7へアップグレードした際に systemctl start smb が失敗するケースがありました。チェックポイントは以下の通りです。
systemctl list-unit-filesでsmb.serviceがenabledになっているか/etc/samba/smb.confが正しく設定されているか
CentOS 6→7でプロセス管理機構(init→systemd)が大幅に変わるため、アップグレードではなく新規インストールした方がよいと改めて感じました。

