Maison >développement back-end >Golang >Comment puis-je supprimer des privilèges en toute sécurité après la liaison à un port dans Go (v1.7) ?

Comment puis-je supprimer des privilèges en toute sécurité après la liaison à un port dans Go (v1.7) ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-28 09:35:12935parcourir

How Can I Securely Drop Privileges After Binding to a Port in Go (v1.7)?

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 :

  1. Ouvrez le port.
  2. Vérifiez l'ID utilisateur (UID).
  3. Si l'UID est 0 (root) , obtenez l'utilisateur et l'UID souhaités.
  4. Utilisez les appels glibc (setuid et setgid) pour modifier l'UID du processus et l'ID de groupe (GID).

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn