Go での権限の削除 (v1.7)
Golang でカスタム Web サーバーを作成するタスクでは、多くの場合、セキュリティを確保するには、そのようなポートにバインドした後に root 権限を削除することが重要です。この記事では、Go での権限の削除の問題を調査し、その解決策を提供します。
Go の以前のバージョンでは、syscall.SetUid() を利用して権限を削除すると、「サポートされていません」が返されます。別の方法として、iptables を使用してポート 80 を非特権ポートにリダイレクトすることもできます。ただし、このソリューションでは、ルート以外のプロセスが Web サーバーになりすますことができるため、セキュリティ上の脆弱性が生じます。
この解決策は、Go のネットワーク機能とシステム コール機能を組み合わせて使用することにあります。特権ポートを開いて UID を決定した後、目的のユーザーを識別し、その UID を取得し、glibc 関数 setgid() および setuid() を使用して UID と GID の両方を設定できます。ポートをバインドした直後、http.Serve.
を呼び出す前にこのコードを実行することが重要です。提供されたコード スニペットは、このアプローチを示しています。まず必要な TLS 証明書をロードし、特権ポートでリッスンします。アプリケーションが root として実行されている場合は、glibc 呼び出しを使用して UID と GID を設定することにより、指定されたユーザーにダウングレードします。その後、受信リクエストをリッスンし、Web コンテンツを提供します。
このソリューションは、Go アプリケーションで権限を削除する必要性に効果的に対処します。セキュリティを損なうことなく、安全で堅牢なカスタム Web サーバーを作成できます。
以上がGo Web サーバーの特権ポートにバインドした後、特権を安全に削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。