Maison >développement back-end >Golang >Comment puis-je supprimer des privilèges en toute sécurité après m'être connecté à un port privilégié dans Go ?
Dans le contexte du développement de serveurs Web personnalisés utilisant Go, il est essentiel de réfléchir à la manière de gérer les privilèges requis pour se lier aux ports généralement réservés aux comptes root. Bien que la configuration du serveur avec les privilèges root soit nécessaire pour établir les liaisons nécessaires, il est crucial de supprimer ces privilèges dès que possible pour éviter d'éventuelles vulnérabilités de sécurité.
Dans la version v1.7 de Go, la possibilité de manipuler directement les privilèges utilisant syscall.SetUid() ne sont pas pris en charge. Cette limitation pose un défi aux développeurs qui recherchent une solution propre et sécurisée pour supprimer les privilèges.
Pour résoudre ce problème, une approche alternative consiste à utiliser des appels glibc pour définir l'UID et le GID du processus. En se liant au port souhaité et en détectant l'UID, les développeurs peuvent rétrograder en toute sécurité vers un utilisateur non root si l'UID est initialement 0. Cette stratégie garantit que le serveur ne fonctionne qu'avec les privilèges réduits une fois la liaison terminée.
Pour illustrer cette approche, considérons l'extrait de code suivant :
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) }
Ce code démontre le processus complet d'ouverture d'un port crypté TLS, de détection et de rétrogradation. à partir des privilèges root et en traitant les requêtes HTTP en utilisant l'utilisateur moins privilégié.
En adhérant à cette approche, les développeurs peuvent créer des serveurs Web personnalisés sécurisés dans Go tout en maintenant le niveau de contrôle nécessaire sur les privilèges et en minimisant les risques de sécurité potentiels. .
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!