Korrigieren das Fehlen von kryptografischen salt Abwandlung Hash für SQL Server-sa-Anmeldung

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 980671 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

Problembeschreibung

In Microsoft SQL Server 2005 und höheren Versionen verwenden mehrere Instanzen von SQL Server die gleiche kryptografische Salt für den integrierten Benutzernamen sa. Da die Salt für alle Installationen identisch ist, erzwingen bestimmte Arten von Brute Angriffe werden praktischer, wenn der Angreifer zunächst das gehashte Kennwort zugreifen kann. Hashkennwörter werden nur die Administratoren von SQL Server zur Verfügung.

Ursache

In SQL Server 2005 und höheren Versionen wird die kryptografische Salt zusammen mit dem Benutzernamen sa generiert. Wenn CHECK_POLICY aktiviert ist, wird die kryptografische Salt nicht neu generiert, wenn der Benutzer das Kennwort, ändert um mit der Kennwortchronik konsistent sein. Standardmäßig ist die CHECK_POLICY für SQL Server 2005 aktiviert. Wenn die CHECK_POLICY deaktiviert ist, die salt Konsistenz ist nicht mehr erforderlich, für die Systemadministratoranmeldung und eine neue Salt wird auf der nächsten Kennwortänderung regeneriert.

Obwohl dies für alle Konten true ist, wird das Anmeldekonto sa während des Buildvorgangs generiert. Daher die Salt wird während des gleichen Buildprozesses erstellt und verwaltet wird, während eine Instanz von SQL Server Setup.

Hinweis: Dieses Problem betrifft auch die Standard-Anmeldungen, die von der Gruppenrichtlinien-based-Feature verwendet werden, aber das Risiko reduziert, für SQL Server 2008. Standardmäßig sind diese Anmeldungen deaktiviert.

Schadensbegrenzende Maßnahmen

Auch wenn die kryptografische Salt über mehrere Installationen gleich bleibt, würde es nicht ausreichend, um den Kennworthash gefährden. Um dieses Verhalten auszunutzen, müsste der böswillige Benutzer administrativen Zugriff auf eine Instanz von SQL Server, um den Kennworthash erhalten haben. Wenn bewährte Methoden befolgt werden, werden normale Benutzer können nicht den Kennworthash abgerufen werden. Deshalb würden Sie ausnutzen den Mangel an kryptografischen salt Variation möglich.

Abhilfe

Für SQL Server 2005 Service Pack 2 oder höher können Sie das folgende Skript aus, um die kryptografische Salt, der das Anmeldekonto sa zurücksetzen ausführen. Um das Skript auszuführen, müssen Sie über ein Konto mit CONTROL SERVER Berechtigungen angemeldet sein, oder das Dienstkonto muss Mitglied der Serverrolle Sysadmin sein. You should be aware that, after you reset the cryptographic salt, the password history for the sa login will also be reset.
-- 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
Für SQL Server 2008 können Sie das folgende Skript ausführen. Um das Skript auszuführen, müssen Sie über ein Konto mit CONTROL SERVER Berechtigungen angemeldet sein, oder das Dienstkonto muss Mitglied der Serverrolle Sysadmin sein.
-- 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
In SQL Server 2008, the cryptographic salt for the Policy Based Management logins can be reset by using the following script. Um das Skript auszuführen, müssen Sie über ein Konto mit CONTROL SERVER Berechtigungen angemeldet sein, oder das Dienstkonto muss Mitglied der Serverrolle Sysadmin sein.
------------------------------------------------------------------------
-- 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

Status

Dieses Problem wird in zukünftigen Servicepacks für SQL Server 2005, SQL Server 2008 und in zukünftigen Versionen von SQL Server behoben werden.

Weitere Informationen

Microsoft thanks folgenden für die Zusammenarbeit mit uns Kunden zu schützen:

Eigenschaften

Artikel-ID: 980671 - Geändert am: Dienstag, 2. März 2010 - Version: 1.0
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Enterprise Edition for Itanium Based Systems
  • Microsoft SQL Server 2005 Enterprise X64 Edition
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Standard X64 Edition
  • Microsoft SQL Server 2005 Workgroup Edition
  • Microsoft SQL Server 2008 Developer
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 Standard
  • Microsoft SQL Server 2008 Web
  • Microsoft SQL Server 2008 Workgroup
Keywords: 
kbmt kbpasswords kbexpertiseadvanced kbsurveynew kbprb KB980671 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 980671
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com