次のページ 前のページ 目次へ

15. APPENDEX A - スクリプトの例

15.1 GFCC を用いた RC スクリプト

#!/bin/bash
#
# Firewall Script - Version 0.9.1
#
# chkconfig: 2345 09 99
# 概要: 2.2.x カーネル用ファイアウォールスクリプト
# テストの際には
# -x を追加すること。
#
# 注意 - 
#
# このスクリプトは RedHat 6.0 及びそれ以降のバージョン向けに書かれて
# います。
#
# ウェブや ftp サーバのような公開サービスを提供する場合は注意して
# ください。
#
# インストール - 
#  1. /etc/rc.d/init.d の中にこのファイルを置きます。
#     (root にならなければならないでしょう...)
#     "firewall" のような名前にします    :-)
#     所有権を root にします -->  "chown root.root (ファイル名)"
#     実行属性を立てます     -->  "chmod 755 (ファイル名)"
#
#  2. ファイアウォールルールを作る為に GFCC を使い、
#     ファイル /etc/gfcc/rules/firewall.rule.sh に書き写します。
#
#  3. RedHat の init スクリプトにファイアウォールを
#     追加します --> "chkconfig --add (ファイル名)"
#     次回ルータを起動すると firewall サービスが自動的に起動するはずです!
#     *前より少しは* 脆弱でなくなっているので、夜はぐっすり寝てください。
#
# リリースノート
#   30 Jan, 2000 - GFCC スクリプトに変更
#   11 Dec, 1999 - Mark Grennan <mark@grennan.com> による更新
#   20 July, 1999 - 最初の作品 - Anthony Ball <tony@LinuxSIG.org>
#

################################################

# 関数ライブラリを読み込みます。
. /etc/rc.d/init.d/functions

# ネットワーク設定を読み込みます。
. /etc/sysconfig/network

# ネットワークが起動しているかチェックします。
[ ${NETWORKING} = "no" ] && exit 0

# 何が呼び出されたかを見ます。
case "$1" in

  start)
        # アクセス機能の提供を開始します。
        action "Starting firewall: " /bin/true
        /etc/gfcc/rules/firewall.rule.sh
        action "Loading firewall modules: " /bin/true
#       /sbin/insmod ip_masq_autofw
#       /sbin/insmod ip_masq_suseeme
        /sbin/insmod ip_masq_ftp
        /sbin/insmod ip_masq_irc
#       /sbin/insmod ip_masq_mfw
#       /sbin/insmod ip_masq_portfw
#       /sbin/insmod ip_masq_quake
        /sbin/insmod ip_masq_raudio
#       /sbin/insmod ip_masq_user
#       /sbin/insmod ip_masq_vdolive
        echo
        ;;

  stop)
        action "Stoping firewall: " /bin/true
        echo 0 > /proc/sys/net/ipv4/ip_forward
        /sbin/ipchains -F input
        /sbin/ipchains -F output
        /sbin/ipchains -F forward

        echo
        ;;

  restart)
        action "Restarting firewall: " /bin/true
        $0 stop
        $0 start

        echo
        ;;

  status)
        # 設定内容をリスト表示します。
        /sbin/ipchains -L
        ;;

  test)
        action "Test Mode firewall: " /bin/true
        /sbin/ipchains -F input
        /sbin/ipchains -F output
        /sbin/ipchains -F forward
        echo 1 > /proc/sys/net/ipv4/ip_forward
        /sbin/ipchains -A input -j ACCEPT
        /sbin/ipchains -A output -j ACCEPT
        /sbin/ipchains -P forward DENY
        /sbin/ipchains -A forward -i $PUBLIC -j MASQ

        echo
        ;;

  *)
        echo "Usage: $0 {start|stop|restart|status|test}"
        exit 1

esac

15.2 GFCC スクリプト

このスクリプトは Graphical Firewall program (GFCC) によって 生成されました。 これは動作するルールセットではありません。 転写されたルールセットです。


#!/bin/sh
# Gtk+ ファイアウォールコントロールセンターが生成しました。

IPCHAINS=/sbin/ipchains


localnet="192.168.1.0/24"
firewallhost="192.168.1.1/32"
localhost="172.0.0.0/8"
DNS1="24.94.163.119/32"
DNS2="24.94.163.124/32"
Broadcast="255.255.255.255/32"
Multicast="224.0.0.0/8"
Any="0.0.0.0/0"
mail_grennan_com="192.168.1.1/32"
mark_grennan_com="192.168.1.3/32"

