PrivateLink は、VPC と Alibaba Cloud OSS の間にセキュアでプライベートな接続を確立します。これにより、ネットワーク層でのトラフィック分離が実現され、データセキュリティリスクの軽減、ネットワークアドレス競合の解決、および運用上の複雑さの軽減を通じて、セキュアで制御可能なクラウドストレージアクセスアーキテクチャの構築を支援します。
仕組み
PrivateLink は、VPC 内に専用のプライベートエンドポイントを作成することで、Alibaba Cloud OSS への接続を確立します。これにより、すべてのアクセストラフィックは Alibaba Cloud バックボーンネットワーク内に留まり、パブリックインターネットを経由しません。また、ソース IP ベースの精密なアクセス制御と監査用の VPC フローログを提供し、エンタープライズグレードのデータセキュリティフレームワークを構築します。OSS が提供するデフォルトの内部ドメイン名と比較して、PrivateLink はより高いレベルのネイティブなネットワークセキュリティ分離ときめ細かな制御を提供し、以下のビジネスシナリオに適しています。
ビジネスシナリオ | 内部ドメイン名 | PrivateLink |
厳格なセキュリティとコンプライアンス要件 | パブリックサービスエントリポイントを介してアクセスするため、すべての VPC に対して攻撃対象領域が露出します。セキュリティは主にアプリケーション層のポリシーに依存します。 | 攻撃対象領域を削減します。エントリポイントは VPC 内部にあるため、他の VPC からは検出もアクセスもできません。トラフィックはネットワーク層でネイティブに分離されます。 |
ネットワーク層での細かいアクセス制御の必要性 | セキュリティグループを使用して OSS へのアクセスを制御することはできません。バケットポリシーに依存するのみです。 | セキュリティグループのバインドをサポートします。PrivateLink エンドポイントにセキュリティグループルールを設定することで、どのソース IP が OSS にアクセスできるかを精密に制御できます。 |
すべてのネットワーク接続試行を監査する必要性 | OSS アクセスログは成功したリクエストのみを記録します。拒否されたネットワーク層の接続試行を監査することはできません。 | VPC フローログをサポートします。成否にかかわらず、エンドポイントへのアクセスを試みるすべてのトラフィックをキャプチャして監査できます。 |
IP 競合の可能性がある複雑なハイブリッドクラウドネットワークアーキテクチャ | クラウドサービスはデフォルトで 100.64.0.0/10 CIDR ブロックを使用するため、オンプレミスデータセンターのネットワーク計画と競合する可能性があります。 | IP 競合を回避します。エンドポイントは VPC の CIDR ブロックから IP アドレスを使用するため、カスタム IP 計画に完全に準拠し、ハイブリッドクラウドルーティングを簡素化します。 |
サポートされているリージョン
中国 (杭州)、中国 (上海)、中国 (青島)、中国 (北京)、中国 (張家口)、中国 (ウランチャブ)、中国 (深セン)、中国 (河源)、中国 (広州)、中国 (成都)、香港 (中国)、日本 (東京)、韓国 (ソウル)、シンガポール、インドネシア (ジャカルタ)、タイ (バンコク)、ドイツ (フランクフルト)、米国 (シリコンバレー)、米国 (バージニア)、英国 (ロンドン)。
PrivateLink の設定と使用
エンドポイントを作成して PrivateLink を介したプライベート接続を確立し、VPC またはオンプレミスデータセンターから OSS リソースへのセキュアなアクセスを実現します。
エンドポイントの作成と検証
まず、エンドポイントを作成して VPC と OSS の間にセキュアでプライベートな接続を確立します。エンドポイント作成後、ECS インスタンスを使用してネットワーク接続を検証し、OSS にアクセスできることを確認し、設定が正しいことを検証します。
開始する前に、VPC と vSwitch を作成していることを確認してください。検証手順には ECS インスタンスが必要です。既存のインスタンスがない場合は、「ECS インスタンスの購入」を参照して従量課金インスタンスを作成してください。
ステップ 1: エンドポイントの作成
VPC エンドポイント ページに移動し、エンドポイントの作成 をクリックします。このサービスを初めて使用する場合は、画面の指示に従って PrivateLink サービスを有効化してください。
以下のパラメータを設定し、記載されていないオプションはデフォルト値のままにします。
[リージョン]:ターゲット OSS バケットが配置されているリージョンを選択します。たとえば、中国 (杭州) です。
[エンドポイント名]:
privatelink-ossのように、エンドポイントのわかりやすい名前を入力します。[エンドポイントタイプ]: [インターフェイスエンドポイント] を選択します。
[エンドポイントサービス]: Alibaba Cloud サービス を選択し、リストから OSS エンドポイントサービス (名前の末尾が
ossのエントリ) を選択します。[VPC]:エンドポイントを作成するターゲット VPC を選択します。 利用可能な VPC がない場合は、VPC の作成をクリックして新しい VPC を作成します。
[セキュリティグループ]:アクセス許可を制御するために、エンドポイントにバインドするセキュリティグループを選択します。適切なセキュリティグループがない場合は、セキュリティグループの作成をクリックして作成します。
[ゾーンと vSwitch]: エンドポイントをデプロイするアベイラビリティゾーンと対応する vSwitch を選択します。 利用可能な vSwitch がない場合は、作成 をクリックして新規作成します。
OK をクリックすると、システムによってエンドポイントが自動的に作成されます。作成後、エンドポイント詳細ページで エンドポイントサービスドメイン名 を表示およびコピーできます。このドメイン名を後続の OSS アクセスに使用します。
エンドポイントサービスのドメイン名は、
ep-<InstanceID>.oss.cn-hangzhou.privatelink.aliyuncs.comの形式です。[エンドポイントサービスのドメイン名] セクションで、[コピー] をクリックして取得します。
ステップ 2: エンドポイントの検証
接続テストとファイルダウンロードを実行して、PrivateLink エンドポイントが正しく設定されていることを確認します。
ネットワーク接続の検証
pingコマンドを使用して、エンドポイントドメイン名へのネットワーク接続をテストし、DNS 解決とネットワークパスが正しいことを確認します。ping -c 4 ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.comファイルダウンロードの検証
同じリージョンの ECS インスタンスから、
ossutilを使用して PrivateLink 接続経由でファイルをダウンロードし、エンドツーエンドでデータ転送が機能することを確認します。ossutil 2.0 のインストールと設定を行います。
OSS リソースにアクセスするには、エンドポイントドメイン名 (例:
ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com) を使用します。 次の例では、example-bucketという名前のバケットからdest.jpgという名前のファイルをダウンロードします。ossutil cp oss://example-bucket/dest.jpg /tmp/ -e ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com --addressing-style pathコマンドが成功すると、ファイルがダウンロードされたことを示す次の出力が表示されます。ダウンロードしたファイルは
/tmpディレクトリで確認できます。Success: Total 1 object, size 134102 B, Download done:(1 files, 134102 B), avg 680.112 KiB/s 0.193189(s) elapsed
VPC アクセスセキュリティの強化
PrivateLink 機能を検証した後、バケットポリシーを設定することでセキュリティをさらに強化できます。以下の例では、PrivateLink エンドポイントに関連付けられた VPC からのリクエストのみを許可するようにアクセスを制限する方法を示します。これにより、ネットワーク層とアプリケーション層の両方でアクセス制御を実装できます。
バケットリストに移動し、対象のバケットをクリックします。
左側のナビゲーションペインで、をクリックします。
新規権限 をクリックし、以下の設定を構成します。その他のパラメーターは、デフォルト設定のままでかまいません。
[ユーザー]: [すべてのアカウント (*)] を選択します。
[許可された操作]:詳細設定 を選択します。
[効果]: 拒否 を選択します。
操作:oss:GetObject を選択します。
[条件]: VPC ≠ を選択し、ドロップダウンリストから PrivateLink エンドポイントにバインドされている VPC を選択します。
OK をクリックして、バケットポリシーの設定を完了します。
SSL-VPN を使用したローカルデバイスの接続
SSL-VPN を使用すると、開発者のワークステーションやモバイルデバイスなどのローカルデバイスが、暗号化されたトンネルを介して VPC に接続できます。デバイスがトンネルを確立すると、設定された PrivateLink エンドポイントを使用して OSS にセキュアにアクセスできます。このアプローチは、リモートワーク、開発およびテスト、緊急アクセスのシナリオに適しています。
ステップ 1: SSL-VPN ゲートウェイの作成とクライアントの設定
SSL-VPN ゲートウェイをデプロイし、クライアント設定を完了し、ローカルデバイスと VPC の間に暗号化された接続を確立します。詳細な設定手順については、「SSL-VPN 接続を使用した PC または Android デバイスの VPC への接続」をご参照ください。
ステップ 2: PrivateLink による OSS アクセスの検証
接続テストとファイルダウンロードを実行して PrivateLink 接続を検証し、プライベートアクセスリンクが機能していることを確認します。
接続の検証
pingコマンドを使用して、エンドポイントドメイン名へのネットワーク接続性をテストし、DNS 解決とネットワークパスが正しいことを確認します。ping -c 4 ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.comファイルダウンロードの検証
ossutil
ossutilを使用してファイル操作を実行し、接続を検証します。ossutil 2.0 のインストールと設定を行います。
エンドポイントドメイン名 (例:
ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com) を使用して OSS リソースにアクセスします。 次の例では、example-bucketという名前のバケットから、dest.jpgという名前のファイルをダウンロードします。ossutil cp oss://example-bucket/dest.jpg /tmp/ -e ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com --addressing-style pathコマンドが正常に実行されると、ファイルがダウンロードされたことを示す次の出力が表示されます。ダウンロードされたファイルは
/tmpディレクトリで確認できます。Success: Total 1 object, size 134102 B, Download done:(1 files, 134102 B), avg 680.112 KiB/s 0.193189(s) elapsed
SDK
SDK を使用すると、より本番環境に近い状況を再現でき、複雑なビジネスロジックの統合と例外処理をサポートします。以下の SDK は、PrivateLink を介した OSS へのアクセスをサポートしています。
Java
PrivateLink 経由で OSS にアクセスする場合は、
setSLDEnabled(true)を呼び出してパス形式のアクセスモードを有効にします。パブリックネットワークアクセスの場合は、setSLDEnabled(false)に設定します。import com.aliyun.oss.*; import com.aliyun.oss.common.auth.*; import com.aliyun.oss.common.comm.SignVersion; import com.aliyun.oss.model.GetObjectRequest; import java.io.File; /** * OSS PrivateLink アクセスの例 * PrivateLink を使用して OSS にアクセスし、ファイルをダウンロードする方法を示します */ public class Test { public static void main(String[] args) throws Exception { // PrivateLink エンドポイントのドメイン名。 String endpoint = "https://ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com"; // エンドポイントに対応するリージョンを指定します (例: cn-hangzhou)。 String region = "cn-hangzhou"; // 環境変数から認証情報を取得します。 // 実行前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数を設定してください。 EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // バケット名を指定します (例: example-bucket)。 String bucketName = "example-bucket"; // オブジェクトの完全なパスを指定します (バケット名は除く)。 String objectName = "dest.jpg"; // ローカルファイル名を指定します。 String pathName = "dest.jpg"; // クライアントパラメータを設定します。 ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); // PrivateLink アクセスの場合、パス形式のアクセスを有効にします。バケットのパブリックドメイン名経由でアクセスする場合は false に設定します。 clientBuilderConfiguration.setSLDEnabled(true); // Signature Version 4 アルゴリズムの使用を明示的に宣言します。 clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); // OSS クライアントインスタンスを作成します。 OSS ossClient = OSSClientBuilder.create() .endpoint(endpoint) .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region(region) .build(); try { // オブジェクトをローカルファイルにダウンロードします。 // 指定したローカルファイルが存在する場合は上書きされ、存在しない場合は新規作成されます。 // ローカルパスを指定しない場合、ダウンロードしたファイルはプロジェクトのルートディレクトリに保存されます。 ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(pathName)); } catch (OSSException oe) { // OSS サーバー側の例外を処理します。 System.out.println("Caught an OSSException, which means your request made it to the OSS server, but was rejected with an error response."); System.out.println("Error Message: " + oe.getErrorMessage()); System.out.println("Error Code: " + oe.getErrorCode()); System.out.println("Request ID: " + oe.getRequestId()); System.out.println("Host ID: " + oe.getHostId()); } catch (ClientException ce) { // クライアント側の例外を処理します。 System.out.println("Caught a ClientException, which means the client encountered a serious internal problem while trying to communicate with OSS, " + "such as not being able to access the network."); System.out.println("Error Message: " + ce.getMessage()); } finally { // リソースを解放します。 if (ossClient != null) { ossClient.shutdown(); } } } }Python
PrivateLink 経由で OSS にアクセスする際は、
is_path_style=Trueを設定してパススタイルのアクセスモードを有効にします。# -*- coding: utf-8 -*- """ OSS PrivateLink アクセスの例 PrivateLink 経由で OSS にアクセスし、ファイルをローカルにダウンロードします。 """ import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider def main(): """メイン関数: PrivateLink 経由で OSS にアクセスし、ファイルをダウンロードする方法を示します。""" # アクセス認証情報を設定します。 # 注意: Alibaba Cloud アカウントの AccessKey にはすべての API 権限があり、リスクが高いです。 # API アクセスや日常的な O&M には、RAM ユーザーの作成と使用を強く推奨します。RAM ユーザーを作成するには、RAM コンソールにログインしてください。 auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) # PrivateLink エンドポイントのドメイン名。 endpoint = 'https://ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com' # バケット名。 bucket_name = 'example-bucket' # Bucket オブジェクトを作成します。 # is_path_style=True を設定すると、パス形式のアクセスモードが有効になり、PrivateLink などのシナリオに適しています。 bucket = oss2.Bucket(auth, endpoint, bucket_name, is_path_style=True) # OSS オブジェクトのパス (バケット名を除く完全なパス)。 object_name = 'dest.jpg' # ファイルを保存するローカルパス。 local_file_path = 'dest.jpg' # オブジェクトをローカルファイルにダウンロードします。 # 指定したローカルファイルが存在する場合は上書きされ、存在しない場合は新規作成されます。 bucket.get_object_to_file(object_name, local_file_path) print(f"File downloaded successfully: {object_name} -> {local_file_path}") if __name__ == '__main__': main()Go
PrivateLink 経由で OSS にアクセスする場合、
ForcePathStyle(true)を使用してパススタイルのアクセスモードを有効にします。package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) const ( // PrivateLink エンドポイントのドメイン名。 endpoint = "https://ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com" // バケット名。 bucketName = "example-bucket" // OSS オブジェクトのパス (バケット名を除く完全なパス)。 objectName = "dest.jpg" // ファイルを保存するローカルパス。 localFilePath = "dest.jpg" ) func main() { // アクセス認証情報プロバイダーを初期化します。 // 環境変数から認証情報を取得します。 // このコード例を実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 provider, err := oss.NewEnvironmentVariableCredentialsProvider() if err != nil { fmt.Printf("Failed to initialize credentials provider: %v\n", err) os.Exit(-1) } // OSS クライアントインスタンスを作成します。 // oss.ForcePathStyle(true) を使用してパス形式のアクセスモードを有効にします。これは PrivateLink などのシナリオに適しています。 client, err := oss.New( endpoint, "", // AccessKeyId は認証情報プロバイダーを通じて取得されます。 "", // AccessKeySecret は認証情報プロバイダーを通じて取得されます。 oss.SetCredentialsProvider(&provider), oss.ForcePathStyle(true), ) if err != nil { fmt.Printf("Failed to create OSS client: %v\n", err) os.Exit(-1) } // Bucket オブジェクトを取得します。 bucket, err := client.Bucket(bucketName) if err != nil { fmt.Printf("Failed to get Bucket object: %v\n", err) os.Exit(-1) } // オブジェクトをローカルファイルにダウンロードします。 // 指定したローカルファイルが存在する場合は上書きされ、存在しない場合は新規作成されます。 // ローカルパスを指定しない場合、ダウンロードしたファイルはプロジェクトのルートディレクトリに保存されます。 err = bucket.GetObjectToFile(objectName, localFilePath) if err != nil { fmt.Printf("Failed to download file: %v\n", err) os.Exit(-1) } fmt.Printf("File downloaded successfully: %s -> %s\n", objectName, localFilePath) }C++
PrivateLink 経由で OSS にアクセスする場合は、
conf.isPathStyle = trueを設定してパススタイルのアクセスモードを有効にします。#include <alibabacloud/oss/OssClient.h> #include <memory> #include <fstream> #include <iostream> using namespace AlibabaCloud::OSS; int main(void) { // PrivateLink エンドポイントのドメイン名。 std::string Endpoint = "https://ep-bp1i****************.oss.cn-hangzhou.privatelink.aliyuncs.com"; // バケット名。 std::string BucketName = "example-bucket"; // OSS オブジェクトのパス (バケット名を含めないでください)。 std::string ObjectName = "dest.jpg"; // ファイルを保存するローカルパス。 // 指定したローカルファイルが存在する場合は上書きされ、存在しない場合は新規作成されます。 // ローカルパスを指定しない場合、ダウンロードしたファイルはプロジェクトのルートディレクトリに保存されます。 std::string FileNametoSave = "dest.jpg"; // OSS SDK リソースを初期化します。 InitializeSdk(); // クライアントパラメータを設定します。 ClientConfiguration conf; // 環境変数から認証情報を取得します。 // このコード例を実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>(); // パス形式のアクセスモードを有効にします。PrivateLink などのシナリオに適しています。 conf.isPathStyle = true; // OSS クライアントインスタンスを作成します。 OssClient client(Endpoint, credentialsProvider, conf); // GetObject リクエストを構築します。 GetObjectRequest request(BucketName, ObjectName); // レスポンスストリームファクトリを設定してローカルファイルストリームを作成します。 request.setResponseStreamFactory([=]() { return std::make_shared<std::fstream>( FileNametoSave, std::ios_base::out | std::ios_base::in | std::ios_base::trunc | std::ios_base::binary ); }); // ダウンロード操作を実行します。 auto outcome = client.GetObject(request); // ダウンロード結果を処理します。 if (outcome.isSuccess()) { std::cout << "File downloaded successfully. Size: " << outcome.result().Metadata().ContentLength() << " bytes" << std::endl; std::cout << "File saved to: " << FileNametoSave << std::endl; } else { // エラーを処理します。 std::cout << "File download failed" << std::endl << "Error code: " << outcome.error().Code() << std::endl << "Error message: " << outcome.error().Message() << std::endl << "Request ID: " << outcome.error().RequestId() << std::endl; // リソースを解放し、エラーコードを返します。 ShutdownSdk(); return -1; } // OSS SDK リソースを解放します。 ShutdownSdk(); return 0; }
Express Connect または VPN によるデータセンターの接続
オンプレミスデータセンターは、Express Connect 回線または VPN ゲートウェイを介して Alibaba Cloud VPC に接続し、PrivateLink を使用してプライベートネットワーク経由で OSS にアクセスできます。Express Connect は安定したネットワークパフォーマンスと保証された帯域幅を提供し、VPN ゲートウェイは柔軟で暗号化された接続を提供します。どちらのソリューションも、本番環境での大規模なデータ転送に適しています。詳細な設定方法については、「VPC をオンプレミスデータセンターまたは別のクラウドに接続する」をご参照ください。
本番環境
ベストプラクティス
セキュリティグループ設定の最適化
最小権限の原則に基づいてセキュリティグループルールを設定します。必要な IP アドレス範囲にのみエンドポイントのアクセスポートを開放し、セキュリティルールを定期的にレビューする仕組みを確立します。ソース IP とポートを精密に制御することで、アクセスポリシーがビジネス要件と一致することを保証し、権限の拡散や不正アクセスを防ぎます。
ネットワーク接続の監視
VPC フローログ機能を有効にし、トラフィックパターンに基づく異常検知メカニズムを確立して、PrivateLink アクセス状況とデータ転送ステータスをリアルタイムで監視します。
マルチ AZ 配置の使用
本番環境では、複数のアベイラビリティーゾーンにエンドポイントをデプロイし、高可用性と耐障害性を備えたアーキテクチャを構築します。負荷分散または DNS ラウンドロビンを使用してトラフィックを分散させます。あるアベイラビリティーゾーンで障害が発生した場合でも、トラフィックは自動的に他の正常なゾーンのエンドポイントに切り替わり、サービスの継続性とビジネスの安定性が確保されます。
課金
PrivateLink は、実際の使用量に基づいて時間単位で課金されます。料金には、インスタンス料金とデータ処理料金が含まれます。サービスユーザーとサービスプロバイダーを異なる Alibaba Cloud アカウントに設定し、料金を指定したアカウントに請求することも可能です。課金の詳細については、「課金の概要」をご参照ください。