【发布时间】:2011-03-22 10:14:27
【问题描述】:
我有一个以 root 身份启动的守护进程(因此它可以绑定到低端口)。初始化后,出于安全原因,我非常希望它放弃 root 权限。
谁能指点我一个已知正确的 C 代码可以做到这一点?
我阅读了手册页,查看了不同应用程序中的各种实现,它们都是不同的,其中一些非常复杂。这是与安全相关的代码,我真的不想重新发明其他人所犯的相同错误。我正在寻找的是一个最佳实践,已知的良好,可移植的库函数,我可以使用它,因为它会得到正确的知识。有这种事吗?
供参考:我以 root 身份开始;我需要更改为在不同的 uid 和 gid 下运行;我需要正确设置补充组;之后我不需要改回root权限。
【问题讨论】:
-
这在 unix 之间变化很大——有什么特别的吗?如果你需要一个“便携”的解决方案,它会很乱,你最好抓住例如OpenSSH 中的 Permanent_set_uid() 函数 - 在 uidswap.c 文件中
-
也许是一个更好的策略,不需要 root 所以它不需要被删除。另见Allow non-root process to bind to port 80 and 443? 相关主题是Setuid Demystified bye Chen、Dean 和 Wagner。不同风格的 Unix 的行为略有不同。这是另一个让你的非特权进程绑定到端口的原因。
-
另见 Setuid Demystified 在 Usenix。