Suppression des privilèges dans Golang (v1.7)
Dans Go, il est souvent souhaitable d'exécuter un processus avec les privilèges root, de se lier à un port, puis abandonnez les privilèges à un utilisateur non root. Cependant, en raison des limitations de Go v1.7, l'utilisation directe de syscall.SetUid() n'est pas prise en charge.
Pour y parvenir, plusieurs approches sont à considérer :
iptables Redirection :
La refonte des ports via iptables est une option. Cette méthode implique de rediriger un autre port vers le port 80. Cependant, cette approche expose à des problèmes de sécurité, car tout processus non root pourrait potentiellement se faire passer pour le serveur Web.
Méthode alternative :
Une approche plus sécurisée utilise les capacités natives de Go. Voici un guide étape par étape :
Cette approche offre une granularité dans la gestion des privilèges. L'extrait de code suivant démontre sa mise en œuvre :
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() } }
En suivant ces étapes et en tirant parti des fonctionnalités intégrées de Go, il est possible de supprimer les privilèges en toute sécurité et d'exécuter l'application souhaitée avec des autorisations non root.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!