LoginSignup
2
0

More than 1 year has passed since last update.

AWS IAMポリシーでのMFAの強制とポリシードキュメントの書き方について

Last updated at Posted at 2019-10-14

はじめに

AWSを運用していると、「AWSマネジメントコンソールを触れる人を増やしたいけど、MFAはセキュリティの観点から最低限設定して欲しい」とか「IAMユーザごとに権限を適正に設定したい」という要件が出てくると思います。
検索してもこの辺の内容に触れた記事があまり無いので、最近触ってみて困ったこの辺の内容について触れたいと思います。

MFAについて

なぜMFAを設定するのか

(そんな会社そうそうないと思いますが)特に社内ルールを定めていない場合、IAMユーザを発行された人がMFAを設定するかしないかは本人のセキュリティ意識に依存している部分が強いと思います。
Administrator権限を付与されていてもMFAを設定していない人がたまに(ゲフンゲフン

IDパスワードだけの運用であれば、もし同じパスワードを他社サービスで使っていた場合、他社サービスから漏洩する可能性があります。
その場合、以下の様なリスクがあります。

  • アカウントを乗っ取られ高額EC2インスタンスを起動されてビットコインマイニングなどに利用されて数百万の支払いが発生する
  • 他社のサイトへの不正アクセスの踏み台として使われるなどする

MFAを設定しておくと、もしIDパスワードが漏洩してもログインを防げるので安心です。

MFAを強制するIAMポリシー

最低限MFAを強制させるIAMポリシー

基本的に以下の設定の様にConditionにMFAのパラメータ判定を入れるだけでMFAを強制できるようになります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ForceSettingOFMFASample",
            "Effect": "Allow or Deny",
            "Action": "許可/拒否させたいAction",
            "Resource": "許可/拒否させたいResource",
            "Condition": {
                "Bool": {
                    "aws:MultiFactorAuthPresent": "true or false"
                }
            }
        }
    ]
}

しかし、こちらのIAMポリシーだけでは設定が不十分です。
こちらのIAMポリシーだけでは、ログインした人自身でMFAの編集ができないため、管理が煩雑になってしまいます。

そこで、もう少し色々できるように権限を付与するIAMポリシーを調べたところ、AWS ドキュメントにある通り以下の設定にした方がより取り回しが良かったです。
(以前はこのドキュメント無かった気がするんですがいつからあるんだろう:thinking:)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowListActions",
            "Effect": "Allow",
            "Action": [
                "iam:ListUsers",
                "iam:ListVirtualMFADevices"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowIndividualUserToListOnlyTheirOwnMFA",
            "Effect": "Allow",
            "Action": [
                "iam:ListMFADevices"
            ],
            "Resource": [
                "arn:aws:iam::*:mfa/*",
                "arn:aws:iam::*:user/${aws:username}"
            ]
        },
        {
            "Sid": "AllowIndividualUserToManageTheirOwnMFA",
            "Effect": "Allow",
            "Action": [
                "iam:CreateVirtualMFADevice",
                "iam:DeleteVirtualMFADevice",
                "iam:EnableMFADevice",
                "iam:ResyncMFADevice"
            ],
            "Resource": [
                "arn:aws:iam::*:mfa/${aws:username}",
                "arn:aws:iam::*:user/${aws:username}"
            ]
        },
        {
            "Sid": "AllowIndividualUserToDeactivateOnlyTheirOwnMFAOnlyWhenUsingMFA",
            "Effect": "Allow",
            "Action": [
                "iam:DeactivateMFADevice"
            ],
            "Resource": [
                "arn:aws:iam::*:mfa/${aws:username}",
                "arn:aws:iam::*:user/${aws:username}"
            ],
            "Condition": {
                "Bool": {
                    "aws:MultiFactorAuthPresent": "true"
                }
            }
        },
        {
            "Sid": "BlockMostAccessUnlessSignedInWithMFA",
            "Effect": "Deny",
            "NotAction": [
                "iam:CreateVirtualMFADevice",
                "iam:EnableMFADevice",
                "iam:ListMFADevices",
                "iam:ListUsers",
                "iam:ListVirtualMFADevices",
                "iam:ResyncMFADevice"
            ],
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
        }
    ]
}

出典: IAM: IAM ユーザーに MFA デバイスの自己管理を許可する
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_examples_iam_mfa-selfmanage.html

各Sidごとの解説

AllowListActions

IAMユーザと仮想MFAデバイスのリスト表示を許可する。
『えっ?他のIAMユーザMFAデバイスのリスト表示許可するの?』と思うかもしれませんが、IAMユーザの一覧ページにMFAデバイスの列があるのでそこで必要になります。

AllowIndividualUserToListOnlyTheirOwnMFA

自信のMFAデバイス認証情報タブで表示するために設定していると思われます。

AllowIndividualUserToManageTheirOwnMFA

自身のIAMユーザに限りMFAデバイスの追加・削除・有効化・再同期を許可する。

AllowIndividualUserToDeactivateOnlyTheirOwnMFAOnlyWhenUsingMFA

自身の仮想MFAデバイスが有効な場合に限り、仮想MFAデバイスの無効化を許可する。

BlockMostAccessUnlessSignedInWithMFA

MFAデバイスが有効でないとき、MFAデバイスの追加に関する操作以外を拒否する。

スイッチロールで使う場合

MFAが有効になっていない場合に他のAWSアカウントへのスイッチを拒否する設定も行えます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowAssumeRoleIFMFAIsEnableSample",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789100:root"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "Bool": {
                    "aws:MultiFactorAuthPresent": "true"
                }
            }
        }
    ]
}

IAMポリシーの適正な設定方法について

IAMポリシーのポリシードキュメントに関する公式リファレンス

※2021/10/12 追記

現在は以下の通りAWSの公式リファレンスが充実してきているようです。

この記事を書いている時点で、AWSの公式ドキュメントではIAMポリシーに対する明確なリファレンスはありません。
ポリシードキュメントのjsonの書き方などはドキュメントがありますが、どのAWSサービスに対して、どの様に設定すればいいかが解らない状態です。

IAMポリシーの設定について

ドキュメントが無いなら参照にするものは何かというと、AWS CLIのドキュメントを参考にそれっぽく書くようにしています。
https://docs.aws.amazon.com/cli/latest/reference/index.html#cli-aws

各種サービスの権限は、例えば参照系の場合はプリフィクスとしてget,describe,listなどが付与されていることがわかります。
そこから、参照のみ許可したい場合はこれらの権限をつけるといった感じです。

IAMポリシーのポリシードキュメントに関する非公式リファレンス

2021/10/12 追記

現在は The official AWS documentation has greatly improved since the beginning of this project. Check it out! との記載が追加されており、公式リファレンスに誘導しているようです。
公式リファレンスを参照しましょう。

記事を書きながら改めて調べていると、非公式ではあるものの有志で作られたIAMポリシーに関するサイトが有りました。
この辺参考にしてみると良いかもしれませんね。

https://iam.cloudonaut.io/

おわりに

一旦覚え書き的にまとめましたが、IAMポリシー書くとき、色々悩ましいことが発生するので今後もう少し肉付けするかもしれません。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0