サーバーを外部に公開すると必ず付いてくる問題。それは、第三者によるサーバーへの攻撃です。
攻撃手段は様々ですが、今回はよくある不正なSSH接続を試みた攻撃者を軒並みfirewalldでアクセス遮断する方法をご紹介します。
※ただ、とてつもなく乱暴な方法、いわゆる脳筋運用方法なので扱いにはご注意ください。
準備
今回のスクリプトは、cronを使ってroot権限で定期実行するように設定します。
そのため、スクリプト自体は/root配下に配置するようにします。
また、ログファイルからIPアドレスを抽出する際にperlスクリプトを利用しますので、事前にperlのインストールも済ませておいてください。
# mkdir /root/scripts # mkdir /root/scripts/tmp # touch /root/scripts/block.sh # touch /root/scripts/sed_ip.pl
block.sh
準備が完了したら、block.shの中身を書き込んでいきます。
# vi /root/scripts/block.sh
下記をそのまま貼り付けてご利用ください。
#!/bin/sh cat /var/log/secure |grep Invalid > /root/scripts/tmp/secure_tmp cat /var/log/secure |grep "POSSIBLE BREAK-IN" >> /root/scripts/tmp/secure_tmp perl /root/scripts/sed_ip.pl |uniq > /root/scripts/tmp/secure_sed sed "s/^/firewall-cmd --zone=drop --permanent --add-source=/g" /root/scripts/tmp/secure_sed > /root/scripts/tmp/block.sh echo "firewall-cmd --reload" >> /root/scripts/tmp/block.sh sh /root/scripts/tmp/block.sh rm -f /root/scripts/tmp/*
各行の説明
1行目は言わずもがな、シェバンです。
2行目では、/var/log/secureからInvalidと記載された行をgrepで抽出し、/root/scripts/tmp/secure_tmpへ書き出しています。
3行目では、/var/log/secureからPOSSIBLE BREAK-INと記載された行をgrepで抽出し、/root/scripts/tmp/secure_tmpへ追記しています。
4行目では、/root/scripts/tmp/secure_tmpからIPアドレスのみを抽出するために、後述するsed_ip.plを実行しています。
5行目では、sed_ip.plでIPアドレスだけ抽出した/root/scripts/tmp/block.shの各行先頭に、”firewall-cmd –zone=drop –permanent –add-source=”を追記しています。
これで、抽出したIPアドレスを、firewalldのdrop zoneへ追加するシェルスクリプトが完成します。
6行目では、firewall-cmd –reloadを/root/scripts/tmp/block.shの最終行に追加し、firewalldの設定反映を実施できるようにしています。
7行目では、生成した/root/scripts/tmp/block.shを実行しています。
9行目では、スクリプトを実行した際に生成された一時ファイルを削除しています。
sed_ip.pl
block.shの編集が終わったら、次はsed_ip.plの編集に移ります。。
# vi /root/scripts/sed_ip.pl
下記をそのまま貼り付けてご利用ください。
[perl]
#!/usr/bin/perl
$textfile = "/root/scripts/tmp/secure_tmp";
open (I, "$textfile") or die "Failed to open: $textfile";
my @lines = <I>;
close I;
foreach (@lines)
{
chomp;
$u = $_;
print "$1\n" if /\b(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b/;
}
[/perl]
説明
このPerlスクリプトでは、/root/scripts/tmp/secure_tmpを読み込み、1行ずつIPアドレスを抽出して、出力する処理を最終行まで繰り返しています。
crontabの設定
各スクリプトが準備できたら、 block.shを定期的に実行できるようにcrontabの設定を行います。
# crontab -u root
一番最後の行に下記を追記します。
*/5 * * * * /bin/sh /root/scripts/block.sh
これで5分毎に/root/scripts/block.shをroot権限で定期実行するようになります。
まとめ
この手法で一番気をつけたいところは、自分でログインする際に失敗してしまうと、自分自身もブロックの対象になってしまいます。
もし失敗した場合は、閉め出される前に自分のIPアドレスを除外登録するか、別のネットワークからサーバーへアクセスし、遮断されてしまった自分のIPアドレスを除外してください。
今回の手法だけでは、もちろん攻撃を100%防ぐことは出来ませんが、同一の攻撃者が次のアクションを起こす前に、さっさと遮断登録してしまおうという趣旨で書いています。
脳筋運用なので、もっとスマートに運用できるのであれば、ぜひそちらの手法をご採用ください・・・
コメント