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

SELinuxのCIL (Part3)

SELinuxのCILの説明を行います。

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

またまた前回(Reference Policyでのポリシの作成)からかなり時間が経ってしまいましたが、今回は、いよいよCILでポリシの作成を行います。

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

また、今回からは環境としては最新のFedora25Betaを使います。


サンプルプログラムを動かす独自ドメインを作ってみる

今回、サンプルプログラムとして、第一回・第二回と同じくsend_configを使用します(起動ポートをPort80からPort65000に変更しました)。

下記のプログラムをコンパイルし、/opt/test_dir/bin/send_configとしてコピーします。

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include 
#include 
#include 
#include 
#include 
#include <sys/types.h>

int main(int argc, char *argv[])
{
    int listen_fd = 0, connect_fd = 0;
    struct sockaddr_in serv_addr;

    char sendBuff[1025];
    FILE *fpin;
    char s[256];

    listen_fd = socket(AF_INET, SOCK_STREAM, 0);
    memset(&serv_addr, '0', sizeof(serv_addr));
    memset(sendBuff, '0', sizeof(sendBuff));

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_port = htons(65000);

    bind(listen_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

    listen(listen_fd, 10);

    while(1)
    {
        connect_fd = accept(listen_fd, (struct sockaddr*)NULL, NULL);

        if ((fpin = fopen("/etc/fstab","r")) == NULL) {
                printf("Input file open error!!\n");
        exit(1);
        }

        while (fgets(s, 256, fpin) != NULL) {
                snprintf(sendBuff, sizeof(sendBuff), "%s", s);
                write(connect_fd, sendBuff, strlen(sendBuff));
        }
        fclose(fpin);

        if ((fpin = fopen("/proc/cpuinfo","r")) == NULL) {
                printf("Input file open error!!\n");
        exit(1);
        }

        while (fgets(s, 256, fpin) != NULL) {
                snprintf(sendBuff, sizeof(sendBuff), "%s", s);
                write(connect_fd, sendBuff, strlen(sendBuff));
        }


        fclose(fpin);
        close(connect_fd);
        sleep(1);
     }
}

また、systemdで起動するように、下記の記述の/etc/systemd/system/send_config.serviceを登録します。

Description = Send Config to remote

[Service]
ExecStart = /opt/test_dir/bin/send_config
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target


独自ドメイン用のポリシを作成する


1. Type・ドメインをどうするか考える

send_configプログラムを動かす上で、Typeとドメインをどうするか考えます。

今回は

  • プロセス(send_config)のドメイン:sendconfig_t

  • プロセスを起動するためのプログラムのType:sendconfig_exec_t

  • プログラムのコンテキスト:system_u:object_r:sendconfig_exec_t

とします。

2. CILポリシ(例)を見てみる

CILで記述されているポリシは"/var/lib/selinux/targeted/active/modules/[module名]/cil"として配置されています。このファイルはbzip2形式で圧縮されています。

サンプルとして、apacheのポリシを見てみましょう。/var/lib/selinux/targeted/active/modules/apache/cilをコピーし、bzip2コマンドで解凍してみます。

[root@fedora25b tmp]# cp /var/lib/selinux/targeted/active/modules/targeted/active/modules/apache/cil /tmp/apache_sample.cil.bz2
[root@fedora25b tmp]# bzip2 -d /tmp/apache_sample.cil.bz2 

apache_sample.cilを抜粋します。

apackeサンプルCIL(抜粋):

(filecon "/var/www/cgi-bin(/.*)?" any (system_u object_r httpd_sys_script_exec_t ((s0) (s0))))
(filecon "/var/www/html/[^/]*/cgi-bin(/.*)?" any (system_u object_r httpd_sys_script_exec_t ((s0) (s0))))
(filecon "/var/www/html(/.*)?/sites/default/settings\.php" file (system_u object_r httpd_sys_rw_content_t ((s0) (s0))))
(filecon "/var/www/html(/.*)?/sites/default/files(/.*)?" any (system_u object_r httpd_sys_rw_content_t ((s0) (s0))))
(filecon "/var/www/html/configuration\.php" any (system_u object_r httpd_sys_rw_content_t ((s0) (s0))))
(typealiasactual httpd_sys_content_rw_t httpd_sys_rw_content_t)
(typealias httpd_sys_content_ra_t)
(typealiasactual httpd_sys_content_ra_t httpd_sys_ra_content_t)
(allow httpd_t httpd_exec_t (file (entrypoint)))
(allow httpd_t httpd_exec_t (file (ioctl read getattr lock execute execute_no_trans open)))
(allow httpd_suexec_t httpd_suexec_exec_t (file (entrypoint)))
(allow httpd_suexec_t httpd_suexec_exec_t (file (ioctl read getattr lock execute execute_no_trans open)))

見てお分かりの通り、CILの特徴は下記のようなものになります:

  1. 見てすぐわかる通り、CILではS式を用いて構成されています。従って、丸括弧"()"で各項目が区切られています。例えば

    (typeattributeset cil_gen_require var_t)
    
    のように一組の丸括弧で囲われている単純なものから
    (allow httpd_suexec_t httpd_log_t (file (create getattr open)))
    
    のように、括弧でネストされて使われているものまであります。
  2. LISPを元に文法が構成されており

    1. シンボル - スペースを含まない文字列(例えば、type, httpd_t, user_rなど)

    2. クォートされた文字列 - クォートで閉じられた文字列(例えば、"^/usr/shared/*.?"など)

    3. IPv4とIPv6アドレス - v4/v6のIPアドレス(例えば、127.0.0.1など)

    4. 数字 - 数字は単純な整数(例えば、443など)

    のパーツによって構成されています。


3. まずは作成してみる

上述のapacheのCILポリシファイルを参考にし、下記のようなポリシファイルを/root/customized_policies/sendconfigとして作成しました。

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

; Assign the type to the object_r role
(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 exe
cute_no_trans open)))
(typetransition initrc_domain sendconfig_exec_t process sendconfig_t)
(allow sendconfig_t sendconfig_exec_t (file (ioctl read getattr lock execute exe
cute_no_trans open)))

