在Golang 中刪除權限(v1.7)
在Go 中,通常需要以root 權限執行一個進程,綁定到權限端口,然後將特權授予非root 使用者。但是,由於 Go v1.7 的限制,不支援直接使用 syscall.SetUid()。
要實現此目的,可以考慮以下幾種方法:
iptables重定向:
透過 iptables 重新設計連接埠是一種選擇。此方法涉及將另一個連接埠重新路由到連接埠 80。但是,此方法會暴露安全性問題,因為任何非 root 程序都可能冒充網路伺服器。
替代方法:
更安全的方法利用 Go 的原生功能。以下是逐步指南:
此方法提供了權限管理的粒度。以下程式碼片段示範了其實現:
package main import ( "fmt" "io" "log" "net" "golang.org/x/sys/unix" ) func main() { listener, err := net.Listen("tcp", "127.0.0.1:80") if err != nil { log.Fatal(err) } for { conn, err := listener.Accept() if err != nil { log.Fatal(err) } uid := unix.Getuid() if uid == 0 { fmt.Fprintf(conn, "Running as root, downgrading to non-root user") // Mock retrieving desired user and UID desiredUser := "www-data" uid = 33 // Example non-root UID if err := unix.Setuid(uid); err != nil { log.Fatal(err) } fmt.Fprintf(conn, "Successfully dropped privileges to user %s\n", desiredUser) } fmt.Fprintf(conn, "Hello, world!\n") // Serve requests io.Copy(conn, conn) // Close the connection conn.Close() } }
透過遵循這些步驟並利用 Go 的內建功能,可以安全地放棄權限並以非 root 權限執行所需的應用程式。
以上是在 Go (v1.7) 中綁定到連接埠後如何安全地刪除權限?的詳細內容。更多資訊請關注PHP中文網其他相關文章!