短い答えは、許可されたユーザーが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
このような詳細な回答をいただきありがとうございます!私はローカルのSQLデータベースでこれについてのテストを構築しようとしていますが、私は 'あなたが権限を持っていないため、' CONNECTION_AUTHORIZATION_TRIGGER 'トリガを作成できません.'エラーが発生しました。ログイン。何か案が? –
'LOGON TRIGGER'を作成するには' CONTROL SERVER'か 'sysadmin'が必要です。 'sysadmin'のメンバーであることを確認してください。 BTW。私が見てきたこれらのタイプのエラーの根本的な原因の1つは、 'sysadmin'へのアクセスがマシン管理者グループ(' builtin \ Administrators')のメンバシップを介して与えられていることです。呼び出し元がSQL Serverへの接続に昇格プロンプトを使用していないため(フル管理者ではない)テスト・ボックスでフル・アドミニストレーター(cmdプロンプトを右クリックし、 ''管理者として実行 ''を選択)で 'sqlcmd'を実行し、このように完全なsysadminを取得してみてください。 –