CI/CD 파이프에 비밀 주입

이미 알고 있는 바와 같이, 저장소에 기밀 (예를 들어 API 키, 대칭 키, 인증서 등) 을 영원히 포함해서는 안 됩니다.심지어 사적인 자리에서도 안 된다.
최근에 나는 개인 프로젝트와 고객 프로젝트에 비밀을 사용해야만 했다.나는 나의 일을 위해 우아한 해결 방안을 생각해 내야 한다.NET 프로젝트, 제 견해와 최선의 실천을 여러분과 공유하고 싶습니다.
일반적으로 응용 프로그램에서 비밀을 실현하는 데는 두 가지 방법이 있다.순 항목:

  • 사용자 기밀: 기밀 파일에 기밀을 포함합니다.이거.NET 응용 프로그램이 런타임에 로드됩니다.생산에서 키 라이브러리 등 다른 방식으로 기밀을 지정할 수 있습니다.이것은 일반적으로 ASP에 적용됩니다.NET 핵심 프로젝트 및 직원 서비스

  • 상수: 정적 클래스에서 형식 기밀을 지정하고 프로젝트에서 이 클래스를 인용합니다.이것은 보통 응용 프로그램과 테스트 항목에 사용됩니다.
  • 본문에서 내가 중점적으로 소개할 것은 다음 상황이다.네트워크 기반 프로젝트:
  • 내 개인 프로젝트에서 나는 어쩔 수 없이 app Center와 GitHub
  • 을 사용하여 나의 UWP 응용 프로그램에 비밀을 추가했다
  • 한 상업 프로젝트에서 저는 자연스럽게 TDD를 선택했습니다. 저는 통합 테스트에 비밀을 제공해야 했지만 지나치지 않았습니다. 왜냐하면 저는 일을 순조롭게 진행하고 싶기 때문입니다.이를 위해 Azure DevOps를 사용했습니다.
  • 귀찮게 할 필요 없어, 우리 갑시다.

    초보 프로젝트 고려


    지금 당신이 비밀을 어떻게 정확하게 포함하는지는 완전히 당신의 프로젝트에 달려 있다.내 예에서 나는 Constants.cs라는 국부 정적 클래스를 만들었는데 그 중에서 필요한 속성과 전파 값을 포함하는 다른 국부 클래스Constants.Secret.cs를 정의했다.

    다음은 두 파일의 모양입니다.
    // Constants.cs
    public static partial class Constants
    {
        public static string ApiKey { get; set; }
    }
    
    // Constants.Secret.cs
    public static partial class Constants
    {
        static Constants()
        {
            ApiKey = "verysecretkey!123"
        }
    }
    
    Rosyln 컴파일러가 두 파일을 자동으로 처리합니다.이 종류를 사용하려면 특별한 설정이 필요하지 않습니다. Constants.ApiKey 속성을 계속 인용하면 됩니다.
    그런 다음 Git에 컨텐츠를 계속 제출하기 전에 애플리케이션에 기밀 파일을 추가해야 합니다.gitignore 파일:
    Constants.Secret.cs
    
    이렇게 하면 저장소의 이름과 일치하는 모든 파일이 무시되므로 원격 저장소에 체크 인되지 않습니다.만약 당신의 해결 방안에 많은 다른 항목이 있는데, 그것들이 모두 자신의 비밀을 가지고 있다면, 매우 편리할 것이다.
    계속해서 좋은 제출 정보를 제공하고 그것을 전송하세요.일단 당신이 이 점을 해낸다면, 우리는 CI/CD 방면의 일을 연구할 수 있습니다.

    CD/CI


    지금까지 컴파일러가 상수를 찾을 수 없기 때문에 CI/CD 설정이 필요합니다.비밀.저장소의 cs 파일 - 주로 해결 방안에서 인용되었지만 원격 저장소의 작업 디렉터리에서 찾을 수 없습니다.
    이 문제를 해결하기 위해 GitHub, Azure DevOps, App Center 등 대부분의 장면에 적용되는 세 가지 옵션을 보여 드리겠습니다.
    이러한 장면을 바탕으로 당신은 깨우침을 얻고 지식을 다른 서비스에 응용할 수 있어야 합니다.

    github


    GitHub 를 사용하면 기밀 정보를 저장소에 저장할 수 있습니다.그런 다음 GitHub 작업에서 이러한 비밀을 참조할 수 있습니다.
    비밀을 관리하려면 저장소로 이동하여 설정 > 비밀을 클릭하십시오.

    거기에 새 저장소 기밀을 만들고 Constants.Secret.cs 파일의 내용을 포함합니다.그것에 기억할 만한 이름을 지어라. (지금부터 나는 그것을 부를 것이다. 너는 다른 이름을 써야 한다.) 그리고 이 비밀을 보존해야 한다.
    작업 정의 파일의 저장소 기밀을 바탕으로 클래스 파일을 만들 때가 되었습니다. 이렇게 하면 실제 생성되기 전에 클래스 파일을 만들 수 있습니다.
    스크립트는 이렇게 할 수 있습니다. 비밀 내용을 파일에 쓰기만 하면 됩니다.
    steps:
    - uses: actions/checkout@v2
    - name: Create Constants
      run: echo ${{secrets.<CONSTANTS>}} > "./<PATH>/Constants.Secret.cs"
    # ...
    
    상수 파일의 모든 구축 절차에 의존하기 전에 이 절차를 삽입하고 실제 기밀의 이름으로 자리 표시자를 대체하는 것을 기억하십시오.
    업데이트된 작업 파일을 제출하면 구축이 성공할 것입니다.

    Azure DevOps


    Azure DevOps를 사용하면 보안 파일을 업로드할 수 있습니다.Secure files는 크로스 파이프라인에서 기밀 문서를 관리하는 좋은 해결 방안이다.보안 파일에 액세스할 수 있는 사용자와 해당 파일을 사용할 수 있는 파이프라인을 관리할 수 있습니다.
    모든 기밀을 관리하려면 프로젝트에 파이프가 활성화되어 있는지 확인하십시오.그리고 파이프 > 라이브러리에 들어갑니다.이 라이브러리는 변수를 다시 사용하고 보안 파일을 저장할 수 있도록 합니다.

    보안 파일 탭으로 이동하여 기밀 상수 클래스 (Constants.Secret.cs 를 업로드하고 좋은 이름을 지정해야 합니다. 상수 클래스가 여러 개 있으면 이 이름으로 상수 클래스를 구분할 수 있습니다.
    그 후에, 우리의 안전 파일을 우리의 구축 파이프로 끌어올릴 때가 되었다.보안 파일을 사용하려면 SecureFile 작업을 사용합니다.작업 이름과 보안 파일 이름을 입력해야 합니다.작업 이름을 사용하여 연속 생성 단계의 모든 파일을 참조할 수 있습니다.
    steps:
    - task: DownloadSecureFile@1
      name: constantsFile
      displayName: 'Download Constants for Integration Tests'
      inputs:
        secureFile: 'Constants.Secret.cs'
    
    완성된 후에, 우리는 파일을 마땅히 있어야 할 위치로 복사해야 한다.그렇지 않으면, 컴파일러가 해결 방안에서 인용된 클래스를 찾을 수 없기 때문에 구축에 실패할 것입니다. 앞에서 말한 바와 같이.
    - script: cp $(constantsFile.secureFilePath) <PATH>/Constants.Secret.cs
      displayName: Copy constants
    
    너 망했어!이제 보안 파일을 대상으로 복사합니다.
    생성 정의를 저장하고 실행합니다.너의 구축은 반드시 성공해야 한다.

    응용 센터


    App Center를 사용하면 특정 단계에서 사용자 정의 스크립트를 실행할 수 있습니다.너는 App Center documentation에서 그것에 대한 더 많은 정보를 읽을 수 있다.
    구축을 시작하기 전에 사용자 정의 스크립트를 사용하여 상수를 주입해야 합니다.그러나 구축 스크립트는 전파의 상수를 포함하고 원격 저장소에 서명해야 하기 때문에 민감한 세부 사항도 포함하지 말고 안전한 환경 변수에서 나온 내용도 전파하지 않는 것을 권장합니다.
    만약 내가 보여줄 이전 방법을 사용하기로 결정한다면, 프로그램이 상수치가 없어도 정상적으로 실행될 수 있도록 확보해야 한다.
    만약 당신이 App Center를 CI 목적으로만 사용할 계획이라면 당신은 괜찮을 것이다.단, 응용 프로그램 패키지를 테스트 인원에게 나누어 줄 계획이라면, 상수를 전파하는 방법을 찾아야 한다.
    이러한 경우 constants 클래스를 만들 때 환경 변수를 사용하거나 사용자가 실행할 때 값을 전파하는 방법 (예를 들어 프로필 등) 을 고려하십시오.
    나는 UWP 앱을 구축해서 어쩔 수 없이 내 앱에 상수를 전파했다.클론 사후 스크립트를 추가하려면 스크립트 파일을 저장소의 루트 경로에 추가합니다.

    UWP(appcenter-post-clone.ps1)와 같은 Windows 기반 버전


    "namespace <PLACEHOLDER>
    {
        public static partial class Constants
        {
            static Constants() { }
        }
    }" | Out-File -FilePath ".\\<PATH>\\Constants.Secret.cs
    

    Mac 기반 구축용 (appcenter-post-clone.sh)


    echo "namespace <PLACEHOLDER>\
    {\
        public static partial class Constants\
        {\
            static Constants() { } \
        }\
    }" > "<PATH>/Constants.Secret.cs.cs"
    
    두 스크립트 모두 포함된 내용을 파일에 기록합니다.파일을 제출하고 저장소로 밀어 넣은 다음 구축이 실행되도록 하십시오.만약 당신이 이 점을 하기 어려우면 official samples를 참고하십시오.
    나는 이 문장이 너에게 도움과 깨우침을 줄 수 있기를 바란다.니 생각을 알려줘.
    나는 최근에 한 사람이 되었다Microsoft Learn Student Ambassador.만약 당신이 나로 하여금 미래에 더 많은 글을 발표하게 하고 싶다면, 반드시 계속 나를 주목해야 한다.체크아웃my other profiles.그리고 내 다른 글 좀 봐!
    건배, 읽어주셔서 감사합니다!

    좋은 웹페이지 즐겨찾기