ボット、
実際に
結果を
apache-ultimate-bad-bot-blocker に ついて
Apache で
Apache 本体の
fail2ban
のAddon - Google Analytics の
フィルタ定義 - Google Search Console の
リンク否認用の アップロードファイル - robots.txt
前提
以下の
OS
cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core)
Apache の
Version httpd -V Server version: Apache/2.4.29 (CentOS)
インストール、 設定、 定期的な 更新
インストール
以下、
apache-ultimate-bad-bot-blocker/install-apacheblocker.sh at master · mitchellkrogza/apache-ultimate-bad-bot-blocker この
スクリプトの
取得 cd ~ sudo wget https://raw.githubusercontent.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/master/install-apacheblocker.sh chmod +x ~/install-apacheblocker.sh
設定値の
変更
スクリプト内のApacheの ディレクトリ、 設定ファイルの 格納ディレクトリを 必要が あれば 書き換えます。 #Generally /etc/apache2 or /etc/httpd depending on OS # Apacheのディレクトリは /etc/httpd APACHE_CONF='/etc/httpd' #location of Apache blocker files BLOCKER_URL="https://raw.githubusercontent.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/master/Apache_${APACHE_VERSION}/custom.d" # ディレクトリの指定は custom.d sudo mkdir -p "${APACHE_CONF}/custom.d"
スクリプト実行
幾つかsudo ~/install-apacheblocker.sh
ファイルが ダウンロードされ、 最後に、 Manually edit vhost to include globalblacklist.conf
とメッセージが 出力されます。
メッセージの通り、 VirtualHost の 設定を 変更する 必要が あります。 設定ファイルの
説明
以下の、設定ファイルが ダウンロードされました。 それぞれls -1 /etc/httpd/custom.d/ ---------------------------------- bad-referrer-words.conf blacklist-ips.conf blacklist-user-agents.conf globalblacklist.conf whitelist-domains.conf whitelist-ips.conf ----------------------------------
内容を 説明します。 bad-referrer-words.conf
リファラーspam に設定されている リファラーの 文字列を 定義する ファイルです。
デフォルトは、コメントのみで 末定義で、 使用者側で 必要が あれば 追記します。 blacklist-ips.conf
アクセスをブロックする ip が 定義されています。
デフォルトで、幾つかip が 定義されています。 blacklist-user-agents.conf
アクセスをブロックする ユーザーエージェントを 定義する ファイルです。
デフォルトは、コメントのみで 末定義で、 使用者側で 必要が あれば 追記します。 globalblacklist.conf
メインの設定ファイルに なります。 各confファイルは この ファイルから 読み込まれています。
ブラックリストのユーザーエージェント、 リファラー文字列が 大量に 記載されています。 whitelist-domains.conf
アクセスを許可する、 domain 文字列を 定義します。
デフォルトはコメントのみです。 whitelist-ips.conf
アクセスを許可する、 ip を 定義します。
デフォルトはコメントのみです。
設定
VirtualHost定義の
編集
VirtualHost の定義箇所に、 globalblacklist.conf
のInclude 記述を 追加します。 複数 VirtualHost が<Directory /var/www/site> Include custom.d/globalblacklist.conf Order Deny,Allow Deny from env=ng_host Deny from env=ng_referer Deny from env=ng_lang <IfModule mod_rewrite.c> # domain rewrite rules RewriteEngine On
あれば 複数記述する 必要が あります。 設定ファイルの
読み込み、とテスト
設定ファイルを読み込み、 curl で テストを 実施します。 ファイル読み込み
sudo apachectl configtest sudo apachectl graceful
curl で
テスト
ユーザーエージェントを指定して、 curl を 実行レスポンスコードを 確認します。 curl -A "googlebot" https://www.monotalk.xyz -o /dev/null -w '%{http_code}\n' -s 200
curl -A "masscan" https://www.monotalk.xyz -o /dev/null -w '%{http_code}\n' -s 403
レスポンスコード からcurl -I https://www.monotalk.xyz -e http://zx6.ru -o /dev/null -w '%{http_code}\n' -s 403
適用できている ことが 確認できました。
定期的な 更新
適用はglobalblacklist.conf
の
mitchellkrogza/apache-ultimate-bad-bot-blocker に
更新スクリプトの
取得 sudo wget https://raw.githubusercontent.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/master/update-apacheblocker.sh chmod +x update-apacheblocker.sh
更新スクリプトを
編集
スクリプト内の、筐体依存、 環境依存の 箇所を 変更します。
当ブログだと、APACHE_CONF
、EMAIL
、CURL_TEST_PROTOCOL
、CURL_TEST_URL_NAME
を変更しました。 #Major Apache version e.g. 2.2, 2.4 APACHE_VERSION='2.4' #Directory where bad bot configs are located. APACHE_CONF='/etc/apache2/custom.d' #location of globalblacklist BLACKLIST_URL="https://raw.githubusercontent.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/master/Apache_${APACHE_VERSION}/custom.d/globalblacklist.conf" #Address to send update notifications EMAIL='email@example.com' #Make backup of globalblacklist.conf when updating true or false. MAKE_BACKUP=false #Run apachectl test before reload true/false TEST_BEFORE_RELOAD=true #Curl test to ensure blocking still working after reload true/false. CURL_TEST_AFTER_RELOAD=true #Specify if your site uses http or https CURL_TEST_PROTOCOL=http #domain name to test against. CURL_TEST_URL_NAME=localhost
crontab で
スケジュール設定
crontab で定期実行の 設定を します。
私は以下のように 設定しました。 SCRIPT_HOME="/root/script" LOG_DIR="/var/log/blog_jobs" 00 02 * * * /bin/sh $SCRIPT_HOME/update-apacheblocker.sh $>> $LOG_DIR/update-apacheblocker.log # update-apacheblocker
スクリプトの
動作に ついて
スクリプトの動作は 以下のような 動きに なっています。 globalblacklist.conf が
スクリプトの 実行環境に 存在するか 確認し、 なければ 処理中断。 github リポジトリから
globalblacklist.conf を 取得、 スクリプトの 実行環境の globalblacklist.conf と 差分を とり、 差分が なければ 処理中断。 差分が
ある 場合は、 バックアップを 取得し globalblacklist.conf を 更新。 更新後に、
テストを 実施、 テストが 失敗した 場合は メール送付。
ブロック状況を レポートする
悪質な
この
- monitor_access_log.sh 上記を
#!/bin/sh MAIL=your@gmail.com LOG_DIR=/var/log/httpd # Monitoring Daily Referers tail -10000 $LOG_DIR/ssl_access_log | awk '$11 !~ /google|bing|yahoo|yandex|www.monotalk.xyz|mutter.monotalk.xyz|monotalk.xyz/' | awk '{print $11}' | tr -d '"' | sort | uniq -c | sort -rn | head -1000 | mail -s "Top 1000 Referers on ssl_access_log for montalk.xyz" $MAIL # Monitoring Daily User Agents tail -50000 $LOG_DIR/ssl_access_log | awk '{print $12}' | tr -d '"' | sort | uniq -c | sort -rn | head -1000 | mail -s "Top 1000 Agents on ssl_access_log for monotalk.xyz" $MAIL # Monitoring Daily Referers tail -10000 $LOG_DIR/access_log | awk '$11 !~ /google|bing|yahoo|yandex|www.monotalk.xyz|mutter.monotalk.xyz|monotalk.xyz/' | awk '{print $11}' | tr -d '"' | sort | uniq -c | sort -rn | head -1000 | mail -s "Top 1000 Referers on access_log for montalk.xyz" $MAIL # Monitoring Daily User Agents tail -50000 $LOG_DIR/access_log | awk '{print $12}' | tr -d '"' | sort | uniq -c | sort -rn | head -1000 | mail -s "Top 1000 Agents on access_log for monotalk.xyz" $MAIL
cron から 定期実行するようにしました。
レポートの 集計
Gmail に
function pollMail() { var strTerms = "xxxxx@gmail.com AND Top 1000 AND is:unread"; var numMailMax = 20000; //取得するメール総数 var numMail = 500; //1度に取得するメール数 var myThreads; //条件にマッチしたスレッドを取得、最大500通と決まっている var myMsgs; //スレッドからメールを取得する →二次元配列で格納 var valMsgs; var flattenMsgs; var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("report") var i = sheet.getLastRow(); if(i < numMailMax) { valMsgs = []; myThreads = GmailApp.search(strTerms, i, numMail); //条件にマッチしたスレッドを取得、最大500通と決まっている myMsgs = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得する →二次元配列で格納 /* 各メールから日時、送信元、件名、内容を取り出す*/ for(var j = 0; j < myMsgs.length; j++){ rows = convertBody2Array(myMsgs[j][0].getBody()); for (var k = 0; k < rows.length; k++) { elem = []; elem.push(myMsgs[j][0].getFrom()); elem.push(myMsgs[j][0].getReplyTo()); elem.push(myMsgs[j][0].getTo()); elem.push(myMsgs[j][0].getDate()); elem.push(myMsgs[j][0].getSubject()); elem.push(rows[k][0]); elem.push(rows[k][1]); valMsgs.push(elem); } } /* スプレッドシートに出力 */ if(valMsgs.length > 0){ sheet.getRange(i + 1, 1, valMsgs.length, 7).setValues(valMsgs); //シートに貼り付け } for(var i = 0; i < myThreads.length; i++){ // 既読にする myThreads[i].markRead(); // ゴミ箱に移動する myThreads[i].moveToTrash(); } } } function convertBody2Array(body) { var lines = body.split("\r\n"); var results = []; for (var i = 0; i < lines.length; i++) { if (lines[i] == "") { continue; } tempLine = lines[i].replace(/\s\s+/g, ""); results.push(tempLine.split(" ")); } return results; }
参考
以下、
よく
見かける クローラの 説明。当サイトに よく 巡回に くる クローラ Top 11 より。 | かきしち カンパニー Web Magazine 私が
メインサイトで アクセス拒否している BOT一覧を 紹介!(.htaccess用の 拒否サンプル付き! ) | Wordpress初心者な 技術屋の 忘備録
設定、
実運用で
コメント