deploying-cloudflare-access-for-zero-trust について
内部アプリやサービス向けに、Cloudflare Access をアイデンティティ認識型のアクセス層として設定するデプロイスキルです。Cloudflare Tunnel、IdP、アクセスポリシー、デバイスポスチャ、監査ログを扱います。
主な機能
- 01Cloudflare Tunnel の設定
- 02IdP の統合
- 03アプリケーションのアクセスポリシー
- 04WARP 登録とデバイスポスチャ検査
- 05アクセス監査ログの記録
活用シーン
- 01インバウンドポートを開けずに内部アプリを公開
- 02Web アプリへの VPN アクセスを置き換え
- 03委託先のアクセス先を特定サービスに限定
- 04アクセス判断とトンネル状態の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill deploying-cloudflare-access-for-zero-trustインストール後、Claude Code で/deploying-cloudflare-access-for-zero-trustを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEassets/template.mdreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.pyprocess.py詳細
ゼロトラスト向け Cloudflare Access のデプロイ
使用する場面
- Cloudflare One を使用して、VPN インフラストラクチャを ID を考慮したアプリケーションアクセスに置き換える場合
- インバウンドポートを開放せずに、Cloudflare Tunnel を通じてセルフホストの内部アプリケーションを公開する場合
- Web アプリケーション、SSH、RDP サービスにアクセスする分散型の従業員向けに ZTNA を導入する場合
- DLP、CASB、SWG 機能が統合された費用対効果の高いゼロトラストソリューションが必要な場合
- ネットワーク全体へのアクセスを許可せず、特定のアプリケーションへの委託業者やサードパーティのアクセスを保護する場合
使用しないでください。Cloudflare Tunnel ではサポートされていない、持続的な UDP 接続を必要とするアプリケーション、エアギャップ環境または完全なオンプレミスのアクセス制御が必要な環境、あるいは規制要件によりサードパーティのクラウドインフラストラクチャを経由したトラフィックのルーティングが禁止されている場合。
前提条件
- Zero Trust サブスクリプションが有効な Cloudflare アカウント(最大 50 ユーザーまでは無料、大規模なチーム向けには有料プラン)
- Cloudflare DNS で管理されているドメイン名(または CNAME レコードを追加できること)
cloudflaredトンネルデーモンを実行する Linux、Windows、または macOS サーバー- ID プロバイダー:Okta、Microsoft Entra ID、Google Workspace、GitHub、または任意の SAML/OIDC プロバイダー
- デバイスレベルの登録に使用する Cloudflare WARP クライアント(任意ですが推奨)
ワークフロー
ステップ 1:内部アプリケーションへの Cloudflare Tunnel を作成する
cloudflared をインストールし、内部サービスを公開する永続的なトンネルを作成します。
# Install cloudflared on Ubuntu/Debian
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb \
-o cloudflared.deb
sudo dpkg -i cloudflared.deb
# Authenticate cloudflared with your Cloudflare account
cloudflared tunnel login
# Create a named tunnel
cloudflared tunnel create internal-apps
# Output: Created tunnel internal-apps with id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# Configure tunnel routes to internal applications
cat > ~/.cloudflared/config.yml << 'EOF'
tunnel: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
credentials-file: /home/admin/.cloudflared/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.json
ingress:
- hostname: wiki.company.com
service: http://localhost:8080
- hostname: git.company.com
service: http://10.1.1.50:3000
- hostname: grafana.company.com
service: http://10.1.1.60:3000
- hostname: ssh.company.com
service: ssh://localhost:22
- hostname: rdp.company.com
service: rdp://10.1.1.100:3389
# Catch-all rule (required)
- service: http_status:404
EOF
# Route DNS to the tunnel
cloudflared tunnel route dns internal-apps wiki.company.com
cloudflared tunnel route dns internal-apps git.company.com
cloudflared tunnel route dns internal-apps grafana.company.com
# Run tunnel as a systemd service
sudo cloudflared service install
sudo systemctl enable cloudflared
sudo systemctl start cloudflared
# Verify tunnel status
cloudflared tunnel info internal-apps
ステップ 2:ID プロバイダーとの連携を設定する
組織の ID プロバイダーを使用した認証を設定します。
# Using Cloudflare API to configure Okta as IdP
curl -X PUT "https://api.cloudflare.com/client/v4/accounts/{account_id}/access/identity_providers" \
-H "Authorization: Bearer ${CF_API_TOKEN}" \
-H "Content-Type: application/json" \
--data '{
"name": "Corporate Okta",
"type": "okta",
"config": {
"client_id": "OKTA_CLIENT_ID",
"client_secret": "OKTA_CLIENT_SECRET",
"okta_account": "company.okta.com",
"api_token": "OKTA_API_TOKEN",
"claims": ["email", "groups", "name"],
"email_claim_name": "email"
}
}'
# Configure Microsoft Entra ID as additional IdP
curl -X POST "https://api.cloudflare.com/client/v4/accounts/{account_id}/access/identity_providers" \
-H "Authorization: Bearer ${CF_API_TOKEN}" \
-H "Content-Type: application/json" \
--data '{
"name": "Microsoft Entra ID",
"type": "azureAD",
"config": {
"client_id": "AZURE_APP_CLIENT_ID",
"client_secret": "AZURE_APP_CLIENT_SECRET",
"directory_id": "AZURE_TENANT_ID",
"support_groups": true,
"claims": ["email", "groups", "name"]
}
}'
ステップ 3:Access アプリケーションとポリシーを作成する
各内部サービスに対して、ID を考慮したポリシーを持つ Access アプリケーションを定義します。
# Create Access application for internal wiki
curl -X POST "https://api.cloudflare.com/client/v4/accounts/{account_id}/access/apps" \
-H "Authorization: Bearer ${CF_API_TOKEN}" \
-H "Content-Type: application/json" \
--data '{
"name": "Internal Wiki",
"domain": "wiki.company.com",
"type": "self_hosted",
"session_duration": "8h",
"auto_redirect_to_identity": true,
"http_only_cookie_attribute": true,
"same_site_cookie_attribute": "lax",
"logo_url": "https://company.com/wiki-logo.png",
"allowed_idps": ["OKTA_IDP_ID", "AZURE_IDP_ID"]
}'
# Create Allow policy for the wiki application
curl -X POST "https://api.cloudflare.com/client/v4/accounts/{account_id}/access/apps/{app_id}/policies" \
-H "Authorization: Bearer ${CF_API_TOKEN}" \
-H "Content-Type: application/json" \
--data '{
"name": "Allow Engineering Team",
"decision": "allow",
"precedence": 1,
"include": [
{"group": {"id": "ENGINEERING_GROUP_ID"}},
{"okta": {"name": "Engineering", "identity_provider_id": "OKTA_IDP_ID"}}
],
"require": [
{"device_posture": {"integration_uid": "CROWDSTRIKE_INTEGRATION_ID"}}
]
}'
# Create Access application for SSH access
curl -X POST "https://api.cloudflare.com/client/v4/accounts/{account_id}/access/apps" \
-H "Authorization: Bearer ${CF_API_TOKEN}" \
-H "Content-Type: application/json" \
--data '{
"name": "SSH Access",
"domain": "ssh.company.com",
"type": "ssh",
"session_duration": "4h",
"auto_redirect_to_identity": true
}'
ステップ 4:デバイス登録用に WARP クライアントをデプロイする
Cloudflare WARP を使用して社内デバイスを登録し、プライベートネットワークへのアクセスとデバイスの状態を管理します。
# Create device enrollment rule
curl -X POST "https://api.cloudflare.com/client/v4/accounts/{account_id}/devices/policy" \
-H "Authorization: Bearer ${CF_API_TOKEN}" \
-H "Content-Type: application/json" \
--data '{
"name": "Corporate Device Enrollment",
"match": "identity.email matches \".*@company\\.com$\"",
"precedence": 100,
"enabled": true,
"gateway_unique_id": "GATEWAY_ID",
"support_url": "https://helpdesk.company.com/warp-help"
}'
# Install WARP on macOS via MDM (Jamf/Intune)
# Download: https://developers.cloudflare.com/cloudflare-one/connections/connect-devices/warp/download-warp/
# Deploy with MDM configuration profile:
cat > warp_mdm_config.plist << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>organization</key>
<string>company</string>
<key>auto_connect</key>
<integer>1</integer>
<key>switch_locked</key>
<true/>
<key>onboarding</key>
<false/>
</dict>
</plist>
EOF
# Install Cloudflare root certificate for TLS inspection
# Download from: https://developers.cloudflare.com/cloudflare-one/connections/connect-devices/warp/user-side-certificates/
sudo cp cloudflare-root-ca.pem /usr/local/share/ca-certificates/cloudflare-root-ca.crt
sudo update-ca-certificates
# Configure split tunnel to route private network through WARP
curl -X PUT "https://api.cloudflare.com/client/v4/accounts/{account_id}/devices/policy/{policy_id}/fallback_domains" \
-H "Authorization: Bearer ${CF_API_TOKEN}" \
-H "Content-Type: application/json" \
--data '[
{"suffix": "internal.corp", "description": "Internal corporate domain"},
{"suffix": "10.0.0.0/8", "description": "Private network range"}
]'
ステップ 5:デバイスの状態チェックを設定する
エンドポイントのセキュリティシグナルを Access ポリシーに統合します。
# Add CrowdStrike device posture integration
curl -X POST "https://api.cloudflare.com/client/v4/accounts/{account_id}/devices/posture/integration" \
-H "Authorization: Bearer ${CF_API_TOKEN}" \
-H "Content-Type: application/json" \
--data '{
"name": "CrowdStrike Falcon",
"type": "crowdstrike_s2s",
"config": {
"api_url": "https://api.crowdstrike.com",
"client_id": "CS_API_CLIENT_ID",
"client_secret": "CS_API_CLIENT_SECRET",
"customer_id": "CS_CUSTOMER_ID"
},
"interval": "10m"
}'
# Create device posture rule for disk encryption
curl -X POST "https://api.cloudflare.com/client/v4/accounts/{account_id}/devices/posture" \
-H "Authorization: Bearer ${CF_API_TOKEN}" \
-H "Content-Type: application/json" \
--data '{
"name": "Disk Encryption Required",
"type": "disk_encryption",
"match": [{"platform": "windows"}, {"platform": "mac"}],
"input": {"requireAll": true}
}'
# Create device posture rule for OS version
curl -X POST "https://api.cloudflare.com/client/v4/accounts/{account_id}/devices/posture" \
-H "Authorization: Bearer ${CF_API_TOKEN}" \
-H "Content-Type: application/json" \
--data '{
"name": "Minimum OS Version",
"type": "os_version",
"match": [{"platform": "windows"}],
"input": {"version": "10.0.19045", "operator": ">="}
}'
ステップ 6:監査ログと分析を設定する
アクセス判断とトンネルの稼働状況を監視するためのロギングを設定します。
# Enable Logpush for Access audit logs to S3
curl -X POST "https://api.cloudflare.com/client/v4/accounts/{account_id}/logpush/jobs" \
-H "Authorization: Bearer ${CF_API_TOKEN}" \
-H "Content-Type: application/json" \
--data '{
"name": "access-audit-logs",
"output_options": {
"field_names": ["RayID","Action","Allowed","AppDomain","AppUUID","Connection","Country","CreatedAt","Email","IPAddress","PurposeJustificationPrompt","PurposeJustificationResponse","TemporaryAccessDuration","UserUID"],
"timestamp_format": "rfc3339"
},
"destination_conf": "s3://security-logs-bucket/cloudflare-access/?region=us-east-1&access-key-id=AKID&secret-access-key=SECRET",
"dataset": "access_requests",
"enabled": true
}'
# Query access logs via GraphQL Analytics API
curl -X POST "https://api.cloudflare.com/client/v4/graphql" \
-H "Authorization: Bearer ${CF_API_TOKEN}" \
-H "Content-Type: application/json" \
--data '{
"query": "{ viewer { accounts(filter: {accountTag: \"ACCOUNT_ID\"}) { accessLoginRequestsAdaptiveGroups(filter: {datetime_gt: \"2026-02-22T00:00:00Z\"}, limit: 100, orderBy: [count_DESC]) { dimensions { action appName userEmail country } count } } } }"
}'
主な概念
| 用語 | 定義 |
|---|---|
| Cloudflare Tunnel | インバウンドのファイアウォールポートを開放せずに内部サービスを公開する、インフラストラクチャから Cloudflare のネットワークへの暗号化されたアウトバウンド専用接続 |
| Cloudflare Access | 保護されたアプリケーションへのアクセスを許可する前に、すべてのリクエストをアクセスポリシーに照らして評価する、ID を考慮したリバースプロキシ |
| WARP クライアント | ポリシーの適用とプライベートネットワークへのアクセスのために、デバイスのトラフィックを Cloudflare のネットワーク経由でルーティングする Cloudflare のエンドポイントエージェント |
| Access アプリケーション | 関連するアクセスポリシーとともに、保護対象のリソース(セルフホスト、SaaS、またはインフラストラクチャ)を定義する設定オブジェクト |
| デバイスの状態 | Access ポリシーの条件として評価されるエンドポイントの健全性シグナル(OS バージョン、ディスク暗号化、EDR の状態) |
| Cloudflare One | ZTNA(Access)、SWG(Gateway)、CASB、DLP、RBI を組み合わせた統合 SASE プラットフォーム |
ツールとシステム
- Cloudflare Access:リクエストごとの認可を提供する、ID を考慮したアプリケーションプロキシ
- Cloudflare Tunnel (cloudflared):内部ネットワークから Cloudflare エッジへの暗号化トンネルを作成するデーモン
- WARP クライアント:デバイス登録、DNS フィルタリング、プライベートネットワークのルーティングに対応するクロスプラットフォームのエンドポイントエージェント
- Cloudflare Gateway:DNS/HTTP フィルタリングと DLP 検査を提供するセキュア Web ゲートウェイ
- Cloudflare Logpush:外部の SIEM やストレージの送信先へのリアルタイムログストリーミング
- Access for Infrastructure:短期間有効な証明書とセッション記録を用いた SSH および RDP アクセス
よくあるシナリオ
シナリオ:従業員200人のスタートアップがゼロからゼロトラストを導入する
背景:従業員200人のSaaSスタートアップには既存のVPNがありません。AWS上で稼働する社内ツール(Grafana、内部API、ステージング環境)への安全なアクセスを提供したいと考えています。予算は限られており、専任のセキュリティ担当者もいません。
アプローチ:
- 概念実証としてCloudflare Zero Trustの無料プラン(最大50ユーザー)から始めます
- 本番VPC内のEC2インスタンスに
cloudflaredトンネルを1つデプロイします - DNSルーティングを使用して、Grafana、社内Wiki、ステージングアプリをトンネル経由で公開します
- SSO認証のIdPとしてGoogle Workspaceを設定します
- すべてのアプリケーションに、@company.comのメールドメインを必須とするAccessポリシーを作成します
- ディスク暗号化とOSバージョンのデバイスポスチャチェックを追加します
- 有料プランにアップグレードし、MDM経由で全従業員のノートPCにWARPクライアントをデプロイします
- マルウェア対策として、GatewayのDNSフィルタリングとHTTP検査を有効にします
- アクセスログをDatadogに送信して監視するようLogpushを設定します
注意点:TLS検査を機能させるには、すべてのデバイスにCloudflareのルート証明書をインストールする必要があります。TLSインターセプトによって動作しなくなるアプリケーションもあります。トンネルのフェイルオーバーには、複数のcloudflaredインスタンスを実行するか、Cloudflareのレプリカ機能を使用する必要があります。Accessポリシーには、必ずデフォルトの拒否ルールを含めてください。WebSocketアプリケーションでは、特定のトンネル設定が必要になる場合があります。
出力形式
Cloudflare Zero Trust Deployment Report
==================================================
Organization: StartupCorp
Team Name: startupcorp
Deployment Date: 2026-02-23
TUNNEL INFRASTRUCTURE:
Active Tunnels: 2 (primary + failover)
Tunnel Status: Healthy
Connected Edge: Washington DC, Ashburn
Ingress Routes: 8
ACCESS APPLICATIONS:
Self-Hosted Apps: 6
SaaS Apps: 3
SSH/Infrastructure: 2
Total Policies: 15
DEVICE ENROLLMENT:
Enrolled Devices: 187 / 200
WARP Connected: 182 / 187 (97.3%)
Posture Compliant: 175 / 187 (93.6%)
ACCESS METRICS (last 30 days):
Total Requests: 89,432
Allowed: 88,756 (99.2%)
Blocked: 676 (0.8%)
Unique Users: 195
Countries: 12
Avg Session Duration: 6.2 hours