ROSでRAMユーザを作り、ポリシーを割り当てたい


寺尾です。

ROSは、Alibaba Cloudで構築の自動化を行うプロダクト、RAMは、AWSのIAMと同じで認証と認可を行うプロダクトです。

ROSでRAMユーザーを作って、ポリシーを割り当てたいんですが、案外サンプルが少なくて、ユーザまでは作れるのですが、ポリシーの割り宛てに苦労しました。

ようやくできたので、何方かの助けになればと思い、残しておきます。

1つ残念なのはシステムポリシーをそのまま割り当てることは出来ず、カスタムポリシーのみということです。システムポリシーと同一内容のカスタムポリシーを割り当てれば、とりあえずやりたいことは可能です。

結果だけ知りたい方はサンプル記述例までジャンプしてください。

ROSでRAMユーザーを作るSyntax

RAM User 作成のドキュメント はこちらにあります。

ユーザ作成の書式はこんな感じです。

RAMユーザ作成Syntax (JSON)
{
  "Type": "ALIYUN::RAM::User",
  "Properties": {
    "UserName": String,
    "DisplayName": String,
    "Groups": List,
    "LoginProfile": Map,
    "Policies": List,
    "MobilePhone": String
  }
}

だいたい理解できるのですが、 Policies だけが難解でした。

やりたかったこととしては、 AliyunECSFullAccess や、 AliyunOSSFullAccess などといったプリセットされたシステムポリシーを割り当てたかったのですが、残念ながらそれが出来ないようです(たぶん)。

ですので、システムポリシーと同じ内容でカスタムポリシーを書くことになるようです。

ポリシーのSyntax (JSON)
"Policies": [
  {
    "PolicyName": String,
    "PolicyDocument": Map,
    "Description": String
  }
]

ポリシーには、Map形式のPolicyDocumentがありますが、中身が分かりません。探してみるとALIYUN::RAM::ManagedPolicyのページにありました。

"PolicyDocument" : {
    "Version": String,
    "Statement" : [
        {
            "Effect" : String,
            "Action" : List,
            "Resource" : List
        }
    ]
}

RAMポリシーを定義するときに書かないと行けないやつと同じみたいです。では、システムポリシーの内容はどこで分かるんでしょうか?

【RAM】【権限管理】【ポリシー】に移動して、該当のシステムポリシーを検索します。 AliyunOSSFullAccess の場合はこのようになります。

必要なのは、 Statement の中の部分です。ここをコピーすれば良いようです。しかし、コピーしただけではエラーが出るケースがありました。

PolicyDocument のSyntaxを見てみると、ActionResourceListで定義されているので、要素が1つでも配列で囲います。

ここまでそろえばだいたいかけるかと思います。

サンプル記述例 (YAML)

普段からYAMLでROSテンプレートを書いているので、例示もYAMLで書きます。必要な人はJSONに変換してください。

パスワードだけは入力するようにしておきました。
これで、AliyunECSFullAccessと、AliyunOSSFullAccess相当のポリシーを割り当てるユーザーが自動で作れます。

サンプル記述例 (YAML)
Parameters:
  RamUserPassword:
    Type: String
    NoEcho: true
    Description: RAM User Password

Resources:
  RamAdminUser:
    Type: 'ALIYUN::RAM::User'
    Properties:
      UserName:    user1byROS
      DisplayName: user1byROS
      LoginProfile:
        PasswordResetRequired: false
        Password: Ref: RamUserPassword
        MFABindRequired: false
      Policies:
        - PolicyName: AliyunECSFullAccess_custom
          PolicyDocument:
            Version: '1'
            Statement:
              - Action: ["ecs:*"]
                Resource: ['*']
                Effect: Allow
              - Action: ["vpc:DescribeVpcs","vpc:DescribeVSwitches"]
                Resource: ['*']
                Effect: Allow
          Description: note
        - PolicyName: AliyunOSSFullAccess_custum
          PolicyDocument:
            Version: '1'
            Statement:
              - Action: ['oss:*']
                Resource: ['*']
                Effect: Allow
          Description: custom

感想

もう少し簡単にシステムポリシーを割り当てる方法がある様な気がするのですが、探して見つかればまた報告します。

(2020年5月12日追記:サポートに連絡したら方法が無いと。。。とりあえずリクエストを上げておきました。)