unmask

install

OS × HTTP server を選ぶと、具体的な yum / apt / apk コマンドと Web 設定スニペットが表示されます。

0 モード選択 (速度重視か互換重視か)

カードをクリックすると下のドロップダウンが連動します。

nginx native module

  • 一度認証を通った訪問者は素の nginx と同等の速度 (短期間だけ有効な通過証 cookie をサーバー側で検証するだけ)
  • 1 リクエストあたり ~0.05 ms (同じプロセス内で cookie を検証。サブリクエストなし / IPC なし)
  • ✓ rate_limit / honeypot パスも nginx 上で完結
  • nginx 専用 (Apache では使えず、その場合は forward-auth mode へ)
→ クリックで「nginx · native module」を選択

forward-auth mode

  • nginx / Apache 対応
  • distro 標準の HTTP server をそのまま流用 (nginx は素のまま / Apache は mod_lua)
  • △ 1 リクエストあたり ~0.5〜2 ms (サブリクエスト経由)
→ クリックで「nginx · forward-auth」を選択 (Apache はドロップダウンで切替)

1 環境選択

上の OS リストは CI で 検証済みです。派生 distro (openSUSE / Mint / Pop!_OS 等) の互換情報や全体の対応マトリクスは 対応 distro 一覧 を参照してください。

2 unmask 本体をインストール ?リポジトリ方式: まず unmask-release を 1 回インストールしてリポジトリ設定と GPG 公開鍵を入れる。以降は dnf install unmask / apt install unmask で本体をインストール / アップグレードできる。署名検証はパッケージマネージャーが自動で行う。

インストール直後: admin が systemd 経由で自動起動し (127.0.0.1:9477)、/etc/unmask/.setup-token を出力する。セットアップウィザードは section 4 で起動する。

アップグレード: sudo dnf upgrade unmask && sudo systemctl restart unmask (deb は sudo apt upgrade unmask)。

sudo dnf install -y https://unmask.sh/dl/rpm/unmask-release-latest.noarch.rpm
sudo dnf install -y unmask
sudo yum install -y https://unmask.sh/dl/rpm/unmask-release-latest.noarch.rpm
sudo yum install -y unmask
sudo yum install -y https://unmask.sh/dl/rpm/unmask-release-latest.noarch.rpm
sudo yum install -y unmask
wget https://unmask.sh/dl/deb/unmask-release-latest.deb
sudo apt install -y ./unmask-release-latest.deb
sudo apt update && sudo apt install -y unmask
wget https://unmask.sh/dl/apk/unmask-release-latest.apk
sudo apk add --allow-untrusted ./unmask-release-latest.apk
sudo apk update && sudo apk add unmask

3 unmask-plugin-nginx (native plugin) をインストール ?前提: nginx は事前にインストールしておきます (section 4 で unmask-web-nginx を入れる際に、依存解決で自動的にインストールもされます)。

postinstall: load_module を distro 慣例のディレクトリ (/usr/share/nginx/modules/ または /etc/nginx/modules-enabled/) に自動で配置します。 14 種類の nginx バージョン × OpenSSL 1.0 / 1.1 / 3 の全 ABI 分の .so を同梱 (1.10 ~ 1.30 系 / glibc) しているため、ホストの nginx のパッチレベルに合ったモジュールを自動で選びます。手動での編集は不要です。

nginx をアップグレードした場合: ABI 不一致で nginx -t がエラーになるので、sudo dnf upgrade unmask-plugin-nginx (deb は sudo apt install --only-upgrade unmask-plugin-nginx) で同じバージョンに揃えます。

