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

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

Susan Sarandon
Susan Sarandon원래의
2024-11-28 09:35:121005검색

How Can I Securely Drop Privileges After Binding to a Port in Go (v1.7)?

Golang(v1.7)에서 권한 삭제

Go에서는 루트 권한으로 프로세스를 실행하고 바인딩하는 것이 종종 바람직합니다. 포트를 선택한 다음 루트가 아닌 사용자에게 권한을 부여합니다. 그러나 Go v1.7의 제한으로 인해 syscall.SetUid()를 직접 사용할 수는 없습니다.

이를 달성하려면 다음과 같은 몇 가지 접근 방식을 고려해야 합니다.

iptables 리디렉션:

iptables를 통해 포트를 재설계하는 것도 하나의 옵션입니다. 이 방법에는 다른 포트를 포트 80으로 다시 라우팅하는 작업이 포함됩니다. 그러나 이 방법은 루트가 아닌 프로세스가 잠재적으로 웹 서버로 위장할 수 있으므로 보안 문제를 노출시킵니다.

대체 방법:

보다 안전한 접근 방식은 Go의 기본 기능을 활용합니다. 단계별 가이드는 다음과 같습니다.

  1. 포트를 엽니다.
  2. 사용자 ID(UID)를 확인합니다.
  3. UID가 0(루트)인 경우 , 원하는 사용자와 UID를 얻습니다.
  4. glibc 호출(setuid 및 setgid)을 사용하여 프로세스 UID를 수정합니다. 및 그룹 ID(GID).

이 접근 방식은 권한 관리에 세분화성을 제공합니다. 다음 코드 조각은 구현을 보여줍니다.

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

이러한 단계를 따르고 Go에 내장된 기능을 활용하면 안전하게 권한을 삭제하고 루트가 아닌 권한으로 원하는 애플리케이션을 실행할 수 있습니다.

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

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