아키텍쳐/Cloud

맥에서 AWS STS + CodeCommit 사용하기

gnidoc 2021. 2. 1. 20:40
반응형

이 글은 맥북에서 테스트하고 작성된 글입니다

윈도우는 다를 수도 있습니다

 

AWS STS란?

AWS Security Token Service의 준말이다.

쉽게 말하자면 임시 보안 자격 증명으로 AWS 리소스에 대한 액세스를 제어하는 것이고

코드레벨로 말하자면 Access/Secret Key을 그대로 쓰는것이 아니라 MFA와 함께 사용하여
임시 Access/Secret key으로 AWSCLI를 사용하는 것이다

즉, 임시토큰이라고 보면 된다

 

STS / MFA는 왜쓰는가?

보통 회사계정은 iam user 에 대해서 MFA를 강제로라도 사용하게끔 한다
(설정하는법 : docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/tutorial_users-self-manage-mfa-and-creds.html#tutorial_mfa_step1)

왜냐? MFA를 사용하지 않고 그냥 사용한다면
혹시나 Access/Secret Key가 유출될 경우, 아래와 같이 으마으마한 일이 발생한다

blog.naver.com/awesomedev/220716804533

 

AWS 해킹 당한 경험담과 과금 대처 가이드 라인

안녕하세요 초보 개발자 덕명동남자 입니다. 이번 한 주 정말 다사다난했던 한 주 였던 것 같습니다. 여러...

blog.naver.com

 

MFA를 쓰면 아래 이미지처럼 콘솔에 로그인할때 30초마다 갱신되는 코드값을 입력을 해야되므로 보안이 한단계 올라간다

로그인 하기 마지막에 6자리를 입력해야됨

근데 여기서 문제는 무엇이냐...

바로 AWSCLI를 쓸때도 위와 같이 토큰을 입력해줘야된다는 것이다

AWS계정의 인프라를 담당하는 담당자라면 매일 이 토큰을 입력해야되는 매우 귀찮은일을 해야된다

그게 나야 두비두밤

하지만 터미널에서 이런 인증 방식을 웹처럼 따로 로그인 페이지에 접속할 수 없으니

STS를 사용해서 임시토큰 생성하여 인증관리를 한다

 

AWSCLI사용법

AWSCLI 설치는 쉽다. 그냥 여기 링크에서 본인 OS에 맞게 다운받아서 설치하면 된다

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/install-cliv2.html

 

AWS CLI 버전 2 설치, 업데이트 및 제거 - AWS Command Line Interface

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

그리고 aws configure로 자기 Access/Secret Key를 입력해주면 되는데

STS를 사용할거기 때문에 default 프로파일이 아닌 별도의 프로파일로 생성해야된다

난 test 라는 이름으로 프로파일을 생성했다

test 프로파일 생성
~/.aws/credentails 에서 확인 가능

왜 굳이 default 프로파일을 안썼는지는 후술하겠다

 

STS설정법(정석)

당연히 STS도 설정하는 가이드가 있다

https://aws.amazon.com/ko/premiumsupport/knowledge-center/authenticate-mfa-cli/

 

MFA를 사용하여 AWS CLI에 대한 액세스 인증

참고: sts get-session-token 명령에서 -duration-seconds 옵션을 사용하여 만료 기간(초)을 지정할 수 있습니다. 이 값의 범위는 900초(15분)~129,600초(36시간)입니다. 루트 사용자 자격 증명을 사용하는 경우

aws.amazon.com

하지만 보통 이걸 쓰지 않는다

왜냐하면, 아래 가이드를 보면 터미널에서 뜨는 토큰값을 수작업으로
환경변수로 넣어주거나 별도의 스크립트를 짜야되기 때문이다

윈도우에서 하라고 하면 터미널 때문에 ㄹㅇ 고통이다

그래서 요즘은 굳이 이 방식을 쓰지 않는다

오픈소스로 이걸 자동화해주는 녀석이 널렸기 때문에 직접하지 않고 라이브러리의 힘을 빌린다

 

STS설정법(AWSMFA 사용)

오픈소스치고 많이 사용하진 않지만, 난 이 패키지가 직관적이라서 애용하고 있다

github.com/dcoker/awsmfa

 

dcoker/awsmfa

awsmfa eases AWS multi-factor authentication for developers. - dcoker/awsmfa

github.com

사용법은 매우 간단하다

  • 설치(글로벌) : pip3 install awsmfa
  • 임시토큰 생성 : awsmfa --serial-number "MFA ARN값 입력" -i "전에 생성한 프로파일명" -t default -d 43200
    • ex) awsmfa --serial-number arn:aws:iam:1234512345:mfa/usernmae -i test -t default -d 43200

이러면 test 프로파일의 Access/Secret Key를 사용해서 default 라는 임시토큰용 프로파일을 생성한다

그래서 앞에서 굳이 default 프로파일을 사용하지 않은 이유가 바로 이것이다

만약 계정이나 iam user를 여러개 써야된다면 default 프로파일만 바꿔가면서 쓰면 되고

매번 AWSCLI 쓸때 기본 프로파일을 사용하므로 명령어에 프로파일명을 입력하지 않아도 된다

 

그러면 이제 우리가 할일은?

이 명령어를 profile에 alias 로 등록만 해주면 된다

나는 맥북을 쓰기 때문에 ~/.profile 에 아래와 같이 입력해놨다

alias ams='awsmfa --serial-number arn:aws:iam:1234512345:mfa/usernmae -i test -t default -d 43200'

이러면 이제 터미널에서 아래와 같이 사용 가능하다

콘솔에서 사용하던 MFA 6자리 코드 입력하면 됨

주의해야될 점은 MFA 코드값은 1회용이므로
콘솔에서 로그인할때 사용한 MFA 코드값을 STS인증할때 사용 못한다

둘 다 로그인이 필요하다면, 굳이 30초 정도를 기다려서 코드값 갱신 후에 사용해야된다

 

Code Commit

Code Commit은 쉽게 말하자면 코드 저장소이고 Github과 동일하다고 보면 된다

만약 위처럼 STS 인증을 했다면 프로파일정보인 iam user를 통해서 Code Commit을 사용할 수 있다

솔직히 불편한데, Code Series를 써야하거나 Github/BitBucket을 쓸 수 없는 상황이라면 좋은 선택이다

가격도 심지어 5명 + 50GB + Git 요청 1만개까지는 무료다
(가격 정보 : aws.amazon.com/ko/codecommit/pricing/)

 

그냥 Git 자격증명 쓰면 되는거 아닌가?

Code Commit 만 쓴다라고 하면 콘솔에서 GIt 자격증명만 만들어서 사용해도 문제없긴하다

docs.aws.amazon.com/ko_kr/codecommit/latest/userguide/setting-up-gc.html

 

Git 자격 증명을 사용하여 HTTPS 사용자 설정 - AWS CodeCommit

이때가 사용자 이름과 암호를 저장할 수 있는 유일한 기회입니다. 이 정보를 저장하지 않는 경우, 사용자 이름은 IAM 콘솔에서 복사할 수 있지만 암호는 찾을 수 없습니다. 그러므로 암호를 재설

docs.aws.amazon.com

하지만 보통 AWS를 쓴다면 개발자가 코드만 작성하는 것이 아니라 인프라도 관리해야되고

DevOps로 관리해야하는 경우가 많기 때문에 그냥 처음부터 STS설정해서 쓰는게 필요하다

 

SSH로 쓰면 되는거 아닌가?

그리고 이건 Code Commit을 쓰시는 분들에게 매번 듣는 질문이었는데....

"SSH로 접속이 안되는데 혹시 아시나요?"
docs.aws.amazon.com/ko_kr/codecommit/latest/userguide/setting-up-ssh-unixes.html

 

에서 AWS CodeCommit 리포지토리에 대한 SSH 연결을 위한 설정 단계Linux, macOS, or Unix - AWS CodeCommit

가 업로드된 SSH 키가 두 개 이상인 경우, 키는 업로드 날짜가 아니라 키 ID를 기준으로 영문자순으로 나열됩니다.IDs 올바른 업로드 날짜와 연결된 키 ID를 복사했는지 확인하십시오.

docs.aws.amazon.com

안타깝게도 SSH 사용자 방식의 경우, MFA를 사용하면 지원하지 않는다

가이드대로 따라해도 안되고 Code Commit과 통신은 되지만 git pull 요청을 하면 403 권한없음 에러가 발생한다

난 당연히 Github처럼 공개키만 등록하면 될 줄 알았는데 MFA방식의 경우, 이 기능을 지원하지 않는다

웃긴건 문서에 이게 안된다는 내용이 없어서 난 내가 못하는건 줄 알았는데 다행히? 아니었다

 

결국 그냥 STS를 쓰자

sts를 사용하면 알아서 git 자격증명을 iam user 로 사용해주고

AWSCLI도 쓸수있 수 있다

이젠 그냥 git clone "code commit url" 하면 알아서 다운 받아진다

아 물론 ssh가 아닌 https 방식만 사용 가능하다

 

이제 모두 해치웠나...? 응 403 에러~

개인적으로 맥북을 쓰다보니 겪었던 문제인데

윈도우도 그렇지만 맥북도 자체적으로 자격증명 관리 유틸 프로그램이 있는데

그게바로 keychain 이다

문제는 STS을 쓰면 이건 임시 암호인데 이게 keychain에 저장되면서
15분 후에는 STS를 통한 CodeCommit 사용이 불가능해진다

왜냐?
git에서 자격증명을 확인할때 STS 토큰값을 쓰는게 아니고
keychain을 통해서 git 자격증명을 확인하기 때문에
실제 git이 연결되는 세션이 만료되면 알아서 자격증명이 갱신되거나
애초에 세션이 유지되지 않게 해야되는데
CodeCommit의 사용환경이 특수하다보니 keychain은 그걸 알아주지 않는다

따라서 자격증명 헬퍼라는걸 사용해서
나는 keychain을 안쓰고 CodeCommit에서만 자격증명을 aws profile로 쓸 것이다라고 명시해줘야한다

그래서 하는 방법은 아래 링크를 따라하면 되고
여기서 중요한건 우리는 STS를 쓰기 때문에 프로파일명에 default을 넣어야한다

docs.aws.amazon.com/ko_kr/codecommit/latest/userguide/troubleshooting-ch.html#troubleshooting-macoshttps

 

자격 증명 헬퍼 및 AWS CodeCommit에 대한 HTTPS 연결 문제 해결 - AWS CodeCommit

여러 Git 프로필을 사용하는 경우 로컬 및 글로벌 .gitconfig 파일을 둘 다 가질 수 있습니다. 적합한 파일을 편집해야 합니다.

docs.aws.amazon.com

 

특이케이스

여기까지가 내가 팀 내부에 STS 및 Code Commit 사용에 대해 가이드를 할때 전달하는 내용인데

이게 참 또 신기한게 같은 맥북에서 똑같이 설정하고 하는데

3가지 안되는 케이스가 있었다

  • 맥북에서 포맷하고 처음 설정하는 경우

위에 403에러 발생시 조치 사항 중 1번에서 credential.helper=osxkeychain 이 검색이 안되는 경우가 있었다

포맷하고 처음 사용했을때 아마 git을 사용한적이 없어서 helper가 초기화가 안되지 않았을까란 추측이 든다

사용하다보니 STS 인증 후, 15분 뒤에 403에러가 발생하여 다시 조치하는 helper 문제였고

링크에 나온 방식을 그대로 따라하니 정상적으로 사용 가능했다

  • 맥북 터미널 시간이 빠른 경우

helper 설정을 안했고 helper=osxkeychain 인 상황에서 맥북 터미널의 시간이 현재시간보다 5분 빠른 경우가 있었다

원래라면 15분 뒤에 403에러가 발생해야되는데 이상하게 계속 사용할 수 있었다...

솔직히 팀원분이 안된다고 했을때 에러코드를 봤지만 이해할 수가 없었는데

어떻게 발견했냐면 팀원분이 AWSCLI로 Lambda 코드를 업데이트하려다가 5분이 빠르다는걸 알았다

맥북을 타임코스모스로 쓰시나...

  • credential 검색 관련

credential.helper=osxkeychain 를 찾기 위해서 아래 커맨드를 입력해야되는데

git config -l --show-origin | grep credential

검색이 되지 않고 15분 뒤에 403에러가 발생하는 경우가 있었다

당연히 403에러가 발생한 뒤에도 검색되지 않았는데

git config -l --show-origin

이걸 그대로 치고 터미널 상에서 검색했더니 있어서 주석처리해서 제거하니 정상적으로 동작했다...

이해할 수도 없고 알 수도 없지만 실제로 그랬다

회사 보안프로그램 문제인지... 참 이런 경우엔 진짜 너무 난감하다... ㅋㅋ

 

결론

되도록이면 STS를 통해서 프로파일을 git 자격증명으로 사용하고

credential helper 설정도 꼭 잊지말 것!

근데도 안된다...? 100% 본인(PC) 문제이다 ㅋㅋㅋㅋ

반응형