term タグ別の記事一覧

SELinuxを有効にしている場合にDockerコンテナからホストのファイルシステムにアクセスできない場合の対処法

 dockerでローカルのファイルシステムをコンテナ内にマウントして利用するとき、パーミッションは適切なはずなのにそのディレクトリにアクセスできないトラブルに遭遇(環境はFedora 25)。

 とりあえず、SELinuxの状況を確認。

# getenforce
Enforcing

 有効となっていたので、ログ(/var/log/audit/audit.log)を確認。次のように対象ディレクトリ(ここでは「hal」)に対するログが見つかった。つまり、SELinuxによってアクセスがブロックされていたということ。

type=AVC msg=audit(1520416357.374:153155): avc:  denied  { write } for  pid=18595 comm="java" name="hal" dev="dm-0" ino=398292 scontext=system_u:system_r:container_t:s0:c825,c930 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=dir permissive=0

 細かくSELinuxのルールを設定するのが適切なのだが、今回はテスト環境なので次のようにしてcontainer_tに関するアクセス制御を全部無効にすることで対処。

# semanage permissive -a container_t

mod_wsgiでeasy_installとかでインストールしたPythonモジュールを読み込めない場合の対処

 WSGIを使ってWebアプリケーションを実装して、Apache+mod_wsgi環境で実行しようとした場合に、特定のモジュールがインポートできないという問題が発生することがある。具体的には、SELinuxが有効な状態で、easy_installなどでインストールしたPythonモジュールをインポートできないというものだ。この場合、以下のようにしてPythonのsite-packagesディレクトリのラベルを修正することで対応できる。

# restorecon -FRv /usr/lib/python2.7/site-packages/

SELinux有効下でhttpdから特定のディレクトリへのアクセスを許可する

 SELinuxを有効にしていると、httpdがアクセスできるディレクトリに制限がかかる。それを解除するための手順メモ。

 まず、semanageコマンドでhttpdからのアクセスを許可するディレクトリを登録する。

# semanage fcontext -a -t httpd_sys_content_t <対象ディレクトリ>

 なお、semanageコマンドがインストールされていない場合はpolicycoreutils-pythonパッケージをインストールすればOK。

 次に、そのディレクトリに対しrestoreconコマンドを実行してラベルを設定させる。

# restorecon <対象ディレクトリ>

 最後にls -Zコマンドで適切にラベルが設定されているかを確認する。例えば下記の例は/foobarをhttpdからアクセス可能にしたもの。

# ls -Zd /foobar
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 /foobar

 あとは適切にパーミッションを設定すればOK。