Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022
이 문서에서는 Azure Pipelines에서 비밀을 보호하기 위한 모범 사례를 제공합니다. 비밀은 API 키, 암호, 인증서 또는 암호화 키 등에 대한 액세스를 엄격하게 제어하려는 항목입니다. Azure Pipelines는 비밀 값을 생성하지 않지만 API 키와 같은 중요한 데이터를 저장하기 위해 파이프라인에 비밀을 추가해야 할 수 있습니다.
이 문서는 Azure Pipelines에 대한 보안 조치를 구현하는 데 도움이 되는 시리즈의 일부입니다. 자세한 내용은 보안 Azure Pipelines를 참조하세요.
필수 조건
| 범주 | 요구 사항 |
|---|---|
| Azure 데브옵스 | - Azure DevOps를 안전하고 안전한 Azure Pipelines로 만들기 에서 권장 사항을 구현 합니다. - YAML 및 Azure Pipelines에 대한 기본 지식 자세한 내용은 첫 번째 파이프라인 만들기를 참조하세요. |
| 권한 | - 파이프라인 사용 권한을 수정하려면: 프로젝트 관리자 그룹의 구성원입니다. - 조직 권한을 수정하려면 : 프로젝트 컬렉션 관리자 그룹의 구성원입니다. |
다른 메서드 사용
비밀은 내재된 보안 위험을 제공하므로 사용하지 않는 것이 가장 좋습니다. 변수에서 비밀을 관리하거나 파이프라인 구성에서 노출하는 대신 파이프라인이 이러한 다른 방법 중 하나를 사용하여 작업을 수행할 수 있는지 확인합니다.
- Azure 또는 GitHub 또는 Docker와 같은 다른 서비스에 안전하게 연결하도록 서비스 연결을 설정합니다. 자세한 내용은 Azure Resource Manager 서비스 연결을 사용하여 Azure에 연결을 참조하세요.
- 관리 ID를 사용하여 명시적 자격 증명을 사용하지 않고 애플리케이션 및 서비스에서 Azure 서비스를 인증할 수 있습니다.
- 파이프라인의 옵션과 함께
addSpnToEnvironment사용하여 비밀을 명시적으로 전달하지 않고 서비스 주체 세부 정보에 액세스합니다.
자세한 내용은 서비스 주체 및 관리 ID 사용을 참조하세요.
비밀 변수 사용
중요한 값을 azure-pipelines.yml 파일에 일반 텍스트로 저장하지 마세요. 암호, ID 및 노출하지 않으려는 기타 식별 데이터와 같은 개인 정보에 비밀 변수를 사용할 수 있습니다. 비밀 변수는 암호화되므로 값을 노출하지 않고 파이프라인에서 사용할 수 있습니다.
- Azure Key Vault에서 비밀 변수를 안전하게 관리하는 것이 가장 좋습니다. 파이프라인 정의 UI 또는 변수 그룹에서 비밀 변수를 설정할 수도 있습니다.
- 파이프라인에 액세스할 수 있는 모든 사용자가 비밀을 볼 수 있으므로 로깅 명령을 사용하여 비밀 변수를 설정하지 마세요.
- 비밀을 출력으로 에코하지 말고 명령줄로 비밀을 전달하지 마세요. 대신 비밀을 환경 변수에 매핑하는 것이 가장 좋습니다.
- 비밀을 만들 때 변수 명명 지침을 따르고 비밀 이름이 중요한 정보를 공개하지 않는지 확인합니다.
변수에서 비밀을 설정하는 방법에 대한 자세한 내용은 비밀 변수 설정을 참조하세요.
비밀 변수에 대한 액세스 제한
Azure DevOps에서 비밀에 대한 액세스를 제한하려면 다음 사례 중 하나를 수행합니다.
- Azure Key Vault에 비밀을 저장합니다. Azure Key Vault를 사용하면 Azure 역할 기반 액세스 제어를 사용하여 비밀 또는 비밀 그룹에 대한 액세스를 제한할 수 있습니다.
- 파이프라인 UI에서 비밀 변수를 설정합니다. 이러한 변수는 설정된 파이프라인으로 범위가 지정되므로 해당 파이프라인의 사용자에게만 표시됩니다.
- 변수 그룹에서 비밀을 설정합니다. 변수 그룹은 라이브러리 보안 모델을 따르므로 항목을 액세스하거나 만들 수 있는 사용자를 제어할 수 있습니다.
로그에 비밀 쓰기 안 함
Azure Pipelines는 가능한 한 로그에서 비밀을 제거하려고 시도하지만, 완전히 안전하지는 않습니다. 콘솔에 비밀을 에코하거나, 명령줄 매개 변수에 사용하거나, 파일에 로깅하지 마세요.
중요한 정보를 출력하는 Azure CLI 명령을 사용하는 경우 주의해야 합니다. None 출력 형식을 사용하고 Azure CLI 호출에서 비밀을 검색해야 하는 경우 비밀 변수에서 보안 정보를 검색합니다.
구조적 데이터를 비밀로 사용하지 마세요.
JSON, XML 또는 YAML과 같은 구조화된 데이터 형식을 사용하여 캐리지 리턴 \r 및 라인 피드 \n와 같은 제어 문자뿐만 아니라 비밀 값을 포함하여 캡슐화하지 마십시오. 대신 각 중요한 값에 대한 개별 비밀을 만듭니다. 이 방법을 사용하면 편집 정확도가 향상되고 실수로 중요한 데이터가 노출될 위험이 최소화됩니다.
비밀 사용 감사
파이프라인에서 비밀을 사용하는 방법을 감사하려면 다음 모범 사례를 따르세요.
파이프라인을 호스트하는 리포지토리의 소스 코드를 검사합니다. 비밀이 올바르게 처리되었는지 확인하려면 파이프라인에서 사용하는 모든 작업을 확인합니다. 비밀이 실수로 의도하지 않은 호스트로 전송되거나 로그 출력에 명시적으로 인쇄되지 않았는지 확인합니다.
유효하고 잘못된 입력을 테스트한 후 파이프라인에 대한 실행 로그를 확인합니다. 비밀이 제대로 수정되고 노출되지 않는지 확인합니다. 경우에 따라 명령 또는 도구의 오류가 실수로 비밀을 오류 로그로 누출할 수 있습니다. Azure Pipelines는 로그에서 비밀을 스크러빙하려고 시도하지만 수동 검토는 여전히 필수적입니다.
비밀 감사 및 회전
비밀을 감사하고 회전하려면 다음 모범 사례를 따릅니다.
- 파이프라인에 등록된 비밀을 주기적으로 검토합니다. 여전히 필요한지 확인하고 더 이상 필요하지 않은 항목은 제거합니다. 이 방법은 혼란과 잠재적인 보안 위험을 줄이는 데 도움이 됩니다.
- 서비스 연결 비밀의 적절한 구성 및 보안 처리를 보장합니다.
- PAT(개인용 액세스 토큰) 기간을 짧게 유지하고 필요한 최소 권한을 선택합니다.
- 정기적으로 비밀을 회전하여 손상된 비밀을 악용할 수 있는 시간을 최소화합니다. 비밀을 정기적으로 변경하면 보안이 향상됩니다.
YAML 템플릿 사용
파이프라인 YAML에 비밀 매개 변수가 있는 인라인 스크립트를 직접 포함하는 대신 템플릿을 사용합니다. 이 방법은 주요 파이프라인에서 중요한 정보를 추상화하여 보안을 강화합니다.
이 방법을 구현하려면 스크립트에 대해 별도의 YAML 파일을 만들고 해당 스크립트를 별도의 보안 리포지토리에 저장합니다. 그런 다음 템플릿을 참조하고 AZURE Key Vault, 변수 그룹 또는 YAML의 파이프라인 UI에서 비밀 변수를 매개 변수로 전달할 수 있습니다. 템플릿 사용에 대한 자세한 내용은 템플릿 사용 참조를 참조하세요.
분기 정책 및 변수 그룹 권한으로 비밀 제한
비밀이 특정 리포지토리 분기에만 액세스할 수 있도록 하려면 분기 정책, 변수 그룹 권한 및 조건부 작업 삽입의 조합을 사용할 수 있습니다.
특정 분기에서만 빌드를 허용하는 빌드 유효성 검사 정책을 적용합니다. 그런 다음 변수 그룹 권한을 사용하여 권한 있는 파이프라인만 변수 그룹에 저장된 비밀에 액세스할 수 있는지 확인합니다. 마지막으로 파이프라인의 조건을 사용하여 지정된 분기에 대한 푸시만 변수 그룹을 참조할 수 있도록 합니다.
jobs:
- job: ExampleJob
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
pool:
vmImage: 'ubuntu-latest'
steps:
- script: echo "This runs only for the main branch"
displayName: 'Conditional Step'
variables:
- group: your-variable-group-name
관련 콘텐츠
- 비밀 보호 모범 사례
- 애플리케이션 비밀을 보호하기 위한 아키텍처 전략
- Azure DevOps 보안 개요