ホーム » 「FireWall」タグがついた投稿
タグアーカイブ: FireWall
FireWall用のブラックリスト自動生成
自宅サーバでは、FireWall を動かしているけど、アクセス履歴を見ると色々と怪しい接続が気になる。ある程度は LOG を確認して、FireWall の拒否リストを整理していたけど、自動化してみた。
FireWall では、主要なのは iptables で管理し、巨大な拒否リストになりそうなものは、ipset で拒否リストを作り、iptables から、その ipset を参照するようにしている。
GEOIPDENY により国ごと拒否
- 国ごと拒否リスト make-geoip-deny.pl
RIR の IPアドレス範囲と国ドメインのデータベースをダウンロードして、拒否リストを生成。かなり巨大なリストが作られる。
((更新状況を確認)) [root]# ./make-geoip-deny.pl -d | head /usr/bin/wget -q -O - 'ftp://ftp.arin.net/pub/stats/arin/delegated-arin-extended-latest' /usr/bin/wget -q -O - 'ftp://ftp.ripe.net/pub/stats/ripencc/delegated-ripencc-extended-latest' /usr/bin/wget -q -O - 'ftp://ftp.apnic.net/pub/stats/apnic/delegated-apnic-extended-latest' /usr/bin/wget -q -O - 'ftp://ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-extended-latest' /usr/bin/wget -q -O - 'ftp://ftp.afrinic.net/pub/stats/afrinic/delegated-afrinic-extended-latest' ipset count before : 65658 ipset count merge : 26038 ipset count after : 39526 ((FireWallの更新)) [root]# systemctl stop ferm && systemctl start ferm
25か国の接続を拒否しているけど、単純に RIR の情報だと 65658件のアドレスブロック。25か国のアドレスブロックで隣接しているアドレスブロックをマージして、26038件に減らせた。しかし、サブネットマスクに指定できるアドレスブロックに変換して、最終的に 39526 行の拒否リストが出来上がっている。
RIRのデータのダウンロードに時間がかかり30秒ほどかかるし、国に割り振られる IPv4 アドレスなんて変化も少ないので、気が向いた時に更新かな。
SMTPDENY と SSHDENY
- SMTPの拒否リスト make-smtp-deny.pl
SASL login を試す攻撃が多いので、/var/log/mail.log の履歴から、拒否リストを生成。 - SSHの拒否リスト make-ssh-deny.pl
ssh は、/etc/hosts.allow で、自分が使うネットワーク以外は接続を拒否して ssh 自身は既に守っているけど、接続を試すような相手はヤバイので ssh 以外すべての接続を拒否させる。/var/log/messages の履歴から生成。
怪しい接続をしてくる IP アドレスを抽出し、クラス C でグループ化して、数十回の接続履歴のあるものを抜粋して、拒否リストを生成している。それぞれ 30 行ほどの拒否リストとなった。
この拒否リストは、生成も1秒程度で生成できるので、cron.weekly にて更新。
ファイアウォールとiptables
インターネットからの攻撃を防ぐには、ファイアウォールが必要となる。外部からの接続をうけるコンピュータは、ファイアウォールがどう設定されているのか把握することが重要。
ファイアウォールとDMZ
ファイアウォールは、パケットの(送信元IPアドレス,送信元ポート番号)、(宛先IPアドレス,宛先ポート番号)を見て、通信を制限するルータであり、専用のファイアウォールではさらに細かい制限を加えたり、通信履歴を保存することができる。
組織向けの外部公開のWebサーバやメールサーバを持つ組織では、外部からの接続をうける必要があり、脆弱性があればサーバは乗っ取りなどの被害に会いやすい。サーバが被害を受けたらファイアウォール内部のコンピュータに被害が広がる(トロイの木馬)のは危険であることから、(1) DMZ(非武装地帯)内部に外部公開のサーバを置き、(2) 対外FireWallで外部からのパケットはすべてDMZだけに通す。(3) 内部FireWall では、DMZ の特定の受信パケットだけ流す様にする。
DMZ内部のサーバは、外部からの攻撃をうけるため、極めて慎重にセキュリティ対策を行う必要がある。
iptables
Linux で FireWall を構築するときには、iptables を用いる。iptables では、主に以下の3つのルール(チェイン)でパケットを制限できる。
- コンピュータに入ってくるパケットに対するルール(INPUT チェイン)、
- コンピュータから出ていくパケットに対するルール(OUTPUTチェイン)、
- コンピュータで中継するパケットに対するルール(FORWARDチェイン)
iptables の設定を見るには、iptables -L を実行する。
$ sudo iptables -L # すべてのルールを表示 Chain INPUT (policy DROP) target prot opt source destination DROP all -- anywhere anywhere state INVALID ACCEPT all -- 192.168.11.0/24 anywhere ACCEPT tcp -- anywhere anywhere tcp dpt:http ACCEPT tcp -- anywhere anywhere tcp dpt:https : Chain FORWARD (policy DROP) target prot opt source destination DROP all -- anywhere anywhere state INVALID ACCEPT all -- 127.0.0.0/8 anywhere ACCEPT all -- 192.168.11.0/24 anywhere Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
iptables で制限のための設定を間違えると、通信ができなくなるので、基本的な考え方だけを紹介する。
「条件にマッチしたパケットをどうするのか」というルールを、チェインに並べておき、パケットが届くとチェインの先頭からルールを適用し、ACCEPT/REJECT/DROPなどの対応を決める。
iptables でルールを登録する場合は、一般的に以下の書式で、条件1,条件2… をすべて満たすパケットをどうするのかのラベルを最後に記載する。
$ iptables -A チェイン 条件1 条件2 … -j ラベル
$ iptables -P INPUT DROP # デフォルトポリシーの設定 # INPUT のルールにどれもマッチしない場合はDROP(パケット廃棄) $ iptables -P OUTPUT ACCEPT # OUTPUT のどのルールにもマッチしなければACCEPT(受信許可) $ iptables -A INPUT -s 127.0.0.1 -j ACCEPT # INPUT の末尾に、"送信元IPが 127.0.0.1 ならACCEPT" を追加 $ iptables -A INPUT --dport 80 -j ACCEPT # INPUT の末尾に、"宛先ポートが 80 ならACCEPT" を追加 $ iptables -A INPUT -s 11.22.33.44 -j DROP # INPUT の末尾に、"送信元IPが 11.22.33.44 ならDROP" を追加 iptablesのオプション引数 -P デフォルトポリシーの設定 -A 末尾にルールを追加 -s 送信元IPアドレスの条件指定 -d 宛先IPアドレスの条件指定 --sport 送信元ポート番号の条件指定 --dport 宛先ポート番号の条件指定 -j 指定ラベルに移動 INPUT chain | <送信元IPが127.0.0.1なら>----ACCEPT | <宛先ポートが80なら>----------ACCEPT | <送信元IPが11.22.33.44なら>--DROP | DROP
香港からのアクセス制限解除
自宅サーバは、少しでも危険な攻撃を避けるために、国ごとのIPアドレスの配布状況にあわせアクセス拒否をしている。
しかし、明日からの香港での学会参加に合わせ、アクセス拒否の設定を外した。一時的だけどね。