web-dev-qa-db-ja.com

iptablesルールアドバイザースクリプト

何もないサーバーがあります iptables 防御:ACCEPT all..

このサーバーにはカスタムアプリケーションが存在する可能性があります。

厳密なiptablesルールを使用してこのサーバーを強化する必要がある場合(すべてを拒否し、アプリケーションに必要なものだけを許可する)、どのアプリがどのdst/srcport/protocolを使用しているかを手動で確認する必要があります。次に、それらのiptablesルールを作成する必要があります。

質問:実行中のマシンからこれらの情報を収集するのに役立つスクリプトはありますか? (ログから?)-そしてiptablesルールを自動的に生成しますか?

SELinuxaudit2allowがあるように。 iptablesのためだけに!

マシンが停止することはありません!

例:「MAGIC」スクリプトは、マシン上で1週間/月に実行され、情報を収集する必要があります。その後、1週間/月の後に、スクリプトは使用できるiptablesルールファイルを生成できるようになります。

多くの人がこの状況に陥る可能性があります(iptablesに関してサーバーを強化する方法)。そして、これを行うことができるスクリプト/ソリューションがあれば素晴らしいでしょう:\

9
evachristine

手動で行う

Sudo ss -tuanp

または

Sudo netstat -tuanp

説明:

-t - show tcp sockets
-u - show udp sockets
-a - show all sockets
-n - show numeric, don't resolve 
-p - show process name
2
Creek

マシンでtcpdumpを1週間ほど実行して、平均トラフィックをキャプチャします。次に、wiresharkを使用してトラフィックを参照し、使用されているポートを確認できます。

このためのコマンドはtcpdump -i <interface> -s 65535 -w <some-file>になります

次に、netstat -tuanpを使用してこれをマッピングし直し、どのPID /アプリケーションがどのポートを使用しているかを確認できます。

理論的には、これはスクリプト化できます。

1
Lawrence

https://Gist.github.com/jirutka/374289 のような非常に基本的なテンプレートから始めることができます。これは、sshとpingのみを許可し、その他は手動で追加します。

パブリックインターフェイス(0.0.0.0)/ tcpでリッスンしているアプリケーションのiptablesルールを生成するための簡単なスクリプトハック

netstat -lnpt | egrep '0.0.0.0:[0-9]+' | awk '{print $4,$7}' | \
sed -E -e 's/0.0.0.0://g' -e 's|[0-9]+/||' | \
awk '{printf ("iptables -A INPUT -p tcp --dport %5d --syn -m conntrack --ctstate NEW -m comment %s \n", $1,$2) }'

iptables -I INPUT <number>を使用して、特定の場所にルールを挿入することもできます。これは、iptables -nvL --line-numbers INPUTでリストできます。

1
Rabin

これはスクリプトではなく、答えではありません OPの質問に対するものですが、OPと共有したいのは私の考えです。

私はすべてのリスニングポートを取得しました:

netstat -an | egrep 'tcp .*LISTEN' | awk -F" " '{print $4}' | awk -F":" '{print $NF}'

たぶん、これはあなたがあなた自身のスクリプトを書くことにもっと近づくことができるでしょう。 :)

0
Mr.TK

Iptableルールを使用して、新しい接続をログに記録します。これにより、udpもログに記録されます。

iptables -I INPUT -m state --state NEW -j LOG --log-prefix "New inbound connection: "
iptables -I OUTPUT -m state --state NEW -j LOG --log-prefix "New outbound connection: "

別の--log-levelを指定して、ログを/ var/log/messages以外のファイルに含めることができます(syslogデーモンを構成する必要があります)。

一部のサーバーでは正午、週末、月末(四半期、年)などの非常に定期的なアクティビティがあり、サーバーの重要なネットワークアクティビティを見逃さないため、メインのアプリケーションログを読む必要があると思います。

サーバーは重要なので、ルールの作成に役立つ素敵なスプレッドシート(​​ip source、ip dest、protocol、port、application)でサーバーのネットワークフローマトリックスを作成します。

0
Emmanuel

次のようなものから始めることができます。

netstat -n -l -p | egrep "^(tcp|tcp6|udp)" | grep LISTEN | sed -r 's!^(tcp|tcp6|udp)\s.*:([0-9]+).*LISTEN\s+.*/(.*)!iptables -A INPUT -p \1 --dport \2 -j ACCEPT # \3!'

その後、フォローアップします

iptables -P INPUT DROP

または

iptables -A INPUT -j REJECT --reject-with icmp-Host-prohibited

最初の行は、netstatを使用してリスニングプロセスとそのポートを一覧表示します。次に、「iptables」行を生成して、これらの着信接続のそれぞれを許可します。小さなsed正規表現の置換は、サーバー上のnetstat出力用にカスタマイズされているため、微調整が必​​要になる場合があります。それが機能するとき、あなたは次のように見えるものになるはずです:

iptables -A INPUT -p tcp --dport 111 -j ACCEPT # rpcbind       
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # sshd          
iptables -A INPUT -p tcp --dport 25 -j ACCEPT # master        
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT # mysqld        
iptables -A INPUT -p tcp --dport 49476 -j ACCEPT # rpc.statd     
iptables -A INPUT -p tcp --dport 5432 -j ACCEPT # postgres.bin  
iptables -A INPUT -p tcp --dport 55371 -j ACCEPT # rpc.statd

注意すべき2つの重要なこと:

1)これらのルールは、最後にDROPまたはREJECT行を配置するか、一致しないパケットのデフォルトポリシーにするまで、nothingを実行します。これらのルールallowパケット。これは、デフォルトのポリシーで一致しないものをすべて許可する場合は無効です。

2)これらのルールはsource IPについてはあいまいです。元の投稿から、すべてのクライアントがサーバーを使用できるようにしたいようです。次に、ログを調べて、宛先ポートに対応するIPを取得しますsource。私はそれを行うためのツールを知らないので、このスクリプトは、他のポートでリッスンするサーバー上で人々が新しいサービスを作成するのを防ぐだけです...つまり何か

0
Jemenake