$IPCHAINS -P input DENY
$IPCHAINS -P forward ACCEPT
$IPCHAINS -P output ACCEPT

$IPCHAINS -F
$IPCHAINS -X

# input ルール
$IPCHAINS -A input -s $Any -d $Broadcast -j DENY 
$IPCHAINS -A input -p udp -s $Any -d $Any netbios-ns -j DENY 
$IPCHAINS -A input -p tcp -s $Any -d $Any netbios-ns -j DENY 
$IPCHAINS -A input -p udp -s $Any -d $Any netbios-dgm -j DENY 
$IPCHAINS -A input -p tcp -s $Any -d $Any netbios-dgm -j DENY 
$IPCHAINS -A input -p udp -s $Any -d $Any bootps -j DENY 
$IPCHAINS -A input -p udp -s $Any -d $Any bootpc -j DENY 
$IPCHAINS -A input -s $Multicast -d $Any -j DENY 
$IPCHAINS -A input -s $localhost -d $Any -i lo -j ACCEPT 
$IPCHAINS -A input -s $localnet -d $Any -i eth1 -j ACCEPT 
$IPCHAINS -A input -s $localnet -d $Broadcast -i eth1 -j ACCEPT 
$IPCHAINS -A input -p icmp -s $Any -d $Any -j ACCEPT 
$IPCHAINS -A input -p tcp -s $Any -d $Any -j ACCEPT ! -y 
$IPCHAINS -A input -p udp -s $DNS1 domain -d $Any 1023:65535 -j ACCEPT 
$IPCHAINS -A input -p udp -s $DNS2 domain -d $Any 1023:65535 -j ACCEPT 
$IPCHAINS -A input -p tcp -s $Any -d $Any ssh -j ACCEPT 
$IPCHAINS -A input -p tcp -s $Any -d $Any telnet -j ACCEPT 
$IPCHAINS -A input -p tcp -s $Any -d $Any smtp -j ACCEPT 
$IPCHAINS -A input -p tcp -s $Any -d $Any pop-3 -j ACCEPT 
$IPCHAINS -A input -p tcp -s $Any -d $Any auth -j ACCEPT 
$IPCHAINS -A input -p tcp -s $Any -d $Any www -j ACCEPT 
$IPCHAINS -A input -p tcp -s $Any -d $Any ftp -j ACCEPT 
$IPCHAINS -A input -s $Any -d $Any -j DENY -l 

# forward ルール
$IPCHAINS -A forward -s $localnet -d $Any -j MASQ 

# output ルール

15.3 GFCC を使わない RC スクリプト

これは手書きで構築したファイアウォールのルールセットです。 GFCC は使いません。

#!/bin/bash
#
# Firewall Script - Version 0.9.0

# chkconfig: 2345 09 99
# 概要: 2.2.x カーネル用ファイアウォールスクリプト

# テストの際には
# -x を追加すること。

#
# 注意 - 
#
# このスクリプトは RedHat 6.0 及びそれ以降のバージョン向けに書かれています。
#
#  このファイアウォールスクリプトは、大部分のダイアルアップかケーブルモデム
#  を使用したルータで動く筈です。
#  RedHat ディストリビューション用に作成しました。
#
#  web や ftp サーバのような公開サービスを提供する場合は注意してください。
#
# インストール -
#  1. このファイルは RedHat システム用に作られています。このままで他の
#     ディストリビューションでも動くと思いますが、もう一度確認した方が
#     いいでしょう。
#     もしかして動かないかもしれないから?!!?
#     これらの手順は RedHat システムに適用します。
#
#  2. /etc/rc.d/init.d の中にこのファイルを置きます (root になって...)
#     "firewall" のような名前にします    :-)
#     所有権を root にします -->  "chown root.root <ファイル名>"
#     実行権をつけます -->  "chmod 755 <ファイル名>"
#
#  3. ネットワーク、使用するインターフェース、DNS サーバの設定をします。
#     uncomment で始まる行の下で、受付けサービスを選択し有効にします。
#     "eth0" が使用する NIC か確認します (或はあなたのシステムのネットワーク
#     インターフェース名に変更します)。
#     テストするには -->  "/etc/rc.d/init.d/<ファイル名> start"
#     ルールを一覧するには -->  "ipchains -L -n"
#     誤りがあれば修正しましょう...  :-)
#
#  4. RedHat の init スクリプトにファイアウォールを追加します
#                                     --> "chkconfig --add <ファイル名>"
#     次回ルータを起動すると firewall サービスが自動的に起動するはずです!
#     *前より少しは* 脆弱でなくなっているので、夜はぐっすり寝てください。
#
# リリースノート
#   20 July, 1999 - 最初の作品 - Anthony Ball <tony@LinuxSIG.org>
#   11 Dec, 1999 - Mark Grennan <mark@grennan.com> による更新
#

