질문과 대답 | Azure

참고

2022년 12월 31일부터 MSCA(Microsoft 보안 코드 분석) 확장이 사용 중지됩니다. MSCA는 Microsoft Security DevOps Azure DevOps 확장으로 대체됩니다. 구성의 지침에 따라 확장을 설치하고 구성합니다.

일반 FAQ

Azure DevOps 인스턴스 대신 내 Azure DevOps Server(이전의 Visual Studio Team Foundation Server) 인스턴스에 확장을 설치할 수 있나요?

아니요. Azure DevOps Server(이전의 Visual Studio Team Foundation Server)의 다운로드 및 설치에는 확장을 사용할 수 없습니다.

내 빌드에서 Microsoft 보안 코드 분석을 실행해야 하나요?

아마도 그렇습니다. 분석 도구 유형에 따라 달라집니다. 소스 코드만 필요할 수도 있고, 빌드 출력이 필요할 수도 있습니다.

예를 들어 CredScan(자격 증명 스캐너)은 코드 리포지토리의 폴더 구조 내에서 파일을 분석합니다. 이 분석으로 인해 독립 실행형 빌드에서 CredScan 및 보안 분석 로그 게시 빌드 작업을 실행하여 결과를 얻을 수 있습니다.

사후 빌드 아티팩트를 분석하는 BinSkim과 같은 다른 도구에는 빌드 작업을 먼저 수행해야 합니다.

결과가 발견되면 빌드를 중단할 수 있나요?

예. 어떤 도구든 로그 파일의 문제를 보고하면 빌드를 중단할 수 있습니다. 사후 분석 빌드 작업을 추가하고 빌드를 중단할 도구의 확인란을 선택하면 됩니다.

사후 분석 작업의 UI에서 도구가 오류만 보고하거나 오류와 경고를 모두 보고하는 경우 빌드를 중단하도록 선택할 수 있습니다.

Azure DevOps의 명령줄 인수는 독립 실행형 데스크톱 도구의 인수와 어떻게 다른가요?

일반적으로 Azure DevOps 빌드 작업은 보안 도구의 명령줄 인수를 둘러싼 직접적인 래퍼입니다. 일반적으로 명령줄 도구에 전달하는 모든 항목을 빌드 작업에 인수로 전달할 수 있습니다.

눈에 띄는 차이점:

  • 도구는 에이전트 $(Build.SourcesDirectory)의 원본 폴더 또는 %BUILD_SOURCESDIRECTORY%에서 실행됩니다. 예는 C:\agent_work\1\s입니다.
  • 인수의 경로는 이전에 나열된 원본 디렉터리의 루트에 상대적일 수 있습니다. 경로는 절대적일 수도 있습니다. Azure DevOps 빌드 변수를 사용하거나 로컬 리소스의 알려진 배포 위치로 온-프레미스 에이전트를 실행하여 절대 경로를 가져옵니다.
  • 도구는 출력 파일 경로 또는 폴더를 자동으로 제공합니다. 빌드 작업에 대한 출력 위치를 제공하는 경우 해당 위치는 빌드 에이전트의 잘 알려진 로그 위치의 경로로 바뀝니다.
  • 일부 다른 명령줄 인수는 일부 도구에 대해 변경되었습니다. 한 가지 예로 GUI를 시작하지 않도록 하는 옵션 추가 또는 제거가 있습니다.

Azure DevOps 빌드에서 여러 리포지토리에서 자격 증명 스캐너와 같은 빌드 작업을 실행할 수 있나요?

아니요. 단일 파이프라인의 여러 리포지토리에서 보안 개발 도구를 실행하는 것은 지원되지 않습니다.

지정한 출력 파일이 만들어지지 않았거나 지정한 출력 파일을 찾을 수 없습니다.

빌드 작업은 일부 사용자 입력을 필터링합니다. 특히 이 질문의 경우 생성된 출력 파일의 위치를 빌드 에이전트의 공통 위치로 업데이트합니다. 이 위치에 대한 자세한 내용은 다음 질문을 참조하세요.

도구에서 생성된 출력 파일은 어디에 저장되나요?

