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
Lepaskan: 2024-11-28 09:35:12
asal
980 orang telah melayarinya

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()
    }
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan