WordPressのスパムを撲滅する

WordPressに大量にスパムが届いていた。
WordPressの管理画面から一つ一つ処理してられないので、対策をしたメモ。

状況

特定IPアドレス XXX.XXX.XXX.0/24 (XXX.XXX.XXX.なんちゃら)から7000通以上のスパムが届いていた。
このアドレスを whois で調べると海外で、この地域にはこのブログを読みたい人はいないだろう。すべてスパムと判断していい。
WordPressではAkismetというスパムフィルタがあり、自動的にスパムとしてマークしてくれるようだが、これはスパムと判断してくれなかった。
そのためWordPressから「現在○○通のコメントが承認待ちです」という旨のメールが度々送られ、精神衛生上悪い。
なのでまずスパムを削除し、その上でこのIPアドレスからはアクセスが来ないように設定する。

環境

  • OS
    CentOS 7.4
  • ブログ
    WordPress 4.9
  • DB
    MySQL 5.5
  • Webサーバ
    nginx 1.12

スパムの削除

MySQLで一括で削除する。
が、なんとなく怖いので、ゴミ箱行きに留める。

DB名は wp-config.php で設定しているもの。
テーブル wp_comments がコメントのテーブル。これを操作する。
(デフォルトの場合。接頭辞を変えている場合は 接頭辞 + _comments がテーブル名。)
このテーブルのカラム comment_approved はいまいちドキュメントが見つからないが、以下のようになっているようだ。

  • 0
    承認待ち
  • 1
    承認済み
  • spam
    スパムとしてマーク
  • trash
    ゴミ箱に入れる

まずシェルで以下のコマンド。

$ mysql -u <USER_NAME> -p

パスワードを入れてMySQLログイン。

-- DB一覧
show databases;

-- DB選択(`wp-config.php` で設定しているもの)
use <DATABASE_NAME>;

-- 特定IPアドレス `XXX.XXX.XXX.0/24` からのコメント数を確認
select count(1) from wp_comments where comment_author_IP LIKE 'XXX.XXX.XXX.%';

-- 特定IPアドレス `XXX.XXX.XXX.0/24` からのコメントをゴミ箱に入れる
update wp_comments SET comment_approved='trash' where comment_author_IP LIKE 'XXX.XXX.XXX.%';

-- 問題なければコミット
commit;

これで指定IPアドレスからのコメントがすべてゴミ箱に入ったはず。
あとはゴミ箱を空にするなりなんなりすればいい。

指定IPアドレスからのアクセスを拒否

nginxの設定で拒否する。
設定ファイル(サーバの設定を自分でいろいろ書いているはず。たとえば /etc/nginx/conf.d/default.conf)に

