2009-09-08 1 views
30

私はオンラインで少しだけ検索し、データベース上のユーザー/ロールを設定する方法を実際に見つけ出したり、拠点をカバーしているものは見つかりませんでした。Webアプリケーション用のSQL Serverのユーザー/ロールに関するベストプラクティス

基本的には、通常のデータベース操作(選択、挿入、更新、削除)のためにデータベースにアクセスする必要があるアプリケーション(この場合はWebアプリケーション)からデータベースにアクセスするためのユーザーがいます。 (execを使用して他のストアード・プロシージャー/ UDF内のストアード・プロシージャーを実行する)ストアード・プロシージャーを実行する。

次に、メインの管理者になるユーザーがいることになります(これは十分簡単です)。

私は現在、私の意見ではセキュリティをあまり良く管理していない開発環境を持っています(アプリケーションはイントラネットアプリケーションですが、db_ownerロールを持つユーザーを使用します)。イントラネットアプリケーションでも、セキュリティを念頭に置いており、開発者がこの種の環境でユーザー/ロールを設定する方法のいくつかを見たいと思っています。

EDIT:WebアプリケーションとSQL Serverは、別々のマシンに存在します。

EDIT:直接読み書きアクセスが必要なORMが使用されていることを忘れてしまいました。

質問: ユーザーにアプリケーションアクセスを設定する際の「ベストプラクティス」とは何ですか?どのような役割が適用され、いくつかのキャッチは何ですか?

+0

ウェブアプリケーションが発信者を偽装していますか? –

+0

SQL Serverにアクセスするためではありません(Reporting Services用に個別に使用します)。 私たちのWebアプリケーションは専用ボックスにあり、データベースは別の専用ボックスにもあります。 – Manuel

+1

ORMで直接読み書きが必要な場合は、ストアドプロシージャを理解しているORMに切り替えることになります。 – blowdart

答えて

36

まず、単一のユーザープリンシパルに添付するのではなく、データベースの役割にアクセス許可をカプセル化する傾向があります。ここでは大きな役割を果たすのはデータベースの役割なので、セキュリティを完全にスクリプト化してから、「ユーザーを追加してこの役割に追加する」という展開タイプを伝えることができ、SQL許可ブーゲイメンと戦っていません。さらに、これにより、db_ownerモードでの開発を避けることができ、自分のことをもっとよく感じることができるだけでなく、プレイするような練習や一般的に問題を避けることができるように、クリーンな状態が維持されます。

このロールの権限を適用する場合は、特にORMを使用してアプリケーションを介してセキュリティを処理している場合は、ネットをより広く使用する傾向があります。 T-SQLの用語では、それは次のようになります。

GRANT SELECT, UPDATE, INSERT, DELETE, EXECUTE on SCHEMA::DBO to [My DB Role] 

これは、最初は少し怖いように見えるかもしれないが、それは実際にはない - その役割は、操作するデータ以外の何もすることができません。他の大きな利点は、テーブルやプロシージャの追加のようにスキーマを変更すると、そのスキーマ内にとどまっている限り、それ以上のセキュリティ作業は必要ありません。

SQL 2005+では、オブジェクトのグループを保護するためにデータベーススキーマを使用することも考慮する必要があります。ここで大きなトリックは、多くのORMと移行ツールでは好きではありませんが、デフォルトのスキーマ[dbo]をアプリケーションにレンダリングすると、特別なセキュリティで保護されたものに代替スキーマを使用できます。たとえば、管理者が手動で実行する特別な残酷なデータベースクリーンアッププロシージャーのADMINスキーマを作成します。または、より詳細なDB権限を必要とする、アプリケーションの特別に安全性の高い部分の個別のスキーマです。

ドメインがなくても、Windows認証(Sql Serverの用語では統合認証)を使用することができます。両方のボックスで同じ資格情報(ユーザー/パスコンボ)を持つユーザーを作成してください。 Webボックスでそのユーザーとして実行するアプリケーションドメインをセットアップし、そのプリンシパルによってバックアップされたSQL ServerユーザーをSQLボックスと利益にセットアップします。つまり、デプロイメント・タイプはSQLユーザーの作成および必要に応じて接続文字列の変更を処理できる必要があるため、データベースの役割を使用すると、この決定から離脱する可能性があります。

