作者:Digital Observer(施嘉偉)
Oracle ACE Pro: Database
PostgreSQL ACE Partner
11年數(shù)據(jù)庫行業(yè)經(jīng)驗(yàn),現(xiàn)主要從事數(shù)據(jù)庫服務(wù)工作
擁有Oracle OCM、DB2 10.1 Fundamentals、MySQL 8.0 OCP、WebLogic 12c OCA、KCP、PCTP、PCSD、PGCM、OCI、PolarDB技術(shù)專家、達(dá)夢師資認(rèn)證、數(shù)據(jù)安全咨詢高級等認(rèn)證
ITPUB認(rèn)證專家、PolarDB開源社區(qū)技術(shù)顧問、HaloDB技術(shù)顧問、TiDB社區(qū)技術(shù)布道師、青學(xué)會MOP技術(shù)社區(qū)專家顧問、國內(nèi)某高校企業(yè)實(shí)踐指導(dǎo)教師
公眾號:Digital Observer;CSDN:施嘉偉;ITPUB:sjw1933;墨天輪:Digital Observer;PGFans:施嘉偉。
一、說明
1.1 覆蓋操作系統(tǒng)和數(shù)據(jù)庫版本
- SQL Server版本要求:需覆蓋2008 R2及以上版本。所有腳本中的命令都需在不同版本中經(jīng)過實(shí)際測試,并能正常輸出結(jié)果。
- 操作系統(tǒng)版本要求:需覆蓋Linux和Windows。
- 如果在不同版本中有不同的命令,請?jiān)谖臋n中明確標(biāo)注版本和命令差異。
1.2 查詢最小權(quán)限要求
例如創(chuàng)建的shijw用戶,授權(quán)如下:
ALTER SERVER ROLE [diskadmin] ADD MEMBER [shijw];
ALTER SERVER ROLE [processadmin] ADD MEMBER [shijw];
ALTER SERVER ROLE [securityadmin] ADD MEMBER [shijw];
ALTER SERVER ROLE [setupadmin] ADD MEMBER [shijw];
二、SQL語句
2.1 數(shù)據(jù)庫用戶密碼復(fù)雜度認(rèn)證
SELECT name, is_policy_checked FROM sys.sql_logins;
-
SQL返回結(jié)果:
- 當(dāng)返回值=1時,表示合規(guī)(pass)。
- 當(dāng)返回值不等于1時,表示存在風(fēng)險(xiǎn)(Risk)。
2.2 數(shù)據(jù)庫用戶密碼有效期策略
SELECT name, is_policy_checked FROM sys.sql_logins;
-
SQL返回結(jié)果:
- 當(dāng)返回值=1時,表示合規(guī)(pass)。
- 當(dāng)返回值不等于1時,表示存在風(fēng)險(xiǎn)(Risk)。
2.3 連接會話限制
SELECT CONVERT(Numeric(18,2), CONVERT(Numeric(18,2), c.value_in_use) / CONVERT(Numeric(18,2), maximum) * 100) AS user_count
FROM sys.configurations c
WHERE c.name = 'user connections';
-
SQL返回結(jié)果:
- 當(dāng)返回值<95時,表示合規(guī)(pass)。
- 當(dāng)返回值>95時,表示存在風(fēng)險(xiǎn)(Risk)。
2.4 連接數(shù)據(jù)庫進(jìn)程數(shù)限制
SELECT CONVERT(Decimal(18,0), (SUM(s.current_workers_count) * 1.0 / i.max_workers_count) * 100) AS CPU線程使用率
FROM sys.dm_os_sys_info i, sys.dm_os_schedulers s
GROUP BY i.max_workers_count;
-
SQL返回結(jié)果:
- 當(dāng)返回值<95時,表示合規(guī)(pass)。
- 當(dāng)返回值>95時,表示存在風(fēng)險(xiǎn)(Risk)。
2.5 物理備份
SELECT bs.database_name,
BACKUPTYPE = CASE
WHEN bs.type = 'D' AND bs.is_copy_only = 0 THEN 'Full Database'
WHEN bs.type = 'D' AND bs.is_copy_only = 1 THEN 'Full Copy-Only Database'
WHEN bs.type = 'I' THEN 'Differential database backup'
WHEN bs.type = 'L' THEN 'Transaction Log'
WHEN bs.type = 'F' THEN 'File or filegroup'
WHEN bs.type = 'G' THEN 'Differential file'
WHEN bs.type = 'P' THEN 'Partial'
WHEN bs.type = 'Q' THEN 'Differential partial' END + ' Backup',
CASE bf.device_type
WHEN 2 THEN 'Disk'
WHEN 5 THEN 'Tape'
WHEN 7 THEN 'Virtual device'
WHEN 9 THEN 'Azure Storage'
WHEN 105 THEN 'A permanent backup device'
ELSE 'Other Device' END AS DeviceType,
bs.Backup_Start_Date,
BackupFinishDate = bs.Backup_Finish_Date,
[BackupStatus] = CASE bs.Backup_Start_Date WHEN NULL THEN '備份失敗' ELSE '成功' END,
LatestBackupLocation = bf.physical_device_name
FROM msdb.dbo.backupset bs
LEFT JOIN msdb.dbo.backupmediafamily bf ON bs.[media_set_id] = bf.[media_set_id]
WHERE bs.backup_start_date > DATEADD(MONTH, - 2, sysdatetime())
ORDER BY bs.database_name ASC, bs.Backup_Start_Date DESC;
-
SQL返回結(jié)果:
- 當(dāng)有返回結(jié)果時,表示合規(guī)(pass)。
- 當(dāng)無返回結(jié)果時,表示存在風(fēng)險(xiǎn)(Risk)。
2.6 網(wǎng)絡(luò)傳輸加密
SELECT DISTINCT (encrypt_option) FROM sys.dm_exec_connections;
-
SQL返回結(jié)果:
- 當(dāng)返回結(jié)果=true時,表示合規(guī)(pass)。
- 當(dāng)無返回結(jié)果時,表示存在風(fēng)險(xiǎn)(Risk)。
2.7 數(shù)據(jù)庫存儲加密
SELECT D.name AS 'Database Name',
CASE
WHEN E.encryption_state = 3 THEN 'Encrypted'
WHEN E.encryption_state = 2 THEN 'In Progress'
ELSE 'Not Encrypted'
END AS state
FROM sys.dm_database_encryption_keys E
RIGHT JOIN sys.databases D ON D.database_id = E.database_id
LEFT JOIN sys.certificates c ON E.encryptor_thumbprint = c.thumbprint;
-
SQL返回結(jié)果:
- 當(dāng)返回結(jié)果=Encrypted時,表示合規(guī)(pass)。
- 當(dāng)返回結(jié)果不等于Encrypted時,表示存在風(fēng)險(xiǎn)(Risk)。
2.8 透明加密
SELECT name, is_encrypted FROM sys.databases;
-
SQL返回結(jié)果:
- 當(dāng)返回結(jié)果=1時,表示合規(guī)(pass)。
- 當(dāng)返回結(jié)果不等于1時,表示存在風(fēng)險(xiǎn)(Risk)。
2.9 連接超時機(jī)制
SELECT COMMENT, value FROM SYS.SYSCONFIGURES WHERE COMMENT LIKE 'remote%';
-
SQL返回結(jié)果:
- 當(dāng)返回結(jié)果≠0時,表示合規(guī)(pass)。
- 當(dāng)返回結(jié)果=0時,表示存在風(fēng)險(xiǎn)(Risk)。
2.10 數(shù)據(jù)庫版本補(bǔ)丁
SELECT @@VERSION;
SELECT SERVERPROPERTY('ProductVersion');
- SQL返回結(jié)果: 需要根據(jù)實(shí)際輸出填寫。
2.11 弱口令
SELECT name, create_date, is_disabled FROM sys.sql_logins WHERE PWDCOMPARE('', password_hash) = 1;
SELECT name, create_date, is_disabled FROM sys.sql_logins WHERE PWDCOMPARE(name, password_hash) = 1;
- SQL返回結(jié)果: 需要根據(jù)實(shí)際輸出填寫。
2.12 C2審計(jì)
SELECT value FROM sys.sysconfigures WHERE comment = 'c2 audit mode';
-
SQL返回結(jié)果:
- 當(dāng)返回結(jié)果為1時,表示合規(guī)(pass)。
- 當(dāng)返回結(jié)果為其他值時,表示存在風(fēng)險(xiǎn)(Risk)。
2.13 SQL審核
SELECT status FROM sys.dm_server_audit_status WHERE status = 1;
-
SQL返回結(jié)果:
- 當(dāng)返回結(jié)果為1時,表示合規(guī)(pass)。
- 當(dāng)返回結(jié)果為其他值時,表示存在風(fēng)險(xiǎn)(Risk)。
2.14 SQL注入
SELECT value FROM sys.sysconfigures WHERE comment = 'Enable or disable command shell';
-
SQL返回結(jié)果:
- 當(dāng)返回結(jié)果為0時,表示合規(guī)(pass)。
- 當(dāng)返回結(jié)果為其他值時,表示存在風(fēng)險(xiǎn)(Risk)。
三、總結(jié)
這些SQL腳本主要用于檢查SQL Server數(shù)據(jù)庫的安全配置,確保數(shù)據(jù)庫在操作系統(tǒng)、權(quán)限控制、備份、加密以及其他關(guān)鍵領(lǐng)域符合最佳實(shí)踐。根據(jù)執(zhí)行結(jié)果,系統(tǒng)管理員可以針對發(fā)現(xiàn)的問題采取相應(yīng)的補(bǔ)救措施,進(jìn)一步加強(qiáng)數(shù)據(jù)庫的安全性。





