3/5 - (2 голоса)

Вот детальный план и чек-лист для проведения ИТ-аудита базы данных MSSQL с соответствующими скриптами для проверки:

  1. Проверка безопасности:
    • Проверка наличия и правильной конфигурации учетных записей администратора базы данных:
      • Скрипт:
        SELECT name, type_desc, create_date, modify_date
        FROM sys.server_principals
        WHERE type = 'S' AND is_disabled = 0 AND name LIKE '%sysadmin%'
        ORDER BY name;
    • Проверка уровня доступа пользователей:
      • Скрипт:
        SELECT DB_NAME() AS 'Database',
               [name] AS 'Username',
               [type_desc] AS 'Type',
               create_date AS 'Creation Date',
               modify_date AS 'Last Modified'
        FROM sys.database_principals
        WHERE type_desc NOT IN ('DATABASE_ROLE', 'EXTERNAL_USER') 
        ORDER BY [name];
        
    • Проверка наличия и использования сложных паролей:
      • Скрипт:
        SELECT name, is_disabled, create_date, modify_date
        FROM sys.sql_logins
        WHERE is_disabled = 0 AND password_hash IS NOT NULL
        ORDER BY name;
        
    • Проверка наличия обновлений и патчей для СУБД:
      • Проверьте официальный сайт Microsoft для получения информации о последних обновлениях и патчах.
  2. Проверка производительности:
    • Проверка настройки и использования индексов:
      • Скрипт:
        SELECT OBJECT_NAME(i.object_id) AS 'Table',
        i.name AS 'Index',
        i.type_desc AS 'Type',
        CASE WHEN i.is_disabled = 1 THEN 'Disabled' ELSE 'Enabled' END AS 'Status',
        s.avg_fragmentation_in_percent AS 'Fragmentation %'
        FROM sys.indexes i
        INNER JOIN sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') s ON i.object_id = s.object_id AND i.index_id = s.index_id
        WHERE i.index_id > 0
        ORDER BY OBJECT_NAME(i.object_id), i.index_id;
        
    • Проверка запросов, занимающих много ресурсов:
      • Скрипт:
        SELECT TOP 10
        qs.creation_time AS 'Creation Time',
        DB_NAME(qt.dbid) AS 'Database',
        SUBSTRING(qt.text, qs.statement_start_offset/2, (CASE WHEN qs.statement_end_offset = -1 THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2 ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) AS 'Query Text',
        qs.total_elapsed_time AS 'Total Elapsed Time',
        qs.execution_count AS 'Execution Count',
        qs.total_logical_reads AS 'Total Logical Reads',
        qs.total_physical_reads AS 'Total Physical Reads',
        qs.total_worker_time AS 'Total Worker Time'
        FROM sys.dm_exec_query_stats qs
        CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
        WHERE qt.dbid = DB_ID() -- Добавьте идентификатор базы данных, для которой вы хотите выполнить проверку
        ORDER BY qs.total_elapsed_time DESC;
        
  • Проверка размера базы данных и ее файлов:
    • Скрипт:
      SELECT DB_NAME(database_id) AS 'Database',
             type_desc AS 'File Type',
             name AS 'Logical Name',
             physical_name AS 'Physical Name',
             size/128 AS 'Size in MB',
             max_size/128 AS 'Max Size in MB',
             growth AS 'Growth',
             is_percent_growth AS 'Percent Growth'
      FROM sys.master_files
      WHERE type = 0 -- Data files
      ORDER BY DB_NAME(database_id), type_desc;
      
  1. Проверка целостности данных:
    • Проверка наличия и состояния баз данных:
      • Скрипт:
        SELECT name AS 'Database',
               state_desc AS 'State',
               recovery_model_desc AS 'Recovery Model',
               compatibility_level AS 'Compatibility Level'
        FROM sys.databases;
        
    • Проверка наличия и состояния файлов баз данных:
      • Скрипт:
        SELECT DB_NAME(database_id) AS 'Database',
               name AS 'File',
               type_desc AS 'Type',
               state_desc AS 'State'
        FROM sys.master_files
        WHERE type = 0 -- Data files
        ORDER BY DB_NAME(database_id), type_desc;
        
    • Проверка наличия и состояния таблиц:
      • Скрипт:
        SELECT OBJECT_NAME(object_id) AS 'Table',
               type_desc AS 'Type',
               create_date AS 'Creation Date',
               modify_date AS 'Last Modified'
        FROM sys.tables;
        
  1. Проверка резервного копирования и восстановления:
    • Проверка расписания резервного копирования:
      • Скрипт:
        SELECT database_name AS 'Database',
               backup_type AS 'Backup Type',
               backup_start_date AS 'Backup Start Date',
               backup_finish_date AS 'Backup Finish Date',
               backup_size/1024/1024 AS 'Backup Size (MB)'
        FROM msdb.dbo.backupset
        ORDER BY database_name, backup_start_date DESC;
        
    • Проверка последних успешных восстановлений:
      • Скрипт:
        SELECT destination_database_name AS 'Database',
               restore_date AS 'Restore Date',
               user_name AS 'Restored By',
               restore_type AS 'Restore Type'
        FROM msdb.dbo.restorehistory
        WHERE restore_type = 'D' -- Database restore
        ORDER BY destination_database_name, restore_date DESC;
        
  2. Проверка общей информации о базе данных:
    • Скрипт:
      SELECT name AS 'Database',
             compatibility_level AS 'Compatibility Level',
             recovery_model_desc AS 'Recovery Model',
             state_desc AS 'State',
             user_access_desc AS 'User Access',
             create_date AS 'Creation Date',
             collation_name AS 'Collation'
      FROM sys.databases
      WHERE name = 'Название базы данных'; -- Замените 'Название базы данных' на имя конкретной базы данных, которую вы хотите проверить
      

Это лишь некоторые примеры скриптов для проверки базы данных MSSQL в рамках ИТ-аудита. В зависимости от конкретных требований и контекста, вам может потребоваться внести дополнительные проверки или настроить скрипты под вашу среду.