データベースIDの公開-セキュリティリスク?


133

データベースID(URLなど)を公開することはセキュリティ上のリスクであると聞きましたが、その理由を理解するのに苦労しています。

なぜリスクなのか、なぜそうでないのかについての意見やリンクはありますか?

編集:もちろん、アクセスはスコープされています。たとえば、リソースfoo?id=123が表示されない場合、エラーページが表示されます。それ以外の場合、URL自体は秘密にする必要があります。

編集:URLが秘密である場合、おそらく、有効期間が限定された生成されたトークンが含まれます。たとえば、1時間有効で、一度しか使用できません。

編集(数か月後):私が現在これを好む方法は、IDにUUIDSを使用して公開することです。IDとして(通常は一部のDBでのパフォーマンスのために)連続番号を使用している場合、各エントリのUUIDトークンを代替キーとして生成し、それを公開します。

回答:


109

適切な条件を前提として、識別子を公開することはセキュリティリスクではありません。また、実際には、識別子を公開せずにWebアプリケーションを設計することは非常に負担になります。

従うべきいくつかの良いルールはここにあります:

  1. 役割ベースのセキュリティを使用して、操作へのアクセスを制御します。これがどのように行われるかは、選択したプラットフォームとフレームワークによって異なりますが、多くの場合、アクションに何らかの権限が必要な場合にブラウザを認証ステップに自動的にリダイレクトする宣言型セキュリティモデルをサポートしています。
  2. プログラムによるセキュリティを使用して、オブジェクトへのアクセスを制御します。これはフレームワークレベルで行うのが困難です。多くの場合、これはコードに記述する必要があるため、エラーが発生しやすくなります。このチェックは、ユーザーが操作の権限を持っているだけでなく、変更されている特定のオブジェクトに対する必要な権限も持っていることを確認することにより、役割ベースのチェックを超えています。役割ベースのシステムでは、マネージャのみが昇給を行えることを確認するのは簡単ですが、それを超えて、従業員が特定のマネージャの部門に所属していることを確認する必要があります。
  3. ほとんどのデータベースレコードでは、条件1および2で十分です。しかし、予測不可能なIDを追加することは、少し余分な保険、つまり「セキュリティの深さ」と考えることができます。ただし、予測不可能な識別子が必要となる1つの場所は、セッションIDまたはその他の認証トークン内で、ID自体が要求を認証します。これらは、暗号化RNGによって生成されます。

27
IMO、予測不可能なIDを追加することは「あいまいさによるセキュリティ」アプローチであり、誤った安心感につながる可能性があります。(1)と(2)に焦点を当て、アクセス制御がしっかりしていることを確認することをお勧めします。
stucampbell 14

4
暗号化RNGの使用は、「あいまいさによるセキュリティ」ではありません。攻撃者は、オブジェクトIDの生成方法を知っていても、オブジェクトIDの推測に近づくことはありません。あいまいさによるセキュリティとは、使用しているアルゴリズムが発見された場合、それが悪用される可能性があることを意味します。鍵やRNGの内部状態などの秘密の保持については言及していません。
エリクソン2017

1
@stucampbellおそらく、しかし、それはあなたがまったく予測できないIDを使用すべきではないという意味ではありません。バグが発生するため、予測できないIDは追加の安全メカニズムです。さらに、アクセス制御はそれらを使用する唯一の理由ではありません。予測可能なIDは、特定の時間枠内の新規顧客の数などの機密情報を明らかにする可能性があります。あなたは本当にそのような情報を公開したくありません。
user247702

1
@Stijnあなたが私が持っている顧客の数を公開することを「本当に望んでいない」と本当に言うことはできません。つまり、マクドナルドには100億のハンバーガーを提供したという大きな兆候があるということです。これはセキュリティリスクではなく、好みです。さらに、とにかくこれについて心配するほとんどのアプリケーションでURLが表示される前にログインする必要があります。したがって、誰がデータをかき集めているのかがわかります。
ウェインブロス2018年

1
この会話で言及しなかったことの1つは、トラブルシューティングと使いやすさの観点から、ユーザーを特定のリソースに誘導したり、ユーザーができるようにするために、URLでIDを公開すると非常に便利なことです。どのリソースが表示されているかを正確に伝えます。自動インクリメントをより高い値から開始することで、ビジネスインテリジェンスの懸念をほとんど回避できます。
Chockomonkey

47

データセキュリティリスクではありませんが、データサイズと速度の両方を公開するため、これは完全にビジネスインテリジェンスのセキュリティリスクです。私は企業がこれによって害を受けることを見て、このアンチパターンについて深く書いています。ビジネスではなく、単に実験を構築しているのでない限り、私はあなたのプライベートIDを公衆の目に触れないようにすることを強くお勧めします。https://medium.com/lightrail/prevent-business-intelligence-leaks-by-using-uuids-instead-of-database-ids-on-urls-and-in-apis-17f15669fd2e


4
最後に、セキュリティリスク以外の側面をもたらす正解です。
ペセプス

2
これは受け入れられる答えになるはずです。攻撃者がセキュリティを迂回できると想定している場合(常にそうする必要があります)、この種の情報を渡したくないだけです。
クリイル

@Kriil彼らはあなたのセキュリティをバイパスする必要すらありません。彼らはただアカウントを作成する必要があります!
Peter

32

IDの意味によって異なります。

競争上の理由で、メンバーの数を公開したくないが、シーケンシャルIDを使用することで、いずれにせよURLでそれを明らかにしているサイトを考えてみましょう:http : //some.domain.name/user?id=3933

一方、代わりにユーザーのログイン名を使用した場合:http : //some.domain.name/user?id=someユーザーは、ユーザーがまだ知らないことは何も開示していません。


2
あなたは、シーケンシャルのIDあなたにしている権利を使用している場合ではなく、その後場合は、何も公開しないこと
のoriP

@orip:私が言ったように、それは誰かがいくつかのidを調べることによって発見できるものに依存します。パターンはありますか?その情報を使用して、意図しない情報を入手できますか?
いくつかの

@ジョン:編集ありがとうございます。英語が:)私の母国語ではない
いくつかの

6
私はこれを正確に実行しました。連続したID番号を使用して、競合他社のユーザーベースのサイズを決定しました。
ミカ

3
彼らは至る所にいます。多くのショッピングサイトでは、注文IDに連番を使用しています。ある日付と別の日付に1つの注文を出すと、その期間中に彼らが受け取った注文の数がわかります。注文の金額がわからない場合でも、ビジネスの成果を把握できます。
いくつかの

25

一般的な考え方は次のとおりです。「アプリの内部動作に関する情報は誰にも公開しないでください。」

データベースIDの公開は、一部の情報の公開と見なされます。

これの理由は、ハッカーがアプリの内部の仕組みに関する情報を使用してあなたを攻撃したり、ユーザーがURLを変更して、自分が見るはずのないデータベースにアクセスしたりできることです。


1
表示されるはずのないリソースにアクセスする-アクセス許可を確認しない場合のみ(確認します。それ以外の場合は、別のセキュリティ問題があります)。「内部の仕組み」に関する情報の開示-それはまさに私の質問です。なぜ問題なのですか?
orip 2008

8
@orip:できるだけ安全であることがすべてです。あなたが間違いを犯さない種類のプログラマーであれば、それは問題ではありません。そうしないと、公開する詳細が少なくなり、間違いを犯した場合(いつ)にコードを悪用することが難しくなります。それ自体、あなたの言う通り、セキュリティは追加されません。
アダムベレア

@Adam:表面的なセキュリティは、セキュリティがないより悪い場合があります。セキュリティがなければ明示的であり、表面的なセキュリティでは無視できないものを追加すると考えることができます。
orip

16

データベースIDにはGUIDを使用します。それらを漏らすことはずっと危険ではありません。


これが私が提案することです。データベースのGUIDを推測する可能性はほとんどありません。
ジョンエリクソン

6
これにより、パフォーマンスが低下します。こちらをご覧ください
ジェシュルン2015年

2
guidsを使用することの興味深い点1は、クライアントにデータベースIDを生成させることができるということです。興味深いこと2は、自動増分IDと同じように、シャーディングされたデータベースに問題がないことです。
ブライアンホワイト

これらのGUIDをユーザー、コメント、投稿を識別するためのid属性としてHTMLコードでも使用しますか?ユーザーがどのリンクをクリックしたか、どの投稿にコメントしたいかを示すには?
trzczy

7

dbで整数IDを使用している場合、qs変数を変更することで、ユーザーが見るべきではないデータを簡単に見られるようにすることができます。

たとえば、ユーザーはこのqsのidパラメータを簡単に変更して、http:// someurl?id = 1にすべきでないデータを表示/変更することができます。


7
権限をチェックしないと、別のセキュリティ問題が発生します。
orip 2008

しかし、答えは正確です。「
5

1
問題は、権限を確認するかどうかではありません。それはあなたが知らない新入社員が許可をチェックする場合です。
ブライアンホワイト

@BrianWhite-コードレビュープロセスを実施して、本番環境に入る前にそれらを教育できるようにする理由です。
candu 2015

2
整数IDをURLまたはフォーム変数で使用する場合は、暗号化します。
ブライアンホワイト

6

データベースIDをクライアントに送信すると、強制されます両方のケースで、セキュリティをチェックします。WebセッションでIDを保持する場合は、それを実行するかどうかを選択できます。つまり、処理が少なくなる可能性があります。

あなたは常にあなたのアクセス制御に物事を委任しようとしています;)これはかもしれませんあなたのアプリケーションのケースんが、私のキャリア全体でそのような一貫したバックエンドシステムを見たことはありません。それらのほとんどは、Web以外での使用向けに設計されたセキュリティモデルを備えており、一部には死後に追加された追加の役割があり、それらの一部はコアセキュリティモデルの外部に組み込まれています(役割が異なる運用コンテキストで追加されたため、ウェブの前)。

したがって、合成セッションのローカルIDを使用します。これは、できる限り多くのことを隠すためです。

非整数キーフィールドの問題もあります。これは、列挙値などの場合に当てはまる可能性があります。そのデータをサニタイズしてみることができますが、小さなボビードロップテーブルのようになる可能性があります。


4
興味深いことに、すべてのリクエストのすべての入力(URLパラメーターを含む)をチェックすることは、Webに非常に適していると思います。
orip
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.