サードパーティ連携・契約管理(技術的側面)
- 山崎行政書士事務所
- 9月12日
- 読了時間: 8分

— Azure×外部 SaaS/PaaS 連携を“パラメータ粒度”で堅牢化する実装規範 —
著者:山崎行政書士事務所 クラウド法務・アーキテクチャ支援チーム
発行日:2025-09-12
要旨(Abstract)
サードパーティ(SaaS/PaaS)連携では、データ最小化・鍵主権・通信/境界制御・証跡化の 4 点を外さない限り、法務(DPA/再委託条項)と技術がきれいに接続する。本稿は Azure API Management(APIM)/Functions/Logic Apps/Key Vault/Firewall/Monitor/Sentinel を用いた標準アーキテクチャと、APIM ポリシー/OAuth2 設定/ネットワーク経路/ログ・監査/IaCの具体値(サンプル)を提示する。「誰が」「どこへ」「何を」「どの鍵で」「どの経路で」「どう監査するか」をひとつの実装手順として固定化し、個人情報の流出リスクと委託先依存リスクを最小化するのが狙いである。
1. 連携ベースライン(設計原理)
データ最小化:外部に出す PII は擬似匿名 IDや必要列のみ。送出直前にマスキング/トークン化。
鍵主権(BYOK/HSM):資格情報・証明書・暗号鍵は Key Vault Premium で保管し、参照は**マネージド ID(MI)**に限定。
閉域優先(Private First):可能な限り Private Link / Service Endpoint / VNet 統合。外向きは固定イグレス(Azure Firewall/NAT GW)+宛先 AllowList。
プロキシ集中(APIM):認証・スロットリング・検査・監査をAPIM に集約し、外部 SaaS への到達制御を担保。
証跡と自動化:Monitor/Sentinelで取りこぼしゼロ、Playbookで遮断/失効/通知を自動化。
IaC:Bicep/Terraform で再現可能かつ差分可視に。機密値はKey Vault 参照。
2. リファレンスアーキテクチャ(概観)
[Entra ID]──(OIDC/OAuth2)──[Client]
│
[Azure API Management] (WAF 相当, DLP/整形/RateLimit/検証)
│ inbound policy
┌──────────────┴──────────────┐
[Azure Functions](MI/Egress 固定) [Logic Apps Std](MI)
│ │
(Private vNet) (Private vNet)
│ │
[Azure Firewall/NAT GW] ──▶ 固定 Egress IP ──▶ [SaaS API Endpoint]
│
(Outbound 宛先 AllowList, TLS1.2+ / mTLS 可)
ポイント
外部 SaaS へ直接出るのは Functions/Logic Apps(固定イグレスを確保しやすい)。APIM は入口統制と監査に特化。
APIM→Functions は VNet 内通信。Functions→SaaS は Firewall/NAT GW 経由で固定グローバル IPを提示し、SaaS 側 IP 制限に応える。
資格情報(Client Secret/証明書)は Key Vault の**参照(MI)**でのみ使用。人手閲覧不可。
3. 実装ステップ(パラメータ粒度)
3.1 データフロー最適化(送出前マスキング)
Data Factory(または Synapse/Databricks)でのカラム処理例:
{
"activities": [{
"name": "MaskPII",
"type": "DerivedColumn",
"typeProperties": {
"columns": [
{ "name": "email_hash", "expression": "sha2(concat(email, pipeline().parameters.pepper), 256)" },
{ "name": "user_id", "expression": "toString(guid())" }
],
"dropOriginalColumns": ["email","name","address"]
}
}]
}
pepper は Key Vault(シークレット)からパラメータ化。
元列は drop して外部送信面から排除。
3.2 APIM(入口統制・検査・スロットリング)
APIM 基本パラメータ
Name: apim-prd-core / SKU: Standard(VNet 内部用は Premium)
Custom Domain: api.example.com(証明書は Key Vault 連携)
Named Values: oauth-client-id/oauth-client-secret(Key Vault 参照, MI)
TLS policy: >=1.2 必須
典型 inbound ポリシー(抜粋)
RateLimit、IP 制限、OAuth2 Client Credentials でトークン取得→Functions へ中継、JSON スキーマ検証、PII ガード(禁止フィールド検出)
<policies>
<inbound>
<!-- 1) Rate limit -->
<rate-limit calls="100" renewal-period="60" />
<!-- 2) IP 制限(社内/許可 CIDR のみ管理用エンドポイント許可) -->
<ip-filter action="forbid">
<address-range from="203.0.113.0" to="203.0.113.255" />
<address>198.51.100.10</address>
</ip-filter>
<!-- 3) JSON スキーマ検証(禁止フィールドを拒否) -->
<validate-content unspecified-content-type-action="prevent" max-size="1048576">
<content type="application/json" validate-as="json" action="prevent">
{
"$schema":"http://json-schema.org/draft-07/schema#",
"type":"object",
"properties":{
"email":{"type":"string","format":"email"},
"ssn":{"not":{}}
},
"not":{"required":["ssn"]} // ssn 禁止
}
</content>
</validate-content>
<!-- 4) Backend 呼び出し用 OAuth2(Client Credentials) -->
<send-request mode="new" response-variable-name="tokenResponse" timeout="10"
ignore-error="false">
<set-url>https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/token</set-url>
<set-method>POST</set-method>
<set-header name="Content-Type" exists-action="override">
<value>application/x-www-form-urlencoded</value>
</set-header>
<set-body>@{
return "client_id=" + context.Variables.GetValueOrDefault("oauth-client-id") +
"&client_secret=" + context.Variables.GetValueOrDefault("oauth-client-secret") +
"&grant_type=client_credentials&scope=<saas-scope-uri>/.default";
}</set-body>
</send-request>
<set-variable name="accessToken" value="@{
var tr = (IResponse)context.Variables["tokenResponse"];
return ((IJsonDocument)tr.Body.As<JObject>()).Select("$.access_token").ToString();
}" />
<!-- 5) Functions(社内)へ中継、以降は Functions 側が SaaS へ Egress -->
<set-backend-service base-url="https://func-prd-core.azurewebsites.net/api/report"/>
<set-header name="Authorization" exists-action="override">
<value>@("Bearer " + (string)context.Variables["accessToken"])</value>
</set-header>
<base />
</inbound>
<backend><base /></backend>
<outbound><base /></outbound>
<on-error>
<return-response>
<set-status code="429" reason="Too Many Requests" />
</return-response>
</on-error>
</policies>
注意
oauth-client-id/secret は APIM Named Value → Key Vault 参照で持ち、人手で見えない。
PII 禁止キーを JSON スキーマで早期拒否。複雑な検査は Functions に委譲。
APIM から直接 SaaS へ出さず、Functions(固定イグレス)から外部へ出すのが堅牢。
3.3 Functions/Logic Apps(外部到達・固定イグレス)
Functions(.NET / Node いずれも可)
マネージド ID(User-assigned MI 可)で Key Vault から資格情報を取得。
VNet 統合+Azure Firewall/NAT Gateway を次ホップに設定。SaaS 側 IP AllowListはFirewall/NAT のグローバル IPを登録。
構成パラメータ(例)
FUNCTIONS_EXTENSION_VERSION=~4
WEBSITE_RUN_FROM_PACKAGE=1
WEBSITE_VNET_ROUTE_ALL=1(すべてのアウトバウンドを VNet 経由)
AZFW_OUTBOUND_IP=203.0.113.45(SaaS へ提示する固定 IP ※設計情報)
擬似コード(資格情報→SaaS 呼び出し)
var kvClient = new SecretClient(new Uri("https://kv-prd-core.vault.azure.net/"),
new DefaultAzureCredential()); // MI
var clientId = (await kvClient.GetSecretAsync("saas-client-id")).Value.Value;
var clientSecret = (await kvClient.GetSecretAsync("saas-client-secret")).Value.Value;
var token = await GetTokenAsync(clientId, clientSecret, "<scope>");
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var res = await http.PostAsync("https://api.saas.com/v1/generateReport", content);
3.4 ネットワーク・境界
VNet 統合:Functions/Logic Apps Standard(シングルテナント)は Subnet 統合でアウトバウンドを Firewall/NAT GW に誘導。
UDR:0.0.0.0/0 → Virtual appliance (Firewall) を Subnet に適用。
Firewall ルール:宛先 FQDN(api.saas.com)の HTTPS(443) 以外を拒否。
mTLS:SaaS が対応するならクライアント証明書(Key Vault 証明書ストア+ Functions ハンドラー)で相互認証。
DNS:Private Resolver/Conditional Forwarding で名前解決の抜け道を抑止。
3.5 資格情報・鍵管理(Key Vault)
SKU: Premium(HSM)/RBAC 管理/firewall + private endpoint
Secret/Cert:saas-client-id / saas-client-secret / apim-tls-cert
アクセス:Functions/Logic Apps/APIM は MI、人手は PIM(JIT)
診断ログ:AuditEvent を Log Analytics + Immutable Storage にエクスポート、**“誰が何を読んだか”**を長期保管。
3.6 ログ・監査・検知(Monitor / Sentinel)
APIM:ApiManagementGatewayLogs / ApiManagementGatewayRequests を収集
Functions:FunctionAppLogs、パラメータは送出件数・エラー率のみ記録(個人データはログに残さない)
KQL 例:外部送出のスパイク検知
ApiManagementGatewayLogs
| where TimeGenerated > ago(1h)
| summarize ops=count() by OperationName, bin(TimeGenerated, 5m)
| where ops > 1000
Sentinel:アラート「大量リクエスト」「不正 IP」→ PlaybookでKey/Token 失効・NSG 一時遮断・Teams 通知を自動化。
3.7 Azure Marketplace アプリのセキュリティ検証
検証サブスクリプションでデプロイ→**脆弱性(Defender for Cloud)と要求権限(Permissions)**をレビュー。
ネットワーク:Private Link/Service Endpoint が取れるか、Public のみならFirewall 経由 + AllowListの可否を確認。
アイデンティティ:Enterprise App(サービスプリンシパル)の必要最小権限のみ許可。Admin consent は申請フロー必須。
運用:自動アップデートの可否、ログ種別と送信先(LA/Event Hub)を確認。
4. 手順書テンプレ(サンプル)
手順 A:要件整理とデータ設計
送信項目:user_id(GUID)、usage_metrics(非特定化済み)
禁止項目:email/name/address/phone(APIM JSON スキーマで拒否)
送信頻度:毎朝 08:00 JST(Logic Apps スケジュール)
手順 B:APIM 中継
apim-customerreport-prd 作成 → Custom Domain/TLS 設定(Key Vault)
Inbound に RateLimit=50/min、PII スキーマ拒否、OAuth2 を適用
Backend は Functions(/api/report)
手順 C:OAuth2(Client Credentials)
Entra ID App 登録 or SaaS 側クライアント発行
client_id/secret を Key Vault へ格納、APIM Named Values(Key Vault 参照)で利用
手順 D:固定イグレス
Functions(Premium/Elastic/Isolated いずれか)を VNet 統合
Subnet に UDR(0/0 → Firewall)
Firewall で api.thirdparty.com:443 のみ許可、他は拒否。SaaS 側は固定 IP を AllowList
手順 E:監査・運用
Diagnostic settings:APIM/Functions/Key Vault → LA + Storage(Immutable)
Sentinel 解析ルール:大量送信、トークン読み出し過多、接続失敗スパイク
Playbook:Key ローテ/Token 失効/NSG ブロック/チケット起票
5. 個人情報保護の実装ポイント
送信前の不可逆化:HMAC + ペッパー/トークン化(再識別は PIM 承認付き JIT のみ)
ログ無害化:リクエスト/レスポンス本文は原則非記録。必要時はサンプリング+マスク。
鍵のライフサイクル:12 か月以内のローテ、失効試験(Blue/Green 資格情報)
テスト分離:Dev/Test はダミーデータのみ。本番データの流出経路が 1 本でもない状態で昇格させない。
越境の可視化:SaaS のリージョン/サブプロセッサを台帳管理。GRS/ASR など二次複製の把握も Evidence 化。
6. IaC スニペット(Bicep 抜粋・概念)
param location string = 'japaneast'
param kvName string
param apimName string
param lawName string
resource kv 'Microsoft.KeyVault/vaults@2023-07-01' = {
name: kvName
location: location
properties:{
enableRbacAuthorization: true
enablePurgeProtection: true
sku:{ name:'Premium', family:'A' }
networkAcls:{
defaultAction:'Deny'
bypass:'AzureServices'
ipRules:[]
virtualNetworkRules:[ /* Private Endpoint */ ]
}
}
}
resource apim 'Microsoft.ApiManagement/service@2023-03-01-preview' = {
name: apimName
location: location
sku:{ name:'Standard', capacity:2 }
properties:{
publisherEmail:'sec@example.com'
publisherName:'Example'
virtualNetworkType:'External' // Premium なら Internal
certificates:[
{
storeName:'Managed'
encodedCertificate: '...' // Key Vault 連携でも可
}
]
}
}
resource diag 'Microsoft.Insights/diagnosticSettings@2021-05-01-preview' = {
name: 'apim-to-law'
scope: apim
properties:{
workspaceId: resourceId('Microsoft.OperationalInsights/workspaces', lawName)
logs:[
{ category:'GatewayLogs', enabled:true },
{ category:'GatewayRequests', enabled:true }
]
}
}
7. よくある落とし穴(と回避策)
APIM から外部へ直接 Egress:固定 IPが出せず SaaS 側 AllowList に載らないことがある ⇒ APIM→Functions→SaaS パターンで固定化。
Key/Secret を AppSettings に生置き:Key Vault(MI)に移行、PIMで運用者をJIT化。
Public Endpoint のまま運用:Private Link/Service Endpoint に切替、Firewall で強制経路。
Marketplace アプリの“権限広すぎ”:最小権限で拒否、必要 API のみ再要求させる。
テストで本番データ:不可逆化ダミーを作り、昇格前に漏れなく検証。
ログに個人データ:本文記録しない設計、必要時は正規表現マスク+短期 Hot→長期はメタのみ。
8. 山崎行政書士事務所のご支援(PR)
技術(APIM/Functions/Firewall/Key Vault/Monitor)× 法務(DPA/再委託/SCC/台帳)を一つの設計/証跡パックに束ね、サードパーティ連携のリスク極小化を実現します。
ブループリント導入:APIM ポリシー群/固定イグレス設計/KQL & Playbook/IaC テンプレ。
契約・台帳整備:DPA/再委託条項と実装可否の整合、データ流通図・鍵台帳・越境管理の Evidence 化。
演習/監査:年 2 回の侵害シナリオ演習、監査同席、改善サイクルの定着。
参照リンク集
API Management(ポリシー・Key Vault 連携・セキュリティ)https://learn.microsoft.com/azure/api-management/api-management-policieshttps://learn.microsoft.com/azure/api-management/api-management-howto-propertieshttps://learn.microsoft.com/azure/api-management/api-management-key-vaulthttps://learn.microsoft.com/azure/api-management/api-management-howto-oauth2
Functions / Logic Apps(VNet・MI・固定イグレス)https://learn.microsoft.com/azure/azure-functions/functions-networking-optionshttps://learn.microsoft.com/azure/logic-apps/logic-apps-overviewhttps://learn.microsoft.com/azure/azure-functions/functions-identity-managed
ネットワーク(Firewall/NAT Gateway/UDR/Private Link)https://learn.microsoft.com/azure/firewall/overviewhttps://learn.microsoft.com/azure/nat-gateway/nat-overviewhttps://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overviewhttps://learn.microsoft.com/azure/private-link/private-link-overview
Key Vault(RBAC/HSM/診断ログ)https://learn.microsoft.com/azure/key-vault/general/overviewhttps://learn.microsoft.com/azure/key-vault/general/rbac-guidehttps://learn.microsoft.com/azure/key-vault/general/logging
Monitor / Sentinel(ログ・検知・SOAR)https://learn.microsoft.com/azure/azure-monitor/https://learn.microsoft.com/azure/sentinel/
Azure Marketplace(セキュリティ・認証)https://learn.microsoft.com/azure/marketplace/azure-marketplace-overviewhttps://learn.microsoft.com/azure/marketplace/marketplace-security
Data Factory / Synapse(データ変換・パイプライン)https://learn.microsoft.com/azure/data-factory/data-flow-overviewhttps://learn.microsoft.com/azure/synapse-analytics/data-integration/data-flow-overview
Microsoft Cloud Security Benchmark / セキュリティ基準https://learn.microsoft.com/security/benchmark/azure/overview





コメント