mcpField
C
consent-record-keeping

consent-record-keeping

github.com/mukul975セキュリティ32339 回インストール32 週間前に更新
リポジトリ

consent-record-keeping について

GDPRに準拠した同意記録の設計を支援するスキルです。プライバシーやデータガバナンスの担当者向けに、記録項目、不変ストレージ、Kantaraの機械可読レシート形式を扱います。

主な機能

  1. 01必須・推奨の記録項目
  2. 02追記型ストレージとハッシュチェーン
  3. 03Kantaraレシート形式の解説
  4. 04データベースと監査クエリの例

活用シーン

  1. 01同意記録データベースのスキーマ設計
  2. 02同意記録の完全性確認
  3. 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.md
references/
standards.md
workflows.md
scripts/
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) proofIPv4/IPv6
user_agentブラウザー/デバイスのユーザーエージェント文字列Art. 7(1) proofテキスト
session_idセッション識別子Art. 7(1) proofUUID
source同意を収集した場所Art. 7(1) proofEnum: 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_contactDPO の連絡先情報Art. 13(1)(b)テキスト
不変性の要件

同意記録は不変でなければなりません。同意の決定を記録した後は、変更できません。これを実現するには、次のことが必要です。

  1. 追記専用ストレージ:追記専用のデータベーステーブルまたは不変のログストアを使用します。同意記録に対して UPDATE や DELETE を実行してはいけません。
  2. 整合性ハッシュ:各記録に、その内容の SHA-256 ハッシュを含めます。改ざんがあれば検出できます。
  3. チェーンハッシュ:各記録のハッシュに前の記録のハッシュを含め、検証可能なチェーンを作成します(分散台帳のオーバーヘッドを伴わない、ブロックチェーンの概念に類似した方式です)。
  4. タイムスタンプの完全性:改ざんを防ぐため、タイムスタンプはクライアントから提供された値ではなく、サーバー側で生成します。

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 — オンラインプライバシー通知と同意

コメント