「iptables アクセス回数を制限する」の版間の差分

提供: セキュリティ
移動: 案内検索
(関連項目)
 
(同じ利用者による、間の2版が非表示)
行1: 行1:
<!--
 
vim: filetype=mediawiki
 
-->
 
 
[[iptables]] は、単位時間あたりのアクセス回数を制限できます。
 
[[iptables]] は、単位時間あたりのアクセス回数を制限できます。
  
行7: 行4:
  
 
== 概要 ==
 
== 概要 ==
 
 
[[iptables]] でアクセス制限を行うための方法として、 limit モジュール や hashlimit モジュールがあります。
 
[[iptables]] でアクセス制限を行うための方法として、 limit モジュール や hashlimit モジュールがあります。
 
[[iptables]] で単純な [[DoS攻撃]] の対策を実施できます。
 
[[iptables]] で単純な [[DoS攻撃]] の対策を実施できます。
 
 
== limit モジュールにおける制限 ==
 
== limit モジュールにおける制限 ==
 
 
limit モジュールを使用して、アクセス制限を [[sshd]] に対して行うと、[[総当たり攻撃]] を受けている時に、自分自身もログインができなくなるので、やるべきではないでしょう。
 
limit モジュールを使用して、アクセス制限を [[sshd]] に対して行うと、[[総当たり攻撃]] を受けている時に、自分自身もログインができなくなるので、やるべきではないでしょう。
  
[[NAT]] / [[プロキシ]] されてる環境に複数のユーザーが存在する場合、異なるユーザのアクセスが同一[[IPアドレス]]からやってきます。
+
NAT / [[プロキシ]] されてる環境に複数のユーザーが存在する場合、異なるユーザのアクセスが同一[[IPアドレス]]からやってきます。
[[ISP]]などの接続事業者や大きな企業からたくさんのアクセスが想定される場合、[[iptables]] でのアクセス制限は、うまく機能しないかもしれません。
+
ISPなどの接続事業者や大きな企業からたくさんのアクセスが想定される場合、[[iptables]] でのアクセス制限は、うまく機能しないかもしれません。
 
+
 
=== --limit rate ===
 
=== --limit rate ===
 
 
--limit で、単位時間あたりの平均マッチ回数の最大値を指定します。
 
--limit で、単位時間あたりの平均マッチ回数の最大値を指定します。
  
 
期間は、 /second, /minute, /hour, /day で指定できます。
 
期間は、 /second, /minute, /hour, /day で指定できます。
 
デフォルトは、 3/hour です。
 
デフォルトは、 3/hour です。
 
 
=== --limit-burst number ===
 
=== --limit-burst number ===
 
 
--limit-burst は、パケットがマッチする回数の最大初期値です。 --limit のオプションで指定した制限に達しなければ、この数値になるまで1個ずつ増やされます。
 
--limit-burst は、パケットがマッチする回数の最大初期値です。 --limit のオプションで指定した制限に達しなければ、この数値になるまで1個ずつ増やされます。
 
デフォルトは、 5 です。
 
デフォルトは、 5 です。
 
 
=== PINGに対して回数制限を行う ===
 
=== PINGに対して回数制限を行う ===
 
 
1秒間に4回までアクセスを許可する例です。
 
1秒間に4回までアクセスを許可する例です。
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
行50: 行38:
 
-A INPUT -p icmp --icmp-type echo-request -j DROP
 
-A INPUT -p icmp --icmp-type echo-request -j DROP
 
</syntaxhighlight>
 
</syntaxhighlight>
 
 
=== sshd へのアクセス制限 ===
 
=== sshd へのアクセス制限 ===
 
 
[[sshd]] に対するアクセス制限は、自身がログインできなくなる可能性があるため、推奨はできません。
 
[[sshd]] に対するアクセス制限は、自身がログインできなくなる可能性があるため、推奨はできません。
  
行66: 行52:
 
-A INPUT -p tcp --syn -m state --state NEW --dport ssh -j DROP
 
-A INPUT -p tcp --syn -m state --state NEW --dport ssh -j DROP
 
</syntaxhighlight>
 
</syntaxhighlight>
 
 
== hashlimit モジュールにおける制限 ==
 
== hashlimit モジュールにおける制限 ==
 
 
limit モジュールの制限では、正常なリクエストも[[不正アクセス]] にまぎれてしまいました。
 
limit モジュールの制限では、正常なリクエストも[[不正アクセス]] にまぎれてしまいました。
 
クライアントごとにリクエスト回数を制限するには、 hashlimit モジュールを使用します。
 
クライアントごとにリクエスト回数を制限するには、 hashlimit モジュールを使用します。
 
 
=== --hashlimit-name ===
 
