>백엔드 개발 >Golang >Go에서 권한 있는 포트에 바인딩한 후 권한을 안전하게 삭제하려면 어떻게 해야 합니까?

Go에서 권한 있는 포트에 바인딩한 후 권한을 안전하게 삭제하려면 어떻게 해야 합니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-27 18:31:10984검색

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

Go(v1.7)의 권한 삭제: 안전한 접근 방식

Go를 사용하여 맞춤형 웹 서버를 개발하는 맥락에서, 일반적으로 루트 계정용으로 예약된 포트에 바인딩하는 데 필요한 권한입니다. 필요한 바인딩을 설정하려면 루트 권한으로 서버를 설정하는 것이 필요하지만 잠재적인 보안 취약점을 방지하려면 가능한 한 빨리 이러한 권한을 삭제하는 것이 중요합니다.

Go v1.7 릴리스에서는 직접 조작할 수 있는 기능이 syscall.SetUid()를 사용한 권한은 지원되지 않습니다. 이러한 제한은 권한 삭제에 대한 깨끗하고 안전한 솔루션을 찾는 개발자에게 과제를 제기합니다.

이 문제를 해결하기 위해 대체 접근 방식은 glibc 호출을 활용하여 프로세스의 UID 및 GID를 설정하는 것입니다. 원하는 포트에 바인딩하고 UID를 감지함으로써 개발자는 UID가 초기에 0인 경우 루트가 아닌 사용자로 안전하게 다운그레이드할 수 있습니다. 이 전략은 바인딩이 완료된 후에 서버가 제한된 권한으로만 작동하도록 보장합니다.

이 접근 방식을 설명하려면 다음 코드 조각을 고려하세요.

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

이 코드는 TLS 암호화 포트를 열고 이를 감지하고 다운그레이드하는 전체 프로세스를 보여줍니다. 루트 권한에서 액세스하고 권한이 낮은 사용자를 사용하여 HTTP 요청을 처리합니다.

이 접근 방식을 고수함으로써 개발자는 필요한 수준의 권한 제어를 유지하고 잠재적인 보안 위험을 최소화하면서 Go에서 안전한 맞춤형 웹 서버를 만들 수 있습니다. .

위 내용은 Go에서 권한 있는 포트에 바인딩한 후 권한을 안전하게 삭제하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.