このエントリーをはてなブックマークに追加
スポンサーリンク

ファイアウォールの設定

ファイアウォールとは

もし、あなたがハワイに旅行に行ったとします。飛行機を降りると入国審査のゲートで「どこから来た」「どこへ行く」「目的は?」と色々聞かれるでしょう。(もっとも、どこから来たかはパスポート見ればわかるので、まず聞かれないですが・・・)このように、どこから来て、どこへ何をしに行くかが定かではない人を入国させないようにするのが入国審査です。

ネットワーク群を上位ルーターに接続した時点で、世界中から色々なパケットがネットワーク群に入ってきます。そこで、ルーターでパケットを解析し、そのパケットがどこから来て、どこへ、何しに行くのかを判断して、通して良いと判断したパケットだけネットワークに入れます。これがファイアウォールです。

ファイアウォールは、業務用ファイアウォール装置を使うという手もあります。ファイアウォール装置にはFortigateやNetscreenなど色々な機器があります。しかし、それらは小規模なネットワークを構築するには少々高額です。

ここではLinux機をルーターとして使いますので、それにファイアウォール機能を組み込みましょう。ファイアウォールには、IPTABLESを使います。

テーブルの初期化

現設定をクリアします。電源投入時に自動的にスクリプトで設定するようになっている場合、テーブルの初期化の必要はないでしょう。しかし、テーブルを再設定するたびにサーバーを再起動したのでは設定を試すのに時間がかかってしまいます。

Windowsパソコンで慣れてしまうと、パソコンの再起動はあまり苦にならないかもしれませんが、コマンドで初期化できれば、それで済むことです。Linuxサーバーは共同で使うものですので、やたらに再起動しないようにしなければなりません。
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
上の例では、インプットとアウトプット、フォワードのテーブルを初期化します。

注意:-Fは、デフォルトのポリシー以外を初期化するコマンドです。したがって、デフォルトのポリシーがDROPの時にリモートでこれをやるとアクセス不能になってしまいます。

なるべくならIPTABLESの変更は、サーバーに直接キーボードとディスプレイを繋いで行いましょう。

インプット/アウトプットとフォワード

インプットテーブルとは、そのサーバー機自身に入ってくるパケットに対する設定です。アウトプットテーブルとは、そのサーバー機自身から出て行くパケットに対する設定です。

そして、ルーター機の場合重要なのがフォワードテーブルです。フォワードテーブルは、そのルーター機の片方のネットワークカードから入って、もう片方のネットワークカードから出て行くパケットに対して行う設定です。

インプットテーブルにだけファイアウォールを設定すると、そのルーター機につながった他のサーバーに対して無防備になってしまいます。また、フォワードテーブルにだけファイアウォールを設定すると、そのルーター機自身に対する攻撃に無防備になってしまいます。

基本的に、ルーター機はインプットとフォワード両方にファイアウォールを設定しなければなりません。IPCHAINSでは、フォワードを設定するときに、インプット・フォワード・アウトプットすべてが連動して設定しなければなりませんでしたが、IPTABLESではまったく別物として設定するため、設定はだいぶ楽になりました。

デフォルトのポリシーの設定

たとえば、「どんなピンチの時も絶対あきらめない」というのが乙女のポリシー(?)だった場合、「迷ったときは、あきらめずに目標達成までつづける」という意味だと思います。(そうか??)また、「君主危うくに近寄らず」というのがデフォルトのポリシーな人は、「迷ったときはいったん安全を確保するまで退却」という事になるでしょう。

このように、 デフォルトのポリシーとは、つまり、特に指定がないものに対しては、どうするか、という設定です。

「特に指定がない場合は許可」に設定した場合、セキュリティーは甘くなります。管理者が思いもよらない攻撃をされた場合、許可になってしまうからです。ですので、基本的にデフォルトのポリシーは禁止にすべきです。

しかしながら、アウトプットテーブルだけは、ルーター機自身から出て行くパケットですので、デフォルトを許可にしておいても良いでしょう。
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
INPUT ルーター自身宛のパケットに対して
FORWARD ルーターにつながったLAN側サーバーに対して
OUTPUT ルーター自身から発するパケットに対して
-P ポリシーの設定
ACCEPT 許可
DROP 禁止(パケットを捨てる)
上の例では、インプットとフォワードに対しては、デフォルトを禁止にして、アウトプットのみデフォルトを許可に設定しています。

自分自身と内部LANからのパケットは許可

ループバック(loからの入力)と、LAN側からのパケットは許可しておきます。

内部LANからのパケットを無条件で許可してしまうと、社内で破壊工作を行ったり、他の部署をハッキングしたり、極秘資料を入手したりされるかもしれませんが、よほどの重大データ−を扱っている所(銀行とか)以外では、許可にしておいても良いでしょう。
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A FORWARD -i lo -j ACCEPT
iptables -A FORWARD -i eth0 -j ACCEPT
-i lo 自分自身からの入力
-i eth0 eth0(LAN側)からの入力
-j ACCEPT 許可に設定

PINGを許可

icmpプロトコルは、ごく短いパケットを送受信する際に使われますが、たいていはPINGでしか使われません。また、icmpプロトコルを許可にしておかないと、自分が外側からサーバーのダウンを調べる時に困ります。なので、一応icmpプロトコルは許可しておきます。
iptables -A INPUT -p icmp -j ACCEPT
iptables -A FORWARD -p icmp -j ACCEPT
-p icmp  「icmpプロトコルだったら」という意味
ただ、PINGを許可したとたん、世界中からそのIPにサーバーが設置された事がバレます。実際、筆者も新しいサーバーを設置したとたん、すぐに英単語総当りによるsshでの接続要求パケットが山ほど来ました。

もし、必要がないのであれば、icmpプロトコル事態を禁止しておけば、サーバーの存在を(多少なりとも)隠す事ができるでしょう。

サーバーの生存確認のためにPINGの許可が必要というのであれば、生存確認するアドレス(アドレス帯)に対してのみ許可を与えておきましょう。
iptables -A INPUT -p icmp -s (許可するアドレス帯) -j ACCEPT

接続が確立した後のパケットは許可

FTPでパッシブモードを使う場合、まずサーバーが1024番以降の任意のポートを空けて、そこをデータ−通信として利用します。

では、1024番以降の任意のポートを開けっ放しにしてしまえば良いでしょうか?それでは、セキュリティーがかなり低下してしまいます。かといって、パッシブモードは接続するたびに空けるポートがかわるので、一概にどのポートをあければ良いかというのがわかりません。

そこで、接続が確立した後にやりとりされるパケットを、ポートに無条件で許可に設定します。
iptables -A INPUT -i ppp+ -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i ppp+ -m state --state ESTABLISHED,RELATED -j ACCEPT
ESTABLISHED  自分から相手に向けのパケットを示す。
RELATED   FTPパッシブモードなど、いったん接続が確立した後の関連パケットを示す。
これにより、いったん接続が確立した後はポートに関係なく、データ−の送信(ESTABLISHEDパケット)や受信(RELATEDパケット)を送る事ができます。

※RedHatLinux7.1のCD-ROMに収録されているバージョンのIPTABLESには、ESTABLISHED,RELATEDを指定すると全パケットを許可してしまうというバグがあり、大変危険です。該当ディストリビューションをお使いの方は、ただちにrpmでiptablesの最新版をインストールしてください。

インターネットからローカルアドレスのパケット来た!?

ローカルアドレス(192.168.xxx.xxxなど)は、インターネットには流してはいけない事になっています。それなので、インターネットから送信元がローカルアドレスのパケットが来た場合、それ自体が不正という事になります。

ネットワーク内に設置されたサーバーは、ローカルIPには無防備になっているケースが多いです。例えば、プリントサーバーやファイルサーバーに対して無条件でアクセス許可するために、192.168.0.xxxには無条件でACCEPTになっている、という風に。

なので、このような不正なパケットは破棄します。
iptables -A INPUT -i ppp+ -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i ppp+ -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i ppp+ -s 192.168.0.0/16 -j DROP
iptables -A FORWARD -i ppp+ -s 10.0.0.0/8 -j DROP
iptables -A FORWARD -i ppp+ -s 172.16.0.0/12 -j DROP
iptables -A FORWARD -i ppp+ -s 192.168.0.0/16 -j DROP
-i ppp+  PPP接続からのパケットに対する設定
-s 10.0.0.8/8 送信元が10.xxx.xxx.xxxというアドレスだったら
-s 172.16.0.0/12  送信元が172.16.xxx.xxxというアドレスだったら
-s 192.168.0.0/16  送信元が192.168.xxx.xxxというアドレスだったら
-j DROP パケットを捨てる

インターネットから内部アドレス宛のパケットが来た!?

インターネット側からローカルアドレスが送信元のパケットが来た場合は不正なパケットですが、同様に、インターネット側からローカルアドレス宛のパケットが来た場合も不正なパケットという事になります。

なので、このような不正なパケットは破棄します。
iptables -A INPUT -i ppp+ -d 10.0.0.0/8 -j DROP
iptables -A INPUT -i ppp+ -d 172.16.0.0/12 -j DROP
iptables -A INPUT -i ppp+ -d 192.168.0.0/16 -j DROP
iptables -A FORWARD -i ppp+ -d 10.0.0.0/8 -j DROP
iptables -A FORWARD -i ppp+ -d 172.16.0.0/12 -j DROP
iptables -A FORWARD -i ppp+ -d 192.168.0.0/16 -j DROP
-i ppp+  PPP接続からのパケットに対する設定
-d 10.0.0/8 目的のアドレスが、10.xxx.xxx.xxxだったら
-d 172.16.0.0/12 目的のアドレスが、172.16.xxx.xxxだったら
-d 192.168.0.0/16  目的のアドレスが、192.168.xxx.xxxだったら
-j DROP パケットを捨てる

synフラッド攻撃、PING攻撃の対策

synパケットを大量に送り付けられたり(synフラッド攻撃)、PINGを大量に送りつけられると、Linuxはフリーズしてしまいます。なのでインターネットには、それをわざとやる嫌がらせをする人がいます。

それを防ぐために、syn信号やpingは1秒に1回だけ受け付けるように設定しておきます。
iptables -A INPUT -i ppp+ -p tcp --syn -m limit --limit 1/s -j ACCEPT
iptables -A FORWARD -i ppp+ -p tcp --syn -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -i ppp+ -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A FORWARD -i ppp+ -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

使うポートだけ許可

サーバーを設置しただけでは、MySQLやswatなどLAN内部からしか使わないサービスに対しても、ポートを開けっ放しにしてしまいます。外部からアクセスするのに最小限必要なポートだけを空けておけば、セキュリティーは向上します。
iptables -A INPUT -i ppp+ -p tcp --dport ftp-data -j ACCEPT
iptables -A INPUT -i ppp+ -p tcp --dport ftp -j ACCEPT
iptables -A INPUT -i ppp+ -p tcp --dport ssh -j ACCEPT
iptables -A INPUT -i ppp+ -p tcp --dport telnet -j ACCEPT
iptables -A INPUT -i ppp+ -p tcp --dport domain -j ACCEPT
iptables -A INPUT -i ppp+ -p udp --dport domain -j ACCEPT
iptables -A INPUT -i ppp+ -p tcp --dport http -j ACCEPT
iptables -A FORWARD -i ppp+ -p tcp --dport ftp-data -j ACCEPT
iptables -A FORWARD -i ppp+ -p tcp --dport ftp -j ACCEPT
iptables -A FORWARD -i ppp+ -p tcp --dport ssh -j ACCEPT
iptables -A FORWARD -i ppp+ -p tcp --dport telnet -j ACCEPT
iptables -A FORWARD -i ppp+ -p tcp --dport domain -j ACCEPT
iptables -A FORWARD -i ppp+ -p udp --dport domain -j ACCEPT
iptables -A FORWARD -i ppp+ -p tcp --dport http -j ACCEPT
-p tcpは、「tcpプロトコル」を指定します。ネームサーバー(BIND)を提供する場合、tcpだけでなくudpプロトコルも使いますので、「-p udp」も許可に設定しておく必要があります。

