WordPressサイトのセキュリティチェック

WPScanをGCP上に新規でビルドしたCentOS7で実行してみました。

環境作成

以下、root権限で作業します。

sudo su -
cd ~
yum -y update
yum -y install gcc openssl-devel readline-devel libxml2 libxml2-devel libxslt libxslt-devel libcurl-devel patch git bzip2
yum remove ruby
mkdir -p ~/tools
cd ~/tools
git clone https://github.com/wpscanteam/wpscan.git
cd ~
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH=$HOME/.rbenv/bin:$PATH' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
cd ~/.rbenv/plugins/ruby-build
./install.sh
cd ~
RUBYVER=`cat /root/tools/wpscan/.ruby-version`
rbenv install $RUBYVER
rbenv rehash
rbenv global $RUBYVER
rbenv local $RUBYVER
cd ~/tools/wpscan
gem install bundler && bundle install --without test
gem install wpscan
wpscan --update

実行

cd ~/tools/wpscan
wpscan --url ご自分のサイトのURL

 

GCPにて国単位でIPアドレスを弾く方法

GCPの無料枠を使う場合、特定国のIPアドレスを弾く必要があるようです。
元ネタはこちらになります→Google Cloud Platformで中国からの通信をブロック
フィルタ登録時の手打ちが面倒だったので、半自動にしてみました。

前提条件

  • 今回はwsl上での作業です
  • Google Cloud Functionsの環境が出来ていること
  • 次のファイルがカレントフォルダに置かれていること
    https://ipv4.fetus.jp/cn.txt
  • 時々リストを更新する必要があると思いますが、今回はそこまで考慮していません

手順

  1. 次のやっつけスクリプトをカレントフォルダに置きます
    #!/bin/bash
    #
    # CONST_PROJECT に、ご自分のプロジェクト名を入れて下さい。
    # カレントディレクトリに https://ipv4.fetus.jp/cn.txt を置いて下さい。
    # 出来上がった china_block_xx.txt を、cloud shell に投げ込んで下さい。
    #
    # wslからcloud shellを起動する自分メモ
    #   gcloud alpha cloud-shell ssh
    # vimで流し込む場合は(貼り付け前に次のコマンドで)
    # インデントを無効にしておいた方が良いと思います
    #   :set paste
    #
    CONST_PROJECT="MyProject"
    CONST_INPUTFILE="cn.txt"
    counterNo=1
    lineNo=0
    ruleNo=1
    ruleStr="000"
    FileNo=0
    fileStr="00"
    outputFile="foobar.txt"
    itemsCounter=0
    readData=""
    workFile="puyopuyo.txt"
    # curl https://ipv4.fetus.jp/cn.txt
    
    if [ ! -f $CONST_INPUTFILE ]; then
      echo "Input file not found..."
      exit 1
    fi
    
    workFile=$(mktemp "china-block.tmp.XXXXXX")
    sed '1,6d' $CONST_INPUTFILE > $workFile
    itemsCounter=`wc -l $workFile | cut -d " " -f 1`
    
    cat $workFile | while read readData
    do
      if [ $(($counterNo % 2500)) -eq 1 ]; then
        fileNo=`expr $fileNo + 1`;
        fileStr=`seq -f %02g $fileNo $fileNo`
        outputFile="china_block_$fileStr.txt"
        echo "File $outputFile"
      fi
      if [ $lineNo -eq 0 ]; then
        ruleStr=`seq -f %03g $ruleNo $ruleNo`
        echo "gcloud compute --project=$CONST_PROJECT firewall-rules create china-block-$ruleStr --description=\\中\\華\\圏\\のIP\\を\\弾\\く --direction=INGRESS --priority=10 --network=default --action=DENY --rules=all --source-ranges=\\" >> $outputFile
        lineNo=`expr $lineNo + 1`
        echo -n "Rule $ruleStr:"
      fi
      echo -n "$readData" >> $outputFile
      if [ $counterNo -eq $itemsCounter ]; then
        echo "" >> $outputFile
        echo ""
      else
        if [ $(($counterNo % 250)) -ne 0 ]; then
          if [ $(($counterNo % 5)) -eq 0 ]; then
            echo ",\\" >> $outputFile
            lineNo=`expr $lineNo + 1`
          else
            echo -n "," >> $outputFile
          fi
          echo -n "."
        else
          echo "" >> $outputFile
          echo ""
          lineNo=0
          ruleNo=`expr $ruleNo + 1`
        fi
      fi
      counterNo=`expr $counterNo + 1`
    done
    rm -f $workFile
    exit 0
  2. スクリプトのCONST_PROJECTの内容を、自分のプロジェクト名に差し替えます
  3. wsl上でスクリプトをキックすると、china_block_xx.txtなるファイルが出来上がります
  4. cloud shellを起動します
    gcloud alpha cloud-shell ssh
  5. 出来上がったchina_block_xx.txtを、cloud shellに投げ込みます
    ※一度に全部流し込んだらGCP側でリソース不足になったので、出力を分割しました
    vimで流し込む場合は、貼り付け前に

    :set paste

    にてインデントを無効にしておいた方が良いと思います。
  6. GCPの 『VPCネットワーク』→『ファイアウォールルール』にて、結果を確認します

