资讯动态

SQL Server 2000/2005加固规范落地与回滚核查

发布时间:2026/10/27 11:40:18 来源:尧图企业网站定制
简介《Sql Server数据库系统加固规范》面向数据库管理员、安全运维及等保合规整改人员聚焦SQL Server实例在账号权限、日志审计、传输加密与主机防护等环节的基线落地。压缩包共1个doc文件约1.73MB按“账号管理、认证授权—日志配置—通信协议—设备其他安全要求”组织条目以SHG-Mssql编号编排便于逐项核查与整改留痕。正文给出最小权限分配、删除或锁定无效账号、密码长度与有效期、登录失败锁定、双因素认证、操作日志记录、SSL/TLS加密、访问限制及防火墙/入侵检测、防毒与定期安全检查等要求并配有实施目的、问题影响、当前状态、实施步骤、回退方案、判断依据与风险等级具备较强的检查表属性。已有245人学习适合需要把规范转化为配置项和核查证据的读者参考对基线核查、等保测评整改或上线前安全加固的团队也可按条目逐项对照配置并形成证据链。1. 从一个连不上实例的下午说起SqlServer 加固规范落地前要认清的事上周去帮人看一台还在跑业务的老实例应用侧报“SQL Server 不存在或访问被拒绝”DBA 说前一天刚按 SqlServer 加固规范把多余的协议全禁了只留 TCP/IP。结果客户端那边还在用命名管道连一步没对上整条线就断了。这类加固规范本身条目不多账号、认证、日志、通信协议、设备安全几大块难的是落地顺序——先动协议还是先动账号先删存储过程还是先打补丁顺序错了就是生产事故。适合手上还维护着 SQL Server 2000/2005 老实例、需要交一份可核查加固表的运维和开发如果只是本地装个实例练手这些条目反而会绊住你装完再逐步收紧更合适。2. 版本与安装准备从 version 到 SP4 的补丁基线加固之前先别急着开企业管理器点选项。SQL Server 2000 这个年代的实例版本号五花八门SP2、SP3、SP4 混着跑很多加固条目在不同补丁级别下表现不一样。我一般先把版本号、服务账号、已有登录名三样东西摸清楚写成一张底稿后面每改一项都对着底稿核对出问题才有后悔药。2.1 先确认版本号8.00.xxx 对应哪一版补丁在查询分析器里执行下面这句返回的第一行就带完整版本号和补丁级别-- 查询实例版本与补丁号输出第一行形如 Microsoft SQL Server 2000 - 8.00.2039 SELECT VERSION;返回值的括号前那串8.00.xxxx就是补丁基线对照关系我整理成一张表出报告时直接引用版本号对应补丁级别说明8.00.194RTM原始发布版不建议对外提供服务8.00.384SP1早期补丁缺少后续安全修复8.00.534SP2部分老应用锁死在这个版本8.00.760SP3加固条目基本可执行8.00.2039SP4SQL Server 2000 最终服务包基线看到8.00.760以下的第一步不是加固是排升级窗口打 SP4。SP4 之后微软还陆续发过安全更新别把 SP4 当成终点按安全公告逐条核对能打的全打上。补丁没到位就做权限收紧等于地基没干透就砌墙。2.2 安装选项与服务启动账号安装向导走到“服务账户”那一步很多人的习惯是图省事选 LocalSystem装完能跑就不管了。这一步恰恰是加固条目里风险最高的一项服务用什么账号启动它的子进程就继承什么权限LocalSystem 等于把整台机器交出去。我的做法是安装前先建一个专用本地账号只用来启动 SQL Server 服务REM 创建专用服务账号密码必须满足复杂度要求 net user sqlsvc /add /passwordreq:yes /comment:SQL Server Service Account REM 从 Users 组移除避免继承普通交互用户的权限 net localgroup Users sqlsvc /delete两行命令做的事很简单第一行建账号并强制设密码第二行把它从 Users 组摘出来。注意不要顺手加进 Administrators加进去前面这步就白做了。账号建好后还要在本地安全策略里授予“作为服务登录”权限路径是secpol.msc→ 本地策略 → 用户权限分配 → 作为服务登录把sqlsvc加进去否则服务启动会报“登录失败”。安装过程中身份验证模式选“SQL Server 和 Windows”。只选 Windows 认证虽然更安全但老应用大量用 SQL 账号连接装完再改模式要重启实例不如一次选对。2.3 加固前的备份与回滚清单加固方案里每条都写了“回退方案”但真出问题时没人有空现翻文档。我习惯在动手前把下面几样东西落到一个目录里命名带日期-- 加固前导出登录名清单作为账号类回滚底稿 USE master; SELECT name, dbname, language, isntname, isntgroup FROM syslogins ORDER BY name; -- 导出每个登录名的角色归属删角色前对照 EXEC sp_helpsrvrolemember sysadmin; EXEC sp_helpsrvrolemember securityadmin;第一条查的是所有登录名及其默认库、是否 Windows 账号后两条看高权限角色的成员删人之前先知道谁在里头。除了查询结果还要备份 master、msdb 两个系统库导出注册表HKLM\SOFTWARE\Microsoft\MSSQLServer分支把服务网络实用工具里的协议勾选状态截图存档。这几样加起来不到十分钟但能在改错协议、删错账号时省掉一晚上的排查。3. 账号与认证授权六个条目落到 sp_addlogin 和角色上账号这块是加固规范里条目最密的部分也是最容易改出连锁反应的地方。删一个登录名可能某个作业、某个报表连接就断了收一个服务器角色可能某个维护计划跑不起来。我的原则是先在测试实例上跑一遍脚本确认应用回归通过再上生产。3.1 按用户分配账号别让所有人共用一个 sa规范里 Mssql-01-01-01 讲的是按用户分账号避免共享。SQL Server 2000 里建 SQL 登录用sp_addlogin-- 为不同应用/不同人建独立登录名默认库按实际业务指定 USE master; EXEC sp_addlogin app_order_01, St0ng#Pass01, orderdb; EXEC sp_addlogin app_report_01, St0ng#Pass02, reportdb; EXEC sp_addlogin ops_dba_01, St0ng#Pass03, master;三个参数分别是登录名、密码、默认数据库。登录名我按“系统_用途_序号”的规则起看到名字就知道是谁在用。密码这里要提醒一句SQL Server 2000 本身没有密码复杂度策略St0ng#Pass01这种强度全靠制度和定期改密来保证别指望实例帮你拦弱口令。建完账号不等于能用还得在业务库里建同名用户并授权否则登录进去看不到库。这一步可以放在角色配置里一起做避免一人一授权、后期完全失控。3.2 删除或锁定无效账号先分清 SQL 登录和 Windows 登录规范第二条要求清理无效账号。动手之前先查全量清单-- 列出全部登录名人工标记哪些是测试号、离职人员号、应用已下线号 USE master; SELECT name, dbname, isntname, isntgroup, sysadmin FROM syslogins ORDER BY isntname, name;isntname为 1 表示 Windows 账号或组为 0 表示 SQL 登录。两类账号处理方式不同SQL 登录用sp_droplogin直接删Windows 账号我更倾向用sp_denylogin拒绝访问保留条目方便回滚。-- SQL 登录确认无用后删除 EXEC sp_droplogin test_user; -- Windows 账号先拒绝访问观察一周无异常再考虑删除 EXEC sp_denylogin DOMAIN\old_user;删除是不可逆操作sp_droplogin执行后该账号下的权限全部消失要恢复得重建登录名再逐条授权。所以我的习惯是先sp_denylogin禁用观察业务侧有没有报错确认没人用再删。测试号、演示号这类明确无用的可以直接删。3.3 限制启动账号权限三个地方都要核对启动账号在 2.2 节已经建好这一节讲怎么验证它真的生效了。企业管理器里的路径是SQL Server 组 → (Local)(Windows NT) → 属性 → 安全性看“启动服务账户”那一栏。命令行也能查REM 查询 SQL Server 服务的登录账号输出 SERVICE_START_NAME 一行 sc qc MSSQLSERVER | findstr /i SERVICE_START_NAME正常输出应该是SERVICE_START_NAME : .\sqlsvc如果看到LocalSystem或某个域管理员账号说明安装时没改需要停服务后用sc config改回来REM 修改服务启动账号注意密码里有特殊字符时用双引号包住 sc config MSSQLSERVER obj .\sqlsvc password St0ng#Pass00obj后面必须有一个空格这是sc命令的坑少写一个空格就报参数错误。改完重启服务再用sc qc复核一遍。这一步做完实例的子进程权限就从系统级降到了普通服务账号级后面即使有注入类问题影响面也小得多。3.4 权限最小化与数据库角色别对人授权对角色授权规范里 01-01-04 和 01-01-05 讲的是权限最小化和角色管理。SQL Server 2000 的服务器角色是固定的业务账号只该待在public里-- 移除业务账号多余的服务器角色只保留 public USE master; EXEC sp_dropsrvrolemember app_order_01, sysadmin; EXEC sp_dropsrvrolemember app_order_01, securityadmin; EXEC sp_dropsrvrolemember app_order_01, dbcreator;sp_dropsrvrolemember两个参数是登录名和角色名执行前用sp_helpsrvrolemember确认成员关系别把运维自己的账号也踢出去。数据库层面的权限用自定义角色来管-- 在业务库里建只读角色把权限授予角色而不是具体用户 USE orderdb; EXEC sp_addrole role_order_read; GRANT SELECT ON dbo.t_order TO role_order_read; GRANT SELECT ON dbo.t_order_detail TO role_order_read; EXEC sp_addrolemember role_order_read, app_report_01;这样做的价值在于人员变动时只改角色成员不用逐表重授权新应用上线时套用现成角色权限边界清楚。GRANT的对象名要写全dbo.前缀否则可能授到别的 schema 上这是个老实例上常见的隐性错误。3.5 空密码与强口令sa 至少要十位规范里 01-01-06 专门点了空密码和 sa 口令。先查有没有空口令账号-- 查出所有口令为空的登录名这类账号必须第一时间处理 USE master; SELECT name FROM syslogins WHERE password IS NULL ORDER BY name;查出来有记录的逐个改密。SQL Server 2000 改密码用sp_password参数顺序是旧口令、新口令、登录名-- 修改指定账号口令sa 口令至少 10 位含大小写字母、数字和符号 EXEC sp_password NULL, N3w#Str0ngPass, sa;第一个参数传NULL表示不需要验证旧口令适合管理员给自己改如果是给业务账号改且知道旧密码把旧密码填在第一位更稳妥。sa 账号是重点口令长度不低于 10 位改完立刻同步到所有用到 sa 的配置文件里——这一步最容易漏应用连不上时先查配置里的密码是不是还是旧的。3.6 登录审计审计级别调到“全部”的代价规范里 02-01-01 要求记录用户登录包括账号、成功与否、时间、来源 IP。配置入口在实例属性 → 安全性审计级别选“全部”成功和失败的登录都记身份验证选“SQL Server 和 Windows”这两项改完需要重启 SQL Server 服务。要注意的是SQL Server 2000 的登录审计写到 Windows 事件日志量大时错误日志和应用程序日志会涨得很快磁盘空间不足时整个实例都会受影响。我一般在开“全部”之前先把事件日志的容量调大并配好轮转策略如果实例的登录频率特别高只对关键账号开失败审计也够用不必一刀切。4. 通信协议与功能面加固TCP/IP、加密与危险存储过程网络面和功能面这两块改错一项就是“连不上”或“作业全红”。我通常把它们放在账号加固之后做因为这两块的变更影响面最大需要前面账号和权限已经稳定下来出问题时才能快速判断是哪一层导致的。4.1 服务网络实用工具只留 TCP/IP在 SQL Server 程序组里打开“服务器网络实用工具”协议列表里通常有 TCP/IP、命名管道、多协议、NWLink IPX/SPX、AppleTalk 几项。加固要求只保留 TCP/IP其余全部禁用。命令行侧可以先看当前状态REM 查看 SQL Server 2000 网络库的启用状态Enabled 为 1 表示启用 reg query HKLM\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\SuperSocketNetLib /s | findstr /i Enabled输出里每一项协议下面都有一行Enabled改之前把完整结果存成文本。禁用命名管道之前必须确认客户端连接串连接串里写Server127.0.0.1走的是 TCP/IP写主机名且没指定网络库的客户端可能优先走命名管道。老系统里这个坑非常常见改完协议不重启服务表面上没报错实际新连接全部失败。4.2 强制协议加密证书没准备好别急着开服务器网络实用工具的“常规”页有一个“强制协议加密”选项勾上之后客户端和服务器之间的通信走 SSL。开启之前先确认服务器证书已经就位没有正式证书时实例会用自己的临时证书客户端不信任就会报证书链错误。生产环境一般是先导入服务器证书再打开这个开关。验证加密是否生效SQL Server 2000 上没有现成的 DMV 可查主要靠两个途径一是在服务器网络实用工具里确认“强制协议加密”已勾选并重启过服务二是在客户端用查询分析器连接看连接属性里的加密标记。SQL Server 2005 以后才能用sys.dm_exec_connections的encrypt_option字段直接查版本不同别混用脚本。4.3 TCP/IP 栈加固三个注册表键值规范 03-01-02 讲的是 TCP/IP 协议栈加固落到三个注册表键值上。改之前先导出备份REM 导出 Tcpip Parameters 分支作为回滚底稿 reg export HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters %USERPROFILE%\tcpip_backup.reg然后逐条写入REM 关闭源路由防御源路由欺骗值 2 表示禁用 reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v DisableIPSourceRouting /t REG_DWORD /d 2 /f REM 禁用 ICMP 重定向 reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v EnableICMPRedirect /t REG_DWORD /d 0 /f REM 开启 SYN 攻击保护值 2 表示启用 reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v SynAttackProtect /t REG_DWORD /d 2 /f三个键值分别对应源路由欺骗、ICMP 重定向攻击、SYN Flood 三类风险。/f表示存在同名键值时直接覆盖不加会弹确认。改完必须重启操作系统才生效重启后用reg query逐个复核。这类系统级参数属于改一次影响整台机器如果这台机器上还跑着别的服务先确认其他服务对 ICMP 重定向没有依赖。4.4 清理危险扩展存储过程先查依赖再删扩展存储过程是 SQL Server 2000 上风险最集中的地方xp_cmdshell能直接调系统命令xp_regwrite能改注册表sp_OACreate能做 OLE 自动化。删之前先把清单和 DLL 归属记下来-- 列出当前注册的全部扩展存储过程及其 DLL作为回滚依据 USE master; EXEC sp_helpextendedproc;输出里能看到每个存储过程对应的 DLL 名比如xp_cmdshell对应xplog70.dllsp_OACreate对应odsole70.dll。记录下来之后按风险等级分批删-- 第一批命令执行、注册表读写、文件系统探测风险最高 EXEC sp_dropextendedproc xp_cmdshell; EXEC sp_dropextendedproc xp_regread; EXEC sp_dropextendedproc xp_regwrite; EXEC sp_dropextendedproc xp_regdeletekey; EXEC sp_dropextendedproc xp_dirtree; EXEC sp_dropextendedproc xp_getfiledetails; -- 第二批OLE 自动化系列除非应用明确用到 EXEC sp_dropextendedproc sp_OACreate; EXEC sp_dropextendedproc sp_OADestroy; EXEC sp_dropextendedproc sp_OAGetErrorInfo; EXEC sp_dropextendedproc sp_OAGetProperty; EXEC sp_dropextendedproc sp_OAMethod; EXEC sp_dropextendedproc sp_OASetProperty; EXEC sp_dropextendedproc sp_OAStop;删之前最该确认的是作业依赖老系统里大量维护作业用xp_cmdshell调批处理做备份、导数据删完作业照样跑但每次执行都报“找不到存储过程”日志里一堆红。确认没人用之后回滚靠sp_addextendedproc重新注册比如-- 回滚示例重新注册 xp_cmdshell 到对应的 DLL EXEC sp_addextendedproc xp_cmdshell, xplog70.dll;所以前面sp_helpextendedproc的输出必须留档DLL 名记错就回不去。规范里还列了一长串“除非应用需要否则建议删除”的存储过程包括邮件、性能监控、Web 任务几类我的做法是先把高危的删掉中低危的列成待办随版本迭代逐步清理一次删干净反而容易出事。4.5 补丁安装与版本核对设备安全要求里的最后一条是打补丁。SP4 是 SQL Server 2000 的基线装完之后再执行一次版本查询-- 补丁安装后复核版本号确认已到 8.00.2039 或更高 SELECT VERSION;如果版本号还是8.00.760说明 SP4 没装上常见原因是安装账户权限不足或实例正在运行。补丁安装必须停实例装完重启再核对。SP4 之后还有若干安全更新按公告逐条评估能打的全打上别停在“已经是 SP4 了”这个认知上。5. 常见问题排查加固后才会冒出来的五笔账5.1 应用连不上报“SQL Server 不存在或访问被拒绝”现象加固完成、服务重启后应用侧全部连接失败客户端工具也连不上但本机查询分析器正常。原因服务网络实用工具里禁用了命名管道客户端连接串没指定网络库默认尝试命名管道失败后不自动回退到 TCP/IP。也有一种情况是只留了 TCP/IP 但防火墙没放行 1433 端口。解决客户端连接串显式指定Network LibraryDBMSSOCN走 TCP/IP或者在服务器端临时恢复命名管道确认业务恢复后再推动客户端改造。改协议前先在测试环境用真实客户端连一遍这一步不能省。5.2 删完 xp_cmdshell备份作业全红现象扩展存储过程清理后的第二天数据库备份作业全部失败作业历史里报“找不到存储过程 xp_cmdshell”。原因维护计划或自定义作业里用xp_cmdshell调外部批处理做文件搬运删除前没有排查作业步骤内容。解决先把作业步骤里的命令改成操作系统计划任务或者用sp_addextendedproc临时恢复xp_cmdshell争取时间改完作业再删。清理扩展存储过程之前务必查一遍所有作业步骤的 command 字段关键字搜xp_和sp_OA。5.3 改了 sa 口令某个老系统半夜报警现象sa 口令按规范改成强口令后核心应用在凌晨批量任务时连接失败报登录错误。原因应用配置文件、连接池配置、某个定时脚本里还写着旧口令改密时只改了数据库侧。解决改密前先全局搜索配置文件里的连接串列出所有引用点约一个统一变更窗口一起改。改完观察一个完整的业务周期确认没有遗漏的定时任务。5.4 审计级别开到“全部”事件日志爆盘现象登录审计开启后两三天服务器系统盘告警事件日志文件涨到几个 GB。原因SQL Server 2000 的登录审计写入 Windows 应用程序日志高并发实例每天产生大量记录事件日志默认容量和轮转策略扛不住。解决调大应用程序日志的最大尺寸并设置“按需覆盖”或者只对关键账号开启失败审计。已经爆盘的先清日志再调策略别直接删文件用事件查看器的清除功能。5.5 服务账号换掉后实例启动失败现象按规范把服务启动账号从 LocalSystem 换成专用账号重启后服务起不来报“登录失败”或“拒绝访问”。原因新账号没有被授予“作为服务登录”权限或者对 SQL Server 安装目录、数据文件目录没有读权限。解决在secpol.msc里补授“作为服务登录”再对安装目录和数据目录给该账号读和执行权限数据目录还要给写权限。备份到网络共享的场景共享目录的 ACL 也要单独授权光给服务账号权限不够。6. 装完怎么验证一份能回滚的核查清单加固做完不等于交付完成得有一套能重复执行的核对动作。我习惯把验证拆成“查配置”和“查效果”两层配置层用脚本效果层用业务回归。下面这几条是每次必跑的-- 1) 版本与补丁基线 SELECT VERSION; -- 2) 是否还有空口令账号返回空结果才算通过 USE master; SELECT name FROM syslogins WHERE password IS NULL; -- 3) 高权限角色成员是否只剩必要账号 EXEC sp_helpsrvrolemember sysadmin; -- 4) 高危扩展存储过程是否已移除预期报“找不到”或返回空 EXEC sp_helpextendedproc xp_cmdshell; EXEC sp_helpextendedproc xp_regwrite;第 2 条返回空、第 4 条报对象不存在才算这两项通过第 3 条要人工比对底稿确认没有多出来的成员。协议和注册表侧用命令行复核REM 复核服务启动账号应为专用账号 sc qc MSSQLSERVER | findstr /i SERVICE_START_NAME REM 复核 TCP/IP 加固键值三个都应是设定值 reg query HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v DisableIPSourceRouting reg query HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v EnableICMPRedirect reg query HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v SynAttackProtect配置层过了之后效果层至少做三件事用真实客户端连接串连一次业务库、跑一次完整备份作业、用一个普通业务账号执行一次典型查询。三件事都通过再把变更记录和回滚脚本归档。这套清单我一般会顺手做成一个文本文件放在实例目录下下次换人接手时直接照着跑不用再翻规范原文。从那以后我每次动生产实例不管变更多小都强制先导一遍登录名清单和注册表分支再按这份核查表走一遍验证宁可多花半小时也不想再经历一次半夜被电话叫起来恢复协议配置。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