概要
- 小さな範囲で使用するWebサイトを簡単にHTTPS化する場合、HTTPS-PORTALは簡単、便利です
- インターネットに公開する場合、公開したサイトにアクセスできる国を限定しておきたい場合があると思います
- 今回はHTTPS-PORTALを使って公開したサイトを国別に限定する方法を試してみたいと思います
原理
HTTPS-PORTALにはアクセス制限機能があります。
この機能は環境変数「ACCESS_RESTRICTION」に許可するIPアドレスを指定する事で、それ以外のアドレスからのアクセスを排除する事ができるというものです。
問題は日本国に割り付けられるIPアドレスは定期的に変化しているため、
制限対象として指定するIPアドレスも定期的に変化させる必用がります。
実は、HTTPS-PORTALには動的に設定を変更する方法があります。
これは、HTTPS-PORTAL内部の指定されたパス/var/lib/https-portal/dynamic-env
に存在する環境変数名のファイル内容を定期的にチェックしてシステムの設定に反映してくれるというものです。
つまり、HTTPS-PORTAL内部の
/var/lib/https-portal/dynamic-env
に
ACCESS_RESTRICTION
というファイル作成して、その中に接続するIPアドレスを記述し、そのファイルを定期的に更新していけば良いという事です。
1.2.3.4/24 4.3.2.1
日本国のIPアドレス情報
IPアドレス情報はipv4.fetus.jpを参考とさせていただきます。
ここのサイトから毎日のIPv4割り付け情報を取得する事が出来ます。
まず始めに自動化されたアクセスについてを確認しましょう。
特に重要なポイントとして接続元が分かるようにしてほしいのと事です。
これは、高負荷など何らかの対応をお願いする可能性があるからとの事です。
以下スクリプトでは、-A
でユーザーエージェントを指定して接続元を明記していますのでご自分の設定に合わせてください。
このスクリプトはdockerのホスト側でクーロン駆動する事を想定しています。
#!/bin/bash
# ダウンロードするファイルのURL
url="https://ipv4.fetus.jp/jp.txt"
# 引数から出力ディレクトリとファイル名を取得、もしくはデフォルト値を使用
output_dir=${1:-"/hoge/docker-path/dynamic-env"}
output_file_name=${2:-"ACCESS_RESTRICTION"}
# 出力パスの組み立て
output_file="${output_dir}/${output_file_name}"
# 一時ディレクトリを作成(mktempを使用)
temp_dir=$(mktemp -d /tmp/my_temp_dir.XXXXXX)
# 一時ディレクトリ内の一時ファイル名
temp_file="$temp_dir/original_file.txt"
# curlを使用してファイルをダウンロード
curl -o $temp_file $url -A examplebot (contact@example.com)
# '#'を削除して新しいファイルに書き出す
sed '/^#/d' $temp_file > "$temp_dir/$output_file_name"
#改行はスペースに変換する
sed -i ':a;N;$!ba;s/\n/ /g' "$temp_dir/$output_file_name"
# 処理後のファイルを最終的な場所に移動
mv "$temp_dir/$output_file_name" "$output_file"
# 一時ディレクトリを削除
rm -r $temp_dir
echo "ファイルが処理され、${output_file}に書き出されました。一時ディレクトリは削除されました。"
スクリプトが作成出来たら、クーロンに登録します。
ipv4.fetus.jpの情報更新か1日1回との事なので、スクリプトの更新も1日1回で良いです。
また、0時頃は接続が集中するとの事ですので、適当に散らしましょう。
0 3 * * * /bin/bash /*** path ***/update_ip_filter.sh
最後に生成結果をdocker環境に対してマウントします。
設定例は以下となります。
#HTTP-Potal用の設定
services:
https-portal:
・・・ いろいろ ・・・
volumes:
# IPアドレス制限用
- ./dynamic-env:/var/lib/https-portal/dynamic-env