Sudo
允許非特權使用者在埠 80 上啟動網路伺服器
我了解允許非 root 使用者在埠 80 和 443 上啟動網路伺服器的安全隱患。
我想刪除權限檢查以允許任何非 root 使用者在 Ubuntu 16 和 CentOS 7 上的埠 80 和 443 上呼叫網路伺服器。
我在機器上有根訪問權限,但我需要以不同的使用者名執行網路伺服器來解決 NFS 權限問題;此替代使用者名不能具有 root 訪問權限。
到目前為止,我已經看過:
setcap cap_net_bind_service=ep /path/to/the/executable
(不堅持,因為執行檔被遠端重新編譯並儲存在 NFS 上)- 編輯
sudoers
文件以啟用使用者無密碼sudo
(root
仍然有 NFS 訪問問題)理想情況下,我想要 setcap 之類的東西,但在ports上,而不是在執行檔上,完全放棄權限檢查。
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
命令?我想你會想要設置
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