본문 바로가기

Infra/AWS

[AWS/Spring boot] Amazon Linux2에 Spring boot project Docker 배포하기[1] - IAM User생성 및 MFA 적용

ECS, EKS 처럼 컨테이너 서비스를 지원하는 AWS 서비스가 있지만,

오늘은 EC2에 직접 Docker를 설치하고 spring boot project 를 배포하려고 한다!

VPC 구성은 다음과 같다.

인터넷 통신을 위한 IGW

로드밸런서는 ALB

private EC2 접속을 위한 bastion host

실제 프로젝트를 배포할 private EC2

그리고 도커 이미지를 저장할 ECR 서비스

private instance에 도커를 설치해야하기 때문에 NAT gateway가 필요하다.

또, ALB는 최소 두 서브넷의 두개의 Public az를 설정해야하기 때문에 빈 서브넷 두개를 더 추가할 것이다.

이 추가된 서브넷은 추후 ALB 생성 전에 구축할 예정이다.

 

우선 사전 조건은 다음과 같다.

IntelliJ 사용(크게 상관 없음)

AWS 계정이 MFA 설정 되어있음(크게 상관 없음, 권장사항이니 일단 설정 해두고 하는 것을 추천)

 

과정은 다음과 같이 진행된다.

IAM USER 생성 후 MFA 적용 
VPC 구축 및 ALB 생성
Spring boot project 빌드 후 ECR push
bastion host 를 통해 접속 후 docker 설치 및 배포

 

 

이번 포스팅은

IAM USER 생성 후 MFA 적용 이다 :)

IAM USER 생성

AWS는 루트계정이 아닌 user를 생성하고 권한할당을 통해 서비스를 이용하는 것을 권장한다. 심지어 admin에게도 admin user를 생성하라고 한다. 이때 자주 언급되는 것이 "최소권한의원칙"인데, 이 포스팅에서 필요한 권한을 정리해보면

VPC Full access
EC2 Full access
ECR Full access
LB Full access

이정도면 되지 않을까 싶다. 이대로 IAM USER를 생성해본다.

 

 

1. 루트계정으로 로그인하여 My Security Credentials > Users로 들어가서 Add User버튼을 누른다

사용자 이름, Access type은 둘다 체크해주고 아래 사항은 자유롭게 한다.

 

2. Set permissons에서 각 사용자가 필요한 권한을 할당해준다. 정책을 직접 할당할 수도, 다른 사용자의 권한을 몽땅 가져와서 붙일 수도 있지만, "그룹"을 생성하고 그 그룹에 "정책"을 할당하여 사용자를 그룹에 속하게 하는 것을 권장한다.

 

create group을 클릭하고 위에서 정리한 권한을 검색해서 넣어준다.

 

거기에 추가로, 우리 사전조건을 보면

AWS 계정이 MFA 설정 되어있음(크게 상관 없음, 권장사항이니 일단 설정 해두고 하는 것을 추천)

이런 것이 있는데, 루트 계정에서 생성한 사용자가 MFA를 적용하지 않으면 아무 기능도 수행할 수 없도록 하나의 정책을 추가해준다.

이 정책은 직접 등록해주어야한다. 새창을 켜고 Policy 탭에 가서 다음 정책을 생성한다(json)(https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/tutorial_users-self-manage-mfa-and-creds.html)

{
   "Version": "2012-10-17",
   "Statement": [
      {
           "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",
               "sts:GetSessionToken"
          ],
           "Resource": "*",
           "Condition": {
               "BoolIfExists": {
                   "aws:MultiFactorAuthPresent": "false"
              }
          }
      }
  ]
}

 

3. 다시 원래 생성했던 그룹으로 돌아가 방금 생성한 MFA force 정책을 추가한다.

이제 사용자 추가 탭으로 돌아가서 해당 그룹에 사용자를 추가시켜주면 된다.

 

 

4. 그 다음은 쭉쭉 넘기고 나면 다음과 같은 화면이 뜬다.

여기에서 알려주는 secret access key는 다시 확인할 수 없으므로 잘 보관한다(csv다운로드 꼭!).

그 옆의 password는 사용자 생성 첫 페이지에서 임의로 패스워드를 지정해주도록 설정했기 때문에 나오는 것이다.

제대로 생성되었나 확인하기 위해 다시 로그인해본다.

 

 

5. 위에서 다운로드 한 csv파일을 열면 Console login link가 있는데, 이 링크를 누르면 로그인 페이지가 나온다.

로그인에 성공하면 패스워드를 변경하라는 창이 나온다.

User 추가할 때 지정해주어서 그런다. 편한 비밀변호(는 힘들게 조건이 좀 까다롭다.)로 변경한다.

 

 

6. 서울리전으로 옮긴 뒤 EC2를 이동한다.

막 이런 화면이 나온다. 분명 EC2 FullAccess 권한을 줬는데?

당황하지 말고,

루트 계정에서 생성한 사용자가 MFA를 적용하지 않으면 아무 기능도 수행할 수 없도록 하나의 정책을 추가해준다.

 

force_MFA 정책때문에 그렇다.

 

MFA란 Multi Factor Authentication의 약자이다.

 

현재 사용하고 있는 피씨 로그인 인증방식과 더불어 다른 인증 방식도 함께 적용하여 보안을 높이겠다는데 목적을 둔다.

우리는 디바이스(현 컴퓨터)기반 MFA를 적용시킬 것이고 크롬 확장프로그램 중

이것을 사용할 것인다. 설치하고 주소창 옆에 아래 아이콘이 뜨는지 확인해보자.

 

7. My Security Credentials > Dashboard의 Multi-factor authentication (MFA) 단락의 Assign MFA device를 클릭한다.

 

디바이스 기반 MFA라고 했으니 Virtual MFA device를 클릭하고 Continue,

 

 

8. 2번의 Show secret key를 클릭하고 복사하고 방금 설치한 Authenticator 확장 프로그램을 클릭한다.

우측 상단 연필 버튼을 누르면 추가할 수 있는 + 버튼이 보이고 이것을 클릭한 뒤 Manual Entiry를 선택한다.

Account Name은 자유롭게, Secret엔 아까 복사한 secret key 를 넣는다. 이 키는 다른 디바이스에 MFA를 적용할 때 또 쓸 수 있다.

 

 

9. 생긴 6자리 숫자를 MFA device 3번 MFA code1에 입력하고, 몇초 뒤 갱신되는 코드를 code2에 입력한다.

 

10. 재로그인 할 때 MFA 코드를 입력해야하고 다시 EC2 서비스를 접속해본다.

 

정상적으로 서비스 접근에 성공했다!

 

VPC 구축 포스팅이 또 이~만큼 있을 것 같아서 1차 포스팅은 여기까지한다!

시간이 좀 오래걸리지 어려운 내용은 아니라 얼른얼른 해버리고 싶은데 바빠 너뮤바빠 ,, : (