***********************************************
Interlanguage Compiler in SELinux Policy Editor
***********************************************

本ドキュメントは、SELinux Policy Editor の中間言語コンパイラ
(以下コンパイラ)に関する情報を記載しています。


1. 使い方

    ※以下では、コンパイラのインストールディレクトリを $installpath と
      しています。
    
    SELinux Policy Editor により出力された中間設定ファイルをコンパイル
    するにはmake コマンドを利用します。
    
        $ cd $installpath/
        $ make
    
    make コマンドを実行することにより、以下のファイルが生成されます。
    
        $installpath/policy/middle.conf
        $installpath/policy/policy.conf
        $installpath/policy/file_context
    
    middle.conf はm4マクロによるマクロ展開前のファイルで、可読性の高い
    ファイルです。policy.conf はm4マクロによるマクロ展開後のファイルで
    す。マクロの定義は以下のファイルを参照してください。
    
        $installpath/macros/*
    
    SELinux専用コマンドである checkpolicy, load_policy, setfiles にて
    policy.conf あるいは file_context を指定することで、システムに対し
    てセキュリティポリシーを設定することができます。


2. 中間設定言語の仕様

2.1. 全体像

    中間設定ファイルは domain あるいは role 単位となっています。domain 
    定義の重要な点は、global domain が必須である点です。この domain 定
    義では、全ての domain に共通して適用される設定を記述します。
    
    権限はすべて、初期状態では「拒否」の状態にあると捉えられます。各定
    義ファイルでは必要な権限を与えなければなりません。

2.2. 文法

    domain あるいは role 定義の基本構造を以下に示します。
    
        {
        domain(あるいは role) ...
        users ...
        domain_trans ...
        allow ...
        deny ...
        allow*** ...
        }
    
2.2.1. domain あるいは role の宣言

    (1) domain の宣言
    
        [ 書式 ]
        
            domain < domain 名 >;< 改行 >
            
        [ 意味 ]
        
            domain 名を宣言します。但し、同じセクションで2つ以上宣言し
            てはいけません。また、domain 名は "_t" で終了している必要
            があります。
            
            < domain 名 >を "global" とすると、すべての domain に共通
            して適用する設定とみなされます。
        
        [ 制約 ]
        
            "global"という名称の一般 domain は作成できません。
    
    (2) role の宣言

        [ 書式 ]
        
            role < role 名 >;< 改行 >
        
        [ 意味 ]
        
            role 名を定義します。但し、同じセクションで2つ以上宣言して
            はいけません。また、role 名は "_r" で終了している必要があ
            ります。

2.2.2. user 文

    [ 書式 ]
    
        user < ユーザ名 ＞;< 改行 >
        
    [ 意味 ]
    
        この定義文は、現在のセクションが role を宣言している場合に限り
        宣言することができます。
        
        現在のセクションで定義している role を担うことを許可するユーザ
        を定義します。
        
2.2.3. domain の遷移設定

    [ 書式 ]
    
        domain_trans  < 遷移元 domain > < プログラム名 >;< 改行 >
        
    [ 意味 ]
    
        < 遷移元 domain > で稼動しているプログラムが < プログラム名 >
        を実行した際に、実行されたプログラムは現在のセクションで定義し
        ている domain で稼動します。

2.2.4. 通常ファイルに対するアクセス制御設定

    以下に挙げるファイルに対しては、独自のラベルを自動的に付与します。
    
        /dev/tty*
        /dev/pts
        /dev/ptmx
    
    (1) allow 文
    
        [ 書式 ]
        
            (a) allow < ファイル名 > | < 専用名 > [r],[w],[x],[s];< 改行 >
            (b) allow < ディレクトリ > exclusive < 専用名 >;< 改行 >
            
            
            - パラメータの意味 ----------------------------------------
            
                r : 読み込み
                w : 書き込み
                x : 実行
                s : ディレクトリサーチ。ファイルに指定しても意味はない。
                    しかし、ファイルに ｒ を指定した時には常に ｓ を
                    指定しておかないと、コンパイル後の設定が汚くなるの
                    で注意が必要です。
            
            -----------------------------------------------------------
        
        [ 意味 ]
        
            現在のセクションで定義されている domain に対して、ファイル
            に対するアクセス許可を定義します。
            
            
            (a) domain とファイルとの間でパーミッションを定義します。
                明示的に allow 宣言されない限りアクセスは許可されま
                せん。
                
                < ファイル名 >にはディレクトリを指定することもできます。
                ディレクトリを指定した場合、そのサブディレクトリに対し
                てもアクセス権限が継承されます。アクセス権限を継承させ
                たくない場合には、allowonly 宣言を利用してください。
            
            (b) SELinux での file_type_auto_trans マクロに相当します。
                プログラムが特定のディレクトリ下にプロセス専用ファイル
                を作成するが、ファイル名は作成される時点まで不明である
                場合に、< 専用名 >で宣言することにより、同ファイルを識
                別させることができます。
                
                主に、/var/run や /var/log に作成されるファイルを守る
                目的で利用します。
                
                また、この宣言によって、< ディレクトリ > に対して
                ファイルを作成する権利と、同ファイルに対する書き込み
                権限が与えられます。
                
                < ディレクトリ >内にできるファイルに対して他の domain 
                がアクセスすることは初期状態では許可されません。
                アクセスを許可したい場合には、明示的に宣言する必要が
                あります。
    
    (2) deny 文
    
        [ 書式 ]
        
            deny < ファイル名 >;< 改行 >
        
        [ 意味 ]
        
            allow 文による宣言を無効化する際に宣言します。
            
            例えば、あるディレクトリ全体に対して allow 宣言をした場合
            に、その下のファイルあるいはディレクトリに対するアクセス
            を個別に拒否したい場合に宣言します。
            
            < ファイル名 >にはディレクトリを指定することもできます。
            ディレクトリを指定した場合、そのサブディレクトリに対しても
            アクセス権限が継承されます。アクセス権限を継承させたくない
            場合には、denyonly 宣言を利用してください。
            
            また、現在のセクションで定義している domain が "global" 
            である場合、本宣言文を利用することで、各 domain で共通し
            て拒否したいアクセスを宣言できます。例えば、
            
                deny /etc/shadow;
            
            と宣言しておくと、各 domain では /etc/shadow に対する
            アクセスが許可されなくなります。例外的に特定の domain に
            対してこのファイルへのアクセスを許可する為には、その 
            domain の定義セクションにて明示的に以下の様に宣言する必
            要があります。
            
                allow /etc/shadow r,s;
            
    (3) allowonly 文
    
        [ 書式 ]
        
            allowonly < ファイル名 > [r],[w],[x],[a],[s];< 改行 >
        
        [ 意味 ]
        
            domain とファイルとの間でパーミッションを定義します。
            
            < ファイル名 >にはディレクトリを指定することもできます。
            ディレクトリを指定した場合、そのサブディレクトリに対しては
            アクセス権限が継承されません。アクセス権限を継承させたい
            場合には、allow 宣言を利用してください。
        
    (4) denyonly 文
    
        [ 書式 ]
        
            denyonly < ファイル名 > [r],[w],[x],[a],[s];
        
        [ 意味 ]
        
            allow 文による宣言を無効化する際に宣言します。
            
            < ファイル名 >にはディレクトリを指定することもできます。
            ディレクトリを指定した場合、そのサブディレクトリに対しては
            アクセス権限が継承されません。アクセス権限を継承させたい
            場合には、deny 宣言を利用してください。
        
2.2.5. allow および deny 文の優先順位

    (1) allow および deny 宣言の global 指定
    
        "global" domain の定義セクション内で、allow および deny 文を
        宣言します。
    
    (2) allow および deny の優先順位
    
        同一ディレクトリに対する権限定義では、"global" domain による
        宣言よりも、一般 domain による宣言が優先されます。
        
        
            例1) "global" domain および一般 domain にて同一ディレクトリ
                 に対するアクセス制御を宣言した場合
                 
                "global" domain : allow /usr r;
                "a_t"    domain : allowonly /usr w
                
                "a_t" domain は、/usr に対して w 権限を、/usr/*** に
                対して r 権限を持つ。
            
            例2) "global" domain および一般 domain にて同一ディレクトリ
                 に対するアクセス制御を宣言した場合
                 
                "global" domain : allow /usr r;
                "a_t"    domain : allow /usr w
                
                "a_t" domain は、/usr に対して w 権限を、/usr/*** に
                対しても w 権限を持つ。
        
        
        サブディレクトリに対するアクセス制御が明示的に宣言されている
        場合、"global" domain および一般 domain の関係なく、その
        サブディレクトリに対する宣言が優先されます。
        
        
            例1) サブディレクトリに対するアクセス制御が明示的に宣言され
                 ている場合
                
                "a_t" domain : allow /usr r;
                               allow /usr/local w;
                
                "a_t" domain は、/usr に対して r 権限を、/usr/local に
                対して w の権限持つ。
            
            例2) サブディレクトリに対するアクセス制御が明示的に宣言され
                 ている場合
                
                "global" domain : allow /usr/local w;
                "a_t"    domain : allow /usr r;
                
                "a_t" domain は、/usr に対して r 権限を、/usr/local に
                対して w の権限持つ。
        
        
        2.2.4.(1)での< 専用名 >に対するアクセス許可は、< ディレクトリ >
        に対するアクセス許可が w となっていようとも、< 専用名 >に対し
        て明示的に allow 宣言がされていない限り、他のプロセスからの
        アクセスは拒否されます。
        
        domain の宣言セクション内にて、同一のファイルあるいは
        ディレクトリに対して複数の allow 宣言がなされた場合には、宣言
        されている各パーミッションの OR 演算が行われます。但し、deny 
        宣言が存在する場合には、deny 宣言が何よりも優先されます。

2.2.6. ネットワーク関係のアクセス制御設定

    (1) allownet 文
    
        [ 書式 ]
        
            (a) allownet;< 改行 >
            (b) allownet -raw;< 改行 >
            (c) allownet -wellknown;< 改行 >
            (d) allownet (-tcp | -udp) -port < ポート番号 >;< 改行 >
            (e) allownet (-tcp | -udp) -allport;< 改行 >
        
        [ 意味 ]
        
            ネットワークの利用を許可します。
            
            (a) tcp および udp の1024番以上のポートの使用を許可します。
            (b) raw ソケットの使用を許可します( icmp を使う場合など)。
            (c) Wellknown ポートの利用の為のケイパビリティを与えます。
            (d) 1024番以下のポートの利用を予約します。
                予約されたポートを他の domain が使うには、明示的に宣言
                する必要があります。
            (e) 予約されてない全ての1024番以下のポートを使うことを許可
                します。
        
        [ 制約 ]
        
            この宣言文は取消すことができない為、"global" domain で宣言
            する際には注意して下さい。

2.2.7. プロセス間通信のアクセス制御設定

    (1) allowcom 文
    
        (a) ソケット
        
            [ 書式 ]
            
                allowcom -tcp | -udp | -unix < 通信相手 domain >;< 改行 >
            
            [ 意味 ]
            
                < 通信相手 domain >に対してそれぞれのソケットを使った
                通信を許可します。
                
                < 通信相手 domain >に"global"が指定されると、全 domain 
                に対する通信を許可します。
        
        (b) IPC
        
            [ 書式 ]
            
                allowcom -sem | -msg | -msgq | -shm | -pipe < 通信相手 domain >  [r],[w];< 改行 >
            
            [ 意味 ]
            
                < 通信相手 domain >との間でそれぞれの方式による
                プロセス間通信を許可します。
                
                < 通信相手 domain >には自分自身を示す"self"が指定可能
                です。また、"global"が指定されると、全 domain に対する
                プロセス間通信を許可します。
        
        (c) シグナル
        
            [ 書式 ]
            
                allowcom -sig < 相手 domain > [c],[k],[s],[o];< 改行 >
                
                
                - パラメータの意味 -----------------------------------
                
                    c : sigchld
                    k : sigkill
                    s : sigstop
                    o : その他
                
                ------------------------------------------------------
                
            [ 意味 ]
            
                < 相手 domain >に対してそれぞれのシグナルの送信を許可
                します。
                
                < 相手 domain >に"global"が指定されると、全 domain に
                対するシグナル送信を許可します。

2.2.8. 端末へのアクセス制御設定

    デフォルトでは、自身の端末へのアクセスは許可されています。
    
    (1) allowtty 文
    
        [ 書式 ]
        
            (a) allowtty -create;< 改行 >
            (b) allowtty < role 名 > [r],[w];< 改行 >
            (c) allowtty -change < domain >;< 改行 >
        
        [ 意味 ]
        
            端末デバイス /dev/tty* へのアクセス制御を設定します。
            
            (a) 自分の domain 名特有の端末を作ることを許可します。
            
            (b) < role 名 >の role でログインしているユーザの端末の
                読みとり、書き込みあるいはその両方を許可します。
                
                < role 名 >に対して"general"が指定された場合、ラベル
                付け前の /dev/tty および /dev/tty* へのアクセスが許可
                されます。
                
                < role 名 >に対して"global"が指定された場合、すべての
                端末に対するアクセスが許可されます。
            
            (c) < domain >特有の端末に対して、ラベルのはりかえを許可し
                ます。"general"が指定された場合、ラベルが付く前の端末
                のラベル付けが許可されます。
        
    (2) allowpts 文
    
        [ 書式 ]
        
            (a) allowpts -create;< 改行 >
            (b) allowpts -change < domain >;< 改行 >
            (c) allowpts < domain or role > [r],[w];< 改行 >
        
        [ 意味 ]
        
            擬似端末デバイス /dev/pts/* 用の設定です。リモートログイン
            関連の設定に使用します。
            
            (a) 現在のセクションで宣言している domain 以外の domain が、
                現在宣言している domain で擬似端末を作成することを許可
                します。
            
            (b) 擬似端末を引き渡すことを許可します（ラベルのはりかえ）。
                この宣言を利用することで、特定の role がリモートから
                ログインすることを拒否することができます。
            
            (c) 擬似端末へのアクセス設定します。
            
            < domain >に"general"を指定することで、ラベル付け前の端末
            に対するアクセス制御が可能です。

2.2.9. proc ファイルシステムへのアクセス制御

    [ 書式 ]
    
        allowproc -self | -other | -system | -kmsg | -proc [r],[w];< 改行 >
    
    [ 意味 ]
    
        -self : 自分自身のプロセス情報を意味します。
        
        -other : 他のプロセスのプロセス情報を意味します。
        
            ※このオプションによるアクセス制御を宣言しない場合、
              ps コマンドで他のプロセスの情報は見れません。また、PID 
              が分からない為 kill することもできなくなります。これは、
              プロセスを隠すことができることを意味します。なお、
              "global" domain 宣言では設定できません。
        
        -system : /proc/sys や /proc/net などのシステム情報を意味します。
        
            通常管理者はこれらの情報に対して書き込みが必要です。また、
            一般プロセスでも読みこみ権限は必要になります。
            
            w にて宣言した場合、SELinuxオリジナルマクロである can_sysctl 
            マクロ相当の権限となります。
            
            r にて宣言した場合、SELinuxオリジナルマクロである 
            general_proc_read_access 相当の権限となります( proc/kmsg に
            対しても stat の権限は与えられます)。
            
            なお、/proc/kcore に対する書き込み権限を与えることはできま
            せん。
            
        -kmsg : /proc/kmsg に対する権限を設定します。
        
            通常は klogd のみを読み込み可能に設定します。
            
        -proc : /proc のその他のファイルを意味します。
        
            一般のproc_tの名前がついているファイルに対するアクセス制御
            を宣言します。

2.2.10. tmpfs のアクセス制御

    [ 書式 ]
    
        (a) allowtmpfs -create;< 改行 >
        (b) allowtmpfs < domain > [r],[w];< 改行 >
    
    [ 意味 ]
    
        tmpfs は共有メモリに使われる、RAM上のファイルシステムです。
        /dev/shm に作成されます(RedHat7.2)
        
        (a) tmpfs に自分のプロセス専用のファイルを作成することを許可します。
        
        (b) < domain >が作った tmpfs に対するアクセスを許可します。
        
            < domain >に"general"を指定された場合、ラベル付け前の 
            tmpfs に対するアクセスを許可します。"global"が指定された
            場合には、すべての tmpfs に対するアクセスを許可します。

2.2.11. allow 文以外の宣言文の優先順位

    allow 文以外の宣言文では、"global" domain で与えた権限を打ち消す
    ことはできません。
    
    例) "global" domain と一般 domain で重複宣言された場合
    
        "global" domain : allowtty < xxxxx > r;
        一般 domain     : allowtty < xxxxx > w；
        
        上記の場合、"global" domain での ｒ に加えて、w も与えられます。

2.2.12. 管理権限

    [ 書式 ]
    
        allowadm [relabel],[chsid],[avc_toggle],[load_policy],[net],[boot],[insmod];< 改行 >
    
    [ 意味 ]
    
        relabel :
        
            全てのラベル張換えを許可します。
            
        chsid :
        
            自分がアクセスできるファイルのラベル換えを許可します。
            
        avc_toggle :
        
            development モードでの avc_toggle コマンドの使用を許可しま
            す。
            
        load_policy :
        
            ポリシーをカーネルに対する再読み込みを許可します。
            
        net :
        
            arp および route テーブル書き換えプロミスキャスモード等、
            ネットワーク周りの管理を許可します。 
            
        boot :
        
            リブートを許可します。
            
        insmod :
        
            カーネルに対するモジュール読み込みを許可します。
            
        quotaon :
        
            ディスククォータを有効化することを許可します。
            
        swapon :
        
            スワップを有効化することを許可します。
            
        mount :
        
            ファイルシステムのマウントを許可します。
            
        raw_io :
        
            /dev/mem や、デバイスファイルに対する raw_io を許可します。
        


