今回は、iptablesでファイアウォールを構築する方法です。iptables はパケットフィルタリング型のファイアウォールです。必要最低限のファイアウォールですので、自分のサーバーを守るためにも iptables は導入しましょう!
iptables はポートを管理して攻撃を防ぐもので、サイト上からの攻撃 SQLインジェクションやクロスサイトスクリプティングなどの攻撃は防ぐことが出来ません!
iptables の導入方法は、OSによって異なります。アクセスルールは共通で使えますが、アクセスルールを記述するファイルの位置が異なったりします。
今回は、Webmin と Debian7 の2種類の導入方法をご紹介します!Debian7 の方でも Webmin の方法で導入する事も出来ます。
Webmin で導入する方法(IPv4のみ)
Webmin をお使いの方は、「ネットワーク」 → 「Linux ファイヤウォール」から、iptables の設定が出来ます。特に iptables のソフトをインストールする必要はありませんし、起動時にファイヤウォールを有効にする事も出来ます。
アクセスルールの追加は、Webmin上から作業する事も出来ますが、最初はルールが多いので、直接ファイルを修正する方法で行います。
1.すべて許可する
まず初めに、「ネットワーク」 → 「Linux ファイヤウォール」の「設定を適用」ボタンを押してすべて許可します。
2.アクセスルール作成
Webmin のアクセスルール用のファイルは、/etc/iptables.up.rules
になります。
下記のアクセスルールは必要最低限のポートのみ開放してあります。許可してあるもの以外は破棄されます。-A INPUT
から始まる行の末尾に -j ACCEPT
が付いているのが許可。付いていないのは、何もしない(最終的には破棄される)。にしてあります。使用したいポートに、 -j ACCEPT
を付ければポートが許可されます。他にも必要なポートがあれば、ご自分で追記してください。
# vi /etc/iptables.up.rules
を修正します。
下記は既に修正済みです。
# Generated by webmin *nat :PREROUTING ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT # Completed on Fri Jun 27 19:55:46 2014 # Generated by webmin *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT # Completed on Fri Jun 27 19:55:46 2014 # Generated by webmin *filter :FORWARD DROP [0:0] :INPUT DROP [0:0] :OUTPUT ACCEPT [0:0] # loopback -A INPUT -i lo -j ACCEPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Allow IP -A INPUT -s 192.168.0.0/24 # Multicast DNS -A INPUT -p udp -m udp -d 224.0.0.251 --dport 5353 -j ACCEPT # Ping -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT # SSH -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT # HTTP -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT # HTTPS -A INPUT -p tcp -m tcp --dport 443 # Webmin -A INPUT -p tcp -m tcp --dport 10000 -j ACCEPT # FTP-Data -A INPUT -p tcp -m tcp --dport 20 # FTP -A INPUT -p tcp -m tcp --dport 21 # FTP-Passive -A INPUT -p tcp -m tcp --dport 49152:65534 # SMTP -A INPUT -p tcp -m tcp --dport 25 # Submission -A INPUT -p tcp -m tcp --dport 587 # IDENT -A INPUT -p tcp -m tcp --dport 113 -j REJECT # POP3 -A INPUT -p tcp -m tcp --dport 110 # IMAP -A INPUT -p tcp -m tcp --dport 143 # DNS TCP -A INPUT -p tcp -m tcp --dport 53 # DNS UDP -A INPUT -p udp -m udp --dport 53 # Squid -A INPUT -p tcp -m tcp --dport 3128 COMMIT # Completed on Fri Jun 27 20:10:18 2014
[0:0]
- [パケットカウンタ:バイトカウンタ]
3.アクセスルールを適応する
Webmin の「Linux ファイヤウォール」を再読込すると、上記のアクセスルールが反映されていると思いますので、「設定を適用する」ボタンを押して、起動時に有効にはいを選んで、「起動時に有効」ボタンを押せば、すべての作業は終わりです!
Debian7 で導入する方法(IPv4・IPv6)
Debian7 をお使いの方は、こちらの方が便利です。いや、そんなに変わらないかも・・・?
iptables インストール
IPv4 & IPv6 のアクセスルールを作るか聞いてくるので、必要に応じて選んでください。当説明は、IPv4 のみです。
// インストール # apt-get install iptables iptables-persistent
アクセスルール作成
# vi /etc/iptables/rules.v4
を修正します。
// // アクセスルールの内容は、Webmin で説明したアクセスルールを参考にしてください。 //
アクセスルールを適応する
// アクセスルールを適応 # /etc/init.d/iptables-persistent restart
アクセスルールの適応状態の確認
# iptables -L Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- anywhere anywhere ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT udp -- anywhere 224.0.0.251 udp dpt:mdns ACCEPT icmp -- anywhere anywhere icmp echo-request ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ACCEPT tcp -- anywhere anywhere tcp dpt:http tcp -- anywhere anywhere tcp dpt:https ACCEPT tcp -- anywhere anywhere tcp dpt:webmin tcp -- anywhere anywhere tcp dpt:ftp-data tcp -- anywhere anywhere tcp dpt:ftp tcp -- anywhere anywhere tcp dpts:10021:10024 tcp -- anywhere anywhere tcp dpt:smtp tcp -- anywhere anywhere tcp dpt:submission tcp -- anywhere anywhere tcp dpt:auth tcp -- anywhere anywhere tcp dpt:pop3 tcp -- anywhere anywhere tcp dpt:imap2 tcp -- anywhere anywhere tcp dpt:domain udp -- anywhere anywhere udp dpt:domain tcp -- anywhere anywhere tcp dpt:3128 Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
# iptables -L
- アクセスルールの適応状態を表示する。
# iptables -L -v
- アクセスルールの適応状態とパケットカウンターを表示する。
# iptables -L -Z
- アクセスルールの適応状態とパケットカウンターをリセットする。
これで、iptables の状態が確認できると思います。
IPv6もあるんだよ。
実は、今回紹介したのはIPv4向けの設定です。IPv6も利用している方は、別途設定をする必要があります。意外とIPv6のフィルタ設定は忘れられている事が多いです。IPv6の適応方法は、ネットで探してください。m(_ _)m
# ip6tables -L
で、IPv6の適応状態が確認出来ます。
IPv6を使用していないならば、無効化したほうが良いかと思います。もしくは、iptables でIPv6の通信をすべてDROPする方が楽で確実かもしれないですね。
// 検索キーワード
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
NETWORKING_IPV6=no
総当たり攻撃(ブルートフォースアタック)
SSHのポートを有効にしていると、総当たり攻撃をほぼ100%受けると思います。今回のアクセスルールでは防ぐことが出来ません。iptables だけでもやれない事は無いですが、「SSHGuard」や「Fail2ban」などのソフトも導入する方が、防御力は上がります。「Fail2ban」がお薦め。
守るのは、SSH、POP3、FTP、ベーシック認証など、アカウント&パスワードを入力するものです。
総当たり攻撃はこんな感じです・・・。
SASL Authentications failed 2098 Time(s)
Service smtp (shadow) - 2098 Time(s):
Realm - 1 Time(s):
User: contact - Unknown - 1 Time(s):
User: abuse - Unknown - 1 Time(s):
User: accounts - Unknown - 1 Time(s):
User: admin - Unknown - 1 Time(s):
User: aoyagi - Unknown - 34 Time(s):
User: backup - Unknown - 1 Time(s):
User: cron - Unknown - 1 Time(s):
User: abuse - Unknown - 46 Time(s):
User: admin - Unknown - 46 Time(s):
User: administrator - Unknown - 46 Time(s):
User: aoyagi - Unknown - 34 Time(s):
User: contact - Unknown - 46 Time(s):
User: deals - Unknown - 46 Time(s):
User: do_not_reply - Unknown - 46 Time(s):
User: donotreply - Unknown - 46 Time(s):
User: feedback - Unknown - 46 Time(s):
User: hello - Unknown - 46 Time(s):
User: help - Unknown - 46 Time(s):
User: hey - Unknown - 46 Time(s):
User: hostmaster - Unknown - 46 Time(s):
User: html-news - Unknown - 46 Time(s):
User: info - Unknown - 46 Time(s):
User: information - Unknown - 46 Time(s):
User: mailing - Unknown - 46 Time(s):
User: mainnewsletter - Unknown - 46 Time(s):
User: marketing - Unknown - 46 Time(s):
User: newletter - Unknown - 46 Time(s):
User: news - Unknown - 46 Time(s):
User: newsletters - Unknown - 46 Time(s):
User: nl-replies - Unknown - 92 Time(s):
User: no-reply - Unknown - 46 Time(s):
User: office - Unknown - 46 Time(s):
User: please-reply - Unknown - 46 Time(s):
User: postmaster - Unknown - 46 Time(s):
User: replyto - Unknown - 46 Time(s):
User: sales - Unknown - 92 Time(s):
User: staff - Unknown - 46 Time(s):
User: subscriptions - Unknown - 92 Time(s):
User: suport - Unknown - 46 Time(s):
User: support - Unknown - 46 Time(s):
User: systemalert - Unknown - 46 Time(s):
User: test - Unknown - 46 Time(s):
User: text-news - Unknown - 46 Time(s):
User: updates - Unknown - 46 Time(s):
User: vanzari - Unknown - 46 Time(s):
User: webmaster - Unknown - 92 Time(s):
User: whatsup - Unknown - 46 Time(s):
User: wordpress - Unknown - 46 Time(s):