서버 인프라/Azure

Azure cli에서 oauth2 없이 바로 로그인하기

트리맨스 2023. 4. 20. 00:10
반응형

 

현재 프로젝트에서 docker image안에 azure cil을 설치하고, 해당 프로그램에 인자로 key값을 받는 작업을 수행했다. azure는 aws와 다르게 cli로 로그인 하기 위해서는 거의 무조건 web으로 연결해야 하는 로직이 있었다. oauth2를 사용해서 보안 강화에 초점을 맞춘 것 같다. 여하튼 해당 플로우를 구현하기 위해서 방법을 찾아봤는데, aws와 다른점이 있어서 방법을 찾을때 약간 고생좀 했다.

 

구현하기


기존의 로그인 플로우를 확인하면 다음과 같다.

  1. az login 실행 (--use-device-code 도 비슷한 플로우)
  2. 웹사이트 오픈
  3. 로그인 인증 후 cli로 전환
  4. 로그인 완료

 

여기서 웹사이트를 오픈하는 과정 자체가 보안에는 좋을지 몰라도 사용성에서는 상당히 별로인 것 같아 보였다. 그래서 찾아보니 서비스 주체를 사용하여 로그인을 할 수 있다고 한다. 공식 문서에 따르면 다음 항목이 필요하다고 한다.

  • 서비스 주체와 연결된 URL 또는 이름
  • 서비스 주체 암호 또는 X509 인증서
  • 테넌트

 

이런 것들이 필요하다고 하는데, 사실 너무 복잡해서 따로 정리하는 편이 나아 보였다. 사진은 찍기 귀찮아서 그냥 말로 정리했다.

 

  1. 앱을 생성하자. portal에서 Active Directory -> 앱 등록 -> 새 등록 -> 앱 생성
  2. 앱의 암호를 생성하자 : 해당 앱 -> 인증서 및 암호 -> 암호 생성 (여기서 "값" 이라고 쓰인 곳이 암호이고, 해당 화면을 벗어나면 암호를 찾을 수 없으므로 다른 곳에 적어두자)
  3. 방금 만든 앱에 구독 권한을 추가하자 : portal -> 구독 -> 엑세스 제어 (IAM) -> 역할 할당 -> 역할 할당 추가
  4. 여기서는 특정한 세부 권한을 줄건지, 전체 권한을 줄 건지에 따라 다르다. 나의 경우에는 테스트용으로 전체 리소스에 엑세스 할 권한을 줄 것이다 : 권한 있는 관리자 역할 -> 소유자 -> 구성원에 방금 만든 app 추가 -> 할당
  5. azure cli에서 로그인하기

아래의 명령어에서 각 구성요소는 다음과 같고, 해당 값들은 앱 상세페이지에서 확인이 가능하다.

  • appId : 1 에서 만든 앱의 ID
  • password : 2에서 만든 암호 값
  • tenantId : 구독의 ID
az login --service-principal --username "appId" --password "password" --tenant "tenantId"

 

위의 값들을 docker image를 run 할때 외부 변수로 빼 두면, 이미지가 run 할때 특정 계정이 인증된 azure image가 생성이 된다.

 

 

반응형