[〜#〜] tarpit [〜#〜] は攻撃者のリソースを浪費するために使用できるため、攻撃が遅くなり、他のホストを攻撃する能力が低下します...良い考えのようです。
Netfilteraddon として提供され、他のIPTablesターゲットと同じように使用できます。
(D)DoSを処理するこのアプローチには、既知の欠点または脆弱性はありますか?
以前はそれが良い考えだと思っていました。しかし、残念ながらそれは非常に悪い考えであることを今知っています。
Apacheベンチのようなhttpベンチマークアプリを実行したことがありますか。単一のマシンで、ターゲットサーバーへの毎秒数百の接続を作成するように設定できます。これらのクライアントのいくつかを実行し、ターピットを有効にしてサーバーに接続すると、問題が発生すると思います。
サーバーへの毎秒数千の接続を作成すると、各接続がターピットに閉じ込められている場合にサーバーにどのように影響するかを考えてください。
サーバーは利用可能なすべてのリソース(またはファイルハンドル)をすぐに消費するため、これ以上の接続は許可されません。これは単に接続を閉じるよりも悪いです。彼のリソースを拘束しようとするよりも、犯人をしばらくの間ドロップするほうがよいでしょう。 fail2banのようなスクリプトが実現するのはそれです。
また、通常のユーザーがターピットに留まることを望まないでください。少なくともインタラクティブセッションでは。誰が許可され、誰が前払いではないかをどのように決定しますか?一部のプロトコルではできません。たとえば、HTTPトラフィック。クライアントからアクティビティが得られるまでは、クライアントに問題がないと伝える必要があります。次に、それを悪いものとして扱うことを決定することができ、次回はターピットに巻き込まれます。これらの攻撃の多くが、たまたま最新のワームウイルスに感染した動的なアドスルユーザーなどからのものである場合を除いて、問題はないようです。
ユーザーが動的アドレスを知らずに実行しなくても、ワームウイルスによってPCで多くの攻撃が行われるとすると、簡単に時代遅れのターピットブラックリストが作成される可能性があります。問題が発生し始めていますか?
汎用サーバーでターピットを実行すると、リスクが伴います。リスクがわかっている場合は、快適さのレベルに応じてリスクを軽減できます。
ありがたいことに、これはすべて可能であり、通常のiptablesとipsetを使用すると非常に簡単です。
Iptablesを使用すると、システムリソースを使いすぎずにTARPITを実行するホストの数を制限できます。 以下の例を参照してください。これには、ネットワーク帯域幅、システムメモリ、状態安定エントリ、およびその他のシステムリソースが含まれます。タール状の接続を取得しすぎて、無視してください。ルールセットを正しい順序で編成すると、タールピット化された接続が状態テーブルに残ることはありません。また、カスタムulogのようなものでリアルタイムの統計を行っている場合を除いて、ログに記録しないようにしてください。直接のiptables tarpitログは、ディスクをすぐにいっぱいにする可能性があります。
私の経験では、現在のホストは200以上のホストをターピットに簡単に収容でき、メモリ使用量、トラフィック使用量、またはCPU使用量にほとんど影響を与えません。私はこれをさらにプッシュする可能性がありますが、これまでのところ平均して私がトラップしているのは常に特定の瞬間に約130のホストだけです。
制限を実装した理由は、別の提案で述べたとおりです。これは、最初のターピットホストが浸水したためです。これは簡単な回避策でした。それ以来、何の問題もありませんでした。
ipset は、iptablesルールで使用するオブジェクトのグループを作成できる素晴らしい小さなツールです。それだけでなく、オブジェクトをハッシュテーブルに保持できるため、ipsetが大きいほど、iptablesルールの同等の線形セットと比較して高速になります。
それに加えて、リストにはカウンター(パケット/バイト)、タイムアウト、およびオブジェクトごとの除外を含めることができます。
Fail2ban、ossecなど、自動的にブロックするほとんどのプログラムでipsetから追加/削除できます。デフォルトのタイムアウトを設定できるため、どのプログラムがエントリを設定したかに関係なく、エントリが期限切れになるようにすることができます。
上記のリスクを軽減する、管理しているサーバーでの使用に基づく例を次に示します。
### Note: This does not account for all possible traffic you might need or want
### This is only an example of mitigating common risks of using a tarpit
### Use at your own risk
# Create the ipset blacklist
# options:
# - create : create a new ipset
# - blacklist : Name of the ipset we'll reference in the iptables rule
# - hash:net : Make blacklist type hash to hold network (ip/mask) data
# - family inet : This is for IPv4 data (inet6 for IPv6)
# - counters : We want packet/byte stats counted for each entry
# - comment : So we can add a comment with each entry (handy)
# - timeout 604800 : Set a default timeout of 604800 seconds (1 week) for each new entry
# - nomatch : Allow us to enter exclusion entries (never match an entry)
ipset create blacklist hash:net family inet counters comment timeout 604800 nomatch
# Create an entry to never blacklist a trusted network
# options:
# - timeout 0 : entry never expires
# - nomatch : Tells IPset to never match this entry (whitelist, in our usage)
ipset add blacklist 123.45.67.0/24 comment "Trusted subnet, causes breakage if blocked" timeout 0 nomatch
# Example to blacklist hosts
# no netmask implies /32 (or /128 for ipv6)
ipset add blacklist 34.56.78.90 comment "SSH Bruteforce"
ipset add blacklist 23.45.67.89 comment "SQL Injection" timeout 12345
# etc...
# Flush the input table
iptables -F INPUT
# Drop the custom flow TAR
iptables -X TAR
# Set default INPUT policy to DROP
iptables -P INPUT DROP
# Create the chain TAR
iptables -N TAR
# Send all blacklisted hosts to the tarpit
iptables -A INPUT -m set --match-set blacklist src -j TAR
# Allow established connections
# Note: after the blacklist so newly blacklisted threats are immediately ignored
# Yes, that will cause the server to hold the state open until it times out.
# Would you rather have a malicious Host continuing its attack?
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# Allow the services we want
# Note: These create new state table entries/use up memory
# Note: We do not account for synflood prevention in this example
iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -m tcp --syn -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT
# Send everything else to tarpit chain
iptables -A INPUT -j TAR
# This is the tarpit chain
# Tarpit up to 10 unique connections a second, any more, and pass to next rule
# Note: 10/s limit is arbitrary, adjust to your preference (experiment)
iptables -A TAR -p tcp -m limit --limit 10/sec -j TARPIT --tarpit
# Drop everything else that makes it this far
# You can also set to REJECT which will immediately tell all connections to buzz off
iptables -A TAR -j DROP
$ Sudo tcpdump -npi eth0 'src YOUR.Host.IP and (tcp[14] = 0 && tcp[15] = 0)'