允许非特权用户在端口 80 上启动 Web 服务器

允许非特权用户在端口 80 上启动 Web 服务器

我了解允许非 root 用户在端口 80 和 443 上启动 Web 服务器的安全隐患。

我想删除权限检查,以允许任何非 root 用户在 Ubuntu 16 和 CentOS 7 上的端口 80 和 443 上调用 Web 服务器。

我在计算机上具有 root 访问权限,但我需要以不同的用户名运行网络服务器来解决 NFS 权限问题;此备用用户名不能具有 root 访问权限。

到目前为止,我已经看过:

  • setcap cap_net_bind_service=ep /path/to/the/executable(不会粘住,因为可执行文件是远程重新编译并存储在 NFS 上)
  • 编辑sudoers文件以启用无密码sudo用户root(仍然存在 NFS 访问问题)

理想情况下,我想要像 setcap 这样的东西,但是在端口,而不是可执行文件,以完全放弃权限检查。

有关的: https://stackoverflow.com/questions/413807/is-there-a-way-for-non-root-processes-to-bind-to-privileged-ports-on-linux

authbind看起来很有希望,但它似乎不起作用使用 GoLang 网络服务器

Ubuntu 16 太旧,不允许更改非特权端口起始范围:

> sudo sysctl net.ipv4.ip_unprivileged_port_start=80
sysctl: cannot stat /proc/sys/net/ipv4/ip_unprivileged_port_start: No such file or directory

答案1

我想setcap这将是你的答案。我认为这里真正的问题是:当 NFS 上的网络服务器被触摸时,我的系统将如何识别以便它可以setcap在其上运行命令?

我想你会想要建立一个inotify或者systemd.path监视此网络服务器。当该二进制文件被替换时,您将检测到它并触发setcap适合您的命令。如果您的网络服务器已经通过 systemd 运行,那么这种方法尤其有效。

这是一个systemd.path假设您的服务器作为 systemd 服务运行的示例webserver.service

# /etc/systemd/system/webcap.path
[Unit]
Description=Watching changes in the webserver binary
# Start monitoring only after the webserver is running.
After=webserver.service

[Path]
# Whenever someone writes to this path (binary is replaced), do something
PathModified=/path/to/webserver
# This is the service you launch when the above condition is met
Unit=webcap.service

[Install]
#Whenever the webserver is started, this monitor will also start
WantedBy=webserver.service
# /etc/systemd/system/webcap.service
[Unit]
Description=Update caps of webserver

[Service]
Type=oneshot
ExecStart=ssetcap cap_net_bind_service=ep /path/to/webserver

答案2

虽然我喜欢斯图尔特的回答,它在管道中添加了另一个可能会破坏的部分(systemd),所以我最终使用了capshper这个答案。我不得不重新编译它从源头为了获得环境功能功能(我将生成的二进制文件存储为/sbin/capsh2),然后我可以将其设置为启动命令:

/sbin/capsh2 --keep=1 --user=nonrootuser --inh=cap_net_bind_service --addamb=cap_net_bind_service -- -c /path/to/webserver

当此命令以 root 身份运行时,Web 服务器会正​​确启动nonrootuser并能够绑定到“用户空间”中的端口 80 和 443。

相关内容