STS (Security Token Service) では、RAM (Resource Access Management) よりも厳格な権限管理を行うことができます。 STS を使用してリソースアクセス制御を実装するには、複雑な権限付与プロセスを伴います。STS を使うと、RAM ユーザーに、リソースへの一時的なアクセス権を与えることができます。

RAM ユーザーならびに、RAM ユーザーに付与された権限は長期的に有効です。 RAM ユーザーを手動で削除するか、RAM ユーザーのアクセス権限を無効にする必要があります。 もし RAM ユーザーのアカウント情報が漏洩した場合、そのユーザー情報や関連するアクセス権の削除に時間がかかってしまうと、お客様の Alibaba Cloud リソースや重要な情報が侵害されかねません。 そのため、主要な権限や長期的に有効である必要のない権限を管理する際には STS の使用を推奨します。

図 1. RAM ユーザーに一時的な権限を付与するプロセス


ステップ 1: ロールの作成

ロールは、一連の権限を持った仮想ユーザーを表す仮想エンティティです。

  1. RAM コンソール』にログインします。
  2. [ロール] の[ロールの作成] を選択して、 ロールを作成します。
  3. [ユーザーロール] を選択します。
  4. [デフォルトのアカウント情報を使用] をオンにし、[次へ] をクリックします。
  5. [ロール名] と [説明] を入力し、[作成] をクリックします。
  6. [閉じる] または [許可] をクリックします。

    このロールに適用する権限付与ポリシーを既に作成している場合は、[許可] をクリックしてこのユーザーに権限を付与します。

    まだ権限付与ポリシーを作成していない場合は、[閉じる] をクリックします。 [ポリシー] をクリックすると、このロールに適用する権限付与ポリシーを作成できます。

ステップ 2: 権限付与ポリシーの作成

権限付与ポリシーは、ロールに付与するリソースアクセス権限を定義します。

  1. RAM コンソール』で [ポリシー] の [権限付与ポリシーの作成] をクリックします。
  2. 空白のテンプレートを選択します。
  3. 権限付与ポリシー名とポリシーの内容を設定し、[権限付与ポリシーの作成] をクリックします。

    ポリシーの内容の書き方について詳しく知りたい場合は、[権限付与ポリシーの形式] をクリックします。

    権限付与ポリシーの例 : IoT リソースに対する読み取り権限

    
    {
    "Version": "1",
    "Statement": [
    {
    "Action": [
    "rds:DescribeDBInstances",
    "rds:DescribeDatabases",
    "rds:DescribeAccounts",
    "rds:DescribeDBInstanceNetInfo"
    ],
    "Resource": "*",
    "Effect": "Allow"
    },
    {
    "Action": "ram:ListRoles",
    "Effect": "Allow",
    "Resource": "*"
    },
    {
    "Action":[
    "mns:ListTopic"
    ],
    "Resource": "*",
    "Effect": "Allow"
    },
    {
    "Action": [
    "dhs:ListProject",
    "dhs:ListTopic",
    "dhs:GetTopic"
    ],
    "Resource": "*",
    "Effect": "Allow"
    },
    {
    "Action": [
    "ots:ListInstance",
    "ots:ListTable",
    "ots:DescribeTable"
    ],
    "Resource": "*",
    "Effect": "Allow"
    },
    {
    "Action":[
    "log:ListShards",
    "log:ListLogStores",
    "log:ListProject"
    ],
    "Resource": "*",
    "Effect": "Allow"
    },
    {
    "Effect": "Allow",
    "Action": [
    "iot:Query*",
    "iot:List*",
    "iot:Get*",
    "iot:BatchGet*" 
    ],
    "Resource": "*"
    }
    ]
    }

    権限付与ポリシーの例:IoT リソースに対する読み取りと書き込みの権限

    
    {
    "Version": "1",
    "Statement": [
    {
    "Action": [
    "rds:DescribeDBInstances",
    "rds:DescribeDatabases",
    "rds:DescribeAccounts",
    "rds:DescribeDBInstanceNetInfo"
    ],
    "Resource": "*",
    "Effect": "Allow"
    },
    {
    "Action": "ram:ListRoles",
    "Effect": "Allow",
    "Resource": "*"
    },
    {
    "Action":[
    "mns:ListTopic"
    ],
    "Resource": "*",
    "Effect": "Allow"
    },
    {
    "Action": [
    "dhs:ListProject",
    "dhs:ListTopic",
    "dhs:GetTopic"
    ],
    "Resource": "*",
    "Effect": "Allow"
    },
    {
    "Action": [
    "ots:ListInstance",
    "ots:ListTable",
    "ots:DescribeTable"
    ],
    "Resource": "*",
    "Effect": "Allow"
    },
    {
    "Action":[
    "log:ListShards",
    "log:ListLogStores",
    "log:ListProject"
    ],
    "Resource": "*",
    "Effect": "Allow"
    },
    {
    "Effect": "Allow",
    "Action": "iot:*",
    "Resource": "*"
    }
    ]
    }

権限付与ポリシーが作成できたら、そのポリシーに定義されている権限をロールに付与することができます。

ステップ 3: ロールに権限を付与

ロールは、権限を付与されて初めてリソースへのアクセス権を持ちます。

  1. RAM コンソール』内で、[ロール] をクリックします。
  2. 権限を付与したいロールを選択し、[許可] をクリックします。
  3. 表示されたダイアログボックスで、指定したロールに付与したいカスタム権限付与ポリシーを選択します。中央の右矢印をクリックして選択した権限付与ポリシーを [選択された権限付与ポリシー名] リストに移動させ、[OK] をクリックします。

権限付与が完了すると、ロールは選択した権限付与ポリシーに定義されたアクセス権を持つようになります。 [管理] をクリックして [ロールの詳細] ページを開くと、そのロールの基本情報や付与されているアクセス権限を表示できます。

次に、RAM ユーザーにロールの権限を付与する必要があります。

ステップ 4: RAM ユーザーにロールの権限を付与

権限付与の完了後、ロールは権限付与ポリシーで定義されたアクセス権を持ちます。 しかし、ロールは仮想ユーザーにすぎません。 許可された操作を実行するには、RAM ユーザーにそのロールを適用する必要があります。 もしすべての RAM ユーザーにそのロールが適用された場合、セキュリティ上のリスクが発生します。 そのロールを適用してアクセス権を与えるのは、特定の RAM ユーザーのみにすべきです。

RAM ユーザーにこのロールを適用してアクセス権を与えるには、"Resource" パラメーターにこのロールの ID が設定されているカスタム権限付与ポリシーを作成する必要があります。 その後、その権限付与ポリシーを RAM ユーザーに適用して権限を付与することができます。

  1. RAM コンソール』内で、[ポリシー] > [権限付与ポリシーの作成] の順にクリックします。
  2. 空白のテンプレートを選択します。
  3. 権限付与ポリシー名とポリシーの内容を入力し、[権限付与ポリシーの作成] をクリックします。
    ポリシーの内容で、"リソース" パラメーターの値をロールの ARN (Alibaba Cloud resource name) にします。 [ロール] ページで指定したいロールを見つけます。[管理] をクリックして [ロールの詳細] ページを開くと、ロールの ARN を確認できます 。

    権限付与ポリシーの例

    
    {
    "Version": "1",
    "Statement": [
    {
    "Effect": "Allow",
    "Action": "iot:QueryProduct",
    "Resource": "Role Arn"
    }
    ]
    }
  4. 権限付与ポリシーが作成できたら、[RAM コンソール] のトップページを開きます。
  5. 左側のメニューで [ユーザー] をクリックし、[RAM ユーザー管理] ページを開きます。
  6. 権限を付与したい RAM ユーザーを選択し、[許可] をクリックします。
  7. 表示されたダイアログボックスで、先ほど作成した権限付与ポリシーを選択します。中央の右矢印をクリックしてその権限付与ポリシーを [選択された権限付与ポリシー名] リストに移動させ、[OK] をクリックします。

権限付与が完了すると、RAM ユーザーはこのロールへのアクセス権を持つことになります。 そして、STS を使ってリソースにアクセスするための一時的な認証情報を取得します。

ステップ 5: RAM ユーザーの一時的な認証情報の取得

許可された RAM ユーザーは、STS API の呼び出しや STS SDK の使用によって、ロールを適用した一時的な認証情報を取得することができます。 一時的な認証情報には、 AccessKeyId、AccessKeySecret、SecurityToken があります。 STS API および STS SDK についての詳細は、「API リファレンス (STS)」、「SDK リファレンス(STS)」をご参照ください。

STS の API や SDK を使って一時的な認証情報を取得する際には、次のパラメーターを指定する必要があります。

  • RoleArn: RAM ユーザーに適用するロールの ARN。
  • RoleSessionName: 一時的な認証情報の名前。 これはカスタムパラメーターです。
  • Policy: 権限付与ポリシー。 このパラメーターは、ロールの権限に制約を追加します。 このパラメーターを使って、トークンの権限を制限することができます。 このパラメーターを指定しないと、指定したロールの全ての権限を持つトークンが生成されます。
  • DurationSeconds: 一時的認証情報の有効期間。 このパラメーターは、秒で表されます。 既定値は 3,600 で、900 から 3,600 の間で指定できます。
  • id と secret: RAM ユーザーの AccessKeyId と AccessKeySecret。

一時的な認証情報を取得する例

API の例: RAM ユーザーは、ロールを適用した認証情報を取得するため、STS API の AssumeRole を呼び出します。





https://sts.aliyuncs.com?Action=AssumeRole
&RoleArn=acs:ram::1234567890123456:role/iotstsrole
&RoleSessionName=iotreadonlyrole
&DurationSeconds=3600
&Policy=<url_encoded_policy>
&<Common request parameters>

SDK の例: RAM ユーザーは、STS 用の Python CLI インターフェイスを介して一時的な認証情報を取得します。

$python ./sts.py AssumeRole RoleArn=acs:ram::1234567890123456:role/iotstsrole RoleSessionName=iotreadonlyrole Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":"iot:*","Resource":"*"}]}' DurationSeconds=3600 --id=id --secret=secret

リクエストが受信されると、ロールを適用した一時的な認証情報が返されます。 認証情報には、AccessKeyId、AccessKeySecret、SecurityToken があります。

ステップ 6: RAM ユーザーによるリソースへのアクセス

一時的な認証情報を取得すると、RAM ユーザーは特定のロールを適用した認証情報を SDK のリクエストに含めて送ることができます。

Java SDK の例: RAM ユーザーは、一時的な認証情報に含まれる AccessKeyId、AccessKeySecret、SecurityToken の各パラメーターをリクエストに含めて渡し、IAcsClient オブジェクトを作成します。

IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", AccessKeyId,AccessSecret);
RpcAcsRequest request.putQueryParameter("SecurityToken", Token);
IAcsClient client = new DefaultAcsClient(profile);
AcsResponse response = client.getAcsResponse(request);