GDPR 対策最終奥義「遮断」

スポンサーリンク

 2018/05/25 に施行された GDPR の対策を 8 月に入ってから取り組みはじめて WordPress に Cookie 使用の同意を得る為のプラグインを入れてみた。
 それに付随為にはサーバーサイドでの調整も必要だったりで何だかんだととにかく面倒臭かった。
 対策完了後には Google Analytics のトラッキングが殆どされないのでアクセス解析の意味が無くなってしまったりで PV 数を眺めてモチベーションを保つことが出来なくなってしまった。
 別にサーバー側で AWStats も入れてるのでアクセス解析はしているのだが、なんせ世間では PV 数と言えば Google Analytics の数値が信用度としては高い。

 よって Google Analytics を使いたい。だけど現状の対策では駄目だ。じゃぁどうしたら!!?

 で、EU 加盟 28 ヶ国からのアクセスが無ければいいんじゃん! という考えは当初よりあった物の実行に移すこととなった。

Nginx で国別のアクセス制御を行う

 アクセスしてきた IP アドレスを元にそれがどの国であるか判別したい場合、GeoIP2 を用いるのが現状では最も楽かなと思われるのでこれを採用する。
 筆者運用のサーバーは CentOS 7 となっているので、この OS 上での作業例となる。

GeoIP2 のデータベース取得

 GeoIP2 のデータベース取得の為に面倒臭い事が好きな方は先程書いた次の記事を参照していただければと。

GeoIP2 に対応した geoipupdate コマンドを面倒臭くビルドする。
geoipupdate をビルドする理由  GeoIP は MaxMind 社が提供する IP アドレスを元に地理情報を取得する為のサービ...

 面倒な事が嫌だという方は次のコマンドで済ませてしまう。

sudo yum install epel-release
sudo yum --enablerepo=epel install geolite2-city geolite2-country

 これで GeoIP2 のデータベースは

/usr/share/GeoIP/GeoLite2-City.mmdb
/usr/share/GeoIP/GeoLite2-Country.mmdb

 のようにインストールされるのでこれを Nginx で参照する。

Nginx に GeoIP2 対応モジュールを導入する

 Nginx は標準で GeoIP2 に対応していないので、サードパーティーモジュールを導入する必要がある。
 ソースからビルドしているが、作業ディレクトリ構成は筆者例とする。
 Nginx のソースは 2018/09/02 現在、1.15.3 が最新となっているのでこれを利用している。

sudo yum install libmaxminddb libmaxminddb-devel
mkdir -p ~/src/nginx_modules
cd !$
git clone https://github.com/leev/ngx_http_geoip2_module.git
cd ~/src
wget https://nginx.org/download/nginx-1.15.3.tar.gz
tar xzvf nginx-1.15.3.tar.gz
cd nginx-1.15.3

 ngx_http_geoip2_module は libmaxminddb を必要とするので yum でインストールしておく。
 Nginx のモジュールソースを突っ込んでおく nginx_modules とディレクトリ掘って移動。git clone してソースを頂く。
 作業ディレクトリに戻って Nginx のソースをダウンロードして展開。ソースのディレクトリへ移動する。
 
 そして Nginx の configure に –add-module=../nginx_modules/ngx_http_geoip2_module を追加する事。これでスタティックにモジュールが追加出来る。

 筆者ビルド例として一部本記事に関係無いオプションを省いた物を次に示す。適用モジュールはパッケージ版と大体同じ。

./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-threads --with-stream --with-stream_ssl_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-http_v2_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=native' --add-module=../nginx_modules/ngx_http_geoip2_module --with-openssl=../openssl-1.1.0i
make && sudo make install

Nginx で GeoIP2 の設定を行う

 次に Nginx の設定例を示す。ほとんど中略という感じで GeoIP2 に関する要所だけを記載している。”..” は中略ということで受けとって欲しい。
 説明はコメントの形で入れ込んでみる。

http {
..
..
..
    # 使用する GeoIP2 データベースファイルの指定を行う
    geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
                    # $geoip2_data_country_code には 2 文字からなる国コードが入る。デフォルトを日本とした。
                    # プライベートアドレスからのアクセス時にはデフォルトで JP が入るので別途制御が不要になる。
                    $geoip2_data_country_code default=JP country iso_code;
                    # 実際には使用していないが $geoip2_data_country_name には国名を英語でセットするようにした。
                    $geoip2_data_country_name country names en;
    }
    
    # $geoip2_data_country_code を元に $ignore_country という変数をセットする。
    # $geoip2_data_country_code の内容が各行最初の 2 文字にマッチした場合、スペース右の値をセットする。
    # 適用する国別コードは EU 加盟 28 ヶ国。
    map $geoip2_data_country_code $ignore_country {
            default 0;
            AT 1;
            BE 1;
            BG 1;
            HR 1;
            CY 1;
            CZ 1;
            DK 1;
            EE 1;
            FI 1;
            FR 1;
            DE 1;
            GR 1;
            HU 1;
            IE 1;
            IT 1;
            LV 1;
            LT 1;
            LU 1;
            MT 1;
            NL 1;
            PL 1;
            PT 1;
            RO 1;
            SK 1;
            SI 1;
            ES 1;
            SE 1;
            GB 1;
    }
..
..
..
    server {
..
..
..
    # server ブロック内の任意の位置に次の 3 行をいれることで $ignore_country が 0 以外の時、
    # ステータスコード 403 を返すようにする事でアクセスを禁止する。
    if ( $ignore_country ) {
        return 403;
    }
..
..
..
    }
}

 実際にこの設定を検証環境でテストを行うにもアクセス元は全部プライベート IP アドレスからになってしまうので、初期動作確認が終わってしまったら本番に適用しつつ、log_format ディレクティブでフォーマットの末尾あたりにでも $geoip2_data_country_code を入れておくとアクセスログを tail -f するなりして動作確認がやりやすい。

その後の作業

 WordPress にて GDPR 対策として導入していた Cookie Notice for GDPR というプラグインを停止。
 Google Analytics のトラッキングをページアクセスした時点で開始するという GDPR 対策前の状態に戻した
 「Cookie 使用同意を得たというフラグに用いられていた Cookie」を元に Nginx のキャッシュ制御をしていた部分も撤廃し、さらにキャッシュをパージする WordPress のプラグインも初期状態に戻してあげた。

 Nginx の動作もキャッシュ周りはシンプルに。アクセス制御はより柔軟性を持つという結果に終わった。

 長かった GDPR 対策も対象国からのアクセスを禁止するということで、これが最後の対策となるのかな。
 まぁあちらに居住をもつ方が日本に来てアクセスしてきて何か言ってきたらどうしようかなーなんてそれは深く考えすぎかなと思いたい。

スポンサーリンク