SQLServer教程FG072-SQLServer安全加固实战
本文档风哥主要介绍SQLServer数据库安全加固相关知识,包括SQLServer数据库身份认证加固、SQLServer数据库权限控制加固、SQLServer数据库网络安全加固、SQLServer数据库数据加密等内容,风哥教程参考SQLServer官方文档Security内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 SQLServer数据库安全加固概念
SQLServer数据库安全加固是指通过一系列技术手段和管理措施,提升数据库系统的安全性,防范各种安全威胁和攻击。安全加固涵盖身份认证、访问控制、数据加密、审计监控等多个层面,是数据库安全管理的重要组成部分。更多视频教程www.fgedu.net.cn
- 身份认证加固:强化登录验证机制
- 权限控制加固:实施最小权限原则
- 网络安全加固:保护网络通信安全
- 数据加密加固:保护敏感数据安全
- 审计监控加固:记录和追踪安全事件
1.2 SQLServer数据库安全加固原则
SQLServer数据库安全加固原则:
- 最小权限原则:只授予完成工作所需的最小权限
- 纵深防御原则:多层次安全防护,不依赖单一措施
- 默认安全原则:默认配置应是最安全的状态
- 职责分离原则:关键操作需要多人协作完成
- 审计追溯原则:所有操作可追溯可审计
1.3 SQLServer数据库安全加固层级
┌─────────────────────────────────────────────┐
│ 应用层安全加固 │
│ – SQL注入防护 │
│ – 参数化查询 │
│ – 应用权限控制 │
├─────────────────────────────────────────────┤
│ 数据库层安全加固 │
│ – 用户权限管理 │
│ – 数据加密 │
│ – 审计日志 │
├─────────────────────────────────────────────┤
│ 实例层安全加固 │
│ – 身份认证 │
│ – 网络配置 │
│ – 服务账户 │
├─────────────────────────────────────────────┤
│ 操作系统层安全加固 │
│ – 文件权限 │
│ – 防火墙配置 │
│ – 补丁更新 │
└─────────────────────────────────────────────┘
Part02-生产环境规划与建议
2.1 SQLServer数据库安全加固规划
SQLServer数据库安全加固规划要点:
1. 安全评估阶段
– 识别敏感数据和关键系统
– 评估现有安全风险
– 确定安全等级要求
2. 方案设计阶段
– 制定安全加固策略
– 设计权限架构
– 规划加密方案
3. 实施部署阶段
– 分步骤实施加固
– 测试验证效果
– 记录变更内容
4. 运维监控阶段
– 定期安全检查
– 监控安全事件
– 持续改进优化
# 不同安全等级要求
基础安全等级:
– 修改默认端口
– 禁用sa账户
– 设置密码策略
增强安全等级:
– 启用Windows认证
– 配置防火墙规则
– 启用审计日志
高安全等级:
– 启用TDE加密
– 配置列级加密
– 实施细粒度审计
2.2 SQLServer数据库安全加固检查清单
1. 身份认证安全
[ ] 是否禁用sa账户或重命名
[ ] 是否启用密码复杂度策略
[ ] 是否设置密码过期时间
[ ] 是否限制登录失败次数
[ ] 是否启用Windows认证模式
2. 权限控制安全
[ ] 是否实施最小权限原则
[ ] 是否定期清理无用账户
[ ] 是否限制sysadmin角色成员
[ ] 是否配置数据库级别权限
[ ] 是否禁用不必要的存储过程
3. 网络安全
[ ] 是否修改默认端口1433
[ ] 是否配置防火墙规则
[ ] 是否启用SSL加密连接
[ ] 是否禁用不必要的网络协议
[ ] 是否隐藏SQLServer实例
4. 数据安全
[ ] 是否启用TDE加密
[ ] 是否加密敏感列数据
[ ] 是否配置备份加密
[ ] 是否保护连接字符串
[ ] 是否定期检查数据访问
5. 审计监控
[ ] 是否启用SQL审计
[ ] 是否配置登录审计
[ ] 是否监控异常操作
[ ] 是否定期审查审计日志
[ ] 是否设置安全告警
2.3 SQLServer数据库安全策略建议
SQLServer数据库安全策略建议:
- 密码策略:复杂度要求、定期更换、历史记录
- 账户策略:账户锁定、过期时间、权限分离
- 网络策略:访问控制、加密传输、端口管理
- 审计策略:操作记录、异常告警、日志保留
- 应急策略:安全事件响应、数据恢复、系统重建
Part03-生产环境项目实施方案
3.1 SQLServer数据库身份认证加固
3.1.1 SQLServer数据库禁用和重命名sa账户
SELECT name, is_disabled, type_desc
FROM sys.server_principals
WHERE name = ‘sa’;
GO
name is_disabled type_desc
—- ———– ———
sa 0 SQL_LOGIN
# 禁用sa账户
ALTER LOGIN sa DISABLE;
GO
Command(s) completed successfully.
# 验证sa账户已禁用
SELECT name, is_disabled, type_desc
FROM sys.server_principals
WHERE name = ‘sa’;
GO
name is_disabled type_desc
—- ———– ———
sa 1 SQL_LOGIN
# 重命名sa账户(增加安全性)
ALTER LOGIN sa WITH NAME = [fgedu_admin];
GO
Command(s) completed successfully.
# 验证重命名结果
SELECT name, is_disabled, type_desc
FROM sys.server_principals
WHERE name = ‘fgedu_admin’;
GO
name is_disabled type_desc
———– ———– ———
fgedu_admin 1 SQL_LOGIN
3.1.2 SQLServer数据库配置密码策略
CREATE LOGIN fgedu_dba
WITH PASSWORD = ‘Fgedu@2026#Secure’,
CHECK_POLICY = ON,
CHECK_EXPIRATION = ON,
DEFAULT_DATABASE = fgedudb;
GO
Command(s) completed successfully.
# 查看密码策略配置
SELECT name, is_policy_checked, is_expiration_checked
FROM sys.sql_logins
WHERE name = ‘fgedu_dba’;
GO
name is_policy_checked is_expiration_checked
——— —————– ——————–
fgedu_dba 1 1
# 修改现有账户密码策略
ALTER LOGIN fgedu_app
WITH CHECK_POLICY = ON,
CHECK_EXPIRATION = ON;
GO
Command(s) completed successfully.
# 设置密码过期提醒
— 查询即将过期的账户
SELECT name, LOGINPROPERTY(name, ‘PasswordLastSetTime’) AS PasswordLastSetTime,
LOGINPROPERTY(name, ‘DaysUntilExpiration’) AS DaysUntilExpiration
FROM sys.sql_logins
WHERE is_expiration_checked = 1;
GO
name PasswordLastSetTime DaysUntilExpiration
——— ———————– ——————-
fgedu_dba 2026-01-15 10:30:00 42
fgedu_app 2026-02-20 14:15:00 15
3.1.3 SQLServer数据库配置认证模式
SELECT SERVERPROPERTY(‘IsIntegratedSecurityOnly’) AS AuthMode;
GO
AuthMode
———–
0
— 0 = 混合模式(Windows和SQL Server认证)
— 1 = 仅Windows认证
# 使用T-SQL修改认证模式(需要重启)
EXEC xp_instance_regwrite N’HKEY_LOCAL_MACHINE’,
N’Software\Microsoft\MSSQLServer\MSSQLServer’,
N’LoginMode’, REG_DWORD, 1;
GO
Command(s) completed successfully.
# 查看修改后的认证模式
SELECT SERVERPROPERTY(‘IsIntegratedSecurityOnly’) AS AuthMode;
GO
AuthMode
———–
1
# 重启SQLServer服务使配置生效
— Windows命令行执行
net stop MSSQLSERVER
net start MSSQLSERVER
The SQL Server (MSSQLSERVER) service is stopping.
The SQL Server (MSSQLSERVER) service was stopped successfully.
The SQL Server (MSSQLSERVER) service is starting.
The SQL Server (MSSQLSERVER) service was started successfully.
3.2 SQLServer数据库权限控制加固
3.2.1 SQLServer数据库清理无用账户
SELECT name, type_desc, is_disabled, create_date, modify_date
FROM sys.server_principals
WHERE type IN (‘S’, ‘U’)
AND name NOT LIKE ‘##%’
ORDER BY name;
GO
name type_desc is_disabled create_date modify_date
————— ———- ———– ———————- ———————-
BUILTIN\Administrators WINDOWS_GROUP 0 2025-01-01 00:00:00 2025-01-01 00:00:00
fgedu_admin SQL_LOGIN 1 2025-01-01 00:00:00 2026-04-08 10:00:00
fgedu_dba SQL_LOGIN 0 2026-01-15 10:30:00 2026-01-15 10:30:00
fgedu_app SQL_LOGIN 0 2026-02-01 09:00:00 2026-02-01 09:00:00
NT AUTHORITY\SYSTEM WINDOWS_LOGIN 0 2025-01-01 00:00:00 2025-01-01 00:00:00
# 查看长期未使用的账户
SELECT name, type_desc,
LOGINPROPERTY(name, ‘DaysSinceLastLogin’) AS DaysSinceLastLogin
FROM sys.sql_logins
WHERE LOGINPROPERTY(name, ‘DaysSinceLastLogin’) > 90;
GO
name type_desc DaysSinceLastLogin
———– ———- ——————
test_user SQL_LOGIN 156
old_app SQL_LOGIN 203
# 禁用长期未使用的账户
ALTER LOGIN test_user DISABLE;
ALTER LOGIN old_app DISABLE;
GO
Command(s) completed successfully.
# 删除确认无用的账户
DROP LOGIN test_user;
DROP LOGIN old_app;
GO
Command(s) completed successfully.
3.2.2 SQLServer数据库限制特权账户
SELECT sp.name AS LoginName, sp.type_desc,
srm.role_principal_id
FROM sys.server_role_members srm
JOIN sys.server_principals sp ON srm.member_principal_id = sp.principal_id
WHERE srm.role_principal_id = (
SELECT principal_id FROM sys.server_principals WHERE name = ‘sysadmin’
);
GO
LoginName type_desc role_principal_id
————— ————- —————–
NT AUTHORITY\SYSTEM WINDOWS_LOGIN 3
BUILTIN\Administrators WINDOWS_GROUP 3
fgedu_dba SQL_LOGIN 3
# 从sysadmin角色移除不必要的成员
ALTER SERVER ROLE sysadmin DROP MEMBER BUILTIN\Administrators;
GO
Command(s) completed successfully.
# 创建专用的DBA角色
CREATE SERVER ROLE fgedu_dbadmin;
GO
Command(s) completed successfully.
# 授予必要的权限
GRANT CONTROL SERVER TO fgedu_dbadmin;
GRANT VIEW SERVER STATE TO fgedu_dbadmin;
GRANT ALTER ANY DATABASE TO fgedu_dbadmin;
GO
Command(s) completed successfully.
# 将DBA添加到自定义角色
ALTER SERVER ROLE fgedu_dbadmin ADD MEMBER fgedu_dba;
GO
Command(s) completed successfully.
# 验证角色配置
SELECT sp.name AS LoginName, sr.name AS RoleName
FROM sys.server_role_members srm
JOIN sys.server_principals sp ON srm.member_principal_id = sp.principal_id
JOIN sys.server_principals sr ON srm.role_principal_id = sr.principal_id
WHERE sp.name = ‘fgedu_dba’;
GO
LoginName RoleName
——— —————
fgedu_dba sysadmin
fgedu_dba fgedu_dbadmin
3.3 SQLServer数据库网络安全加固
3.3.1 SQLServer数据库修改默认端口
SELECT DISTINCT local_tcp_port
FROM sys.dm_exec_connections
WHERE local_tcp_port IS NOT NULL;
GO
local_tcp_port
————–
1433
# 使用SQL Server Configuration Manager修改端口
— 或使用注册表修改
EXEC xp_instance_regwrite N’HKEY_LOCAL_MACHINE’,
N’Software\Microsoft\MSSQLServer\MSSQLServer\SuperSocketNetLib\Tcp\IPAll’,
N’TcpPort’, REG_SZ, ‘51433’;
GO
Command(s) completed successfully.
# 重启服务使配置生效
net stop MSSQLSERVER
net start MSSQLSERVER
# 验证新端口
SELECT DISTINCT local_tcp_port
FROM sys.dm_exec_connections
WHERE local_tcp_port IS NOT NULL;
GO
local_tcp_port
————–
51433
# 配置防火墙规则
netsh advfirewall firewall add rule name=”SQLServer” dir=in action=allow protocol=TCP localport=51433
GO
Ok.
3.3.2 SQLServer数据库隐藏实例
EXEC xp_instance_regwrite N’HKEY_LOCAL_MACHINE’,
N’Software\Microsoft\MSSQLServer\MSSQLServer’,
N’HideInstance’, REG_DWORD, 1;
GO
Command(s) completed successfully.
# 重启服务使配置生效
net stop MSSQLSERVER
net start MSSQLSERVER
# 验证隐藏配置
EXEC xp_instance_regread N’HKEY_LOCAL_MACHINE’,
N’Software\Microsoft\MSSQLServer\MSSQLServer’,
N’HideInstance’;
GO
Value Data
———- ———–
HideInstance 1
Part04-生产案例与实战讲解
4.1 SQLServer数据库弱口令整改案例
# 分析步骤:
# 1. 检查密码强度
SELECT name,
LOGINPROPERTY(name, ‘PasswordLastSetTime’) AS PasswordLastSetTime,
is_policy_checked
FROM sys.sql_logins
WHERE is_policy_checked = 0;
GO
name PasswordLastSetTime is_policy_checked
——— ———————– —————–
app_user 2025-06-15 08:30:00 0
test_user 2025-08-20 14:00:00 0
report 2025-10-10 16:45:00 0
# 2. 强制修改弱口令账户密码
ALTER LOGIN app_user WITH PASSWORD = ‘Fgedu@App#2026!’,
CHECK_POLICY = ON;
GO
Command(s) completed successfully.
# 3. 启用密码策略检查
ALTER LOGIN app_user WITH CHECK_POLICY = ON;
ALTER LOGIN test_user WITH CHECK_POLICY = ON;
ALTER LOGIN report WITH CHECK_POLICY = ON;
GO
Command(s) completed successfully.
# 4. 创建密码复杂度检查脚本
CREATE PROCEDURE sp_fgedu_check_weak_passwords
AS
BEGIN
SELECT name, type_desc, is_policy_checked, is_expiration_checked
FROM sys.sql_logins
WHERE is_policy_checked = 0;
END;
GO
Command(s) completed successfully.
# 5. 定期执行检查
EXEC sp_fgedu_check_weak_passwords;
GO
name type_desc is_policy_checked is_expiration_checked
—- ——— —————– ——————–
(0 行受影响)
4.2 SQLServer数据库权限过度案例
# 分析步骤:
# 1. 检查应用账户的服务器角色
SELECT sp.name AS LoginName, sr.name AS ServerRole
FROM sys.server_role_members srm
JOIN sys.server_principals sp ON srm.member_principal_id = sp.principal_id
JOIN sys.server_principals sr ON srm.role_principal_id = sr.principal_id
WHERE sp.name LIKE ‘fgedu_app%’;
GO
LoginName ServerRole
———– ———–
fgedu_app sysadmin
fgedu_app2 securityadmin
# 2. 检查数据库角色
USE fgedudb;
GO
SELECT dp.name AS UserName, dr.name AS DatabaseRole
FROM sys.database_role_members drm
JOIN sys.database_principals dp ON drm.member_principal_id = dp.principal_id
JOIN sys.database_principals dr ON drm.role_principal_id = dr.principal_id
WHERE dp.name LIKE ‘fgedu%’;
GO
UserName DatabaseRole
———– ————
fgedu_app db_owner
fgedu_app2 db_datareader
fgedu_app3 db_datawriter
# 3. 收回过度权限
— 从sysadmin角色移除
ALTER SERVER ROLE sysadmin DROP MEMBER fgedu_app;
GO
Command(s) completed successfully.
— 从db_owner角色移除
USE fgedudb;
ALTER ROLE db_owner DROP MEMBER fgedu_app;
GO
Command(s) completed successfully.
# 4. 授予适当权限
USE fgedudb;
GO
— 授予读写权限
ALTER ROLE db_datareader ADD MEMBER fgedu_app;
ALTER ROLE db_datawriter ADD MEMBER fgedu_app;
GO
Command(s) completed successfully.
— 授予存储过程执行权限
GRANT EXECUTE ON SCHEMA::dbo TO fgedu_app;
GO
Command(s) completed successfully.
# 5. 验证权限配置
SELECT dp.name AS UserName, dr.name AS DatabaseRole
FROM sys.database_role_members drm
JOIN sys.database_principals dp ON drm.member_principal_id = dp.principal_id
JOIN sys.database_principals dr ON drm.role_principal_id = dr.principal_id
WHERE dp.name = ‘fgedu_app’;
GO
UserName DatabaseRole
——— —————
fgedu_app db_datareader
fgedu_app db_datawriter
4.3 SQLServer数据库安全加固方案
— 1. 创建安全加固检查存储过程
CREATE PROCEDURE sp_fgedu_security_check
AS
BEGIN
PRINT ‘=== SQLServer安全加固检查报告 ===’;
PRINT ”;
— 检查sa账户状态
PRINT ‘1. sa账户状态检查:’;
SELECT name, is_disabled AS ‘是否禁用’
FROM sys.server_principals
WHERE name = ‘sa’;
— 检查sysadmin角色成员
PRINT ”;
PRINT ‘2. sysadmin角色成员检查:’;
SELECT sp.name AS LoginName, sp.type_desc
FROM sys.server_role_members srm
JOIN sys.server_principals sp ON srm.member_principal_id = sp.principal_id
WHERE srm.role_principal_id = (
SELECT principal_id FROM sys.server_principals WHERE name = ‘sysadmin’
);
— 检查密码策略
PRINT ”;
PRINT ‘3. 密码策略检查:’;
SELECT name, is_policy_checked AS ‘策略检查’, is_expiration_checked AS ‘过期检查’
FROM sys.sql_logins
WHERE is_policy_checked = 0;
— 检查认证模式
PRINT ”;
PRINT ‘4. 认证模式检查:’;
DECLARE @AuthMode INT;
SELECT @AuthMode = SERVERPROPERTY(‘IsIntegratedSecurityOnly’);
IF @AuthMode = 1
PRINT ‘当前认证模式: 仅Windows认证(推荐)’;
ELSE
PRINT ‘当前认证模式: 混合模式’;
— 检查端口配置
PRINT ”;
PRINT ‘5. 端口配置检查:’;
SELECT DISTINCT local_tcp_port
FROM sys.dm_exec_connections
WHERE local_tcp_port IS NOT NULL;
END;
GO
Command(s) completed successfully.
— 2. 执行安全检查
EXEC sp_fgedu_security_check;
GO
=== SQLServer安全加固检查报告 ===
1. sa账户状态检查:
name is_disabled
—- ———–
sa 1
2. sysadmin角色成员检查:
LoginName type_desc
—————— ————-
NT AUTHORITY\SYSTEM WINDOWS_LOGIN
fgedu_dba SQL_LOGIN
3. 密码策略检查:
name is_policy_checked is_expiration_checked
—- —————– ——————–
(0 行受影响)
4. 认证模式检查:
当前认证模式: 仅Windows认证(推荐)
5. 端口配置检查:
local_tcp_port
————–
51433
Part05-风哥经验总结与分享
5.1 SQLServer数据库安全加固最佳实践
SQLServer数据库安全加固最佳实践:
- 身份认证:禁用sa账户、启用Windows认证、配置密码策略
- 权限控制:实施最小权限原则、定期清理无用账户、分离DBA职责
- 网络安全:修改默认端口、配置防火墙、启用SSL加密
- 数据保护:启用TDE加密、加密敏感列、备份加密
- 审计监控:启用SQL审计、监控异常操作、定期审查日志
5.2 SQLServer数据库安全审计要点
1. 登录审计
– 记录所有登录成功和失败
– 监控异常登录时间和地点
– 追踪特权账户使用
2. 权限变更审计
– 记录用户创建和删除
– 追踪权限授予和撤销
– 监控角色成员变更
3. 数据访问审计
– 记录敏感数据访问
– 追踪数据修改操作
– 监控批量数据导出
4. 系统变更审计
– 记录配置变更
– 追踪对象创建删除
– 监控存储过程执行
5. 安全事件审计
– 记录登录失败
– 追踪权限拒绝
– 监控异常查询
5.3 SQLServer数据库安全工具推荐
SQLServer数据库安全工具推荐:
- SQL Server Audit:内置审计功能,记录数据库操作
- SQL Server Profiler:跟踪和分析数据库活动
- Extended Events:轻量级事件监控
- Dynamic Management Views:实时监控数据库状态
- 第三方安全工具:专业的数据库安全扫描和监控工具
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
