ファイルの中身だけ空っぽにしてファイルを残す方法。viで開き
:%dとやっても良いのですが、ファイル自体が重たいと開くまでに時間がかかり億劫です。以下の方法で中身だけ消すことができます。
> hoge.txttruncate -s 0 hoge.txt: > hoge.txt
Linuxサーバー構築・設定でのメモ
ファイルの中身だけ空っぽにしてファイルを残す方法。viで開き
:%dとやっても良いのですが、ファイル自体が重たいと開くまでに時間がかかり億劫です。以下の方法で中身だけ消すことができます。
> hoge.txttruncate -s 0 hoge.txt: > hoge.txt
以前は乗っ取られたサーバーを使っての攻撃が多かったのですが最近はクラウドサービスからの攻撃が増えました。
クラウドサービスを使われると、どんどんIPアドレスを変えてくるので個別のIPアドレスの拒否では対応することができません。
Webサーバーへの攻撃なので、攻撃元のサーバーからはアクセス出来なくても問題ないです。そもそもそういう使い方を許し続けているクラウドサービスなんて危険です。
そういう攻撃があるCIDRをまとめたリストを見つけましたので共有します。
このブラックリストは定期的に更新されているようですので、定期的にダウンロードしファイヤーウォールで拒否してみました。
劇的にサーバーの負荷がさがりました。Webサーバーへのアクセスの殆どがこういう攻撃なんですね。
apacheサーバーが突然の高負荷。Timeout時間などを短くしても改善しませんでした。
ACCESSログなどを見ても不審なアクセスはなし。
アクセス数の多いIPアドレスを調べてみました。(153.125から始まるIPは除外)
# awk '{print $1}' /var/log/apache2/access.log | grep -v '^153\.125\.' | sort | uniq -c | sort -nr | head
間近の計測をするためにアクセスログは新しくしました。
結果を見てみるとGoogle Cloudからのアクセス。2分ほどで4000回位のアクセスがあります。
サイトの情報をごっそり抜こうとしているのでしょうか。
該当IPをファイヤーウォールで遮断しました所、ロードアベレージが60超えていたのが、0.9まで落ち着きました。
さて、どうしましょうか・・
このIPが100%原因というわけでもないので、しばらくログを監視する必要があります。10分以内でアクセスの多いIPランキングの出し方。
awk -v d="$(date --date='10 minutes ago' '+%d/%b/%Y:%H:%M')" '
$0 ~ /^\[/ { next }
{
gsub(/^\[/, "", $4);
if ($4 >= d && $1 !~ /^153\.125\./) print $1;
}' /var/log/apache2/access.log | sort | uniq -c | sort -nr | head
PHPでmb_strposを使い、XMLフィードから特定の文字列を抽出するコードを書きました。
こちらは、早朝にCronで自動で実行するものです。
手動(コマンド)で実行すると期待通りの結果が出てきます。問題なさそうです。
手動(コマンド)で実行すると期待通りの結果になるのに、Cronでは何故かmb_strposで抽出できていない文字列が多数出てきました。
サーバーの内部はUTF-8ですし、PHPのソースコードもXMLフィードもUTF-8なので明示的に指定する必要など無いと思っていましたが、Cronなどで実行する場合は指定する必要があるようです。
まず、PHPソースコードの上の方に以下を記載しました。
mb_internal_encoding("UTF-8");このPHPはブラウザからアクセスして実行するのではなく、Cronで実行したいので.htaccessではなくPHPソース内に上記を記載しました。
しかし、Cronで実行すると抽出漏れが発生しています。
次に、mb_strposでも文字コードを指定しました。
mb_strpos(抽出したい文字列, "対象となる文字列", 0, "UTF-8")これでも駄目です。Cron実行すると同様に抽出漏れが置きます。
結果、Cronを記述する時に以下のようにすることで解決しました。
01 9 * * * export LANG="UTF-8"; /usr/bin/php /home/*********.phpなぜCronでは上記のように文字コード指定しないと行けないのかは不明ですが、上記のようにCronで文字コードを指定することで無事解決しました。
SiteGuardなどのWAFは不正なアクセスを事前に防いでくれて本当に助かります。
しかし、SiteGuardではアクセス毎の拒否のため、同一IPから同じようなアタックを受けることが少なくありません。
サーバー1台あたり1日数千件のログが残ります。
そのようなIPからのアクセスが、他でまともなアクセスであるわけはないと考えました。
SiteGuardで拒否したログは以下にあります。
/opt/jp-secure/siteguardlite/logs/http/detect.log
/opt/jp-secure/siteguardlite/logs/http/form.log上記ログファイルをSwatchで読み、iptablesで全てDROPするようにしました。
swatchの設定ファイルは以下の2つ
# logfile /opt/jp-secure/siteguardlite/logs/http/form.log
watchfor /http/
pipe "/usr/local/bin/swatch_action.sh ' ' 3"
threshold track_by=/sshd.*Failed password for invalid user/,type=limit,count=3,seconds=10# logfile /opt/jp-secure/siteguardlite/logs/http/detect.log
watchfor /http/
pipe "/usr/local/bin/swatch_action.sh ' ' 3"
threshold track_by=/sshd.*Failed password for invalid user/,type=limit,count=3,seconds=10
上記の設定をしていると、GoogleBOTまで遮断していることが分かりました。
Googleには悪意はない事は明らかですが、何かから辿ってアクセスしてほしくないファイルを読みに着ているようです。
そこで、SiteGuardにGoogleのBOTのIPをホワイトリストとして設定しました。
自社サイトでさくらインターネットのVPS(メモリー1GB)を利用していましたが、レコード数の多いクエリーが遅くなってきました。
さくらインターネットにはスケールアップという機能があるので試してみました。
1GB→2GBへのスケールアップです。
早い時間だと5分位で終わったという記事を読みました。さくらインターネットの案内では30分~1時間ほどかかると書いてあります。
5分と1時間では大きく変わるのですが、サービスを止める必要があるので1時間は見ておいたほうが良さそうです。
私がスケールアップをした時間は土曜の13:30です。スケールアップが完了するまでに15分ほどかかりました。
| 旧 | スケールアップ後 |
|---|---|
| 仮想2Core | 仮想3Core |
| 1GBメモリー | 2GBメモリー |
| SSD 100GB | SSD 100GB |
スケールアップ前から何かのキャンペーン中だったのかSSD100GBでした。
こちらもし容量が大きくなる場合は自分で容量を拡張する必要があります。
SiteGuardはとても頼りになるWAFですが、Googleには許可したい場合があると思います。
私の場合は、SiteGuardで遮断したIPアドレスはSwatchで一定期間DROPします。
GoogleのBOTが一定期間DROPされると何かと問題なのでGoogleのIPだけはSiteGuardでは安全(Accept)にしたいところです。
GoogleBOTのIPアドレスを調べてみたところかなりの数がありました。
それらをSiteGuardのカスタム・シグネチャにコピペしていく作業はとても疲れます。
そこで、SiteGuardのカスタム・シグネチャのダウンロード/アップロードの機能を利用しました。

まず、現在の設定をダウンロードし下記を追記してからアップロード。一瞬で追記されました。
メールアドレスは正しいのにGmailから「550-5.1.1 The email account that you tried to reach does not exist. Please try 550-5.1.1」というエラーメールが返ってくることがあります。
他のメールアカウントから送信すると正常に送信されます。
SPFやDKIMの設定はされているのになぜ?となりましたが、以下が原因でした。
メール本文内に区切りのために「——–」「=======」などを多用すると上記のようにエラーが返ってくることが分かりました。
上記をなくすと無事エラーメールにはならなくなりました。
恐らくスパムメールのような扱いになってしまうんですね。
ログファイルなどlogrotaleで古いファイルが削除されてくれればよいのですが、何故か削除されずにずっと残りHDDを使い切ってしまうことがあります。
logrotaleの設定などをしっかり見直せば良いのですが時間が許さなかったりします。
また、PHPなどが生成するファイルやアップロードした画像ファイルなどでも同様可と思います。
そういう時に、一定期間経過したファイルを削除するコマンドを使います。
find /ディレクトリパス/ -name '*.log' -daystart -mtime +4 -delete上記は4日経過したファイルを削除します。
例えば/homeディレクトリ内のディレクトリで容量を食っているディレクトリがあるとします。一つづつディレクトリを見ていくのは面倒です。
# du -s /* | sort -rn | head -10上記コマンドで使用量の多い順に表示されます。
上記をGBの単位で表示したい場合は、
# du -s /* | sort -rn | head -10 | awk '{ printf "%.2f GB\t%s\n", $1/1024/1024, $2 }'上記を実行すると以下のような結果が帰ってきます。
362.01 GB /home
295.58 GB /var
3.17 GB /usr
2.00 GB /swapfile
0.17 GB /root
0.11 GB /opt
0.08 GB /boot
0.01 GB /etc
0.00 GB /run
0.00 GB /tmphome と varでかなり使っているようなので、更にこれらのディレクトリの中では何が容量を使っているのか調べます。
# du -s /home/* | sort -rn | head -10 | awk '{ printf "%.2f GB\t%s\n", $1/1024/1024, $2 }'と繰り返して行くと無駄に容量を浪費しているファイルが見つかります。