Golang(v1.7)에서 권한 삭제
Go에서는 루트 권한으로 프로세스를 실행하고 바인딩하는 것이 종종 바람직합니다. 포트를 선택한 다음 루트가 아닌 사용자에게 권한을 부여합니다. 그러나 Go v1.7의 제한으로 인해 syscall.SetUid()를 직접 사용할 수는 없습니다.
이를 달성하려면 다음과 같은 몇 가지 접근 방식을 고려해야 합니다.
iptables 리디렉션:
iptables를 통해 포트를 재설계하는 것도 하나의 옵션입니다. 이 방법에는 다른 포트를 포트 80으로 다시 라우팅하는 작업이 포함됩니다. 그러나 이 방법은 루트가 아닌 프로세스가 잠재적으로 웹 서버로 위장할 수 있으므로 보안 문제를 노출시킵니다.
대체 방법:
보다 안전한 접근 방식은 Go의 기본 기능을 활용합니다. 단계별 가이드는 다음과 같습니다.
이 접근 방식은 권한 관리에 세분화성을 제공합니다. 다음 코드 조각은 구현을 보여줍니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!