超高速WordPress KUSANAGI

KUSANAGIとは、プライム・ストラテジー株式会社さんが開発・構成する、WordPressを高速に動作させるための仮想マシンおよびそのイメージです。

公式ページは https://kusanagi.tokyo/ です。

GCPとAWSと手元のDockerDesktop上で試しにデプロイしてみましたが、手順書に従ってあっさり立ち上げることができました。

速度は…信じられないくらい速いです。一桁msで動作しています。

様々なプラットフォーム上で動くようなので、お使いのインフラが対応しているときは、試してみては如何でしょうか?(AWSやGCPの無料枠で…、というのもアリかも知れませんね)。


このサイトもKUSANAGIにしてみました。

表示速度が上がったのではないかと思います。

乗り換えの手順や、一部嵌まった場所など、あとでポストします。

GCPのUbuntuでsshguardを有効にしてみる

GCP(Google Cloud Platform)で建ててみたサーバのsshへのアタックがかなり多いので(普通はsshのポート番号を変えておくのだと思いますが)sshguardとufwを連携してみます。

失敗したときシリアルコンソールで繋げられるように、パスワード付きのアカウントを一つ用意しておいて下さい(ユーザ名『ubuntu』のパスワードを変更でも良いかも)。

設定でちょっと嵌まったので、自分用にチラ裏。

# ufw自動起動設定
systemctl enable ufw
# ufw起動
ufw enable
# SSHを許可する例
ufw allow from 0.0.0.0/0 to any port ssh
# httpを許可する例
ufw allow from 0.0.0.0/0 to any port http
# GCPのヘルスチェッカーを許可
ufw allow from 169.254.169.254/32 to any
# ポリシー読み込み
ufw reload

# sshguardの設定(ちょっぴり厳しくしてみる)
vi /etc/default/sshguard
# 15行目
ARGS="-a 30 -p 420 -s 3600"
systemctl restart sshguard

念のため再起動して動作を確認して下さい。

# これらで確認してみる
tail -f /var/log/auth.log
systemctl status ufw
systemctl status sshguard
iptables -vL ufw-user-input
iptables -vL sshguard

設定に失敗してufwやsshguardがコケている時もありますので…。

GCP上にDNSゾーンを一括処理で作ってみる

  • 緊急にDNSサーバを立ち上げなければならない場合を想定して作成しました
  • 『事前準備』と『作業環境構築』は(やっておいて損は無いので)事前に準備しておいて下さい
  • 『ゾーン作成』以降がイベント発生時の作業となります
  • CLIで流し込む方法を主に書いてあります
  • 2019/04時点での手順書です
  • whoisの更新は自由に出来るものとします

事前準備

Googleアカウントを作成します。

GCPコンソールにログインし、プロジェクトだけ作成しておいて下さい。

このテキストでは『my_zone』とします。

作業環境構築

WindowsPCを想定しています。

Node.jsやPythonを入れるのが面倒環境依存を排除するため、WSLで作成します。

ゾーン作成

GUIから可です。

CLIの場合は、(外部公開/非公開設定がbetaのみのため)betaコマンドで作成します。

gcloud beta dns managed-zones create --dns-name="my_domain." --visibility=public --description=my_zone my_zone
# ドメイン名
#   my_domain
# 外部公開
#   する
# ゾーン名
#   my_zone

ゾーン内容のフラッシュ

# 一括削除はCLIから行います
touch empty-file
gcloud dns record-sets import -z my_zone --delete-all-existing empty-file

ゾーンの削除

# ゾーンをクリアしてから削除します
touch empty-file
gcloud dns record-sets import -z my_zone --delete-all-existing empty-file
gcloud dns managed-zones delete my_zone

レコード一括追加

gcloud dns record-sets transaction start   -z=my_zone
gcloud dns record-sets transaction add     -z=my_zone --name="ns1.my_domain."  --type=A     --ttl=300 "192.168.0.1"
gcloud dns record-sets transaction add     -z=my_zone --name="ns2.my_domain."  --type=A     --ttl=300 "192.168.0.2"
gcloud dns record-sets transaction add     -z=my_zone --name="www.my_domain."  --type=A     --ttl=300 "192.168.0.3"
gcloud dns record-sets transaction add     -z=my_zone --name="mx1.my_domain."  --type=A     --ttl=300 "192.168.0.4"
gcloud dns record-sets transaction add     -z=my_zone --name="mx2.my_domain."  --type=A     --ttl=300 "192.168.0.5"
gcloud dns record-sets transaction add     -z=my_zone --name="test.my_domain." --type=CNAME --ttl=300 "www.my_domain."
gcloud dns record-sets transaction add     -z=my_zone --name="my_domain."      --type=MX    --ttl=300 "10 mx1.my_domain." "100 mx2.my_domain."
gcloud dns record-sets transaction execute -z=my_zone

レコード一括追加中断

# 一括処理中にエラーが出たり誤りを見付けた時
# 一旦中断しないと以後の作業に差し支えが出ます
gcloud dns record-sets transaction abort -z=my_zone