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:
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!