すべてのプロダクト
Search
ドキュメントセンター

Elastic Compute Service:PrivateLink によるパブリックネットワークへの露出低減

最終更新日:Aug 26, 2026

VPC 間またはクロスアカウントのプライベートアクセスに PrivateLink を使用し、Server Load Balancer (SLB) で Proxy Protocol v2 を有効にすることで、ソース VPC とエンドポイントを識別し、きめ細かいアクセス制御を実装できます。

セキュリティリスク

クラウド環境では、利便性のために、独自構築のデータベースプラットフォーム、AI 推論アプリケーション、Object Storage Service (OSS) などの Alibaba Cloud サービスに、Elastic IP (EIP) またはパブリックエンドポイントを構成することがよくあります。これにより、サービスがインターネットに直接公開され、次のセキュリティリスクが生じます。

  1. パブリックネットワーク攻撃のリスク:インターネットに公開されたサービスは、DDoS 攻撃、脆弱性スキャンと悪用、ブルートフォース攻撃の標的になる可能性があります。

  2. なりすましのリスク:従来のインターネットサービスは、ユーザー名とパスワードによる認証に依存します。認証情報が漏えいすると、攻撃者はどこからでも正規ユーザーになりすましてアクセスし、データを窃取または改ざんできます。パブリックアクセスでは、リクエストの送信元ネットワークを制限できません。

  3. データエクスフィルトレーションの経路:社内の従業員が個人のクラウドアカウントを使用し、OSS などの Alibaba Cloud サービスのパブリックエンドポイント経由で企業データを持ち出す可能性があります。このトラフィックはインターネットを経由するため、企業のネットワークポリシーを適用しにくくなります。

ベストプラクティス

PrivateLink を使用した同一ゾーン内の VPC 間アクセス

image

説明:ネットワークサービス (Web サービスなど) を VPC2 の Elastic Compute Service (ECS) インスタンスにデプロイします。VPC1 と VPC2 の間に PrivateLink 接続を作成すると、VPC1 からプライベート IP アドレス (エンドポイント) を介してサービスにアクセスできます。

注:エンドポイント (サービスコンシューマー) とエンドポイントサービス (サービスプロバイダー) は同一ゾーンに配置する必要があります。エンドポイントのゾーンは、エンドポイントサービスのゾーンのサブセットである必要があります。たとえば、エンドポイントサービスをゾーン A とゾーン B にデプロイしている場合、エンドポイントはゾーン A またはゾーン B にのみ作成できます。

主な手順:

  1. サーバー側 (サービスプロバイダー) の構成

    1. ロードバランサーの作成:VPC2 で、PrivateLink をサポートする SLB インスタンス (内部向けの Classic Load Balancer (CLB) または Network Load Balancer (NLB) など) を作成します。バックエンドサーバーグループとリスナーを構成します。

    2. エンドポイントサービスの作成:PrivateLink コンソールでエンドポイントサービスを作成し、前の手順で作成した SLB インスタンスに関連付けます。

    3. サービスホワイトリストの構成 (クロスアカウントアクセスの場合のみ):VPC1 が別の Alibaba Cloud アカウントに属している場合は、そのアカウントの UID をエンドポイントサービスのサービスホワイトリストに追加します。

    4. 接続リクエストの承認:クライアントが接続を開始した後、エンドポイントサービスの [接続] タブに移動し、保留中のリクエストを承認します。または、接続を自動承認するようにサービスを構成することもできます。

  2. クライアント側 (サービスコンシューマー) の構成

    1. エンドポイントの作成:VPC1 でエンドポイントを作成し、サーバー側で作成したエンドポイントサービスを選択します。

    2. ネットワークの構成:VPC1 でエンドポイント用の vSwitch とセキュリティグループを選択し、VPC1 内のどのリソースがエンドポイントにアクセスできるかを制御します。

    3. エンドポイントの詳細の取得:作成後、プライベートドメイン名と IP アドレスが生成されます。

    4. アクセスの開始:サービスプロバイダーが接続を承認すると、VPC1 のアプリケーションは生成されたドメイン名または IP アドレスを介して VPC2 のサービスにアクセスできます。

Proxy Protocol によるアクセス可能な VPC とプライベート IP アドレスの制御

PrivateLink 経由でサービスを提供する場合、サーバーは各リクエストの送信元エンドポイントまたは VPC を識別し、その情報に基づいてセキュリティルールを実装できます。たとえば、正当な VPC からのアクセスのみを受け付けるようにアカウントを制限できます。認証情報が漏えいしても、未承認のネットワークからはサービスにアクセスできません。

「PrivateLink を使用した同一ゾーン内の VPC 間アクセス」を前提に、サーバー側アプリケーションで送信元 VPC を識別し、アクセス制御を実装できます。

  1. Proxy Protocol v2 の有効化:NLB リスナーで Proxy Protocol v2 を有効にし、VPC ID とエンドポイント ID を取得するように設定します。

    # Cloud Assistant CLI を使用して、指定したリスナーで Proxy Protocol v2 を有効にし、VPC ID とエンドポイント ID を取得するように設定します。
    aliyun nlb UpdateListenerAttribute \
         --ListenerId lsn-xxxxxxxxxxxxxxxx \
         --ProxyProtocolEnabled true \
         --ProxyProtocolV2Config '{"Ppv2VpcIdEnabled":true,"Ppv2PrivateLinkEpIdEnabled":true}' \
         --RegionId cn-hangzhou

    --ListenerId:Web サービス用に作成したリスナー ID。

    --ProxyProtocolEnabled:true に設定して Proxy Protocol を有効にします。このプロトコルは、TCP ハンドシェイク後の最初のパケットでクライアント接続情報を渡します。バックエンドサービスはこのプロトコルをサポートする必要があります。詳細については、手順2を参照してください。サポートしていない場合、サービスが中断されます。

    --ProxyProtocolV2Config:Alibaba Cloud 定義の Type-Length-Value (TLV) フィールドを追加します。この例では、送信元 VPC ID と PrivateLink エンドポイント ID を取得するように設定します。

    17 7.005726    10.0.0.186    10.0.0.184    TCP    74 3059 → 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 WS=128
    18 7.005753    10.0.0.184    10.0.0.186    TCP    62 80 → 3059 [SYN, ACK] Seq=0 Ack=1 Win=64240 Len=0 MSS=1460 WS=128
    19 7.006781    10.0.0.186    10.0.0.184    TCP    54 3059 → 80 [ACK] Seq=1 Ack=1 Win=64256 Len=0
    20 7.006804    10.0.0.186    10.0.0.184    HTTP    154 Continuation
    21 7.006814    10.0.0.184    10.0.0.186    TCP    54 80 → 3059 [ACK] Seq=1 Ack=101 Win=64256 Len=0
    22 7.006805    10.0.0.186    10.0.0.184    HTTP    210 GET /login HTTP/1.1
    23 7.006821    10.0.0.184    10.0.0.186    TCP    54 80 → 3059 [ACK] Seq=1 Ack=257 Win=64128 Len=0

    以下の表に、TLV の解析方法を示します。

    説明

    元の値

    プロトコルヘッダー

    Proxy Protocol の固定シグネチャ

    0d0a0d0a000d0a515549540a

    バージョン 2、PROXY コマンド

    21

    TCP/IPv4

    11

    後続データは 84 バイト

    0054

    アドレス情報

    送信元 IP: 10.0.0.14

    0a00000e

    宛先 IP: 10.0.0.15

    0a00000f

    送信元ポート: 59074

    e6c2

    宛先ポート: 80

    0050

    TLV1

    Type 03

    03

    4 バイト

    0004

    0764b56b

    0764b56b

    TLV2

    Type e1 (カスタムタイプ)

    e1

    24 バイト

    0018

    PrivateLink エンドポイント ID:

    ep-bp1i288487e586152d4b

    0265702d6270316932383834383765353836313532643462

    TLV3

    Type e1 (カスタムタイプ)

    e1

    26 バイト

    001a

    VPC ID:

    vpc-bp179qeke0wzo1mr8bxhl

    017670632d627031373971656b6530777a6f316d72386278686c

    TLV4

    04 (PP2_TYPE_NETNS)、ネットワーク名前空間の転送に使用

    04

    6 バイト

    0006

    000000000000

    000000000000

  2. Web サービスで Nginx を使用している場合は、Proxy Protocol をサポートするように構成します。

    (NGINX Plus R16 以降、またはオープンソース Nginx 1.13.11 以降が必要です)

    server {
        listen 80 proxy_protocol;   # Proxy Protocol v1/v2 を有効にします。
        # その他の設定...
    }

    Nginx は、ポート 80 で Proxy Protocol TLV を自動的に解析しますが、標準バージョンでは TLV から IP アドレスを取得することしかできません。

    Lua 拡張を使用して、Alibaba Cloud 向けにカスタマイズされた VPC ID と PrivateLink エンドポイント ID を処理します。

    Nginx の http ブロックで直接 Proxy Protocol を処理するように設定します。listen ディレクティブで proxy_protocol を有効にすると、Nginx は自動的に Proxy Protocol ヘッダーを解析します。Alibaba Cloud 固有の TLV (Type-Length-Value) 情報は、$proxy_protocol_tlvs 変数に格納されます。

    以下の設定では、access_by_lua_block を使用してこの変数を読み取り、Lua スクリプトで PrivateLink エンドポイント ID を抽出して検証します。/login リクエストが特定の PrivateLink エンドポイントから来た場合にのみアクセスを許可します。

    http {
        # 整理のため、この関数を別の .lua ファイルに配置することも推奨されます。
        init_by_lua_block {
            -- Nginxが提供する16進数エンコードされたTLV文字列を解析するグローバルLua関数です。
            _G.parse_alicloud_tlvs = function(raw_tlvs_hex)
                if not raw_tlvs_hex or raw_tlvs_hex == "" then
                    return nil
                end
    
                -- 16進数文字列を生のバイト文字列に変換するヘルパーです。
                local function hex_to_str(s)
                    return (s:gsub('..', function(cc)
                        return string.char(tonumber(cc, 16))
                    end))
                end
    
                local tlv_data = hex_to_str(raw_tlvs_hex)
                local parsed_tlvs = {}
                local pos = 1
                while pos <= #tlv_data do
                    if pos + 2 > #tlv_data then
                        ngx.log(ngx.ERR, "Malformed TLV: not enough bytes for type/length at pos ", pos)
                        break
                    end
    
                    local tlv_type = string.byte(tlv_data, pos)
                    local tlv_length = string.byte(tlv_data, pos + 1) * 256 + string.byte(tlv_data, pos + 2)
                    
                    if pos + 2 + tlv_length > #tlv_data then
                        ngx.log(ngx.ERR, "Malformed TLV: length exceeds available data for type ", tlv_type)
                        break
                    end
    
                    local tlv_value_raw = string.sub(tlv_data, pos + 3, pos + 2 + tlv_length)
                    
                    -- Alibaba Cloud カスタム TLV (タイプ 0xE1) をチェックします。
                    if tlv_type == 0xe1 then
                        if #tlv_value_raw > 1 then
                            local subtype = string.byte(tlv_value_raw, 1)
                            local data = string.sub(tlv_value_raw, 2)
                            if subtype == 0x01 then -- VPC ID
                                parsed_tlvs.vpc_id = data
                            elseif subtype == 0x02 then -- PrivateLink エンドポイント ID
                                parsed_tlvs.endpoint_id = data
                            end
                        end
                    end
                    pos = pos + 3 + tlv_length
                end
                return parsed_tlvs
            end
        }
    
        server {
            # Nginx はポート 80 でリッスンし、Proxy Protocol ヘッダーを待ち受けます。
            # ヘッダーを自動的に解析し、実際のクライアント IP を設定し、TLV を $proxy_protocol_tlvs で利用可能にします。
            listen 80 proxy_protocol;
    
            # /login リクエストに対して、TLV に基づくアクセス制御を実行します。
            location /login {
                access_by_lua_block {
                    -- ngx.var.proxy_protocol_tlvs には Nginx からの16進数エンコードされた TLV が含まれています。
                    local tlvs = _G.parse_alicloud_tlvs(ngx.var.proxy_protocol_tlvs)
    
                    if not tlvs or not tlvs.endpoint_id then
                        ngx.log(ngx.ERR, "Access denied: PrivateLink Endpoint ID not found in TLV.")
                        return ngx.exit(ngx.HTTP_FORBIDDEN)
                    end
                    
                    -- 期待するエンドポイント ID を定義します。
                    -- この値は、実際の環境のエンドポイント ID に置き換える必要があります。
                    local expected_endpoint_id = "ep-bp1i288487e586152d4b"
    
                    -- エンドポイント ID を検証します。
                    if tlvs.endpoint_id ~= expected_endpoint_id then
                       ngx.log(ngx.ERR, "Access to /login denied: Endpoint ID mismatch. Expected '", expected_endpoint_id, "', got '", tostring(tlvs.endpoint_id), "'")
                       return ngx.exit(ngx.HTTP_FORBIDDEN)
                    end
    
                    -- 検証に成功した場合、リクエストは続行されます。
                }
                proxy_pass http://your_python_backend;
            }
    
            # その他のすべてのリクエストを処理します。
            location / {
                proxy_pass http://your_python_backend;
            }
        }
    
        # Python バックエンドサービスの upstream 定義です。
        upstream your_python_backend {
            server 127.0.0.1:5000; # バックエンドプログラムはポート 5000 で実行されていると想定します。
        }
    }

PrivateLink を使用した Alibaba Cloud サービスへのアクセス

一部の Alibaba Cloud サービスは PrivateLink アクセスをサポートしています。これにより、プライベートネットワークからのアクセスを許可するアカウントを設定することで、パブリックネットワークのセキュリティリスクを回避できます。

個人アカウントはデータ漏えいのリスクになります。エンタープライズアカウントを設定し、正当なプライベートネットワークからのアクセスのみを許可することで、認証情報が侵害された場合でも悪用されるのを防ぎます。

脅威シナリオ

  1. Alibaba Cloud サービス用のエンドポイントの作成:PrivateLink コンソールで、OSS など、アクセスが必要な Alibaba Cloud サービスのゲートウェイエンドポイントを作成し、企業の VPC とルートテーブルに関連付けます。

  2. エンドポイントアクセスポリシーの構成:企業の Alibaba Cloud アカウントに属する RAM ID (ユーザーやロールなど) にアクセスを制限します。これにより、従業員の個人アカウントなど、他のアカウントがこのプライベート経路を通じて OSS にアクセスするのを防ぐことができます。

  3. RAM ポリシーの構成 (任意):よりきめ細かい制御を行うために、RAM ユーザーまたはロール向けの RAM ポリシーを設定し、OSS へのアクセスが特定の VPC から発信されるように強制します。

