VPC 間またはクロスアカウントのプライベートアクセスに PrivateLink を使用し、Server Load Balancer (SLB) で Proxy Protocol v2 を有効にすることで、ソース VPC とエンドポイントを識別し、きめ細かいアクセス制御を実装できます。
セキュリティリスク
クラウド環境では、利便性のために、独自構築のデータベースプラットフォーム、AI 推論アプリケーション、Object Storage Service (OSS) などの Alibaba Cloud サービスに、Elastic IP (EIP) またはパブリックエンドポイントを構成することがよくあります。これにより、サービスがインターネットに直接公開され、次のセキュリティリスクが生じます。
パブリックネットワーク攻撃のリスク:インターネットに公開されたサービスは、DDoS 攻撃、脆弱性スキャンと悪用、ブルートフォース攻撃の標的になる可能性があります。
なりすましのリスク:従来のインターネットサービスは、ユーザー名とパスワードによる認証に依存します。認証情報が漏えいすると、攻撃者はどこからでも正規ユーザーになりすましてアクセスし、データを窃取または改ざんできます。パブリックアクセスでは、リクエストの送信元ネットワークを制限できません。
データエクスフィルトレーションの経路:社内の従業員が個人のクラウドアカウントを使用し、OSS などの Alibaba Cloud サービスのパブリックエンドポイント経由で企業データを持ち出す可能性があります。このトラフィックはインターネットを経由するため、企業のネットワークポリシーを適用しにくくなります。
ベストプラクティス
PrivateLink を使用した同一ゾーン内の VPC 間アクセス
説明:ネットワークサービス (Web サービスなど) を VPC2 の Elastic Compute Service (ECS) インスタンスにデプロイします。VPC1 と VPC2 の間に PrivateLink 接続を作成すると、VPC1 からプライベート IP アドレス (エンドポイント) を介してサービスにアクセスできます。
注:エンドポイント (サービスコンシューマー) とエンドポイントサービス (サービスプロバイダー) は同一ゾーンに配置する必要があります。エンドポイントのゾーンは、エンドポイントサービスのゾーンのサブセットである必要があります。たとえば、エンドポイントサービスをゾーン A とゾーン B にデプロイしている場合、エンドポイントはゾーン A またはゾーン B にのみ作成できます。
主な手順:
サーバー側 (サービスプロバイダー) の構成
ロードバランサーの作成:VPC2 で、PrivateLink をサポートする SLB インスタンス (内部向けの Classic Load Balancer (CLB) または Network Load Balancer (NLB) など) を作成します。バックエンドサーバーグループとリスナーを構成します。
エンドポイントサービスの作成:PrivateLink コンソールでエンドポイントサービスを作成し、前の手順で作成した SLB インスタンスに関連付けます。
サービスホワイトリストの構成 (クロスアカウントアクセスの場合のみ):VPC1 が別の Alibaba Cloud アカウントに属している場合は、そのアカウントの UID をエンドポイントサービスのサービスホワイトリストに追加します。
接続リクエストの承認:クライアントが接続を開始した後、エンドポイントサービスの [接続] タブに移動し、保留中のリクエストを承認します。または、接続を自動承認するようにサービスを構成することもできます。
クライアント側 (サービスコンシューマー) の構成
エンドポイントの作成:VPC1 でエンドポイントを作成し、サーバー側で作成したエンドポイントサービスを選択します。
ネットワークの構成:VPC1 でエンドポイント用の vSwitch とセキュリティグループを選択し、VPC1 内のどのリソースがエンドポイントにアクセスできるかを制御します。
エンドポイントの詳細の取得:作成後、プライベートドメイン名と IP アドレスが生成されます。
アクセスの開始:サービスプロバイダーが接続を承認すると、VPC1 のアプリケーションは生成されたドメイン名または IP アドレスを介して VPC2 のサービスにアクセスできます。
Proxy Protocol によるアクセス可能な VPC とプライベート IP アドレスの制御
PrivateLink 経由でサービスを提供する場合、サーバーは各リクエストの送信元エンドポイントまたは VPC を識別し、その情報に基づいてセキュリティルールを実装できます。たとえば、正当な VPC からのアクセスのみを受け付けるようにアカウントを制限できます。認証情報が漏えいしても、未承認のネットワークからはサービスにアクセスできません。
「PrivateLink を使用した同一ゾーン内の VPC 間アクセス」を前提に、サーバー側アプリケーションで送信元 VPC を識別し、アクセス制御を実装できます。
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
034 バイト
00040764b56b
0764b56b
TLV2
Type e1 (カスタムタイプ)
e124 バイト
0018PrivateLink エンドポイント ID:
ep-bp1i288487e586152d4b
0265702d6270316932383834383765353836313532643462
TLV3
Type e1 (カスタムタイプ)
e1
26 バイト
001a
VPC ID:
vpc-bp179qeke0wzo1mr8bxhl
017670632d627031373971656b6530777a6f316d72386278686c
TLV4
04(PP2_TYPE_NETNS)、ネットワーク名前空間の転送に使用04
6 バイト
0006000000000000000000000000Web サービスで 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 アクセスをサポートしています。これにより、プライベートネットワークからのアクセスを許可するアカウントを設定することで、パブリックネットワークのセキュリティリスクを回避できます。
個人アカウントはデータ漏えいのリスクになります。エンタープライズアカウントを設定し、正当なプライベートネットワークからのアクセスのみを許可することで、認証情報が侵害された場合でも悪用されるのを防ぎます。
脅威シナリオ
Alibaba Cloud サービス用のエンドポイントの作成:PrivateLink コンソールで、OSS など、アクセスが必要な Alibaba Cloud サービスのゲートウェイエンドポイントを作成し、企業の VPC とルートテーブルに関連付けます。
エンドポイントアクセスポリシーの構成:企業の Alibaba Cloud アカウントに属する RAM ID (ユーザーやロールなど) にアクセスを制限します。これにより、従業員の個人アカウントなど、他のアカウントがこのプライベート経路を通じて OSS にアクセスするのを防ぐことができます。
RAM ポリシーの構成 (任意):よりきめ細かい制御を行うために、RAM ユーザーまたはロール向けの RAM ポリシーを設定し、OSS へのアクセスが特定の VPC から発信されるように強制します。
コンプライアンス機能
VPC から Alibaba Cloud のパブリック IP アドレスへのアクセスの確認
VPC フローログを分析し、PrivateLink で最適化できる、VPC から Alibaba Cloud のパブリック IP アドレスへのアウトバウンドトラフィックを特定します。
手順:
VPC フローログの有効化:主要な業務が稼働している VPC のフローログを有効にし、ログを Simple Log Service (SLS) に配信します。
アウトバウンドトラフィックの分析:SLS コンソールで VPC フローログをクエリし、
direction = outでアウトバウンドトラフィックをフィルタリングします。フィルタリングと特定:
レスポンスパケットのフィルタリング:宛先ポートが 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 で最適化できます。