빌드 작업은 빌드 에이전트의 잘 알려진 위치인 $(Agent.BuildDirectory)_sdt\logs에 출력 경로를 자동으로 추가합니다. 이 위치를 표준화하기 때문에 코드 분석 로그를 생성하거나 소비하는 모든 팀이 출력에 액세스할 수 있습니다.

호스트된 빌드 에이전트에서 이러한 작업을 실행하기 위해 빌드를 대기열에 추가할 수 있나요?

예. 확장의 모든 작업 및 도구는 호스트된 빌드 에이전트에서 실행될 수 있습니다.

참고

맬웨어 방지 스캐너 빌드 작업에는 Windows Defender가 사용하도록 설정된 빌드 에이전트가 필요합니다. 호스트된 Visual Studio 2017 이상에서는 이러한 에이전트를 제공합니다. 빌드 작업은 Visual Studio 2015 호스트된 에이전트에서 실행되지 않습니다.

이러한 에이전트에서는 서명을 업데이트할 수 없지만 서명은 항상 3시간 미만이어야 합니다.

빌드 파이프라인이 아니라 릴리스 파이프라인의 일부로 이러한 빌드 작업을 실행할 수 있나요?

대부분의 경우 예입니다.

그러나 Azure DevOps는 이러한 작업이 아티팩트를 게시할 때 릴리스 파이프라인 내에서 작업을 실행하는 것을 지원하지 않습니다. 지원 부족으로 인해 릴리스 파이프라인에서 보안 분석 로그 게시 작업이 성공적으로 실행되지 않습니다. 대신 설명이 포함된 오류 메시지와 함께 작업이 실패합니다.

빌드 작업은 어디에서 도구를 다운로드하나요?

빌드 작업은 Azure DevOps 패키지 관리 피드에서 도구의 NuGet 패키지를 다운로드할 수 있습니다. 빌드 작업은 빌드 에이전트에 사전 설치되어 있어야 하는 노드 패키지 관리자를 사용할 수도 있습니다. 이러한 설치의 예는 npm install tslint 명령입니다.

확장을 설치하면 Azure DevOps 조직에 어떤 영향이 있나요?

설치 시 확장에서 제공하는 보안 빌드 작업은 조직의 모든 사용자가 사용할 수 있습니다. Azure Pipeline을 만들거나 편집할 때 이러한 작업은 빌드-작업 컬렉션 목록에서 사용할 수 있습니다. 그렇지 않으면 Azure DevOps 조직에 확장을 설치해도 아무런 영향을 주지 않습니다. 설치 시 계정 설정, 프로젝트 설정 또는 파이프라인이 수정되지 않습니다.

확장을 설치하면 기존 Azure Pipelines가 수정되나요?

아니요. 확장을 설치하면 파이프라인에 추가하는 데 보안 빌드 작업을 사용할 수 있습니다. 도구가 빌드 프로세스를 사용할 수 있도록 빌드 정의를 추가하거나 업데이트해야 합니다.

작업별 FAQ

이 섹션에는 빌드 작업과 관련된 질문이 나열되어 있습니다.

자격 증명 스캐너

일반적인 제거 시나리오 및 예는 무엇인가요?

다음은 가장 일반적인 제거 시나리오에 대한 세부 정보입니다.

지정된 경로 내에서 지정된 비밀의 모든 발생을 제거하려면

CredScan 출력 파일의 비밀 해시 키는 다음 샘플과 같이 필요합니다.

{
    "tool": "Credential Scanner",
    "suppressions": [
    {
        "hash": "CLgYxl2FcQE8XZgha9/UbKLTkJkUh3Vakkxh2CAdhtY=",
        "_justification": "Secret used by MSDN sample, it is fake."
    }
  ]
}

경고

해시 키는 일치하는 값 또는 파일 콘텐츠의 일부에 의해 생성됩니다. 모든 원본 코드 수정 버전은 해시 키를 변경하고 제거 규칙을 사용하지 않도록 설정할 수 있습니다.

지정된 파일의 모든 비밀을 제거하거나 암호 파일 자체를 제거하려면

파일 식은 파일 이름일 수 있습니다. 전체 파일 경로 또는 파일 이름의 기본 이름 부분이 될 수도 있습니다. 와일드카드는 지원되지 않습니다.

다음 예는 <InputPath>\src\JS\lib\angular.js 파일을 표시하지 않는 방법을 보여 줍니다.

유효한 제거 규칙의 예:

  • <InputPath>\src\JS\lib\angular.js - 지정된 경로에서 파일을 표시하지 않습니다.
  • \src\JS\lib\angular.js
  • \JS\lib\angular.js
  • \lib\angular.js
  • angular.js - 이름이 같은 파일을 제거합니다.
{
    "tool": "Credential Scanner",
    "suppressions": [
    {
        "file": "\\files\\AdditonalSearcher.xml", 
        "_justification": "Additional CredScan searcher specific to my team"
    },
    {
        "file": "\\files\\unittest.pfx", 
        "_justification": "Legitimate UT certificate file with private key"
    }
  ]
}

경고

파일에 추가된 모든 향후 비밀도 자동으로 제거됩니다.

비밀을 관리하는 데 권장 되는 지침은 무엇인가요?

다음 리소스를 통해 애플리케이션 내에서 비밀을 안전하게 관리하고 민감한 정보에 액세스할 수 있습니다.

자세한 내용은 클라우드에서 안전하게 비밀 관리 블로그 게시물을 참조하세요.

사용자 지정 검색자를 직접 작성할 수 있나요?

자격 증명 스캐너는 buildsearchers.xml 파일에 일반적으로 정의되는 콘텐츠 검색자 집합을 사용합니다. 이 파일은 Contentsearcher 개체를 나타내는 XML의 직렬화된 개체의 배열을 포함합니다. 이 프로그램은 잘 테스트된 검색자 집합을 사용하여 배포됩니다. 그러나 사용자 지정 검색자를 구현할 수도 있습니다.

콘텐츠 검색자는 다음과 같이 정의됩니다.

  • Name: 자격 증명 스캐너 출력 파일에 사용될 설명적인 검색자 이름입니다. 검색자 이름에 카멜 대/소문자 명명 규칙을 사용하는 것이 좋습니다.

  • RuleId: 검색자의 안정적이고 불투명한 ID입니다.

    • 자격 증명 스캐너 기본 검색자에는 CSCAN0010, CSCAN0020 또는 CSCAN0030과 같은 RuleId 값이 할당됩니다. 마지막 숫자는 regex(정규식)를 통해 검색자 그룹을 잠재적으로 병합하거나 분할하기 위해 예약되어 있습니다.
    • 사용자 지정된 검색자의 Ruleld 값에는 자체 네임스페이스가 있어야 합니다. 예에는 CSCAN-<Namespace>0010, CSCAN-<Namespace>0020 및 CSCAN-<Namespace>0030이 있습니다.
    • 정규화된 검색자 이름은 RuleId 값과 검색자 이름의 조합입니다. 이러한 예로는 CSCAN0010.KeyStoreFiles 및 CSCAN0020.Base64EncodedCertificate가 있습니다.
  • ResourceMatchPattern: 검색자에 대해 확인할 파일 확장명의 Regex입니다.

  • ContentSearchPatterns: 일치시킬 regex 문을 포함하는 문자열 배열입니다. 검색 패턴이 정의되지 않은 경우 ResourceMatchPattern 값과 일치하는 모든 파일이 반환됩니다.

  • ContentSearchFilters: 검색자별 가양성을 필터링하는 regex 구문을 포함하는 문자열 배열입니다.

  • MatchDetails: 검색자의 각 일치 항목에 대해 추가할 설명 메시지, 완화 지침 또는 둘 다입니다.

  • Recommendation: PREfast 보고서 형식을 사용하는 일치에 대한 제안 필드 콘텐츠입니다.

  • Severity: 문제의 심각도 수준을 나타내는 정수입니다. 가장 높은 심각도 수준의 값은 1입니다.

    자격 증명 스캐너 설정을 보여주는 XML

Roslyn 분석기

