不能。堡垒机不解析sql语法或做sqli特征匹配,其防注入本质是管控操作人员而非代码,通过审批流、权限隔离和命令审计实现对高危操作的防控。

堡垒机能直接拦截 SQL 注入语句吗?
不能。堡垒机本身不解析 SQL 语法,也不做 SQLi 特征匹配——它不运行 WAF 或数据库代理层的语义分析引擎。所谓“防 SQL 注入”,在堡垒机语境下,本质是防人,不是防代码。它管的是「谁、在什么时间、用哪个账号、连哪台数据库、执行了哪些命令」,而不是判断 SELECT * FROM users WHERE name = 'admin' OR '1'='1' 是否恶意。
为什么删库类操作必须走二次审批?
因为高危命令(如 DROP DATABASE、TRUNCATE TABLE、DELETE FROM xxx WHERE 1=1)本身合法,但执行后果不可逆。堡垒机无法靠关键字黑名单 100% 拦截(比如绕过写成 EXEC('DROP DATABASE...') 或通过存储过程间接调用),所以必须把决策权从“自动化策略”交还给人——即由具备业务上下文的审批人确认:这个操作是否真实必要、是否已备份、是否在变更窗口内。
- 审批触发条件应基于目标资产类型(如 MySQL/Oracle 实例)、命令关键词(
DROP、TRUNCATE、FORMAT)、执行用户角色(DBA 组除外的普通运维账号)三者组合判定 - 保旺达、奇安信等主流国产堡垒机支持自定义审批流,可配置为「提交→直属主管+DBA 双人审批→自动解锁会话」
- 审批环节必须附带原始命令全文、执行终端 IP、会话录像时间戳,避免“盲批”
如何让审批真正生效,而不是形同虚设?
关键在阻断点位置和权限隔离。如果审批只是发个邮件通知,而命令早已在数据库侧执行完毕,那审批就毫无意义。
- 审批必须作用于协议代理链路:SSH/RDP 连接建立后,所有输入命令先被接入层暂存,仅当审批通过才转发至目标数据库;未审批或驳回时,
mysql> DROP DATABASE这类输入直接被丢弃并记录告警 - 数据库账号需严格遵循最小权限原则:堡垒机映射的运维账号在数据库内只能有
SELECT和INSERT权限,DROP类操作必须通过堡垒机临时提权通道(如sudo -u dba mysql -e "...")触发审批,而非直连超级账户 - 禁止开启数据库的
sql_mode=NO_AUTO_CREATE_USER等宽松模式,避免审批绕过——堡垒机只管“人怎么连”,不管“库怎么配”
审计日志里查不到 SQL 内容?这是设计缺陷还是故意为之?
不是缺陷,是合规取舍。部分堡垒机默认不记录完整 SQL 文本,原因有二:一是敏感字段(如密码、身份证号)可能出现在 WHERE 子句中,全量记录违反《个人信息保护法》;二是海量 SQL 日志导致存储与检索成本激增。但「删库」类操作必须留痕,这需要针对性配置:
- 启用数据库协议的「命令级审计」而非「会话级审计」,确保
DROP、TRUNCATE等动词单独成条日志,并标记is_high_risk: true - 日志字段至少包含:
session_id、target_db_ip、executed_sql_hash(SHA256)、approval_id、approver_list - 注意:MySQL 的
general_log或 Oracle 的AUDIT SQL是数据库自身行为,与堡垒机日志无关;两者需交叉比对才能确认操作是否被绕过
真正难防的永远不是技术方案,而是那个知道审批流程、手握双因子令牌、又能登录生产库的 DBA 自己写的存储过程——堡垒机能拦住他敲命令,拦不住他改代码。所以审批流上线后,必须同步收紧数据库对象的 CREATE PROCEDURE 权限,并定期扫描高危函数调用链。











