consent-record-keeping について
GDPRに準拠した同意記録の設計を支援するスキルです。プライバシーやデータガバナンスの担当者向けに、記録項目、不変ストレージ、Kantaraの機械可読レシート形式を扱います。
主な機能
- 01必須・推奨の記録項目
- 02追記型ストレージとハッシュチェーン
- 03Kantaraレシート形式の解説
- 04データベースと監査クエリの例
活用シーン
- 01同意記録データベースのスキーマ設計
- 02同意記録の完全性確認
- 03指定時点の同意状態の再構成
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mukul975/ privacy-data-protection-skills --skill consent-record-keepingインストール後、Claude Code で/consent-record-keepingを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/template.mdreferences/standards.mdworkflows.mdscripts/process.py詳細
同意記録の構築
概要
GDPR 第 7 条(1)には、次のように記載されています。「処理が同意に基づく場合、管理者は、データ主体が個人データの処理に同意したことを証明できなければならない。」同意を証明するこの義務を果たすには、同意の決定だけでなく、その決定が行われた状況も記録する包括的な記録管理が必要です。
Kantara Initiative Consent Receipt Specification(v1.1)は、規制上の要件を満たし、相互運用性を実現する、同意レシートの標準化された機械可読形式を提供します。
必須の記録フィールド
EDPB Guidelines 05/2020(段落 89~107)によると、同意を証明するには、次の証拠を保持する必要があります。
中核フィールド(必須)
| フィールド | 説明 | GDPR 参照 | 形式 |
|---|---|---|---|
| consent_id | この同意決定の一意識別子 | Art. 7(1) | UUID v4 |
| subject_id | データ主体の識別子 | Art. 7(1) | UUID v4 |
| purpose_id | 処理目的の識別子 | Art. 6(1)(a) | 目的コード |
| purpose_description | 目的の平易な言葉による説明 | Art. 13(1)(c) | テキスト |
| decision | 同意の付与または非付与 | Art. 7(1) | Enum: granted, not_granted |
| timestamp | 決定が行われた日時 | Art. 7(1) | ISO 8601 UTC |
| mechanism | 同意の表明方法 | Art. 4(11) | Enum: checkbox_tick, toggle_switch, typed_statement, signature |
| consent_text_version | 提示された同意文の正確なハッシュ | Art. 7(1) | SHA-256 hex |
| consent_text | データ主体に提示された正確な文面 | Art. 7(2) | 全文 |
| controller_name | データ管理者の正式名称 | Art. 13(1)(a) | テキスト |
| controller_contact | 管理者の連絡先情報 | Art. 13(1)(a) | テキスト |
コンテキストフィールド(推奨)
| フィールド | 説明 | GDPR 参照 | 形式 |
|---|---|---|---|
| ip_address | 同意時の IP アドレス | Art. 7(1) proof | IPv4/IPv6 |
| user_agent | ブラウザー/デバイスのユーザーエージェント文字列 | Art. 7(1) proof | テキスト |
| session_id | セッション識別子 | Art. 7(1) proof | UUID |
| source | 同意を収集した場所 | Art. 7(1) proof | Enum: signup, preference_center, cookie_banner |
| data_categories | この目的で扱う個人データのカテゴリ | Art. 13(1)(d) | JSON array |
| recipients | 名前が明示された第三者の受領者 | Art. 13(1)(e) | JSON array |
| retention_period | この目的でデータを保持する期間 | Art. 13(2)(a) | テキスト |
| withdrawal_info | 同意を撤回する手順 | Art. 7(3) | テキスト |
| dpo_contact | DPO の連絡先情報 | Art. 13(1)(b) | テキスト |
不変性の要件
同意記録は不変でなければなりません。同意の決定を記録した後は、変更できません。これを実現するには、次のことが必要です。
- 追記専用ストレージ:追記専用のデータベーステーブルまたは不変のログストアを使用します。同意記録に対して UPDATE や DELETE を実行してはいけません。
- 整合性ハッシュ:各記録に、その内容の SHA-256 ハッシュを含めます。改ざんがあれば検出できます。
- チェーンハッシュ:各記録のハッシュに前の記録のハッシュを含め、検証可能なチェーンを作成します(分散台帳のオーバーヘッドを伴わない、ブロックチェーンの概念に類似した方式です)。
- タイムスタンプの完全性:改ざんを防ぐため、タイムスタンプはクライアントから提供された値ではなく、サーバー側で生成します。
Kantara Initiative Consent Receipt 形式
Kantara Initiative Consent Receipt Specification v1.1 は、JSON 形式を定義しています。
{
"version": "KI-CR-v1.1.0",
"jurisdiction": "EU/GDPR",
"consentTimestamp": "2026-03-14T10:30:00Z",
"collectionMethod": "web form with unticked checkboxes",
"consentReceiptID": "cr_7f3a9b2e-41d8-4c76-b5e3-9a8d1c2f4e60",
"publicKey": "cloudvault-saas-public-key-fingerprint",
"language": "en",
"piiPrincipalId": "usr_7f3a9b2e-41d8-4c76-b5e3-9a8d1c2f4e60",
"piiControllers": [
{
"piiController": "CloudVault SaaS Inc.",
"onBehalf": false,
"contact": "42 Innovation Drive, Dublin, D02 YX88, Ireland",
"phone": "+353-1-555-0142",
"email": "[email protected]",
"piiControllerUrl": "https://cloudvault-saas.eu"
}
],
"policyUrl": "https://cloudvault-saas.eu/privacy-policy",
"services": [
{
"service": "CloudVault Cloud Storage",
"purposes": [
{
"purpose": "Service Improvement Analytics",
"purposeCategory": ["core function"],
"consentType": "explicit",
"piiCategory": ["file_metadata", "access_frequency", "storage_patterns"],
"primaryPurpose": true,
"termination": "https://app.cloudvault-saas.eu/settings/privacy",
"thirdPartyDisclosure": false
}
]
}
],
"sensitive": false,
"spiCat": []
}
データベーススキーマ
-- Consent records table (append-only, never UPDATE or DELETE)
CREATE TABLE consent_records (
consent_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
subject_id UUID NOT NULL,
purpose_id VARCHAR(128) NOT NULL,
purpose_description TEXT NOT NULL,
decision VARCHAR(16) NOT NULL CHECK (decision IN ('granted', 'not_granted', 'withdrawn')),
mechanism VARCHAR(64) NOT NULL,
consent_text_version CHAR(64) NOT NULL,
timestamp_utc TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
ip_address INET,
user_agent TEXT,
session_id UUID,
source VARCHAR(64) NOT NULL,
controller_name VARCHAR(256) NOT NULL DEFAULT 'CloudVault SaaS Inc.',
record_hash CHAR(64) NOT NULL,
previous_hash CHAR(64),
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now()
);
-- Index for efficient lookups per subject
CREATE INDEX idx_consent_records_subject ON consent_records(subject_id, purpose_id, timestamp_utc DESC);
-- Consent text versions (immutable)
CREATE TABLE consent_text_versions (
version_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
purpose_id VARCHAR(128) NOT NULL,
consent_text TEXT NOT NULL,
text_hash CHAR(64) NOT NULL UNIQUE,
approved_by VARCHAR(256) NOT NULL,
effective_from TIMESTAMP WITH TIME ZONE NOT NULL,
effective_until TIMESTAMP WITH TIME ZONE,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now()
);
-- Prevent modifications to consent records
REVOKE UPDATE, DELETE ON consent_records FROM app_user;
REVOKE UPDATE, DELETE ON consent_text_versions FROM app_user;
監査クエリの例
ある時点における対象者の同意状態を再構築する:
SELECT DISTINCT ON (purpose_id)
purpose_id, decision, timestamp_utc, consent_text_version, mechanism, source
FROM consent_records
WHERE subject_id = 'usr_7f3a9b2e-41d8-4c76-b5e3-9a8d1c2f4e60'
AND timestamp_utc <= '2026-02-15T00:00:00Z'
ORDER BY purpose_id, timestamp_utc DESC;
記録チェーンの整合性を検証する:
SELECT consent_id, record_hash, previous_hash,
CASE WHEN LAG(record_hash) OVER (ORDER BY created_at) = previous_hash
THEN 'VALID' ELSE 'BROKEN'
END AS chain_status
FROM consent_records
WHERE subject_id = 'usr_7f3a9b2e-41d8-4c76-b5e3-9a8d1c2f4e60'
ORDER BY created_at;
主要な規制関連資料
- GDPR 第7条第1項 — 管理者は同意を証明できなければなりません
- GDPR 第7条第2項 — 同意文の要件(明確で平易な言葉を使用し、他の事項と区別できること)
- GDPR 第5条第2項 — 説明責任の原則
- GDPR 第30条 — 処理活動の記録(同意記録はその裏付けとなります)
- EDPB ガイドライン 05/2020 — 同意の証明に関する第89~107段落
- Kantara Initiative Consent Receipt Specification v1.1 — 機械可読なレシート形式
- ISO/IEC 29184:2020 — オンラインプライバシー通知と同意
コメント
Markdown 対応