반응형
AWS IAM을 더 안전하게 사용하기 위해서 MFA를 설정하도록 권고한다.
현업에서 IAM 관리자는 사용자들에게 MFA를 설정하라고 가이드하지만 안듣는 사람들이 꼭 있다.
이를 방지하기 위해 MFA 설정을 하지 않을 경우 권한 막아버려 MFA를 등록할 수 밖에 없도록 구성할 수 있다.
이를 MFA 강제 정책이라 부르겠다.
1. MFA 제한 정책(ver. AWS 공식 문서)
https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/reference_policies_examples_aws_my-sec-creds-self-manage.html
위 공식 문서를 보면 아래와 같은 정책을 사용하여 자신의 Credential을 관리하고 MFA 설정을 강제하도록 한다.
각 Statement에 대한 설명은 공식 문서를 참고하길 바란다.
##AWS공식문서에서제공하는정책예시{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowViewAccountInfo",
"Effect": "Allow",
"Action": [
"iam:GetAccountPasswordPolicy",
"iam:ListVirtualMFADevices"
],
"Resource": "*"
},
{
"Sid": "AllowManageOwnPasswords",
"Effect": "Allow",
"Action": [
"iam:ChangePassword",
"iam:GetUser"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "AllowManageOwnAccessKeys",
"Effect": "Allow",
"Action": [
"iam:CreateAccessKey",
"iam:DeleteAccessKey",
"iam:ListAccessKeys",
"iam:UpdateAccessKey",
"iam:GetAccessKeyLastUsed"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "AllowManageOwnSigningCertificates",
"Effect": "Allow",
"Action": [
"iam:DeleteSigningCertificate",
"iam:ListSigningCertificates",
"iam:UpdateSigningCertificate",
"iam:UploadSigningCertificate"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "AllowManageOwnSSHPublicKeys",
"Effect": "Allow",
"Action": [
"iam:DeleteSSHPublicKey",
"iam:GetSSHPublicKey",
"iam:ListSSHPublicKeys",
"iam:UpdateSSHPublicKey",
"iam:UploadSSHPublicKey"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "AllowManageOwnGitCredentials",
"Effect": "Allow",
"Action": [
"iam:CreateServiceSpecificCredential",
"iam:DeleteServiceSpecificCredential",
"iam:ListServiceSpecificCredentials",
"iam:ResetServiceSpecificCredential",
"iam:UpdateServiceSpecificCredential"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "AllowManageOwnVirtualMFADevice",
"Effect": "Allow",
"Action": [
"iam:CreateVirtualMFADevice"
],
"Resource": "arn:aws:iam::*:mfa/*"
},
{
"Sid": "AllowManageOwnUserMFA",
"Effect": "Allow",
"Action": [
"iam:DeactivateMFADevice",
"iam:EnableMFADevice",
"iam:ListMFADevices",
"iam:ResyncMFADevice"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "DenyAllExceptListedIfNoMFA",
"Effect": "Deny",
"NotAction": [
"iam:CreateVirtualMFADevice",
"iam:EnableMFADevice",
"iam:GetUser",
"iam:GetMFADevice",
"iam:ListMFADevices",
"iam:ListVirtualMFADevices",
"iam:ResyncMFADevice",
"sts:GetSessionToken"
],
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
}
]
}
2. MFA 제한 정책(ver. 현업)
공식 문서에서 알려준 예제는 현업에 맞지 않는 부분과 이상한 있어서 수정해주기로 한다.
수정 사항을 요약하면 다음과 같다.
- AllowViewAccountInfo에 iam:GetAccountSummary, ListAccountAliases 추가
AWS IAM 대시보드에 들어갈 때 권한 에러가 뜨는 부분을 해결해주었다. 일반 사용자에게 노출되어도 상관없는 정보라 두 권한을 추가해주었다. - AllowManageOwnVirtualMFADevice에 iam:DeleteVirtualMFADevice 추가 및 resource를 arn:aws:iam::*:mfa/${aws:username}로 변경
MFA Device를 생성할 때, 자신의 username으로만 생성 가능하도록 구성하였다. - DenyAllExceptListedIfNoMFA에 "iam:ChangePassword", "iam:GetAccountPasswordPolicy" 추가
MFA 설정을 하지 않더라도 비밀번호를 변경할 수 있도록 Deny All에서 예외처리해주었다.
최초 IAM User 로그인 시 비밀번호를 변경하도록 설정할 수 있는데, 이때 MFA 등록 전이라 비밀번호를 정상적으로 변경하기 위해서는 Deny All에서 예외처리해줘야한다. - 기타 sid 생성(GetLoginProfile/arn:aws:iam::*:user/${aws:username})
자신의 Login Profile을 확인할 수 있도록 추가해주었다. - DenyAllExceptListedIfNoMFA에서 "iam:GetMFADevice" 제거
iam:GetMFADevice가 굳이 Deny All 예외처리에 들어가 있을 필요가 없다고 생각하여 제거해줬다. - 프로젝트 요건에 맞게 Key 사용 여부를 파악하고, AllowManageOwnAccessKeys/AllowManageOwnSigningCertificates/AllowManageOwnSSHPublicKeys/AllowManageOwnGitCredentials 중 필요한 Statement만 추가
지금까지 들어간 프로젝트에서는 주로 AllowManageOwnAccessKeys가 필요했고, 가끔씩 AllowManageOwnGitCredentials도 필요했다. 다른 Key는 사용한적 없다. 최소 권한 부여 원칙을 만족시키기 위해 각 프로젝트에서 무엇을 필요로하는지 파악하고 필요한 부분만 넣는 것이 좋다.
우선은 각 Statement를 다 넣어주긴했다.
## 현업에 맞게 수정
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowViewAccountInfo",
"Effect": "Allow",
"Action": [
"iam:GetAccountPasswordPolicy",
"iam:ListVirtualMFADevices",
"iam:GetAccountSummary",
"iam:ListAccountAliases"
],
"Resource": "*"
},
{
"Sid": "AllowManageOwnPasswords",
"Effect": "Allow",
"Action": [
"iam:ChangePassword",
"iam:GetUser"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "AllowManageOwnAccessKeys",
"Effect": "Allow",
"Action": [
"iam:CreateAccessKey",
"iam:DeleteAccessKey",
"iam:ListAccessKeys",
"iam:UpdateAccessKey",
"iam:GetAccessKeyLastUsed"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "AllowManageOwnSigningCertificates",
"Effect": "Allow",
"Action": [
"iam:DeleteSigningCertificate",
"iam:ListSigningCertificates",
"iam:UpdateSigningCertificate",
"iam:UploadSigningCertificate"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "AllowManageOwnSSHPublicKeys",
"Effect": "Allow",
"Action": [
"iam:DeleteSSHPublicKey",
"iam:GetSSHPublicKey",
"iam:ListSSHPublicKeys",
"iam:UpdateSSHPublicKey",
"iam:UploadSSHPublicKey"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "AllowManageOwnGitCredentials",
"Effect": "Allow",
"Action": [
"iam:CreateServiceSpecificCredential",
"iam:DeleteServiceSpecificCredential",
"iam:ListServiceSpecificCredentials",
"iam:ResetServiceSpecificCredential",
"iam:UpdateServiceSpecificCredential"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "AllowManageOwnVirtualMFADevice",
"Effect": "Allow",
"Action": [
"iam:CreateVirtualMFADevice",
"iam:DeleteVirtualMFADevice"
],
"Resource": "arn:aws:iam::*:mfa/${aws:username}"
},
{
"Sid": "AllowManageOwnUserMFA",
"Effect": "Allow",
"Action": [
"iam:DeactivateMFADevice",
"iam:EnableMFADevice",
"iam:ListMFADevices",
"iam:ResyncMFADevice"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "etc",
"Effect": "Allow",
"Action": [
"iam:GetLoginProfile"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "DenyAllExceptListedIfNoMFA",
"Effect": "Deny",
"NotAction": [
"iam:CreateVirtualMFADevice",
"iam:EnableMFADevice",
"iam:GetUser",
"iam:ListMFADevices",
"iam:ListVirtualMFADevices",
"iam:ResyncMFADevice",
"sts:GetSessionToken",
"iam:ChangePassword",
"iam:GetAccountPasswordPolicy"
],
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
}
]
}
오늘은 여기까지
반응형
'AWS > IAM' 카테고리의 다른 글
AWS IAM 유효 기간 제한 정책 (0) | 2024.10.07 |
---|---|
AWS IAM Region 제한 정책 (0) | 2024.03.11 |
현업에서 사용하는 AWS IAM IP 제한 정책 (0) | 2024.03.11 |