=== --hashlimit-name ===
 
 
--hashlimit-name は、 hashlimit モジュールが使用するハッシュテーブル名を指定します。
 
--hashlimit-name は、 hashlimit モジュールが使用するハッシュテーブル名を指定します。
 
 
=== --hashlimit ===
 
=== --hashlimit ===
 
 
同一ホストからの最大接続回数は、1分間あたり1回まで許可します。
 
同一ホストからの最大接続回数は、1分間あたり1回まで許可します。
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
--hashlimit 1/minute --hashlimit-burst 1
 
--hashlimit 1/minute --hashlimit-burst 1
 
</syntaxhighlight>
 
</syntaxhighlight>
 
 
=== --hashlimit-htable-expire ===
 
=== --hashlimit-htable-expire ===
 
 
クライアントのアクセスをカウントするときに、そのレコードを保持する期間を設定できます。
 
クライアントのアクセスをカウントするときに、そのレコードを保持する期間を設定できます。
 
レコードを保持する期間を --hashlimit-htable-expire  を使用し、ミリ秒単位で指定できます。
 
レコードを保持する期間を --hashlimit-htable-expire  を使用し、ミリ秒単位で指定できます。
 
=== --hashlimit-mode ===
 
=== --hashlimit-mode ===
 
 
--hashlimit-mode では、何をキーにして接続数をカウントするかを指定します。
 
--hashlimit-mode では、何をキーにして接続数をカウントするかを指定します。
  
行95: 行72:
 
送信元ポート番号は、 srcport 、宛先ポート番号では、 dstport を指定します。
 
送信元ポート番号は、 srcport 、宛先ポート番号では、 dstport を指定します。
 
srcip,srcport という組み合わせで指定できます。
 
srcip,srcport という組み合わせで指定できます。
 
 
=== sshd に対するアクセス制限の例 ===
 
=== sshd に対するアクセス制限の例 ===
 
 
sshd に対する接続を1分間あたり、最大1回までに限定する例です。
 
sshd に対する接続を1分間あたり、最大1回までに限定する例です。
  
行140: 行115:
 
| ハッシュテーブルのエントリの有効期間は、60000 ms (10分) とする。
 
| ハッシュテーブルのエントリの有効期間は、60000 ms (10分) とする。
 
|}
 
|}
 
 
=== ハッシュテーブルの確認方法 ===
 
=== ハッシュテーブルの確認方法 ===
 
 
ハッシュテーブルごとに /proc/net/ipt_hashlimit に--hashlimit-name で指定した名前でファイルが作成されます。
 
ハッシュテーブルごとに /proc/net/ipt_hashlimit に--hashlimit-name で指定した名前でファイルが作成されます。
 
中身には、クライアントごとの現在のカウントに関する情報が記録されます。
 
中身には、クライアントごとの現在のカウントに関する情報が記録されます。
行159: 行132:
 
-A INPUT -p tcp --syn -m state --state NEW --dport ssh -j DROP
 
-A INPUT -p tcp --syn -m state --state NEW --dport ssh -j DROP
 
</syntaxhighlight>
 
</syntaxhighlight>
 
 
== 関連項目 ==
 
== 関連項目 ==
 
{{iptables}}
 
{{iptables}}
 
* [[DoS攻撃]]
 
* [[DoS攻撃]]
{{icmp}}
+
 
 +
* [[ICMP]]
 +
* [[TCP]]
 +
* [[HTTP]]
 +
* [[HTTPS]]
 +
* [[ssh]]
 +
* [[sshd]]
 +
<!-- vim: filetype=mediawiki
 +
-->

2015年9月23日 (水) 18:51時点における最新版

iptables は、単位時間あたりのアクセス回数を制限できます。

概要

iptables でアクセス制限を行うための方法として、 limit モジュール や hashlimit モジュールがあります。 iptables で単純な DoS攻撃 の対策を実施できます。

limit モジュールにおける制限

limit モジュールを使用して、アクセス制限を sshd に対して行うと、総当たり攻撃 を受けている時に、自分自身もログインができなくなるので、やるべきではないでしょう。

NAT / プロキシ されてる環境に複数のユーザーが存在する場合、異なるユーザのアクセスが同一IPアドレスからやってきます。 ISPなどの接続事業者や大きな企業からたくさんのアクセスが想定される場合、iptables でのアクセス制限は、うまく機能しないかもしれません。

--limit rate

--limit で、単位時間あたりの平均マッチ回数の最大値を指定します。

期間は、 /second, /minute, /hour, /day で指定できます。 デフォルトは、 3/hour です。

--limit-burst number

