Skip to content

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
  • 定期审计存储过程的权限