Viết kịch bản vai trò ứng dụng với mật khẩu băm


8

Tôi cần kịch bản một vai trò ứng dụng với mật khẩu băm, vì vậy tôi có thể sao chép nó từ cơ sở dữ liệu này sang cơ sở dữ liệu khác.

Xem xét mã ví dụ sau, sử dụng Vai trò ứng dụng để cung cấp quyền truy cập nâng cao cho người dùng không đáng tin cậy:

USE tempdb;

CREATE LOGIN LimitedLogin
WITH PASSWORD = 'Password1'
    , CHECK_POLICY = OFF
    , CHECK_EXPIRATION = OFF;

CREATE USER LimitedLogin
FOR LOGIN LimitedLogin
WITH DEFAULT_SCHEMA = dbo;

CREATE APPLICATION ROLE MyAppRole
WITH PASSWORD = 'Password2'
    , DEFAULT_SCHEMA = dbo;

EXEC sp_addrolemember @rolename = 'db_datareader'
    , @membername = 'MyAppRole';

CREATE TABLE dbo.Numbers
(
    [Number] int CONSTRAINT PK_Numbers 
        PRIMARY KEY CLUSTERED
        IDENTITY(1,1) NOT NULL
);

INSERT INTO dbo.Numbers
VALUES (1)
    , (2);

GO

Khi chúng tôi đã tạo thiết lập thử nghiệm trong tempdb, chúng tôi có thể đăng nhập với tư cách [LimitedLogin]người dùng và chạy như sau:

-- login as [LimitedLogin]

USE tempdb;

SELECT *
FROM dbo.Numbers;

Lỗi sau được trả về, như mong đợi:

Msg 229, Level 14, State 5, Line 1
The SELECT permission was denied on the object 'Numbers'
    , database 'Test', schema 'dbo'.

Tuy nhiên, khi chúng tôi thực hiện sp_setapprolevới mật khẩu phù hợp, chúng tôi có thể thấy kết quả mong muốn từ dbo.Numbersbảng:

DECLARE @cookie VARBINARY(8000);
EXEC sp_setapprole @rolename = 'MyAppRole'
    , @password = 'Password2'
    , @fCreateCookie = 1
    , @cookie = @cookie OUT;
SELECT @cookie;

SELECT TOP(10) *
FROM dbo.Numbers;

EXEC sp_unsetapprole @cookie = @cookie;

Tôi muốn có thể tự động hóa việc tạo Vai trò ứng dụng bằng cách viết kịch bản từ cơ sở dữ liệu nguồn để được áp dụng cho cơ sở dữ liệu đích. Tôi có thể dễ dàng thực hiện phần lớn trong số đó bằng cách:

SELECT 'CREATE APPLICATION ROLE ' + QUOTENAME(dp.name) + '
WITH PASSWORD = ''xxxx''
    , DEFAULT_SCHEMA = ' + QUOTENAME(dp.default_schema_name) + ';'
FROM sys.database_principals dp
WHERE dp.type_desc = 'APPLICATION_ROLE';

Tuy nhiên, tôi thực sự muốn có mật khẩu băm trong tập lệnh, đại loại như:

CREATE APPLICATION ROLE [MyAppRole]
WITH PASSWORD = 0x12345678 HASHED
    , DEFAULT_SCHEMA = [dbo];

Điều này có thể không? Có lẽ phiên bản băm của mật khẩu vai trò ứng dụng được lưu trữ ở đâu đó trong cơ sở dữ liệu.

Sử dụng chức năng "script" -> "của SQL Server Management Studio, Vai trò ứng dụng được viết theo kịch bản với mật khẩu mới , như:

