da99 Asked: 2018-08-18 08:29:30 +0800 CST2018-08-18 08:29:30 +0800 CST 2018-08-18 08:29:30 +0800 CST 是否应该使用特权端口(<1024)在生产环境中部署 Postgresql? 772 我从来没有找到在生产中的特权端口上运行 Postgresql 的建议。关于安全性和最佳实践,应该在生产中使用什么类型的端口? postgresql linux 2 个回答 Voted mustaccio 2018-08-18T08:32:27+08:002018-08-18T08:32:27+08:00 为 Postgres 使用特权端口需要 postgres 守护进程以 root 特权运行,这本身就是一个安全漏洞。所以,不,你不应该为Postgres 使用特权端口。 Best Answer Evan Carroll 2018-08-18T08:46:59+08:002018-08-18T08:46:59+08:00 在 1024 下运行 PostgreSQL 需要一些技巧。在 win32 之外这几乎是不可能的。从backend/main/main.c, 不允许以“root”身份执行 PostgreSQL 服务器。服务器必须在非特权用户 ID 下启动,以防止可能的系统安全危害。有关如何正确启动服务器的更多信息,请参阅文档。 之后后端调用exit(1). 它也不作为setuid脚本运行。从源头上, 还要确保真实和有效的 uid 相同。从 root shell 作为 setuid 程序执行是一个安全漏洞,因为在许多平台上,如果真正的 uid 是 root,恶意子例程可以将 setuid 设置回 root。(因为实际上没有人将 postgres 用作 setuid 程序,尝试积极解决这种情况似乎比它的价值更麻烦;我们将花费精力来检查它。) 据我所知,在 Linux 上进行设置的唯一方法是 IP表 反向代理 重新编译内核 setcap有cap_net_bind_service能力(从未尝试过) 但是,如果您担心服务器欺骗(另一台服务器在 PG 可执行文件之前接管非特权连接),如果您采取一些预防措施,您仍然可以确保安全,如防止服务器欺骗中所述: 本地连接:使用仅对受信任的本地用户具有写入权限的 Unix 域套接字目录 (unix_socket_directories)。 本地连接:用于requirepeer指定连接到套接字的服务器进程所需的所有者。 TCP 连接:最好的解决方案是使用 SSL 证书并确保客户端检查服务器的证书。
为 Postgres 使用特权端口需要 postgres 守护进程以 root 特权运行,这本身就是一个安全漏洞。所以,不,你不应该为Postgres 使用特权端口。
在 1024 下运行 PostgreSQL 需要一些技巧。在 win32 之外这几乎是不可能的。从
backend/main/main.c
,之后后端调用
exit(1)
. 它也不作为setuid
脚本运行。从源头上,据我所知,在 Linux 上进行设置的唯一方法是
setcap
有cap_net_bind_service
能力(从未尝试过)但是,如果您担心服务器欺骗(另一台服务器在 PG 可执行文件之前接管非特权连接),如果您采取一些预防措施,您仍然可以确保安全,如防止服务器欺骗中所述:
requirepeer
指定连接到套接字的服务器进程所需的所有者。