外观
PostgreSQL 权限提升攻击防范
权限提升攻击类型
1. 超级用户权限提升
- 通过漏洞获取超级用户权限
- 滥用系统函数或扩展获取更高权限
- 利用配置错误绕过权限检查
2. 跨用户权限提升
- 利用存储过程或函数的安全漏洞
- 滥用继承权限
- 利用视图或触发器的权限问题
3. 操作系统权限提升
- 从数据库用户提升到操作系统用户
- 利用文件读写权限获取系统访问权
- 通过扩展模块执行系统命令
防范措施
1. 最小权限原则
sql
-- 为用户分配最小必要权限
CREATE USER app_user WITH PASSWORD 'secure_password';
GRANT CONNECT ON DATABASE mydb TO app_user;
GRANT SELECT, INSERT, UPDATE ON TABLE users TO app_user;
-- 避免使用超级用户运行应用
REVOKE SUPERUSER FROM app_user;2. 安全配置参数
sql
-- 禁用危险的配置参数
ALTER SYSTEM SET allow_system_table_mods = 'off';
ALTER SYSTEM SET superuser_reserved_connections = '3';
ALTER SYSTEM SET max_connections = '100';
-- 限制可信扩展
ALTER SYSTEM SET shared_preload_libraries = 'pg_stat_statements';
-- 重新加载配置
SELECT pg_reload_conf();3. 安全的扩展管理
sql
-- 只安装可信扩展
CREATE EXTENSION pg_stat_statements;
-- 避免使用具有危险权限的扩展
-- 如:ltree, file_fdw, dblink 等需谨慎配置
-- 限制扩展的安装权限
REVOKE CREATE ON SCHEMA public FROM PUBLIC;4. 安全的存储过程和函数
sql
-- 使用安全定义者函数时要谨慎
CREATE OR REPLACE FUNCTION get_sensitive_data()
RETURNS TABLE (id INT, name TEXT)
SECURITY DEFINER
AS $$
BEGIN
RETURN QUERY SELECT id, name FROM sensitive_table;
END;
$$ LANGUAGE plpgsql;
-- 限制安全定义者函数的所有者权限
ALTER FUNCTION get_sensitive_data() OWNER TO secure_user;5. 文件系统权限控制
bash
# 设置数据目录的正确权限
chmod 700 /var/lib/postgresql/15/main
chown -R postgres:postgres /var/lib/postgresql/15/main
# 限制配置文件权限
chmod 600 /etc/postgresql/15/main/postgresql.conf
chmod 600 /etc/postgresql/15/main/pg_hba.conf监控与检测
1. 审计日志配置
sql
-- 启用审计日志
ALTER SYSTEM SET log_connections = 'on';
ALTER SYSTEM SET log_disconnections = 'on';
ALTER SYSTEM SET log_statement = 'ddl';
ALTER SYSTEM SET log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h ';
-- 记录失败的登录尝试
ALTER SYSTEM SET log_failed_connections = 'on';2. 异常行为监控
sql
-- 监控超级用户活动
SELECT usename, application_name, client_addr, query_start, state, query
FROM pg_stat_activity
WHERE usename = 'postgres';
-- 检测长时间运行的查询
SELECT usename, application_name, client_addr, query_start, state, query
FROM pg_stat_activity
WHERE state = 'active' AND query_start < now() - interval '5 minutes';3. 定期权限审计
sql
-- 检查具有超级用户权限的用户
SELECT usename FROM pg_user WHERE usesuper = true;
-- 检查具有CREATEDB或CREATEROLE权限的用户
SELECT usename FROM pg_user WHERE usesuper = false AND (createdb = true OR createrole = true);
-- 检查PUBLIC模式的权限
SELECT grantee, privilege_type FROM information_schema.role_table_grants
WHERE table_schema = 'public';最佳实践
1. 定期更新和补丁
- 及时应用PostgreSQL安全补丁
- 关注官方安全公告
- 定期升级到稳定版本
2. 安全的部署架构
- 分离数据库和应用服务器
- 使用防火墙限制数据库访问
- 采用SSL/TLS加密连接
3. 定期安全评估
- 进行漏洞扫描
- 执行渗透测试
- 检查配置合规性
4. 安全意识培训
- 培训开发人员安全的SQL编写
- 培训DBA安全的数据库管理
- 建立安全事件响应流程
常见问题(FAQ)
Q1:如何防止PostgreSQL权限提升攻击?
A1:主要防范措施包括:
- 遵循最小权限原则
- 安全配置数据库参数
- 谨慎管理扩展
- 定期审计权限
- 启用审计日志
- 及时更新补丁
Q2:哪些PostgreSQL扩展可能存在安全风险?
A2:一些具有危险权限的扩展包括:
- file_fdw(文件系统访问)
- dblink(跨数据库连接)
- postgres_fdw(外部数据包装器)
- pg_cron(定时任务)
- plpython/plperl(外部语言)
使用这些扩展时应谨慎配置权限。
Q3:如何检测权限提升攻击?
A3:可以通过以下方式检测:
- 监控超级用户活动
- 分析审计日志
- 检测异常登录行为
- 监控长时间运行的查询
- 定期权限审计
Q4:什么是最小权限原则?
A4:最小权限原则是指为用户或进程分配完成其任务所需的最小权限,不多不少。在PostgreSQL中,这意味着:
- 不为应用用户分配超级用户权限
- 只为用户分配必要的数据库和对象权限
- 限制用户的操作范围
- 定期审查和撤销不必要的权限
Q5:如何安全地使用存储过程?
A5:安全使用存储过程的建议:
- 避免不必要的安全定义者函数
- 限制安全定义者函数的所有者权限
- 仔细审查存储过程的代码
- 避免在存储过程中执行动态SQL
- 定期审计存储过程的权限
