2016-09-29 8 views
0

SQL Serverデータベースで動作するMVCアプリケーションがあります。アプリケーション外部のデータベースへのアクセスを防止する

私たちはWindows認証を使用しており、私たちのサイトにユーザーがアクセスできるようにするには、それらをアクティブディレクトリグループSEUserに追加します。

私たちは、データベースにSEUserグループへのログインとアクセスの許可を与えました。

しかし、ADグループにはデータベースへのアクセス権があるため、そのグループに所属するユーザーはWebサイトにアクセスできるだけでなく、アプリケーション外からデータベースに接続して変更することもできます。

私は、リクエストが私たちのアプリケーションを経由して来て、外からではなく、私がデータベースにアクセスするようにユーザーグループを制限できる方法を見つけるために多くのことを探しています。

のために私が考える最初のアプローチは、

を/偽装を使用するアプローチとして接続し、唯一のワーカープロセスアカウントがデータベースに接続できるようにすることですしかし、問題は、我々は現在の内のユーザ情報でログインしてアクセスしているであることSYSTEM_USERIS_MEMBERのようなメソッドを使用することによってもストアドプロシージャを呼び出すことができます。このメソッドは現在ログインしているユーザーのみを考慮し、ワーカープロセスアプローチを使用できません。

特定のシナリオでこれを達成する方法はありますか?助けてください

答えて

2

短い答えは、許可されたユーザーが1つのプログラム(つまり、中間層)から他のプログラム(SSMSなどの対話型クエリプログラム)からの接続を許可しないことです。

私が与えることができる最も良いアドバイスは、ユーザーがデータベースに直接接続する方法を見つけることを想定してシステムを設計することです。そうする。

DBに直接接続するときにユーザーがシステム上で行うことを制限する1つの戦略は、ストアドプロシージャを使用してDBで何ができるべきかを制限することです(つまり、SPを実行するアクセス権を持ちます。それ以外の場合)、署名を介してSP実行を介してのみアクセス許可を与えます。

監査を使用してユーザーの特権の悪用を検出することも強くお勧めします。すべてのユーザーが中間層アプリケーションを介して接続することを期待すると、異常な動作を検出するのは比較的簡単です。

回避策としては、ログオントリガーを使用して、許可されていないプログラム(誤解を避けてください)による誤ったアクセスを防ぐ方法があります。しかし、警告を受けてください:これはセキュリティ上の境界ではなく、バイパスするのは簡単ですが、正直な人を正直に保つのに役立ちます。例えば

私は私のシステム上の特定のグループへのアクセスを許可しますが、私は私のアプリにできるだけこのグループを制限したいと思います:

CREATE LOGIN [myDomain\myGroup] FROM WINDOWS 

だから私は作成されます。セッションのアプリケーション名を確認するログオントリガー、およびこれらのユーザーに対して承認していないアプリをブロックします。

CREATE TRIGGER connection_limit_trigger 
ON ALL SERVER 
FOR LOGON 
AS 
BEGIN 
IF(IS_SRVROLEMEMBER('sysadmin') != 1) 
BEGIN 
    IF(IS_MEMBER('myDomain\myGroup') = 1) 
    BEGIN 
     DECLARE @appName nvarchar(256) 
     SELECT @appName = program_name FROM sys.dm_exec_sessions where session_id = @@SPID 
     IF(@appName != 'My approved app') 
      ROLLBACK; 
    END 
END 
END; 

このトリガーはすべてのユーザーに影響するため、特定のユーザーには不要な制限を回避するためのチェックが追加されています。

私は私が承認非常にシンプルなアプリ(接続文字列にApplicationNameプロパティを参照してください)持っている:このグループのユーザーがSQL Serverに接続しようとすると、トリガーは、アプリケーションをチェックします

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Data; 
using System.Data.SqlClient; 

namespace SampleAppSql 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      SqlConnectionStringBuilder cnnstrbldr = new SqlConnectionStringBuilder(); 
      cnnstrbldr.ApplicationName = @"My approved app"; 
      cnnstrbldr.DataSource = @"."; //local machine 
      cnnstrbldr.IntegratedSecurity = true; 

      using (SqlConnection conn = new SqlConnection(cnnstrbldr.ConnectionString)) 
      { 
       conn.Open(); 
       using (SqlCommand cmd = conn.CreateCommand()) 
       { 
        cmd.CommandText = @"SELECT @@version;"; 
        string vers = (string)cmd.ExecuteScalar(); 
        System.Console.WriteLine(@"SQL Server version: {0}", vers); 
       } 
       conn.Close(); 
      } 
     } 
    } 
} 

を名前、それが一致しない場合、ログオントリガーは、接続が失敗する可能性があります:

C:\>g:\temp\SampleAppSql.exe 
SQL Server version: Microsoft SQL Server 2016 (RTM) … 

C:\>sqlcmd -E -S . 
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : Logon failed for login 'myDomain\toto' due to trigger execution.. 

許可されたユーザーは、単にアプリケーション名やバイパスを操作できるように、この技術はセキュリティ境界ではないことに注意してください引き金;違反しているユーザーは、あなたが意図的にあなたのポリシーを迂回しようとしたことを否定することはできません。

この情報が役立ちますようお願いいたします。

-Raul

+0

このような詳細な回答をいただきありがとうございます!私はローカルのSQLデータベースでこれについてのテストを構築しようとしていますが、私は 'あなたが権限を持っていないため、' CONNECTION_AUTHORIZATION_TRIGGER 'トリガを作成できません.'エラーが発生しました。ログイン。何か案が? –

+0

'LOGON TRIGGER'を作成するには' CONTROL SERVER'か 'sysadmin'が必要です。 'sysadmin'のメンバーであることを確認してください。 BTW。私が見てきたこれらのタイプのエラーの根本的な原因の1つは、 'sysadmin'へのアクセスがマシン管理者グループ(' builtin \ Administrators')のメンバシップを介して与えられていることです。呼び出し元がSQL Serverへの接続に昇格プロンプトを使用していないため(フル管理者ではない)テスト・ボックスでフル・アドミニストレーター(cmdプロンプトを右クリックし、 ''管理者として実行 ''を選択)で 'sqlcmd'を実行し、このように完全なsysadminを取得してみてください。 –

関連する問題