Sudo

允許非特權使用者在埠 80 上啟動網路伺服器

  • November 20, 2020

我了解允許非 root 使用者在埠 80 和 443 上啟動網路伺服器的安全隱患。

我想刪除權限檢查以允許任何非 root 使用者在 Ubuntu 16 和 CentOS 7 上的埠 80 和 443 上呼叫網路伺服器。

我在機器上有根訪問權限,但我需要以不同的使用者名執行網路伺服器來解決 NFS 權限問題;此替代使用者名不能具有 root 訪問權限。

到目前為止,我已經看過:

  • setcap cap_net_bind_service=ep /path/to/the/executable(不堅持,因為執行檔被遠端重新編譯並儲存在 NFS 上)
  • 編輯sudoers文件以啟用使用者無密碼sudoroot仍然有 NFS 訪問問題)

理想情況下,我想要 setcap 之類的東西,但在ports上,而不是在執行檔上,完全放棄權限檢查。

相關: 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

雖然我喜歡斯圖爾特的回答,但它為管道添加了另一部分可能會中斷(systemd),所以我最終使用了capsh這個答案我必須從原始碼重新編譯它以獲得環境功能特性(我將生成的二進製文件儲存為/sbin/capsh2),然後我能夠將其設置為啟動命令:

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

當此命令以 root 身份執行時,網路伺服器正確啟動nonrootuser並能夠綁定到“使用者空間”中的埠 80 和 443。

我想setcap會是你的答案。我認為這裡真正的問題是:我的系統將如何辨識 NFS 上的網路伺服器何時被觸摸,以便它可以在其上執行setcap命令?

我想你會想​​要設置inotifysystemd.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

引用自:https://unix.stackexchange.com/questions/620517