このトピックでは、Resource Access Management (RAM) コンソールと SDK を使用して、セキュリティトークンサービス (STS) から一時的なセキュリティトークンを取得し、クロスアカウント認証を実装して Function Compute のリソースを表示する方法について説明します。
シナリオ
A 社は Function Compute を使用しており、B 社に Function Compute リソースを管理してもらう必要があります。A 社には次の要件があります。
A 社は自社の業務システムに集中し、Function Compute リソースのオーナーとしてのみ機能したいと考えています。A 社は、サービスや関数などの特定のリソースを管理する権限を B 社に付与できます。
A 社は、B 社の従業員が入社または退社する際に権限を変更したくありません。B 社は、自社の RAM ユーザーに A 社のリソースにアクセスするための特定の権限を付与できます。
両社間の契約が終了した場合、A 社はいつでも B 社からの権限付与を取り消すことができます。
コンソールの使用
A 社が B 社の従業員に Function Compute のすべてのサービスへのアクセスを承認する必要があるとします。A 社は Alibaba Cloud アカウント A を使用し、B 社は Alibaba Cloud アカウント B を使用します。
アカウント A の ID は
123456789012****で、アカウントエイリアス (エンタープライズエイリアス) はcompany-aです。アカウント B の ID は
134567890123****で、アカウントエイリアス (エンタープライズエイリアス) はcompany-bです。
ステップ 1: アカウント A を使用して RAM ロールを作成する
アカウント A を使用して RAM ロールを作成し、必要な権限を付与します。ロールを作成するときは、[他の Alibaba Cloud アカウント] にアカウント B を選択します。これにより、アカウント B がそのロールを偽装できるようになります。
アカウント A を使用して RAM コンソールにログインします。
左側のナビゲーションウィンドウで、 を選択します。
[ロール] ページで、[ロールの作成] をクリックします。

[ロールの作成] ページで、[プリンシパルタイプ] パラメーターを [クラウドアカウント] に設定し、Alibaba Cloud アカウントを指定してから、[OK] をクリックします。

