自宅サーバのセキュリティを考える4 スクリプトの考え方

自宅サーバー

外部からのアクセスに対するセキュリティを少しでも高める為に、以下のようにFWを更新する仕組みを考えました。

これを実現するスクリプトを作成して記事で紹介しています。

結果としてうまく動作していて、自宅サーバはすこぶる快調です。

SSHDの不正なログイン試行の形跡はすっかりなくなりました。

本記事では、このスクリプトの処理の概要について解説したいと思います。

興味があれば目を通してコメント等頂けると幸いです。

私

fail2banは禁句です

スクリプト

作成したスクリプトを再掲します。

コメントと空行を除けば、53行のスクリプトです。

Debian系のLinux(Ubuntu、Raspbian)を想定していますので、RedHat系のLinux(CentOS)で実行する場合はログの場所(91行目)のパスを/var/log/secureに修正してください。

使い方については以下の記事をご覧いただければと思います。

解説

updateの動作がメインなので、update(82行目以降)に絞って解説したいと思います。

update時にやっていることは、以下のベン図でいうAのiptablesルール追加と、G,Eの iptablesルール削除です。

スクリプトの内容について解説します。

前処理(84~87行目)

ここでは、以下の処理をしています。

  1. 作業ファイルを配置するディレクトリを作成(./deny-ip.d/)
  2. 作成したディレクトリ配下にファイルが存在しない場合は、各種ファイルを生成
    • ①allow_ip_list
    • ②deny_ip_list
    • ③iptables-sh

拒否したいIPアドレス群を抽出する部分(91,92行目)

ベン図でいうA,D,F,Gの部分の抽出です。

  1. /var/log/auth.logを読み込み、拒否したいIPアドレス群を抽出(sshdログインに失敗した接続元IPアドレスを取得し、ローカルIPアドレスを除く)
  2. 上記から、拒否したいIPアドレス群(②)とマージして、リストを保持・・・②’deny_ip_list.tmp

拒否したIPアドレス群を抽出する部分(95行目)

ベン図でいうB,D,E,Gの部分の抽出です。

  1. iptablesに設定済みのルールを読み込み、拒否した(既設定の)IPアドレス群を抽出・・・②”deny_ip_list.def

追加の拒否ルールを設定するコマンドを作成する部分(98,99行目)

ベン図でいうAの部分の抽出とルール作成です。

  1. 拒否したいIPアドレス群のうち、既設定にないIPアドレス群(②’と②”を並べて、②’にしかないIPアドレス群)を抽出・・・③’iptables-sh.buf
  1. 上記の③’から許可したいIPアドレス群を除くIPアドレス群(③’と①を並べて、③’にしかないIPアドレス群)に対して、iptablesのルール追加コマンドを作成・・・④iptables-sh

既存の拒否ルールを削除するコマンドを作成する部分 (102,103行目)

ベン図でいうEの部分の抽出とルール作成です。

  1. 拒否したいIPアドレス群のうち、既設定にしかないIPアドレス群(②’と②”を並べて、②”にしかないIPアドレス群)を抽出・・・③’iptables-sh.buf
  1. 上記の③’から許可したいIPアドレス群(③’と①を並べて、①にしかないIPアドレス群)に対して、iptablesのルール削除コマンドを作成(append)・・・④iptables-sh 追加

既存の拒否ルールを削除するコマンドを作成する部分(105,106行目)

ベン図でいうGの部分の抽出とルール作成です。

  1. 拒否したいIPアドレス群のうち、既設定と共通するIPアドレス群(②’と②”を並べて、②’と②”両方にあるIPアドレス群)を抽出・・・③’iptables-sh.buf
  1. 上記の③’から許可したいIPアドレス群(③’と①を並べて、①にしかないIPアドレス群)に対して、iptablesのルール削除コマンドを作成(append)・・・④iptables-sh 追加

この時点で、④のiptables-shには、全て(=ベン図でいうところのA追加コマンドとE,G削除)のiptables設定コマンドが記述されてます。

設定処理(108~122行目)

  1. 計算過程で作成した②’、③’、③”のファイルを削除(deny_ip_list.tmp、iptables-sh.buf、deny_ip_list.def)
  2. iptablesのチェイン(DENY-IP)を生成
  3. チェイン(DENY-IP)にルールを流し込む(④をシェルで実行)
  4. チェイン(DENY-IP)をINPUTに組み込む(重複設定とならないように、確認もしとく)

以上

まとめ

E,Gの設定では設定対象のIPアドレスを抽出する処理をしていますが、iptablesにはルール存在確認のコマンドがあるのでこれを使えば楽だったのを最後に気が付きました。

ただ、これだと全ての許可したいIPアドレスに対して、ルール設定時に毎回チェックを行うので非効率かもしれません。

私

なので、このスクリプトの処理の方が健全かと。

参考になれば幸いです。

コメント

タイトルとURLをコピーしました