Прохождение теста Works with SQL Server 2008. Требование 1
В этом квесте мое внимание привлекла еще такая строчка "Please note that the test fee only covers one verification of one set of test results. Should your test results of your product fail the verification, a re-test fee is required for any re-verification of any new test results". См. предыдущий пост, рис.11, раздел Summary. Из нее получается, что бесплатный тест у нас не только стоит денег, он еще и одноразовый, как комбайн. Чтобы лишить VeriTest удовольствия повторно стянуть бабки, давайте пристально пройдемся по требованиям теста Works with SQL Server 2008 и посмотрим, что конкретно нужно сделать, чтобы им с первого захода удовлетворить. Требования эти были перечислены там же, в предыдущем посте. Из их списка можно видеть, что логика отсутствует не только в условиях получения теста, но и в его содержании, и к новой функциональности 2008-го он имеет весьма опосредованное отношение.
Требование 1. Приложение должно использовать интегрированную систему безопасности (integrated security) - Windows Authentication - для соединения с SQL Server 2008 и компонентами сервера. Если использование Windows Authentication невозможно по каким-либо причинам, следует использовать опцию SQL Server Authentication с поддержкой Enforce Password Policy и Password Expiration.
Посмотреть режим аутентификации на SQL Server можно в SSMS
рис.1
или непосредственно в реджистри. В моем случае эта информация хранится в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQLServer\LoginMode, потому что это СТР3 2008 R2. Для 2008-го вместо MSSQL10_50, наверно, будет MSSQL10. Двоечка означает mixed аутентификацию, когда допускаются как SQLные, так и виндузовые принципалы, единичка - строго Windows-аутентификацию.
рис.2
Как известно, в реджистри можно залезть непосредственно из T-SQLного скрипта:
declare @LoginMode int
exec master.dbo.xp_regread N'HKEY_LOCAL_MACHINE', N'SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQLServer', N'LoginMode', @LoginMode OUTPUT
select @LoginMode
Скрипт 1
Кроме xp_reg*, в xpstar.dll имеется еще одна группа расширенных хранимых процедур по работе с реестром - xp_instance_reg*. Отличием является, что в них нужно указывать в пути имя экземпляра. Посмотрите в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL. Там перечислены имена всех установленных на машине экземпляров и соответствующие им кусочки пути реджистри. Например, MSSQLSERVER - MSSQL10_50.MSSQLSERVER. Таким образом, в случае xp_instance_reg* вместо Microsoft SQL Server\MSSQL10_50.MSSQLSERVER мы подставляем имя экземпляра MSSQLSERVER и имеем
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'SOFTWARE\Microsoft\MSSQLSERVER\MSSQLServer', N'LoginMode', @LoginMode OUTPUT
Скрипт 2
рис.3
Более детально различие между xp_reg* и xp_instance_reg* разбиралось в посте "Как определить дефолтную локацию для файлов БД". Начиная с версии 2005, оно представляет чисто умозрительный интерес, т.к. не составляет труда написать CLRную функцию, которая будет читать/писать из SQL Server в реджистри.
При использовании на сервере смешанной аутентификации проверка применения парольной политики и истечения срока действия пароля для SQL Serverных логинов также делается из SSMS
рис.4
либо по запросу:
select is_policy_checked, is_expiration_checked from sys.sql_logins where name = '<SQLный логин>'
Скрипт 3
рис.5
Этим запросом можно выявить все неподобающие логины:
select * from sys.sql_logins where is_expiration_checked = 0 or is_policy_checked = 0
Скрипт 4
Содержание парольных политик SQL Server берет из групповых политик. Скажите из окна командной строки gpedit.msc и откройте Computer Configuration\Windows Settings\Security Settings\Account Policies\Password Policy:
рис.6
is_expiration_checked - это Maximum password age, а is_policy_checked относится к Password Policy в целом, т.е. и к сроку действия, и к тому, сколько предыдущих хэшей он будет запоминать, и к правилам сложности пароля. Что понимается под сложностью пароля, объясняется там же:
рис.7
is_expiration_checked входит в is_policy_checked, т.е. ситуация, когда CHECK_POLICY ставится в OFF, а CHECK_EXPIRATION - в ON, вызовет ошибку. Более подробно на эту тему можно прочитать в BOL: http://msdn.microsoft.com/ru-ru/library/ms161959.aspx.
Изменение SQLного логина с тем, чтобы он поддерживал Password Policy и Password Expiration, делается установкой галок на рис.4 или при помощи команды ALTER LOGIN:
alter login sa with check_policy = ON, check_expiration = ON
Скрипт 5
Объединяя Скрипты 4 - 5, получаем автоматическую поправлялку для всех несоответствующих логинов:
declare @name sysname, @i int, @s nvarchar(1000)
select @i = min(principal_id) - 1 from sys.sql_logins where is_expiration_checked = 0 or is_policy_checked = 0
while (1 = 1) begin
select top 1 @name = name, @i = principal_id from sys.sql_logins where (is_expiration_checked = 0 or is_policy_checked = 0) and principal_id > @i order by principal_id
if @@ROWCOUNT = 0 break
exec ('alter login ' + @name + ' with check_policy = ON, check_expiration = ON')
end
Скрипт 6
На семинаре был вопрос: надо ли это делать для задисейбленых SQLных логинов. Я не нашел никаких комментариев эту тему в условиях теста (http://www.lionbridge.com/certification/Works-With-SQL-Server-2008-Specifications.doc). Ответил так: поглядите условия и представьте тех, кто их сочинял. Уверены ли вы, что им известно про alter login sa enable/disable? Ставьте от греха для всех.
Алексей Шуленин, Microsoft
Продолжение следует.