この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
コンニチは千葉です。
はじめに
AWSに関するCISベンチマークについて、調査した内容をまとめます。
CISとは下記のような非営利団体です。
米国のNSA(National Security Agency/国家安全保障局)、DISA(Difense Informaton Systems Agency/国防情報システム局)、NIST(National Institute of Standards and Technology/米国立標準技術研究所)などの米国政府機関と、企業、学術機関などが協力して、インターネット・セキュリティ標準化に取り組む団体の名称。
CIS(Center for Internet Security) - マルチメディア/インターネット事典
このベンチマークを利用することでセキュリティに関するベストプラクティスを導入できます。 弊社でもいくつかの記事を紹介しています。
今回は、CIS Amazon Web Services Foundations v1.1.0 - 11-09-2016 の 1.18 Ensure IAM Master and IAM Manager roles are active について解説しようと思います。
IAMマスターロールとIAMマネージャーロール
IAMとはAWSリソースへのアクセス制御をするための管理サービスです。IAMロールは直接ログインできませんが、リソースに権限を引き継ぐことができます(Unixのsuみたいなイメージ)。 IAMロールはIAMユーザー、EC2、Lambdaなど様々なリソースに割り当てすることができます。IAMロールを使って、適切に権限を分離することでセキュリティを高めることができます。
で、ここからが本題です。
IAMの操作はセキュリティ上かなり重要な操作です。なぜなら、AWSの操作権限を自由に付与できる権限を有するからです。なんでも操作できるユーザーやロールを作成することができます。そのため、「1.18 Ensure IAM Master and IAM Manager roles are active」では、IAMの管理を複数人で行うこととし「マスターロール」と「マネージャーロール」に分けて操作を行いセキュリティを強化しようと謳っています。マスターロールとマネージャーロールはスイッチユーザーで、ロール切り替えを行います。
マスターロール
マスターロールは、作成と削除を行うロールです。具体的には以下の操作が可能です。
- ユーザー作成・削除
- グループ作成・削除
- ロールを作成・削除
- ポリシーの作成・削除
マネージャーロール
マネージャーロールは、リソースの割り当てと解除を行うロールです。具体的には以下の操作が可能です。
- ユーザーをグループに割り当て・解除
- グループにポリシーを割り当て・解除
- ロールにポリシーを割り当て・解除
導入手順
CloudFormationのテンプレートを置いておくので、CloudFormationから実行してください!ファイルに保存してから実行してください。 テンプレートでは、4つのリソースを作成します。
- マスターロール用のポリシー(IamMasterPolicy)
- マネージャーロール用のポリシー(IamManagerPolicy)
- マスターロール(IamMasterRole)
- マネージャーロール(IamManagerRole)
AWSTemplateFormatVersion: "2010-09-09"
Description: 1.18 Ensure IAM Master and IAM Manager roles are active of CIS
Resources:
IamMasterRole:
Type: "AWS::IAM::Role"
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
-
Effect: "Allow"
Principal:
AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
Action:
- "sts:AssumeRole"
Path: "/"
RoleName: "IamMasterRole"
IamManagerRole:
Type: "AWS::IAM::Role"
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
-
Effect: "Allow"
Principal:
AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
Action:
- "sts:AssumeRole"
Path: "/"
RoleName: "IamManagerRole"
IamMasterPolicy:
Type: "AWS::IAM::Policy"
Properties:
Roles:
- Ref: "IamMasterRole"
PolicyName: "IamMasterPolicy"
PolicyDocument:
Version: "2012-10-17"
Statement:
-
Effect: "Allow"
Resource: "*"
Action:
- "iam:AttachRolePolicy"
- "iam:CreateGroup"
- "iam:CreatePolicy"
- "iam:CreatePolicyVersion"
- "iam:CreateRole"
- "iam:CreateUser"
- "iam:DeleteGroup"
- "iam:DeletePolicy"
- "iam:DeletePolicyVersion"
- "iam:DeleteRole"
- "iam:DeleteRolePolicy"
- "iam:DeleteUser"
- "iam:PutRolePolicy"
- "iam:GetPolicy"
- "iam:GetPolicyVersion"
- "iam:GetRole"
- "iam:GetRolePolicy"
- "iam:GetUser"
- "iam:GetUserPolicy"
- "iam:ListEntitiesForPolicy"
- "iam:ListGroupPolicies"
- "iam:ListGroups"
- "iam:ListGroupsForUser"
- "iam:ListPolicies"
- "iam:ListPoliciesGrantingServiceAccess"
- "iam:ListPolicyVersions"
- "iam:ListRolePolicies"
- "iam:ListAttachedGroupPolicies"
- "iam:ListAttachedRolePolicies"
- "iam:ListAttachedUserPolicies"
- "iam:ListRoles"
- "iam:ListUsers"
Condition:
Bool:
aws:MultiFactorAuthPresent: true
-
Effect: "Deny"
Resource: "*"
Action:
- "iam:AddUserToGroup"
- "iam:AttachGroupPolicy"
- "iam:DeleteGroupPolicy"
- "iam:DeleteUserPolicy"
- "iam:DetachGroupPolicy"
- "iam:DetachRolePolicy"
- "iam:DetachUserPolicy"
- "iam:PutGroupPolicy"
- "iam:PutUserPolicy"
- "iam:RemoveUserFromGroup"
- "iam:UpdateGroup"
- "iam:UpdateAssumeRolePolicy"
- "iam:UpdateUser"
IamManagerPolicy:
Type: "AWS::IAM::Policy"
Properties:
Roles:
- Ref: "IamManagerRole"
PolicyName: "IamManagerPolicy"
PolicyDocument:
Version: "2012-10-17"
Statement:
-
Effect: "Allow"
Resource: "*"
Action:
- "iam:AddUserToGroup"
- "iam:AttachGroupPolicy"
- "iam:DeleteGroupPolicy"
- "iam:DeleteUserPolicy"
- "iam:DetachGroupPolicy"
- "iam:DetachRolePolicy"
- "iam:DetachUserPolicy"
- "iam:PutGroupPolicy"
- "iam:PutUserPolicy"
- "iam:RemoveUserFromGroup"
- "iam:UpdateGroup"
- "iam:UpdateAssumeRolePolicy"
- "iam:UpdateUser"
- "iam:GetPolicy"
- "iam:GetPolicyVersion"
- "iam:GetRole"
- "iam:GetRolePolicy"
- "iam:GetUser"
- "iam:GetUserPolicy"
- "iam:ListEntitiesForPolicy"
- "iam:ListGroupPolicies"
- "iam:ListGroups"
- "iam:ListGroupsForUser"
- "iam:ListPolicies"
- "iam:ListPoliciesGrantingServiceAccess"
- "iam:ListPolicyVersions"
- "iam:ListRolePolicies"
- "iam:ListAttachedGroupPolicies"
- "iam:ListAttachedRolePolicies"
- "iam:ListAttachedUserPolicies"
- "iam:ListRoles"
- "iam:ListUsers"
Condition:
Bool:
aws:MultiFactorAuthPresent: true
-
Effect: "Deny"
Resource: "*"
Action:
- "iam:AttachRolePolicy"
- "iam:CreateGroup"
- "iam:CreatePolicy"
- "iam:CreatePolicyVersion"
- "iam:CreateRole"
- "iam:CreateUser"
- "iam:DeleteGroup"
- "iam:DeletePolicy"
- "iam:DeletePolicyVersion"
- "iam:DeleteRole"
- "iam:DeleteRolePolicy"
- "iam:DeleteUser"
- "iam:PutRolePolicy"
Outputs:
ManagerPolicyName:
Value:
Ref: IamManagerPolicy
MasterPolicyName:
Value:
Ref: IamMasterPolicy
IamMasterRole:
Value:
Ref: IamMasterPolicy
IamManagerRole:
Value:
Ref: IamManagerRole
追加でやるといいこと
CISには定義されてませんが、特定のIAMユーザーからのみスイッチロールすることができます。 IAMロールの「信頼関係」のタブから編集を行います。"Resource"にスイッチロール元のIAMユーザー名に変更します。
具体的には以下です。
修正前
-- 省略 --
"Principal": {
"AWS": "arn:aws:iam::xxxxxxxxxxxxx:root"
},
-- 省略 --
修正後
-- 省略 --
"Principal": {
"AWS": "arn:aws:iam::xxxxxxxxxxxxx:user/[IAMロール名]"
},
-- 省略 --
[IAMロール名]の箇所に、スイッチ元のIAMロール名を指定します。
マネージャーロールとマスターロールの利用手順
IAMユーザーでログイン後に、スイッチユーザーすることで利用します。スイッチロールのURLは、対象のIAMロールを選択することで確認できます。
ロールをクリックすることで、スチッチロールでき今回作成したマスターロルまたはマネージャーロールの権限を利用できるようになります。
さいごに
まとめると、
- IAMの操作を行う場合はマネージャーロール、マスターロールを利用する
- マネージャーロールとマスターロールは違う人が操作する(役割を分ける)
のように運用することで、セキュリティを強化します。映画で見る核スイッチの起爆みたいなイメージですね。それではまたっ。
参考
https://d0.awsstatic.com/whitepapers/compliance/AWS_CIS_Foundations_Benchmark.pdf