公開SSHアクセスでサーバを運用している場合、悪意のあるログイン試行に遭遇したことがあるかもしれません。この記事では、2つのユーティリティを使って侵入者の侵入を防ぐ方法を説明します。
また、あまり旅行に行かず、基本的に1つか2つの国に滞在するのであれば、FirewallDを設定することで、許可することができます。
まず、このようなアプリケーションに馴染みのない方のために、いくつかの用語を紹介しましょう:
fail2ban: 認証に何度も失敗するホストをブロックするデーモンです。指定された回数失敗すると、設定された期間、特定の IP アドレスをブロックするファイアウォールルールを追加します。
FirewallD: ダイナミックファイアウォールを提供する D-Bus インタフェースを持つファイアウォールデーモンです。従来のiptablesを使うことに決めていない限り、サポートされているすべてのFedoraとCentOSにFirewallDがすでにインストールされています。
仮定
- ホストシステムにはインターネット接続があり、インターネットに直接接続されているか、DMZを通して接続されているか、ルーターからポート転送されています。
- ほとんどのことは他のシステムにも当てはまるかもしれませんが、この記事では現在のシステムが Fedora または RHEL/CentOS バージョン 8 であることを前提としています。CentOS では、Fedora EPEL リポジトリを
sudo dnf install epel-releaseで有効にする必要があります。
インストールと設定
フェイルツーバン
すでに SSH アクセスを許可する Firewalld ゾーンが存在する可能性がありますが、 sshd サービス自体はデフォルトでは有効になっていません。手動で起動し、起動時に恒久的に有効にしないでください:
$ sudo systemctl start sshd
または、システム起動時に有効にし、同時に起動します:
$ sudo systemctl enable --now sshd
次のステップは、fail2banのインストール、設定、有効化です。いつものように、インストールはコマンドラインから行うことができます:
$ sudo dnf install fail2ban
# cat /etc/fail2ban/jail.local[DEFAULT]# "bantime" is the number of seconds that a host is banned.bantime = 1d# A host is banned if it has generated "maxretry" during the last "findtime"findtime = 1h# "maxretry" is the number of failures before a host get banned.maxretry = 5
平たく言うと、直近1時間に5回試行されると、そのIPは1日間ブロックされます。複数回ブロックされたIPのブロック時間を長くするオプションもありますが、それはまた別の記事で。
# cat /etc/fail2ban/jail.d/sshd.localenabled = true
それはとても簡単です! 設定の多くは、Fedora用にビルドされたパッケージで既に処理されています。次にfail2banサービスを有効にして開始します:
$ sudo systemctl enable --now fail2ban
すぐにエラーが出なければいいのですが、そうでない場合は、以下のコマンドでfail2banの状態を確認してください:
$ sudo systemctl status fail2ban
正しく起動しなければ、起動するはずです:
$ systemctl status fail2banfail2ban.service - Fail2Ban ServiceLoaded: loaded (/usr/lib/systemd/system/fail2ban.service; disabled; vendor preset: disabled)Active: active (running) since Tue CDT; 5s agoDocs: man:fail2ban(1)Process: 11230 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS)Main PID: 11235 (f2b/server)Tasks: 5 (limit: 4630)Memory: 12.7MCPU: 109msCGroup: /system.slice/fail2ban.service└─11235 /usr/bin/python3 -s /usr/bin/fail2ban-server -xf startJun :40 localhost.localdomain systemd[1]: Starting Fail2Ban ServiceJun :40 localhost.localdomain systemd[1]: Started Fail2Ban Service.Jun :41 localhost.localdomain fail2ban-server: Server ready
fail2banが起動したばかりであれば、fail2banが興味深い情報を表示することはないでしょうが、fail2banのステータスをチェックし、"jail "が有効になっていることを確認するには、enterを入力してください:
$ sudo fail2ban-client status|- Number of jail: 1`- Jail list: sshd
sshd "jail" の親の状態も表示されます。複数の jail が有効になっている場合、それらはここに表示されます。
$ sudo fail2ban-client status sshdStatus for the jail: sshd|- Filter| |- Currently failed: 8| |- Total failed: 9349| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd`- Actions|- Currently banned: 101|- Total banned: 486`- Banned IP list: ...
fail2banログファイルの侵入試行を監視するには、ログを「テーリング」します:
$ sudo tail -f /var/log/fail2ban.log
tailは素晴らしいコマンドラインツールで、デフォルトではファイルの最後の10行を表示します。fを追加すると、ファイルの末尾を表示するようになり、まだ書き込まれているファイルを見るのに便利です。
出力には実際のIPがあるので、サンプルはここでは提供しませんが、読むことはできます。INFO行は通常、ログインの試みです。特定のIPアドレスから十分な試行が行われた場合、IPアドレスが禁止されたことを示すNOTICE行が表示されます。禁止時間に達すると、禁止解除を示すNOTICE行が表示されます。
ファイアウォールDの設定
受動的か能動的か?
個々のIPアドレスをパッシブにブラックリスト化するか、発信国に基づいてサブネットを恒久的にアクティブにブラックリスト化するかです。
パッシブアプローチの場合、fail2banがしばらく実行されたら、悪者を確認するために sudo fail2ban-client status sshd 実行するのがよいでしょう。おそらく禁止されたIPアドレスがたくさんあるでしょう。出力には興味深い情報がたくさんあるかもしれませんが、この方法では、発信国だけが重要です。物事をシンプルにするために、国以外のすべての情報をフィルタリングしましょう。
この例では、いくつかの有名なドメイン名を使用します:
$ whois google.com | grep -i countryRegistrant Country: USAdmin Country: USTech Country: US
$ whois rpmfusion.org | grep -i countryRegistrant Country: FR
$ whois aliexpress.com | grep -i countryRegistrant Country:
grep -iを使う理由は、grepを大文字小文字を区別しないようにするためで、ほとんどのエントリーは "Country "を使っていますが、いくつかのエントリーはすべて小文字の "country "を使っています!.
侵入を試みた国がわかったところで、問題は、"その国からこのコンピュータに接続する正当な理由がある人がいるかどうか "です。答えがノーであれば、その国全体をブロックしても構わないはずです。
機能的には、能動的なアプローチは受動的なアプローチと大差ありませんが、一部の国からの侵入の試みは非常に一般的です。システムがそのような国でホストされておらず、そのような国からのクライアントもいないのであれば、今すぐブラックリストに入れて待ってみてはいかがでしょうか。
ブラックリストスクリプトと設定
では、どのようにするのでしょうか?FirewallDのipsetを使って、可能な限りプロセスを自動化するために以下のスクリプトを開発しました:
#!/bin/bash# Based on the below article# https://..////------st# Source the blacklisted countries from the configuration file. /etc/blacklist-by-country# Create a temporary working directoryipdeny_tmp_dir=$(mktemp -d -t blacklist-XXXXXXXXXX)pushd $ipdeny_tmp_dir# Download the latest network addresses by country filecurl -LO http://..////-..gztar xf all-zones.tar.gz# For updates, remove the ipset blacklist and recreateif firewall-cmd -q --zone=drop --query-source=ipset:blacklist; thenfirewall-cmd -q --permanent --delete-ipset=blacklist# Create the ipset blacklist which accepts both IP addresses and networksfirewall-cmd -q --permanent --new-ipset=blacklist --type=hash:net \--option=family=inet --option=hashsize=4096 --option=maxelem= \--set-description="An ipset list of networks or ips to be dropped."# Add the address ranges by country per ipdeny.com to the blacklistfor country in $countries; dofirewall-cmd -q --permanent --ipset=blacklist \--add-entries-from-file=./$country.zone && \echo "Added $country to blacklist ipset."# Block individual IPs if the configuration file exists and is not emptyif [ -s "/etc/blacklist-by-ip" ]; thenecho "Adding IPs blacklists."firewall-cmd -q --permanent --ipset=blacklist \--add-entries-from-file=/etc/blacklist-by-ip && \echo "Added IPs to blacklist ipset."# Add the blacklist ipset to the drop zone if not already setupif firewall-cmd -q --zone=drop --query-source=ipset:blacklist; thenecho "Blacklist already in firewalld drop zone."echo "Adding ipset blacklist to firewalld drop zone."firewall-cmd --permanent --zone=drop --add-source=ipset:blacklistfirewall-cmd -q --reloadrm -rf $ipdeny_tmp_dir
これは /usr/local/sbinにインストールし、実行可能にすることを忘れないでください!
$ sudo chmod +x /usr/local/sbin/firewalld-blacklist
次に、設定ファイル /etc/blacklist-by-country作成します:
# Which countries should be blocked?# Use the two letter designation separated by a space.countries=""
一方、もう一方のプロファイル /etc/blacklist-by-ip、追加フォーマットなしで1行にIPが1つだけです。
この例では、ipdenyのゾーンファイルから無作為に10カ国を選択しています:
# ls | shuf -n 10 | sed "s/\.zone//g" | tr ' ' ' 'nl ee ie pk is sv na om gp bn
あとは、設定ファイルに少なくとも1つの国を追加すれば、すぐに実行できます!
$ sudo firewalld-blacklist% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed4 0 --:--:-- --:--:-- --:--:-- 10140 9k 0 --:--:-- --:--:-- --:--:-- 989kAdded nl to blacklist ipset.Added ee to blacklist ipset.Added ie to blacklist ipset.Added pk to blacklist ipset.Added is to blacklist ipset.Added sv to blacklist ipset.Added na to blacklist ipset.Added om to blacklist ipset.Added gp to blacklist ipset.Added bn to blacklist ipset.Adding ipset blacklist to firewalld drop zone.success
FirewallD のブラックリストが成功したことを確認するには、ドロップゾーンと blacklist チェックしてください。
$ sudo firewall-cmd --info-zone=dropdrop (active)target: DROPicmp-block-inversion: nointerfaces:sources: ipset:blacklistservices:ports:protocols:masquerade: noforward-ports:source-ports:icmp-blocks:rich rules:$ sudo firewall-cmd --info-ipset=blacklist | lessblacklisttype: hash:netoptions: family=inet hashsize=4096 maxelem=entries:
2番目のコマンドは、ブロックされた国に基づいて追加され、非常に長くなる可能性があるすべてのサブネットを出力します。
で、どうすればいいの?
最初のうちは監視の頻度が高くなりますが、ブラックリストが増えるにつれて、侵入の試行回数は時間の経過とともに減少するはずです。そのときの目標は、積極的な監視よりもむしろ保守です。
記事を全部読んでよかったと思いませんか?あとはサービスファイルとタイマーを /etc/systemd/system/ダウンロードし、タイマーを有効にするだけです:
$ sudo systemctl daemon-reload$ sudo systemctl enable --now firewalld-blacklist.timer
経由:





