Jadual Kandungan
Keistimewaan Menjatuhkan dalam Go (v1.7): Pendekatan Selamat
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?

Nov 27, 2024 pm 06:31 PM

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:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

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!

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

Tag artikel panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah? GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah? Mar 03, 2025 pm 05:17 PM

GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah?

Bagaimana saya menulis objek dan stub untuk ujian di GO? Bagaimana saya menulis objek dan stub untuk ujian di GO? Mar 10, 2025 pm 05:38 PM

Bagaimana saya menulis objek dan stub untuk ujian di GO?

Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego? Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego? Mar 03, 2025 pm 05:22 PM

Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego?

Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya? Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya? Mar 10, 2025 pm 05:36 PM

Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya?

Bagaimana anda menulis ujian unit di GO? Bagaimana anda menulis ujian unit di GO? Mar 21, 2025 pm 06:34 PM

Bagaimana anda menulis ujian unit di GO?

Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go? Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go? Mar 03, 2025 pm 05:18 PM

Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go?

Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO? Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO? Mar 10, 2025 pm 03:20 PM

Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO?

Bagaimana cara menulis fail dalam bahasa Go dengan mudah? Bagaimana cara menulis fail dalam bahasa Go dengan mudah? Mar 03, 2025 pm 05:15 PM

Bagaimana cara menulis fail dalam bahasa Go dengan mudah?

See all articles