Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Menggugurkan Keistimewaan dengan Selamat Selepas Mengikat ke Port in Go (v1.7)?

Bagaimanakah Saya Boleh Menggugurkan Keistimewaan dengan Selamat Selepas Mengikat ke Port in Go (v1.7)?

Susan Sarandon
Susan Sarandonasal
2024-11-28 09:35:121003semak imbas

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

Menggugurkan Keistimewaan di Golang (v1.7)

Dalam Go, selalunya wajar untuk melaksanakan proses dengan keistimewaan root, mengikat kepada port, dan kemudian lepaskan keistimewaan kepada pengguna bukan root. Walau bagaimanapun, disebabkan oleh pengehadan dalam Go v1.7, penggunaan langsung syscall.SetUid() tidak disokong.

Untuk mencapai ini, terdapat beberapa pendekatan yang perlu dipertimbangkan:

iptables Ubah hala:

Mereka bentuk semula port melalui iptables ialah satu pilihan. Kaedah ini melibatkan penghalaan semula port lain ke port 80. Walau bagaimanapun, pendekatan ini mendedahkan kebimbangan keselamatan, kerana sebarang proses bukan akar berkemungkinan menyamar sebagai pelayan web.

Kaedah Alternatif:

Pendekatan yang lebih selamat menggunakan keupayaan asli Go. Berikut ialah panduan langkah demi langkah:

  1. Buka port.
  2. Semak ID pengguna (UID).
  3. Jika UID ialah 0 (root) , dapatkan pengguna dan UID yang dikehendaki.
  4. Gunakan panggilan glibc (setuid dan setgid) untuk mengubah suai proses UID dan ID kumpulan (GID).

Pendekatan ini memberikan butiran dalam pengurusan keistimewaan. Coretan kod berikut menunjukkan pelaksanaannya:

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()
    }
}

Dengan mengikuti langkah ini dan memanfaatkan keupayaan terbina dalam Go, adalah mungkin untuk menggugurkan keistimewaan dengan selamat dan melaksanakan aplikasi yang diingini dengan kebenaran bukan akar.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggugurkan Keistimewaan dengan Selamat Selepas Mengikat ke Port in Go (v1.7)?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn