>お楽しみコーナー>Linux>SELinux サイトマップ 最終更新日:2005/07/22

センリュウのホームページへ ようこそ!

 SELinux   

FedoraCore3でSELinuxを試してみました。

 FedoraCore3のSELinux 

Targetedポリシー
FedoraCore3ではデフォルトで、Targetedポリシーで起動するようになっている。これは、dhcpd、httpd、namedなど、一部が制限を受け、その他はunconfined_tという全く制限を受けないドメインに設定されている。
ポリシーファイルは、/etc/selinux/targeted/src/policy/以下にある。
tagetedポリシーは手軽だがそのぶん安易な設定になっているので注意。

Strictポリシー
これまで通りの(FedoraCore2と同じ)厳密な通常のポリシー。
Strictポリシーに変更するには、
/etc/selinux/strict/src/policy/で # make reload relabel
/etc/sysconfig/selinuxを編集し、SELINUXTYPE=targetedをstrictに変更。
再起動。

booleanの採用について
FedoraCore3ではあらかじめ定められた項目については、booleanを使って簡単に設定を調整できるようになっている。
# getsebool -a  booleanの設定値がわかる。
# setsebool httpd_enable_cgi false  → OFF
# setsebool httpd_enable_cgi true  → ON
booleanを用いると、reloadでポリシーを再読込することなく、SELinuxのポリシーを変更することができる。
GUIでは、# system-config-securitylevel 。

ここでは、Strictポリシーを採用することにします。(最初、起動はpermissiveモードで)
@ # setenforce=0
A # cd /etc/selinux/strict/src/policy
# make clean
# make reload
# make relabel
B/etc/sysconfig/selinuxの編集
SELINUX=permissive
SELINUXTYPE=strict
C再起動

しかしこのままだと、# setenforce=1でSELinuxを有効にしたとき、
FTP(vsftpd)は、ユーザー、anonymousともダメ。
メールは、postfixは、OKですが、dovecotはダメ。
WWWは、ユーザーのCGI利用以外はOKとなりました。

 再設定 

FTP(vsftpd)

anonymousは、ダウンロードのみとする。
前提として、ここでは、xinetd経由でvsftpdを使う設定にしている。

まず、# system-config-securitylevelを実行して、FTPの「Allow ftpd to run directly without inetd」(スタンドアローンの設定)を切る。
また、/etc/selinux/strict/src/policy/domains/program/ftpd.teをunusedディレクトリにコピーしておく。(元に戻せるようにしておく。)

新たにログを取り出す準備
# cd /etc/selinux/strict/src/policy
# make clean
# make reload
このサーバーにリモートアクセスして、ファイルのアップとダウンロードなどを行ってみる。

以下を実行して、必要な設定をftpd.teファイルに書き込む。
# audit2allow -d -l -o /etc/selinux/strict/src/policy/domains/program/ftpd.te
以下の内容が新たに必要なことが判明する。
allow ftpd_t httpd_user_content_t:dir { add_name create getattr read remove_name rmdir search write };
allow ftpd_t httpd_user_content_t:file { append create getattr rename unlink };
allow ftpd_t selinux_config_t:file { getattr read };
allow ftpd_t var_t:dir { read };  以下2項はanonymous
allow ftpd_t var_t:file { getattr read };

しかしこの設定だと、ftpd_tの権限でタイプvar_tに(/var以下のディレクトリ、ファイル)にアクセスできてしまう。そこで新しいタイプftppub_tを作って、もう少し修正してやる必要がある。
@タイプftppub_tの宣言
/etc/selinux/strict/src/policy/domains/program/ftpd.te
  type ftppub_t,file_type,sysadmfile;
Aタイプftppub_tの付与
/etc/selinux/strict/src/policy/file_contexts/program/ftpd.fc
  /var/ftp(/.*)? system_u:object_r:ftppub_t
  /var/ftp(/.*)?は/var/ftpディレクトリ以下を指す。
Bアクセス許可の設定
/etc/selinux/strict/src/policy/domains/program/ftpd.te
  allow ftpd_t ftppub_t:dir { read };
  allow ftpd_t ftppub_t:file { getattr read };

再びテストしてみる。
# cd /etc/selinux/strict/src/policy
# make clean
# make reload
# make file_contexts/file_contexts
# setfiles file_contexts/file_contexts /var/ftp
設定が成功しているか見ておく。# ls -Z /var/ftp/pub  var_tがftppub_tになっているか。
サーバーにリモートアクセスして、ファイルのアップとダウンロードを行い、再びログをとる。
# audit2allow -d -l -o /etc/selinux/strict/src/policy/domains/program/ftpd.te

最終的付加内容
/etc/selinux/strict/src/policy/file_contexts/program/ftpd.fc
  /var/ftp(/.*)? system_u:object_r:ftppub_t
/etc/selinux/strict/src/policy/domains/program/ftpd.te
  allow ftpd_t httpd_user_content_t:dir { add_name create getattr read remove_name rename rmdir search write setattr };
  allow ftpd_t httpd_user_content_t:file { append create getattr rename unlink read write setattr };
  allow ftpd_t selinux_config_t:file { getattr read };
  type ftppub_t, file_type, sysadmfile;
  allow ftpd_t ftppub_t:dir { read getattr search };
  allow ftpd_t ftppub_t:file { getattr read };

dovecot

ftpと同様に。
/etc/selinux/strict/src/policy/domains/program/ftpd.teに以下を追記。
  allow dovecot_auth_t selinux_config_t:dir { search };
  allow dovecot_auth_t selinux_config_t:file { getattr read };
  allow dovecot_t usr_t:file { getattr read };

apache  CGIを使う場合(/home/ユーザー/cgi-binのCGI)

apache.teをunusedディレクトリにコピーしておく。(元に戻せるようにしておく。)

最初は単純にログをとってみる。
/etc/selinux/strict/src/policy/domains/program/apache.te
  allow httpd_t user_home_t:dir { search };
  allow httpd_t user_home_t:file { execute execute_no_trans getattr ioctl read };

しかし、これだとexecute_no_transを使うことになって危険。
vsftpdのときと同じようにやりなおす。

/etc/selinux/strict/src/policy/file_contexts/program/apache.fc
  /home/[^/]+/cgi-bin/.* system_u:object_r:httpd_sys_script_exec_t

再びテストしてみる。
# cd /etc/selinux/strict/src/policy
# make file_contexts/file_contexts
# setfiles file_contexts/file_contexts /home
設定が成功しているか見ておく。# ls -Z /home/foo/cgi-bin等。
# make clean
# make reload


WWWサーバーにCGIアクセスして、再びログをとる。
# audit2allow -d -l -o /etc/selinux/strict/src/policy/domains/program/apache.te

/etc/selinux/strict/src/policy/domains/program/apache.te最終的付加内容
  allow httpd_sys_script_t httpd_user_content_t:dir { search };
  allow httpd_sys_script_t httpd_user_content_t:file { getattr ioctl read };
  allow httpd_sys_script_t sysctl_kernel_t:dir { search };
  allow httpd_sys_script_t sysctl_kernel_t:file { read };
  allow httpd_sys_script_t user_home_dir_t:dir { search };
  allow httpd_sys_script_t user_home_t:dir { search };
  allow httpd_t user_home_t:dir { search };

/etc/selinux/strict/src/policy/tunables/tunable.tun
dnl define(`user_canbe_sysadm')  user_canbe_sysadmは切っておいた方が安全。
編集したら、# make reload で設定を反映しておく。

最後に
/etc/sysconfig/selinuxを編集してenforcingモードで起動するようにしておく。
SELINUX=enforcing


履歴  2005年1月  作成