[AWS IAM]汎用的なIAMポリシーをCloudFormationで書いてみた
はじめに
AWSについて学習中の身である私ですが、個人学習であることも関係ありますが、本来は最小権限で利用すべきなんどろうな、、、と感じながらも権限周りについてあまり気にせずに各種サービスを利用してきました。そこで
、権限に分かった上で「学習用にFullAccessを利用しています」と胸を張って言えるようにするべく、IAMの学習をすることにしました。
下記の記事にもう少し詳細を記載していますので気になる方はこちらを参照ください。
また、IAM?という方には参考になる内容でもありますので、一読いただけると良いと思います。
本編
AWSの薄い本 IAMのマニアックな話こちらのIAMについての書籍の中に記載されている、管理者以外のIAMユーザーに対するIAMの権限付与について、実際にグループとポリシーを作成しました。また、CloudFormationを使用しています。
IAMのポリシー管理にCloudFormationを利用するメリット
Resourceを指定する際に疑似パラメータが使用でき、自動的に自身のアカウントに置き換えてくれる為、タイポが無くなり、〇〇用にアカウントを追加した場合も使いまわしが可能です。その為、後述するテンプレートの内容をコピペして皆さんの環境でそのまま利用することもできます。
AWS公式/疑似パラメータ(予め用意されている環境変数のようなイメージ)
作成するIAMグループ・ポリシー
管理者ユーザー以外のユーザーに原則アタッチすべきポリシーを作成しています。詳細は以下参照ください。
- (ご存知の通り)ルートユーザーでの使用は禁止されており、IAMのユーザーを作成する必要があります。
- Administrator権限を所有するのは管理用ユーザーであり、IAM関連のFullAccessを持つことになります。
- 一般ユーザーには必要な権限を最低限付与すること が必要です。これに反してIAMのFullAccess権限を付与してしまうと、権限を自由に操作できる為、Administrator権限を持つことと同義となります。
- ただし、自身のMFA認証の有効化や、パスワードのローテーションの為に特定のIAMのアクションを付与する必要があります・。
- 今回これを持つポリシー及びアタッチしたグループを作成します。
完成したCloudFormationテンプレート
AWSTemplateFormatVersion: 2010-09-09
Description: learn to create iam group by cfn
Resources:
IamGroupDemo:
Type: AWS::IAM::Group
Properties:
GroupName: "iamgroup-demo"
IamPolicyDemo:
Type: AWS::IAM::Policy
Properties:
PolicyName: "can-be-edit-own-password" # Required
PolicyDocument: # Required
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- "iam:ChangePassword"
- "iam:CreateAccessKey"
- "iam:CreateVirtualMFADevice"
- "iam:DeactivateMFADevice"
- "iam:DeleteAccessKey"
- "iam:DeleteVirtualMFADevice"
- "iam:EnableMFADevice"
- "iam:UpdateAccessKey"
- "iam:UpdateSigningCertificate"
- "iam:UploadSigningCertificate"
- "iam:UpdateLoginProfile"
- "iam:ResyncMFADevice"
Resource:
- !Sub "arn:aws:iam::${AWS::AccountId}:user/${!aws:username}"
- !Sub "arn:aws:iam::${AWS::AccountId}:mfa/${!aws:username}"
- Effect: Allow
Action:
- "iam:Get*"
- "iam:List*"
Resource:
- "*"
Groups:
- !Ref IamGroupDemo
IAMについてはここまで。
ARNって何?
私が上記を作成した際によく分かっていなかったARNについて少し解説をさせていただきます。
同じようにARN?という方はぜひご覧ください。
ARNとは・・・Amazonリソースネームの略称
下記は公式ドキュメントから引用した説明文です。
Amazon リソースネーム (ARN) は、AWS リソースを一意に識別します。 IAM ポリシー、Amazon Relational Database Service (Amazon RDS) タグ、API コールなど、すべての AWS 全体でリソースを明確に指定する必要がある場合は ARN が必要になります。
AWS公式ドキュメント
https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-arns-and-namespaces.html
閲覧2022.6.21
ARNを構成する要素
以下のようなパターンがあり、arn
以降の要素の組み合わせで構成されています。各要素がどんなものかは多くの方は予想できると思います。詳しく知りたい方は前述の公式ドキュメントを参照ください。
arn:partition:service:region:account-id:resource-id
arn:partition:service:region:account-id:resource-type/resource-id
arn:partition:service:region:account-id:resource-type:resource-id
ex.)EC2インスタンスのARN・・・arn:aws:ec2:ap-northeast-1:instance/i-1234567890abcdef0
ARNの確認方法(EC2インスタンスの場合)
EC2インスタンスの場合、確認すべきはresource-id
です。インスタンスIDがこれに該当します。確認の方法は以下を参照ください。
- マネジメントコンソールで確認
- AWS CLIで確認
❯ aws ec2 describe-instances
{
"Reservations": [
{
"Groups": [],
"Instances": [
{
"AmiLaunchIndex": 0,
"ImageId": "ami-02c3627b04781eada",
"InstanceId": "i-075d01fbebdd3e878",
:
:
:
※このインスタンスは既に終了されています。
おまけ(VSCodeの拡張機能について)
私はCloudFormationのテンプレートをVSCodeで記述しています。その際、拡張機能を利用してスニペットを活用しているのですが、今回のテンプレート作成に際して、拡張機能を乗り換えました。一部の差異を以下にまとめましたので参考にしてください。
変更前 | 変更後 | |
---|---|---|
アイコン | ||
必須項目か | 表示されない | 表示される |
出力されるプロパティ | 一部 | 全て |
出力例 |
以上。
Discussion