AWS IAM (Identity and Access Management)은 AWS 서비스 및 리소스에 대한 액세스를 관리하는 데 사용되는 서비스입니다.
사용자 관리를 효과적으로 하기 위해서는 역할에 기반을 둔 사용자 그룹을 생성하고 여기에 적절한 권한(Policy)을 부여한 뒤 사용자를 추가 하는 것이 좋습니다.
여기서는 사용자 그룹, 그룹 정책 할당, 사용자 추가 및 MFA 할당과 패스워드 규칙 적용 등을 살펴보고 Matrix 를 통한 효과적인 IAM 관리 방법을 소개 합니다.
사용자 그룹 만들기
AWS 관리 콘솔 > IAM 대시보드 > 그룹
을 선택하고 그룹 만들기
버튼을 클릭하면 사용자 그룹을 생성 할 수 있습니다.
아래와 같이 사용자 그룹명을 입력하여 생성할 수 있으며 생성 단계에서 사용자 (맴버쉽) 추가 와 액세스 권한 (Policy) 를 옵션으로 추가할수 있습니다.
하단의 “Create Group” 버튼을 클릭하면 사용자 그룹이 생성 됩니다.
사용자 그룹에 사용자 (Membership) 추가
사용자 그룹 상세 화면에서 Add users
버튼을 클릭 하면 아래와 같이 사용자를 추가할 수 있는 화면이 열립니다.
여기에서 사용자를 검색 후 사용자를 선택 후 Add users
버튼을 통해 맴버쉽 추가를 할수 있습니다.
사용자 그룹에 권한 (Policy) 할당
사용자 그룹 상세 화면에서 Add permissions > Attach policies
버튼을 클릭 하면 아래와 같이 액세스 권한(Policy)를 추가할 수 있는 화면이 열립니다.
여기에서 필요한 권한(Policy)를 검색 및 선택 하고 화면 하단의 “Add permissions” 버튼을 클릭하면 액세스 권한을 추가 할수 있습니다.
MFA 사용 설정
사용자 생성시 MFA 사용 설정을 활성화 하여 보안을 강화 하는 것이 좋습니다.
다음과 같이 특정 사용자를 생성 했다면 해당 사용자는 사용자 상세 화면에서 Security credentials > Multi-factor authentication (MFA)
메뉴의 Assign MFA devices
를 클릭하여 MFA 가상 디바이스를 할당 할 수 있습니다.
아래 화면과 같이 Device Name 을 입력 후 Authenticator app 을 선택 후 Next
버튼을 클릭 합니다.
중요] Device Name 이름은 사용자 이름과 일치하는 것이 좋습니다.
사용자 이름이 scott@sample.com
이라고 한다면 Device Name 역시 동일하게 scott@sample.com
으로 입력 합니다.
위 그림과 같이 QR 코드를 스캔하면 MFA code(토큰) 이 6자리 숫자로 보여 지게 되고,
2 개의 토큰을 차례대로 기입 하고 하단의 Add MFA
버튼을 통해 MFA 디바이스를 할당 할 수 있습니다.
비밀번호 정책 설정
IAM 대시보드에서 “Account Settings”을 선택하고 ‘Password policy’ 항목을 편집 하면 새로운 비밀번호 정책을 작성합니다.
이를 통해 최소한의 길이, 대문자와 소문자, 특수 문자, 숫자, 비밀번호 만료 기간 중복된 비밀번호 사용 금지 등 보다 강화된 비밀번호 정책을 적용 할 수 있습니다. 등이 포함될 수 있습니다.
주기적인 감사
AWS IAM 은 주기적인 감사를 통해 보안 위반 여부를 확인하고 보안 정책을 준수하는지 확인해야 합니다.
1. IAM 사용자 및 그룹 검토
- 모든 사용자 및 그룹에 대해 사용자 및 그룹이 필요한지 여부를 확인하고 필요하지 않은 사용자나 그룹을 삭제합니다.
- 그룹에 사용자가 포함되어 있는지 확인하고 필요하지 않은 사용자를 삭제합니다.
- 그룹 및 사용자에게 부여된 권한을 확인하고 필요 없는 권한을 제거합니다.
2. IAM 정책 검토
- IAM 대시보드에서 모든 인라인 정책 및 연결된 정책을 검토 하여 필요하지 않은 정책을 삭제하거나 수정합니다.
- 모든 정책이 최신 상태인지 확인합니다.
3. IAM 액세스 로그 검토
IAM 액세스 로그는 AWS CloudTrail 서비스를 사용하여 확인 할 수 있습니다.
- CloudTrail 대시보드는 로그인 이벤트, 권한 부여 이벤트, 암호 재설정 이벤트 등을 확인 할 수 있습니다.
- CloudTrail 로그에서 이상한 활동이나 보안 위반이 있는지 확인합니다.
4. MFA(Multi-Factor Authentication) 사용 검토
- IAM 대시보드에서 모든 사용자의 MFA 사용 여부를 검토합니다.
- 모든 사용자가 MFA를 사용하도록 정책을 통해 강제할 수 있습니다.
- MFA를 사용하지 않는 사용자에 대한 조치를 취합니다.
5. 비밀번호 정책 검토
- IAM 대시보드에서 비밀번호 정책을 검토합니다.
- 정책이 최신 상태이며, 보안 정책을 준수하는지 확인합니다.
- 필요에 따라 비밀번호 정책을 수정하고 사용자에게 알립니다.
IAM 관리를 위한 모범 사례
우리는 사용자 그룹 관련된 주요 리소스를 생성하고 간단하게 구성 하는 것을 살펴보았습니다.
여기서는 Matrix 를 통해 Admin, Developer, DBA, SysAdm, Viewer 과 같은 사용자 그룹을 만들고 여기에 적절한 액세스 정책과 사용자를 할당하는 전략을 살펴보도록 하겠습니다.
사용자 현황 Matrix
사용자 액세스 권한을 관리하는 Matrix를 정의하면 사용자 및 액세스 정책을 보다 체계적으로 관리할 수 있습니다.
User | Admin | Developer | DBA | Viewer | SysAdm | MFA |
---|---|---|---|---|---|---|
admin@demoasacode.io | Y | Y | ||||
manager@demoasacode.io | Y | Y | ||||
lamp@demoasacode.io | Y | Y | Y | |||
symple@demoasacode.io | Y | Y | ||||
devapple@demoasacode.io | Y | Y | Y | |||
scott@demoasacode.io | Y | Y | ||||
tiger@demoasacode.io | Y | |||||
banana@demoasacode.io | Y | Y | ||||
melon@demoasacode.io | Y | Y | ||||
car@demoasacode.io | Y | Y | Y | Y | ||
bicycle@demoasacode.io | Y | Y | Y |
액세스 정책 Matrix
사용자 그룹의 역할에 적합한 액세스 정책(Policy) 관리 또한 다음과 같이 Matrix를 정의하면 효과적으로 관리할 수 있습니다.
Policies | Admin | Developer | DBA | SysAdm | Viewer |
---|---|---|---|---|---|
AdministratorAccess | Y | ||||
AWSCertificateManagerFullAccess | Y | ||||
AmazonRoute53FullAccess | Y | Y | |||
AmazonRoute53ReadOnlyAccess | Y | ||||
ReadOnlyAccess | Y | ||||
AmazonRDSFullAccess | Y | Y | |||
AmazonRDSReadOnlyAccess | Y | ||||
AmazonRedshiftFullAccess | Y | ||||
AmazonRedshiftReadOnlyAccess | Y | ||||
AmazonDynamoDBFullAccess | Y | Y | |||
AmazonDynamoDBReadOnlyAccess | Y | ||||
AmazonElastiCacheFullAccess | Y | ||||
AmazonElastiCacheReadOnlyAccess | Y | ||||
AmazonAPIGatewayAdministrator | Y | ||||
AmazonAPIGatewayReadOnlyAccess | Y | ||||
AmazonMQFullAccess | Y | ||||
AmazonMQReadOnlyAccess | Y | ||||
AWSBatchServiceRole | Y | Y | |||
AWSBatchFullAccess | Y | Y | |||
CloudWatchFullAccess | Y | ||||
CloudWatchReadOnlyAccess | Y | Y | |||
CloudWatchLogsFullAccess | Y | ||||
CloudWatchLogsReadOnlyAccess | Y | Y | |||
AmazonEC2FullAccess | Y | ||||
AmazonEC2ReadOnlyAccess | Y | Y | |||
AmazonECS_FullAccess | Y | ||||
AmazonS3FullAccess | Y | ||||
AmazonS3ReadOnlyAccess | Y | Y | |||
AWSCodeDeployFullAccess | Y | ||||
AWSCodeDeployReadOnlyAccess | Y | Y | |||
AWSLambda_FullAccess | Y | ||||
AWSLambda_ReadOnlyAccess | Y | Y | |||
AmazonEventBridgeFullAccess | Y | ||||
AmazonEventBridgeReadOnlyAccess | Y | Y | |||
AmazonAthenaFullAccess | Y | ||||
AmazonEMRFullAccessPolicy_v2 | Y | ||||
AmazonEMRReadOnlyAccessPolicy_v2 | Y | ||||
AWSCloudFormationFullAccess | Y | ||||
DenyIPAddressPolicy | Y | Y | Y | Y | Y |
MFAForcePolicy | Y | Y | Y | Y | Y |
DenyDataPipelinePolicy | Y | Y | Y | ||
DenyRDSLargeCreationPolicy | Y | Y |
AWS 관리형 정책 뿐 아니라 관리를 위해 별도의 Custom 정책을 생성하는 경우 리소스 identifier 를 지정하면 보다 효과적으로 관리 할 수 있습니다.
Custom 액세스 정책
AWS IAM 을 세밀하고 효과적으로 관리하기 위해선 사용자 관리형(Customer managed) 정책을 생성하고 적용 하는것이 좋습니다.
AWS 클라우드 운영에 꼭 필요한 사용자 관리형(Customer managed) 정책을 소개할까 합니다.
DenyIPAddress
AWS 클라우드의 액세스를 특정 IP 대역만 접근 하도록 설정 할 수 있습니다.
예를 들어 회사 네트워크의 NAT 아이피 또는 몇몇 VPN 네트워크에 대해서만 접근을 설정 할 수 있습니다.
회사 네트워크의 NAT 아이피 대역이 192.0.2.0/24
이고 VPN 네트워크 대역이 203.0.113.0/24
이라면 여기에 정의된 아이피를 제외한 모든 접근을 거부하는 DenyIPAddress 정책은 다음과 같습니다.
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"192.0.2.0/24",
"203.0.113.0/24"
]
},
"Bool": {"aws:ViaAWSService": "false"}
}
}
}
MFAForcePolicy
MFA 인증을 하지 않은 사용자에 대해서 AWS 액세스를 거부 하도록 할 수 있습니다.
주요한 Statement 로
AllowUserToCreateVirtualMFADevice
은 로그인한 사용자만이 MFA 가상 디바이스를 생성할 수 있습니다.
BlockMostAccessUnlessSignedInWithMFA
은 MFA 인증을 하지 않은 사용자는 NotAction 에 포함된 엑션을 제외한 모든 엑션이 Deny 됩니다.
AllowUserToManageTheirOwnMFA
은 로그인한 사용자는 MFA 가상 디바이스를 조회하고, 활성화 하고, 다시 동기화를 할 수 있습니다.
AllowUserToDeleteTheirOwnMFAOnlyWhenUsingMFA
과 AllowUserToDeactivateTheirOwnMFAOnlyWhenUsingMFA
은 MFA 를 통해 로그인한 사용자에 한하여 MFA 가상 디바이스를 비활성화 하고 삭제 할 수 있습니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowListActions",
"Effect": "Allow",
"Action": [
"iam:ListUsers",
"iam:ListVirtualMFADevices"
],
"Resource": "*"
},
{
"Sid": "AllowUserToCreateVirtualMFADevice",
"Effect": "Allow",
"Action": [
"iam:CreateVirtualMFADevice"
],
"Resource": [
"arn:aws:iam::*:mfa/*",
"arn:aws:iam::*:user/${aws:username}"
]
},
{
"Sid": "AllowUserToManageTheirOwnMFA",
"Effect": "Allow",
"Action": [
"iam:ListMFADevices",
"iam:EnableMFADevice",
"iam:ResyncMFADevice"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "AllowUserToDeleteTheirOwnMFAOnlyWhenUsingMFA",
"Effect": "Allow",
"Action": [
"iam:DeleteVirtualMFADevice"
],
"Resource": [
"arn:aws:iam::*:user/${aws:username}"
],
"Condition": {
"Bool": {
"aws:MultiFactorAuthPresent": "true"
}
}
},
{
"Sid": "AllowUserToDeactivateTheirOwnMFAOnlyWhenUsingMFA",
"Effect": "Allow",
"Action": [
"iam:DeactivateMFADevice"
],
"Resource": [
"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"
}
}
}
]
}
DenyEC2StopAndTerminationMFAPolicy
MFA 로 로그인 하지 않은 사용자에 대해서 EC2 인스턴스를 중지하거나 삭제 하는것을 거부할 수 있습니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyStopAndTerminateWhenMFAIsNotPresent",
"Effect": "Deny",
"Action": [
"ec2:StopInstances",
"ec2:TerminateInstances"
],
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": false
}
}
}
]
}
AWS Example policies 예제를 참고하면 보다 체계적이고 강화된 정책을 구성 할 수 있습니다.
IAM 식별자(identifier) 를 통한 정책 관리
IAM 식별자 는 사용자, 사용자 그룹, 역할, 정책 및 서버 인증서에 효과적으로 분류하는 기능을 합니다.
액세스 정책(Policy)을 예를 들면 service-role, aws-service-role, job-function 과 같은 identifier 로 AWS 관리형 정책의 Baseline 을 확인할 수 있습니다.
고객 역시 사용자 관리형 정책의 Baseline 을 위한 사용자 특화된 식별자(identifier) 를 정의할 수 있습니다.
사용자 관리형 정책 Baseline 의 식별자(identifier)로 /foundation
으로 DenyIPAddressPolicy
, MFAForcePolicy
와 DenyEC2StopAndTerminationMFAPolicy
정책을 생성 한다면, 사용자 관리형 정책의 ARN 은 다음과 같습니다.
arn:aws:iam::111111111:policy/foundation/DenyIPAddressPolicy
arn:aws:iam::111111111:policy/foundation/MFAForcePolicy
arn:aws:iam::111111111:policy/foundation/DenyEC2StopAndTerminationMFAPolicy
아래는 특정 식별자(identifier) 로 분류된 정책들을 조회 할 수 있는 예시 입니다.
자동화
우리는 IAM 사용자 그룹, 사용자 그리고 정책을 어떻게 구성하면 좋은지 살펴 보았습니다.
하지만 주기적인 감사
에 대해서 우기가 직접 AWS 관리 콘솔에 로그인 하고 AWS 리소스를 일일이 살펴본다면 너무 피로하고 시간이 오래 걸리는 작업일 것입니다.
AWS 는 몇몇 핵심 서비스를 통해 자동화된 방법으로 주기적인 감사
를 진행 합니다.
CloudTrail
CloudTrail 은 AWS의 모든 리소스에 대해서 변경한 내역에 대한 로깅 서비스입니다.
AWS 리소스의 변경 내역을 추적하는 데 편리할 뿐만아니라 이를 통해 보안, 규정 준수, 운영 문제 해결 및 사건 대응 등에 도움이 됩니다.
AWS Config
AWS Config는 AWS 리소스 구성을 추적하고 모니터링하여 이를 이용해 리소스 구성 변경 사항을 평가하고, 리소스 구성 준수 및 보안 준수를 검사할 수 있는 서비스입니다.
AWS Config는 지속적으로 AWS 리소스의 구성을 추적하고, 변경 사항을 검사하여 리소스 구성 준수 및 보안 준수를 유지할 수 있도록 도와주는 서비스입니다.
AWS Config 의 관리형 Rule 을 살펴보면 IAM 관련해서도 아래와 같이 주요한 Rule 을 확인할 수 있습니다.
Access Analyzer
Access Analyzer AWS 리소스에 대한 엑세스 권한 부여 시 발생할 수 있는 잠재적인 액세스 접근 관련 보안 위협을 식별하고, 수정할 수 있는 서비스입니다.
예를 들어, S3 버킷을 위한 정책을 생성 했다고 가정하면 이 정책으로 어떤 클라이언트 또는 리소스가 접근하고 어떤 엑션을 수행할 수 있는지 가시적으로 보여주고 보완 할 수 있도록 도와 줍니다.
또한 IAM Access Analyzer Policy Validation 은 IAM 정책 구성시 리소스의 ARN 오류나 속성 값 또는 과도한 액세스 권한에 대해서 보완할 것을 권고 합니다.
Terraform IAM User Group 모듈
위에서 정의한 사용자 그룹, 맴버쉽 및 액세스 정책 관리를 tfmodule-aws-iam-user 테라폼 프로젝트를 이용하면 보다 쉽고 자동화된 방식으로 할 수 있습니다.
Conclusion
IAM 을 사용하여 AWS 서비스 및 리소스에 대한 액세스를 관리하는 것은 보안에 중요한 역할을 합니다.
IAM을 효과적으로 사용하려면 위에서 설명 것과 같이 IAM을 계획하고 이를통해 보다 가시적으로 살펴볼 수 있도록 함으로써 예측 가능한 범주로 제어할 수 있는것이 중요합니다.
그리고 자동화된 방식으로 IAM 액세스 내역을 지속적으로 감사 및 모니터링 함으로써 쉽고 강력하게 클라우드 서비스를 보호합시다.