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

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

Susan Sarandon
Susan Sarandonオリジナル
2024-11-28 09:35:12938ブラウズ

How Can I Securely Drop Privileges After Binding to a Port in Go (v1.7)?

Golang での権限の削除 (v1.7)

Go では、root 権限でプロセスを実行し、バインドすることが望ましいことがよくあります。ポートを削除し、root 以外のユーザーに権限をドロップします。ただし、Go v1.7 の制限のため、syscall.SetUid() の直接使用はサポートされていません。

これを実現するには、いくつかのアプローチを考慮する必要があります。

iptablesリダイレクト:

iptables 経由でポートを再設計することは 1 つのオプションです。この方法では、別のポートをポート 80 に再ルーティングする必要があります。ただし、ルート以外のプロセスが Web サーバーのふりをする可能性があるため、この方法ではセキュリティ上の懸念が生じます。

代替方法:

より安全なアプローチでは、Go のネイティブ機能を利用します。ステップバイステップのガイドは次のとおりです。

  1. ポートを開きます。
  2. ユーザー ID (UID) を確認します。
  3. UID が 0 (root) の場合、目的のユーザーと UID を取得します。
  4. glibc 呼び出し (setuid および setgid) を使用してプロセス UID を変更します。およびグループ ID (GID)。

このアプローチにより、権限管理が細分化されます。次のコード スニペットは、その実装を示しています。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。