尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Databasement安全机制深挖:如何防御命令注入、SSRF与跨租户越权

Databasement安全机制深挖:如何防御命令注入、SSRF与跨租户越权 Databasement安全机制深挖如何防御命令注入、SSRF与跨租户越权【免费下载链接】databasementSelf-hosted database backup manager with a web UI. Schedule, backup, and restore MySQL, PostgreSQL, MariaDB, Microsoft SQL Server, MongoDB, SQLite Redis to S3, SFTP, Samba or local storage. SSH Tunnel support.项目地址: https://gitcode.com/gh_mirrors/da/databasementDatabasement 是一个自托管的数据库备份管理器提供 Web UI支持对 MySQL、PostgreSQL、MariaDB、SQL Server、MongoDB、SQLite 与 Redis 进行定时备份和恢复存储目标可以是 S3、SFTP、Samba 或本地磁盘。因为它的核心工作就是替用户执行系统命令、连接用户填写的任意地址所以它天生就处在三大高危攻击的射程之内命令注入、SSRF服务端请求伪造与多租户越权。这篇文章带你看看它是怎么一层层设防的。为什么备份工具最怕这三种攻击攻击面触发条件可能后果命令注入主机名、用户名、库名、备份参数被拼进 shell 命令在服务器上执行任意命令SSRF用户填写的 S3/对象存储端点被服务端发起连接读取云实例元数据、窃取 IAM 凭据跨租户越权多组织Organization隔离失效用户 A 看到并操作组织 B 的数据库Databasement 的思路可以概括为一句话输入端白名单、中间层作用域、输出端脱敏。下面逐一拆解。命令注入防御一连接信息字符白名单数据库连接信息最终会被拼进 PDO DSN、MongoDB URI 或 ssh 命令行而这些格式里;、,、这类字符有特殊含义——一个包含的主机名就能把连接重定向到别处。因此 Databasement 直接收紧了允许的字符集主机名只允许字母、数字、点、短横线、下划线、冒号与方括号IPv6 字面量见 SafeHost.php。一个值得注意的细节是正则用\A/\z锚定而不是^/$因为后者会放过结尾的换行符。SSH 用户名必须是不含空格的打印型 ASCII且不能以短横线开头——否则会被 ssh 客户端当成选项解析见 SafeUsername.php。数据库名不允许以-开头避免被 dump 客户端误读成选项见 SafeDatabaseName.php。文件路径拒绝空字节可截断路径、..路径穿越、反斜杠默认还拒绝绝对路径见 SafePath.php。这套只收必要字符的白名单策略比拦截危险字符的黑名单策略可靠得多攻击者无法穷举绕过规则而合法输入几乎不受影响。命令注入防御二Dump 选项黑名单真正的难点备份配置里允许用户追加额外 dump 选项extra flags这是灵活性需求但也是注入重灾区。核心防线在 SafeDumpFlags.php它做了三件事字符白名单选项只能包含字母、数字、空格和少量符号$、;、|这类 shell 元字符直接出局。按引擎的选项黑名单某些选项会让 dump 客户端把文件写到调用者选定的路径、甚至加载代码例如 mariadb-dump 的--result-file、--plugin-dirpg_dump 的--fileredis-cli 的--eval、--pipesqlpackage 的/targetfile。每个引擎的黑名单都是对照运行时镜像里实际打包的客户端逐一核对过的。针对客户端解析怪癖的加固MySQL 的 my_getopt 允许长选项缩写--result-f即--result-file还接受--loose-、--skip-等前缀且把下划线和短横线视为同一字符所以--result_file也会命中黑名单短选项会被拆簇-vf/tmp/x在 pg_dump 里是-v加一个带值的-f因此簇内每个字符都按一个选项来查长选项名不区分大小写比较只可能多拦、不会漏放。更妙的是这道防线是双重落地的violation()与tokenize()两个静态方法同时被备份结果处理逻辑复用作为最后一道防线拦截黑名单规则上线前就已入库的历史配置——新规则不止防新输入还防旧数据。SSRF 防御不封内网但精准封掉元数据地址用户填写的对象存储端点S3/STS会由服务端 SDK 发起连接。这里有个两难内网地址比如本地机房里的 MinIO是正当的一等公民场景不能一刀切全封但云实例元数据地址又绝对不能碰。SafeEndpointUrl.php 的取舍非常克制且精准只允许http/https协议对域名做双栈解析A 记录 AAAA 记录避免纯 IPv6 主机跳过检查拒绝 link-local 网段IPv4 的169.254.0.0/16、IPv6 的fe80::/10以及 EC2 的 IPv6 元数据地址fd00:ec2::254特别处理了 IPv4 映射地址::ffff:a.b.c.d防止攻击者用它绕过 IPv4 检查。源码注释里有一句很坦诚的话这收窄了可达面但没有消灭SSRF——DNS 在校验时和使用时刻之间可能变化DNS rebinding真正的兜底控制是部署侧的出站egress限制。对自托管用户而言这意味着一条实操建议给 Databasement 容器配置好出站白名单比依赖任何应用层校验都可靠。跨租户越权防御多组织隔离的三层设计Databasement 支持多组织Organization同一用户可以属于多个组织。隔离靠三层机制配合请求级作用域绑定中间件 ScopeBouncer.php 在每个请求开始时把权限库 Bouncer 的 scope 显式设为当前组织 ID。这里有个针对 worker 运行时的细节——容器会跨请求复用所以作用域必须每请求显式重设不能依赖默认值。角色定义全局、角色分配按组织隔离BouncerScope.php 统一了 Bouncer 的 scope 配置——角色和能力定义角色→能力授权全局共享只有哪个用户在哪个组织担任什么角色这层关系按组织隔离。结果是用户可以同时是组织 A 的管理员和组织 B 的只读访客而不会互相串权。所有接触 Bouncer 的代码都必须走这个统一入口混用配置标志正是读路径出错的根源。查询级自动过滤模型作用域 DatabaseServerOrganizationScope.php 会为每条查询自动追加当前组织过滤条件——对于自身没有organization_id列的子表如备份任务它通过whereExists子查询关联到父级database_servers表来判定归属。用户无法通过构造 ID 或调整查询参数越权读取其他组织的数据。这些隔离逻辑都有专门的测试兜底例如 CrossOrganizationIsolationTest.php 与 Snapshot/CrossOrganizationTest.php直接验证跨组织访问会被拒绝。输出端脱敏日志里不留密码命令执行器 ShellProcessor.php 在把命令与输出写入任务日志和异常信息前会统一做密码脱敏覆盖十余种真实出现过的形态--password及其引号变体、MySQL 的-p简写且刻意不误伤--port、PGPASSWORD、MYSQL_PWD、sshpass 的-p、SQL Server 的/SourcePassword:、MongoDB 连接串里的 userinfo、7z 的-p等。连哪些不该脱敏都有考量Redis 的密码简写-a刻意不脱敏因为-a同时是 rsync、tar、7z 的真实选项为它建规则会把无关命令误伤——这正是脱敏规则需要与命令生成逻辑协同演进的例子。给自托管用户与开发者的安全清单自托管部署时为 Databasement 容器配置出站egress限制这是对抗 SSRF 的最终防线数据库账号遵循最小权限备份只需SELECT与必要的LOCK TABLES/复制权限备份文件卷使用加密传输SFTP/S3 加密并开启快照文件校验。二次开发时任何会进入命令行或连接串的新字段先过 app/Rules/ 目录下的校验规则保持白名单风格涉及多组织的新模型务必挂上组织作用域参考 app/Models/Scopes/触碰 Bouncer 的代码统一通过BouncerScope入口勿混用 scope 标志安全漏洞请走仓库的 SECURITY.md 中声明的私有漏洞报告通道不要公开提交 issue。总结Databasement 的安全设计给自托管工具的开发者打了个不错的样板输入端用字符白名单而非危险字符黑名单连接信息与 dump 选项双重校验中间层用显式作用域 查询自动过滤实现多租户隔离输出端统一脱敏防止凭据泄入日志同时对防线边界保持诚实——应用层校验收窄攻击面出站限制才是 SSRF 的终极答案。理解这三条防线后你无论是部署还是扩展它都能守住备份数据的人先别被备份流程伤到这条底线。【免费下载链接】databasementSelf-hosted database backup manager with a web UI. Schedule, backup, and restore MySQL, PostgreSQL, MariaDB, Microsoft SQL Server, MongoDB, SQLite Redis to S3, SFTP, Samba or local storage. SSH Tunnel support.项目地址: https://gitcode.com/gh_mirrors/da/databasement创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表