+0

私はこのアプローチに傾いています。なぜなら、これらのパーミッションを設定するのに必要なテーブルの量がきれいになるからです。私はちょうど妥協が価値があるかどうか疑問に思っています(それはイントラネットにあるので、私たちのリスクはウェブ環境よりも少し低くなります)。 – Manuel

+3

ORMアングルはSQLインジェクション攻撃から保護する必要があります。本当に「緩い」文字列がデータベースにぶつかっていないからです。実際、ここで最大の攻撃ベクトルは、sp_execute_sqlを呼び出すストアドプロシージャです。さらに、アプリケーション層のセキュリティは、ビルドとテストの両方を容易に行うことができます。特殊なデータベース権限を使用することは、スタックの上部を保護することがはるかに難しくなった過去の時代の遺残物です。 –

+0

私はこれが進行中の開発(Remusは非常に似たアプローチですが、別のスキーマを使用するとすべてのオブジェクトを新しいスキーマに移動する必要があります...新しい開発には最適ですが、しかし)。 – Manuel

6

Webアプリケーションが使用するユーザー 'webuser'を作成します。

このユーザーには、stored procの実行権限のみを付与します。直接テーブルの読み書きを許可しないでください。あなたがテーブルから何かを読む必要があれば、procを書いてください。データを書き込む必要がある場合は、別のprocを書きます。

このようにすべてが素敵でシンプルに保たれます。関連する権限のみを持つ1人のアプリユーザー。セキュリティが侵害された場合、侵入者はprocsを実行することができます。

+0

これには1つの問題があります(元の質問にはいくつかの関連情報がありません)。私たちはクラスを生成するORMを使用しているため、データを読み書きするストアドプロシージャに限定することはできません。 – Manuel

+8

sooo 2001。 。 。 。 –

+1

@Manuel:それは変更になりますが、ORMの制限を削除した場合は、それでもユーザーメソッドをロール/スキーマの権限以上にすることをお勧めします。 –

13

データベースへのアプリケーションアクセスのガイドラインは、データへのアクセスをストアドプロシージャに分離し、プロシージャをスキーマにグループ化し、アプリケーションで使用されるプリンシパルに対してスキーマに対して実行を許可することでした。所有権の連鎖は、プロシージャの呼び出し側へのデータアクセスを保証します。ストアドプロシージャを調べることでアクセスを確認できます。これは簡単なモデルで、理解しやすく、設計し、展開し、管理します。ストアドプロシージャを使用すると、コード署名、最も細かく強力なアクセス制御方法、および改ざんされた唯一のもの(手順が変更された場合に署名が失われます)を活用できます。

問題は、Visual Studioデザイナーが出す技術のすべてが、この勧告の面で飛んでいることです。開発者には、ストアドプロシージャで排他的に使用するのは難しいモデルが用意されています。開発者はクラスモデルを最初に設計し、論理モデルからテーブル構造を生成することが大好きです。手順ベースのガイドラインは、アプリケーションの最初の行が書かれる前に、最初に存在する手順を再構築します。これは、現代的な開発の反復的な方法のために、実際に開発に問題があります。これは、チームリーダーが問題を認識し、それに対処している限り、解決不可能ではありません(つまり、手順がの場合はとなります。

+0

+1:素晴らしい答え。セキュリティのためにデータベースを設計する際に、非常に適切な問題/考慮事項のいくつかを強調しています。 –

+0

私たちはORMの使用に関するいくつかの情報を忘れていました。基本的にはデータベースへの直接の読み書きアクセスが必要です。このようなことに対して、読み書きの役割を追加することは適切な方法でしょうか? – Manuel

+0

セキュリティの観点から:いいえ。あなたは、侵害されたWebサーバーによってデータが恣意的に更新されるのを防ぎたい(徹底的な防御)。実際には、実行可能な選択肢はありません。db_datareader/db_datawriterのロールに少なくともWebサーバーのプリンシパルを追加*しないで*必要なテーブルにアクセス*するだけです。 –

関連する問題