sudo dnf install -y unmask-plugin-nginx
sudo yum install -y unmask-plugin-nginx
sudo yum install -y unmask-plugin-nginx
sudo apt install -y unmask-plugin-nginx
sudo apk add unmask-plugin-nginx
CentOS 7 / RHEL 7: nginx は OS 標準 (base) リポジトリに含まれないので、先に EPEL からインストールしてください。
sudo yum install -y epel-release
sudo yum install -y nginx
CentOS 6 / RHEL 6: nginx は base にはありませんが、EPEL に 1.10.3 があります (fat plugin に同梱された最古の ABI と一致)。より新しい nginx が欲しい場合は nginx.org の HTTP リポジトリ (1.18.0) も使えます。下記のどちらか一方を実行してください。
# A. EPEL 経由 (nginx 1.10.3 / OS ecosystem 内. 推奨)
sudo rpm -Uvh http://archive.kernel.org/centos-vault/6.10/extras/x86_64/Packages/epel-release-6-8.noarch.rpm
sudo yum install -y nginx
# B. nginx.org HTTP repo (nginx 1.18.0 / より新しめ)
sudo tee /etc/yum.repos.d/nginx.repo <<'EOF'
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/x86_64/
gpgcheck=0
enabled=1
EOF
sudo yum install -y nginx

4 unmask-web-nginx (Web 連携スニペット) をインストール ?postinstall が /etc/unmask/forward-auth/{server,protect}.inc と upstream のシンボリックリンクを配置し、nginx -t で検証してからセットアップトークンと URL を表示します。動作中の nginx には触りません — ウィザードの URL は、この後ご自身で行う再起動のあとに開けるようになります。

