実践Linux
SELinux SELinux 目次へ TOP(HOME)へ
SELinux基本設定 2017年9月更新
●動作モード
selinuxには、「permissiveモード」、「enforcingモード」がある。
現在のモードをみるには # getenforce
モードを変える
# setenforce permissive または 0 → permissive
# setenforce enforcing または 1 → enforcing
ただし、このコマンドは一時的にモードを切り替えるだけ。PCを再起動すると元に戻る。
恒久的に変更したい場合は、/etc/selinux/configに書き込まれているSELINUX=を直接編集する。
●Selinux
ユーザーにはロール、プロセスにはドメイン、リソースにはタイプといったラベルが付与され、ユーザーはどのドメインを許可されているか、ドメインがタイプに対してどのような操作ができるか(アクセスベクタ)を決めていく。
現在のロールを知るには、 # id -Z
現在動作しているプロセスのドメインを知るには、 # ps -eZ
ディレクトリやファイルのタイプを知るには、 # ls -dZ ファイル(ディレクトリ)
# ls -Z ディレクトリ ディレクトリ以下の情報
●booleanによるポリシーの設定
CentOS5ではデフォルトで、targetedポリシーで起動するようになっている。これは、dhcpd、httpd、namedなど、一部が制限を受け、その他はunconfined_tという全く制限を受けないドメインに設定されている。
これは、booleanを使って簡単に各ポリシーを有効にしたり無効にしたりすることができるようになっている。
全ポリシーの内容表示 # getsebool -a | less
ポリシーのON、OFF # setsebool -P ポリシー on
●GUIによる設定(CentOS5に限って。この類のものはあまり使わないので以降インストールしないことにした。)
policycoreutils-guiのインストール。
# yum list installed | grep policy インストールされているかどうかの確認
# yum install policycoreutils-gui インストール
システム→管理→SELinux Management
SELinux の基本コマンド
◆.setenforce
permissive、enforcingモードを一時的に切り替えるコマンド 。
# setenforce 0 permissive モード (SELinux の動作を抑える)。
# setenforce 1 enforce モード (SELinux を動作させる)。
◆ls
オプションに -Z をつければ、タイプを表示することができる。
# ls -Z
◆chcon
ファイルやディレクトリのタイプを変更する。(ただし恒久的ではない。下のsemanage参照。)
この例では、/var/smb ディレクトリ以下のディレクトリとファイルすべてのタイプを samba_share_t に変更している。
# chcon -t samba_share_t /var/smb -R
-u でユーザ、-r でロールを変更できる。
◆restorecon
タイプの不整合を修正するコマンド。
# /sbin/restorecon -RF /var/smb
-Rは再帰的に適用。-Fは強制的に適用(強制でないと変わらないときがある)。
◆setsebool
各ブーリアンパラメータを変更するコマンド。
# setsebool -P allow_smbd_anon_write 1
-Pオプションは、システムを再起動しても設定を反映するようにする。
◆semanage
ファイルに関するタイプのほか、ポートに対するタイプも変更可能なコマンド。
chcon では file_contexts ファイル内の内容は変更できないので、yum update などでポリシーをアップデートした場合は変更内容が消えてしまう。semanage
では file_contexts ファイルの内容を書き換えるのでそのような問題は起きない。
# semanage fcontext -a -t samba_share_t "/var/smb/(/.*)?"
この設定内容を反映させるには restorecon コマンドを使う。
# restorecon -RF /var/smb
設定内容を削除するには -a の代わりに -d を使用する。
# semanage fcontext -d -t samba_share_t "/var/smb/(/.*)?"
# restorecon -RF /var/smb
ポートに対するタイプを見るには
# semanage port -l
Apache に TCP 8080 番ポートを使えるようにさせるには
# semanage port -a -t http_port_t -p tcp 8080
ポートの場合は即座に設定が反映される。
実際の運用(CentOS7)
booleanのポリシーは、
# getsebool -a | less
# getsebool -a | grep samba
# getsebool -a | grep smbd
などで調べておくとよい。
●named
# ls -Z /var/named
named_zone_tならばOK。
●samba
@/home/ユーザー以下にアクセスできるようにする。
ポリシーsamba_enable_home_dirsをONにする。
# getsebool -a | less
# getsebool -a | grep samba
# setsebool -P samba_enable_home_dirs 1
Aそれ以外の場所を共有にする場合
そのディレクトリにsamba_share_tタイプを付ける。
# semanage fcontext -a -t samba_share_t "/home/samba(/.*)?"
# restorecon -RF /home/samba
●ftp
booleanのポリシーは、 # getsebool -a | grep ftpで調べておく。
ポリシーftp_home_dirがOFFでも、なぜかホ−ムにアクセスできる。
ホ−ムにアクセスできず、ONにする場合は、
# setsebool -P ftp_home_dir 1
しかし、このままでは /var/www にはアクセスできない(/home関係は、大丈夫だが)。
調査
permissiveモードにする # setenforce 0
この状態でFTPアクセス。auditのログをとる。
ログが溜まりすぎている場合は、/var/log/audit/audit.logをいったん削除して、auditdサービスを再起動しておく。audit.logが刷新されるので、それからログをとるとよい。(再起動は、# systemctl restart auditdでは失敗する。従来どおりのコマンドで、# service auditd restartで再起動。)
ログから足りない部分を解析する # audit2allow -a -l -m mylocal これは結果を表示するだけでmylocal.te等は作成されない。これを見てみると、ポリシーftpd_full_access をONにすればよいことがわかる。(多少安易なようだが、とりあえず)
# setsebool -P ftpd_full_access 1
●http
/var/www/htmlはそのままで見ることができるが、ユーザーホームで作成したpublic_html以下はそのままでは見ることはできない。
booleanのポリシーを、 # getsebool -a | grep httpで調べておく。
ポリシーhttpd_enable_homedirsをONにして、ホ−ムにアクセスできるようにする。
# setsebool -P httpd_enable_homedirs 1
以前は作成した各public_htmlに対してSELinuxの設定を反映し直しておく必要があったが、これは必要なくなったようだ。
認証
/var/www/confの場合は、なにもしなくてもパスワードファイルにアクセスできるが、/home/~/confの場合はアクセスできない。
調査
# setenforce 0
# audit2allow -a -l -m mylocal
# setenforce 1
httpd_read_user_contentをonにする必要があることがわかる。
# getsebool -a | grep httpd
# setsebool -P httpd_read_user_content on
●SSH
permissiveモードにする.
# setenforce 0
この状態でSSHアクセス。auditのログをとる。
ログが溜まりすぎている場合は、/var/log/audit/audit.logをいったん削除して、auditdサービスを再起動しておく。audit.logが刷新されるので、それからログをとるとよい。(再起動は、#
systemctl restart auditdでは失敗する。従来どおりのコマンドで、# service auditd restartで再起動。)
ログから足りない部分を解析する。
# audit2allow -a -l -m mylocal
これを見ると、ポリシーnis_enabledをONにすればよいことがわかる。
# setsebool -P nis_enabled 1
# setenforce 0
実際の運用(CentOS5)
booleanのポリシーは、
# getsebool -a | less
# getsebool -a | grep samba
# getsebool -a | grep smbd
などで調べておくとよい。
●samba
@/home以下にアクセスできるようにする。
smbd_tがuser_home_dir_tにアクセスできるようにする。(/homeに作るディレクトリはuser_home_dir_t)
ポリシーsamba_enable_home_dirsをONにする。
# setsebool -P samba_enable_home_dirs 1
Aそれ以外の場所を共有にする場合
そのディレクトリにsamba_share_tタイプを付ける。
# semanage fcontext -a -t samba_share_t "/var/samba/share(/.*)?"
# restorecon -RF /var/samba/share
# ls -Z /var/samba で確認しておく。
●mail関係
postfix、dovecotはそのままでOK。
●openVPNはunconfined_tで動いている。
●ftp
booleanのftpd_is_daemonはすでにONになっている。
/home以下にアクセスできるようにする。
ポリシーftp_home_dirをONにする。
# setsebool -P ftp_home_dir 1
●http
booleanのhttpd_builtin_scripting、httpd_enable_cgi、httpd_enable_homedirs、httpd_unified等はすでにONになっている。
しかし/var/www/htmlはそのままで見ることができるが、ユーザーホームで作成したpublic_html以下はそのままで見ることはできない。これはSELinuxのfile_contextsファイルには/home/***/puburic_html以下にはhttpd_sys_content_tタイプを付与するようになっているのだが、puburic_htmlディレクトリを作成したときに親ディレクトリに基づいてuser_home_tが付与されてしまうためである。
これを改善するには、SELinuxの設定を反映し直すだけでよい。
# restorecon -RF /home/yam/public_html
# ls -Z /home/yam で確認しておく。
◆CGIを使えるようにする(phpには必要ない)
httpd_sys_script_tドメインがアクセスできるようにする。
CGIファイルにhttpd_sys_script_exec_tタイプを付与する。
# semanage fcontext -a -t httpd_sys_script_exec_t "/home/yam/cgi-bin(/.*)?"
# restorecon -RF /home/yam/cgi-bin
# ls -Z /home/yam で確認しておく。
CGIの書き込み用ファイルにはhttpd_sys_script_rw_tタイプを付与する。
# semanage fcontext -a -t httpd_sys_script_rw_t "/home/yam/cgi-bin/data.txt"
# restorecon -F /home/yam/cgi-bin/data.txt
# ls -dZ /home/yam/cgi-bin/data.txt で確認しておく。
◆phpでデータベースにアクセスできるようにする
ポリシーhttpd_can_network_connect_dbをONにする。
# setsebool -P httpd_can_network_connect_db 1
●postgreSQL
# restorecon -RF /var/lib/pgsql
# ls -Z /var/lib/pgsql/data 等で確認しておく。
SELinux目次
TOP(HOME)へ