ホームページ > バックエンド開発 > Golang > Go で特権ポートにバインドした後、特権を安全に削除するにはどうすればよいですか?

Go で特権ポートにバインドした後、特権を安全に削除するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-11-27 18:31:10
オリジナル
1065 人が閲覧しました

How Can I Securely Drop Privileges After Binding to a Privileged Port in Go?

Go (v1.7) での権限ドロップ: 安全なアプローチ

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート