2020.11.09sslhdへのログイン試行ログを見つけてから、セキュリティ対策について検討してきました。自宅サーバのセキュリティを考える先日、DNSで自宅サーバの名前解決ができなくなりました。自宅サーバにDNSサービスを立てている訳ではないので、取り急ぎ/etc/resolv.confを直接書き換える対処で事なきを得たわけですが、原因が分からず腑に落ち...komone-life.com2020.11.01攻撃者はターゲットを絞るとサーバに対してブルートフォース(総当たり)攻撃でセキュリティを突破しようとしてきます。サーバへの侵入は許さないのですが、ログイン試行を許してしまうとCPU負荷が高くなるという悪影響があります。そこでFW(iptables)によるアクセス拒否を考えたのですが、攻撃者のIPアドレスは固定ではなく、対策したところでIPアドレスを変えて攻撃してきます。そのため、外部からのアクセスに対するセキュリティを少しでも高める為に、以下のようにFWを更新する仕組みを考えました。自宅サーバのセキュリティを考える2自宅サーバにSSHでログインを試みる形跡が多数確認されました。その数、なんと月間8万件。アクセスログ(/var/log/auth.log)からアクセス元は特定できるので、iptablesにルールを追加することで...komone-life.com2020.11.02今回、sshログイン失敗履歴から攻撃者のIPアドレスを特定し、FW(iptables)に自動でアクセス拒否ルールを設定するシェルスクリプトを作成してみましたので、記事にしたいと思います。まとめやりたいこと復習になりますが、以下のような自律的にFW(iptables)を更新する仕組みを作りたいと考えています。この仕組みを実現するためのシェルスクリプトについて検討しました。今回は、攻撃者と思われるIPアドレスを拒否(ブロック)するスクリプトを作成しました。以下のようなことを実現するスクリプトです。スクリプトで実現することsshのログイン失敗履歴(/var/log/auth.log)の中から、ログインに失敗した接続元IPアドレスからのアクセスを拒否する。自分が指定するIPアドレスからのアクセスを拒否する。自分が指定するIPアドレスからのアクセスは拒否しない。iptablesには、拒否するIPアドレスのみを設定する。1はsshのログイン失敗履歴(/var/log/auth.log)から、ログインに失敗したIPアドレスを攻撃者とみなし、アクセスを拒否(プロック)します。攻撃者のIPアドレスはログの“Failed”あるいは“Invalid”を含む行のIPアドレスとします。uniq2は、あらかじめ指定した拒否したいIPアドレスを対象に、アクセス拒否します。1と2の違いは、1はsshのログイン失敗履歴から抽出するIPアドレスが対象なのに対し、2はログに関わらず静的なIPアドレスを対象にする点です。「ログにはないけど、このIPアドレスからのアクセスは拒否したい」、という場合を想定しています。3は、間違って自身の信頼されたネットワークからのアクセスを拒否しないようにするためです。自分が自宅サーバにsshログインする際に、うっかりパスワード入力を間違ってしまうとログイン失敗履歴に残ってしまうので、その場合でもアクセス拒否しないよう指定したIPアドレスからのアクセスは拒否しないようにします。4は、FWの設定の仕方です。今回は、アクセス拒否するIPアドレスを対象にFWを設定します。INPUTポリシへの追加のためFWは「デフォルト許可」を前提として、拒否するIPアドレスのみを明にiptalbesにルール追加します。整理するとやりたいことを以下のIPアドレスの集合で表してみます。「拒否したいIPアドレス」は、スクリプトで実現することの1,2に相当します(A,D,F,G)。拒否したいIPアドレスとは似て非なるもので既にiptablesにルール(拒否)が設定されているIPアドレスの集合です(B,D,E,G)。拒否したいIPアドレスの中には、これからルールに登録しなければならないIPアドレス(A,F)と既にiptablesに登録されているもの(D,G)があります。iptablesへの二重登録を避けるために、後者についてはルールを追加してはいけないのでこのように分類して考えます。最終的なFW(iptables)の設定内容は、拒否するIPアドレスの追加ルール設定(A)と、許可するIPアドレスの既存ルール削除設定(E,G)となります。拒否したいIPアドレスと許可したいIPアドレスが重複する場合、そのIPアドレスは許可することとします。拒否したIPアドレス(iptables設定済み)と許可したいIPアドレスが重複する場合も同様に、そのiPアドレスは許可(iptablesから削除)することとします。上記の、A,G,Eのiptablesルールを作成するシェルスクリプトを作成しました。※図中の「許可したいIPアドレス」、「許可するIPアドレス」は、正確には「拒否したくないIPアドレス」、「拒否しないIPアドレス」と書くのが正しいです。作成したシェルスクリプトシェルスクリプト(bash)を書いてみました。このシェルスクリプトによって書き換えたルールは後で元に戻すことができるので、興味があればお試しで実行してみてください。$0fiコメントと空行を除けば、53行のスクリプトです。Debian系のLinux(Ubuntu、Raspbian)を想定していますので、RedHat系のLinux(CentOS)で実行する場合はログの場所(91行目)のパスを/var/log/secureに修正してください。スクリプトの処理について、以下の記事で解説します。外部からのアクセスに対するセキュリティを少しでも高める為に、以下のようにFWを更新する仕組みを考えました。これを実現するスクリプトを作成して記事で紹介しています。上記のシェルスクリプトを適当な場所(/path/to/script/)において、実行権限を付与してください(必須)。事前に拒否したいIPアドレスリストと許可したいIPアドレスリストを作成しておきます(任意)。(IPアドレスと許可したいIPアドレスが無ければ、シェルスクリプト単体で動作します。)ここでは、シェルスクリプトと同ディレクトリ配下にdeny-ip.dディレクトリを作成し、ファイルを配置します。96.239.37.123123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421101.132.227.124101.200.177.198101.200.55.9101.201.237.252101.87.101.87103.108.187.4103.130.209.251103.210.73.67103.21.148.54103.239.252.178104.236.246.16104.236.81.204104.248.144.147104.248.181.156106.13.20.31106.14.135.136106.14.163.216106.15.250.167106.252.253.10106.255.236.106106.3.129.209106.3.40.140106.45.0.217106.45.0.9106.75.239.79107.170.172.23109.110.52.77109.111.164.63110.45.145.178110.55.109.59110.83.32.64111.121.71.113111.12.52.238111.230.105.142112.132.89.81112.222.255.100112.74.203.41113.105.94.66113.116.246.129113.128.104.208113.128.104.254113.160.98.121113.200.78.222113.208.113.35113.52.135.201113.57.95.215114.116.103.75114.118.97.195114.7.206.227115.143.217.157115.233.227.46115.236.53.226115.29.143.215115.29.7.45115.68.184.88116.112.0.60116.197.132.33116.31.102.81116.31.102.82117.186.220.86117.50.36.250117.78.42.106118.136.85.166118.140.104.238118.25.62.164118.27.18.232118.45.190.1671.190.192.178119.23.33.89119.28.1.253119.3.201.34119.39.46.202119.73.125.51120.133.17.168120.133.22.121120.133.226.22120.202.57.157120.220.15.5120.230.82.40120.78.11.170120.78.160.213120.79.0.86121.128.236.62121.135.237.32121.140.142.231121.159.95.49121.196.23.247121.196.57.160121.43.189.248121.48.164.130122.116.40.230122.15.82.86122.189.56.78122.224.94.188122.96.92.246123.142.108.122123.157.134.238123.206.21.481.235.143.134123.57.213.165123.59.72.15123.59.94.122124.127.102.1124.160.236.161124.193.149.90124.194.49.19124.227.31.8124.43.161.249124.43.177.160124.65.186.186124.95.128.163125.131.73.90125.212.202.179125.227.130.21.254.154.42125.75.40.119125.88.254.178128.199.127.217128.199.80.18128.199.81.8129.28.147.159131.100.11.232138.118.143.20613.81.50.85138.197.105.79138.68.20.158139.129.90.203139.129.97.42139.196.124.205139.198.123.233139.199.200.182139.59.131.37139.59.14.210139.59.25.238139.59.59.187139.59.61.186139.59.79.56139.59.99.142139.9.165.138139.99.98.19214.136.204.4114.225.3.47142.93.112.49142.93.127.16142.93.178.254142.93.215.82142.93.42.177142.93.82.22914.36.197.119147.135.231.210147.139.34.137149.202.102.36149.202.208.104149.202.3.113150.255.9.205152.231.89.122154.198.2.4157.230.163.6157.230.39.120157.230.54.248157.245.149.151157.245.246.132157.245.60.215159.192.148.4159.203.161.124159.65.136.194159.65.144.233159.65.159.1159.65.245.203159.65.54.221159.65.65.54159.89.165.127163.179.126.62164.132.101.10165.22.110.2165.22.127.136165.22.242.174165.22.250.226165.22.60.7165.227.5.140165.227.53.241167.71.115.245167.71.217.92167.71.239.181167.99.167.105167.99.170.160167.99.75.174168.195.113.11168.228.220.252169.55.91.115170.151.0.4171.34.177.61175.121.153.50175.184.164.160175.184.165.200176.166.1.64177.152.144.58178.128.10.117178.128.148.98178.128.156.174178.128.173.238178.128.39.0178.62.220.70178.62.99.41180.250.18.20180.250.80.88180.76.56.128181.10.18.188181.143.228.170181.191.98.227181.27.127.132181.65.157.134183.134.198.30183.195.37.143183.195.40.85185.117.57.86185.228.138.227185.50.37.152185.51.63.242187.115.80.122188.10.184.201188.165.245.53188.166.253.195188.166.34.234188.166.72.240188.226.250.187188.242.70.154188.44.52.11188.6.165.216188.93.245.172189.126.202.121189.254.33.157190.103.200.2190.112.226.197190.121.130.37190.145.38.91190.85.18.130193.112.187.205193.112.248.85193.151.128.73193.27.228.17195.158.29.222195.161.72.70195.239.237.94195.91.186.78198.100.45.126198.199.66.10199.19.225.67201.140.123.130201.182.66.18201.216.217.25201.6.247.90202.107.251.28202.114.100.250202.88.241.107203.143.119.196203.251.139.218206.189.132.204206.189.136.160206.189.172.90206.189.188.223206.189.28.79207.154.198.74209.124.69.227210.117.210.226210.4.118.157211.210.154.32211.99.229.3212.102.39.1212.64.40.200213.187.77.253216.150.147.66216.8.167.175218.201.114.34218.28.30.125218.29.67.194218.66.59.169218.75.61.254218.92.40.162219.147.90.16219.153.97.127219.93.106.38220.76.205.178221.11.104.118221.207.122.234221.218.247.38221.234.237.140221.238.32.130222.106.160.180222.122.179.208222.77.98.78222.79.49.199222.87.147.62223.171.50.236223.197.175.171223.70.246.13124.64.157.14827.128.201.8827.17.28.13227.224.137.143.1.255.1523.249.33.2136.133.62.15436.32.3.6036.37.201.13337.139.9.2337.187.96.13037.252.70.6937.59.43.21639.105.200.5539.106.118.14739.106.50.25139.129.55.8539.96.19.17139.96.82.17439.99.203.25140.117.253.22241.141.248.19642.112.20.3245.238.33.14745.238.33.15045.33.88.23746.101.24.19746.101.93.14946.105.163.846.146.136.847.100.88.6547.101.187.947.104.176.20947.105.164.10547.105.220.14947.106.210.20747.107.140.22047.107.141.3447.107.62.21847.110.225.7847.114.96.23747.244.175.16747.244.213.7347.244.45.1247.88.17.2547.92.152.14847.92.98.12347.94.175.17547.94.215.3547.96.144.10247.96.4.8449.4.69.19249.69.78.13250.250.224.2255.146.80.5351.77.246.15551.79.147.1775.188.210.2275.196.110.17052.130.75.155.39.74.23354.38.190.18754.39.149.15258.132.203.17958.132.214.15258.16.48.19058.214.246.3458.69.176.2245.88.155.13060.12.26.960.13.6.20860.165.50.15060.170.152.15360.250.67.4760.29.123.20261.245.153.13961.250.206.11061.81.0.12161.82.100.14362.197.86.1562.234.188.15766.70.157.6768.183.190.4368.183.218.5070.50.213.9576.14.151.13076.161.57.15477.56.63.22377.94.137.9179.137.84.21079.8.152.24880.241.44.23880.28.151.21080.66.77.11080.92.232.3981.169.241.3081.183.220.4282.145.31.21282.207.87.2482.223.69.1785.172.174.4685.214.224.25285.243.161.24387.106.30.2488.204.164.23489.179.125.7189.189.154.6689.252.228.13591.192.197.17291.205.217.2291.224.205.6291.227.12.2091.234.99.17391.238.244.3792.246.16.3992.45.61.9392.63.199.2793.100.138.12993.180.157.6194.102.50.15595.213.214.1395.217.18.3395.68.243.795.79.41.18896.239.37.123ローカルIPアドレスは拒否されないようにしていますので、ローカルIPアドレスはallow_ip_listに記載は不要です。事前に必要なファイルの構成は以下となります。許可したいIPアドレスリスト(任意)FWの更新(update)firewall(iptables)を更新するときは、以下のコマンドを実行します。update初回起動時は、以下のような出力となります。DENY-IPdeny-ip.dが無い場合は、シェルスクリプトと同ディレクトリ配下に、deny-ip.dディレクトリとファイルが作成されます。★作成されるiptablesに追加したルールを見たい場合は、iptables-shを参照してください。外部からのアクセスに対するセキュリティを少しでも高める為に、以下のようにFWを更新する仕組みを考えました。これを実現するスクリプトを作成して記事で紹介しています。結果としてうまく動作していて、自宅サーバ...komone-life.com2020.11.17FWを元に戻す(remove)このシェルスクリプトによって追加されたルールを消します。removeiptablesが元通りになります。DENY-IPiptablesルール確認(status)このシェルスクリプトによって追加されたルールを参照します。statusiptables(DENY-IP)のルールが表示されます。0.0.0.0/0:拒否したIPアドレスリストを書き出す(dump)iptablesにルール追加されたIPアドレスリストをdeny_ip_listに書き出し、静的な拒否IPアドレスリストを作成します。dumpすることによって、ログ(/var/log/auth.log)に記録されていなくても、アクセス拒否ルールを追加することができます。dumpiptables(DENY-IP)のルールからIPアドレスを抽出してdeny_ip_listに出力します。一通り動作確認をしてみて、問題なかったのでこれをcrontabに設定して自動的に起動させてみます。/etc/crontab以下の内容を追記します。stausを実行するのは、実行結果をログに残すためです。これで、毎日自動的にFWを更新する仕組みができました!1週間運用してみて1週間運用してみて、効果があったのか確認してます。uniq結果は0件、良好です。アクセスが無かっただけかもしれないのでフィルタしたパケット数を確認してみます。0.0.0.0/0DENY-IPが42M(3323MB)のパケットをブロックしているようです。機能しています!まとめsshログイン失敗履歴から攻撃者のIPアドレスを特定し、FW(iptables)に自動でアクセス拒否ルールを設定するシェルスクリプトを作成してみました。外部からのアクセスに対するセキュリティを少しでも高める為に、以下のようにFWを更新する仕組みを考えました。これを実現するスクリプトを作成して記事で紹介しています。結果としてうまく動作していて、自宅サーバ...komone-life.com2020.11.17これをcrontabで自動起動させてやれば、攻撃者から身を守れます。私の自宅サーバでも絶賛稼働中です。そのため、間違っても私のサーバ(komone-life.com)にsshでログインしようとしないでください。sshログインに失敗すると、攻撃者とみなして翌日にはそのIPアドレスからのアクセスが拒否されてこのブログが読めなくなってしまいます。ブログにアクセスできなくなった方は、フィルタを解除しますのでどうにかして私に連絡してください。ふつうの人が私の自宅サーバにsshでログインしてくることは無いので、このスキーム(sshログイン失敗したIPアドレスをブロックする)に問題はないはず。このプログラムを作りながら思ったことがあります。結局22番ポート空けるならFail2Banでよくね?うん、、だけど、良い頭の体操になったからいいんです。参考になれば幸いです。WZR-HP-AG300HにOpenWRTを導入して遊んでいます。先日、OpenWRTの導入ができたので、初期設定を行います。自宅サーバをUbuntu22.04LTSに更新した話GWで半日程時間ができたので、自宅サーバのUbuntuを更新。別サーバに新OSを立てて、もろもろのDockerプロジェクトをコピーすることに。20:00頃~20:22の間、板橋区エリアの落雷に伴い自宅サーバが停止いたしました。これに伴い、本ブログの閲覧が出来ない状態となっておりました。先日、録画用の外付けHDD(4TB)が壊れてしまったので、新しい外付けHDDを購入してみました。今回購入したのは、バッファロー製の6TB外付けHDD。外部からのアクセスに対するセキュリティを少しでも高める為に、以下のようにFWを更新する仕組みを考えました。これを実現するスクリプトを作成して記事で紹介しています。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。上に表示された文字を入力してください。最近の投稿(2023.3)SPYDの分配金が発表&前年比40.64%減。最近の投稿(2023.3)SPYDの分配金が発表&前年比40.64%減。難病タイトルとURLをコピーしました。