################################################
#  あなたのローカルネットワークに適合する値を記入してください。

PRIVATENET=xxx.xxx.xxx.xxx/xx

PUBLIC=ppp0
PRIVATE=eth0

# あなたの dns サーバの設定
DNS1=xxx.xxx.xxx.xxx
DNS2=xxx.xxx.xxx.xxx

################################################
# ネットワークの設定に用いる汎用的な値を定義します。
ANY=0.0.0.0/0
ALLONES=255.255.255.255

# 関数ライブラリを読み込みます。
. /etc/rc.d/init.d/functions

# ネットワーク設定を読み込みます。
. /etc/sysconfig/network

# ネットワークが起動しているかチェックします。
[ ${NETWORKING} = "no" ] && exit 0

# 何が呼び出されたかを見ます。
case "$1" in

  start)
        # アクセス機能の提供を開始します。
        action "Starting firewall: " /bin/true

        ##
        ## 環境設定
        ##
        # 全てのチェインのリストを全消去します。
        /sbin/ipchains -F input
        /sbin/ipchains -F output
        /sbin/ipchains -F forward

        # input チェインに蓋をかぶせて、全てのポートをふさぎます。
        /sbin/ipchains -I input 1 -j DENY

        # ポリシーを否定 (DENY) に設定します。 (デフォルトはACCEPT)
        /sbin/ipchains -P input DENY
        /sbin/ipchains -P output ACCEPT
        /sbin/ipchains -P forward ACCEPT

        # パケットフォワーディングを有効にします。
        echo 1 > /proc/sys/net/ipv4/ip_forward

        ##
        ## モジュールのインストール
        ##
        # アクティブ ftp モジュールを読み込みます。
        # ローカルネットワーク上のマシンに非パッシヴ ftp アクセスが
        # できるようにします。
        # (但し、ルータ自身はマスカレードされていないので除外されます。)
        if ! ( /sbin/lsmod | /bin/grep masq_ftp > /dev/null ); then
            /sbin/insmod ip_masq_ftp
        fi

        ##
        ## セキュリティ関係
        ##
        # 現存するネットワークインターフェースおよび今後発生するであろう
        # ネットワークインターフェースに対し、発信アドレスの立証と偽装保護を
        # 有効にします。
        # 
        # 
        if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then
            for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
                echo 1 > $f
            done
        else
            echo
            echo "PROBLEMS SETTING UP IP SPOOFING PROTECTION.  BE WORRIED."
            echo
        fi

        # 現存する全てのネットワークインターフェースのブロードキャストを
        # 否定します。
        /sbin/ipchains -A input -d 0.0.0.0 -j DENY
        /sbin/ipchains -A input -d 255.255.255.255 -j DENY

        # これらはログ記録することなく否定します。
        /sbin/ipchains -A input -p udp -d $ANY 137 -j DENY   # NetBIOS over IP
        /sbin/ipchains -A input -p tcp -d $ANY 137 -j DENY   #   ""
        /sbin/ipchains -A input -p udp -d $ANY 138 -j DENY   #   ""
        /sbin/ipchains -A input -p tcp -d $ANY 138 -j DENY   #   ""
        /sbin/ipchains -A input -p udp -d $ANY 67 -j DENY    # bootp
        /sbin/ipchains -A input -p udp -d $ANY 68 -j DENY    #   ""
        /sbin/ipchains -A input -s 224.0.0.0/8 -j DENY       # Multicast addresses

        ##
        ## プライベートネットワークから発するパケットを許可します。
        ##
        # ループバックインターフェース上の全てのパケットを許可します。
        /sbin/ipchains -A input -i lo -j ACCEPT

        # 内部の "信頼できる" インターフェースから発せられるパケットを全て
        # 許可します。
        /sbin/ipchains -A input -i $PRIVATE -s $PRIVATENET -d $ANY -j ACCEPT
        /sbin/ipchains -A input -i $PRIVATE -d $ALLONES -j ACCEPT

        ## 
        ## ファイアウォールへの外部サービスを許可します。
        ##
        # ICMP を許可します。
        /sbin/ipchains -A input -p icmp -j ACCEPT
        # TCP を許可します。
        # 【訳注: tcp syn パケット以外を許可します。】
        /sbin/ipchains -A input -p tcp ! -y -j ACCEPT

        # (ファイアウォール上の)DNS探索を許可します。
        /sbin/ipchains -A input -p udp -s $DNS1 domain -d $ANY 1023: -j ACCEPT
        /sbin/ipchains -A input -p udp -s $DNS2 domain -d $ANY 1023: -j ACCEPT
        # あるいは (より良い案として) キャッシュ DNS サーバをルータ上で
        # 稼動させ、上記の代わりに以下の行を用います。
        # /sbin/ipchains -A input -p udp -s $DNS1 domain -d $ANY domain -j ACCEPT
        # /sbin/ipchains -A input -p udp -s $DNS2 domain -d $ANY domain -j ACCEPT

        # 以下の行で ssh を許可します。
        /sbin/ipchains -A input -p tcp -d $ANY 22 -j ACCEPT

        # 以下の行で telnet を許可します。 (お薦めしません!!)
        /sbin/ipchains -A input -p tcp -d $ANY telnet -j ACCEPT

        # 以下の行でルータに NTP (network time protocol: ネットワーク
        # タイムプロトコル) を許可します。
        # /sbin/ipchains -A input -p udp -d $ANY ntp -j ACCEPT

        # SMTP を許可します。 (メールクライアントの為ではありません - サーバ
        # だけです)
        /sbin/ipchains -A input -p tcp -d $ANY smtp -j ACCEPT

        # POP3 を許可します。(メールクライアント用)
        /sbin/ipchains -A input -p tcp -d $ANY 110 -j ACCEPT

        # メール送信または ftp アクセスに用いる auth プロトコルを
        # 許可します。
        /sbin/ipchains -A input -p tcp -d $ANY auth -j ACCEPT

        # 外部からの HTTP アクセスを許可します。
        # (ルータ上で web サーバを稼働している場合に限ります。)
        /sbin/ipchains -A input -p tcp -d $ANY http -j ACCEPT

        # 外部からの FTP アクセスを許可します。
        /sbin/ipchains -A input -p tcp -d $ANY ftp -j ACCEPT

        ##
        ## マスカレード関係
        ##
        # 内部ネットワークから転送されたパケットをマスカレードします。
        /sbin/ipchains -A forward -s $PRIVATENET -d $ANY -j MASQ

        ##
        ## 上記以外の全てを拒否し、 /var/log/messages へログ記録します。
        ##
        /sbin/ipchains -A input -l -j DENY

        # input チェインにかぶせていた蓋を取り外します。
        /sbin/ipchains -D input 1

        ;;

  stop)
        action "Stoping firewall: " /bin/true
        echo 0 > /proc/sys/net/ipv4/ip_forward
        /sbin/ipchains -F input
        /sbin/ipchains -F output
        /sbin/ipchains -F forward

        echo
        ;;

  restart)
        action "Restarting firewall: " /bin/true
        $0 stop
        $0 start

        echo
        ;;

  status)
        # 設定内容をリスト表示します。
        /sbin/ipchains -L
        ;;

  test)
        ##
        ## とても単純なファイアウォールのテストです。
        ## (*全く*セキュアではありません)
        ## 【訳注: パケットフィルタリングの設定を全て取り払い、
        ## マスカレードの設定のみ有効にします。
        ## この設定は長時間続けてはなりません。】
        action "WARNING Test Firewall: " /bin/true
        /sbin/ipchains -F input
        /sbin/ipchains -F output
        /sbin/ipchains -F forward
        echo 1 > /proc/sys/net/ipv4/ip_forward
        /sbin/ipchains -A input -j ACCEPT
        /sbin/ipchains -A output -j ACCEPT
        /sbin/ipchains -P forward DENY
        /sbin/ipchains -A forward -i $PUBLIC -j MASQ

        echo
        ;;

  *)
        echo "Usage: $0 {start|stop|restart|status|test}"
        exit 1

esac


次のページ 前のページ 目次へ