背景情報
RAM コンソールで、または API オペレーションを呼び出すことで Resource Access Management (RAM) ユーザーに権限を付与すると、権限はすぐに有効になります。 この方法では、頻繁に権限を付与したり権限を付与したりする必要があるシナリオでは、セキュリティを確保できません。 このトピックでは、CloudOps Orchestration Service (OOS) によって提供される次の 2 つのテンプレートを使用してセキュリティを確保できる、効率的な承認と許可のメカニズムについて説明します: ACS-RAM-ApproveAttachPolicyToUser および ACS-RAM-ApproveAttachCustomPolicyToUser。 これら 2 つのテンプレートを使用して、お客様のシナリオに適用できるテンプレートを作成できます。 この方法では、企業の一般ユーザーは、実行を作成することで権限を申請できます。 その後、企業の権限管理者は承認通知を受け取ります。 権限管理者がリクエストを承認すると、実行を作成した一般ユーザーにリクエストされた権限が付与されます。
前提条件
権限管理者ロールを引き受ける RAM ユーザーが作成されます。 AliyunRAMFullAccess承認者RAM ユーザーを作成するRAM ユーザーに権限を付与する ポリシーが RAM ユーザーにアタッチされます。 RAM ユーザーの名前は、 変数の値として使用されます。 このような RAM ユーザーがない場合は、RAM ユーザーを作成し、必要な権限を RAM ユーザーに付与できます。 詳細については、「」および「」をご参照ください。
権限申請者ロールを引き受ける RAM ユーザーが作成されます。 RAM ユーザーには、OOS 実行を管理するための権限が付与されます。 詳細については、「RAM ユーザーの作成」および「アクセス制御」をご参照ください。
RAM ポリシーを使用できます。RAM コンソールの [ポリシー] ページで、システムポリシーとカスタムポリシーをクエリできます。既存のポリシーが要件を満たしていない場合は、カスタムポリシーを作成できます。詳細については、この Topic のカスタムポリシーの作成とアタッチセクションをご参照ください。
権限管理者は DingTalk グループに参加しており、DingTalk グループの Webhook URL が取得されています。 この方法では、一般ユーザーが権限を申請すると、OOS は Webhook URL に承認通知を送信して、権限管理者にリクエストのレビューを通知します。 Webhook URL の取得方法の詳細については、「DingTalk を使用して OOS タスクを承認する」をご参照ください。 Webhook URL を取得したら、後で使用するために保存します。 Webhook URL の例: https://oapi.dingtalk.com/robot/send?access_token=1234zxcvbnm67890.
手順
このセクションでは、参考のために 2 つのテンプレートについて説明します。 1 つのテンプレートは、システムポリシーまたはカスタムポリシーなどの既存のポリシーをアタッチする場合のシナリオで使用されます。 もう 1 つのテンプレートは、カスタムポリシーを作成し、作成したカスタムポリシーをアタッチする場合のシナリオで使用されます。
既存のポリシーのアタッチ
次の手順には、3 つのステージと 2 つのロールが含まれます。(1) 権限管理者がテンプレートを設定する。 (2) 権限申請者が権限を申請する。 (3) 権限管理者がリクエストをレビューする。
権限管理者: テンプレートの設定
OOS コンソール にログオンします。
正しいリージョンが選択されていることを確認します。
権限申請者が実行を作成し、承認情報が不適切に変更されないように保護するために、次の操作を実行します。 実際の状況に基づいてパブリックテンプレートを変更してテンプレートの承認管理パラメーターを設定し、テンプレートから不要なパラメーター定義を削除してから、カスタムテンプレート ページでテンプレートを作成します。 次の手順では、承認情報をテンプレートに固定する方法について説明します。
左側のナビゲーションウィンドウで、自動タスク > パブリックテンプレート を選択します。
パブリックテンプレート ページで、ACS-RAM-ApproveAttachPolicyToUser テンプレートを見つけ、テンプレートをクリックしてテンプレートの詳細ページに移動します。
テンプレートの詳細ページで、YAML
タブをクリックします。
テンプレートの approveAttachPolicy タスクのパラメーターを変更します。 次の図の赤枠で囲まれたパラメーターの値を固定値に変更します。
承認者 パラメーターは、Alibaba Cloud での権限管理者のアカウント名を指定します。
'{{approvers}}'
変数を、['zhangsan']
などの権限管理者のアカウント名に置き換えます。MinRequiredApprovals パラメーターは、リクエストの承認に必要な権限管理者の最小数を指定します。
'{{minRequiredApprovals}}'
変数を、リクエストの承認に必要な権限管理者の最小数(1
など)に置き換えます。URI パラメーターは、承認通知の送信先となる DingTalk グループの Webhook URL を指定します。
'{{webhookUrl}}'
変数は、取得した Webhook URL('https://oapi.dingtalk.com/robot/send?access_token=1234zxcvaksdq31414'
など)に置き換えます。atMobiles パラメーターは、承認通知の送信時に DingTalk グループで通知されるユーザーを指定します。
['{{atMobiles}}']
変数は、権限管理者が DingTalk アカウントの登録に使用するモバイル番号 (例:['1390000****']
) に置き換えます。isAtAll パラメーターは、承認通知の送信時に DingTalk グループのすべてのユーザーに通知するかどうかを指定します。
'{{atAll}}'
変数は、ビジネス要件に基づいてfalse
またはtrue
(例:false
) に置き換えます。
8. 次のコードは、テンプレートの approveAttachPolicy タスクのパラメーターを変更した後のタスクスクリプトの例を示しています。
Tasks:
- Name: approveAttachPolicy
Action: 'ACS::Approve'
Description:
en: Approve task add policy.
Properties:
Approvers: ['zhangsan']
MinRequiredApprovals: 1
NotifyType: WebHook
WebHook:
URI: 'https://oapi.dingtalk.com/robot/send?access_token=1234zxcvaksdq31414'
Headers:
Content-Type: application/json
Content:
msgtype: text
text:
content: |
Notice: Please approve the task execution to attach {{policyType}} policy {{policyName}}
for target user {{ACS::ExecuteUser}}.
sent by {{ACS::RegionId}} oos {{ACS::ExecutionId}}.
at:
atMobiles: ['1390000****']
isAtAll: false # 実際の状況に応じてこのパラメーターを変更します。
テンプレートから不要なパラメーター定義を削除します。 次の図は、このようなパラメーター定義の例を示しています。
次のサンプルコードは、変更後のテンプレートの完全な YAML スクリプトの例を示しています。
FormatVersion: OOS-2019-06-01
Description:
en: Attach policy to user that template executed by after approving.
name-en: ACS-RAM-ApproveAttachPolicyToUser
categories:
- security
Parameters:
policyType:
Description:
en: 'The policy type to add,the optioanl is Custom or System.'
Type: String
AllowedValues:
- Custom
- System
policyName:
Description:
en: The policy to add.
Type: String
OOSAssumeRole:
Description:
en: The RAM role to be assumed by OOS.
Type: String
Default: OOSServiceRole
RamRole: '{{ OOSAssumeRole }}'
Tasks:
- Name: approveAttachPolicy
Action: 'ACS::Approve'
Description:
en: Approve task add policy.
Properties:
Approvers: ['zhangsan']
MinRequiredApprovals: 1
NotifyType: WebHook
WebHook:
URI: 'https://oapi.dingtalk.com/robot/send?access_token=1234zxcvaksdq31414'
Headers:
Content-Type: application/json
Content:
msgtype: text
text:
content: |
Notice: Please approve the task execution to attach {{policyType}} policy {{policyName}}
for target user {{ACS::ExecuteUser}}.
sent by {{ACS::RegionId}} oos {{ACS::ExecutionId}}.
at:
atMobiles: ['1390000****']
isAtAll: false # ビジネス要件に基づいてこのパラメーターを変更します。
- Name: checkPolicyExist
Action: 'ACS::CheckFor'
Description:
en: Check for the existence of policy.
Properties:
Service: RAM
API: GetPolicy
Parameters:
PolicyType: '{{ policyType }}'
PolicyName: '{{ policyName }}'
DesiredValues:
- 'true'
PropertySelector: .DefaultPolicyVersion != null|tostring
Outputs:
policyDocumentToAttach:
Type: Json
ValueSelector: .DefaultPolicyVersion.PolicyDocument
- Name: createStack
Action: 'ACS::Template'
Description:
en: Attach policy by Ros resource stack.
Properties:
TemplateName: 'ACS::ROS::CreateStack'
Parameters:
stackName: 'OOS-{{ACS::ExecutionId}}'
disableRollback: true
parameters:
- ParameterKey: PolicyType
ParameterValue: '{{ policyType }}'
- ParameterKey: UserName
ParameterValue: '{{ACS::ExecuteUser}}'
- ParameterKey: PolicyName
ParameterValue: '{{ policyName }}'
templateBody: |
{
"Parameters": {
"PolicyType": {
"Type": "String",
"Description": "Authorization policy type. Value: \"System\" or \"Custom\"."
},
"UserName": {
"Type": "String",
"Description": "User name."
},
"PolicyName": {
"Type": "String",
"Description": "Authorization policy name."
}
},
"ROSTemplateFormatVersion": "2015-09-01",
"Outputs": {},
"Resources": {
"AttachPolicyToUser": {
"Type": "ALIYUN::RAM::AttachPolicyToUser",
"Properties": {
"PolicyType": {
"Ref": "PolicyType"
},
"UserName": {
"Ref": "UserName"
},
"PolicyName": {
"Ref": "PolicyName"
}
}
}
}
}
Outputs:
stackId:
Type: String
ValueSelector: stackId
Outputs:
statement:
Type: Json
Value: '{{ checkPolicyExist.policyDocumentToAttach }}'
stackId:
Type: String
Value: '{{createStack.stackId}}'
テンプレートを変更したら、テンプレート名を入力します。
この例では、copy-ACS-RAM-ApproveAttachPolicyToUser が使用されています。
テンプレートの作成 をクリックします。
権限申請者: 権限の申請
OOS コンソール にログオンします。
正しいリージョンが選択されていることを確認します。
左側のナビゲーションウィンドウで、自動タスク > カスタムテンプレート を選択します。 カスタムテンプレート ページで、copy-ACS-RAM-ApproveAttachPolicyToUser テンプレートを見つけ、カスタム テンプレート実行の作成 列の をクリックします。
[タスクの作成] ページで、[基本情報] ステップの必須パラメーターを構成します。次に、[次のステップ: パラメーター設定] をクリックします。[パラメーター設定] ステップで、[PolicyType] パラメーターと [PolicyName] パラメーターを、適用するポリシーのタイプと名前に設定します。
この例では、システムポリシー AliyunECSReadOnlyAccess が使用されています。
[次のステップ: OK] をクリックします。
[作成] をクリックします。実行を作成すると、指定された DingTalk グループに承認通知が送信され、権限管理者にリクエストのレビューが通知されます。リクエストが承認されると、リクエストされた権限がすぐに付与されます。
権限管理者: リクエストのレビュー
権限申請者が実行を作成すると、指定された DingTalk グループで承認通知を受け取ることができます。
リクエストをレビューするには、承認通知のリンクをクリックします。 表示されるページで、プロンプトに従ってリクエストを承認します。
実行の詳細 ページで、承認タスクの詳細を表示します。 タスクが成功すると、実行を作成した RAM ユーザーにリクエストされた権限が付与されます。
カスタムポリシーの作成とアタッチ
次の手順には、3 つのステージと 2 つのロールが含まれます。(1) 権限管理者がテンプレートを設定する。 (2) 権限申請者が権限を申請する。 (3) 権限管理者がリクエストをレビューする。
権限管理者: テンプレートの設定
OOS コンソール にログオンします。
正しいリージョンが選択されていることを確認します。
権限申請者が実行を作成し、承認情報が不適切に変更されないように保護するために、パブリックテンプレートを変更し、承認情報をテンプレートに固定できます。 この例では、
ACS-RAM-ApproveAttachCustomPolicyToUser
テンプレートが変更されます。 詳細については、このトピックの「既存のポリシーのアタッチ」セクションをご参照ください。ACS-RAM-ApproveAttachCustomPolicyToUser
テンプレートに基づいてテンプレートを作成します。 この例では、作成されたテンプレートの名前は copy-ACS-RAM-ApproveAttachCustomPolicyToUser です。
権限申請者: 権限の申請
OOS コンソール にログオンします。
正しいリージョンが選択されていることを確認します。
左側のナビゲーションウィンドウで、自動タスク > カスタムテンプレート を選択します。 カスタムテンプレート ページで、copy-ACS-RAM-ApproveAttachCustomPolicyToUser テンプレートを見つけ、カスタム テンプレート実行の作成 列の をクリックします。
[タスクの作成] ページで、[基本情報] ステップの必須パラメーターを構成します。次に、[次のステップ : パラメーター設定] をクリックします。[パラメーター設定] ステップで、PolicyDocument パラメーターと PolicyName パラメーターを、作成およびリクエストするカスタムポリシーの JSON スクリプトと名前に設定します。
この例では、PolicyDocument フィールドに次の JSON スクリプトを入力します。これは、Elastic Compute Service (ECS) インスタンスに対する読み取り専用権限を示しています。ポリシースクリプトの記述方法の詳細については、「ポリシーの構造と構文」をご参照ください。
{
"Version": "1",
"Statement": [
{
"Action": "ecs:Describe*",
"Resource": "*",
"Effect": "Allow"
},
{
"Action": "ecs:List*",
"Resource": "*",
"Effect": "Allow"
},
{
"Action": [
"vpc:DescribeVpcs",
"vpc:DescribeVSwitches"
],
"Resource": "*",
"Effect": "Allow"
}
]
}
[次のステップ: OK] をクリックします。
[作成] をクリックします。実行を作成すると、指定された DingTalk グループに承認通知が送信され、権限管理者にリクエストのレビューが通知されます。リクエストが承認されると、リクエストされた権限がすぐに付与されます。
権限管理者: リクエストのレビュー
権限申請者が実行を作成すると、指定された DingTalk グループで承認通知を受け取ることができます。
リクエストをレビューするには、承認通知のリンクをクリックします。 表示されるページで、プロンプトに従ってリクエストを承認します。
実行の詳細 ページで、承認タスクの詳細を表示します。 タスクが成功すると、実行を作成した RAM ユーザーにリクエストされた権限が付与されます。
まとめ
このトピックでは、テンプレートを使用して信頼できる安全な方法で権限を付与する方法について説明しました。 カスタムポリシーを作成し、作成したカスタムポリシーをアタッチする場合は、ACS-RAM-ApproveAttachCustomPolicyToUser テンプレートに基づいてテンプレートを作成できます。 この方法では、他のユーザーは実行を作成することで権限を申請できます。 これにより、コンソールで複雑な操作を実行する必要がなく、カスタムポリシーの作成とアタッチのプロセスが簡素化されます。