第11章: プライバシー保護技術

この章を読む理由

第10章では、DB/APIから取得したデータを source_datasetreference_versionanalysis_runapi_request_log と結び付け、後から取得元・処理条件・更新履歴を説明できるようにしました。第11章では、その同じメタデータを、アクセス権、同意・利用目的、監査ログ、匿名化 / 仮名化の設計へ接続します。

プライバシー保護は、解析が終わった後に暗号や匿名化を追加する作業ではありません。どのデータを、誰が、どの目的で、いつまで、どの粒度で見られるかを、保存時点から記録する設計です。本章の例は研究・教育用途の概念整理であり、実データや医療データを扱う場合は所属機関の規程、倫理審査、法務・専門家レビューに従う必要があります。

学習目標

  • 第10章の source_datasetreference_version / checksum、analysis_runapi_request_log を、権限・同意・監査ログの設計入力として説明できる
  • 暗号、差分プライバシー、匿名化 / 仮名化を、対象データと公開範囲に応じて比較できる
  • 研究・教育用途の解析と、個人データ・医療データを扱う運用の責任境界を区別できる
  • 日本の個人情報保護、研究倫理、NBDCヒトデータベース、次世代医療基盤法を、設計時に確認すべき一次情報として位置づけられる

第10章から引き継ぐ監査メタデータ

第10章の成果物 第11章で確認すること 監査・権限設計で残す項目
source_dataset 取得元、利用条件、公開範囲、二次利用の可否 source_dataset_id(snapshot単位で固定したID)、利用目的、利用条件、承認者、保持期間
analysis_run 誰が、どの目的で、どの処理を実行したか 実行者、実行日時、承認ID、入力snapshot、出力先
api_request_log 外部APIへの問い合わせ内容と再取得条件 endpoint、query摘要、HTTP status、認証方式 / key ID、retry / cache 方針
reference_version / checksum 参照配列・DB release・派生物の再現性 version、checksum、検証日時、差分確認結果
curated data mart 解析者が見られる列・行・集計粒度 role、access policy、匿名化 / 仮名化対象、監査ログID

監査ログには認証トークン、API key、パスワード、個人識別につながるquery文字列をそのまま保存しません。必要な場合は、認証方式やkey ID、マスク済み値、ハッシュ化した照合値、個人識別情報や医療情報を除去したquery摘要だけを残します。

threat model / access control / audit log の最小設計

暗号、差分プライバシー、匿名化 / 仮名化を選ぶ前に、何から守るのかを短い threat model / 脅威モデルとして書き出します。攻撃者を過度に抽象化すると対策を選べないため、少なくとも内部利用者、外部API、公開レポート、再解析時の運用者を分けて考えます。

確認項目 設計時の問い 残す証跡
利用目的 研究・教育・検証・公開のどれか。目的外利用をどう検知するか 利用目的、承認ID、承認者、保持期間
権限ロール 解析者、管理者、監査担当者、閲覧のみの利用者をどう分けるか role、access policy、権限変更履歴
データ粒度 row-level、列単位、集計値、公開図表のどこまで見せるか 公開範囲、匿名化 / 仮名化対象列、抑制条件
監査ログ 誰が、いつ、どのsnapshotに、どの処理を行ったか 実行者、実行日時、analysis_run、入力snapshot、出力先
例外対応 緊急アクセス、再解析、削除依頼、鍵・対応表の紛失時にどう扱うか 例外承認、復旧手順、事後レビュー結果

この表は、実データ向けの法務判断やセキュリティ設計を代替しません。本文の例では、研究・教育用途の小さな確認表として、次の節で扱う暗号学的手法、差分プライバシー、匿名化 / 仮名化を選ぶ前の前提をそろえるために使います。

日本の制度・ガイドラインを読むときの責任境界

日本の制度や研究データ共有ルールは、用語が似ていても適用範囲と義務が異なります。本書は法令解釈を代替しません。ここでは、研究・教育用途の設計表に「どの一次情報を確認したか」を残すための整理に限定します。実データや医療データを扱う場合は、その時点で有効な法令・指針、所属機関の倫理審査、法務・情報セキュリティ担当者の判断に従います。

確認対象 本書での扱い 設計時に残す記録
個人情報保護法の用語 個人情報、要配慮個人情報、個人識別符号、仮名加工情報、匿名加工情報は義務が異なる用語として扱う。ゲノムデータや診療情報は、内容によって個人識別符号や要配慮個人情報に該当し得る123 データ区分、分類理由、確認したガイドライン名、参照日、同意または利用根拠
研究倫理指針 人を対象とする生命科学・医学系研究では、研究計画、同意、倫理審査、個人情報の扱いを研究手順と分けて管理しない。旧来のヒトゲノム研究指針・医学系研究指針は統合後の指針を確認する4 研究計画書version、倫理審査承認ID、同意説明文書version、二次利用・共有可否
NBDCヒトデータベース データ種別により非制限公開、登録者公開、制限公開などのアクセスレベルが分かれ、制限公開データでは審査とセキュリティレベルに応じた対策を確認する56 dataset ID、アクセスレベル、利用申請ID、承認期間、利用者一覧、データサーバ台帳、セキュリティレベル
次世代医療基盤法 医療情報を研究開発に利活用するための認定事業者・認定利活用者の枠組みとして扱い、通常の研究解析や院内利用と混同しない。2024年4月施行の改正では、仮名加工医療情報の作成・提供などが追加された7 適用有無、認定作成事業者・認定利活用者、提供通知・契約、利用目的、データ種別、禁止事項

この表は「このデータは使ってよい」と判断するためのものではなく、判断に必要な情報の抜けを見つけるためのものです。公開データや合成データだけを使う教育例でも、実データに見える列名、患者数、希少variant / 変異、施設名、取得日を含める場合は、再識別リスクと利用条件を確認します。

secure enclave / federated analysis / encryption の位置づけ

保護技術は単独で選ぶのではなく、データを移動するか、計算をどこで行うか、鍵やログを誰が管理するかで組み合わせます。ここでは製品名やクラウド固有機能ではなく、設計時に確認すべき責任境界として整理します。

選択肢 使いどころ 限界・注意点 設計時に残す記録
encryption at rest 保存中のファイル、DB、backup、object storageを保護したい場合 復号権限を持つ利用者や実行環境の操作は別途制御する key ID、鍵管理者、rotation方針、対象保存先
encryption in transit API、DB接続、ファイル転送、ワークフロー間通信を保護したい場合 endpoint設定、証明書、proxy、再試行時ログの扱いを確認する 通信経路、TLS設定、接続先、失敗時ログ
secure enclave / confidential computing 運用者や基盤管理者からも計算中データを分離したい場合 対応できる処理、性能、attestation、入出力の扱いを事前検証する 実行環境、attestation結果、入力snapshot、出力先
federated analysis データを各機関・各DBに置いたまま集計やモデル更新を行いたい場合 参加者間の契約、schema差、通信失敗、更新値からの情報漏えいを設計する 参加主体、共有する統計量、round数、監査ログID

研究・教育用途の小さな例では、暗号化やfederated analysisを実装したことにせず、どの方式を候補にし、どの前提が未確認かを明記します。実データで採用する場合は、鍵管理、権限分離、監査ログ、障害時対応、専門家レビューを同じ設計書で扱います。

11.1 暗号学的手法

準同型暗号:

  • 暗号化状態のまま、特定の演算を行うための暗号技術
  • 加法準同型や乗法準同型など、扱える演算は方式・パラメータ・実装に依存する
  • 応用候補: 集計、照合、限定された統計量の計算。ただし、通常の解析コードをそのまま暗号化状態で実行できるわけではない

秘密分散:

  • データや鍵を複数の断片に分割し、単一の保管先だけでは復元できないようにする
  • 閾値秘密分散では、必要数以上の断片を集めた場合だけ復元できる
  • 応用候補: 鍵管理、複数機関での共同保管、限定された共同計算。ただし、運用手順と監査が弱いと安全性は担保できない
手法 使いどころ 実務上の注意 設計時に残す記録
準同型暗号 生データを復号せずに一部の集計・照合を行いたい場合 対応できる演算、計算時間、近似誤差、鍵管理、実装検証を事前に確認する 対象演算、暗号方式、パラメータ、鍵管理責任者、性能測定結果
秘密分散 鍵やデータ断片を複数主体で管理したい場合 断片の保管場所、復元権限、紛失時対応、結託リスクを設計する 断片数、復元に必要な数、保管主体、復元承認手順、監査ログID

準同型暗号の概念例(SEAL系ライブラリを想定): 以下は暗号ライブラリ利用時の責任境界を示す Python 断片です。SEAL系ライブラリの導入、鍵管理、性能測定、運用検証を省略しているため、そのままでは実行できません。 🧪 概念例(実行不可: 暗号ライブラリ導入・鍵管理・運用検証を省略した Python 断片)

# 注:実運用には Microsoft SEAL 本体のビルド、または TenSEAL 等のPythonラッパー(wrapper)が必要です。
# 代表例:
# - Microsoft SEAL: C++実装(公式)
# - TenSEAL: PythonからCKKS等を利用(OS/コンパイラ要件あり)
# - PySEAL: 参考実装
# 本書のコードはAPI設計を説明する概念例であり、実行検証済み実装ではありません。

class HomomorphicWeightedSumBoundaryExample:
    """準同型暗号を使う場合の責任境界を示す概念例"""
    
    def __init__(self):
        """SEALコンテキストの初期化"""
        # 仮想的な実装(実際にはSEALライブラリを使用)
        self.context = self._setup_seal_context()
        
    def _setup_seal_context(self):
        """暗号パラメータの設定"""
        # 実際のSEAL実装の例
        """
        import seal
        
        parms = seal.EncryptionParameters(seal.scheme_type.ckks)
        poly_modulus_degree = 8192
        parms.set_poly_modulus_degree(poly_modulus_degree)
        parms.set_coeff_modulus(seal.CoeffModulus.Create(
            poly_modulus_degree, [60, 40, 40, 60]))
        
        scale = 2.0**40
        
        context = seal.SEALContext(parms)
        return context
        """
        return None  # デモ用
    
    def encrypt_genotype(self, genotype_vector):
        """
        ジェノタイプデータの暗号化
        
        Args:
            genotype_vector: SNPデータ(0,1,2の配列)
        
        Returns:
            暗号化されたデータ
        """
        # 実際の暗号化処理
        # encrypted = []
        # for value in genotype_vector:
        #     ciphertext = self.encryptor.encrypt(self.encoder.encode(value))
        #     encrypted.append(ciphertext)
        
        # デモ用の仮想実装: 後続の zip(encrypted_genotype, weights) と
        # 形をそろえるため、暗号文プレースホルダーの配列として返す。
        return [
            {'encrypted': True, 'index': index, 'placeholder_value': value}
            for index, value in enumerate(genotype_vector)
        ]
    
    def compute_weighted_sum_encrypted(self, encrypted_genotype, weights):
        """
        暗号化状態での教育用の重み付き集計
        
        Args:
            encrypted_genotype: 暗号化されたジェノタイプ
            weights: 各SNPに対応する重み(平文)
        
        Returns:
            暗号化された集計値
        """
        # 準同型演算の例
        # encrypted_sum = sum(encrypted_g * w for encrypted_g, w in zip(encrypted_genotype, weights))
        
        return {'encrypted_sum': True, 'computation': 'homomorphic'}

データ活用とプライバシーの両立: ゲノムデータは本人だけでなく血縁者や集団に関する情報も含み得るため、単に暗号化するだけでは十分ではありません。準同型暗号や秘密分散は、同意、利用目的、アクセス制御、監査ログ、匿名化 / 仮名化と組み合わせる選択肢です。採用前には、対象演算、性能、鍵管理、復元権限、障害時対応、専門家レビューの要否を明確にし、概念検証と本番運用を分けて評価します。

11.2 差分プライバシー

定義: ε-差分プライバシーは、1個のレコードの有無によって、公開される集計結果の分布が大きく変わりすぎないように制御する枠組みです。保証の対象は「定義したクエリ、機構、privacy budget、前処理・後処理の範囲」に限られ、元データの安全管理、同意、アクセス制御、監査ログを置き換えるものではありません。

実装手法:

  • ラプラス機構: 数値クエリにノイズ付加
  • 指数機構: 非数値クエリの確率的選択
  • 応用候補: 十分な集団サイズがある統計量の公開、頻度表、集計レポート
設計項目 確認すること 記録すること
epsilon / privacy budget 小さい値ほどノイズが増え、有用性が下がる。複数回公開ではbudget消費が積み上がる epsilon、公開回数、budgetの配分理由
感度 1レコードの変更が集計値に与える最大影響を、クエリごとに定義する 対象クエリ、感度、前処理条件
集団サイズ 小さい集団や希少variant / 変異では、ノイズ後の値が解釈困難になりやすい 最小集団サイズ、抑制条件、公開可否判断
後処理 クリップ、丸め、抑制、しきい値処理で見かけの値が変わる 後処理ルール、乱数seedの扱い、監査ログID

差分プライバシーの概念例: 以下は差分プライバシーの集計公開で検討する処理境界を示す Python 断片です。入力データ、privacy budget 設計、公開抑制条件、乱数管理を省略しているため、そのままでは検証済みの公開処理として利用できません。 🧪 概念例(実行不可: 入力データ・privacy budget 設計・公開判定を省略した Python 断片)

import numpy as np

class DifferentialPrivacyAlleleFrequencyExample:
    """差分プライバシーで公開する集計値の責任境界を示す概念例"""
    
    def __init__(self, epsilon=1.0):
        """
        Args:
            epsilon: プライバシーパラメータ(小さいほど強い保護)
        """
        self.epsilon = epsilon
        
    def laplace_mechanism(self, true_value, sensitivity):
        """
        ラプラス機構によるノイズ付加
        
        Args:
            true_value: 真の値
            sensitivity: 感度(1レコード変更の最大影響)
        
        Returns:
            ノイズ付加された値
        """
        scale = sensitivity / self.epsilon
        noise = np.random.laplace(0, scale)
        return true_value + noise
    
    def private_allele_frequency(self, genotypes):
        """
        アレル頻度にノイズを加える概念例
        
        Args:
            genotypes: ジェノタイプデータ(0,1,2)
        
        Returns:
            ノイズ付加と後処理を行ったアレル頻度
        """
        # アレル数のカウント
        allele_count = np.sum(genotypes)
        total_alleles = len(genotypes) * 2
        
        # 感度:1人の変更で最大2アレル変化
        sensitivity = 2.0 / total_alleles
        
        # 真の頻度
        true_frequency = allele_count / total_alleles
        
        # ノイズ付加
        private_frequency = self.laplace_mechanism(true_frequency, sensitivity)
        
        # [0,1]の範囲にクリップ
        return np.clip(private_frequency, 0, 1)

科学的厳密性の確保: 差分プライバシーは、定義した集計公開に対して数学的に扱える保護水準を与える一方、値の有用性、説明可能性、反復公開時のbudget管理に制約があります。「理論的に安全」と断定するのではなく、どのクエリに、どの epsilon を、何回まで使い、どの結果を公開しないかを事前に決めます。研究・教育用途でも、希少variant / 変異や小集団の集計では、公開抑制、丸め、専門家レビューを組み合わせて判断します。

11.3 匿名化技術

匿名化 / 仮名化は、データを公開できる状態へ自動的に変える魔法ではありません。氏名やIDを削除しても、年齢、性別、地域、疾患、希少variant / 変異、受診時期などを組み合わせると再識別リスクが残ります。第10章の source_dataset と curated data mart の列設計に戻り、どの列を削除、一般化、丸め、集計、抑制するかを明示します。

k-匿名性:

  • 同一の準識別子を持つレコードをk個以上確保
  • 限界: 同質性攻撃、背景知識攻撃、希少な組み合わせへの弱さ

l-多様性:

  • 各等価クラス内でセンシティブ属性をl種類以上確保
  • 限界: 属性分布が偏っている場合や、値の近さに意味がある場合は十分でない

t-近似性:

  • 等価クラス内外でのセンシティブ属性分布の差を一定範囲に抑える考え方
  • 限界: 分布差の定義、しきい値、データ有用性の低下を事前に検討する必要がある