Roslyn 분석기 작업을 사용할 때 발생하는 일반적인 오류는 무엇인가요?

잘못된 Microsoft.NETCore.App 버전을 사용하여 프로젝트를 복원했습니다.

전체 오류 메시지:

"오류: 프로젝트가 Microsoft.NETCore.App 버전 x.x.x를 사용하여 복원되었지만 현재 설정을 사용하는 경우에는 버전 y.y.y가 대신 사용됩니다. 이 문제를 해결하려면 복원 및 빌드 또는 게시와 같은 후속 작업에 대해 동일한 설정을 사용해야 합니다. 일반적으로 복원 중이 아닌, 빌드 또는 게시 중에 RuntimeIdentifier 속성이 설정된 경우 이 문제가 발생할 수 있습니다."

Roslyn 분석기 작업은 컴파일의 일부로 실행되기 때문에 빌드 컴퓨터의 원본 트리는 빌드 가능한 상태여야 합니다.

기본 빌드와 Roslyn 분석기 단계 사이의 단계로 인해 소스 트리가 빌드를 방해하는 상태가 될 수 있습니다. 이 추가 단계는 dotnet.exe 게시일 수 있습니다. Roslyn 분석기 단계 바로 전에 NuGet 복원을 수행하는 단계를 복제해 보세요. 이 복제된 단계가 원본 트리를 빌드 가능한 상태로 되돌릴 수 있습니다.

csc.exe는 분석기 인스턴스를 만들 수 없습니다.

전체 오류 메시지:

"'csc.exe'가 오류 코드 1로 종료되었습니다. C:\BBBB.dll에서 분석기 AAAA의 인스턴스를 만들 수 없습니다. 파일 또는 어셈블리 'Microsoft.CodeAnalysis, Version = X.X.X.X, Culture = neutral, PublicKeyToken = 31bf3856ad364e35' 또는 해당 종속성 중 하나를 로드할 수 없습니다. 시스템은 지정된 파일을 찾을 수 없습니다."

컴파일러가 Roslyn 분석기를 지원하는지 확인합니다. csc.exe /version 명령을 실행하면 2.6 이상의 버전 값이 보고되어야 합니다.

경우에 따라 .csproj 파일이 Microsoft.Net.Compilers에서 패키지를 참조하여 빌드 컴퓨터의 Visual Studio 설치를 재정의할 수 있습니다. 특정 버전의 컴파일러를 사용하지 않으려는 경우 Microsoft.Net.Compilers에 대한 참조를 제거합니다. 아니면 참조된 패키지의 버전도 2.6 이상인지 확인합니다.

csc.exe /errorlog 옵션에 지정된 오류 로그 경로를 가져오려고 시도합니다. 옵션 및 경로는 Roslyn 분석기 빌드 작업에 대한 로그에 표시됩니다. /errorlog:F:\ts-services-123_work\456\s\Some\Project\Code\Code.csproj.sarif와 같은 형식일 수 있습니다.

C# 컴파일러 버전이 최신 버전이 아닙니다.

C# 컴파일러의 최신 버전을 가져오려면 Microsoft.Net.Compilers로 이동합니다. 설치된 버전을 가져오려면 명령 프롬프트에서 csc.exe /version을 실행합니다. 2\.6 이상 버전의 Microsoft.Net.Compilers NuGet 패키지를 참조해야 합니다.

MSBuild 및 VSBuild 로그를 찾을 수 없습니다.

Roslyn 분석기 빌드 작업은 MSBuild 빌드 작업의 MSBuild 로그에 대해 Azure DevOps를 쿼리해야 합니다. 분석기 작업이 MSBuild 작업 직후에 실행되면 로그를 아직 사용할 수 없습니다. MSBuild 작업과 Roslyn 분석기 작업 사이에 다른 작업을 배치합니다. 다른 작업의 예로는 BinSkim 및 맬웨어 방지 스캐너가 있습니다.

다음 단계

추가 지원이 필요한 경우 Microsoft 보안 코드 분석 지원은 월요일부터 금요일 오전 9시부터 오후 5시(태평양 표준시)까지 제공됩니다.