Heim > Backend-Entwicklung > Golang > Wie kann ich Berechtigungen nach der Bindung an einen privilegierten Port in Go sicher entziehen?

Wie kann ich Berechtigungen nach der Bindung an einen privilegierten Port in Go sicher entziehen?

Linda Hamilton
Freigeben: 2024-11-27 18:31:10
Original
1061 Leute haben es durchsucht

How Can I Securely Drop Privileges After Binding to a Privileged Port in Go?

Privilegienverlust in Go (v1.7): Ein sicherer Ansatz

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)
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage