結論 · TL;DR

Claude Code にこれを貼るだけで、デモサイトのパスワード保護が完了します。

{案件略号} を実際の略号(例:bnr / rbp)に置き換えてください。

Claude Code Prompt
{案件略号} のデモサイトにパスワード保護を設定して
Prerequisites
  1. Claude Code をインストール → claude.com/claude-code
  2. GitHub CLI をインストール → ENTER-WEB org に push 権限のあるアカウントでログイン gh auth login --hostname github.com --git-protocol https --web
  3. 本リポジトリを clone(Claude Code が CLAUDE.md を読んで作法どおりに動作するため) gh repo clone ENTER-WEB/internal-shared && cd internal-shared

この3点を済ませた状態でClaude Codeを起動し、本リポジトリのフォルダを開いた状態で上のプロンプトを貼ると、誰のPC・誰のアカウントでも同じ結果が得られます。

Claude が完全自動でやる内容:

半自動の項目(下書きまでClaudeが作る・最後の確定は手動)
  • 1Password 登録&共有リンク発行:Claudeが「貼り付ける手順」を出すので、1Passwordアプリで実行する
  • クライアント送付メール:Claudeがメール本文を出すので、Outlook/Gmail から送信する
  • Drive にPDFをバックアップ保管:本リポジトリの管理者(CTO)のみが実行する運用作業
以下のセクションは「Claude が何をやっているか」の参考資料です。Claudeを使う場合は読まなくてOK。 細部の理解が必要な場合や、Claudeを使わず自分で構築したい場合のみ読んでください。
Runbook · Demo Site Security

Demo
Password
Protect.

GitHub Pages + staticrypt + GitHub Actions

案件のデモサイトを GitHub Pages で公開する際、クライアント側AES暗号化(staticrypt)GitHub Actions の自動暗号化フローを組み合わせて保護する標準手順。 対象は短期のクライアント確認用デモ(〜2週間・1社案件)。 シェルコマンド・workflow.yml・メール本文はすべて右上のCOPYボタンでワンクリック取得できる。

Updated · 2026-05-10 / VAIZO V/ENTER WEB

Contents

00 / Iron Rules

鉄則

1つでも破るとデモが流出する。クライアント信頼喪失=案件失注。妥協しないこと。

⚠ 絶対NG

  • 4桁数字PWを使う — 静的配信は総当たり10,000通りが秒で破られる
  • PWを Slack / メール本文に直書き — スレッド検索・転送で漏れる
  • 平文HTMLを Public repo に置く — GitHub検索・Web Archiveで漏える
  • 納品後にデモrepo・PWを放置 — 退職・担当変更で閲覧権が残り続ける

✓ 必ず守る

  • PWは最低12文字のランダム英数字 — オフライン総当たりに耐えるため
  • PW共有は1Password Item Sharingに統一 — 有効期限・閲覧制限・メール認証を設定
  • Source repo は Private、Pages配信用は Public — 平文と暗号化を物理分離
  • 納品後は1Password revoke + Pages repo Archive — 翌営業日中に必ず実施
01 / Architecture

構成図

VAIZO-jp は Free org のため Private repo の Pages が使えない。 Source は Private で守り、暗号化済成果物だけを Public repo 経由で Pages に配信する構成が唯一の現実解。

┌──────────────────────────────────────────────────────────┐ │ VAIZO-jp/{案件略号}-site (Private · Source) │ │ │ │ src/ ← 平文HTML・CSS・画像(commit対象) │ │ .github/workflows/ │ │ └─ deploy-demo.yml ← Actions が暗号化&配信 │ │ │ │ Secrets: │ │ DEMO_PW ← 12文字以上ランダム英数字 │ │ DEPLOY_TOKEN ← Pages repo への push 権限 PAT │ └──────────────────────────────────────────────────────────┘ │ GitHub Actions │ (push trigger) ┌──────────────────────────────────────────────────────────┐ │ VAIZO-jp/{案件略号}-demo (Public · Pages配信専用) │ │ │ │ 暗号化済HTMLのみ (手動編集禁止 · Actionsが上書き) │ └──────────────────────────────────────────────────────────┘ https://vaizo-jp.github.io/{案件略号}-demo/ │ クライアントが12文字PW入力 復号化&閲覧
02 / Prerequisites

