Im Zusammenhang mit der Entwicklung benutzerdefinierter Webserver mit Go ist es wichtig zu überlegen, wie mit dem umgegangen werden soll Berechtigungen, die für die Bindung an Ports erforderlich sind, die normalerweise für Root-Konten reserviert sind. Während das Einrichten des Servers mit Root-Berechtigungen erforderlich ist, um die erforderlichen Bindungen einzurichten, ist es wichtig, diese Berechtigungen so schnell wie möglich aufzugeben, um potenzielle Sicherheitslücken zu vermeiden.
In Gos Version 1.7 besteht die Möglichkeit, direkt zu manipulieren Berechtigungen mit syscall.SetUid() werden nicht unterstützt. Diese Einschränkung stellt eine Herausforderung für Entwickler dar, die eine saubere und sichere Lösung für den Verlust von Berechtigungen suchen.
Um dieses Problem zu beheben, besteht ein alternativer Ansatz darin, Glibc-Aufrufe zu verwenden, um die UID und GID des Prozesses festzulegen. Durch die Bindung an den gewünschten Port und die Erkennung der UID können Entwickler sicher ein Downgrade auf einen Nicht-Root-Benutzer durchführen, wenn die UID anfänglich 0 ist. Diese Strategie stellt sicher, dass der Server erst nach Abschluss der Bindung mit den reduzierten Berechtigungen arbeitet.
Um diesen Ansatz zu veranschaulichen, betrachten Sie den folgenden Codeausschnitt:
import ( "crypto/tls" "log" "net/http" "os/user" "strconv" "syscall" ) func main() { ... listener, err := tls.Listen("tcp4", "127.0.0.1:445", &tlsconf) if err != nil { log.Fatalln("Error opening port:", err) } if syscall.Getuid() == 0 { log.Println("Running as root, downgrading to user www-data") ... cerr, errno := C.setgid(C.__gid_t(gid)) if cerr != 0 { log.Fatalln("Unable to set GID due to error:", errno) } cerr, errno = C.setuid(C.__uid_t(uid)) if cerr != 0 { log.Fatalln("Unable to set UID due to error:", errno) } } ... err = http.Serve(listener, nil) log.Fatalln(err) }
Dieser Code demonstriert den gesamten Prozess des Öffnens, Erkennens und Herabstufens eines TLS-verschlüsselten Ports von Root-Berechtigungen und der Bearbeitung von HTTP-Anfragen unter Verwendung des Benutzers mit niedrigeren Berechtigungen.
Durch die Einhaltung dieses Ansatzes können Entwickler sichere benutzerdefinierte Webserver in Go erstellen und gleichzeitig das erforderliche Maß an Kontrolle über Berechtigungen beibehalten und potenzielle Sicherheitsrisiken minimieren .
Das obige ist der detaillierte Inhalt vonWie kann ich Berechtigungen nach der Bindung an einen privilegierten Port in Go sicher entziehen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!