現在のアカウント: お客様の Alibaba Cloud アカウントに属する RAM ユーザーまたは RAM ロールに RAM ロールを偽装させる場合は、[現在のアカウント] を選択します。
他のアカウント: 別の Alibaba Cloud アカウントに属する RAM ユーザーまたは RAM ロールに RAM ロールを偽装させる場合は、[他のアカウント] を選択し、その Alibaba Cloud アカウントの ID を入力します。このオプションは、異なる Alibaba Cloud アカウントに属するリソースに対する権限を付与するために提供されています。詳細については、「Alibaba Cloud アカウントをまたいでリソースにアクセスする」をご参照ください。Alibaba Cloud アカウントの ID は、[セキュリティ設定] ページで確認できます。
fc-admin ロールの情報を設定します。
[ロール名] を入力します。
[メモ] を入力します。
[他の Alibaba Cloud アカウント] をアカウント B の ID に設定します。
注
Alibaba Cloud アカウントのすべての RAM ユーザーではなく、特定の RAM ユーザーのみにこの RAM ロールの偽装を許可したい場合は、次のいずれかの方法を使用します。
RAM ロールの信頼ポリシーを変更します。詳細については、「RAM ロールの信頼ポリシーを変更する」をご参照ください。
RAM ユーザーにアタッチされているポリシーを変更して、ロールを偽装できるようにします。詳細については、「RAM ロールと STS トークンに関するよくある質問」をご参照ください。
Alibaba Cloud アカウント ID は ページで確認できます。
[完了] をクリックします。
[閉じる] をクリックします。
アカウント A を使用して、新しく作成された RAM ロールに AliyunFCReadOnlyAccess 権限をアタッチします。詳細については、「RAM ロールに権限を付与する」をご参照ください。
RAM ロールが作成されると、ロールの詳細ページでその Alibaba Cloud リソースネーム (ARN) と信頼ポリシーを表示できます。
RAM ロールの ARN は
acs:ram::123456789012****:role/fc-adminです。RAM ロールの信頼ポリシーは次のとおりです。
説明このポリシーは、アカウント B に属する RAM ユーザーのみがこの RAM ロールを偽装できることを示します。
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::134567890123****:root" ] } } ], "Version": "1" }
ステップ 2: アカウント B を使用して RAM ユーザーを作成する
アカウント B を使用して、従業員用の RAM ユーザーを作成します。詳細については、「RAM ユーザーの作成」をご参照ください。
アカウント B を使用して、新しく作成された RAM ユーザーに AliyunSTSAssumeRoleAccess 権限をアタッチします。これにより、RAM ユーザーは RAM ロールを偽装できるようになります。詳細については、「RAM ユーザーに権限を付与する」をご参照ください。
ステップ 3: ログイン ID の切り替え
アカウント B の RAM ユーザーがアカウント A のリソースにアクセスする必要がある場合、その RAM ユーザーはアカウント A の RAM ロールを偽装してリソースにアクセスできます。次のステップを実行します。
アカウント B の RAM ユーザーを使用して RAM コンソールにログインします。
RAM ユーザーがコンソールにログインする方法の詳細については、「RAM ユーザーとして Alibaba Cloud 管理コンソールにログインする」をご参照ください。
右上のプロフィール画像にカーソルを合わせ、[ID の切り替え] をクリックします。
RAM ロールが属する Alibaba Cloud アカウントのエンタープライズエイリアス (アカウントエイリアス)、デフォルトドメイン名、または ID を入力します。詳細については、「デフォルトドメイン名の表示と変更」をご参照ください。
RAM ロールの名前を入力します。詳細については、「RAM ロールに関する情報の表示」をご参照ください。
詳細については、「RAM ロールを偽装する」をご参照ください。
(オプション) 権限付与の取り消し
A 社と B 社の協力関係が終了した場合、A 社はアカウント B が RAM ロールを偽装する権限を取り消すことができます。その後、アカウント B のすべての RAM ユーザーは自動的に RAM ロールを偽装する権限を失います。次のステップを実行します。
アカウント A を使用して RAM コンソールにログインします。
左側のナビゲーションウィンドウで、 を選択します。
[ロール] ページで、ターゲット RAM ロールを見つけ、[アクション] 列の [ロールの削除] をクリックします。
[ロールの削除] ダイアログボックスで、RAM ロール名を入力し、[ロールの削除] をクリックします。
RAM ロールを削除する前に、その権限を削除する必要があります。詳細については、「RAM ロールから権限を削除する」をご参照ください。
SDK の使用
STS を使用して、Function Compute への一時的なアクセスを許可できます。STS は、クラウドコンピューティングユーザーに一時的なアクセストークンを提供する Web サービスです。次の例は、アカウント B がアカウント A のすべてのサービスを表示する権限を取得する方法を示しています。
前提条件
手順
アカウント A を使用して RAM ロールを作成し、信頼できるアカウントとしてアカウント B を選択します。
詳細については、「信頼できる Alibaba Cloud アカウントの RAM ロールを作成する」をご参照ください。
アカウント B を使用して RAM ユーザーを作成し、そのユーザーに RAM ロールを偽装する権限を付与します。
詳細については、「RAM ユーザーの作成」および「RAM ユーザーに権限を付与する」をご参照ください。
アカウント B の関数で、次のサンプルコードを入力して一時的なアクセス資格情報を取得します。詳細については、「STS SDK の概要」および「AssumeRole」をご参照ください。
const Core = require('@alicloud/pop-core'); // リクエストを送信するための Alibaba Cloud クライアントを構築します。 /* Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作に対する権限を持っています。RAM ユーザーを使用して API 操作を呼び出すか、日常の O&M を実行することをお勧めします。 プロジェクトコードに AccessKey ID と AccessKey Secret をハードコーディングしないでください。ハードコーディングすると、AccessKey ペアが漏洩し、すべてのリソースのセキュリティが損なわれる可能性があります。 この例では、環境変数を使用して ID 検証用の AccessKey ペアを保存する方法を示します。 この例を実行する前に、ローカル環境で ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数を設定してください。 Function Compute ランタイム環境では、実行権限を設定すると、ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数が自動的に設定されます。 */ var client = new Core({ accessKeyId: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'], accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'], endpoint: 'https://sts.aliyuncs.com', apiVersion: '2015-04-01' }); // パラメーターを設定します。 var params = { "RegionId": "cn-hangzhou", "RoleArn": "<RoleARN>", "RoleSessionName": "<RoleSessionName>" } var requestOption = { method: 'POST' }; // リクエストを送信し、レスポンスを取得します。 client.request('AssumeRole', params, requestOption).then((result) => { console.log(JSON.stringify(result)); }, (ex) => { console.log(ex); })# -*- coding: utf-8 -*- from alibabacloud_tea_openapi.models import Config from alibabacloud_sts20150401.client import Client from alibabacloud_sts20150401.models import AssumeRoleRequest def main(): # 一時的なトークンを含む、一時的な AccessKey ペアを入力します。 # Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作に対する権限を持っています。RAM ユーザーを使用して API 操作を呼び出すか、日常の O&M を実行することをお勧めします。 # プロジェクトコードに AccessKey ID と AccessKey Secret をハードコーディングしないでください。ハードコーディングすると、AccessKey ペアが漏洩し、すべてのリソースのセキュリティが損なわれる可能性があります。 # この例では、環境変数を使用して ID 検証用の AccessKey ペアを保存する方法を示します。 # この例を実行する前に、ローカル環境で ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数を設定してください。 # Function Compute ランタイム環境では、実行権限を設定すると、ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数が自動的に設定されます。 AccessKeySecret=os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET') AccessKeyId=os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID') regionId ='cn-hangzhou' config = Config( access_key_id='<ACCESS-KEY-ID>', access_key_secret='<ACCESS-KEY-SECRET>', region_id='cn-hangzhou' ) client = Client(config) assume_role_request = AssumeRoleRequest( duration_seconds=3600, role_arn='<RoleARN>', role_session_name='fc-python-sdk' ) response = client.assume_role(assume_role_request) response_json = json.loads(str(response.body).replace("'", "\"")) result = json.dumps(response_json) print(result) if __name__ == "__main__": main()期待される出力。
{ "RequestId": "964E0EC5-575B-4FF5-8FD0-D4BD8025602A", "AssumedRoleUser": { "Arn": "acs:ram::****:role/wss/wss", "AssumedRoleId": "***********:wss" }, "Credentials": { "SecurityToken": "*************", "AccessKeyId": "STS.*************", "AccessKeySecret": "*************", "Expiration": "2023-05-28T11:23:19Z" } }説明SecurityTokenの取得に関するよくある質問への回答については、「RAM ロールと STS トークンに関するよくある質問」をご参照ください。アカウント B の関数コードを変更して、その RAM ユーザーに Function Compute 内のアカウント A のすべてのサービスを表示する権限を付与します。
サンプルコード:
const FC = require('@alicloud/fc2'); // クライアントを構築します。 // キー情報を取得した一時キー情報に設定します。 /* Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作に対する権限を持っています。RAM ユーザーを使用して API 操作を呼び出すか、日常の O&M を実行することをお勧めします。 プロジェクトコードに AccessKey ID と AccessKey Secret をハードコーディングしないでください。ハードコーディングすると、AccessKey ペアが漏洩し、すべてのリソースのセキュリティが損なわれる可能性があります。 この例では、環境変数を使用して ID 検証用の AccessKey ペアを保存する方法を示します。 この例を実行する前に、ローカル環境で ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET、および ALIBABA_CLOUD_SECURITY_TOKEN 環境変数を設定してください。 Function Compute ランタイム環境では、実行権限を設定すると、ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET、および ALIBABA_CLOUD_SECURITY_TOKEN 環境変数が自動的に設定されます。 */ const client = new FC('<accountID>', { region: '<yourRegionID>', accessKeyID: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'], securityToken: process.env['ALIBABA_CLOUD_SECURITY_TOKEN'], accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'], }); // サービスのリストを取得します。 client.listServices().then(res => { console.log(JSON.stringify(res, null, ' ')) }).catch(ex=> console.log(ex))重要アカウント A によって作成されたロール (一時キーによって承認されたロール) が、サービスのリストを取得する権限を持っていることを確認してください。