IAM의 보안 모범 사례
AWS에서는 IAM 보안을 위해 구성해야 할 여러가지 권장 요소를 보안 모범 사례로 제공하고 있다.
- 임시 보안 인증을 사용하여 AWS에 액세스하려면 인간 사용자가 ID 공급자와의 페더레이션을 사용하도록 요구합니다.
- AWS에 액세스하려면 워크로드에 IAM 역할이 있는 임시 자격 증명을 사용하도록 요구합니다.
- 다중 인증(MFA) 필요
- 장기 보안 인증이 필요한 사용 사례의 경우 정기적으로 액세스 키 교체
- 루트 사용자 보안 인증을 보호하고 일상적인 작업에 사용하지 마세요.
- 최소 권한 적용
- AWS 관리형 정책으로 시작하고 최소 권한을 향해 나아갑니다.
- IAM 액세스 분석기를 사용하여 액세스 활동을 기반으로 최소 권한 정책 생성
- 사용하지 않는 사용자, 역할, 권한, 정책 및 보안 인증은 정기적으로 검토하고 제거합니다.
- IAM 정책의 조건을 사용하여 액세스 추가 제한
- IAM Access Analyzer를 사용하여 리소스에 대한 퍼블릭 및 크로스 계정 액세스 확인
- IAM Access Analyzer를 사용하여 IAM 정책을 검증하여 안전하고 기능적인 권한을 보장합니다.
- 여러 계정에 권한 가드레일 설정
- 권한 경계를 사용하여 계정 내에서 권한 관리 위임
https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/best-practices.html#bp-users-federation-idp
위의 것들 중 실제로 간단하게 수행할 수 있는 방법을 몇 가지 테스트해보았다.
다중 인증(MFA) 필요
무차별 대입이나, 기타 여러 방법으로 패스워드 인증이 뚫릴 수 있기 때문에 패스워드 인증 하나 만으로는 보안 상 취약할 수 있다. AWS에서는 MFA(Multi-Factor Authentication)를 지원하고 있는데, IAM 정책을 통해서 MFA 사용을 강제하는 정책을 테스트하였다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowChangePassword",
"Effect": "Allow",
"Action": [
"iam:ChangePassword"
],
"Resource": [
"arn:aws:iam::*:user/${aws:username}"
]
},
{
"Sid": "AllowGetAccountPasswordPolicy",
"Effect": "Allow",
"Action": [
"iam:GetAccountPasswordPolicy"
],
"Resource": "*"
},
{
"Sid": "AllowViewAccountInfo",
"Effect": "Allow",
"Action": [
"iam:GetAccountPasswordPolicy",
"iam:GetAccountSummary",
"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"
],
"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": "DenyAllExceptListedIfNoMFA",
"Effect": "Deny",
"NotAction": [
"iam:CreateVirtualMFADevice",
"iam:EnableMFADevice",
"iam:GetUser",
"iam:ListMFADevices",
"iam:ListVirtualMFADevices",
"iam:ResyncMFADevice",
"iam:DeleteVirtualMFADevice",
"iam:ChangePassword",
"iam:GetAccountPasswordPolicy",
"sts:GetSessionToken"
],
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
}
]
}
위의 내용은 MFA가 적용되지 않으면, IAM의 제한적인 기능(MFA, 패스워드 변경 등)만 허용하는 정책이다.
여기서 주의해야 할 사항은 Condition의 BoolIfExists 조건이다. Bool 조건을 사용하는 경우가 종종 있는데, 이럴 경우 MFA를 사용하지 않고 AWS CLI 등을 사용할 경우 Bool 조건은 Condition이 없는 상태에 대해서는 통과시켜버린다.
참고자료
- [AWS] MFA 강제적용 정책 : https://junhyeong-jang.tistory.com/6
- https://repost.aws/knowledge-center/mfa-iam-user-aws-cli
IAM 정책의 조건을 사용하여 액세스 추가 제한
MFA 설정과 유사하게, IAM 정책에 Allow를 줄 때 Condition을 줘서 특정 조건에서의 접근만 허용하는 설정이다.
다양한 방법이 가능한데, 개인적으로 유용했던 것은 아래와 같이 특정 IP대역이나 서비스로 접근을 제한하는 설정이었다.
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"ec2:Describe*",
"s3:List*",
"iam:List*"
],
"Effect": "Deny",
"Resource": "*",
"Condition": {
"NotIpAddressIfExists": {
"aws:SourceIp": [
"xxx.xxx.xxx.xxx/32"
]
},
"BoolIfExists": {
"aws:ViaAWSService": "false"
}
}
}
]
}
위의 조건은 정책에 대한 호출이 특정 아이피(xxx.xxx.xxx.xxx/32)로 오거나, AWS 내부 리소스의 요청({"aws:ViaAWSService": "false"}) 일 때만 허용하는 정책이다.
보통 Deny-NotIpAddressIfExsists와 쓰거나 Allow-IpAddressIfExists를 써서 회사에서 사용하는 공인IP 통한 접근만 가능하게 권한을 통제하는 경우이다.
https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_aws_deny-ip.html
IAM 액세스 분석기를 사용하여 액세스 활동을 기반으로 최소 권한 정책 생성
IAM 보안의 기본 전제는 최소 권한 부여인데, 여러 사용자들과 함께 다양한 서비스를 사용하다 보면, 필요한 권한만 부여하는 것이 상당히 어렵다는 것을 느낄 수 있다. AWS에서는 사용자의 AWS 사용 이력(CloudTrail)을 기반으로 정책을 생성해주는 서비스를 제공한다.
IAM 서비스 화면에서 아래와 같이 IAM의 액세스 분석기를 생성할 수 있다.
IAM 액세스 분석기는 교차 계정 등 복잡한 IAM에 대한 권한 허용이 내가 의도한 것인지 아닌지 보고 판단할 수 있게 취합해서 알려준다.
해당 IAM 액세스 분석기와 CloudTrail을 같이 연동하면 특정 사용자가 일정 기간(최대 90일) 동안 수행한 AWS 작업을 기반으로 최소화 된 정책을 제시해준다.
선택한 리전과 기간을 바탕으로 CloudTrail 이벤트의 작업 이력을 분석하고 최소 권한의 정책을 제안해준다.
이런 식으로 약 3개월 가량 사용자가 실제로 사용하는 권한만 허용해줌으로써, 최소 권한 부여를 더 편리하게 수행할 수 있다.