--dportは、指定されたポートに対する設定です。ここには、--doprt 80のように直接数字を記述するか、上の例のようにサービス名で記述するか(この場合、/etc/servicesにサービス名が登録されている必要があります)、--dport 1024:65535のようなポートの範囲で指定します。

ここではtelnetを許可していますが、telnetはパスワードが平文で流れるため、セキュリティーは甘くなります。外部からのtelnetを禁止しておいて、sshだけを許可にしておくと、セキュリティーは向上します。

メールサーバーを設置するのであれば、この他にsmtpやpop3も許可しておく必要があります。

重要なのは、「提供するサービスで使うポートだけ空ける」ことです。不要なサービスのためのポートを空けておくと、それだけセキュリティーホールとなってしまいます。

ウィルス発生マシンチェック

ローカル端末内のどこかにウィルスに感染しているPCがあると、そこから延々とウィルスを発生し続けてしまいます。すると、そのネットワークのルーターが固定IPならばそのIPが、また、動的IPならば最悪そのプロバイダ全体がブラックリストに登録されてしまいます。またはプロバイダからSMTPポートを閉ざされてしまいます。

最近のプロバイダでは、25番ポートは完全に閉じていて、587番ポートからSMTP−AUTH付きでないと送信できない所が多いです。それは、ユーザーのPCがウィルスに感染していてウィルスを大量にバラまいている場合に、プロバイダとしては顧客の全PCのウィルスチェックはできませんから、ブラックリスト入りを防ぐためには25番ポートを閉ざすしかないからです。

ここでは、固定IPを使っていてゲーウェイサーバーを運営する立場で考えて見ましょう。プロバイダからは25番ポートは許可されているとします。しかし、ウィルスを送信し続ければ、やがて25番ポートを封鎖されてしまうでしょう。そこで、25番ポートへの送信をログに記録させます。
IPTABLES -A FORWARD -p tcp --src 192.168.0.0/24 --dport smtp -j LOG --log-prefix "[SMTP] : " --log-level 3
これでログレベル3(ワーニング)に、25番ポートへの送信パケットのログを残すようにしました。さらに、シスログに、ログレベル3の出力先のファイル名を指定しておきます。

vi /etc/syslog.conf
kern.warning /var/log/iptables
/etc/rc.d/init.d/syslogd restart

これで、25番ポートへの送信の記録が/var/log/iptablesに記録されます。ただし、このままではログが膨大になってしまいますので、/etc/logrotate.d/syslogファイルに、ローテーションの指定を追加します。

また、記録するだけでは何の役にも立ちませんので、頻繁にcatやtail -f コマンドでこのログを監視し、SPAMやウィルスをバラまいている端末を発見したら、ただちにその端末の使用を中止させます。

設定の保存

これまでの設定を保存しておきます。iptables-saveというコマンドを使うと、これまでの設定が保存されます・・・といいたい所ですが、このコマンドは単に設定ファイルを標準出力するだけなので、実際には/etc/sysconfig/iptablesというファイルにリダイレクトしなければなりません。
iptables-save > /etc/sysconfig/iptables

ただし、RedHatLinux系のOSでは/etc/rc.d/init.d/iptables にsaveという引数をつける事で、IPTABLESの設定を保存する事ができます。
/etc/rc.d/init.d/iptables save

こうして設定を保存しておけば、次回にサーバーが起動した時に自動的にIPTABLESが設定した内容になります。
スポンサーリンク