JA4 maps の include は完全に自動: postinstall が /etc/nginx/conf.d/00-unmask.conf から /var/lib/unmask/nginx/http.inc へのシンボリックリンクを配置します。どの distro でも標準で書かれている include /etc/nginx/conf.d/*.conf; によって自動で読み込まれるため、http {} block の編集は不要です。

sudo dnf install -y unmask-web-nginx
sudo yum install -y unmask-web-nginx
sudo yum install -y unmask-web-nginx
sudo apt install -y unmask-web-nginx
sudo apk add unmask-web-nginx
セットアップウィザードを開く 3 つの経路 — ご自身の環境に合うものを 1 つ選んで /unmask/admin/setup/ を開く。
  1. [Recommended] 既存 vhost に 1 行追加 — 普段使っているドメインでセットアップウィザードを開く。対象の server { } block 内に 青色の 1 行を追加:
    server {
        listen 443 ssl http2;
        server_name example.com;
        ssl_certificate ...;
    
        include /var/lib/unmask/nginx/server.inc;   # ← unmask 本体 (challenge 配信・BAN・管理画面)
    
        root /var/www/example;
    }
    sudo nginx -t && sudo systemctl restart nginx (インストール直後のモジュール読み込みは reload ではなく restart) → https://<your-domain>/unmask/admin/setup/ を開く。
  2. [Direct port]同じホスト内なら何も変更不要: そのまま http://127.0.0.1:9477/unmask/admin/setup/ にアクセスできる。 LAN 内の別のホスト (開発用 PC など) から見たい場合のみ /etc/unmask/config.ymlserver.bind0.0.0.0:9477 に変更し、sudo systemctl restart unmask を実行してから http://<your-server>:9477/unmask/admin/setup/ を開く。 公開ホストでは非推奨 (9477 が平文で、セットアップトークンが露出するリスク)。
  3. [SSH tunnel] — ファイアウォールを変更せずに使える万能なフォールバック。
    ssh -L 9477:127.0.0.1:9477 your-server -N &
    http://localhost:9477/unmask/admin/setup/ を開く。

セットアップウィザードに入ったら、順に:

  1. セットアップトークンを貼り付け — パッケージのインストール後に画面に表示されます。または sudo cat /etc/unmask/.setup-token
  2. 管理画面に login するための admin アカウントを作成 — ユーザー名とパスワード。以降はこのアカウントで管理画面に login します。
  3. DB を設定 — 既定の SQLite で十分です。必要なら MariaDB に切り替えます。
完了すると admin top へ自動で遷移します。残りの設定は /unmask/admin/settings/ から行えます。

5 保護したい server {} で challenge を発火 (ON/OFF スイッチ) ?このハイライト行が unmask の ON/OFF スイッチです。追加すれば bot 対策が発火し、外せば ブロック / challenge は即停止して、利用者の通信に影響しなくなります。アクセスログ経由の統計はどちらの状態でも流れ続けるので、「監視 (統計のみ) → 試運転 (1 つの location で発火) → 本番 (全域で発火)」と段階的に進める運用が安全です。

書くのは 2 行だけ: server { } 直下に include /var/lib/unmask/nginx/server.inc;、保護したい場所に include /var/lib/unmask/nginx/protect.inc;。それ以外 (rate-limit zone / challenge 振り分け / JA4 maps) は admin が /var/lib/unmask/nginx/ に生成し、section 4 の conf.d のシンボリックリンク経由で自動的に読み込まれます。

rate / burst / 適用パスは 設定 → rate-limit タブで設定します。admin UI を特定のドメインに限定したい場合は 設定 → ネットワーク → admin_allowed_hosts で設定します。

範囲:

対象の server {} block (既存 nginx vhost の .conf) に 青色 (ハイライト) の行を追加します。ハイライト以外はあなたの既存の設定です (例は reverse proxy。静的配信 (root + try_files) でも追加する行は同じ)。

既存の location を編集せず、この block を 1 つ追加するだけです。

server {
    listen 443 ssl http2;
    server_name example.com;
    ssl_certificate ...;

    include /var/lib/unmask/nginx/server.inc;   # ← unmask 本体 (challenge 配信・BAN・管理画面)
    include /var/lib/unmask/nginx/protect.inc;  # ← location 外 (全 location 対象)

    location / {                              # ← user の既存 location は無編集
        proxy_pass http://your-upstream;
    }
}

編集が終わったら設定を反映します。plugin のインストール後にまだ nginx を restart していない場合は restart します (reload では新しいモジュールを読み込めません)。以降の設定変更は reload で十分です:

sudo nginx -t && sudo systemctl restart nginx

2 unmask 本体をインストール ?リポジトリ方式: まず unmask-release を 1 回インストールしてリポジトリ設定と GPG 公開鍵を入れる。以降は dnf install unmask / apt install unmask で本体をインストール / アップグレードできる。署名検証はパッケージマネージャーが自動で行う。

sudo dnf install -y https://unmask.sh/dl/rpm/unmask-release-latest.noarch.rpm
sudo dnf install -y unmask
sudo yum install -y https://unmask.sh/dl/rpm/unmask-release-latest.noarch.rpm
sudo yum install -y unmask
sudo yum install -y https://unmask.sh/dl/rpm/unmask-release-latest.noarch.rpm
sudo yum install -y unmask
wget https://unmask.sh/dl/deb/unmask-release-latest.deb
sudo apt install -y ./unmask-release-latest.deb
sudo apt update && sudo apt install -y unmask
wget https://unmask.sh/dl/apk/unmask-release-latest.apk
sudo apk add --allow-untrusted ./unmask-release-latest.apk
sudo apk update && sudo apk add unmask

3 unmask-web-nginx (Web 連携スニペット) をインストール ?前提: nginx は事前にインストール済み (未インストールなら依存解決で自動的にインストールされます)。forward-auth mode は distro 同梱の nginx で OK。

postinstall: /etc/unmask/forward-auth/{server,protect}.inc と upstream のシンボリックリンクを配置し、nginx -t で検証してからセットアップトークンと URL を表示します。動作中の nginx には触りません — ウィザードの URL は、この後ご自身で行う reload のあとに開けるようになります。

sudo dnf install -y unmask-web-nginx
sudo yum install -y unmask-web-nginx
sudo yum install -y unmask-web-nginx
sudo apt install -y unmask-web-nginx
sudo apk add unmask-web-nginx
セットアップウィザードを開く 3 つの経路 — ご自身の環境に合うものを 1 つ選んで /unmask/admin/setup/ を開く。
  1. [Recommended] 既存 vhost に 1 行追加 — 普段使っているドメインでセットアップウィザードを開く。対象の server { } block 内に
    include /etc/unmask/forward-auth/server.inc;
    を 1 行追加し、sudo nginx -t && sudo nginx -s reload を実行してから https://<your-domain>/unmask/admin/setup/ を開く。
  2. [Direct port]同じホスト内なら何も変更不要: そのまま http://127.0.0.1:9477/unmask/admin/setup/ にアクセスできる。 LAN 内の別のホスト (開発用 PC など) から見たい場合のみ /etc/unmask/config.ymlserver.bind0.0.0.0:9477 に変更し、sudo systemctl restart unmask を実行してから http://<your-server>:9477/unmask/admin/setup/ を開く。 公開ホストでは非推奨 (9477 が平文で、セットアップトークンが露出するリスク)。
  3. [SSH tunnel] — ファイアウォールを変更せずに使える万能なフォールバック。
    ssh -L 9477:127.0.0.1:9477 your-server -N &
    http://localhost:9477/unmask/admin/setup/ を開く。
セットアップウィザードに入ったら、順に:
  1. セットアップトークンを貼り付け — インストール時の画面、または sudo cat /etc/unmask/.setup-token で表示されます。
  2. 管理画面に login するための admin アカウントを作成 — ユーザー名とパスワード。以降はこのアカウントで管理画面に login します。
  3. DB を設定 — 既定の SQLite で十分です。必要なら MariaDB に切り替えます。
完了すると自動的に admin top へ遷移します。

4 保護したい server {} で forward-auth を有効化 (ON/OFF スイッチ) ?この block 1 つが unmask の ON/OFF スイッチです。追加すれば bot 対策が作動し、外せば ブロック / challenge は即停止します。

ダッシュボード集計の経路: forward-auth mode では /_unmask/check サブリクエストが呼ばれたリクエストだけが kind/cnt 集計 (cookie 通過チャート) に乗ります。nginx-native mode の syslog 経路 (全リクエストをカウント) は使われないため、保護対象の location 外のリクエストはダッシュボードに出ません。全リクエストの集計が欲しい場合は nginx-native mode を選んでください。

範囲:

対象の server {} block (既存 nginx vhost の .conf) に 青色 (ハイライト) の行を追加します。ハイライト以外はあなたの既存の設定です (例は reverse proxy。静的配信 (root + try_files) でも追加する行は同じ)。

既存の location を編集せず、この block を 1 つ追加するだけです。

server {
    listen 443 ssl http2;
    server_name example.com;
    ssl_certificate ...;

    include /etc/unmask/forward-auth/server.inc;   # ← unmask 本体 (challenge 配信・BAN・管理画面)
    include /etc/unmask/forward-auth/protect.inc;  # ← location 外 (全 location 対象)

    location / {                              # ← user の既存 location は無編集
        proxy_pass http://your-upstream;
    }
}
daemon が落ちている間の挙動 (既定: 完全 fail-open) — forward-auth は daemon が落ちると既定で完全に fail-open します。保護パスはゲート (auth_request) が素通しし、challenge 途中の訪問者もそのままバックエンドへ流れるので、サイトは落ちません (native mode と同じ)。追加設定は不要です。逆に daemon down 時に 503 を返して上位 LB に drain させたい (fail-closed) 場合は FAQ を参照してください。

編集が終わったら nginx を reload して設定を反映します:

sudo nginx -t && sudo systemctl reload nginx

2 unmask 本体をインストール ?リポジトリ方式: まず unmask-release を 1 回インストールしてリポジトリ設定と GPG 公開鍵を入れる。以降は dnf install unmask / apt install unmask で本体をインストール / アップグレードできる。署名検証はパッケージマネージャーが自動で行う。

sudo dnf install -y https://unmask.sh/dl/rpm/unmask-release-latest.noarch.rpm
sudo dnf install -y unmask
sudo yum install -y https://unmask.sh/dl/rpm/unmask-release-latest.noarch.rpm
sudo yum install -y unmask
sudo yum install -y https://unmask.sh/dl/rpm/unmask-release-latest.noarch.rpm
sudo yum install -y unmask
wget https://unmask.sh/dl/deb/unmask-release-latest.deb
sudo apt install -y ./unmask-release-latest.deb
sudo apt update && sudo apt install -y unmask

3 unmask-web-apache をインストール (スニペット自動配置) ?前提: Apache は事前にインストール済み (未インストールなら依存解決で httpd + mod_lua + mod_proxy_http も自動的にインストールされます)。

postinstall: /etc/httpd/conf.d/unmask-web.conf/etc/httpd/unmask.lua を配置し、apachectl graceful を実行して、セットアップトークンと URL を表示します。conf.d のスニペットが /unmask/* の proxy を立てるので (全 VirtualHost で https://<host>/unmask/admin/setup/ が開く)、インストールしただけでは保護は発火しません — section 4 の LuaHookAccessChecker 行を VirtualHost に追加して有効化する形です (nginx mode の per-server include protect.inc; と同じ考え方)。

sudo dnf install -y unmask-web-apache
sudo yum install -y unmask-web-apache
sudo yum install -y unmask-web-apache
sudo apt install -y unmask-web-apache
セットアップウィザードで初期化: パッケージのインストール後、https://<your-vhost>/unmask/admin/setup/ を開いて順に実施します (Apache は conf.d のスニペット配置により、全 VirtualHost から /unmask/* に到達できます)。
  1. セットアップトークンを貼り付け — パッケージのインストール後に画面に表示されます。または sudo cat /etc/unmask/.setup-token
  2. 管理画面に login するための admin アカウントを作成 — ユーザー名とパスワード。
  3. DB を設定 — 既定の SQLite で十分です。必要なら MariaDB に切り替えます。
完了すると自動的に admin top へ遷移します。

4 保護したい VirtualHost で forward-auth を有効化 (ON/OFF スイッチ) ?この block 1 つが unmask の ON/OFF スイッチです。追加すれば bot 対策が作動し、外せば ブロック / challenge は即停止します。

ダッシュボード集計の経路: nginx-native (plugin + unix datagram socket access_log) とは違い、Apache mode では forward-auth のサブリクエスト経由で admin の /_unmask/check に 1 リクエスト来るたびに、kind/cnt 集計 (cookie 通過状況のチャート) が +1 されます。つまり 保護対象の VirtualHost のリクエストだけが集計対象になり、nginx-native のように「全リクエストをカウント」にはなりません。

fail-open: /etc/httpd/unmask.lua 内で、admin へのサブリクエストが失敗した場合に OK を返す実装です (リクエストはバックエンド / DocumentRoot へ流れます)。

<VirtualHost *:443>
    ServerName example.com
    SSLEngine on
    SSLCertificateFile ...

    LuaHookAccessChecker /etc/httpd/unmask.lua handle_request

    ProxyPass        / http://your-upstream/
    ProxyPassReverse / http://your-upstream/
</VirtualHost>
sudo apachectl configtest && sudo systemctl reload httpd
sudo apachectl configtest && sudo systemctl reload apache2

5 動作確認 + トラブルシュート

5.1 challenge を強制発火
# 素の curl — browser の TLS でも JS でもないので challenge が返るはず
curl -sk https://example.com/ | grep -oE 'unmask|challenge' | head -1
# → "unmask" が出れば challenge HTML が配信されてる
5.2 ダッシュボードでイベントの流入を確認

統計 タブ → 「チャレンジ ファネル」カード。serve / load / pow / captcha が増えていれば成功です。

耐障害性: unmask の daemon が落ちてもサイトは fail-open です — 通過済みの訪問者はそのまま流れ続け、未通過の訪問者も PoW / CAPTCHA なしで目的のページが表示されます (native / forward-auth の両 mode)。意図的に観測だけ行いたい場合は、管理画面の動作モードタブに完全な pass-through (監視 mode) が用意されています。
5.3 TLS 終端が前段 LB / CDN の構成

LB / CDN が TLS を終端する構成では、実クライアントの JA4 を LB 側で抽出し、X-Client-JA4 header で転送する。 GCP / Cloudflare / AWS ごとの設定手順は LB から JA4 を取る (docs)。 JA4 が取れない場合の動作は JA4 の役割 (docs)

5.4 よくある詰まり
  • 403 forbidden が出る → settings → ネットワークタブの admin_allow_from に自分の IP / CIDR を追加
  • JA4 verdict が空 → native mode は load_module の設定を確認、forward-auth mode は 5.3 (LB の X-Client-JA4 header 転送) を確認
  • nginx -t でモジュールの ABI 不一致 → nginx だけアップグレードされてモジュールが追従していない状態。sudo dnf upgrade unmask-plugin-nginx で同じバージョンに揃える (deb は apt install --only-upgrade unmask-plugin-nginx)
  • challenge HTML が表示されない → unmask が 127.0.0.1:9477 で listen しているか確認 (systemctl status unmask)