SELinuxの導入には検証が必要

Fedoraでは,Fedora core 2からSELinuxが導入されています。FedoraサーバーはSELinuxの設定が難しいため,長年当方の業務サーバーでもOFF(disable)にしていました。システムのセキュリティを高めるSELinuxは,強力な機能を持つ一方で,初めて導入する際には設定や運用が複雑で戸惑うこともあります。ここでは,SELinuxの初期設定から運用までのポイントを具体例とともに解説します。


  1. 初期設定:SELinuxを「Permissiveモード」で開始する

SELinuxを導入する際には,まず「Permissiveモード」で動作させ,エラーや警告を監視できる状態に設定するのが良い方法です。

  • カーネルパラメータの設定変更
    SELinuxを完全に無効化(disable)するのではなく,監査モードでエラーを検出できるようにします。
grubby --update-kernel ALL --remove-args selinux

vi /etc/selinux/config

SELINUX=permissive

上記の設定変更後,システムをリブートします。

  1. エラー確認コマンド
    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では,アプリケーションごとに必要な権限を付与する必要があります。以下に具体例を示します。


  1. Samba(ファイルサーバー)

Windowsからファイル共有する場合,以下の設定を行います。

setsebool -P samba_export_all_ro=1 samba_export_all_rw=1
  1. OpenVPN(VPNサーバー)

使用するポートを指定してSELinuxに許可を与えます。

semanage port -a -t openvpn_port_t -p tcp 利用ポート
  1. 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
  1. 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ログを基にカスタムルールを作成します。以下はルール作成の手順です。

  1. エラーログを確認とポリシーの作成
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(ポリシーファイル)が生成されます。

  1. ポリシーの適用
semodule -i tmp_rule.pp
  1. ルールを適用して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の導入と運用には一定の時間と手間がかかりますが,正しく設定すれば堅牢なセキュリティを実現できます。ぜひ,計画的に導入を進めてみてください。

SELinuxのPermissiveの検証でサーバーにリブートし続ける症状が発生

FedoraサーバーでSELinuxを有効にした際の検証プロセスについて,以下の手順と注意点をまとめました。

SELinuxの有効化とモードの設定

内部サーバーのセキュリティ強化のため,SELinuxを有効にしてPermissiveモードでの検証を行いましたが,今回発生した不具合と対処方法を示します。

SELinuxの有効化手順

1.grubbyコマンドを使用してSELinuxを有効化
SELinuxを有効化したい場合,以下のコマンドを使用します。

grubby --update-kernel ALL --remove-args selinux

2.SELinuxのPermissiveモードへの切り替え
SELinuxを有効にしてもいきなりファイルアクセスが制限されないよう,Permissiveモードで動作検証します。これはSELinuxの設定ファイルを編集することで行います。

vi /etc/selinux/config
SELINUX=enforcing

SELINUX=permissive

予期せぬリブートの問題

SELinuxの初回有効化時,ファイルの再ラベリングが自動的に行われるため,その影響でシステムがリブートを繰り返す現象が発生しました。ログによると,/dev 以下でのエラーや,一部の手動で作成したサービスがリブート時に問題を引き起こしていたようです。

対処方法:手動での再ラベリング

1.レスキューモードでの起動
ブートローダーのメニュー画面でレスキューモードの位置で「e」キーを押し,編集画面から「F10」でブートを開始します。

2.手動ラベリングの実行
root権限でログインし,次のコマンドを使って手動で再ラベリングを行います。

/sbin/fixfiles -f -F relabel
reboot

3.再起動後の確認
正常に起動できることを確認し,Permissiveモードでの検証を続けます。

結果と考察

手動の再ラベリングによって,Permissiveモードでのシステムの安定起動が確認できました。なお、手動で作成したサービスや/dev以下のファイルに起因するSELinux関連のエラーが発生する場合には,上記の再ラベリングの作業をする必要があると考えられます。

SELinuxの設定はかなり難しいと感じていますが,今後いつか設定方法をご報告できたらと思います。