我了解允许非 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 这样的东西,但是在端口,而不是可执行文件,以完全放弃权限检查。
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
),所以我最终使用了capsh
per这个答案。我不得不重新编译它从源头为了获得环境功能功能(我将生成的二进制文件存储为/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。