Webサーバーのルールを開始する良いiptables?


12

新しいcentos 5.4サーバーをインストールしていますが、mu iptablesを起動するための一連のクリーンなルールが必要です。

最初に良いルールは何でしょうか?

これは良い出発点ですか?

# Allow outgoing traffic and disallow any passthroughs

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

# Allow traffic already established to continue

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow ssh, ftp and web services

iptables -A INPUT -p tcp --dport ssh -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport ftp -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport ftp -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport ftp-data -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport ftp-data -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -i eth0 -j ACCEPT

# Allow local loopback services

iptables -A INPUT -i lo -j ACCEPT

# Allow pings

iptables -I INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -I INPUT -p icmp --icmp-type source-quench -j ACCEPT
iptables -I INPUT -p icmp --icmp-type time-exceeded -j ACCEPT

このルールは何のために:

iptables -A INPUT -p tcp --dport domain -i eth0 -j ACCEPT

更新:

FTP(必須)、Apache、SSH、mysqlを備えたWebサーバーになります。


私はこの単純なルールを使用します。すべてを閉じて、逆方向に作業し、必要なものを開きます。Webサーバーの場合、一般にポート80/443が唯一の公開サービスです。他のすべてをブロックするか、アクセスを制限します-たとえば、sshを特定のIPまたはプライベートネットワークに制限します。
jeffatrackaid

回答:


13

IPTablesルールは、サーバーに最も適しているようです。しかし、考えられるいくつかの変更を提案します。

  • インターネット全体からのSSH、MySQL、およびFTPアクセスを許可する必要がない限り、「-source」オプションを使用して、特定の承認されたIPアドレスからのみそれらのポートへのアクセスを制限する方がはるかに安全です。たとえば、IPアドレス71.82.93.101からのSSHアクセスのみを許可するには、5番目のルールを「iptables -A INPUT -p tcp --dport ssh --source 71.82.93.101 -i eth0 -j ACCEPT」に変更します。おそらく、許可する個々のIPアドレスごとに個別のルールを追加する必要があります。詳細については、この質問を参照してください:iptables multiple source IPs

  • このマシンがDNSサーバーを実行していない限り、「ドメイン」(53)ポートへのアクセスをブロックすることをお勧めします。これを行うには、「iptables -A INPUT -p tcp --dport domain -i eth0 -j ACCEPT」という行を削除するだけです。(これで最後の質問BTWにも答えられるはずです。)実際にDNSサーバーを実行している場合は、このルールをそのままにしてください。

  • ネットワーク経由のリモートMySQLクライアントアクセスを許可する必要がある場合は、「iptables -A INPUT -p tcp --dport 3306 -i eth0 -j ACCEPT」の行を追加して、標準MySQLポートへの外部アクセスを開く必要があります。 。ただし、本当に必要な場合を除き、これを実行しないでください。ローカルのMySQLアクセスのみが必要な場合(たとえば、Apacheで実行されるPHPアプリの場合)、リモートのMySQLアクセスを提供する必要はありません。ハッキングの危険を冒したくない限り、ネットワークのポート3306を開く場合は、すべてのMySQLユーザーアカウントに強力なパスワードが必要であること、およびMySQLサーバーパッケージが最新であることを確認してください。

  • コメントの1つ(「ssh、dns、ldap、ftp、およびwebサービスを許可する」)がLDAPサービスに言及していますが、構成にそのようなルールはありません。これは、設定例をコピーして変更したときによく起こります。機能に影響はありませんが、誤解を招くコメントは将来あなたや他の管理者を混乱させることで間接的に発生する可能性があるため、コメントを修正します。

私の経験では、IPTablesルールの完璧なセットを思い付くのは難しいですが、あなたは間違いなく正しい軌道に乗っていると思います。また、IPTablesの詳細を学ぶ幸運もあります。これらのルールは、最初は複雑に思えるかもしれませんが、Linuxのシステム管理者にとって非常に役立つスキルです。


1
ファイアウォールを介したリモートMySQLアクセスを許可する代わりに、MySQLサーバーへのアクセスを必要とするすべての人がSSHポート転送を行う権利を持っていることを確認できます。
ptman

SSHポート転送は、ポートを開いてMySQL許可をロックダウンする潜在的な代替手段です。しかし、彼が機密データを扱っている場合、および/または彼が有名なターゲット(SSHの暗号化機能を有用にする)でない限り、私は利点を見ません。結局のところ、SSHトンネリングには次のような欠点があります。setup/ configの面倒。CPU使用率の増加、および帯域幅の制限(OpenSSHの静的バッファーサイズによる)。また、リモートMySQLクライアントのすべてにローカルログインを望まない場合はどうなりますか?
ライアンB.リンチ

