ホームページ  >  記事  >  データベース  >  アプリケーションが使用するアカウントを SQL Server に追加します。

アプリケーションが使用するアカウントを SQL Server に追加します。

伊谢尔伦
伊谢尔伦オリジナル
2016-12-03 11:10:581066ブラウズ

これまでの顧客相談のケースでは、多くの顧客アプリケーションが SA アカウントを直接使用して SQL Server に接続していました。データベース管理がもう少し厳格な場合、アプリケーションには通常、追加、削除、変更、クエリのみを実行する必要がありますが、DDL 操作はほとんど必要ありません。そのため、「最小限の権限の割り当て」の原則が適用されます。アカウントを設定するときは、「」に従ってください。必要な権限を付与してください。

アプリケーションには、通常、読み取り権限、書き込み権限、およびストアド プロシージャの実行権限に対する最小限の権限が与えられます。 SQL インジェクションによるデータベース情報の漏洩を防ぐために、アカウントの定義の参照権限を拒否することも検討する必要があります。ただし、定義の参照権限が拒否された場合、一括挿入は失敗します。完全な権限定義は次のとおりです:

ALTER ROLE [db_datareader] ADD MEMBER 用户名
ALTER ROLE [db_datawriter] ADD MEMBER 用户名
grant execute to 用户名
deny view definition to 用户名

SQL Server では、インスタンス レベルがログイン名であり、データベース レベルがユーザー名です。ログイン名は作成後に特定のライブラリにマップできます。したがって、ログイン名、ユーザーを作成し、対応するアクセス許可を付与するための完全なスクリプトを作成しました。スクリプトは次のとおりです:

--创建用户的存储过程, 
--示例EXEC sp_CreateUser 'UserName','rw','DatabaseName' 
--EXEC sp_CreateUser 'tesefx','r','Test','0xE39CA97EBE03BB4CA5FF78E50374EEBB' 
CREATE PROC sp_CreateUser 
@loginName VARCHAR(50) , 
@IsWrite VarCHAR(3) , 
@DatabaseName VARCHAR(50), 
@Sid VARCHAR(100) ='1' 
AS 
PRINT('示例:EXEC sp_CreateUser ''UserName'',''rw'',''DatabaseName''') 
PRINT('示例:EXEC sp_CreateUser ''UserName'',''rwv'',''DatabaseName'',''0xE39CA97EBE03BB4CA5FF78E50374EEBB''') 
PRINT('r为只读权限,rw为读写权限,rwv为读写加View Definition权限') 
IF EXISTS ( SELECT name 
FROM sys.syslogins 
WHERE name = @loginName ) 
BEGIN 
PRINT N'登录名已存在,跳过创建登录名步骤' 
END 
ELSE 
BEGIN 
DECLARE @CreateLogin NVARCHAR(1000) 
DECLARE @pwd VARCHAR(50) 
PRINT @Sid 
SET @pwd=NEWID() 
IF(@sid='1') 
BEGIN 
SET @CreateLogin = 'CREATE LOGIN [' + @loginName + '] WITH PASSWORD=N''' 
+ @Pwd 
+ ''', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF;' 
PRINT N'登录名已创建,密码为:'+@pwd 
END 
ELSE 
BEGIN 
SET @CreateLogin = 'CREATE LOGIN [' + @loginName + '] WITH PASSWORD=N''' 
+ @Pwd 
+ ''', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF,sid='+@Sid+';' 
PRINT N'已经使用SID创建登录名:'+@loginName 
END 
EXEC (@CreateLogin) 
--DECLARE @sidtemp NVARCHAR(50) 
--SELECT @sidtemp=sid FROM sys.server_principals WHERE name=@loginName 
--PRINT(N'登录名为:'+@loginName+N' SID为: 0x'+CONVERT(VARCHAR(50), @sidtemp, 2) ) 
END 
DECLARE @DynamicSQL NVARCHAR(1000) 
--切换数据库上下文 
SET @DynamicSQL = N'Use [' + @DatabaseName + ']; ' + 'IF EXISTS(SELECT name FROM sys.database_principals WHERE name='''+@loginName+''') Begin Print(''用户名已存在,跳过创建用户名的步骤'') end else begin CREATE USER [' 
+ @loginName + '] FOR LOGIN ' + @loginName + ' end;IF (''' 
+ @IsWrite 
+ '''=''rw'' or ''' 
+ @IsWrite 
+ '''=''rwv'') BEGIN ALTER ROLE [db_datareader] ADD MEMBER ' + @loginName 
+ ';ALTER ROLE [db_datawriter] ADD MEMBER ' + @loginName 
+ '; END ELSE BEGIN ALTER ROLE [db_datareader] ADD MEMBER ' 
+ @loginName + '; 
ALTER ROLE db_datawriter DROP MEMBER ' 
+ @loginName + ' 
;End;grant execute to ' + @loginName + '; 
if(&#39;&#39;&#39;+@IsWrite+&#39;&#39;&#39;<>&#39;&#39;rwv&#39;&#39;) begin deny view definition to &#39; + @loginName + &#39;; end else begin grant view definition to &#39; + @loginName + &#39;; end&#39; 
EXEC (@DynamicSQL)

このストアド プロシージャは、アプリケーションの接続に必要なログイン名、ユーザー、および対応するアクセス許可を作成するために使用されます。ユーザー名またはログイン名が存在する場合、この手順はスキップされます。 このストアド プロシージャの使用例は次のとおりです。

EXEC sp_CreateUser &#39;UserName&#39;,&#39;rw&#39;,&#39;DatabaseNam&#39;
EXEC sp_CreateUser &#39;tesefx&#39;,&#39;r&#39;,&#39;Test&#39;,&#39;0xE39CA97EBE03BB4CA5FF78E50374EEBB&#39;

上記の実行の最初の行では、標準アカウント (アカウント名 UserName) を作成します。 DatabaseNam ライブラリ権限への読み取りおよび書き込みアクセスを行い、生成された GUID パスワードを返します。 2 番目のストアド プロシージャは、4 番目のパラメータ sid を使用してログイン名を作成します。AlwaysOn 環境またはミラーリング環境では、両端のログイン名が同じ SID を持つ必要があるため、この場合は SID を使用してログイン名を作成するメソッドが提供されます。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。