コンプライアンス機能

VPC から Alibaba Cloud のパブリック IP アドレスへのアクセスの確認

VPC フローログを分析し、PrivateLink で最適化できる、VPC から Alibaba Cloud のパブリック IP アドレスへのアウトバウンドトラフィックを特定します。

手順:

  1. VPC フローログの有効化:主要な業務が稼働している VPC のフローログを有効にし、ログを Simple Log Service (SLS) に配信します。

  2. アウトバウンドトラフィックの分析:SLS コンソールで VPC フローログをクエリし、direction = out でアウトバウンドトラフィックをフィルタリングします。

  3. フィルタリングと特定:

    • レスポンスパケットのフィルタリング:宛先ポートが 1024 未満のトラフィックや、既知のサービス応答トラフィックなどを除外し、ノイズを低減します。

    • Alibaba Cloud のパブリック IP アドレスの特定:ipip.net などのツールを使用して、宛先 IP アドレス (dstaddr) の所有者情報を照会します。Alibaba Cloud に属するパブリック IP アドレスに注目します。

    • 送信元 ECS インスタンスの特定:フローログの vm-id フィールドを使用して、アクセスを開始した ECS インスタンスを特定します。

ログ分析の例

これらのログを分析して、どのインスタンスがインターネット経由でクラウドリソースにアクセスしているかを特定します。

このログ例の主なフィールド:

  • srcaddr: 10.0.1.171 (VPC 内のプライベート IP アドレス)

  • dstaddr: 47.110.154.20、dstport: 80 (宛先のパブリック IP アドレスとポート)

  • direction: out、action: ACCEPT (アウトバウンド、許可)

  • protocol: 6 (TCP)

  • vm-id: i-bp1ifnznc1m4tp4krmb1 (アクセスを開始した ECS インスタンス)

結果の検証:

  • 宛先のパブリック IP アドレスが OSS や ECS などの Alibaba Cloud サービスのパブリックエンドポイントである場合は、PrivateLink エンドポイントに切り替えてください。

  • 宛先のパブリック IP アドレスが、同一アカウント内の別の VPC にあるサービス (EIP または SLB など) を指している場合、この VPC 間通信は PrivateLink で最適化できます。