Seguridad – Permisos en SQL Server (Relevamiento)
Seguridad – Permisos en SQL Server (Relevamiento):
Puntos para el relevar y permitir establecer y documentar permisos en servidores de bases de datos MS SQL Server (version 2005).
Se incluyen SQL Logins.
Listado de logins habilitados con especificación de Password Policy / Expiration
IF EXISTS ( SELECT *
FROM tempdb.dbo.sysobjects
WHERE id =
OBJECT_ID(N’[tempdb].[dbo].[SQL_DB_REP]‘) )
DROP TABLE [tempdb].[dbo].[SQL_DB_REP] ;
GO
CREATE TABLE [tempdb].[dbo].[SQL_DB_REP]
(
[Server] [varchar](100) NOT NULL,
[DB_Name] [varchar](70) NOT NULL,
[User_Name] [nvarchar](90) NULL,
[Group_Name] [varchar](100) NULL,
[Account_Type] [varchar](22) NULL,
[Login_Name] [varchar](80) NULL,
[Def_DB] [varchar](100) NULL
)
ON [PRIMARY]
INSERT INTO [tempdb].[dbo].[SQL_DB_REP]
Exec sp_MSForEachDB ‘SELECT CONVERT(varchar(100),
SERVERPROPERTY(”Servername”)) AS Server,
”?” as DB_Name,
usu.name u_name
,CASE
WHEN (usg.uid is null) then ”public”
ELSE usg.name
END as Group_Name
,CASE
WHEN usu.isntuser=1 then ”Windows Domain Account”
WHEN usu.isntgroup = 1 then ”Windows Group”
WHEN usu.issqluser = 1 then ”SQL Account”
WHEN usu.issqlrole = 1 then ”SQL Role”
END as Account_Type
,lo.loginname
,lo.dbname as Def_DB
FROM
[?]..sysusers usu LEFT OUTER JOIN
([?]..sysmembers mem INNER JOIN [?]..sysusers usg ON
mem.groupuid = usg.uid) ON usu.uid = mem.memberuid
LEFT OUTER JOIN master.dbo.syslogins lo on usu.sid =
lo.sid
WHERE
(usu.islogin = 1 and usu.isaliased = 0 and usu.hasdbaccess =
1) and
(usg.issqlrole = 1 or usg.uid is null)’
SELECT [Server],
[DB_Name],
[User_Name],
[Group_Name],
[Account_Type],
[Login_Name],
[Def_DB]
FROM [tempdb].[dbo].[SQL_DB_REP]
USE [tempdb]
GO
DROP TABLE [dbo].[SQL_DB_REP]
GO
select catalog_name, schema_name, schema_owner
from information_schema.schemata
SELECT QUOTENAME(SCHEMA_NAME(schema_id)) + ‘.’ + QUOTENAME(name)
AS SchemaTable
FROM sys.tables
order by SCHEMA_NAME(schema_id), name
select *
from information_schema.tables
order by table_type, table_name
Select
permission_name,
PER.class_desc permission_class,
state_desc state,
PRI1.name grantee,
PRI2.name grantor
from
sys.server_permissions PER,
sys.server_principals PRI1,
sys.server_principals PRI2
where
PER.grantee_principal_id = PRI1.principal_id
and PER.grantor_principal_id = PRI2.principal_id
order by permission_name
select
class_desc,
OBJ.type_desc tipo_objeto,
OBJ.name objeto,
PRI1.name grantee,
PRI2.name grantor,
permission_name,
state_desc
from sys.database_permissions PER
left join sys.all_objects OBJ on OBJ.object_id = major_id
left join sys.database_principals PRI1 on PER.grantee_principal_id = PRI1.principal_id
left join sys.database_principals PRI2 on PER.grantor_principal_id = PRI2.principal_id
order by PRI1.name desc
Puntos para el relevar y permitir establecer y documentar permisos en servidores de bases de datos MS SQL Server (version 2005).
- Verificar modo de autenticación y si la cuenta sa está habilitada con contraseña fuerte.
- Especificaciones de Seguridad vigentes:
- Relevar SERVER ROLE, SQL LOGIN (incluyendo políticas/expiración), WINDOWS GROUP, WINDOWS LOGIN – Identificar los creados por el organismo.
- Relevar DATABASE ROLE, APPLICATION ROLE, SQL USER, WINDOWS GROUP, WINDOWS USER, etc. – diferenciar los creados por el organismo.
- Identificar bases de datos, sus objetos y esquemas.
- Definición de Permisos.
- Reporte de Auditoria.
1. Modo de Autenticación al servidor
- Windows Authentication [ ]
- SQL Server & Windows Authentication (Mixed Mode) [ ]
- Cuenta sa Habilitada [ ] strong password [ ]
2. Entidades de Seguridad (Security Principals)
2.1 Capa del Servidor
Se incluyen SQL Logins.
select principal_id, name, type_desc, is_disabled, default_database_name from sys.server_principals order by type_desc;
2.2. Capa de Base de Datos
select principal_id, name, type_desc from sys.database_principals order by type_desc, name;
2.3. SQL Logins: Politicas de Password / Expiración
Listado de logins habilitados con especificación de Password Policy / Expiration
Select principal_id, name, type_desc, is_policy_checked, is_expiration_checked from sys.sql_logins order by name;
3. Base de Datos
3.1 Listado de bases de datos de cada instancia
select database_id, name, state_desc from sys.databases
3.2 Usuarios y Roles
IF EXISTS ( SELECT *
FROM tempdb.dbo.sysobjects
WHERE id =
OBJECT_ID(N’[tempdb].[dbo].[SQL_DB_REP]‘) )
DROP TABLE [tempdb].[dbo].[SQL_DB_REP] ;
GO
CREATE TABLE [tempdb].[dbo].[SQL_DB_REP]
(
[Server] [varchar](100) NOT NULL,
[DB_Name] [varchar](70) NOT NULL,
[User_Name] [nvarchar](90) NULL,
[Group_Name] [varchar](100) NULL,
[Account_Type] [varchar](22) NULL,
[Login_Name] [varchar](80) NULL,
[Def_DB] [varchar](100) NULL
)
ON [PRIMARY]
INSERT INTO [tempdb].[dbo].[SQL_DB_REP]
Exec sp_MSForEachDB ‘SELECT CONVERT(varchar(100),
SERVERPROPERTY(”Servername”)) AS Server,
”?” as DB_Name,
usu.name u_name
,CASE
WHEN (usg.uid is null) then ”public”
ELSE usg.name
END as Group_Name
,CASE
WHEN usu.isntuser=1 then ”Windows Domain Account”
WHEN usu.isntgroup = 1 then ”Windows Group”
WHEN usu.issqluser = 1 then ”SQL Account”
WHEN usu.issqlrole = 1 then ”SQL Role”
END as Account_Type
,lo.loginname
,lo.dbname as Def_DB
FROM
[?]..sysusers usu LEFT OUTER JOIN
([?]..sysmembers mem INNER JOIN [?]..sysusers usg ON
mem.groupuid = usg.uid) ON usu.uid = mem.memberuid
LEFT OUTER JOIN master.dbo.syslogins lo on usu.sid =
lo.sid
WHERE
(usu.islogin = 1 and usu.isaliased = 0 and usu.hasdbaccess =
1) and
(usg.issqlrole = 1 or usg.uid is null)’
SELECT [Server],
[DB_Name],
[User_Name],
[Group_Name],
[Account_Type],
[Login_Name],
[Def_DB]
FROM [tempdb].[dbo].[SQL_DB_REP]
USE [tempdb]
GO
DROP TABLE [dbo].[SQL_DB_REP]
GO
3.3. Esquemas
3.3.1 Listado de todos los esquemas
select catalog_name, schema_name, schema_owner
from information_schema.schemata
3.3.2 Listado de esquemas y tablas por base de datos
SELECT QUOTENAME(SCHEMA_NAME(schema_id)) + ‘.’ + QUOTENAME(name)
AS SchemaTable
FROM sys.tables
order by SCHEMA_NAME(schema_id), name
3.4 Tablas y vistas
select *
from information_schema.tables
order by table_type, table_name
4. Permisos
4.1. Permisos sobre el servidor
Select
permission_name,
PER.class_desc permission_class,
state_desc state,
PRI1.name grantee,
PRI2.name grantor
from
sys.server_permissions PER,
sys.server_principals PRI1,
sys.server_principals PRI2
where
PER.grantee_principal_id = PRI1.principal_id
and PER.grantor_principal_id = PRI2.principal_id
order by permission_name
4.2. Permisos en la base de datos
select
class_desc,
OBJ.type_desc tipo_objeto,
OBJ.name objeto,
PRI1.name grantee,
PRI2.name grantor,
permission_name,
state_desc
from sys.database_permissions PER
left join sys.all_objects OBJ on OBJ.object_id = major_id
left join sys.database_principals PRI1 on PER.grantee_principal_id = PRI1.principal_id
left join sys.database_principals PRI2 on PER.grantor_principal_id = PRI2.principal_id
order by PRI1.name desc
5. Reporte de Seguridad para Auditoria
5.1 Datos a obtener
- Listado de usuarios con permisos ‘sa’.
- Listado de cuentas con acceso como local administrator.
- Listado de logins usados
- NT Login
- SQL Login
- NT Group Login
- Listado de quienes pertenecen a los grupos NT (si es que se usan)
- Verificar si cuentas hay Windows que no existan y que estén definidas en SQL Server
- Lista de usuarios que usan roles de base de datos incluyendo los roles en cuestión.
5.2 Requerimientos de ejecución
SELECT * FROM sys.configurations where name = 'xp_cmdshell' or name = 'show advanced options'; GO sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_configure 'xp_cmdshell', 1; GO RECONFIGURE; GO -- deshabilitar 'xp_cmdshell' sp_configure 'xp_cmdshell', 0; GO RECONFIGURE; GO sp_configure 'show advanced options', 0; GO
5.3 Script
USE master GO SET nocount ON -- roles CREATE TABLE #temp_srvrole (ServerRole VARCHAR(128), Description VARCHAR(128)) INSERT INTO #temp_srvrole EXEC sp_helpsrvrole -- syslogins CREATE TABLE #temp_memberrole (ServerRole VARCHAR(128), MemberName VARCHAR(265), MemberSID VARCHAR(300)) DECLARE @ServerRole VARCHAR(128) DECLARE srv_role CURSOR FAST_FORWARD FOR SELECT ServerRole FROM #temp_srvrole OPEN srv_role FETCH NEXT FROM srv_role INTO @ServerRole WHILE @@FETCH_STATUS = 0 BEGIN INSERT INTO #temp_memberrole EXEC sp_helpsrvrolemember @ServerRole FETCH NEXT FROM srv_role INTO @ServerRole END CLOSE srv_role DEALLOCATE srv_role SELECT ServerRole, MemberName FROM #temp_memberrole -- IF BUILTIN\Administrators is exist and sysadmin IF EXISTS(SELECT *FROM #temp_memberrole WHERE MemberName = 'BUILTIN\Administrators' AND ServerRole = 'sysadmin' ) BEGIN CREATE TABLE #temp_localadmin (output VARCHAR(8000)) INSERT INTO #temp_localadmin EXEC xp_cmdshell 'net localgroup administrators' SELECT output AS local_administrator FROM #temp_localadmin WHERE output LIKE '%\%' DROP TABLE #temp_localadmin END DROP TABLE #temp_srvrole DROP TABLE #temp_memberrole -- Logins individuales SELECT name, 'Individual NT Login' LoginType FROM syslogins WHERE isntgroup = 0 AND isntname = 1 UNION SELECT name, 'Individual SQL Login' LoginType FROM syslogins WHERE isntgroup = 0 AND isntname = 0 UNION ALL -- Logins de grupos SELECT name,'NT Group Login' LoginType FROM syslogins WHERE isntgroup = 1 -- lista de grupos CREATE TABLE #temp_groupadmin (output VARCHAR(8000)) CREATE TABLE #temp_groupadmin2 (groupName VARCHAR(256), groupMember VARCHAR(1000)) DECLARE @grpname VARCHAR(128) DECLARE @sqlcmd VARCHAR(1000) DECLARE grp_role CURSOR FAST_FORWARD FOR SELECT REPLACE(name,'US\','') FROM syslogins WHERE isntgroup = 1 AND name LIKE 'US\%' OPEN grp_role FETCH NEXT FROM grp_role INTO @grpname WHILE @@FETCH_STATUS = 0 BEGIN SET @sqlcmd = 'net group "' + @grpname + '" /domain' TRUNCATE TABLE #temp_groupadmin PRINT @sqlcmd INSERT INTO #temp_groupadmin EXEC xp_cmdshell @sqlcmd SET ROWCOUNT 8 DELETE FROM #temp_groupadmin SET ROWCOUNT 0 INSERT INTO #temp_groupadmin2 SELECT @grpname, output FROM #temp_groupadmin WHERE output NOT LIKE ('%The command completed successfully%') FETCH NEXT FROM grp_role INTO @grpname END CLOSE grp_role DEALLOCATE grp_role SELECT * FROM #temp_groupadmin2 DROP TABLE #temp_groupadmin DROP TABLE #temp_groupadmin2 PRINT 'EXEC sp_validatelogins ' PRINT '----------------------------------------------' EXEC sp_validatelogins PRINT '' -- roles de base de datos para miembros especificos CREATE TABLE #temp_rolemember (DbRole VARCHAR(128),MemberName VARCHAR(128),MemberSID VARCHAR(1000)) CREATE TABLE #temp_rolemember_final (DbName VARCHAR(100), DbRole VARCHAR(128),MemberName VARCHAR(128)) DECLARE @dbname VARCHAR(128) DECLARE @sqlcmd2 VARCHAR(1000) DECLARE grp_role CURSOR FOR SELECT name FROM sysdatabases WHERE name NOT IN ('tempdb') AND DATABASEPROPERTYEX(name, 'Status') = 'ONLINE' OPEN grp_role FETCH NEXT FROM grp_role INTO @dbname WHILE @@FETCH_STATUS = 0 BEGIN TRUNCATE TABLE #temp_rolemember SET @sqlcmd2 = 'EXEC [' + @dbname + ']..sp_helprolemember' PRINT @sqlcmd2 INSERT INTO #temp_rolemember EXECUTE(@sqlcmd2) INSERT INTO #temp_rolemember_final SELECT @dbname AS DbName, DbRole, MemberName FROM #temp_rolemember FETCH NEXT FROM grp_role INTO @dbname END CLOSE grp_role DEALLOCATE grp_role SELECT * FROM #temp_rolemember_final DROP TABLE #temp_rolemember DROP TABLE #temp_rolemember_final -- deshabilitar 'xp_cmdshell' – ver “Requerimientos”
Comentarios
Publicar un comentario