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:
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!