SELinuxのCIL (Part4)
こんにちは。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/がプログラム内容と申し込みの詳細になりますので、是非お申し込み下さい。
—–