前提条件

項目確認コマンド / 手順
Node.js 20以上node -v
staticrypt CLInpm i -g staticrypt または都度 npx staticrypt
GitHub CLI 認証gh auth status
1Password Teamsログイン済 / Vault作成権限あり
案件略号キックオフで決定済(例:BAR NOIR → bnr
03 / Initial Setup

初回セットアップ

  1. 案件略号を環境変数に Set Variable

    以下を bash / zsh で実行(PowerShellは $env:SLUG="bnr")。

    bash
    SLUG=bnr   # 案件略号(小文字)に置き換える
  2. リポジトリを2つ作成 Create Repos

    Source(Private)と Pages配信用(Public)を作成する。

    bash
    gh repo create VAIZO-jp/${SLUG}-site --private --clone
    cd ${SLUG}-site
    
    gh repo create VAIZO-jp/${SLUG}-demo --public \
      --description "Encrypted demo for ${SLUG}. Source: VAIZO-jp/${SLUG}-site"
  3. 12文字ランダムPWを生成 Generate PW

    記号なし英数字16文字(口頭伝達ミス防止)。生成後すぐ1Passwordへ。

    bash
    openssl rand -base64 16 | tr -dc 'A-Za-z0-9' | head -c 16; echo

    例:K3xQ9mNpL2vRtBhZ

  4. 1Password に保管&共有準備 1Password

    1. Vault Client-{{案件略号}} を開く(無ければ作成)
    2. 「Login」アイテム作成
      • Title:{{正式名称}} デモサイト
      • URL:https://vaizo-jp.github.io/{{SLUG}}-demo/
      • Password:上で生成したPW
      • Notes:公開日 / 有効期限 / 案件Issue番号
    3. Share → Item Sharing リンク作成
      • 有効期限:7日(最長14日)
      • 閲覧回数:クライアント担当者数 +2
      • メール認証:必須
    How to · 1Password Operations

    1Passwordの使い方(クリックで詳細を表示)

    初めて触る人向けの操作手順。慣れている人は閉じたままで OK。 全社運用の詳細は 1Password Teams セットアップ 参照。

    はじめての方へ:アカウント参加〜初回ログインOnboarding
    1. 櫻井CTOから 1Password Teams 招待メール(差出人:1Password <noreply@1password.com>)が届く
    2. メール内の「Join VAIZO」をクリック
    3. Master Password を設定(16文字以上推奨・忘れたら復旧不可なので必ず記憶)
    4. Secret Key をダウンロード(PDF)→ 自宅金庫 or 印刷して安全な場所に保管
    5. Emergency Kit も同様にダウンロード保管
    6. デスクトップアプリをインストール:1password.com/downloads
    7. ブラウザ拡張機能もインストール(Chrome / Edge / Firefox)→ 自動入力が効くようになる
    重要 Master Password と Secret Key の両方が無いとログインできない。両方を別々の場所に保管すること(同じPCに置かない)。
    Vaultの選び方(どこに入れる?)Vault

    デモ案件のPWは 案件機密度 で振り分ける。

    Vault名使う案件
    Enter-Web-VIPS案件(年100万超・上場企業・政府関連) / VIP案件のデモ
    Enter-Web-Standard通常案件(A/B案件・年100万未満) / 大半のデモはここ
    Onboarding-Inboxクライアントから受領したばかりで未振り分けの一時保管

    迷ったら Enter-Web-Standard。VIP案件か疑問があれば案件CTO(櫻井理也)に確認。

    Loginアイテム作成 詳細(フィールド・命名・タグ)New Item
    1. 1Passwordアプリで対象 Vault を選択
    2. 左下 「+ New Item」(または右上の「+」)
    3. カテゴリ 「Login」 を選択
    4. 各フィールドを以下のとおり入力:
    フィールド入力内容(例)
    Title[BNR] デモサイト(命名規則:[案件略号] アイテム種別
    Username(空欄でOK・staticryptはPWのみ)
    Password右の生成ボタンは使わず、事前に openssl rand で生成した12文字PW を貼り付け
    Websitehttps://vaizo-jp.github.io/bnr-demo/(実際のSLUGに置換)
    Notes公開日 / 有効期限 / 案件Issue番号 / 想定閲覧者
    Tagsclient:bnr type:demo status:active rotation:none

    Saveで保存完了。アイテムがVault一覧に表示される。

    Item Sharing リンクの発行(クライアントへ共有)Share
    1. 作成したLoginアイテムを開く
    2. 右上 「Share」 ボタン(または「⋯」メニュー → Share)
    3. 「Share via Link」(リンクで共有)を選択
    4. 共有設定を以下のとおり:
    設定推奨値
    Expires after(有効期限)7 days(最長14 days)
    Available for(閲覧回数)クライアント担当者数 +2(例:担当2名 → 4回)
    Restrict to people who can verify their emailON(必須) — メール認証を要求
    Allowed emailsクライアント担当者のメールアドレスを列挙(カンマ区切り)
    1. 「Get Link to Share」 をクリック
    2. 表示された URL(https://share.1password.com/s#...)をコピー
    3. このURLを §06 共有メール雛形{{1Password Item Sharing URL}} に貼り付けて送信
    UXメモ クライアント側は「リンクを開く → メールに認証コードが届く → コード入力 → PW表示」という流れ。LINEアカウント認証より少し手間だが、漏洩リスクが激減する。
    共有リンクをrevoke(停止)するRevoke

    納品後・担当変更時・漏洩疑い時は即停止。

    1. 1Passwordアプリで対象アイテムを開く
    2. 右上 「Share」「Manage Shared Links」
    3. 該当リンクの 「⋯」 → 「Revoke」 を選択
    4. 確認ダイアログで 「Revoke」

    Revoke後、そのリンクを開こうとした人は「This link has been revoked」と表示され閲覧不可になる。

    新しいリンクを発行するには「Item Sharing リンクの発行」をもう一度実行。

    1Password CLI(op)でPWを取得&自動化Advanced

    シェルスクリプトやCI/CDから 1Password に保管したPWを直接取得できる。手動コピペが減ってミスが防げる。

    初回セットアップ:

    bash
    # Windows
    winget install AgileBits.1Password.CLI
    
    # macOS
    brew install 1password-cli
    
    # 動作確認
    op --version
    
    # サインイン(初回のみ)
    op signin

    使用例:デモPWを環境変数に設定して staticrypt 再暗号化

    bash
    export DEMO_PW=$(op read "op://Enter-Web-Standard/[BNR] デモサイト/password")
    staticrypt src/index.html -p "$DEMO_PW" -o dist/index.html

    使用例:GitHub Secrets を一括更新

    bash
    op read "op://Enter-Web-Standard/[BNR] デモサイト/password" \
      | gh secret set DEMO_PW --repo VAIZO-jp/bnr-site
    補足 op://Vault名/アイテム名/フィールド名 の形式。アイテム名にスペースや記号が含まれる場合はそのまま指定可(クォートで囲む)。
    困ったとき(よくある詰まり)FAQ
    症状対処
    「Share」ボタンが出ないVaultがpersonal Vault(無料アカウント)になっている可能性。Teams Vault に移動 or 櫻井CTOに権限確認
    クライアントが「メール認証コードが届かない」(1) スパムフォルダ確認 (2) リンクのAllowed emailsに登録されているか確認 (3) 5分待って再送信
    リンクの有効期限を延長したい延長機能なし。新しいリンクを発行 → 旧リンク revoke → 新リンクを再送付
    誤って revoke してしまった同じアイテムから新リンクを発行し直すだけ。データ自体は消えない
    クライアントが1Passwordの使い方が分からないItem Sharing リンクは 1Passwordアカウント不要。リンクを開けばメール認証だけで閲覧可能と伝える
  5. GitHub Secrets に登録 Secrets

    DEMO_PW:上で生成したPWを Source repo の Secrets に登録。

    bash
    gh secret set DEMO_PW --repo VAIZO-jp/${SLUG}-site
    # プロンプトに 12文字PW を貼り付け

    DEPLOY_TOKEN:Fine-grained PAT を発行。GitHub Web → Settings → Developer settings → Personal access tokens (Fine-grained)

    • Resource owner:VAIZO-jp
    • Repository access:Only select → {{SLUG}}-demo
    • Permissions:Contents = Read and write
    • Expiration:90日
    bash
    gh secret set DEPLOY_TOKEN --repo VAIZO-jp/${SLUG}-site
    # プロンプトに発行した PAT を貼り付け
  6. Pages を有効化 Enable Pages

    Pages repo(Public)側で main / root を Pages source に設定。

    bash
    gh api -X POST /repos/VAIZO-jp/${SLUG}-demo/pages \
      -f "source[branch]=main" \
      -f "source[path]=/"

    または GitHub Web → Settings → Pages → Source: Deploy from a branch → main / /

04 / Workflow

Workflow YAML

Source repo の .github/workflows/deploy-demo.yml として保存。 ファイル冒頭の SLUG を案件略号に置き換える(または env で渡す)。

.github/workflows/deploy-demo.yml
name: Encrypt and Deploy Demo

on:
  push:
    branches: [main]
  workflow_dispatch:

env:
  SLUG: bnr   # ← 案件略号(小文字)に書き換える

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    permissions:
      contents: read
    steps:
      - name: Checkout source
        uses: actions/checkout@v4

      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install staticrypt
        run: npm i -g staticrypt

      - name: Encrypt all HTML
        env:
          DEMO_PW: ${{ secrets.DEMO_PW }}
        run: |
          mkdir -p dist
          cp -r src/* dist/
          # HTMLだけ in-place 暗号化(CSS/JS/画像はそのまま)
          find dist -name "*.html" -print0 | while IFS= read -r -d '' f; do
            staticrypt "$f" \
              --password "$DEMO_PW" \
              --short \
              --template-title "デモ閲覧 - パスワードを入力してください" \
              --template-instructions "1Passwordリンクから取得したパスワードを入力" \
              --template-button "閲覧する" \
              -o "$f"
          done

      - name: Deploy to public Pages repo
        uses: peaceiris/actions-gh-pages@v4
        with:
          personal_token: ${{ secrets.DEPLOY_TOKEN }}
          external_repository: VAIZO-jp/${{ env.SLUG }}-demo
          publish_branch: main
          publish_dir: ./dist
          commit_message: "deploy: ${{ github.sha }}"
注意 SLUG を直書きする。動的指定だと repo命名規約とのズレで事故りやすい。
05 / Daily Operation

日常運用

  1. Source repo で平文HTMLを編集 Edit & Push

    bash
    cd ~/work/${SLUG}-site
    # index.html などを修正
    git add .
    git commit -m "fix: ヒーロー画像差し替え"
    git push origin main
  2. Actions が自動で暗号化→Pages公開 Auto Deploy

    1〜2分でデプロイ完了。進捗・失敗ログを確認。

    bash
    gh run watch --repo VAIZO-jp/${SLUG}-site
    # 失敗時:
    gh run view --log --repo VAIZO-jp/${SLUG}-site
  3. クライアント確認URLを自分で動作確認 Self Check

    1. https://vaizo-jp.github.io/{SLUG}-demo/ をシークレットウィンドウで開く
    2. 1PasswordからPWを取り出して入力
    3. 修正が反映されているかチェック
    4. PCとスマホ両方で確認
06 / Email Template

共有メール雛形

パスワードは 必ず1Password Item Sharingリンク で送る。本文に直接書かない。 {{...}} のプレースホルダを案件情報に置き換えて使用。

件名

本文

送信前チェック パスワードを本文に直書きしていない / 1Passwordリンクの有効期限・閲覧回数を設定済み / 自分でPWを入れて復号確認 / PC・スマホ両方で表示確認 / CC案件CTO・橋本CEO(必要に応じて) / BCC自分。
07 / Rotation

PWローテーション

以下のいずれかが起きたら即ローテーション:クライアント担当者変更/1Passwordリンク期限切れ/PWを誤投稿(漏洩疑い)/案件開始から30日経過。

bash
# 新PW生成
NEW_PW=$(openssl rand -base64 16 | tr -dc 'A-Za-z0-9' | head -c 16)
echo "$NEW_PW"

# 1Password Item を更新(旧Item Sharingリンクは revoke)
# → 新しい Item Sharing リンクを生成

# GitHub Secrets を更新
echo "$NEW_PW" | gh secret set DEMO_PW --repo VAIZO-jp/${SLUG}-site

# Workflow を再実行(再暗号化)
gh workflow run deploy-demo.yml --repo VAIZO-jp/${SLUG}-site

# クライアントに新リンクを送付(旧リンクの停止も明記)
08 / Offboarding

納品後の撤去

タスク備考
1Password Item Sharing リンク revoke共有リンクを失効。Item本体は Vault に残す
クライアントに「デモは{{日付}}に閉じます」と一報Slack or メール
Pages repo({{SLUG}}-demo)を Archive監査用に残しつつ書き込み不可化(推奨)
Pages repo を DeleteArchive後30日経過してから(追加質問期間考慮)
Source repo({{SLUG}}-site)は 保持後日改修・トラブル対応のため
Source repo の Secrets DEMO_PW DEPLOY_TOKEN を削除不要になった機密は即削除
案件Issue に「デモ撤去完了」コメント監査ログ
09 / Troubleshooting

トラブル対応

9.1Actions が "Permission denied" で失敗

DEPLOY_TOKEN の Fine-grained PAT 権限不足が原因。

  1. Settings → Developer settings → Token を開く
  2. Pages repo に対する Contents: Read and write が付与されているか確認
  3. PAT の有効期限切れもチェック(90日デフォルト)

9.2暗号化後に CSS / JS が読み込まれない

staticrypt は <link> <script> の相対パスを変えないが、復号後の表示時に相対基準が変わるケースがある。

  1. src/ 内のリソースパスを 絶対パス(/css/style.css形式)で書く
  2. それでも崩れる場合は --noremember を外して localStorage で復号化状態を保持

9.3クライアントから「PWを入れても弾かれる」

  1. PW入力欄でコピペできているか確認(先頭末尾の空白混入)
  2. 1Password Item Sharing のリンク期限切れ確認
  3. ブラウザの localStorage 破損可能性 → シークレットウィンドウで再試行
  4. それでもダメなら §07 でPWローテーション

9.4Pages URL が 404

  1. Pages repo の Settings → Pages で Your site is live at ... 表示確認
  2. 無い場合:Source = main / (root) に再設定 → 数分待つ
  3. カスタムドメイン使用時は DNS の CNAME 設定確認

9.5GitHub検索でデモが見つかってしまった

  1. Source repo を Private にしたか再確認
  2. Pages repo 内の暗号化済HTMLは検索に出てもOK(中身は復号不可)
  3. src/ の平文HTMLを誤って Pages repo に push していないか git log --all で確認
  4. 漏れていれば repo削除&新規作成、PW即ローテ

10 / Decision

別方式への切替

┌─ クライアントが3社以上同時 ──→ Cloudflare Access │ または「誰がいつ見たか」の │ ログが必要 案件のデモ運用 ────┤ ├─ 短期(〜2週間)・1社案件 ────→ 本runbook(GitHub Pages + staticrypt)★標準 │ └─ Vercel / AWS 前提 ──────────→ Vercel Password Protection (Pro契約済) (月$20、別途コスト発生)

切り替え判断は案件CTOが エスカレーション順 と合わせて実施。

— / Related

関連ドキュメント