(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))))

4. モジュールをコンパイルしてロードする

モジュールをコンパイルしてロードするには、semoduleコマンドを使用します。

semodule -l: ロードされているモジュールの一覧を表示
semodule -i: 引数で与えられたファイルをコンパイルしてモジュールとしてロードする。
semodule -e: 引数で与えられたファイルモジュールロードする。
semodule -r: 引数で与えられたファイルモジュールを削除する。

となっていますので、上述の"-i"オプションを使用して

semodule -i sendconfig

を実行します。


4. コンテキストを付け直す

/opt/test_dir/bin/sendconfig ファイルのコンテキストをsystem_u:object_r:sendconfig_exec_t:s0に変更します。

[root@fedora25b sendconfig]# ls -lZ /opt/test_dir/bin/ |sed s/omok/sios/g
合計 24
-rwxrwxr-x. 1 sios sios system_u:object_r:sendconfig_exec_t:s0 9336 10月 17 11:47 send_config

5.SELinuxをPermissiveモードにする。

SELinuxのモードを

[root@fedora25b sendconfig]# setenforce 0

として、Permissiveモードにしておきます。

6. サービスを立ち上げ直して、監査ログ(/var/log/audit以下)を確認する。

サービスの立ち上げ直しは、

systemctl stop send_config
systemctl start send_config

で大丈夫です。

7. プロセスのドメインを確認する。

send_config サービスが起動したら、"ps axZ"などで確認します。

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

まとめ

今回は、sendconfig_tドメインで起動したところまでで一旦休憩です。次回は後半戦として、このポリシをログからカスタマイズしていきます。


[セミナー告知]

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)

問い合わせボタン

最新の記事
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日
GnuTLS の 脆弱性 (GNUTLS-SA-2017-1 : CVE-2017-5334 , GNUTLS-SA-2017-2 : CVE-2017-5335 , CVE-2017-5336 , CVE-2017-5337 ) 2017年01月11日
最新の記事 - もっと...