--limit-burst は、パケットがマッチする回数の最大初期値です。 --limit のオプションで指定した制限に達しなければ、この数値になるまで1個ずつ増やされます。 デフォルトは、 5 です。

PINGに対して回数制限を行う

1秒間に4回までアクセスを許可する例です。

-A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 4  -j ACCEPT
-A INPUT
受信パケットを対象とします。
-p icmp
ICMP プロトコルを対象とします。
--icmp-type echo-request
ICMP のタイプは、ping エコーを指定します。
-m limit
limit モジュールを有効にします。
--limit 1/s
1秒間あたり
--limit-burst 4
最大4回
-j ACCEPT
条件にマッチしたパケットを許可します。

INPUT チェインのデフォルトルールが ACCEPT にしている場合は、追加で DROP の設定が必要です。

-A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 4  -j ACCEPT
-A INPUT -p icmp --icmp-type echo-request -j DROP

sshd へのアクセス制限

sshd に対するアクセス制限は、自身がログインできなくなる可能性があるため、推奨はできません。

22番ポート (sshd) に対して1分間に最大1分間の ssh の新規の接続を許可します。 INPUT のデフォルトルールが DENY の場合です。

-A INPUT -p tcp --syn -m state --state NEW --dport ssh -m limit --limit 1/m --limit-burst 1 -j ACCEPT

INPUT のデフォルトルールが ACCEPT の場合です。

-A INPUT -p tcp --syn -m state --state NEW --dport ssh -m limit --limit 1/m --limit-burst 1 -j ACCEPT
-A INPUT -p tcp --syn -m state --state NEW --dport ssh -j DROP

hashlimit モジュールにおける制限

limit モジュールの制限では、正常なリクエストも不正アクセス にまぎれてしまいました。 クライアントごとにリクエスト回数を制限するには、 hashlimit モジュールを使用します。

--hashlimit-name

--hashlimit-name は、 hashlimit モジュールが使用するハッシュテーブル名を指定します。

--hashlimit

同一ホストからの最大接続回数は、1分間あたり1回まで許可します。

--hashlimit 1/minute --hashlimit-burst 1

--hashlimit-htable-expire

クライアントのアクセスをカウントするときに、そのレコードを保持する期間を設定できます。 レコードを保持する期間を --hashlimit-htable-expire を使用し、ミリ秒単位で指定できます。

--hashlimit-mode

--hashlimit-mode では、何をキーにして接続数をカウントするかを指定します。

クライアントのIPアドレス ごとにカウントする場合は、 srcip を指定します。 宛先のIPアドレス の場合は、 dstip です。 送信元ポート番号は、 srcport 、宛先ポート番号では、 dstport を指定します。 srcip,srcport という組み合わせで指定できます。

sshd に対するアクセス制限の例

sshd に対する接続を1分間あたり、最大1回までに限定する例です。

iptables -A INPUT -p tcp		\
	-m state			\
	--state NEW 			\
	--syn 				\
	--dport ssh			\
	-m hashlimit			\
	--hashlimit 1/m	\
	--hashlimit-name	t_sshd	\
	--hashlimit-burst	1	\
	--hashlimit-mode	srcip	\
	--hashlimit-htable-expire	60000	\
	-j ACCEPT

上記のコマンドの意味を下記に示します。

hashlimit による sshd のアクセス制限
オプション 説明
-m hashlimit hashlimit モジュールを使用する。
--hashlimit-name t_sshd ハッシュテーブル名を t_sshd とする。
--hashlimit 1/m 1分間
--hashlimit-burst 1 最大1回
--hashlimit-mode srcip 送信元 IPアドレスごとにリクエスト数を管理する。
--hashlimit-htable-expire ハッシュテーブルのエントリの有効期間は、60000 ms (10分) とする。

ハッシュテーブルの確認方法

ハッシュテーブルごとに /proc/net/ipt_hashlimit に--hashlimit-name で指定した名前でファイルが作成されます。 中身には、クライアントごとの現在のカウントに関する情報が記録されます。

sudo cat /proc/net/ipt_hashlimit/t_sshd
59 192.168.0.128:0->0.0.0.0:0 584320 1920000 1920000

INPUT のデフォルトルール が ACCEPT の場合は、 DROP の設定が必要です。 ページの関係で、改行が入っています。

-A INPUT -p tcp  -m state   --state NEW --syn --dport ssh -m hashlimit 
	--hashlimit 1/m \ --hashlimit-name t_sshd --hashlimit-burst 1
	--hashlimit-mode srcip --hashlimit-htable-expire 60000 -j ACCEPT
-A INPUT -p tcp --syn -m state --state NEW --dport ssh -j DROP

関連項目