こんにちは
私が管理しているサーバには毎日のように22番のポートへ素敵なお客様がやってきます。しかし、22番は従業員専用となっているのでお客様のアクセスは必要ないのです(笑)。とまあ、冗談は置いといて、私の場合、パスワードでSSHログインはできないのでいくらルートフォースアタックされても問題ないとは思いますが、ログが大量に出力されていい気分ではないのでちょっと頑張ってみることにしました。
というわけで、今回は hashlimit というものを使ってみることにしましょう。これは iptables のモジュールですが、 hashlimit を指定したルールに合致するアクセスが hashlimit で指定した条件を超えて行われるとそのルールは無視され、そのアクセスの管理はIPアドレスごとに行われるというものです。 limit というモジュールもあるようですが、それだと攻撃されている間はいかなるIPアドレスからもアクセスできなくなるようです。
ということで設定しましょう。これはポリシーが DROP の場合。
iptables -A INPUT -p tcp --dport ssh -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -p tcp --dport ssh -m state --state NEW -m hashlimit --hashlimit-name ssh_limit --hashlimit 2/m --hashlimit-burst 3 --hashlimit-mode srcip --hashlimit-htable-expire 120000 -j ACCEPT
まず、一つ目のルールで接続済みのSSHアクセスは許可します。こうしないと数文字入力したらDROPされてしまいます(笑)。そして二つ目がお待ちかねの hashlimit です。まず、 state はNEW にして新規接続のみに適用します。ま、一つ目のルールで新規接続以外は許可されているのあってもなくてもいいですが(笑)。そして hashlimit ですが・・・。
- –hashlimit-burst 3 : リセットされて最初は3パケットを受け入れる
- –hashlimit 2/m : hashlimit-burst で指定した値以降は1分間に2パケット(30秒間に1パケット)を受け入れる
- –hashlimit-htable-expire 120000 : 最後のパケットから120000ミリ秒(120秒=2分)でリセットする
- –hashlimit-name ssh_limit : ssh_limit という名前で管理する
- –hashlimit-mode srcip : 発信元IPアドレスごとに管理する
という感じになります。要はこの設定だと3パケット受信した後は30秒ごとに1パケット受信します。そして最後に受信したパケットから2分立つと、また3パケット連続で受信、以降30秒ごとに1パケット受信・・・という形になります。まあ、なんだかよくわからないですが、そこらへんはカットアンドトライで合わせてください。
ちなみに番外編としてポリシーが ACCEPT の場合、例えば外部からのアクセスのファイアウォールはルータに任せていて、内部からは自由なポートにアクセスできる状態にしたい、いわゆる自宅サーバ的なポジションにあるときにどうするかですが、さっきのルールの後にSSHを DROP するようにすればよいです。ついでに state NEW 以外は関係なくなるので、さっきのルールの一つ目はいらないと思います。
iptables -A INPUT -p tcp --dport ssh -m state --state NEW -j DROP
あとは state が RELATED,ESTABLISHED の場合ですが、これはSSHに限らず常に ACCEPT してもいいかもしれません。お好きなようにってことで。
では
ピンバック: 「さくらのVPS」CentOS の初期設定の作業のまとめ&解説(iptablesによるファイアウォール編) | 5 LOG