第11回 NETMARKで不正な通信をシャットアウト

面 和毅
サイオステクノロジー株式会社
インフラストラクチャービジネスユニット
Linuxテクノロジー部
OSSテクノロジーグループ
シニアマネージャ
2006/10/5

 sshdでの実例

 それでは、実際にMARKによるLIDSとiptablesの連携を、sshdを用いて見てみましょう。

図4

 図4のようなネットワークを考えてみます。このネットワークで、

  1. ゲストOS上でローカルにログインしたユーザーは、どのネットワークに対しても通信ができます
  2. ゲストOSにssh経由でログインできる端末は、ホストOSのみに限定します
  3. ゲストOSにssh経由でログインしたユーザーは、Target_PCにsshで接続できます。しかし、ssh以外の通信は許可しません
  4. ゲストOSにssh経由でログインしたユーザーは、Target_PC以外の端末とは、通信ができません

を満たすようにLIDSとiptablesを用いて設定を行います。

  1. まず、sshdがソケットを生成した際に、パケットに「MARK 5」が付くようにlidsのACLに設定を追加します。図5にsshdのACLを示しますが、最後の行で/usr/sbin/sshdは「MARK 5」を付けるように設定しています。これにより、sshdを使ってsshでリモートからログインしてシェルを開いて、そのシェル上で通信を行おうとした場合には、すべてのパケットに「MARK 5」がマークされます。このMARK情報を用いて、iptablesでアクセス制御を行います
#!/bin/sh

/sbin/lidsconf -A -s /usr/sbin/sshd -o CAP_SETGID -j GRANT
/sbin/lidsconf -A -s /usr/sbin/sshd -o CAP_SETUID -j GRANT
/sbin/lidsconf -A -s /usr/sbin/sshd -o CAP_SYS_CHROOT -j GRANT
/sbin/lidsconf -A -s /usr/sbin/sshd -o CAP_CHOWN -j GRANT
/sbin/lidsconf -A -s /usr/sbin/sshd -o CAP_NET_BIND_SERVICE 22 -j GRANT
/sbin/lidsconf -A -s /usr/sbin/sshd -o /var/run -j WRITE
/sbin/lidsconf -A -s /usr/sbin/sshd -o /var/run -j WRITE
/sbin/lidsconf -A -s /usr/sbin/sshd -o /dev/ptmx -j WRITE
/sbin/lidsconf -A -s /usr/sbin/sshd -o /dev/ptyp0 -j WRITE
/sbin/lidsconf -A -s /usr/sbin/sshd -o /dev/ptyp1 -j WRITE
/sbin/lidsconf -A -s /usr/sbin/sshd -o /dev/ptyp2 -j WRITE
/sbin/lidsconf -A -s /usr/sbin/sshd -o /dev/ptyp3 -j WRITE
/sbin/lidsconf -A -s /usr/sbin/sshd -o /dev/ptyp4 -j WRITE
/sbin/lidsconf -A -s /usr/sbin/sshd -o /dev/ptyp5 -j WRITE
/sbin/lidsconf -A -s /usr/sbin/sshd -o /dev/ptyp6 -j WRITE
/sbin/lidsconf -A -s /usr/sbin/sshd -o /dev/ptyp7 -j WRITE
/sbin/lidsconf -A -s /usr/sbin/sshd -o /dev/ptyp8 -j WRITE
/sbin/lidsconf -A -s /usr/sbin/sshd -o /dev/ptyp9 -j WRITE
/sbin/lidsconf -A -s /usr/sbin/sshd -o /dev/ptypa -j WRITE
/sbin/lidsconf -A -s /usr/sbin/sshd -o /dev/ptypb -j WRITE
/sbin/lidsconf -A -s /usr/sbin/sshd -o /dev/ptypc -j WRITE
/sbin/lidsconf -A -s /usr/sbin/sshd -o /dev/ptypd -j WRITE
/sbin/lidsconf -A -s /usr/sbin/sshd -o /dev/ptype -j WRITE
/sbin/lidsconf -A -s /usr/sbin/sshd -o /dev/ptypf -j WRITE
# Below line is added for LIDS NF_MARK
/sbin/lidsconf -A -s /usr/sbin/sshd -o LIDS_SOCKET_NF_MARK 5 -j DISABLE
図5
  1. 次に、iptablesを用いてパケットの制御を行います。図6を見てみましょう
#!/bin/sh

/sbin/iptables -t mangle -F

/sbin/iptables -t mangle -P OUTPUT ACCEPT