コメントがルールに一致しない限り、ICMPルールはtraceroute、PMTUディスカバリー、およびその他の有用なメッセージを許可しますが、ping(エコー要求およびエコー応答)許可しません
ジェラルドコームズ

ジェラルド、それは良いキャッチです、私もそれに気づかなかった。彼はおそらくコメントを変更してpingが許可されていないことを確認するか、ICMPエコー要求/応答トラフィックを許可するルールを追加する必要があります。
ライアンB.リンチ

4

アウトバウンドトラフィックも制限してください。

PHPの悪用により、誰かが「curl」または「wget」を使用して他の場所から悪意のあるコードを取得し、それをサーバー上で実行してボットネットに参加するケースがたくさんあります。

(例として)Apacheが他のWebサイト自体と通信する必要があると思わない場合は、トラフィックを制限し、後の苦痛を少し軽減してください。


2

これらのルールは、「iptables-restore」を介してインポートする準備ができています。

*filter
:INPUT DROP [20:2036]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [93:16260]
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT -m comment --comment "allow ICMP: echo-reply"
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT -m comment --comment "allow ICMP: echo-request"
-A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT -m comment --comment "allow ICMP: destination-unreachable"
-A INPUT -p icmp -m icmp --icmp-type 4 -j ACCEPT -m comment --comment "allow ICMP: source-quench"
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT  -m comment --comment "allow ICMP: time-exceeded"
-A INPUT -i lo -j ACCEPT -m comment --comment "allow input from the loop-back adapter"
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT -m comment --comment "allow SSH: ssh"
-A INPUT -i eth0 -p tcp -m tcp --dport 53 -j ACCEPT -m comment --comment "allow DNS: domain"
-A INPUT -i eth0 -p tcp -m udp --dport 53 -j ACCEPT -m comment --comment "allow DNS: domain"
-A INPUT -i eth0 -p tcp -m tcp --dport 21 -j ACCEPT -m comment --comment "allow FTP: ftp"
-A INPUT -i eth0 -p udp -m udp --dport 21 -j ACCEPT -m comment --comment "allow FTP: ftp"
-A INPUT -i eth0 -p tcp -m tcp --dport 20 -j ACCEPT -m comment --comment "allow FTP: ftp-data"
-A INPUT -i eth0 -p udp -m udp --dport 20 -j ACCEPT -m comment --comment "allow FTP: ftp-data"
-A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT -m comment --comment "allow MariaDB/MySQL: mysql"
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT -m comment --comment "allow HTTP (apache/nxing/lighttpd)"
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT -m comment --comment "allow HTTPS (apache/nxing/lighttpd)"
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT  -m comment --comment "allow already established connections"
COMMIT

また、記録のために...上記のiptables-restoreが使用されていない場合、これらのデフォルトポリシーも設定する必要があります。

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

投稿を編集しました-StackOverflowは質問/回答形式です。FAQをお読みください:stackoverflow.com/faq
89c3b1b8-b1ae-11e6-b842-48d705

ステートフルルールはここで最後に表示されるため、これによりパフォーマンスの問題が発生します。これは、大部分のパケットに一致するため、最初に表示される必要があります。
マイケルハンプトン

0

なぜFTPとDNSを許可するのですか?サーバーはそれらのサービスを提供していますか?FTPを実際に使用するべきではありませんが、いくつかの非常に特殊なユースケースを除き、代わりにSFTPを使用してください(FTPSではありません)。また、他のすべてのポートをシンボル名で指定し、httpを数値80で指定するのはなぜですか?これを別の場所からコピーしただけですか?コピーやアドバイスは理解不足を補うものではありません。TCP、IP、ファイアウォール、提供するサービスのプロトコルを必ず理解してください。


ptmanを怒らせるつもりはありませんが、あなたの答えはやや落胆的で、卑conだと思われるかもしれません。また、あなたは本当に質問に答えていません。質問者が理解に欠けている場合、敬意を表して話し、そのトピックに関する特定の教育を彼に与える方が良いと思いませんか?
ライアンB.リンチ

おそらく正しいでしょう。私のコメントは否定的に聞こえるかもしれませんが、そのようなものではありません。関連する思考プロセスを引き起こす質問をリストしようとしていました。そして、理解の基本レベルがわからないので、教科書を書き始めませんでした。しかし、あなたは役に立たないトーンについては絶対に正しいです。幸いなことに、あなたははるかに役立つ答えを書きました。
ptman
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.