Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Menggugurkan Keistimewaan dengan Selamat Selepas Mengikat ke Pelabuhan Istimewa dalam Go?

Bagaimanakah Saya Boleh Menggugurkan Keistimewaan dengan Selamat Selepas Mengikat ke Pelabuhan Istimewa dalam Go?

Linda Hamilton
Lepaskan: 2024-11-27 18:31:10
asal
994 orang telah melayarinya

How Can I Securely Drop Privileges After Binding to a Privileged Port in Go?

Keistimewaan Menjatuhkan dalam Go (v1.7): Pendekatan Selamat

Dalam konteks membangunkan pelayan web tersuai menggunakan Go, adalah penting untuk mempertimbangkan cara mengendalikan keistimewaan yang diperlukan untuk mengikat port yang biasanya dikhaskan untuk akaun root. Walaupun menyediakan pelayan dengan keistimewaan root adalah perlu untuk mewujudkan pengikatan yang diperlukan, adalah penting untuk menggugurkan keistimewaan ini secepat mungkin untuk mengelakkan potensi kelemahan keselamatan.

Dalam keluaran v1.7 Go, keupayaan untuk memanipulasi secara langsung keistimewaan menggunakan syscall.SetUid() tidak disokong. Pengehadan ini menimbulkan cabaran kepada pembangun yang mencari penyelesaian yang bersih dan selamat untuk kehilangan keistimewaan.

Untuk menangani isu ini, pendekatan alternatif melibatkan penggunaan panggilan glibc untuk menetapkan UID dan GID proses. Dengan mengikat ke port yang dikehendaki dan mengesan UID, pembangun boleh menurunkan taraf kepada pengguna bukan root dengan selamat jika UID pada mulanya 0. Strategi ini memastikan pelayan hanya beroperasi dengan keistimewaan yang dikurangkan setelah pengikatan selesai.

Untuk menggambarkan pendekatan ini, pertimbangkan coretan kod berikut:

import (
    "crypto/tls"
    "log"
    "net/http"
    "os/user"
    "strconv"
    "syscall"
)

func main() {
    ...
    listener, err := tls.Listen("tcp4", "127.0.0.1:445", &tlsconf)
    if err != nil {
        log.Fatalln("Error opening port:", err)
    }
    if syscall.Getuid() == 0 {
        log.Println("Running as root, downgrading to user www-data")
        ...
        cerr, errno := C.setgid(C.__gid_t(gid))
        if cerr != 0 {
            log.Fatalln("Unable to set GID due to error:", errno)
        }
        cerr, errno = C.setuid(C.__uid_t(uid))
        if cerr != 0 {
            log.Fatalln("Unable to set UID due to error:", errno)
        }
    }
    ...
    err = http.Serve(listener, nil)
    log.Fatalln(err)
}
Salin selepas log masuk

Kod ini menunjukkan proses lengkap membuka port yang disulitkan TLS, mengesan dan menurunkan taraf daripada keistimewaan root, dan menyediakan permintaan HTTP menggunakan pengguna yang mempunyai keistimewaan yang lebih rendah.

Dengan mematuhi pendekatan ini, pembangun boleh mencipta pelayan web tersuai yang selamat dalam Go sambil mengekalkan yang diperlukan tahap kawalan ke atas keistimewaan dan meminimumkan potensi risiko keselamatan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggugurkan Keistimewaan dengan Selamat Selepas Mengikat ke Pelabuhan Istimewa dalam Go?. 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