コンピューティングのセキュリティに関する本を読んでいました1 データベースのセキュリティとプライバシーに関する質問がありました。答えがよくわからないので、ここで聞いてみようと思いました。
プライバシーを確保するための1つのアプローチは、小さな結果の拒否です。この場合、システムはクエリを拒否(結果を返さない)します。その結果は、たとえば5つのレコードから派生します。 6つのレコードから派生したクエリのみを使用して機密データを取得する方法を示します。
エンファシスが追加されました
1抜粋セキュリティのコンピューティングからコピー、Charles P. Pfleeger、Shari Lawrence Pfleeger
誰かが答えを手伝ってくれるなら、私はそれを感謝します。
この本が言っていることは、結果がほとんどないような特定のクエリを思い付くことができれば、データベース内の1つの特定のターゲットを識別できるということです。
たとえば、自動車ディーラーが顧客のデータベースを持っていて、郵便番号、メーカー、モデル、年、色、および給料のみを含めるようにデータベースを「匿名化」した場合、彼らが車を購入したことがわかっていれば、隣人の給与を見つけることができます。そのディーラーから。
たとえば、郵便番号でGreen 2012 Chevy Voltを所有するすべての人の給与を選択するクエリを実行できます。 20K、30K、40K、300Kの給与を示すレコードがほんの少ししか得られず、隣人が弁護士として成功していることがわかっている場合、彼の給与は300Kであると推測できます。
しかし、システムが100件未満の結果を表示することを拒否した場合、そのような結果セットのターゲットを見つけることは困難になります。
簡単な答え:
SQLクエリが許可されている場合は、最後にUNION SELECT myKnownRecordのような処理を行うことで、レコード数を人為的に増やすこともできます。
より一般的な答え:
この問題は、匿名化と呼ばれるより大きな戦略の一部です。 k匿名性の適用、集計、丸め、データのぼかしや粗調整などの他の方法が機能しない場合に、意図しない開示を回避する方法の1つは、小さなグループの結果を抑制することです。
範囲が小さくなるクエリを制限するこの方法が普遍的に機能しない最大の理由は、エントリ数が5未満の結果を確認しなくても、進行中の状況を完全に把握する方法が他にもたくさんあるためです。
異なる基準a、b、cがあるとします。セットAは、基準aに一致するすべてのレコードのセットであり、セットA∩Bは、基準aおよびb(SQL JOINまたは類似の操作に対応)に一致するすべてのレコードのセットなどです。
A∩B∩Cが、ターゲットのレコードを特定するのに十分に小さいセットであるとします(A∩B∩Cの要素は5つ未満です)。ただし、最小の記録基準により、A∩B∩Cを直接表示することは制限されています。ただし、A∩B、A∩C、およびA∩Bを表示し、それらの2つの和集合を手動で実行して、和集合を取得できます。 A∩B∩Cが必要です。ただし、これは、必要な結果が一意であることを前提としています。レコードが一意でない場合(たとえば、それらがレターグレード、収入カテゴリ、はい/いいえの回答、または返されたレコードに基づく平均である場合)、手動で結合することはできず、私は普遍的な方法を考えることができません正確な値を取得します。
ユニオン(外部結合)を使用して、この保護戦略を回避することもできます。ターゲットがセットAの数少ないメンバーの1つであることがわかっている場合(おそらくAの結果が非表示になっているため)、A U Cの集計結果を見ることができ、0%または100%に近い結果はすべてAのターゲットに適用されます。
この保護を回避できるもう1つの方法は、他の結果を使用して、希望する結果までの方法を差し引くことです。 160人中120人がAセットの合格点を持っていることがわかっていて、157人中120人がA∩Bの合格点を持っている場合、A∩B '(AではなくB)が少なすぎるために非表示になりますその結果、そのグループには誰も合格していないことがわかっています。これは、割合を積極的に丸めたり、割合をカテゴリにグループ化したりすることで( "<5%"または3%の代わりに3%)、各セットのエントリ数の開示を回避する場合、通常は回避できます。
例( 1つ から変更)を使用するには、学校が2010年に登録した男性のアメリカ人インディアン/アラスカ先住民の学生は1人だけであると開示しているとします。学校が卒業を開示している場合この人口統計の割合、個人のプライバシーが危険にさらされています。アメリカインディアン/アラスカ先住民の卒業率が0%である、または他のすべての人口統計が合計で卒業生の100%であるなど、補完的なグループを使用して生徒の全体像を取得できる場合、生徒のプライバシーも侵害される可能性があります。
コンテキストを提供するために、カーネギーメロンのL.スウィーニーは 研究 を結論付けました:「少数の特性の組み合わせが集団で組み合わされて、特定の個人を一意的またはほぼ一意的に識別することがわかりました。これらの個人に関するこのような情報は匿名と見なすべきではありません。ただし、健康やその他の個人固有のデータはこのフォームで公開されています。一般的なデータリリースにはさらに多くのフィールドが含まれていますが、3つの情報フィールドのみを使用したいくつかの驚くべき結果があります。 。郡レベルでも、{郡、性別、生年月日}は米国の人口の18%を一意に識別する可能性があります。一般的に、個人を一意に識別するために必要な特性はほとんどありません。」同様の個人識別と匿名化 証明済み 単純に匿名化されたクレジットカード取引のデータベース。したがって、「この性別、DOB、および地理的領域を持つすべてのレコード」または「これらの4つの店を最近訪れて約50ドルを費やした人々」などの単純なクエリでさえ、プライバシーを深刻に侵害する可能性があります。生年月日や市区町村などのこれらの種類のレコードは、データを匿名化するために組み合わせることができるため、HIPAA、FERPA、および同様の標準は、この情報のあらゆる種類の開示を厳密に制限するために書き込まれます。
要約すると、 CMUのAnupam Dattaが述べた のように、「ナイーブな匿名化メカニズムは機能しません。」
SQLクエリのみで選択すると、 この質問に対する提案を確認 できます。どちらの答えもほぼ同じです(JOIN
、タイプが指定されていない場合、デフォルトはINNER JOIN
ほとんどの場合 [〜#〜] rdbms [〜#〜] とにかく)。
ただし、これは最小限のレコード数で結果を生成するための非常に非効率的な方法です。フロントエンド生成コードで結果を表示する前に必要な数のレコードをチェックしてから、一致するレコードを一覧表示するか、非開示エラーメッセージを表示するかを決定する方がはるかに簡単ですが高速でもあります。
この新しい要件に対応するために既存のSQLクエリを変更する必要がないため、これは簡単です。集計結果セットへの内部リンクがないため、より速く、両方のケースを前に処理する必要があるため、より便利です。 -endとにかくコードを生成します。
基本的に、クエリがnより少ないレコードを返す場合、以前のように空の結果セットで同じ(または同様の)メッセージを表示するだけです。
言語に依存しない例:
query.run;
if (query.recordcount >= 6) {
display_results(query);
} else {
error(minimum_not_reached);
}
置き換えます:
query.run;
if (query.recordcount > 0) {
display_results(query);
} else {
error(no_results);
}
もちろん、返されたエラーメッセージは最低限必要なレコードを開示すべきではなく、おそらくminimum_not_reached
に等しい no_results
。これは、既存のコードを変更する場合、変更がほとんど必要ないため、はるかに便利です(query.recordcount > 0
からquery.recordcount > 5
)。
使用中のRDBMSに応じて、これは stored procedure ;)でも実現できます。