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 중국어 웹사이트의 기타 관련 기사를 참조하세요!