티스토리 뷰

<참조> https://azuredevopslabs.com/labs/vstsextend/azurekeyvault/

 

 

 

 

 

개요

Azure Key Vault는 산업 표준 알고리즘, 키 길이 및 하드웨어 보안 모듈로 보호된 중앙 저장소에 키, 암호, 인증서 등과 같은 민간한 정보를  안전하게 저장 및 관리할 수 있도록 돕는다. 이는 많은 개발자들이 흔히 범하는 실수인 소스 코드를 통한 정보의 공개를 방지해준다. 많은 개발자는 데이터베이스 연결 문자열, 암호, 개인키 등과 같은 기밀 정보을 소스 코드 상에 그대로 둔다. 이 정보를 악의적인 사용자가 얻게 될 경우 의도치 않는 결과를 초래할 수 있다. key vault에 액세스 하기 위해서는 적절한 인증과 인가를 필요로 하며 팀은 RBAC을 사용하여 민감한 데이터에 대한 퍼미션을 가진 사람을 세밀하게 제어할 수 있다.

 

 

 

 

본 랩에서 다루는 내용

이번 랩에서 우리는 파이프라인에서 어떻게 Azure Key Vault를 사용할 수 있는지 확인하게 될 것이다.

1. Azure 포털에서 key vault를 만들어 MySQL 암호를 저장할 것이다.

2. 서비스 주체가 그 값을 읽을 수 있도록 퍼미션을 구성할 것이다.

3. Azure 파이프라인에서 그 암호를 검색하여 이후 태스크에 넘겨주게 될 것이다.

 

시작하기 전에

1. 다음 실습을 수행하기 전에 시작하기 페이지를 참조한다.

2. Azure DevOps 데모 생성기를 사용하여 Azure DevOps 조직에 프로젝트를 프로비저닝 한다. 이 URL은 데모 생성기에서 자동으로 Azure Key Vault를 선택할 것이다. (아래 번호 순서대로 시행한다.)

다른 프로젝트를 시도하려면, azuredevops 생성기를 대신 사용한다.

간단한 실습을 따라하여 Azure DevOps 데모 생성기 사용 방법을 알아본다.

 

 

과제 1 : 서비스 주체 만들기

Azure 파이프라인에서 Azure 리소스에 앱을 배포하기 위해는 서비스 주체가 필요하다. 파이프라인에서 암호를 검색하게 될 것이므로 key vault를 만들 때 서비스에 퍼미션을 부여해야만 한다.

서비스 주체는 파이프라인 정의 내부에서 Azure 구독에 연결할 때 또는 프로젝트 설정 페이지에서 새로운 서비스 연결을 만들 때 Azure 파이프라인에 의해 자동으로 만들어 진다. 또한 포털 또는 Azure CLI를 사용하여 서비스 주체를 수동으로 만들 수도 있으며, 프로젝트에 걸쳐 재사용이 가능하다. 사전 구성된 퍼미션 집합을 가지고 싶은 경우 기존 서비스 주체를 사용하는 것이 좋다.

우리는 Azure CLI를 사용하여 수동으로 만들 것이다. 서비스 주체를 이미 가지고 있다면 이 과제는 건너 뛴다.

(필자는 작업의 편의를 위해 Windows Terminal을 통해 Azure Cloud Shell에서 작업을 진행할 것이다. Windows Terminal을 사용하려면 여기를 참조한다.)

 

1. Windows Terminal을 실행한다.

 

2. 새 탭 드롭다운 메뉴에서 Azure Cloud Shell을 선택한다.

 

3. 테넌트가 여러 개일 경우 작업 대상을 선택하고 명령 프롬프트가 떨어지면 az login을 수행한다.

(이어지는 자격증명 정보 등을 입력하여 인증과정을 수행한다.) 

 

4. 원하는 값으로 ServicePrincipalName을 대체하여 다음 명령을 수행한다.

az ad sp create-for-rbac -n ServicePrincipalName

이미지에서 보는 바와 같이 JSON 출력을 제공한다. 노트패드 또는 텍스트 파일에 출력을 복사한다. 나중에 이것을 사용하게 될 것이다.

 

과제 2 : key vault 만들기

다음으로 Azure에서 key vault를 만들 것이다. 이 랩의 시나리오에서는 MySQL 데이터베이스에 연결된 노드앱이 있으며 여기서 key vault에 MySQL 데이터베이스에 대한 암호를 시크릿으로 저장할 것이다.

 

1. 아직 로그인이 안되었다면 Azure 포털로 로그인 한다.

 

2. 검색 필드에 "Key vault"라고 입력하고 엔터를 친다. 서비스 아래 Key Vaults를 선택한다.

 

3. Add 또는 Create key vault 버튼을 선택하여 새로운 key vault를 만든다.

 

4. vault에 대한 이름, 구독, 리소스 그룹 및 지역을 제공한다.

Key Vault의 데이터는 민감하고 업무상 중요하므로 인증된 애플리케이션 및 사용자만을 허용하여 key valut에 대한 액세스를 보해햐야만 한다. valut에서 데이터를 액세스하려면 파이프라인에서 인증에 사용하게 될 서비스 주체에 read(Get) 퍼미션을 제공해야 한다.

 

 

5. Access policy를 선택한 다음 + Add Access Policy를 선택하여 새로운 정책을 설정한다.

 

6. 애플리케이션에 부여하려는 퍼미션을 지정해야 한다. 이는 키와 데이터(시크릿)를 관리하기 위한 퍼미션이 될 수 있다. 어떤 경우든 애플리케이션은 key vault에 다음 두 가지 방식으로 액세스할 수 있다.

  • User + Application access : 특정 사용자에게 액세스 권한이 부여되며,이 사용자는 모든 애플리케이션을 사용할 수 있거나 특정 애플리케이션을 사용하도록 제한 될 수 있다.

Application-only access : 데몬 서비스 또는 백그라운드 작업으로 실행할 수 있는 애플리케이션에 대한 액세스 권한이 부여된다.

 

       

7. Select principal을 선택하고 전에 만들었던 보안 주체를 검색하여 선택한다. 주체의 이름 또는 ID로 조            회가 가능한다.

 

 

8. 다음으로 부여하려는 퍼미션을 선택하고 Add를 클릭한다. 현재는 시크릿에 대한 read-only 퍼미션(Get, List)만 제공할 것이다.

9. Review + create를 클릭하여 열린 vault 만든다.

 

10. Secrets 블레이드에서 + Generate/Import를 선택한다.

 

 

11. 서비스를 만드는 데 몇 분 밖에 걸리지 않는다. 프로비저닝 되면 key vault를 선택하고 새 시크릿을 추가한다. 이름을 sqldbpassword로 지정한다. MySQL 데이터베이스의 비밀번호로 허용되는 값을 제공한다.

 

 

과제 3 : Azure 파이프라인 체크

이제 Azure DevOps 데모 생성기를 사용하여 프로비저닝한 Azure DevOps 프로젝트로 가서 Azure 파이프라인이 key vault로부터 시크릿을 읽을 수 있도록 구성해보자.

1. Azure DevOps 프로젝트로 이동한다.

 

2. 좌측 네비게이션 바에서 Pipelines | Pipelines을 선택한다.

 

3. 빌드를 트리거 하기 위해 SmartHotel-CouponManagement-CI 정의를 선택한 다음 Run Pipeline 하여 수동으로 큐에 넣는다.

 

4. (CI가 완료된 후) Pipelines 아래 Releases로 이동한 다음 SmartHotel-CouponManagement-CD 정의를 선택하여 편집한다.

 

5. Task 아래 Dev 스테이지에 대한 릴리즈 정의에 Azure Key Vault 태스크가 있음에 주목한다. 이 태스크는 Azure Key Vault로부터 Secrets을 다운로드 한다. 구독 및 랩 과정에서 이전에 만든 Azure Key Vault를 가리키도록 해야 한다.

 

6. Azure에 배포하기 위해 파이프라인을 인가해야 한다. Azure 파이프라인이 새로운 서비스 주체를 가지고 서비스 연결을 자동으로 만들 수 있지만 우리는 이전에 만들어둔 것을 사용하고자 한다. Manage를 클릭하면 서비스 연결 페이지로 리다이렉트 된다.

여기 지시에 따라 기존 서비스 주체를 가지고 Azure 리소스 관리자 서비스 연결을 만든다. (또는 간단하게 다음을 따라 서비스 연결을 만든다.)

 

  • New service connection을 선택한다.

 

  • 기존 서비스 주체를 활용할 것이므로 Service principal (manual)을 선택하고 Next를 클릭한다.

 

  • Azure Resource Manager를 선택한다.

 

기존 서비스 주체를 활용할 것이므로 Service principal (manual)을 선택하고 Next를 클릭한다.

 

  • 이전에 생성했던 Service Principal(=appId), Service principal key(=password)를 입력한 다음 verify를 눌러 설정을 확인한다.

 

  • 확인이 성공되면 서비스 커넥션 이름을 넣고 Verify and save를 선택한다.

 

7. Azure Key Vault 태스크에서 Azure 구독에 대해 이전 스텝에서 생성했던 서비스 연결을 선택한다.

 

8. 드롭다운에서 이름을 입력하거나 생성했던 key vault를 선택할 수 있다. 

 

9. Secrets filter 필드에서 모든 시크릿을 읽도록 별표 (*)를 지정하거나 특정 시크릿만 원하는 경우라면 시크릿 이름을 쉼표로 구분된 값으로 제공 할 수 있다.

런타임 시 Azure 파이프라인은 최신 시크릿 값을 가져 와서 다음 태스크에서 사용할 수 있는 태스크 변수로 설정한다. 즉, 이전에 저장한 암호를 $(sqldbpassword)를 사용하여 읽을 수 있다.

 

10. 다음 태스크인 ARM 템플릿을 배포하는 Azure Deployment에서 이 값을 전달한다.

Override template parameters 필드에는 데이터베이스 사용자 이름이 문자열이지만 비밀번호 값은 변수로 전달된다.

 

-webAppName $(webappName) -mySQLAdminLoginName "azureuser" -mySQLAdminLoginPassword $(sqldbpassword)

 

key vault에 지정한 비밀번호를 사용하여 ARM 템플릿에 정의된 MySQL 데이터베이스를 프로비저닝 한다.

태스크에 대한 구독 및 위치를 지정하여 파이프라인 정의를 완료 할 수 있다.

 

<참고>

Azure 파이프라인 내에서 값을 시크릿 태스크 변수 자체로 전달할 수도 있지 않았을까 하며 궁금해 할 수도 있다. 그것이 가능하기는 하지만 태스크 변수는 파이프라인에 특정되어 있으며 그것이 생성된 정의 외부에서는 사용할 수 없다. 또한 대부분의 경우 이와 같은 시크릿은 모든 파이프라인에 대해 이를 설정하지 않으려는 운영자에 의해 정의된다.

 

파이프라인 Azure App Service Deploy의 마지막 태스크에 대해 동일하게 반복한다. 마지막으로 새 릴리즈를 저장하고 작성하여 배포를 시작한다.

 

다음과 같이 배포가 정상적으로 이루어 졌다.

https://hotel-coupon-mgmta10d516c.azurewebsites.net 을 통해 배포 결과를 확인한다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함