server {

のような記述があるので、ここにIPアドレスの拒否設定を書く。

server {
    deny XXX.XXX.XXX.0/24;

みたいな感じ。
(ただ、他のサイトを見ているとserverブロックで書いているところはない。locationブロックで書いている。別にどっちでもいいようだが。)

このあとnginxの設定ファイルをチェックし、nginx再起動。

# 設定ファイルの文法チェック
# nginx -t

# 上でsyntax is okみたいに出たら下を実行。出なければ設定ファイル見直し
# systemctl restart nginx.service

これでもうこのIPアドレスからはアクセスできなくなる。

deny <IP_ADDRESS> はそのIPアドレスからのアクセスを拒否し、
allow <IP_ADDRESS> はそのIPアドレスからのアクセスを許可する。
どっちも書く場合は順番が重要だが、今回は拒否だけなので deny だけ書いておけばいい。

参考

WordPress

nginx

Windows10更新したら画面真っ黒になってgrub rescueが出た

Windows10を更新したらgrubで起動しなくなった件。なんかよくわからんが、Windowsが勝手にパーティション切ったらしい。

grub rescue出現

自作PCはUbuntuとWindows10のデュアルブートで、今回Windows10を起動しようとしたらログイン前に更新し始めたので待った。この更新は結構長かったので、Anniversary Updateというやつだったのかもしれない。とにかくこの更新中に何回か再起動するのだが、再起動するとブートローダのgrubがおかしくなっていた。いつもは紫色の画面(Ubuntuで入れたから)になって起動するOSを選択させてくれるのに、真っ黒な画面でgrub rescue>という味も素っ気もないプロンプトを出すようになった。exitquitshutdownも、補完すら利かないパンクなシェル。

起動方法(その場しのぎ)

grubのシェルはほとんどいじったことがない(いじりたくない)ので焦った。調べるとWindows10の更新でこうなる人は多いようで、情報はそれなりにあった。ありがたい。
結局対処法は簡単で

ls

とやって出たパーティションたちのどれにbootがあるか、一つ一つ調べていけばいい。例えば(hd0,msdos3)がbootを持つか調べたいときは

ls (hd0,msdos3)/boot

みたいな感じだ。これでなにやらごちゃごちゃ出るものがbootのあるパーティション。補完ができないので面倒なこと甚だしいが、やるしかない。
(ただし、人によってはこのコマンドで何も出てこないこともあるようだ。そのときはLiveUSBとか作ってLinuxを起動して調べないといけないっぽい。)

さてbootのあるパーティション(ここでは(hd0,msdos3)とする)が見つかったら、grubがそこを見るようにすればいい。これはsetというコマンドがあり、引数なしで入力すると現在の値が見れる。今回大事なのはprefixで

set prefix=(hd0,msdos3)/boot/grub

のようにして設定できる。これでgrubに正しいブート位置を教えることができた。あとは

insmod normal
normal

と打って、grubをノーマルモードにする。これでいつものgrubの画面に戻る。そしてOS選択して、ちゃんと起動できるようになる。

修正方法

上の方法でやっても、次回起動時にはまた同じことが起きる。setしてもgrubの設定はその1回限り変わるだけだからだ。設定を恒久的に変えるにはgrubの設定ファイルを更新し、インストールし直さないといけない。grubの設定ファイルは/boot/grub/grub.cfgで、たしかにファイル内にはhd0がどうこうという部分があり、ここでbootを指定しているようだ。だがファイルの冒頭に”DO NOT EDIT THIS FILE”と素敵なことが書いてある。このファイルは直接編集するものではなく、/etc/default/grubから生成するものだからだ。実は今回は何も編集しなくていい。

# update-grub

とすれば勝手にbootがどこにあるか探して、/boot/grub/grub.cfgを適切に変更してくれる。あとは

# grub-install /dev/sda

でその設定が反映される。/dev/sdaのところはブートローダを入れたいストレージを入れる。(lsblkとかgpartedとかで調べられる。)

なお、update-grubがないディストリビューションもある。そもそもupdate-grubは特別なものではなく、

$ cat $(which update-grub)

とすれば

#!/bin/sh
set -e
exec grub-mkconfig -o /boot/grub/grub.cfg "$@"

となり、grub-mkconfigしているだけだとわかる。なのでそうすればいいんじゃないかな……実際に試してないのでよくわからん。

参考

windows10アップデートでデュアルブートマシンが起動不能になった話
boot – Windows 10 upgrade lead into grub rescue – Ask Ubuntu

XPS13 (9343)にArchLinuxをインストールする –ISOイメージ作成編–

2015年の春に買ったNew XPS13 (9343)(もうNewでも何でもない)にWindows10をクリーンインストールした。そのときついでにArchLinuxをインストールし直したので、そのときのメモ。
作業直後に書くつもりだったが大分時間が経ってしまったため、怪しいところがあるかもしれない。
本当はインストール作業まで全部書く予定だったが、力尽きたので続きはまたいつか書く。

要点

  • 通常のArchLinuxのISOイメージにはXPS13用の無線LANアダプタのドライバが入ってないので、このISOではインストールが難しい
  • 必要なドライバは broadcom-wl-dkms
  • ArchLinuxのISOイメージは Archiso でカスタマイズできる

ArchLinuxをインストールしたPCを用意する

何を言っているのかわからないかもしれないが、XPS13にArchLinuxをインストールするためには、ArchLinuxをインストールしたPCが必要。なぜなら通常のArchLinuxのISOイメージにはXPS13の無線LANのドライバが入っていないため(ここ参照)、そのままインストールしようとしてもネットに接続できず詰む。 broadcom-wl-dkmsというドライバを含むようカスタマイズしたISOイメージを作る作業をしなければならない。
ただし、XPS13の内蔵無線LANアダプタを使わずに、たとえばUSB接続の有線LANアダプタを使う場合などはこの作業は必要ないはず。そのときもドライバなかったら詰む。
なお、PCを別に用意しなくとも、XPS13のWindowsでArchLinuxの仮想マシンを作って以下の作業をしてもいい。

ArchLinuxのISOイメージを作成する

普通はArchLinuxのダウンロードサイト一覧からISOイメージを持ってきて、USBメモリに dd すればいい。
そのはずなのにドライバが足りてないため、以下のようになる。ここに感謝。

  1. Archisoの環境作り

    これはArchLinuxのISOイメージを自作するためのツール。以下では ~/archlive 以下に作業ディレクトリを作ることにする。

    sudo pacman -S archiso
    mkdir ~/archlive
    sudo cp -r /usr/share/archiso/configs/releng ~/archlive
    cd ~/archlive/releng
    
  2. yaourtを使うための設定

    broadcom-wl-dkmsはAURというリポジトリにある。AURにあるパッケージはyaourtというツールを使うと操作しやすい。

    まず ~/archlive/releng/pacman.conf の最後に以下を追記して archlinuxfr リポジトリを使えるようにする。

    [archlinuxfr]
    SigLevel = Never
    Server = http://repo.archlinux.fr/$arch
    

    そして ~/archlive/releng/package.both の最後に以下を追記。

    yaourt
    
  3. broadcom-wl-dkms のための設定

    上で編集した ~/archlive/releng/package.both にさらに以下を追記。これでbroadcom-wl-dkmsをビルドする環境が整う。

    linux-headers
    dkms
    fakeroot
    

    さてここから詰まった。2015年にArchlinuxを入れたときは ~/archlive/releng/airootfs/root/customize_airootfs.sh

    sudo -u arch yaourt --noconfirm -S broadcom-wl-dkms
    

    を追記すれば問題なくビルドできた(…はず)。これをする理由は、yaourtはrootでは実行できないため。sudoでarchというユーザに切り替えてyaourtを実行し、broadcom-wl-dkmsをインストールしているわけ。ところがなぜか今回はarchというユーザがいなくなっていたようだ。
    仕方ないので、あまりうまくないやり方だが他に思いつかないので次のようにやる。 ~/archlive/releng/airootfs/root/customize_airootfs.sh の最後に追記する内容を以下のように変える。

    useradd arch # archユーザを追加
    echo "root:hoge" | chpasswd # こうすればrootのパスワードをhogeに変えられる
    sudo -u arch yaourt --noconfirm -S broadcom-wl-dkms
    

    ここではarchというユーザを追加したが、既にシステムに存在するユーザでないなら何でもいい。パスワードを上のように切り替える方法はここで知った。

  4. ビルド

    cd ~/archlive/releng
    sudo ./build.sh -v
    

    ビルドの際にrootのパスワードを聞かれるので、上で設定した通りhogeと入れる。そうすれば実行ユーザが一般ユーザarchに切り替わり、yaourtが進む。

    1回のビルドでうまくいかずやり直すときは

    sudo rm -v ~/archlive/releng/work/build_make_*
    

    でリセットしてからまたビルドする。

    ビルドすればISOイメージが ~/archlive/releng/out/ 下にできているはず。

  5. USBメモリにISOイメージを書き込む

    ここに書いてある通り。
    lsblk でデバイス一覧が見れるので、どのデバイスファイルがUSBメモリなのかを 注意深く確認するここで不適切なデバイスファイルを指定すると重要なデータを意図せず消してしまう恐れがあるので気を付ける 。 もしマウントしているようなら umount でアンマウントしておく。
    /dev/sdx がUSBメモリだとして

    sudo dd bs=4M if=~/archlive/releng/out/archlinux-2016.09.11-dual.iso of=/dev/sdx
    

    のようにやればいい。ファイル名は例。

参考