在 Go 中删除权限(v1.7)
在 Golang 中创建自定义 Web 服务器的任务经常会遇到需要绑定到诸如端口 80 之类的特权端口。为了确保安全,在绑定到此类端口后放弃 root 权限至关重要。本文探讨了 Go 中删除权限的问题并提供了解决方案。
在 Go 的早期版本中,利用 syscall.SetUid() 删除权限将返回“不支持”。作为一种替代方案,可以使用 iptables 将端口 80 重定向到非特权端口。然而,该解决方案允许非 root 进程冒充 Web 服务器,从而带来了安全漏洞。
解决方案在于结合使用 Go 的网络和系统调用功能。打开特权端口并确定 UID 后,我们可以识别所需的用户,获取其 UID,并使用 glibc 函数 setgid() 和 setuid() 设置 UID 和 GID。绑定端口后、调用 http.Serve 之前立即执行此代码非常重要。
提供的代码片段演示了这种方法。它首先加载必要的 TLS 证书并侦听特权端口。如果应用程序以 root 身份运行,它将通过使用 glibc 调用设置 UID 和 GID 降级到指定用户。随后,它侦听传入请求并提供 Web 内容。
该解决方案有效地解决了 Go 应用程序中删除权限的需求。它允许创建安全且强大的自定义 Web 服务器,而不会影响安全性。
以上是绑定到 Go Web 服务器中的特权端口后如何安全地删除特权?的详细内容。更多信息请关注PHP中文网其他相关文章!