ytooyamaのブログ

サーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。

SELinuxをオンにしてOpenStackを動かす(前編)

あのスクリプトを使って、2NodeのOpenStack Icehouse環境を構築して問題なく動いたんだけど、今や小規模なOpenStackを動かせてもドヤ顔できないのでSELinuxを有効化してみました。対象とする構成は次のような感じです。

間違っていたらごめんなさい。ちなみにFedora 20で構築した環境です。

  • Nova Controller兼Computeサーバー
  • Neutron Networkサーバー(←今回の生け贄)

■やったこと

まずは構成を確認します。見事にNetwork関連しか動いていないノードですね。

# openstack-status
== neutron services ==
neutron-server: inactive (disabled on boot)
neutron-dhcp-agent: active
neutron-l3-agent: active
neutron-metadata-agent: active
neutron-lbaas-agent: inactive (disabled on boot)
neutron-openvswitch-agent: active
neutron-linuxbridge-agent: inactive (disabled on boot)
neutron-ryu-agent: inactive (disabled on boot)
neutron-nec-agent: inactive (disabled on boot)
neutron-mlnx-agent: inactive (disabled on boot)
== Support services ==
openvswitch: active
dbus: active

SELinuxのパラメータを確認してみます。ここら辺がOpenStack関連と関係しそうなところみたいです。

# getsebool -a
..
mysql_connect_any --> off
glance_use_fusefs --> off
neutron_can_network --> off
swift_can_network --> off
telepathy_connect_all_ports --> off
telepathy_tcp_connect_generic_network_ports --> on
selinuxuser_direct_dri_enabled --> on
selinuxuser_execheap --> off
selinuxuser_execmod --> on
selinuxuser_execstack --> on
selinuxuser_mysql_connect_enabled --> off
selinuxuser_ping --> on
selinuxuser_postgresql_connect_enabled --> off
selinuxuser_rw_noexattrfile --> on
selinuxuser_share_music --> off
selinuxuser_tcp_server --> off
selinuxuser_use_ssh_chroot --> off
...

必要そうな設定はここらへんでしょうか。

mysql_connect_any --> off
neutron_can_network --> off
selinuxuser_mysql_connect_enabled --> off

設定を実行してみます。

# getsebool -a mysql_connect_any on
# getsebool -a neutron_can_network on
# getsebool -a selinuxuser_mysql_connect_enabled on

許容モードから、強制モードへの変更をしてみます。

# setenforce 1

AVCなログを確認してみます。
何か引っかかりました。

# cat /var/log/audit/audit.log | grep -i avc

type=AVC msg=audit(1412154538.448:924914): avc: denied { remove_name } for pid=22922 comm="neutron-rootwra" name="UserDict.pyc" dev="dm-0" ino=394881 scontext=system_u:system_r:neutron_t:s0 tcontext=system_u:object_r:lib_t:s0 tclass=dir permissive=1
type=AVC msg=audit(1412154538.448:924914): avc: denied { unlink } for pid=22922 comm="neutron-rootwra" name="UserDict.pyc" dev="dm-0" ino=394881 scontext=system_u:system_r:neutron_t:s0 tcontext=system_u:object_r:lib_t:s0 tclass=file permissive=1
type=AVC msg=audit(1412154538.463:924915): avc: denied { add_name } for pid=22922 comm="neutron-rootwra" name="UserDict.pyc" scontext=system_u:system_r:neutron_t:s0 tcontext=system_u:object_r:lib_t:s0 tclass=dir permissive=1

対応方法が書かれていました。

バグを参考に実行してみます...と、その前にsemanageコマンドをインストールします。

# yum provides /usr/sbin/semanage
読み込んだプラグイン:changelog
...
policycoreutils-python-2.2.5-4.fc20.i686 : SELinux policy core python utilities
リポジトリー : @updates
一致 :
ファイル名 : /usr/sbin/semanage
(policycoreutils-pythonパッケージを入れればいいようです)
# yum install policycoreutils-python

準備が出来たので、実行してみます。

# semanage fcontext -a -t neutron_exec_t /usr/bin/neutron-rootwrap
# restorecon /usr/bin/neutron*

ログを確認して新たなエラーが出ていないことを確認します。

# tail -f /var/log/audit/audit.log

Neutron周りのエラー(通信ができないなど)が吐き出されていないことを確認します。

# watch ls -lh /var/log/neutron/
# watch ls -lh /var/log/openvswitch/

大丈夫そうなのでenforcingモードに設定変更します。

# vi /etc/selinux/config
SELINUX=enforcing

再起動してsestatusを実行しenableとなっていること、openstack-statusを実行してエラーがないことを確認します。

# sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 29

という感じです。2週間くらい経ちましたが、特に障害は起きていません。
次はもう片方のノードですが、これは色々コンポーネントがつまっていて大変そうです。後編が書けたら良いなあ。

このブログサイトはJavaScriptを使っていますが、読み込んでいるJavaScriptは全てはてなが提供しているものであり、筆者が設置しているものではありません。