SQL Server säkerhet – Revision av Login del 2

Att revidera login på en instans manuellt är tidsödande. Insamlingen av data går mestadels att göra via skript, det förenklar en del men analysen måste göras manuellt. Ofta måste flera team och intressenter vara inblandade i arbetet t ex Windowsteam och ägare av säkerhetsgrupper

  • Medlemmar i server roller
EXEC master.sys.sp_helpsrvrolemember
  • Validera alla Windowslogin
EXEC master.sys.sp_validatelogins

Listar alla Windowslogin som inte längre finns på servern eller i Active Directory.

  • Lista Windowsgrupper med medlemmar
DECLARE @members table(accountName nvarchar(255), type nvarchar(55), privilege nvarchar(55), mappedLoginName nvarchar(255), permissionPath nvarchar(255))
DECLARE @groups table(name nvarchar(255))
DECLARE @inValidGroups table(SID uniqueidentifier, name nvarchar(255))
DECLARE @groupName nvarchar(255)

INSERT INTO @inValidGroups
EXEC master.sys.sp_validatelogins
INSERT INTO @groups
SELECT p.name FROM sys.server_principals p WHERE p.type = 'G' AND p.name NOT LIKE 'NT SERVICE%'
DELETE FROM @groups
WHERE name IN (SELECT name FROM @inValidGroups)
WHILE EXISTS (SELECT 1 FROM @groups)
BEGIN
            SELECT TOP 1 @groupName = name FROM @groups
            INSERT INTO @members
            EXEC master.sys.xp_logininfo @groupName,'members'
            DELETE FROM @groups WHERE name = @groupName
END
SELECT * FROM @members
  • Kontrollera BuiltinAdministrators
SELECT r.name  AS Roll, u.name  AS loginNamn
FROM sys.server_role_members m JOIN
sys.server_principals r ON m.role_principal_id = r.principal_id  JOIN
sys.server_principals u ON m.member_principal_id = u.principal_id
WHERE u.name = 'BUILTINAdministrators'

 

Om gruppen har rättigheter på instansen visas de i listan ovan.

  • Lista och kontrollera användarna i local administrator
  • Normal ligger detta utanför vårt ansvar och kontrolleras av de som är ansvariga för OS men det kan göras manuellt eller via t ex PowerShell skript.
  • Kontrollera status för sa
SELECT p.name, 
            CASE WHEN p.name = 'sa' THEN 'Nej' ELSE 'Ja' END [Ändrat namn], 
            CASE WHEN p.is_disabled = 0 THEN 'Aktivt' ELSE 'Ej Aktivt' END AS [Status]
FROM sys.server_principals AS p
WHERE p.sid = 0x01 
AND p.type = 'S'
  • Kontrollera lösenordskrav för alla SQL login
SELECT name  FROM sys.sql_logins 
WHERE  is_policy_checked=0
  • Lista SQL login som har svaga lösenord

För att kontrollera vilka SQL login som har svaga lösenord använder vi skriptet nedan. Det bygger på en lista med svaga lösenord, de som är med i listan nedan är de som vi vanligen stöter på och går att utöka om man vill.

     DECLARE @weakPwdList nvarchar(155)
SET @weakPwdList = '123,1234,12345,abc,default,guest,123456,|Login|123,|Login|,|Login||Login|,admin,Administrator,admin123,,'
SELECT name AS [Login att kontrollera], 
CASE WHEN PWDCOMPARE(REPLACE(wPwd.pwd,'|Login|',REVERSE(name)),password_hash) = 0 THEN REPLACE(wPwd.pwd,'|Login|',name) 
            ELSE REPLACE(wPwd.pwd,'|Login|',REVERSE(name))
END AS [Svagt lösenord]
FROM sys.sql_logins INNER JOIN
( 
            SELECT SUBSTRING(@weakPwdList, [number]+1, CHARINDEX(',', @weakPwdList, [number]+1)-[number]-1) AS pwd
            FROM master.dbo.spt_values s
            WHERE s.type='P'
            AND s.Number < LEN(@weakPwdList)
            AND SUBSTRING(@weakPwdList, [number], 1) = ','
) AS wPwd ON (PWDCOMPARE(wPwd.pwd, password_hash) = 1 OR
PWDCOMPARE(REPLACE(wPwd.pwd,'|Login|',name),password_hash) = 1 OR
PWDCOMPARE(REPLACE(wPwd.pwd,'|Login|',REVERSE(name)),password_hash) = 1)
ORDER BY name

Sedan är det bara att börja gå igenom allt…
/Björn