現在位置: ホーム / セキュリティ ブログ / SELinuxのCIL (Part4)

SELinuxのCIL (Part4)

今回も引き続きCILの設定方法を紹介します。Fedora25Betaをテスト環境として使用しています。

こんにちは。SIOS OSSエバンジェリスト/セキュリティ担当の面です。

今回は、前回CILで作成したポリシをログからカスタマイズします。

CILに関しては、SELinux CILリファレンスガイドの翻訳を行いましたので、興味のある方は是非目を通してみてください。

引き続き、環境としては最新のFedora25Betaを使います。


ポリシが格納された場所を確認する

semoduleコマンドでインストールした、CILのカスタマイズポリシは"/var/lib/selinux/targeted/active/modules"以下に格納されます。

"100"というディレクトリ以下にはディストリビューションで用意されたポリシが格納されます。"400"ディレクトリ以下にユーザがカスタマイズしたポリシが格納されます。

[root@fedora25b ~]# ls -l /var/lib/selinux/targeted/active/modules/400/sendconfig/
合計 8
-rw-r--r--. 1 root root 730 11月  9 17:20 cil
-rw-r--r--. 1 root root   3 11月  9 17:20 lang_ext
[root@fedora25b ~]# file /var/lib/selinux/targeted/active/modules/400/sendconfig/cil
/var/lib/selinux/targeted/active/modules/400/sendconfig/cil: bzip2 compressed data, block size = 500k

と、400ディレクトリ以下に各モジュール名のディレクトリが作成され、その中にcilファイル(bzip2で圧縮された、CILのポリシファイル)が格納されます。

bzcatコマンドで確認すると

[root@fedora25b ~]# bzcat /tmp/cil
; Declare a sendconfig related type
(type sendconfig_t)
(type sendconfig_exec_t)

--snip--

というように、作成したポリシが確認できます。


ポリシを調整する

1. ログを確認する

SELinuxでアクセス拒否された挙動は、/var/log/audit/audit.logファイルに出力されます("denied"とメッセージに入っていますので分かりやすいと思います)。前回のポリシによって拒否されたログを確認すると

[root@fedora25b sendconfig]# cat /var/log/audit/audit.log|grep denied |more
type=AVC msg=audit(1478830760.070:235): avc:  denied  { execute } for  pid=1460 comm="(d_config)" name="send_config" dev="dm-0" ino=277146 scontext=system_u:system_r:init_t:s0 tcontext=system_u:object_r:sendconfig_exec_t:s0 tclass=file permissive=0

のようなログが確認できます。

簡単にログの形式を説明すると

type=AVS msg=XXX: avc:   denied  { "拒否された動作1" "拒否された動作2" ...} for XXX scontext="アクセス元のコンテキスト" tcontext="アクセス先のコンテキスト" tclass="ターゲットクラス" permissive=0

となっています。

2. 必要なポリシを追加する

前述のようなログが出た場合にCILでアクセスを許可するためには

(allow "アクセス元のタイプ" アクセス先のタイプ (ターゲットクラス ("拒否された動作1" "拒否された動作2" ...)))

のようにcilポリシに追記してロードさせ直します。

例えば、先程のログの場合には

(allow init_t sendconfig_exec_t (file (read execute open)))

を自作したCILポリシ(/root/customized_policies/sendconfig/sendconfig.cil)に追加し

[root@fedora25b sendconfig]# semodule -e sendconfig

と一度読み込まれてるモジュールを削除した後で

[root@fedora25b sendconfig]# semodule -i /root/customized_policies/sendconfig/sendconfig.cil

と読み込み直す必要が有ります。

3. 1-2を繰り返す

このようにaudit.logのログに記載されている拒否された動作を許可していけば、基本的にはSELinuxを有効にした状態でカスタマイズしたポリシーを使ってプログラム(いまの場合はsend_config)は動くはずです。

ただし、プログラムが動作する際にアクセスしたものについて全てログが出ていますので、精査した上でアクセス権を与えるようにする必要が有ります。簡単に想像できる例として、名前解決が必要なプログラムの場合を考えてみましょう。/etc/hostsを確認したり、DNSを確認したり、LDAPを確認しに行くわけですが、そのプログラムの使用する名前解決がhostsファイルだけで済むのであれば、DNSに問い合わせを行う動作は許可する必要はありません。このように、出来る限り動作を把握して権限を与えていくことになります。


