Membuat skrip peran aplikasi dengan kata sandi hash

8

Saya perlu membuat skrip peran aplikasi dengan kata sandi hash, sehingga saya dapat menyalinnya dari satu basis data ke yang lain.

Pertimbangkan kode contoh berikut ini, yang menggunakan Peran Aplikasi untuk memberikan akses tinggi ke pengguna yang tidak tepercaya:

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

Setelah kami membuat pengaturan tes di tempdb, kami dapat masuk sebagai [LimitedLogin]pengguna, dan menjalankan yang berikut:

-- login as [LimitedLogin]

USE tempdb;

SELECT *
FROM dbo.Numbers;

Kesalahan berikut dikembalikan, seperti yang diharapkan:

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

Namun, setelah kami mengeksekusi sp_setapproledengan kata sandi yang sesuai, kami dapat melihat hasil yang diinginkan dari dbo.Numberstabel:

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;

Saya ingin dapat mengotomatiskan pembuatan Peran Aplikasi dengan menulisnya dari basis data sumber untuk diterapkan ke basis data tujuan. Saya dapat dengan mudah melakukan sebagian besar dari itu dengan:

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';

Namun, saya benar-benar ingin memiliki kata sandi hash dalam skrip, seperti:

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

Apakah ini mungkin? Agaknya versi hash dari kata sandi peran aplikasi disimpan di suatu tempat di dalam basis data.

Menggunakan SQL Server Management Studio "skrip ke ->" fungsionalitas, Peran Aplikasi ditulis dengan kata sandi baru , seperti:

/****** 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

Jelas, itu tidak membantu dalam kasus saya, meskipun itu memberikan metode yang menarik untuk menghasilkan kata sandi acak.


Berdasarkan jawaban sejauh ini, saya telah membuat saran Connect untuk menambahkan dukungan untuk produk ini:

Max Vernon
sumber

Jawaban:

6

Anda dapat terhubung menggunakan DAC ( Dedicated Administrator Connection ), dan menarik passwordkolom dari sys.sysowners. Pertama, hubungkan menggunakan:

ADMIN:Server\Instance

Kemudian:

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

Pandangan ini hanya terlihat ketika menggunakan DAC, dan kolom tidak terkena dalam pandangan orang tua yang merupakan terlihat ( sys.database_principals). Harap berhati-hati dengan DAC, tentu saja.

Itu semua berkata, ini tidak membantu Anda. CREATE APPLICATION ROLEjauh berbeda dari CREATE LOGIN, di mana Anda tidak dapat memberikan kata sandi hash , hanya teks biasa. Dan bahkan jangan berpikir tentang merekayasa balik nilai hash, karena versi modern SQL Server menggunakan metode rumit untuk mengenkripsi kata sandi. Bahkan jika Anda mencoba ini sendiri, Anda akan melihat bahwa hash yang berbeda dibuat setiap waktu, bahkan dalam pernyataan yang sama:

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

Hasil (pada mesin saya, kali ini), mencatat bahwa milik Anda akan bervariasi:

0x0200185968C35F22AF70...   0x0200D6C77A1D84A8467F...

Jadi, saya akan merekomendasikan:

  1. Menyimpan kata sandi aplikasi di kontrol sumber di suatu tempat, atau di mana pun Anda menyimpan kata sandi sistem lain saat ini, dan menggunakannya untuk menghasilkan skrip untuk menyebarkan peran aplikasi ke server lain (atau sumber mengontrol seluruh CREATE APPLICATION ROLEskrip); atau,
  2. Menggunakan peran reguler alih-alih peran aplikasi.
Aaron Bertrand
sumber
1

Tidak ada dalam sintaks yang memungkinkan ini terjadi

CREATE APPLICATION ROLE(Transact-SQL) - Buku Daring

Anda bisa menyiasatinya dengan membuat persetujuan di database templat dan minta skrip mengembalikannya. Satu implementasi (Dynamics NAV) membuat persetujuan dalam kode dan menyimpan kata sandi peran aplikasi terenkripsi dalam tabel di dalam database sehingga klien mendekripsi sandi peran.

Spörri
sumber