Fedoraでは,Fedora core 2からSELinuxが導入されています。FedoraサーバーはSELinuxの設定が難しいため,長年当方の業務サーバーでもOFF(disable)にしていました。システムのセキュリティを高めるSELinuxは,強力な機能を持つ一方で,初めて導入する際には設定や運用が複雑で戸惑うこともあります。ここでは,SELinuxの初期設定から運用までのポイントを具体例とともに解説します。
- 初期設定:SELinuxを「Permissiveモード」で開始する
SELinuxを導入する際には,まず「Permissiveモード」で動作させ,エラーや警告を監視できる状態に設定するのが良い方法です。
- カーネルパラメータの設定変更
SELinuxを完全に無効化(disable)するのではなく,監査モードでエラーを検出できるようにします。
grubby --update-kernel ALL --remove-args selinux
vi /etc/selinux/config
↓
SELINUX=permissive
上記の設定変更後,システムをリブートします。
- エラー確認コマンド
SELinux関連のエラーは以下のコマンドで確認できます。
#直近10分前のエラー
ausearch -m AVC,USER_AVC,SELINUX_ERR -ts recent
#今日発生したエラー
ausearch -m AVC,USER_AVC,SELINUX_ERR -ts today
#昨日と今日のエラー
ausearch -m AVC,USER_AVC,SELINUX_ERR -ts yesterday
各アプリケーションごとの設定例
SELinuxでは,アプリケーションごとに必要な権限を付与する必要があります。以下に具体例を示します。
- Samba(ファイルサーバー)
Windowsからファイル共有する場合,以下の設定を行います。
setsebool -P samba_export_all_ro=1 samba_export_all_rw=1
- OpenVPN(VPNサーバー)
使用するポートを指定してSELinuxに許可を与えます。
semanage port -a -t openvpn_port_t -p tcp 利用ポート
- Apache(Webサーバー)
Apacheでファイル出力やCGI実行を行う場合の設定例です。
- ファイル出力用ディレクトリ
chcon -R -t httpd_sys_rw_content_t /var/www/cgi-bin/tmp
- CGIファイルの実行権限
chcon -t -R httpd_sys_script_exec_t /var/www/cgi-bin/tmp/*.cgi
- (例)特に昔のPukiWikiについては,以下の設定でうまくいました。
chcon -R -t httpd_sys_rw_content_t /var/www/cgi-bin/Pukiwiki
chcon -t httpd_sys_script_exec_t /var/www/cgi-bin/Pukiwiki/
chcon -R -t httpd_sys_script_exec_t /var/www/cgi-bin/Pukiwiki/plugin
- WordPress(CMS)
WordPressは複数の設定が必要です。以下に代表的な例を示します。
- ネットワーク接続の許可
setsebool -P httpd_can_network_connect_db 1
setsebool -P httpd_can_network_connect=on
- ディレクトリごとの権限設定
#wordpressディレクトリのファイル権限の設定
semanage fcontext -a -t httpd_sys_content_t "/var/www/cgi-bin/wordpress(/.)?"
semanage fcontext -a -t httpd_sys_script_exec_t "/var/www/cgi-bin/wordpress/..php"
restorecon -R -v /var/www/cgi-bin/wordpress
#wordpressのcontentディレクトリのファイル権限の設定
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/wordpress/wp-content(/.*)?"
restorecon -R -v /var/www/cgi-bin/wp-content
#wordpressのincludesディレクトリのファイル権限の設定
semanage fcontext -a -t httpd_sys_script_exec_t "var/www/cgi-bin/wordpress/wp-includes/.*.php"
restorecon -R -v /var/www/cgi-bin/wordpress/wp-includes/
- プラグインやメール配信(例:MW WP Formプラグイン)
setsebool -P httpd_can_sendmail 1
任意のアプリーケーション
アプリケーションの動作でエラーが発生する場合,SELinuxログを基にカスタムルールを作成します。以下はルール作成の手順です。
- エラーログを確認とポリシーの作成
ausearch -m AVC --start '11/29/24' --end now
(出力例)
time->Tue Dec 3 xx:xx:xx 2024
type=PROCTITLE msg=audit(xxxxxxxxxxxx.xxx:xxxxx): proctitle=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
type=SYSCALL msg=audit((xxxxxxxxxxxx.xxx:xxxxx): arch=x00000xx syscall=xxx success=no exit=-13 a0=ffffffxx a1=xxxxxxxxxxxxxxxxx a2=0 a3=0 items=0 ppid=xxxxx pid=xxxxx auid=xxxxxxxxxxx uid=xx gid=xx euid=xx suid=xx fsuid=xx egid=xx sgid=xx fsgid=xx tty=(none) ses=xxxxxxxxxxx comm=”xxxx” exe=”/usr/sbin/xxxxxxxxx” subj=system_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(xxxxxxxxxxxxxxx.xxx:xxxxx): avc: denied { read } for pid=xxxxx comm=”xxxx” name=”xxxx.xxxx” dev=”dm-0″ ino=xxxxxxxxx scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:postfix_etc_t:s0 tclass=file permissive=0
tmp_ruleがルール名としてアプリケーション実行日と開始時間を下記に入れて,実行後,素早く実行します。
#下記の例 '月/日/年(2桁)' '時:分:秒'
ausearch -m AVC --start '11/29/24' '20:39:40' --end now | audit2allow -a -M tmp_rule
これにより,tmp_rule.pp
(ポリシーファイル)が生成されます。
- ポリシーの適用
semodule -i tmp_rule.pp
- ルールを適用してauditaのエラーが出なくなるかを確認します。
ausearch -m AVC,USER_AVC,SELINUX_ERR -ts recent
この方法により,faxやefaxというFAXサーバーについても問題なく運用できるようになりました。
・SELinuxの有効化
1日2日「SELINUX=permissive」のまま
ausearch -m AVC,USER_AVC,SELINUX_ERR -ts yesterday
を入力してログを確認して以下のようにエラーが出なくなることを確認します。
<no matches>
これにより,SELinuxを起動させます。
setenforce 1
vi /etc/selinux/config
↓
SELINUX=enforcing
これによって晴れてSELinuxが運用できるようになりました。
運用上の注意点
- SELinuxは強力なセキュリティを提供しますが,設定ミスやエラーが原因でアプリケーションが動作しないことがあります。そのため,導入時は「Permissiveモード」で充分に検証してください。
- 運用中に発生する問題は,適宜ログを確認し,必要に応じてカスタムルールを作成します。
SELinuxの導入と運用には一定の時間と手間がかかりますが,正しく設定すれば堅牢なセキュリティを実現できます。ぜひ,計画的に導入を進めてみてください。