Krüptograafilise soolavariatsiooni puudumise parandamine SQL Server sa sisselogimise räsimisel

Microsoft SQL Server 2005 ja uuemates versioonides kasutavad mitu SQL Server sama krüptograafilist soola sisseehitatud sisselogimiseks. Kuna sool on kõigis installatsioonides sama, muutuvad teatud tüüpi jõhkrad jõurünnakud praktilisemaks, kui ründaja saab kõigepealt juurdepääsu räsitud paroolile. Räsitud paroolid on saadaval ainult SQL Server administraatoritele.

Sümptomid

SQL Server 2005 ja uuemates versioonides luuakse krüptograafiline sool koos sa login. Kui CHECK_POLICY on lubatud, ei taastata krüptograafilist soola, kui kasutaja muudab parooli, et see vastaks parooliajaloole. vaikimisi on CHECK_POLICY lubatud SQL Server 2005 jaoks. Kui CHECK_POLICY on keelatud, ei ole soola konsistents enam sa sisselogimiseks vajalik ja uus sool taastatakse järgmisel paroolimuudatusel.

Kuigi see kehtib kõigi kontode kohta, genereeritakse järgu käigus sa sisselogimiskonto. Seetõttu luuakse selle sool sama ehitusprotsessi ajal ja seda säilitatakse SQL Server seadistamise ajal.

Märkus. SQL Server 2008 puhul mõjutab see probleem ka poliitikapõhise halduse funktsiooni kasutatavaid vaikelogimisfunktsioone, kuid risk väheneb. Vaikimisi on need sisselogimised keelatud.

Leevendused

Isegi kui krüptograafiline sool jääb mitmes seadmes samaks, ei oleks parooli räsi ohustamine piisav. Sellise käitumise kasutamiseks peab pahatahtlikul kasutajal parooli räsi hankimiseks olema halduslik juurdepääs SQL Server eksemplarile. Kui järgitakse häid tavasid, ei saa tavalised kasutajad parooli räsiteavet tuua. Seetõttu ei saaks nad ära kasutada krüptograafiliste soolade variatsioonide puudumist.

Põhjus

SQL Server 2005 hoolduspaketi teave

Selle probleemi lahendamiseks hankige uusim hoolduspakett SQL Server 2005 jaoks. Microsofti teabebaasis oleva artikli kuvamiseks klõpsake järgmist artiklinumbrit.

913089 Uusima hoolduspaketi hankimine versioonile SQL Server 2005

SQL Server 2008 hoolduspaketi teave

Selle probleemi lahendamiseks hankige uusim hoolduspakett SQL Server 2008 jaoks. Microsofti teabebaasis oleva artikli kuvamiseks klõpsake järgmist artiklinumbrit.

968382 Uusima hoolduspaketi hankimine versioonile SQL Server 2008

Lahendus

SQL Server 2005 hoolduspaketi Service Pack 2 või uuemate versioonide korral saate sa login konto krüptograafilise soola lähtestamiseks käivitada järgmise skripti. Skripti käivitamiseks peate olema sisse logitud kontoga, millel on CONTROL SERVERI õigused, või konto peab olema sysadmin serverirolli liige. Pidage meeles, et pärast krüptograafilise soola lähtestamist lähtestatakse ka sa logimise parooliajalugu.

-- Work around for SQL Server 2005 SP2+
--
-- Sets the password policy check off for [sa]
-- Replaces [sa] password with a random byte array
-- NOTE: This effectively replaces the sa password hash with 
-- a random bag of bytes, including the salt,
-- and finally sets the password policy check on again
--
-- After resetting the salt, 
-- it is necessary to set the sa password,
-- or if preferred, disable sa
--
CREATE PROC #sp_set_new_password_and_set_for_sa(@new_password sysname, @print_only int = null)
AS
DECLARE @reset_salt_pswdhash nvarchar(max)
DECLARE @random_data varbinary(24)
DECLARE @hexstring nvarchar(max)
DECLARE @i int
DECLARE @sa_name sysname;

SET @sa_name = suser_sname(0x01);
SET @random_data = convert(varbinary(16), newid()) + convert(varbinary(8), newid())
SET @hexstring = N'0123456789abcdef'
SET @reset_salt_pswdhash = N'0x0100'
SET @i = 1
WHILE @i <= 24
BEGIN
declare @tempint int
declare @firstint int
declare @secondint int

select @tempint = convert(int, substring(@random_data,@i,1))
select @firstint = floor(@tempint/16)
select @secondint = @tempint - (@firstint*16)

select @reset_salt_pswdhash = @reset_salt_pswdhash +
substring(@hexstring, @firstint+1, 1) +
substring(@hexstring, @secondint+1, 1)

set @i = @i+1
END

DECLARE @sql_cmd nvarchar(max)

SET @sql_cmd = N'ALTER LOGIN ' + quotename(@sa_name) + N' WITH CHECK_POLICY = OFF;
ALTER LOGIN ' + quotename(@sa_name) + N' WITH PASSWORD = ' + @reset_salt_pswdhash + N' HASHED;
ALTER LOGIN ' + quotename(@sa_name) + N' WITH CHECK_POLICY = ON;
ALTER LOGIN ' + quotename(@sa_name) + N' WITH PASSWORD = ' + quotename(@new_password, '''') + ';'

IF( @print_only is not null AND @print_only = 1 )
print @sql_cmd
ELSE
EXEC( @sql_cmd )
go

---------------------------------------------------------------------------------------
-- Usage example:
--
DECLARE @new_password sysname 

-- Use tracing obfuscation in order to filter the new password from SQL traces
-- http://blogs.msdn.com/sqlsecurity/archive/2009/06/10/filtering-obfuscating-sensitive-text-in-sql-server.aspx
--
SELECT @new_password = CASE WHEN 1=1 THEN 
    -- TODO: replace password placeholder below with a strong password
    --
   ##[MUST_CHANGE: replace this placehoder with a new password]##:
   ELSE EncryptByPassphrase('','') END
EXEC #sp_set_new_password_and_set_for_sa @new_password
go

DROP PROC #sp_set_new_password_and_set_for_sa 
go

SQL Server 2008 puhul saate käivitada järgmise skripti. Skripti käivitamiseks peate olema sisse logitud kontoga, millel on CONTROL SERVERI õigused, või konto peab olema sysadmin serverirolli liige.

-- Work around for SQL Server 2008
--

------------------------------------------------------------------------
-- Set the password policy check off for [sa]
-- Reset the password
-- Set the password policy check on for [sa] once again
-- 
-- NOTE: The password history will be deleted
--
CREATE PROC #sp_set_new_password_and_set_for_sa(@new_password sysname, @print_only int = null) 
AS
DECLARE @sql_cmd nvarchar(max);

DECLARE @sa_name sysname;

-- Get the current name for SID 0x01. 
-- By default the name should be "sa", but the actual name may have been chnaged by the system administrator
--
SELECT @sa_name = suser_sname(0x01);

-- NOTE: This password will not be subject to password policy or complexity checks
-- if desired, this step can be replaced with a "throw away" password for 
-- and set the real password after the check policy setting has been set
--
SELECT @sql_cmd = 'ALTER LOGIN ' + quotename(@sa_name) + ' WITH CHECK_POLICY = OFF;
ALTER LOGIN ' + quotename(@sa_name) + ' WITH PASSWORD = ' + quotename(@new_password, '''') + ';
ALTER LOGIN ' + quotename(@sa_name) + ' WITH CHECK_POLICY = ON;'

IF( @print_only is not null AND @print_only = 1 )
print @sql_cmd
ELSE
EXEC( @sql_cmd )
go

---------------------------------------------------------------------------------------
-- Usage example:
--
DECLARE @new_password sysname

-- Use tracing obfuscation in order to filter the new password from SQL traces
-- http://blogs.msdn.com/sqlsecurity/archive/2009/06/10/filtering-obfuscating-sensitive-text-in-sql-server.aspx
--
SELECT @new_password = CASE WHEN 1=1 THEN 
    -- TODO: replace password placeholder below with a strong password
    --
   ##[MUST_CHANGE: replace this placehoder with a new password]##:
   ELSE EncryptByPassphrase('','') END
EXEC #sp_set_new_password_and_set_for_sa @new_password
go

DROP PROC #sp_set_new_password_and_set_for_sa 
go

versioonis SQL Server 2008 saab poliitikapõhise halduse sisselogimiste krüptograafilise soola lähtestamiseks kasutada järgmist skripti. Skripti käivitamiseks peate olema sisse logitud kontoga, millel on CONTROL SERVERI õigused, või konto peab olema sysadmin serverirolli liige.

------------------------------------------------------------------------
-- Set the password policy check off for the Policy principals
-- Reset the password
-- Set the password policy check on for them once again
--
-- NOTE: 
-- These principals are not intended to establish connections to SQL Server
-- So this SP will also make sure they are disabled
--
CREATE PROC #sp_reset_password_and_disable(@principal_name sysname, @print_only int = null) 
AS
DECLARE @random_password nvarchar(max)

SET @random_password = convert(nvarchar(max), newid()) + convert(nvarchar(max), newid())
DECLARE @sql_cmd nvarchar(max)

SET @sql_cmd = N'ALTER LOGIN ' + quotename(@principal_name) + N' WITH CHECK_POLICY = OFF;
ALTER LOGIN ' + quotename(@principal_name) + N' WITH PASSWORD = ''' + replace(@random_password, '''', '''''') + N''';
ALTER LOGIN ' + quotename(@principal_name) + N' WITH CHECK_POLICY = ON;
ALTER LOGIN ' + quotename(@principal_name) + N' DISABLE;'

IF( @print_only is not null AND @print_only = 1 )
print @sql_cmd
ELSE
EXEC( @sql_cmd )
go

EXEC #sp_reset_password_and_disable '##MS_PolicyEventProcessingLogin##';
EXEC #sp_reset_password_and_disable '##MS_PolicyTsqlExecutionLogin##';
go

SELECT name, password_hash, is_disabled FROM sys.sql_logins
go

Ajutine lahendus

Microsoft on kinnitanud, et see on jaotises „Rakenduskoht“ loetletud Microsofti toodete korral esinev probleem.
See probleem parandati esmakordselt SQL Server 2005 SQL Server 2005 hoolduspaketis Service Pack 4 SQL Server 2005.
See probleem lahendati esmalt SQL Server 2008 hoolduspaketis Service Pack 2 SQL Server 2008.

Olek

Microsoft tänab , et töötate koos meiega klientide kaitsmiseks.

Veel teavet