首頁 > 後端開發 > Golang > 在 Go (v1.7) 中綁定到連接埠後如何安全地刪除權限?

在 Go (v1.7) 中綁定到連接埠後如何安全地刪除權限?

Susan Sarandon
發布: 2024-11-28 09:35:12
原創
980 人瀏覽過

How Can I Securely Drop Privileges After Binding to a Port in Go (v1.7)?

在Golang 中刪除權限(v1.7)

在Go 中,通常需要以root 權限執行一個進程,綁定到權限端口,然後將特權授予非root 使用者。但是,由於 Go v1.7 的限制,不支援直接使用 syscall.SetUid()。

要實現此目的,可以考慮以下幾種方法:

iptables重定向:

透過 iptables 重新設計連接埠是一種選擇。此方法涉及將另一個連接埠重新路由到連接埠 80。但是,此方法會暴露安全性問題,因為任何非 root 程序都可能冒充網路伺服器。

替代方法:

更安全的方法利用 Go 的原生功能。以下是逐步指南:

  1. 開啟連接埠。
  2. 檢查使用者 ID (UID)。
  3. 如果 UID 為 0(root) ,取得所需的使用者和UID。
  4. 使用glibc呼叫(setuid和setgid)修改進程UID和群組 ID (GID)。

此方法提供了權限管理的粒度。以下程式碼片段示範了其實現:

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板