개요
평소 AWS를 사용할 때 MFA 활성화된 계정은 콘솔에서만 사용하고, 서버나 EC2에서 AWS CLI를 사용할 때는 별도의 액세스 키나 IAM Role에 권한을 부여받아 사용해왔다.
다만 테스트 시 MFA 활성화 사용자로 AWS CLI를 사용하는 방법을 알게 되어 직접 적용해보았다.
사용자 생성
1. 사용자 생성
생성한 사용자에게는 간단히 권한을 확인하기 좋은 AmazonS3FullAccess나 AmazonEC2FullAccess 권한을 부여한다. AWS CLI를 사용할 것이기 때문에 액세스 키도 생성한다.
2. 권한 확인
생성한 사용자가 S3 서비스를 이용할 수 있는지 CLI로 확인해본다.
aws configure --profile mfa
aws s3 ls --profile mfa
MFA 인증 요구 정책 적용
MFA를 사용하지 않는 사용자의 AWS 작업 제한 정책을 적용한다. 적용한 정책은 AWS: MFA 인증 IAM 사용자가 내 보안 자격 증명(My security credentials) 페이지에서 자신의 보안 인증을 관리할 수 있도록 허용에 안내되어 있다.
적용 정책
{
"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"
],
"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:ListMFADevices",
"iam:ListVirtualMFADevices",
"iam:ResyncMFADevice",
"sts:GetSessionToken"
],
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
}
]
}
정책을 적용한 후 S3 서비스 접근에 정상적으로 제한되었는지 확인한다.
AWS CLI로 MFA 인증
AWS CLI를 이용한 MFA 인증 작업을 진행한다.
1. 사용자에 MFA 할당
MFA 디바이스 할당 버튼을 클릭하여 할당 과정을 진행한다.
2. 임시 자격 증명 정보 확인
aws sts get-session-token 명령과 할당한 MFA의 ARN과 MFA 코드를 이용해 임시 자격 증명 정보를 취득한다.
aws sts get-session-token \
--profile <USER> \
--serial-number <MFA ARN> \
--token-code <CODE>
# 예시
aws sts get-session-token \
--profile mfa \
--serial-number arn:aws:iam::639624180000:mfa/mfa_test \
--token-code 111111
출력은 아래와 같다. 취득한 정보는 기본적으로 12시간 동안 유효하다. 임시 자격 증명 정보 취득 시 --duration-seconds 옵션으로 만료 기간을 15분 ~ 36시간 범위로 지정할 수도 있다. 루트 사용자인 경우에는 1시간까지 지정할 수 있다.
{
"Credentials": {
"AccessKeyId": "임시 액세스 키",
"SecretAccessKey": "임시 시크릿 키",
"SessionToken": "임시 토큰 값",
"Expiration": "만료 시각"
}
}
3. 임시 자격 증명 설정
확인한 임시 자격 증명 정보는 LINUX 환경 변수로 설정하거나, aws profile로 등록하여 사용할 수 있다. 이 글에서는 환경 변수로 선언하여 사용해 본다.
export AWS_ACCESS_KEY_ID=example-access-key-as-in-previous-output
export AWS_SECRET_ACCESS_KEY=example-secret-access-key-as-in-previous-output
export AWS_SESSION_TOKEN=example-session-token-as-in-previous-output
4. 권한 확인
임시 자격 증명 정보로 S3 접근이 가능한지 확인한다.
참고 문서
[AWS] IAM User에 MFA 활성화 시 CLI 적용방법
https://aws.amazon.com/ko/premiumsupport/knowledge-center/authenticate-mfa-cli/
AWS: MFA 인증 IAM 사용자가 내 보안 자격 증명(My security credentials) 페이지에서 자신의 보안 인증을 관리할 수 있도록 허용