/****** Object:  ApplicationRole [MyAppRole]    Script Date: 9/22/2015 10:18:12 AM ******/
/* To avoid disclosure of passwords, the password is generated in script. */
declare @idx as int
declare @randomPwd as nvarchar(64)
declare @rnd as float
select @idx = 0
select @randomPwd = N''
select @rnd = rand((@@CPU_BUSY % 100) + ((@@IDLE % 100) * 100) + 
       (DATEPART(ss, GETDATE()) * 10000) + ((cast(DATEPART(ms, GETDATE()) as int) % 100) * 1000000))
while @idx < 64
begin
   select @randomPwd = @randomPwd + char((cast((@rnd * 83) as int) + 43))
   select @idx = @idx + 1
select @rnd = rand()
end
declare @statement nvarchar(4000)
select @statement = N'CREATE APPLICATION ROLE [MyAppRole] WITH DEFAULT_SCHEMA = [dbo], ' + N'PASSWORD = N' + QUOTENAME(@randomPwd,'''')
EXEC dbo.sp_executesql @statement
GO

Rõ ràng, điều đó không hữu ích trong trường hợp của tôi, mặc dù nó cung cấp một phương pháp thú vị để tạo mật khẩu ngẫu nhiên.


Dựa trên các câu trả lời cho đến nay, tôi đã tạo đề xuất Kết nối để thêm hỗ trợ cho sản phẩm này:

Câu trả lời:


6

Bạn có thể kết nối bằng cách sử dụng DAC ( Kết nối quản trị viên chuyên dụng ) và kéo passwordcột từ đó sys.sysowners. Đầu tiên, kết nối bằng cách sử dụng:

ADMIN:Server\Instance

Sau đó:

SELECT password_hash = [password]
  FROM sys.sysowners
  WHERE name = N'MyAppRole';

Chế độ xem này chỉ hiển thị khi sử dụng DAC và cột không được hiển thị trong chế độ xem chính thể nhìn thấy ( sys.database_principals). Hãy cẩn thận với DAC, tất nhiên.

Tất cả đã nói, điều này không giúp bạn. CREATE APPLICATION ROLEkhác nhiều so với CREATE LOGIN, ở chỗ bạn không thể cung cấp mật khẩu băm , chỉ có văn bản thuần túy. Và thậm chí không nghĩ về kỹ thuật đảo ngược giá trị băm, bởi vì các phiên bản hiện đại của SQL Server sử dụng các phương thức phức tạp để mã hóa mật khẩu. Trong thực tế nếu bạn tự thử điều này, bạn sẽ thấy rằng một hàm băm khác nhau được tạo ra mỗi lần, ngay cả trong cùng một tuyên bố:

SELECT PWDENCRYPT(N'foo'), PWDENCRYPT(N'foo');

Kết quả (trên máy của tôi, lần này), lưu ý rằng kết quả của bạn sẽ thay đổi:

0x0200185968C35F22AF70...   0x0200D6C77A1D84A8467F...

Vì vậy, tôi muốn giới thiệu một trong hai:

  1. Lưu trữ mật khẩu ứng dụng trong kiểm soát nguồn ở đâu đó hoặc bất cứ nơi nào bạn lưu trữ mật khẩu hệ thống khác hiện tại và sử dụng mật khẩu đó để tạo tập lệnh để triển khai vai trò ứng dụng cho máy chủ khác (hoặc kiểm soát nguồn toàn bộ CREATE APPLICATION ROLEtập lệnh); hoặc là,
  2. Sử dụng vai trò thường xuyên thay vì vai trò ứng dụng.

1

Không có gì trong cú pháp làm cho điều này có thể

CREATE APPLICATION ROLE(Giao dịch-SQL) - Sách trực tuyến

Bạn có thể khắc phục điều này bằng cách tạo approle trong cơ sở dữ liệu mẫu và khôi phục tập lệnh đó. Một triển khai (Dynamics NAV) tạo ra một approle trong mã và lưu mật khẩu vai trò ứng dụng được mã hóa trong một bảng trong cơ sở dữ liệu để làm cho máy khách giải mã mật khẩu vai trò.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.