Query Guard
Query Guard 是 GreptimeDB 企业版提供的一个插件,它在 Frontend 协议层拦截查询, 在语句执行前拒绝具有潜在危险的操作。它提供以下保护能力:
- 禁止
DROP TABLE:拒绝所有DROP TABLE语句。 - 禁止
DROP DATABASE:拒绝所有DROP DATABASE语句。 - 拒绝
COPY语句:拒绝所有COPY语句。 - 禁止跨 catalog 访问:拒绝引用不同 catalog 下表的查询、跨 catalog 的 gRPC DDL 请求,以及写入其他 catalog 的 Flight bulk insert。
工作原理
对 DROP TABLE 和 DROP DATABASE 的禁止在查询拦截器中强制执行,
拦截器在任何权限检查之前运行。这意味着一旦启用,该限制对
**所有用户(包括管理员)**生效。在修改配置并重启 Frontend 之前,
任何人都无法通过客户端协议删除表或数据库。
该限制同时覆盖 SQL 协议(MySQL、PostgreSQL 和 HTTP)和 gRPC 协议:
- SQL 路径:
DROP TABLE和DROP DATABASE语句会被拒绝,返回NotSupported错误。 - gRPC 路径:结构化的
DROP TABLEDDL 请求会被拒绝。结构化 gRPC DDL 请求没有 删除数据库的变体;但通过 gRPC 发送的 SQL 语句同样会经过 SQL 拦截器,因此DROP DATABASE禁令对 gRPC 上的 SQL 同样生效。
内部操作(例如基于 TTL 的数据过期和自动清理)不经过 Frontend 协议层拦截器, 因此不受这些限制影响。
配置
Query Guard 以插件形式提供。要启用并配置它,请在 GreptimeDB 配置文件中添加以下 TOML:
[[plugins]]
# 为 GreptimeDB 添加 query guard 插件。
[plugins.query_guard]
# 是否启用 query guard 插件,默认为 false。
enable = true
# 是否对所有用户禁止 DROP TABLE 语句,默认为 false。
ban_drop_table = true
# 是否对所有用户禁止 DROP DATABASE 语句,默认为 false。
ban_drop_database = true
该插件在 standalone 模式和分布式模式下均可工作。在分布式模式下, 它在配置了该插件的 Frontend 上生效。
注意事项
- 每个 Frontend 都必须携带该配置。 在多 Frontend 部署中,
必须在每个 Frontend 的配置文件中添加该插件配置;
未配置的 Frontend 仍会正常执行
DROP语句。 - 启用插件会激活除
DROP禁令外的所有保护。 开启query_guard会自动拒绝COPY语句、跨 catalog 查询、跨 catalog 的 gRPC DDL 请求,以及写入其他 catalog 的 Flight bulk insert,即使你只想禁止DROP语句。DROP禁令由ban_drop_table和ban_drop_database单独控制。 - 该限制在协议层强制执行,修改配置后需要重启 Frontend 才能生效。