何もないサーバーがあります iptables 防御:ACCEPT all..
このサーバーにはカスタムアプリケーションが存在する可能性があります。
厳密なiptablesルールを使用してこのサーバーを強化する必要がある場合(すべてを拒否し、アプリケーションに必要なものだけを許可する)、どのアプリがどのdst/src
port/protocol
を使用しているかを手動で確認する必要があります。次に、それらのiptablesルールを作成する必要があります。
質問:実行中のマシンからこれらの情報を収集するのに役立つスクリプトはありますか? (ログから?)-そしてiptablesルールを自動的に生成しますか?
SELinux
にaudit2allow
があるように。 iptables
のためだけに!
マシンが停止することはありません!
例:「MAGIC」スクリプトは、マシン上で1週間/月に実行され、情報を収集する必要があります。その後、1週間/月の後に、スクリプトは使用できるiptablesルールファイルを生成できるようになります。
多くの人がこの状況に陥る可能性があります(iptablesに関してサーバーを強化する方法)。そして、これを行うことができるスクリプト/ソリューションがあれば素晴らしいでしょう:\
手動で行う
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
マシンでtcpdump
を1週間ほど実行して、平均トラフィックをキャプチャします。次に、wiresharkを使用してトラフィックを参照し、使用されているポートを確認できます。
このためのコマンドはtcpdump -i <interface> -s 65535 -w <some-file>
になります
次に、netstat -tuanp
を使用してこれをマッピングし直し、どのPID /アプリケーションがどのポートを使用しているかを確認できます。
理論的には、これはスクリプト化できます。
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
でリストできます。
これはスクリプトではなく、答えではありません OPの質問に対するものですが、OPと共有したいのは私の考えです。
私はすべてのリスニングポートを取得しました:
netstat -an | egrep 'tcp .*LISTEN' | awk -F" " '{print $4}' | awk -F":" '{print $NF}'
たぶん、これはあなたがあなた自身のスクリプトを書くことにもっと近づくことができるでしょう。 :)
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)でサーバーのネットワークフローマトリックスを作成します。
次のようなものから始めることができます。
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。私はそれを行うためのツールを知らないので、このスクリプトは、他のポートでリッスンするサーバー上で人々が新しいサービスを作成するのを防ぐだけです...つまり何か。