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

SELinuxのCIL (Part1)

今回は前回に引き続き、SELinuxのCILを例を上げて説明します。

こんにちは。SIOS OSSエバンジェリストの面です。

前回のお話の続きで、SELinuxの「CIL(Common Intermediate Language)」を説明していきます。

 


  • SELinuxのCIL

前回の記事でも触れた通り、新しいSELinuxでは、CILという言語が導入されています 。それではCILとはどのようなものなのでしょうか。

CILは今までのハイレベルなポリシ開発言語とバイナリとして生成されるpolicy.XX(Fedora/RedHatの場合には/etc/selinux/targeted/policy以下に保存されているファイル)の 中間言語となるように設計されたものです。

簡単に、今までのポリシ(Reference Policy)との関係を図示してみましょう。


(参考:Where does CIL play in the SELinux system?)

今までのSELinxuのポリシ(Reference Policy)では

.teファイル:ポリシの宣言とアクセス制御部分を記載する
.fcファイル:ファイルコンテキスト部分を記載する
.ifファイル:外部から、そのポリシモジュールを利用する際に必要なTEルールや
           マクロが記載されているファイル。

を書いていきます。それらを.ppファイルに変換し、semoduleコマンドでpolicy.##ファイルに追加していきます。

(注:ここの手順は通常のポリシ作成方法に"config-security-selinux"ツールを使用した場合などは省略されており、ポリシモジュール(の雛形)を作成すると、この辺りの変 換と読み込みを全て自動で行ってくれる.shスクリプトが雛形と同時に生成されます。)

この.ppファイル(ここのレイヤを"ハイレベル言語"と呼んでいる)とpolicy.##ファイルの中間に入るものとして、CIL(Common Intermediate Language:中間言語)を定義しよう と言うものになります。

この他にも色々なフレームワークで生成された"ハイレベル言語"(HIL)を全てCILに変換して、policy.##ファイルに読み込ませることになります。

現状でもこの".pp"ファイルをCILに変換して見てみることは可能で、"/usr/libexec/selinux/h11/pp"を用いて

[root@localhost ]# /usr/libexec/selinux/hll/pp [入力する.ppファイル名] [出力する
.cilファイル名]

とすると、CILファイルを出力してくれます。

このCILファイルが"secilc"ツールを用いてpolicy.##ファイルに変換されます。

SELinuxのCILに関して、コンセプトや文法などの系統だった情報は、CILのWikiにまとめられています。


  • テスト環境の準備

以降、CILポリシを詳しく見ていくために、テスト環境として次のような簡単なサンプルプログラムをSELinux上で動作させる際のポリシを考えてみましょう。

OS: Fedora23Beta(執筆時点で最新のもの)

Firewalld: 無効(テストのため)

httpd他、Port80を使用するプログラムは動作させない

プログラム:

サーバ:Fedora側で動作。Port80で待ち受けており、いくつかのファイルを読み取って接続元に返す

サーバのソース(send_config.c):

#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(80); 

    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);
     }
}

Fedora上で、このファイルを

gcc -o send_config send_config.c

としてコンパイルし、/opt/test_dir/bin以下に配置します。

また、systemd経由でデーモンとして動作するようにするため、次のような起動スクリプトを"/opt/test_dir/scripts/run_send_config.sh"として用意します。

#!/bin/sh

/opt/test_dir/bin/send_config > /dev/null 2>&1

最後にこれらをsystemdから起動できるように登録しておきます。

1. /etc/systemd/system以下に、次のような設定ファイルを"send_config.service"として登録しておきます。

send_config.service)

[Unit]
Description = Send Config to remote

[Service]
ExecStart = /opt/test_dir/scripts/run_send_config.sh
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target

2. "systemctl list-unit-files --type=service"を実行して、サービスとして登録されているかを確認します。

[root@localhost ~]# systemctl list-unit-files --type=service|grep send_config
send_config.service                         disabled 

3."systemctl start send_config"として、サービスを起動してみます。

4."systemctl enable send_config"として、サービスの自動起動を有効化します。

5. この状態でひとまず"setenforce 0"としてSELinuxをPermissiveモードにします。< /p>

6. この状態で外部のマシンで"telnet80"とすると、下記のようにサーバ (Fedora)内のファイル情報が出力されます。

ka-omo@tornado:~$ telnet 192.168.56.102 80
Trying 192.168.56.102...
Connected to 192.168.56.102.
Escape character is '^]'.

#
# /etc/fstab
# Created by anaconda on Fri Sep 18 11:35:55 2015
#
# 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 /                       xfs     defaults        0 0
UUID=157e629d-a19f-4be6-8d11-d5add7fc4f22 /boot                   ext4    defaul
ts        1 2
/dev/mapper/fedora-swap swap                    swap    defaults        0 0
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
--snip--
clflush size	: 64
cache_alignment	: 64
address sizes	: 39 bits physical, 48 bits virtual
power management:

Connection closed by foreign host.
  • 次回

次回から、今回準備したテスト環境でSELinuxポリシを作成して、実際にReference PolicyとCILを見ていきます。

[参考]

 

OSSよろず相談室

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

問い合わせボタン

最新の記事
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日
OpenSSLの脆弱性(CVE-2016-7056 ) 2017年01月11日
最新の記事 - もっと...