操作 主な目的 注意点 記録する項目
削除 直接識別子や不要な詳細列を外す 派生列やログに同じ情報が残らないか確認する 削除列、削除理由、確認者
一般化 / 丸め 年齢、日付、地域などの粒度を粗くする 粒度を粗くしすぎると解析目的を満たせない 変換前後の粒度、適用ルール
抑制 小さいセル、希少カテゴリ、外れ値を公開しない 抑制した事実自体が情報になる場合がある 抑制条件、対象件数、公開可否判断
仮名化 内部追跡用IDと直接識別子を分離する 対応表や鍵の管理が弱いと再識別リスクが残る 対応表の保管先、アクセス権、監査ログID

実用的データ活用の基盤: 匿名化 / 仮名化の判断は、解析目的、公開範囲、攻撃者が持ち得る背景知識、データの希少性、再利用条件によって変わります。本書の例では、研究・教育用途の確認表として、対象列、変換ルール、残る再識別リスク、公開しない項目、専門家レビューが必要な条件を残します。実データや医療データを扱う場合は、所属機関の規程、倫理審査、法務・セキュリティ担当者のレビューに従います。

Source notes / 次の一歩

最小入出力(期待成果物/期待ログ)

  • 入力: 扱うデータの範囲(合成データ推奨)、source_datasetreference_version / checksum、analysis_runapi_request_log、想定する攻撃モデル、利用目的、公開範囲、権限ロール
  • 出力(期待成果物): 制度・ガイドライン確認表、保護手法の選定(暗号/差分プライバシー/匿名化)、主要パラメータ(例: ε, k)、匿名化 / 仮名化対象列、access policy、リスク評価メモ
  • 期待ログ(例): パラメータ・前提・乱数シード、承認ID、実行者、実行日時、入力snapshot、reference_version / checksum、検証日時、出力先、アクセス判定結果が記録され、同条件で再現できる(概念例のみの場合は「実装なし」を明記)

前へ: データベース技術 目次 次へ: 臨床応用システム

演習

  1. source_datasetreference_version / checksum、analysis_runapi_request_log を入力に、研究・教育用途の解析で必要な権限ロール、承認ID、保持期間、監査ログ項目を設計せよ。
  2. 実データを扱わない教育例であっても、個人情報保護、研究倫理、NBDC、次世代医療基盤法のどれを「対象外」「要確認」「適用可能性あり」とするかを確認表にまとめよ。
  3. 暗号、差分プライバシー、匿名化 / 仮名化のいずれかを選び、選定理由、主要パラメータ、残るリスク、専門家レビューが必要な条件を整理せよ。

具体課題例

  • TCGA-LUAD の研究用データマートを例に、解析者、管理者、監査担当者が見られる列と操作を分ける。
  • api_request_log に残る endpoint / query / HTTP status を、公開レポートに出してよい項目と内部監査だけに残す項目へ分類する。
  • 匿名化 / 仮名化対象列、access policy、承認ID、実行ログ、出力先、削除・保持期間を1枚の確認表にまとめる。
  1. 個人情報保護委員会, 個人情報の保護に関する法律についてのガイドライン(通則編)(参照日: 2026-05-13 JST) 

  2. 個人情報保護委員会, 「医療・介護関係事業者における個人情報の適切な取扱いのためのガイダンス」に関するQ&A(事例集)(参照日: 2026-05-13 JST) 

  3. 個人情報保護委員会, 個人情報の保護に関する法律についてのガイドライン(仮名加工情報・匿名加工情報編)(参照日: 2026-05-13 JST) 

  4. 文部科学省, 人を対象とする生命科学・医学系研究(参照日: 2026-05-13 JST) 

  5. NBDCヒトデータベース, NBDCヒトデータ共有ガイドライン(参照日: 2026-05-13 JST) 

  6. NBDCヒトデータベース, NBDCヒトデータ取扱いセキュリティガイドライン(データ利用者向け)(参照日: 2026-05-13 JST) 

  7. 内閣府, 1人のデータ、みんなの健康、次世代法(参照日: 2026-05-13 JST)