調整完了後のポリシ

調整完了後のsendconfig.cilを下に示します。

; Declare a sendconfig related type
(type sendconfig_t)
(type sendconfig_exec_t)

; Assign the type to the object_r role
;(roletype object_r sendconfig_t)
(roletype system_r sendconfig_t)
(roletype object_r sendconfig_exec_t)

; Assign the right set of attributes to the port
(typeattributeset entry_type sendconfig_exec_t)
(typeattributeset exec_type sendconfig_exec_t)
(typeattributeset file_type sendconfig_exec_t)
(typeattributeset non_security_file_type sendconfig_exec_t)
(typeattributeset non_auth_file_type sendconfig_exec_t)

; Assign type entry point
(allow sendconfig_t sendconfig_exec_t (file (entrypoint)))
(allow sendconfig_t sendconfig_exec_t (file (ioctl read getattr lock execute execute_no_trans open)))
(typetransition initrc_domain sendconfig_exec_t process sendconfig_t)

; Added for running sendconfig through systemctl
(allow init_t sendconfig_exec_t (file (read execute execute_no_trans open)))
(allow init_t sendconfig_exec_t (file (read execute open)))
(allow init_t sendconfig_t (process (transition rlimitinh signal siginh signull sigkill noatsecure)))
(allow init_t sendconfig_t (dir (search)))
(allow init_t sendconfig_t (file (open read getattr)))
(allow sendconfig_t init_t (fd (use)))
(allow sendconfig_t init_t (unix_stream_socket (getattr read write)))
(allow sendconfig_t init_t (process (sigchld)))
(allow sendconfig_t null_device_t (chr_file (read)))
(allow sendconfig_t ld_so_t (file (read execute)))
(allow sendconfig_t ld_so_cache_t (file (read open getattr)))
(allow sendconfig_t etc_t (dir (search)))
(allow sendconfig_t etc_t (file (open read getattr)))
(allow sendconfig_t proc_t (dir (search)))
(allow sendconfig_t proc_t (file (open read getattr)))
(allow sendconfig_t usr_t (dir (search)))
(allow sendconfig_t lib_t (lnk_file (read)))
(allow sendconfig_t lib_t (dir (search)))
(allow sendconfig_t lib_t (file (read open getattr execute)))
(allow sendconfig_t self (tcp_socket (create bind listen accept write)))
(allow sendconfig_t unreserved_port_t (tcp_socket (name_bind)))
(allow sendconfig_t node_t (tcp_socket (node_bind)))
(allow sendconfig_t root_t (dir (search)))
(allow syslogd_t sendconfig_t (dir (search)))
(allow syslogd_t sendconfig_t (file (open read getattr)))
(allow unconfined_t sendconfig_t (dir (open read search getattr)))
(allow unconfined_t sendconfig_t (file (open read)))
(allow unconfined_t sendconfig_t (lnk_file (read)))
(allow unconfined_t sendconfig_t (process (getattr)))

; Misc
(allow svc_run_t sendconfig_exec_t (file (read getattr execute open)))
(allow svc_run_t sendconfig_t (process (transition)))
(typetransition svc_run_t sendconfig_exec_t process sendconfig_t)


(filecon "/opt/test_dir/bin/send_config" file (system_u object_r sendconfig_exec_t ((s0) (s0))))

また、この状態でsend_configはきちんと動作し

[root@fedora25b sendconfig]# ps axZ|grep send
system_u:system_r:sendconfig_t:s0 2349 ?        Ss     0:00 /opt/test_dir/bin/send_config

外部から65000ポートに接続すると情報を出力し

sios@localhost:~$ telnet 172.16.148.148 65000
Trying 172.16.148.148...
Connected to 172.16.148.148.
Escape character is '^]'.

#
# /etc/fstab
# Created by anaconda on Thu Oct 13 07:55:46 2016
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/fedora-root /                       ext4    defaults        1 1
UUID=f22d0104-a7ca-40cc-bd4a-00fd707e93b7 /boot                   ext4    defaults        1 2
/dev/mapper/fedora-swap swap                    swap    defaults        0 0
processor	: 0
--snip--
cache_alignment	: 64
address sizes	: 42 bits physical, 48 bits virtual
power management:

Connection closed by foreign host.

systemctlコマンドで終了・起動することが出来ます。

[root@fedora25b sendconfig]# systemctl stop send_config
[root@fedora25b sendconfig]# ps axZ|grep send

[root@fedora25b sendconfig]# 
[root@fedora25b sendconfig]# systemctl start send_config
[root@fedora25b sendconfig]# ps axZ|grep send
system_u:system_r:sendconfig_t:s0 2361 ?        Ss     0:00 /opt/test_dir/bin/send_config
[root@fedora25b sendconfig]# 

まとめ

前回・今回と二回に分けてCILで独自のポリシを作る方法を紹介しました。次回は、このCILのメリット等の話をしていきます。


[セミナー告知]

11/30(水)に「OSSセキュリティナイター vol.3」と題して、セキュリティのセミナーを行います。

この回では、世界で最も利用されているオープンソースデータベースであるMySQLを取り上げ、『MySQLデータベースのセキュリティを考える 〜 重要データを守るために必要なこと〜』と題してセミナーを開催します。

今回も、前回に引き続き、ゲスト講師としてMySQLスペシャリストをお招きし講演をいただきます。

http://connpass.com/event/44819/がプログラム内容と申し込みの詳細になりますので、是非お申し込み下さい。

OSSに関するお困りごとは サイオス OSSよろず相談室まで

サイオスOSSよろず相談室 では、OSSを利用する中で発生する問題に対し、長年培ってきた技術力・サポート力をもって企業のOSS活用を強力に支援します。Red Hat Enterprise Linux のほか、CentOS をご利用されている環境でのサポートも提供いたします。

OSSよろず相談室

サイオスOSSよろず相談室(2)

問い合わせボタン

