2017-07-13 10 views
4

まず、SQLサーバーのセキュリティに関する多くの経験はありません。私が持っている誤りは、私に知らせてください。SQLサーバー - 読み取り専用のアクセス許可を持つストアドプロシージャを実行

私は、ユーザーがSQL Serverデータベースで実行されるSQL文を入力できるアプリケーションがあります。ステートメントはデータを戻すだけで、DMLまたはDDL操作は実行しないでください。現時点では、入力はSELECT文の書き込みのみを許可されています。しかし、現在では、ストアドプロシージャの実行を許可する要件がありますが、データを読み取るだけです。また、インテリセンスの一種を示すために、これらのSPを参考にしてください。

私はdb_datareader権限のみを持つユーザーを作成し、このユーザーとしてステートメントを実行すると考えました。しかし、ストアドプロシージャを実行するには、ユーザにExecute権限を与えなければならず、Ownership Chainingがあるため、権限がチェックされないことがあります。私はこの問題を解決する方法を理解していません。

また、私は、読み取り権限しか持たない特定のDBスキーマで作成されたストアドプロシージャの実行のみを許可すると考えました。また、このように私はSPを簡単にリストすることができます。これが可能かどうかはわかりません。

+0

ロールを作成し、そのロールの作成済みストアドプロシージャに実行権を与えます。あなたのユーザを 'db_datareader'ロールと新しく作成したロールの一部にしましょう。ユーザーを他のロールの一部にしないでください。それはエースを制限するべきですが、あなたが確信が持てない場合はテストしてください。より良い答えが必要な場合は、あなたの質問が現在であるという仮説だけでなく、問題を実証できる[mcve]を提供しなければならないでしょう。 – Igor

+0

私は問題がここにあると思う、 "ユーザーは、SQL Serverデータベースで実行されるSQL文を入力することができます"。それは信じられないほど怖いです。なぜユーザーはSQL文を入力する必要がありますか?これは許容される可能性が非常にわずかですが、非常にまれです。 –

答えて

-1

いくつかの掘削後と@TheGameiswarの答えを使用して

1-

Create user user_reader without login 

2-所有権チェーンを破るために、私は新しいDB作成「読み取り専用」のユーザーを作成します。所有者としてuser_reader

Create schema reader 

ALTER AUTHORIZATION ON Schema::reader TO user_reader 

、3-グラントselectパーミッションを持つスキーマが

をuser_readerします
GRANT SELECT TO user_reader 

4 user_readerに実行許可を与えます(リーダースキーマのみ)。他のスキーマでは、ストアドプロシージャにはテーブルと同じ所有者が存在する可能性があり、所有権チェーンが破られていないため、user_readerの権限はチェックされません。

GRANT EXECUTE ON Schema::reader TO user_reader 

5 user_readerのコンテキストでユーザーが記述したすべてのSQL文を実行します。これは、常に先頭に追加

public override DataTable ExecuteQuery(string query) 
{ 
    SqlConnection connection = new SqlConnection(ConnectionString); 

    StringBuilder readOnlyQuery = new StringBuilder(); 
    readOnlyQuery .AppendLine("execute as user = 'user_reader';");  
    readOnlyQuery .AppendLine(query); 
    query = readOnlyQuery .ToString(); 

    SqlCommand command = new SqlCommand(query, connection); 

    ...Execute the command 
} 

TESTING FOR "ユーザー= 'user_reader' として実行" を達成するために、

CREATE TABLE [dbo].[TestTable](
    [TestField] [int] NOT NULL 
) 

GO 
CREATE PROCEDURE USP_INSERT 
    @input int 
AS 
BEGIN 
    INSERT INTO TestTable VALUES (@input) 
END 

GO 

CREATE PROCEDURE reader.USP_READ 
AS 
BEGIN 
    SELECT * FROM TestTable 
END 
GO 

CREATE PROCEDURE reader.USP_INSERT 
    @input int 
AS 
BEGIN 
    INSERT INTO TestTable VALUES (@input) 
END 

TESTING:INSERTパーミッションが拒否された

insert into TestTable VALUES (2) 

オブジェクト 'TestTable'、データベース 'Test'、スキーマ 'dbo'。

select * from TestTable 

OK

exec usp_read 

EXECUTE権限がオブジェクトのUSP_READ '、データベース 'テスト'、スキーマ 'DBO' で拒否されました。

exec usp_insert 1 

EXECUTE権限はオブジェクトのUSP_INSERT '、データベース 'テスト'、スキーマ 'DBO' で拒否されました。

exec reader.usp_insert 1 

INSERT権限はオブジェクトののTestTable '、データベース 'テスト'、スキーマ 'DBO' で拒否されました。

exec reader.usp_read 

OK

また、我々は、このソリューションは、私のrequiretmentsを満たしているが、おそらく、他の状況のた​​めに十分でない読者のスキーマから

select name 
from sys.procedures 
where SCHEMA_NAME(schema_id) = 'reader' 

をすべてのストアドプロシージャを一覧表示することができます。

3

ストアドプロシージャを実行するが、私はこれは、ログインせずにユーザーを作成し、そのlogin.Thisが句としてEXECUTE使用することを選択するだけ付与することによって動作するはずのユーザー

に権限を実行付与する必要があります。..あなたが唯一の選択権限

create user user1 without login 

grant select to user1 

alter proc usp_test 
@sql nvarchar(max) 
with execute as 'user1' 

as 
begin 


exec sp_Executesql @sql 

end 


create table dbo.test 
(
id int 
) 

insert into test 
select 1 
go 10 

exec usp_test N'select * from test' --works 
exec usp_test N'insert into test values(1)' --fails with below error 

メッセージ2を持っているモジュールにしたら、権限がこのモジュールを作成するか、またはコールするようEXECUTE必要がありますが、実行コンテキストは、USER1となります29、レベル14、状態5、行28 INSERT権限がオブジェクト 'test'、データベース 'master'、スキーマ 'dbo'で拒否されました。私は、このソリューションに付属している

+0

答えに感謝します。しかし、ユーザーがexec文「exec sp_test」を入力するのはどうでしょうか?私は "EXECUTE権限がオブジェクト 'sp_test'、データベース 'test'、スキーマ 'dbo'に対して拒否されました。" – PALMERALE

+0

私は確信が持てません。例を詳しく説明できますか? – TheGameiswar

関連する問題