@@ -12,13 +12,154 @@ resource "aws_iam_access_key" "access_key" {
1212 pgp_key = " ${ var . pgp_key } "
1313}
1414
15- resource "aws_iam_user_policy" "policy " {
15+ resource "aws_iam_user_policy" "sts " {
1616 user = " ${ aws_iam_user . user . name } "
1717 policy = " ${ data . aws_iam_policy_document . sts . json } "
1818}
1919
20+ resource "aws_iam_user_policy" "mfa" {
21+ user = " ${ aws_iam_user . user . name } "
22+ policy = " ${ data . aws_iam_policy_document . mfa . json } "
23+ }
24+
25+ resource "aws_iam_user_policy" "deny_no_mfa" {
26+ user = " ${ aws_iam_user . user . name } "
27+ policy = " ${ data . aws_iam_policy_document . deny_no_mfa . json } "
28+ }
29+
30+ data "aws_iam_policy_document" "mfa" {
31+ " statement" {
32+ effect = " Allow"
33+
34+ actions = [
35+ " iam:ListAccountAliases" ,
36+ " iam:ListUsers" ,
37+ " iam:ListVirtualMFADevices" ,
38+ " iam:GetAccountPasswordPolicy" ,
39+ " iam:GetAccountSummary" ,
40+ ]
41+
42+ resources = [" *" ]
43+ }
44+
45+ " statement" {
46+ effect = " Allow"
47+
48+ actions = [
49+ " iam:ChangePassword" ,
50+ " iam:CreateAccessKey" ,
51+ " iam:CreateLoginProfile" ,
52+ " iam:DeleteAccessKey" ,
53+ " iam:DeleteLoginProfile" ,
54+ " iam:GetLoginProfile" ,
55+ " iam:ListAccessKeys" ,
56+ " iam:UpdateAccessKey" ,
57+ " iam:UpdateLoginProfile" ,
58+ " iam:ListSigningCertificates" ,
59+ " iam:DeleteSigningCertificate" ,
60+ " iam:UpdateSigningCertificate" ,
61+ " iam:UploadSigningCertificate" ,
62+ " iam:ListSSHPublicKeys" ,
63+ " iam:GetSSHPublicKey" ,
64+ " iam:DeleteSSHPublicKey" ,
65+ " iam:UpdateSSHPublicKey" ,
66+ " iam:UploadSSHPublicKey" ,
67+ ]
68+
69+ resources = [
70+ " arn:aws:iam::*:user/${ aws_iam_user . user . name } " ,
71+ ]
72+ }
73+
74+ " statement" {
75+ effect = " Allow"
76+
77+ actions = [
78+ " iam:ListMFADevices" ,
79+ ]
80+
81+ resources = [
82+ " arn:aws:iam::*:mfa/*" ,
83+ " arn:aws:iam::*:user/${ aws_iam_user . user . name } " ,
84+ ]
85+ }
86+
87+ " statement" {
88+ effect = " Allow"
89+
90+ actions = [
91+ " iam:CreateVirtualMFADevice" ,
92+ " iam:DeleteVirtualMFADevice" ,
93+ " iam:EnableMFADevice" ,
94+ " iam:ResyncMFADevice" ,
95+ ]
96+
97+ resources = [
98+ " arn:aws:iam::*:mfa/${ aws_iam_user . user . name } " ,
99+ " arn:aws:iam::*:user/${ aws_iam_user . user . name } " ,
100+ ]
101+ }
102+
103+ " statement" {
104+ effect = " Allow"
105+
106+ actions = [
107+ " iam:DeactivateMFADevice" ,
108+ ]
109+
110+ resources = [
111+ " arn:aws:iam::*:mfa/${ aws_iam_user . user . name } " ,
112+ " arn:aws:iam::*:user/${ aws_iam_user . user . name } " ,
113+ ]
114+
115+ condition {
116+ test = " Bool"
117+ values = [" true" ]
118+ variable = " aws:MultiFactorAuthPresent"
119+ }
120+ }
121+ }
122+
123+ data "aws_iam_policy_document" "deny_no_mfa" {
124+ " statement" {
125+ effect = " Deny"
126+
127+ not_actions = [
128+ " iam:ChangePassword" ,
129+ " iam:CreateLoginProfile" ,
130+ " iam:CreateVirtualMFADevice" ,
131+ " iam:ListVirtualMFADevices" ,
132+ " iam:EnableMFADevice" ,
133+ " iam:ResyncMFADevice" ,
134+ " iam:ListAccountAliases" ,
135+ " iam:ListUsers" ,
136+ " iam:ListSSHPublicKeys" ,
137+ " iam:ListAccessKeys" ,
138+ " iam:ListServiceSpecificCredentials" ,
139+ " iam:ListMFADevices" ,
140+ " iam:GetAccountSummary" ,
141+ " sts:*" ,
142+ ]
143+
144+ resources = [
145+ " *" ,
146+ ]
147+
148+ condition {
149+ test = " BoolIfExists"
150+
151+ values = [
152+ " false" ,
153+ ]
154+
155+ variable = " aws:MultiFactorAuthPresent"
156+ }
157+ }
158+ }
159+
20160data "aws_iam_policy_document" "sts" {
21161 " statement" {
162+ effect = " Allow"
22163 actions = [" sts:*" ]
23164 resources = [" *" ]
24165 }
0 commit comments