@@ -9,83 +9,146 @@ locals {
9
9
partition = data. aws_partition . current . partition
10
10
}
11
11
12
+ # Allows MFA-authenticated IAM users to manage their own credentials on the My security credentials page
13
+ # https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_aws_my-sec-creds-self-manage.html
12
14
data "aws_iam_policy_document" "iam_self_management" {
13
15
statement {
14
- sid = " AllowSelfManagement"
16
+ sid = " AllowViewAccountInfo"
17
+
18
+ effect = " Allow"
19
+
20
+ actions = [
21
+ " iam:GetAccountPasswordPolicy" ,
22
+ " iam:ListVirtualMFADevices"
23
+ ]
24
+
25
+ resources = [" *" ]
26
+ }
27
+
28
+ statement {
29
+ sid = " AllowManageOwnPasswords"
15
30
16
31
effect = " Allow"
17
32
18
33
actions = [
19
34
" iam:ChangePassword" ,
35
+ " iam:GetUser"
36
+ ]
37
+
38
+ resources = [" arn:${ local . partition } :iam::${ local . aws_account_id } :user/$${aws:username}" ]
39
+ }
40
+
41
+ statement {
42
+ sid = " AllowManageOwnAccessKeys"
43
+
44
+ effect = " Allow"
45
+
46
+ actions = [
20
47
" iam:CreateAccessKey" ,
21
- " iam:CreateLoginProfile" ,
22
- " iam:CreateVirtualMFADevice" ,
23
48
" iam:DeleteAccessKey" ,
24
- " iam:DeleteLoginProfile" ,
25
- " iam:DeleteVirtualMFADevice" ,
26
- " iam:EnableMFADevice" ,
27
- " iam:GenerateCredentialReport" ,
28
- " iam:GenerateServiceLastAccessedDetails" ,
29
- " iam:Get*" ,
30
- " iam:List*" ,
31
- " iam:ResyncMFADevice" ,
32
- " iam:UpdateAccessKey" ,
33
- " iam:UpdateLoginProfile" ,
34
- " iam:UpdateUser" ,
35
- " iam:UploadSigningCertificate" ,
36
- " iam:UploadSSHPublicKey" ,
37
- " iam:TagUser" ,
38
- " iam:ListUserTags" ,
39
- " iam:UntagUser" ,
49
+ " iam:ListAccessKeys" ,
50
+ " iam:UpdateAccessKey"
40
51
]
41
52
42
- # Allow for both users with "path" and without it
43
- resources = [
44
- " arn:${ local . partition } :iam::${ local . aws_account_id } :user/*/$${aws:username}" ,
45
- " arn:${ local . partition } :iam::${ local . aws_account_id } :user/$${aws:username}" ,
46
- " arn:${ local . partition } :iam::${ local . aws_account_id } :mfa/$${aws:username}" ,
53
+ resources = [" arn:${ local . partition } :iam::${ local . aws_account_id } :user/$${aws:username}" ]
54
+ }
55
+
56
+ statement {
57
+ sid = " AllowManageOwnSigningCertificates"
58
+
59
+ effect = " Allow"
60
+
61
+ actions = [
62
+ " iam:DeleteSigningCertificate" ,
63
+ " iam:ListSigningCertificates" ,
64
+ " iam:UpdateSigningCertificate" ,
65
+ " iam:UploadSigningCertificate"
47
66
]
67
+
68
+ resources = [" arn:${ local . partition } :iam::${ local . aws_account_id } :user/$${aws:username}" ]
48
69
}
49
70
50
71
statement {
51
- sid = " AllowIAMReadOnly"
72
+ sid = " AllowManageOwnSSHPublicKeys"
73
+
74
+ effect = " Allow"
52
75
53
76
actions = [
54
- " iam:Get*" ,
55
- " iam:List*" ,
77
+ " iam:DeleteSSHPublicKey" ,
78
+ " iam:GetSSHPublicKey" ,
79
+ " iam:ListSSHPublicKeys" ,
80
+ " iam:UpdateSSHPublicKey" ,
81
+ " iam:UploadSSHPublicKey"
56
82
]
57
83
58
- resources = [" *" ]
59
- effect = " Allow"
84
+ resources = [" arn:${ local . partition } :iam::${ local . aws_account_id } :user/$${aws:username}" ]
60
85
}
61
86
62
- # Allow to deactivate MFA only when logging in with MFA
63
87
statement {
64
- sid = " AllowDeactivateMFADevice"
88
+ sid = " AllowManageOwnGitCredentials"
89
+
90
+ effect = " Allow"
91
+
92
+ actions = [
93
+ " iam:CreateServiceSpecificCredential" ,
94
+ " iam:DeleteServiceSpecificCredential" ,
95
+ " iam:ListServiceSpecificCredentials" ,
96
+ " iam:ResetServiceSpecificCredential" ,
97
+ " iam:UpdateServiceSpecificCredential"
98
+ ]
99
+
100
+ resources = [" arn:${ local . partition } :iam::${ local . aws_account_id } :user/$${aws:username}" ]
101
+ }
102
+
103
+ statement {
104
+ sid = " AllowManageOwnVirtualMFADevice"
105
+
106
+ effect = " Allow"
107
+
108
+ actions = [
109
+ " iam:CreateVirtualMFADevice"
110
+ ]
111
+
112
+ resources = [" arn:${ local . partition } :iam::${ local . aws_account_id } :mfa/*" ]
113
+ }
114
+
115
+ statement {
116
+ sid = " AllowManageOwnUserMFA"
65
117
66
118
effect = " Allow"
67
119
68
120
actions = [
69
121
" iam:DeactivateMFADevice" ,
122
+ " iam:EnableMFADevice" ,
123
+ " iam:ListMFADevices" ,
124
+ " iam:ResyncMFADevice"
70
125
]
71
126
72
- # Allow for both users with "path" and without it
73
- resources = [
74
- " arn:${ local . partition } :iam::${ local . aws_account_id } :user/*/$${aws:username}" ,
75
- " arn:${ local . partition } :iam::${ local . aws_account_id } :user/$${aws:username}" ,
76
- " arn:${ local . partition } :iam::${ local . aws_account_id } :mfa/$${aws:username}" ,
127
+ resources = [" arn:${ local . partition } :iam::${ local . aws_account_id } :user/$${aws:username}" ]
128
+
129
+ }
130
+
131
+ statement {
132
+ sid = " DenyAllExceptListedIfNoMFA"
133
+
134
+ effect = " Deny"
135
+
136
+ not_actions = [
137
+ " iam:CreateVirtualMFADevice" ,
138
+ " iam:EnableMFADevice" ,
139
+ " iam:GetUser" ,
140
+ " iam:ListMFADevices" ,
141
+ " iam:ListVirtualMFADevices" ,
142
+ " iam:ResyncMFADevice" ,
143
+ " sts:GetSessionToken"
77
144
]
78
145
79
- condition {
80
- test = " Bool"
81
- variable = " aws:MultiFactorAuthPresent"
82
- values = [" true" ]
83
- }
146
+ resources = [" *" ]
84
147
85
148
condition {
86
- test = " NumericLessThan "
87
- variable = " aws:MultiFactorAuthAge "
88
- values = [" 3600 " ]
149
+ test = " BoolIfExists "
150
+ variable = " aws:MultiFactorAuthPresent "
151
+ values = [" false " ]
89
152
}
90
153
}
91
154
}
0 commit comments