Heim >Backend-Entwicklung >Golang >Wie kann ich Berechtigungen nach der Bindung an einen Port in Go (v1.7) sicher entziehen?

Wie kann ich Berechtigungen nach der Bindung an einen Port in Go (v1.7) sicher entziehen?

Susan Sarandon
Susan SarandonOriginal
2024-11-28 09:35:12949Durchsuche

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

Berechtigungen in Golang (v1.7) löschen

In Go ist es oft wünschenswert, einen Prozess mit Root-Berechtigungen auszuführen, an ihn zu binden einen Port und geben Sie dann die Berechtigungen an einen Nicht-Root-Benutzer ab. Aufgrund von Einschränkungen in Go v1.7 wird die direkte Verwendung von syscall.SetUid() jedoch nicht unterstützt.

Um dies zu erreichen, sind mehrere Ansätze zu berücksichtigen:

iptables Umleitung:

Ports über iptables neu zu gestalten ist eine Option. Bei dieser Methode wird ein anderer Port auf Port 80 umgeleitet. Dieser Ansatz bringt jedoch Sicherheitsbedenken mit sich, da sich jeder Nicht-Root-Prozess potenziell als Webserver ausgeben könnte.

Alternative Methode:

Ein sichererer Ansatz nutzt die nativen Funktionen von Go. Hier ist eine Schritt-für-Schritt-Anleitung:

  1. Öffnen Sie den Port.
  2. Überprüfen Sie die Benutzer-ID (UID).
  3. Wenn die UID 0 ist (root) , erhalten Sie den gewünschten Benutzer und die UID.
  4. Verwenden Sie Glibc-Aufrufe (setuid und setgid), um die Prozess-UID und Gruppen-ID zu ändern (GID).

Dieser Ansatz bietet Granularität bei der Berechtigungsverwaltung. Der folgende Codeausschnitt demonstriert die Implementierung:

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()
    }
}

Durch Befolgen dieser Schritte und Nutzung der integrierten Funktionen von Go ist es möglich, Berechtigungen sicher zu entziehen und die gewünschte Anwendung mit Nicht-Root-Berechtigungen auszuführen.

Das obige ist der detaillierte Inhalt vonWie kann ich Berechtigungen nach der Bindung an einen Port in Go (v1.7) sicher entziehen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn