The way CTRL-C in Postgres CLI cancels queries is incredibly hack-y
2 months ago
- #Database
- #Postgres
- #Security
- Postgres查询可能因多种原因被取消,例如执行时间过长、缺少索引或SQL错误。
- 在psql中取消查询会通过新连接发送CancelRequest,该请求由进程ID和密钥标识。
- 默认情况下CancelRequest以明文发送,存在安全风险,包括潜在的拒绝服务攻击。
- Postgres 17引入了加密CancelRequest支持,但由于架构限制,psql仍使用未加密消息。
- 协议v3.2允许使用更长的密钥防止暴力破解,但需要显式配置。
- 攻击者可重放未加密的CancelRequest来取消同一连接上的后续查询。
- Postgres流量监控工具Elephantshark最初难以处理并发连接和未加密CancelRequest。
- 解决方案涉及将进程ID和密钥映射到目标主机名以正确处理CancelRequest。
- 安全建议包括:使用Postgres 18并设置min_protocol_version=3.2、启用VPN、避免在psql中使用Ctrl-C。
- 未来更新可能为psql引入加密CancelRequest功能以提升安全性。