読者です 読者をやめる 読者になる 読者になる

exlar's IT note

ITやスマートデバイスを中心とした趣味情報の寄せ集め

Sambaで共有したフォルダがSELinux環境でアクセス不可だった時の対処

Linux SELinux Samba

ファイルサーバでSELinuxを有効化(enforcing)して付き合う

SELinuxは不正侵入の防止が目的ではなく、不正侵入後の被害拡大防止を目的が目的とされています。CentOSをインストールすると標準でSELinuxが有効になりますが、煩わしいという理由で即無効化(SELINUX=disabled)してしまう説明記事を多く見かけるのは何故でしょう。

確かに面倒なのですが、特別な事情もなくあえてセキュリティリスクを拡大させる必要もないわけです。そこで、極力SELinuxを有効化したまま向き合うようにしています。

他記事の受け売りですが、現在のSELinuxは標準設定でかなり最適化されているため、Webサーバ等の代表的な用途であればほぼ実害無く運用できるようです。実際、自宅サーバ用途(ファイル共有、Webサーバ、その他開発試験環境)においてドハマりしたのはSambaのファイルサーバくらいです。

ここではSambaで苦労した点を記録します。

SELinuxとは何か

個人的な理解では以下のとおり。
※ SELinuxはなかなか難しく理解しきれていないため、以降の記載は抽象的な表現も多くなりますがご了承を下さい。

SELinuxではプロセス、ポート番号、ファイルに対し、パーミッションやオーナとは別のタイプ属性(ラベルのようなもの)を付与し、属性同士のアクセス可否をホワイトリストで定義することで不必要なアクセスを拒否するもの。

そして、SELinuxと上手く付き合うためには以下を徹底することとしました。

標準で設定されているポリシを可能な限り踏襲する。

共有したホームディレクトへアクセスできない場合

ホームディレクトリのファイルは少々特殊なタイプ(user_home_t)が付与されます。これがついていると色々アクセス制限が厳しくなるので、なんでもかんでもホームディレクトリに格納するのは辞めた方が良いです。例えば、複数ユーザで共有するディレクトリやファイルはその典型。

当然、ホームディレクトリのポリシを細く設定すれば回避可能ですが、あえてイレギュラーなものを共存する必要はなく、ホーム以外へ追い出すだけでかなり楽になると感じます。従って、ここではシンプルに考えます。

とはいえ、ホームにアクセスしたいこともあるでしょう。ホームディレクトリのファイル群にSamba経由でアクセス拒否される場合は、おそらく以下の設定で解決します。

samba ホームディレクトリへのアクセス権限を確認

# getsebool samba_enable_home_dirs
samba_enable_home_dirs –> off 

これがOFFになっているとNG。

アクセスを許可する

# setsebool -P samba_enable_home_dirs 1 

先ほどと同様の以下コマンドを実行し、offだった部分がonになっていることを確認する。

# getsebool samba_enable_home_dirs
samba_enable_home_dirs –> on

複数ユーザで共有するファイル群を格納するディレクトリのポリシ設定

SELinuxポリシ管理ツールの導入

semanageというツールを使うと現在の設定値を確認や変更が簡単になりますが、CentOS 6.4をインストールした時にはsemanageが入っていませんでした(OSインストール時のパッケージ選択がシンプルすぎたか?)。

yum で以下パッケージをインストールすることで利用可能になります。

yum install policycoreutils-python

SambaとHTTPDで同一リソースを共有する場合のタイプ設定

public_content_rw_t タイプを付与することでSambaでの共有、及びHTTPサーバでのアクセスが両立できます。
※ このケースでは、/mnt/share というディレクトリを新規で作成して共有フォルダにする想定です。

sudo semanage fcontext -a -t public_content_rw_t '/mnt/share1(/.*)?'
sudo semanage fcontext -a -t public_content_rw_t '/mnt/share2(/.*)?'

# (-a は add, -t はタイプ,最後の引数は正規表現可能)

必要な数だけタイプの設定ポリシを追加し、それが反映されたかを以下コマンドで確認します。
(-l オプションでリスト表示が可能ですが膨大なため、必要部分を grep しているだけです)

sudo semanage fcontext -l | grep '/mnt'

内容が問題なければ、restorecon コマンドを実行しタイプの再付与を行います。

sudo restorecon -Rv /mnt

新規作成ファイルであれば上位ディレクトリを継承するので問題ありませんが、他のタイプが付与されたディレクトリからの移動を行った場合は古いタイプが残りますので、本コマンドでの再付与が必要になります。

(参考) 書き込みしたい場合の設定

setsebool -P allow_httpd_anon_write 1 # httpdで書き込みが必要な場合
setsebool -P allow_smbd_anon_write 1  # sambaで書き込みが必要な場合