数日前、アスタリスクをインストールし、コールルーティングを使用して古い構成をダウンロードし、ローカルSIPプロバイダーに接続することを意図しました。 Asteriskを起動してからわずか数分後に、ログでサーバー上の認証の試みを見つけました。 このような画像は、インターネット上にあるすべてのアスタリスクで見られます。 私の最愛のMikrotikと同じくらい愛されているpythonでプレイし、これらの攻撃者をどうするかを考え出すのは強い意志でした。
だから私たちは持っています:
- Ubuntu Server 14.04(問題ではないと思います。他のディストリビューションでも動作するはずです)
- Fail2ban
- MySQL
- アスタリスク (またはブルートフォース攻撃から保護する必要があるその他のサービス)
- MikroTikルーター
- 手
- 自転車を発明したいという願望
いくつかの記事(
1、2 )を読んだ後、次の概念が生まれました。
- Fail2Banを使用して攻撃者を一定期間禁止し、MySQLデータベースに自分のIPアドレスのレコードを追加します
- 一定数の禁止が発行された後、IPアドレスをルーターの禁止リストに追加します
そして今、ソリューションの実装に。
1.次の情報を含むデータベース/テーブルを作成します-IPアドレス、国コード、国名、発行禁止の数、攻撃/サービスのタイプ(Fail2Ban構成からの刑務所名)、最後の試行、最初の試行(将来のために、おそらくどういうわけかこのデータを使用します)。
スキームCREATE DATABASE fail2ban CHARACTER SET utf8; CREATE TABLE `ban_history` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `ip_address` char(15) NOT NULL DEFAULT '', `country_code` varchar(5) DEFAULT NULL, `country_name` varchar(30) DEFAULT NULL, `count` int(11) NOT NULL, `type` varchar(30) DEFAULT NULL, `last_attempt` datetime NOT NULL, `first_attempt` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.データベースにレコードを追加するスクリプトを作成します。 このスクリプトはpythonで記述されており、次の追加モジュールが必要です
-pygeoipおよび
MySQL-python 。 両方のモジュールは、pipパッケージマネージャーを使用して簡単にインストールできます。
pip install pygeoip MySQL-python
スクリプトは、構成ファイルからデータベースに接続するためのデータを取得します。デフォルトでは、同じディレクトリ内で検索を試みますが、「-c」キーを使用してパスを指定することもできます。
構成ファイルの例[一般]
log_file = /var/log/blacklist_db.log
mysql_ip = localhost
mysql_user = db_user
mysql_password = db_pass
mysql_db = fail2ban
#禁止の数。その後、IPアドレスをブラックリストに追加します。デフォルトは10です
#ban_count = 10
重要な点は、iptablesにルールを追加するとともにスクリプトが実行されることです。そのため、次のファイルを編集しました。
/etc/fail2ban/action.d/iptables-allports.conf /etc/fail2ban/action.d/iptables-multiport.conf /etc/fail2ban/action.d/iptables-new.conf(このアクションの用途がわからない、忠実度を変更する)
したがって、適切なルールをiptablesに追加した後、スクリプトが実行され、データベース内のデータが追加または更新されます。
3.ブラックリストを生成するスクリプトを作成します。これは、その後マイクロティックにインポートされます。 スクリプトは同じ構成ファイルを使用してデータベースへの接続に必要な設定を取得し、そのルートディレクトリで検索します。ここでも、「-c」キーを使用してパスを指定できます。 出力では、Mikrotikにインポートするためのスクリプト/アドレスリストが作成されます。これも同じディレクトリにあり、「-o」キーを使用して代替パスを指定できます。
このスクリプトはクラウンを使用して実行され、起動頻度を15分に設定します。
*/15 * * * * /// > /dev/null 2>&1
4.受信したリストをルーターにインポートします。
Mikrotikの結果のスクリプトは、Webサーバーのディレクトリに配置する必要があります。次の行を追加した構成に
nginxがあります。
location /blacklists.rsc { root /////; }
Webサーバーの代わりに
ftpまたはtftpを使用でき
ますが 、それはすべて好みに依存します。
この部分は、
2番目の記事からほぼ完全に「盗まれる」。
1時間に1回、ファイルは次のスクリプトを使用してHTTP経由でサーバーからダウンロードされます(以下はMikrotikのスクリプトとスケジューラルールです)。
ブラックリストをインポートするスクリプト:
このリストを使用するには、禁止ルールが作成され、許容ルールの前に配置されます(ルールは順番に処理されるため)。この例では、SSH接続とSIPに対して2つのルールが作成されます。
/ip firewall filter add action=reject chain=forward comment="SIP: Reject Blacklisted IP addresses" dst-port=5060-5061 in-interface=ID-Net protocol=udp src-address-list=ASTERISK_BLC add action=reject chain=forward comment="SSH: Reject Blacklisted IP addresses" dst-port=22 in-interface=ID-Net protocol=tcp src-address-list=SSH_BLC
ID-Netは私のフロントエンドの名前です。
この「バイク」は何のふりもせず、数時間「膝の上」で組み立てられました。
ハブロフスク市民に対する建設的な批判と、改善の可能性についての提案を期待しています。
送信されたすべてのスクリプトとデータベーススキーマでアーカイブします。GitHubのリポジトリ 。