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
Libérer: 2024-11-28 09:35:12
original
984 Les gens l'ont consulté

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()
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal