Go を使用してカスタム Web サーバーを開発する場合、通常、root アカウント用に予約されているポートにバインドするために必要な権限。必要なバインドを確立するには root 権限でサーバーを設定する必要がありますが、潜在的なセキュリティ脆弱性を防ぐためにこれらの権限をできるだけ早く削除することが重要です。
Go の v1.7 リリースでは、直接操作する機能が追加されました。 syscall.SetUid() を使用した権限はサポートされていません。この制限は、権限を削除するためのクリーンで安全なソリューションを求める開発者にとって課題となっています。
この問題に対処するための代替アプローチには、glibc 呼び出しを利用してプロセスの UID と GID を設定することが含まれます。目的のポートにバインドして UID を検出することにより、UID が最初に 0 の場合、開発者は非 root ユーザーに安全にダウングレードできます。この戦略により、バインドが完了すると、サーバーは制限された権限でのみ動作することが保証されます。
このアプローチを説明するために、次のコード スニペットを考えてみましょう。
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 暗号化ポートのオープン、検出、および検出の完全なプロセスを示しています。 root 権限からダウングレードし、より低い権限を持つユーザーを使用して HTTP リクエストを処理します。
このアプローチに従うことで、開発者は必要な権限レベルの制御を維持し、潜在的なセキュリティを最小限に抑えながら、Go で安全なカスタム Web サーバーを作成できます。リスク。
以上がGo で特権ポートにバインドした後、特権を安全に削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。