最新の記事
AppArmorの脆弱性( CVE-2017-6507 ) 2017年03月26日
linux kernelの脆弱性( CVE-2017-7261 ) 2017年03月25日
Sambaに共有以外のファイルにアクセスされる脆弱性(CVE-2017-2619) 2017年03月24日
Subscription-managerの脆弱性( CVE-2017-2663 ) 2017年03月22日
binutilsに複数の脆弱性( CVE-2017-6965, CVE-2017-6966, CVE-2017-6969, CVE-2017-7209 , CVE-2017-7210 , CVE-2017-7223, CVE-2017-7224, CVE-2017-7225, CVE-2017-7226, CVE-2017-7227 ) 2017年03月22日
linux kernelの脆弱性( CVE-2017-7187 ) 2017年03月21日
linux kernelの脆弱性( CVE-2017-6353 , CVE-2017-5986 ) 2017年03月21日
Ubuntu 16.10のkernelの脆弱性( CVE-2017-7184 ) 2017年03月20日
pcreの脆弱性( CVE-2017-7186 ) 2017年03月20日
binutilsの脆弱性( CVE-2017-6965 , CVE-2017-6966 , CVE-2017-6969 ) 2017年03月19日
MySQL(MariaDB) 5.5/5.6のmysql clientの脆弱性( Riddle : CVE-2017-3305 ) 2017年03月18日
linux kernelの脆弱性( CVE-2017-6951 ) 2017年03月17日
Apache Struts2の脆弱性 ( CVE-2017-5638 ) 2017年03月15日
linux kernelの脆弱性( CVE-2017-6874 ) 2017年03月15日
tomcatに情報漏えいの脆弱性( CVE-2016-8747 ) 2017年03月14日
QEMUの脆弱性( CVE-2016-9603 ) (Xen: XSA-211) 2017年03月14日
lxcの脆弱性(CVE-2017-5985) 2017年03月10日
wgetの脆弱性(CVE-2017-6508) 2017年03月08日
linux kernelに特権昇格の脆弱性( CVE-2017-2636 ) 2017年03月08日
( PoC ) linux kernel特権昇格脆弱性( CVE-2017-6074 ) の暫定回避策の確認 2017年03月06日
linux kernelの脆弱性( CVE-2016-9083 , CVE-2016-9084 ) 2017年03月03日
linux kernelに複数の脆弱性( CVE-2017-6345 , CVE-2017-6346 , CVE-2017-6347 , CVE-2017-6348 ) 2017年03月01日
Katello/Foremanによる運用管理 (Part4) 2017年02月28日
util-linux / coreutils の脆弱性(CVE-2017-2616) 2017年02月24日
linux kernelの脆弱性( CVE-2017-6214 ) 2017年02月24日
linux kernelに特権昇格の脆弱性( CVE-2017-6074 ) 2017年02月23日
curlの脆弱性 ( CVE-2017-2629 ) 2017年02月22日
QEMUの脆弱性( CVE-2017-2620 ) (Xen: XSA-209) 2017年02月22日
Tomcatの脆弱性 ( CVE-2017-6056 ) 2017年02月21日
Katello/Foremanによる運用管理 (Part3) 2017年02月21日
OpenSSLの脆弱性 ( CVE-2017-3733 ) 2017年02月16日
linux kernelの脆弱性( CVE-2017-6001 , (was CVE-2016-6786) ) 2017年02月16日
QEMUの脆弱性( CVE-2017-2630 ) 2017年02月15日
glibcの脆弱性(CVE-2015-8982, CVE-2015-8983, CVE-2015-8984) 2017年02月15日
vimの脆弱性 ( CVE-2017-5953 ) 2017年02月14日
Oracle Javaの脆弱性(Oracle Critical Patch Update Advisory - January 2017) 2017年02月14日
libxml2の脆弱性(CVE-2017-5969) 2017年02月13日
「linux kernel-4.9」でのLSMモジュールについて 2017年02月13日
linux kernelの脆弱性( CVE-2017-5970 ) 2017年02月13日
linux kernelの脆弱性( CVE-2016-8636 ) 2017年02月12日
bind 9 に設定依存の脆弱性 ( CVE-2017-3135 ) 2017年02月09日
bashの自動補完機能の脆弱性( CVE-2017-5932 ) 2017年02月08日
spiceの脆弱性( CVE-2016-9577 , CVE-2016-9578 ) 2017年02月08日
QEMUの脆弱性( CVE-2017-5898 ) 2017年02月08日
linux kernelの脆弱性( CVE-2017-5897 ) 2017年02月08日
linux kernelの脆弱性( CVE-2016-10208 ) 2017年02月06日
ntfs-3gの脆弱性(CVE-2017-0358) 2017年02月02日
QEMUの脆弱性( CVE-2017-2615 ) 2017年02月02日
tcpdumpに複数の脆弱性(CVE-2016-7922 等) 2017年01月30日
libgdに複数の脆弱性情報 (CVE-2016-9317, CVE-2016-6912, CVE-2016-10167, CVE-2016-10168, CVE-2016-10169) 2017年01月29日
OpenSSLに複数の脆弱性 ( CVE-2017-3730 , CVE-2017-3731 , CVE-2017-3732 ) 2017年01月27日
RunCに関しての脆弱性( CVE-2016-9962 )のPoCとSELinuxによるリスクの軽減 2017年01月26日
systemdの重要な脆弱性( CVE-2016-10156 ) 2017年01月25日
linux kernelの複数の脆弱性( CVE-2016-10153, CVE-2016-10154, CVE-2017-5547, CVE-2017-5548, CVE-2017-5549, CVE-2017-5550, CVE-2017-5551) 2017年01月25日
Katello/Foremanによる運用管理 (Part2) 2017年01月24日
linux kernel(KVMを有効にしている場合)で複数の脆弱性( CVE-2016-10150, CVE-2017-2583 ) 2017年01月21日
OpenSCAP 1.2.13のリリース情報 2017年01月16日
Oracle Javaの脆弱性(CVE-2016-5542, CVE-2016-5554, CVE-2016-5582, CVE-2016-5597, CVE-2016-5573) 2017年01月13日
bind に複数の脆弱性 ( CVE-2016-9131 , CVE-2016-9147 , CVE-2016-9444 , CVE-2016-9778 ) 2017年01月12日
Dockerに特権昇格の脆弱性 ( CVE-2016-9962 ) 2017年01月11日
最新の記事 - もっと...