Golang での権限の削除 (v1.7)
Go では、root 権限でプロセスを実行し、バインドすることが望ましいことがよくあります。ポートを削除し、root 以外のユーザーに権限をドロップします。ただし、Go v1.7 の制限のため、syscall.SetUid() の直接使用はサポートされていません。
これを実現するには、いくつかのアプローチを考慮する必要があります。
iptablesリダイレクト:
iptables 経由でポートを再設計することは 1 つのオプションです。この方法では、別のポートをポート 80 に再ルーティングする必要があります。ただし、ルート以外のプロセスが Web サーバーのふりをする可能性があるため、この方法ではセキュリティ上の懸念が生じます。
代替方法:
より安全なアプローチでは、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 の組み込み機能を活用することで、権限を安全に削除し、非 root 権限で目的のアプリケーションを実行できます。
以上がGo (v1.7) でポートにバインドした後に特権を安全に削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。