http://blogs.technet.com/b/lyudmila_fokina/archive/2010/05/27/sql-server.aspx
Людмила Фокина
Когда речь идет о конфиденциальных данных
(пароли, например), хочется быть уверенным, что они не попадают в SQL Trace и SQL аудит.
SQL Server автоматически распознает и отфильтровывает DDL и встроенные функции, которые могут содержать секретную информацию (например: OPEN SYMMETRIC KEY, EncryptByKey и т.д.).
Например:
CREATE SYMMETRIC KEY key00 WITH ALGORITHM = AES_256
ENCRYPTION BY PASSWORD = 'D3m0 p4SSw0Rd&'
go
OPEN SYMMETRIC KEY key00 DECRYPTION BY PASSWORD = 'D3m0
p4SSw0Rd&'
go
В результате trace будет выглядеть следующим
образом (для простоты я включила выборочные колонки):
Event class |
TextData |
Event subclass |
Object name |
Object Type |
SQL: Batch Starting |
--*CREATE SYMMETRIC KEY---------------… |
|
|
|
Audit: DB Object Mgr |
CREATE SYMMETRIC
KEY key00 WITH ALGORITHM = AES_256 ENCRYPTION BY PASSWORD = '******' |
1 - Create |
key00 |
19283 - SK |
SQL: Batch Completed |
--*CREATE SYMMETRIC KEY------------------ |
|
|
|
SQL: Batch Starting |
--*OPEN SYMMETRIC KEY------------------- |
|
|
|
Audit: DB Object Mgr |
OPEN SYMMETRIC
KEY key00 DECRYPTION BY PASSWORD = '******' |
10 - Open |
key00 |
19283 - SK |
SQL: Batch Completed |
--*OPEN SYMMETRIC KEY----------------… |
|
|
|
К сожалению, при использовании динамических запросов или пользовательских хранимых процедур (что является рекомендованной практикой для борьбы с потенциальными SQL injections), SQL Server не имеет возможности определить, используются ли DDL и встроенные функции, упомянутые выше.
Например:
EXEC( 'CREATE
SYMMETRIC KEY key00 WITH ALGORITHM = AES_256
ENCRYPTION BY PASSWORD = ''D3m0 p4SSw0Rd&''')
EXEC( 'OPEN
SYMMETRIC KEY key00 DECRYPTION BY PASSWORD = ''D3m0 p4SSw0Rd&''')
Event class |
TextData |
Event subclass |
Object name |
Object Type |
SQL: Batch Starting |
EXEC( 'CREATE
SYMMETRIC KEY key00 WITH ALGORITHM = AES_256
ENCRYPTION BY PASSWORD = ''D3m0 p4SSw0Rd&''') EXEC( 'OPEN SYMMETRIC
KEY key00 DECRYPTION BY PASSWORD = ''D3m0 p4SSw0Rd&''') |
|
|
|
Audit: DB Object Mgr |
CREATE SYMMETRIC
KEY key00 WITH ALGORITHM = AES_256 ENCRYPTION BY PASSWORD = '******' |
1 - Create |
key00 |
19283 - SK |
Audit: DB Object Mgr |
OPEN SYMMETRIC
KEY key00 DECRYPTION BY PASSWORD = '******' |
10 - Open |
key00 |
19283 - SK |
SQL: Batch Completed |
EXEC( 'CREATE
SYMMETRIC KEY key00 WITH ALGORITHM = AES_256
ENCRYPTION BY PASSWORD = ''D3m0 p4SSw0Rd&''') EXEC( 'OPEN SYMMETRIC
KEY key00 DECRYPTION BY PASSWORD = ''D3m0 p4SSw0Rd&''') |
|
|
|
Существует механизма дать SQL Server-у понять, что данные следует фильтровать. Идея состоит в использование встроенных функций, о которых SQL Server-у известно, что они могут использовать секретную информацию.
Например:
DECLARE @Secret nvarchar(max)
SELECT @Secret = CASE WHEN 1=1 THEN
'CREATE
SYMMETRIC KEY key00 WITH ALGORITHM = AES_256 ENCRYPTION BY PASSWORD = ''D3m0
p4SSw0Rd&'''
ELSE EncryptByPassphrase('','') END
EXEC(@Secret)
SELECT @Secret
= CASE WHEN 1=1 THEN
'OPEN SYMMETRIC KEY key00 DECRYPTION BY
PASSWORD = ''D3m0 p4SSw0Rd&'''
ELSE EncryptByPassphrase('','') END
EXEC(@Secret)
go
EncryptByPassphrase() никогда не выполнится в этом примере, но даст сигнал фильтровать потенциальные секретные данные в Trace-е и аудите.
Результат будет выглядеть следующим образом:
Event class |
TextData |
Event subclass |
Object name |
Object Type |
SQL: Batch Starting |
DECLARE @Secret
nvarchar(max) --*ASSIGN--------------------------- EXEC(@Secret) --*ASSIGN--------------------------- EXEC(@Secret) |
|
|
|
Audit: DB Object Mgr |
CREATE SYMMETRIC
KEY key00 WITH ALGORITHM = AES_256 ENCRYPTION BY PASSWORD = '******' |
1 - Create |
key00 |
19283 - SK |
Audit: DB Object Mgr |
OPEN SYMMETRIC
KEY key00 DECRYPTION BY PASSWORD = '******' |
10 - Open |
key00 |
19283 - SK |
SQL: Batch Completed |
DECLARE @Secret
nvarchar(max) --*ASSIGN--------------------------- EXEC(@Secret) --*ASSIGN--------------------------- EXEC(@Secret) |
|
|
|
Комментариев нет:
Отправить комментарий