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


9

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

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

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

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

のようaudit2allowSELinux。ちょうどのためにiptables

機械が停止することはありません!

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

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


または、すべてをブロックし、必要なものだけを通過させる。1週間ほど実行するtcpdumpで何が必要かを知ることができます。
ローレンス

このマシンで停止が発生することはありません:)
evachristine 2014


1
トラフィックを監視したり、開いているポートを確認したりすることはできますが、ほとんどの場合、重要な送信トラフィックを見逃すことはありません(特別なセキュリティ更新、まれに送信されるメールなど)。着信トラフィックのみをフィルター処理する必要がある限り、監視はオプションになります。
jofel 14

これはかなり可能です。実行中のアプリケーションと公開されたポートからルールセットを構築する方法をスクリプト化できます。ただし、1)ほとんどの場合、すべてのサービスをネットワークに公開する必要があるわけではなく、2)絶対にネットワークに公開したくないサービスが存在する可能性があるため、実際にはこれを実行したくありません。代わりに、手動でそれを行ってください。一度、適切なルールセットをセットアップし、そこから行ってください。安全に行う1つの方法は、ESTABLISHED / RELATEDおよびACCEPTルールを使用してルールセットを作成し、関連するルールがトラフィックと一致しているかどうかを確認することです。満足したら、INPUTポリシーをdropに変更します。
ペドロ

回答:


2

手動で行う

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

1

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

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

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

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


1

https://gist.github.com/jirutka/3742890のような非常に基本的なテンプレートから始めて、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

残念ながら、学習モードまたはパッシブモードで実行して、すべてのネットワーク使用状況をログに記録し、その結果を取得しiptablesて、ログから実際のファイアウォールを生成するようなスクリプトは今まで見たことがありません。

あなたの最善の策は、システムが提供しているサービスを完全に理解し始めるときに、単純なものから始め、継続的にさまざまな要素を追加し続けることです。netstatホストしているさまざまなサービスで使用されているポートや、それらにアクセスしているIPアドレスを確認するなどのツールを使用する必要があります。

$ sudo netstat -tlpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:25                  0.0.0.0:*                   LISTEN      26292/sendmail      
tcp        0      0 0.0.0.0:890                 0.0.0.0:*                   LISTEN      26149/ypbind        
tcp        0      0 0.0.0.0:445                 0.0.0.0:*                   LISTEN      26321/smbd          
tcp        0      0 127.0.0.1:2207              0.0.0.0:*                   LISTEN      26226/python        
tcp        0      0 127.0.0.1:2208              0.0.0.0:*                   LISTEN      26221/./hpiod       
tcp        0      0 127.0.0.1:199               0.0.0.0:*                   LISTEN      26237/snmpd         
tcp        0      0 0.0.0.0:809                 0.0.0.0:*                   LISTEN      26067/rpc.statd     
tcp        0      0 0.0.0.0:139                 0.0.0.0:*                   LISTEN      26321/smbd          
tcp        0      0 0.0.0.0:587                 0.0.0.0:*                   LISTEN      26292/sendmail      
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      26038/portmap       
tcp        0      0 0.0.0.0:35604               0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      26249/sshd          
tcp        0      0 0.0.0.0:631                 0.0.0.0:*                   LISTEN      26257/cupsd         
tcp        0      0 :::22                       :::*                        LISTEN      26249/sshd          
tcp        0      0 :::631                      :::*                        LISTEN      26257/cupsd         

注:上記では、TCP接続を受け入れるサーバー上で実行しているサービスを確認できます。つまり、さまざまなポートでの接続を「リッスン」しています。

SSH(ポート22)やHTTP(ポート80)のようなものから始めるのは簡単ではありません。これらがシステムにとって一般的である場合、これらのタイプのサービスを一度にまとめて実行します。LDAPやNISなどの他のサービスの場合、これらをより制御された方法で実行したい場合があります。導入するときに問題が発生しないようにします。

FireHOLファイアウォールビルダー(fwbuilder)、eztablesなどのツールは、このプロジェクトを攻撃する際に役立ちます。これらのツールは、カスタムiptableルールを手動で作成する必要があることから、抽象化の優れたレイヤーを提供します。

FireHOL

FireHOLは、理解しやすく人間が読める構成からあらゆる複雑な安全でステートフルなファイアウォールを構築する言語(およびそれを実行するプログラム)です。

transparent_squid 8080 "squid root" inface eth0

interface eth0 mylan
    policy accept

interface ppp+ internet
    server smtp accept
    server http accept
    server ftp  accept
    server ssh  accept src example.firehol.org

    client all  accept

router mylan2internet inface eth0 outface ppp+
    masquerade
    route all accept
fwbuilder

Fwbuilderは、ユーザーがオブジェクトを作成し、それらのオブジェクトをファイアウォールにドラッグアンドドロップして、単一のPCまたはPCのネットワーク用の強力なセキュリティシステムを構築できる、ユニークなグラフィカルファイアウォールツールです。Fwbuilderは幅広いファイアウォール(Cisco ASA / PIX、Linux iptables、FreeBSDのipfilter、OpenBSDのpfなど)をサポートしているため、そのルールを複数のプラットフォームに展開できます。LinuxでFwbuilderを使用する方法を見てみましょう。これは、強力なセキュリティシステムで一生続く可能性があります。

   ss fwbuilder

eztables

Eztablesを使用すると、iptablesに触れることなく、ファイアウォールをすばやく構成できます。ファイアウォールルールの構文は、読みやすく適用しやすいように設計されています。

これは、インターネット全体がTCPポート80でWebサーバーにアクセスできるようにする方法です。

  allow_in any $eth0 any 80/tcp

Eztablesはシンプルでありながらパワフルになるように設計されています。ラップトップを保護するのか、ホームルーターをセットアップするのか、会社のファイアウォールを構築するのかは関係ありません。

Fail2Banの使用

初歩的なiptablesファイアウォールが整っていると、Fail2Banなどのツールを使用してファイアウォールを補完したくなるでしょう。

抜粋

Fail2banはログファイル(例:/ var / log / apache / error_log)をスキャンし、悪意のある兆候を示すIPを禁止します-パスワードの失敗が多すぎる、エクスプロイトを探すなど。指定された時間の間、他の任意のアクション(たとえば、電子メールの送信)も構成できます。Fail2Banには、箱から出して、さまざまなサービス(Apache、Courier、SSHなど)用のフィルターが付属しています。

このようなツールを使用すると、システムを強化し続けるときにシステムが耐えなければならない危険性を制限できます。システムが強化されたと確信している場合でも、セキュリティ対策の一環としてFail2Banを引き続き使用することをお勧めします。

参考文献


0

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ソース、ip dest、プロトコル、ポート、アプリケーション)に作成します。


0

これはスクリプトではなく、OPの質問への回答ではないことを知っていますが 、私がOPと共有したい私の考えです。

私はすべてのリスニングポートを手に入れました:

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

たぶん、これにより、独自のスクリプトを作成するのに近づくことができます。:)


0

あなたはこのようなものから始めることができます:

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行を最後に配置するか、一致しないパケットのデフォルトポリシーにするまで、何もしませ。これらのルールは、デフォルトのポリシーが一致しないものを許可する場合、パケットを許可します。

2)これらのルールは、ソース IP についてはあいまいです。元の投稿から、すべてのクライアントがサーバーを使用できるようにしてから、ログを調べて送信元 IP を取得し、宛先ポートに移動したいようです。それを行うためのツールがわからないので、このスクリプトは、他のポートでリッスンするサーバー上で新しいサービスを作成することだけを防止します...これは何かです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.