最終回 SECMARKによるネットワークの取り扱い方法


古田 真己
サイオステクノロジー株式会社
2007/2/14

 SECMARKとCONNSECMARK

 SECMARKとCONNSECMARKの違いを示しましょう。

●SECMARK

 SECMARKはiptablesのinputとoutputのパケットに対して使用できます。

iptables -t mangle -s 10.1.0.0/255.255.0.0 -A INPUT -p tcp --dport 80 -j SECMARK --selctx system_u:object_r:http_int_pkt_t:s0
図1 SECMARKの例

 これはソースアドレス10.1.0.0の16ビットマスクを持つネットワークから流れてきたパケットがポート80番を通るとき、イントラネット向けのhttp_int_pkt_t:s0ラベルを付けるよう動作します。

●CONNSECMARK

 SECMARKに対して、CONNSECMARKはinputとoutputの状態を含んだ対象パケットに使用できます。CONNSECMARKを使う場合、以下のように多少複雑なことに用います。

iptables -t mangle -N HTTP_INT −−1
iptables -t mangle -A INPUT -s 10.1.0.0/255.255.0.0 -m state --state NEW -m tcp --dport 80 -j HTTP_INT −−2
iptables -t mangle -A HTTP_INT -j SECMARK --selctx system_u:object_r:http_int_pkt_t:s0 −−3
iptables -t mangle -A HTTP_INT -j CONNSECMARK --save −−4
iptables -t mangle -A HTTP_INT -j ACCEPT −−5
iptables -t mangle -A INPUT -m state --state ESTABLISHED,RELATED -j CONNSECMARK --restore −−6
iptables -t mangle -A OUTPUT -m state --state ESTABLISHED,RELATED -j CONNSECMARK --restore −−6
図2 CONNSECMARKの例

それぞれ、以下のような動作を行います。

  1. HTTP_INTチェーンを作成します。これはイントラネット用のApache Webサーバで取り扱うために使用します。
  2. ポート80番に対するパケットをHTTP_INTチェーンに追加します。
  3. そのパケットにhttp_int_pkt_t:s0ラベルを付けます。
  4. このコネクションにラベルがない場合は、このパケットに対するラベルをコピー(--save)します。
  5. HTTP_INTチェーンをACCEPTに設定します。
  6. ESTABLISHEDとRELATEDのパケットに対してこのラベルをコピー(--restore)します。

 SECMARK/CONNSECMARKを使ってみる

 使い方とSECMARK/CONNSECMARKの準備が整ったので、いよいよテストです。ネットワークインターフェイスを2つ持つサーバを用意します。さらにWebサーバをRawhide標準のものに加えて、もう1つ用意しましょう。そして、そのどちらもがポート番号80に対する接続を待ち受けます。ただし、それぞれのWebサーバはそれぞれのインターフェイスに対してのみListenするようにします。

●2番目のWebサーバの用意

 テストに当たっては、RawhideのApache Webサーバ(/usr/sbin/httpd)をchrootのように、そっくりそのままの形で別のディレクトリをトップディレクトリとするインストールツリーが必要です。

 例えば、/usr/localをトップディレクトリにすると、ドキュメントルートは/usr/local/var/www/html、設定ファイルは/usr/local/etc/httpd、バイナリは/usr/local/sbin/httpdというふうになります。これには、httpd2_tのドメインを与えます。

ドメイン名 httpd2_t
設定ファイル httpd2_config_t
バイナリ
httpd2_exec_t
表1 2番目のWebサーバのセキュリティコンテキスト

 httpd2_tドメイン用のバイナリのコピーですが、大ざっぱでよければ、以下のようなスクリプトを使うことができます(このスクリプトはhttpdパッケージの全ファイルをリストアップし、それをただTGTDIRの下にcpを使ってコピーします。うまくいけば、/usr/localの下にはetcとusrとvarができます)。

#!/bin/bash
PKGNAME=httpd
TGTDIR=/usr/local

cd $TGTDIR && \
for APFILE in `rpm -ql $PKGNAME`
   do
      mkdir -p .${APFILE%/*}
      cd .${APFILE%/*}
      cp -a $APFILE .
      cd -
done
図3 コピー用スクリプト

 この2番目のWebサーバを動作させて、それぞれのネットワークインターフェイスの80番ポートでListenさせます。

●SECMARK/CONNSECMARKの追加ルールとWebサーバのアクセス許可

 図2で使ったルールも2番目のWebサーバに合うようにそのまま複製した後、少し変更します。

 ここでは同じくhttp_int_pkt_t:s0をhttp2_int_pkt_t:s0というように“2”を付けましょう。また、ソースアドレスの10.1.0.0/255.255.0.0も適切なネットワークアドレスに変更しておく必要があります。

 ここで、さらに設定が必要です。WebサーバがSECMARK/CONNSECMARKによるラベル付けをされたパケットにアクセスできるようにしなければなりません。1番目の(Rawhide標準の)Webサーバと2番目のWebサーバのために、以下のような許可が必要です。

 allow httpd_t http_int_pkt_t:packet { recv send };
 allow httpd2_t http2_int_pkt_t:packet { recv send }; done
図4 追加するポリシー

●動作の確認

 それぞれのWebサーバを起動してから、それぞれのネットワークからWebブラウザでアクセスし、テストページが表示できるか確認します。ここで大事なことは、各Webサーバにはバインドできるホストのインターフェイス(eth0、eth1……)の制限がないにもかかわらず、SECMARK/CONNSECMARKの機能によって、そのサーバが本来取り扱うべきパケットへのアクセス権が正しく守られることです。

2/3

Index
SECMARKによるネットワークの取り扱い方法
  Page1
ネットワークとSELinux
iptablesとnetfilter
SELinux環境のセットアップ
Page2
SECMARKとCONNSECMARK
SECMARK/CONNSECMARKを使ってみる
  Page3
SELinuxの今後


Security&Trust記事一覧


Security&Trust フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Security & Trust 記事ランキング

本日 月間