![](/fsecurity/rensai/selinux01/title.gif)
最終回 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の例 |
それぞれ、以下のような動作を行います。
- HTTP_INTチェーンを作成します。これはイントラネット用のApache Webサーバで取り扱うために使用します。
- ポート80番に対するパケットをHTTP_INTチェーンに追加します。
- そのパケットにhttp_int_pkt_t:s0ラベルを付けます。
- このコネクションにラベルがない場合は、このパケットに対するラベルをコピー(--save)します。
- HTTP_INTチェーンをACCEPTに設定します。
- 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記事一覧 |
- Windows起動前後にデバイスを守る工夫、ルートキットを防ぐ (2017/7/24)
Windows 10が備える多彩なセキュリティ対策機能を丸ごと理解するには、5つのスタックに分けて順に押さえていくことが早道だ。連載第1回は、Windows起動前の「デバイスの保護」とHyper-Vを用いたセキュリティ構成について紹介する。 - WannaCryがホンダやマクドにも。中学3年生が作ったランサムウェアの正体も話題に (2017/7/11)
2017年6月のセキュリティクラスタでは、「WannaCry」の残り火にやられたホンダや亜種に感染したマクドナルドに注目が集まった他、ランサムウェアを作成して配布した中学3年生、ランサムウェアに降伏してしまった韓国のホスティング企業など、5月に引き続きランサムウェアの話題が席巻していました。 - Recruit-CSIRTがマルウェアの「培養」用に内製した動的解析環境、その目的と工夫とは (2017/7/10)
代表的なマルウェア解析方法を紹介し、自社のみに影響があるマルウェアを「培養」するために構築した動的解析環境について解説する - 侵入されることを前提に考える――内部対策はログ管理から (2017/7/5)
人員リソースや予算の限られた中堅・中小企業にとって、大企業で導入されがちな、過剰に高機能で管理負荷の高いセキュリティ対策を施すのは現実的ではない。本連載では、中堅・中小企業が目指すべきセキュリティ対策の“現実解“を、特に標的型攻撃(APT:Advanced Persistent Threat)対策の観点から考える。
![]() |
|
|
|
![]() |