/sbin/iptables -t mangle -A OUTPUT -j MARK --set-mark 10
/sbin/iptables -t mangle -A OUTPUT -p tcp -d 192.168.230.1 --sport 22 -m mark --mark 5 -j ACCEPT
/sbin/iptables -t mangle -A OUTPUT -p tcp -d 192.168.230.129 --dport 22 -m mark --mark 5 -j ACCEPT
/sbin/iptables -t mangle -A OUTPUT -m mark --mark 5 -j DROP
図6
    1. まず1行目で、mangleテーブルを消去します
    2. 2行目で、OUTPUTチェーンのデフォルトポリシーを「ACCEPT」に設定します。これは、ローカルログインしたユーザーがどことでも通信できるようにという意味で、今回のテストケースでの設定を簡単にするために「ACCEPT」としています。もちろん、iptablesでデフォルトを「DROP」にして、あて先などを細かく絞って必要な通信に関してポートを空けた方が、セキュリティ上は良いでしょう
    3. 3行目で、OUTPUTチェーンでのMARKをデフォルトで「10」に設定しています。これは、今回はsshdとローカルだけでiptablesを書いていますが、いずれsshd以外のパケットもマークを付けて操作することを考えて、すべてのパケットを「10」にマークしています
    4. 4行目で、あて先のIPアドレスが192.168.230.1(ホストOS)で、ポート番号が22番のものが送信元の場合には、通信を許可します。i)でsshdが生成したパケットには「MARK 5」が付いていますので、その/usr/sbin/sshdが生成したOUTPUTチェーンを通るパケットで、上記の条件に当てはまるものは、アクセスを許可しています。これは、今回の例でホストOSからゲストOSにログインを行う際に必要なためです
    5. 5行目で、あて先IPアドレスが192.168.230.129(Target_PC)で、かつあて先ポートが22番で、「MARK 5」の場合には、アクセスを許可しています
    6. 6行目で、そのほかの「MARK 5」が付いているパケットに関しては、すべてDROPしています。これにより、sshdを通してリモートからシェルを開いた場合には、そのシェル上で1〜5行目までのルールに該当しないパケットはすべてDROPされることになりますので、Target_PCにsshで接続を行うという行為以外はできなくなります
  1. 最後に、sshクライアントのLIDS ACLを作成します。図7にsshクライアントのACLがありますので、これを使用します
#!/bin/sh

/sbin/lidsconf -A -s /usr/bin/ssh -o CAP_SETGID -j GRANT
/sbin/lidsconf -A -s /usr/bin/ssh -o CAP_SETUID -j GRANT
/sbin/lidsconf -A -s /usr/bin/ssh -o /dev/tty -j WRITE
/sbin/lidsconf -A -s /usr/bin/ssh -o /lib/libresolv.so.2 -j READONLY
/sbin/lidsconf -A -s /usr/bin/ssh -o /usr/lib/libcrypto.so.0.9.7 -j READONLY
/sbin/lidsconf -A -s /usr/bin/ssh -o /usr/lib/libutil.so -j READONLY
/sbin/lidsconf -A -s /usr/bin/ssh -o /lib/libutil-2.3.2.so -j READONLY
/sbin/lidsconf -A -s /usr/bin/ssh -o /usr/lib/libz.so.1 -j READONLY
/sbin/lidsconf -A -s /usr/bin/ssh -o /lib/libz.so.1 -j READONLY
/sbin/lidsconf -A -s /usr/bin/ssh -o /lib/libnsl.so.1 -j READONLY
/sbin/lidsconf -A -s /usr/bin/ssh -o /lib/libcrypt.so.1 -j READONLY
/sbin/lidsconf -A -s /usr/bin/ssh -o /lib/libc.so.6 -j READONLY
/sbin/lidsconf -A -s /usr/bin/ssh -o /lib/libdl.so.2 -j READONLY
/sbin/lidsconf -A -s /usr/bin/ssh -o /lib/ld-linux.so.2 -j READONLY
/sbin/lidsconf -A -s /usr/bin/ssh -o /lib/libnss_compat-2.3.2.so -j READONLY
/sbin/lidsconf -A -s /usr/bin/ssh -o /usr/lib/libnss_compat.so.2 -j READONLY
/sbin/lidsconf -A -s /usr/bin/ssh -o /lib/libnss_files-2.3.2.so -j READONLY
/sbin/lidsconf -A -s /usr/bin/ssh -o /usr/lib/libnss_files.so -j READONLY
/sbin/lidsconf -A -s /usr/bin/ssh -o /usr/lib/i686/cmov -j READONLY
/sbin/lidsconf -A -s /usr/bin/ssh -o /usr/lib/i686/libcrypto.so.0.9.7 -j READONLY
/sbin/lidsconf -A -s /usr/bin/ssh -o /etc/nsswitch.conf -j READONLY
/sbin/lidsconf -A -s /usr/bin/ssh -o /etc/passwd -j READONLY
/sbin/lidsconf -A -s /usr/bin/ssh -o /dev/urandom -j READONLY
/sbin/lidsconf -A -s /usr/bin/ssh -o /dev/random -j READONLY

/sbin/lidsconf -A -s /usr/bin/ssh -o /root/.ssh -j WRITE
/sbin/lidsconf -A -s /usr/bin/ssh -o CAP_NET_BROADCAST 22 -j GRANT

図7

2/3

Index
NETMARKで不正な通信をシャットアウト
  Page1
iptablesとMARKマッチ
LIDSとMARKマッチ機能
LIDSでMARKマッチ機能を使うためには
Page2
sshdでの実例
  Page3
sshdでの実験


Security&Trust記事一覧


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

注目のテーマ

Security & Trust 記事ランキング

本日 月間