Примечание
С 31 декабря 2022 г. расширение Microsoft Security Code Analysis (MSCA) прекращается. MSCA заменяется расширением Microsoft Security DevOps Azure DevOps. Следуйте инструкциям в разделе Настройка , чтобы установить и настроить расширение.
Общие вопросы и ответы
Можно ли установить расширение на экземпляре Azure DevOps Server (ранее — Visual Studio Team Foundation Server), а не на экземпляре Azure DevOps?
Нет. Загрузка и установка расширения для Azure DevOps Server (ранее — Visual Studio Team Foundation Server) недоступны.
Необходимо ли запускать анализ кода безопасности Майкрософт со своей сборкой?
Возможно. Это зависит от типа средства анализа. Может требоваться только исходный код или выходные данные сборки.
Например, сканер учетных данных (CredScan) анализирует файлы в структуре папок репозитория кода. Вследствие такого анализа для получения результатов можно запускать CredScan и задачи публикации сборки журналов анализа безопасности в автономной сборке.
Для других средств, например BinSkim для анализа артефактов после сборки, сначала требуется сборка.
Можно ли прервать сборку при обнаружении результатов?
Да. Можно добавить прерывание сборки в случае, если какое-либо средство сообщает о проблеме в файле журнала. Добавьте задачу сборки после анализа и установите флажок для любого инструмента, для которого требуется прерывать сборку.
В пользовательском интерфейсе задачи, выполняемой после анализа, можно прервать сборку, если любой из инструментов сообщает об ошибках или как об ошибках, так и о предупреждениях.
Чем аргументы командной строки в Azure DevOps отличаются от аналогичных аргументов в средствах изолированного компьютера?
Обычно задачи сборки Azure DevOps представляют собой прямые программы-оболочки для аргументов командной строки средств безопасности. В качестве аргументов задаче сборки можно передавать любые аргументы, которые обычно передаются в средство командной строки.
Заметные различия.
- Средства запускаются из исходной папки агента $(Build.SourcesDirectory) или из %BUILD_SOURCESDIRECTORY%. Пример: C:\agent_work\1\s.
- Пути в аргументах могут относиться к корню исходного каталога, приведенного выше. Пути также могут быть абсолютными. Абсолютные пути можно получить с помощью переменных сборки Azure DevOps или путем запуска локального агента с известными расположениями развертывания локальных ресурсов.
- Средства автоматически предоставляют путь к выходному файлу или соответствующую папку. Если указать расположение выходных данных для задачи сборки, это расположение будет заменено на путь к известному расположению журналов в агенте сборки.
- Для некоторых средств изменяются другие аргументы командной строки. Пример: добавление или удаление параметров, которые гарантируют, что графический пользовательский интерфейс не будет запущен.
Можно ли выполнять задачу сборки, например сканер учетных данных, для нескольких репозиториев в сборке Azure DevOps?
Нет. Запуск средств безопасной разработки для нескольких репозиториев в одном конвейере не поддерживается.
Указанный выходной файл не создается, или не удается найти указанный выходной файл.
Задачи сборки отфильтровывают некоторые данные, введенные пользователем. Что касается данного вопроса, они обновляют расположение созданного выходного файла на общее расположение в агенте сборки. Дополнительные сведения об этом расположении см. в ответах на следующие вопросы.
Где сохраняются выходные файлы, созданные средствами?
Задачи сборки автоматически добавляют выходные пути к этому известному расположению в агенте сборки: $(Agent.BuildDirectory)_sdt\logs. Так как мы обеспечиваем стандартизацию на основе этого расположения, у всех команд, создающих или использующих журналы анализа кода, есть доступ к выходным данным.
Можно ли поместить сборку в очередь для выполнения этих задач на размещенном агенте сборки?
Да. Все задачи и инструменты в расширении могут выполняться на размещенном агенте сборки.
Примечание
Задаче сборки сканера защиты от вредоносных программ требуется агент сборки с включенным Защитником Windows. Такой агент предоставляется размещенной Visual Studio 2017, а также более поздними версиями. Эта задача сборки не будет выполняться в размещенном агенте Visual Studio 2015.
Хотя подписи в этих агентах не могут обновляться, подписи всегда должны быть не старее трех часов.
Можно ли выполнять эти задачи сборки как часть конвейера выпуска, а не конвейера сборки?
В большинстве случаев да.
Однако Azure DevOps не поддерживает выполнение задач в конвейерах выпуска, если эти задачи публикуют артефакты. Вследствие этого успешный запуск задачи публикации журналов анализа безопасности в конвейере выпуска невозможен. Задача завершается сбоем с описательным сообщением об ошибке.
Откуда задачи сборки загружают средства?
Задачи сборки могут скачивать пакеты NuGet средств из веб-канала управления пакетами Azure DevOps. Задачи сборки также могут использовать диспетчер пакетов узлов, который должен быть предварительно установлен в агенте сборки. Пример такой установки — команда npm install tslint.
Как влияет установка расширения на мою организацию Azure DevOps?
После его установки задачи сборки безопасности, предоставляемые расширением, становятся доступными для всех пользователей в организации. При создании или изменении конвейера Azure эти задачи доступны в списке коллекции задач сборки. В противном случае установка расширения в организации Azure DevOps не оказывает никакого влияния. При установке параметры учетной записи, параметры проекта или конвейеры не изменяются.
Изменяются ли при установке расширения существующие конвейеры Azure Pipelines?
Нет. Установка расширения делает задачи сборки безопасности доступными для добавления в конвейеры. Вам по-прежнему необходимо добавлять или обновлять определения сборки, чтобы эти средства могли работать с процессом сборки.
Вопросы и ответы по конкретным задачам
В этом разделе представлены вопросы, относящиеся к задачам сборки.
Сканер учетных данных
Каковы распространенные сценарии и примеры подавления?
Ниже приведены сведения о двух наиболее распространенных сценариях подавления.
Подавление всех вхождений заданного секрета в указанном пути
Требуется хэш-ключ секрета из выходного файла CredScan, как показано в следующем примере.
{
"tool": "Credential Scanner",
"suppressions": [
{
"hash": "CLgYxl2FcQE8XZgha9/UbKLTkJkUh3Vakkxh2CAdhtY=",
"_justification": "Secret used by MSDN sample, it is fake."
}
]
}
Предупреждение
Хэш-ключ создается частью соответствующего значения или содержимого файла. Любая редакция исходного кода может изменить хэш-ключ и отключить правило подавления.
Подавление всех секретов в указанном файле или подавление самого файла секретов
Выражение файла может быть именем файла. Оно также может быть частью basename полного пути к файлу или имени файла. Подстановочные знаки не поддерживаются.
В следующих примерах показано подавление файла 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"
}
]
}
Предупреждение
Все будущие секреты, добавленные в файл, также будут автоматически подавляться.
Каковы рекомендации по управлению секретами?
Следующие ресурсы помогают безопасно управлять секретами и получать доступ к конфиденциальным сведениям из приложений.
- Azure Key Vault
- Azure Active Directory (Azure AD)
- MSI AAD
- Управляемые удостоверения для ресурсов Azure
- Управляемые удостоверения в Службе приложений и Функциях Azure
- Библиотека AppAuthentication
Дополнительные сведения см. в записи блога Безопасное управление секретами в облаке.
Можно ли писать собственные пользовательские модули поиска?
Сканер учетных данных использует набор модулей поиска содержимого, который обычно определяется в файле buildsearchers.xml. Файл содержит массив сериализованных объектов XML, представляющих объект ContentSearcher. Программа распространяется с помощью набора надлежащим образом протестированных модулей поиска. Однако вы также можете реализовывать собственные пользовательские модули поиска.
Модуль поиска содержимого определяется следующим образом.
Name: описательное имя модуля поиска, которое будет использоваться в выходных файлах сканера учетных данных. Для имен модулей поиска рекомендуется использовать соглашение об именовании в "верблюжьем" стиле c первой прописной буквой.
RuleId: стабильный непрозрачный идентификатор модуля поиска.
- Модулю поиска сканера учетных данных по умолчанию присваивается значение RuleId CSCAN0010, CSCAN0020 или CSCAN0030. Последняя цифра зарезервирована на случай потенциального слияния или разделения групп модулей поиска с помощью регулярных выражений.
- Значение RuleId для настроенного модуля поиска должно иметь собственное пространство имен. Например, CSCAN-<Namespace>0010, CSCAN-<Namespace>0020 и CSCAN-<Namespace>0030.
- Полное имя модуля поиска — это сочетание значения RuleId и имени модуля поиска. Некоторые примеры: CSCAN0010.KeyStoreFiles и CSCAN0020.Base64EncodedCertificate.
ResourceMatchPattern: регулярное выражение расширений файлов, которое проверяется на соответствие модулю поиска.
ContentSearchPatterns: массив строк, содержащий операторы регулярного выражения для сопоставления. Если шаблоны поиска не определены, возвращаются все файлы, соответствующие значению ResourceMatchPattern.
ContentSearchFilters: массив строк, содержащий операторы регулярного выражения для фильтрации ложноположительных результатов для конкретного модуля поиска.
MatchDetails: описательное сообщение, инструкции по устранению рисков или и то и другое для добавления при каждом соответствии модуля поиска.
Recommendation: содержимое поля предложений для сопоставления с помощью формата отчета PREfast.
Severity: целое число, отражающее уровень серьезности проблемы. Наивысший уровень серьезности имеет значение 1.
Анализаторы Roslyn
Каковы распространенные ошибки при использовании задачи анализаторов Roslyn?
Проект был восстановлен с использованием неверной версии Microsoft.NETCore.App
Полный текст сообщения об ошибке:
"Ошибка: проект был восстановлен с использованием Microsoft.NETCore.App версии x.x.x, однако с текущими параметрами вместо нее будет использоваться версия y.y.y. Чтобы устранить эту проблему, убедитесь, что для операции восстановления и для последующих операций, например сборки или публикации, используются одинаковые параметры. Обычно эта проблема возникает, если свойство RuntimeIdentifier задается во время сборки или публикации, а не во время восстановления".
Поскольку задачи анализаторов Roslyn выполняются в процессе компиляции, исходное дерево на компьютере сборки должно находиться в допустимом для компиляции состоянии.
Шаг между шагами основной сборки и анализаторов Roslyn может перевести исходное дерево в состояние, препятствующее сборке. Возможно, этот дополнительный шаг — dotnet.exe publish. Попробуйте дублировать шаг, на котором выполняется восстановление NuGet, непосредственно перед шагом анализаторов Roslyn. Этот дублированный шаг может вернуть исходное дерево в доступное для сборки состояние.
csc.exe не удается создать экземпляр анализатора
Полный текст сообщения об ошибке:
"'csc.exe' exited with error code 1 -- An instance of analyzer AAAA cannot be created from C:\BBBB.dll : Could not load file or assembly 'Microsoft.CodeAnalysis, Version=X.X.X.X, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified" ("Недопустимое значение "/src" каталога "cwd". Системе не удается найти указанный файл")
Убедитесь, что компилятор поддерживает анализаторы Roslyn. Выполнение команды csc.exe /version должно сообщить значение версии 2.6 или выше.
Иногда файл .csproj может переопределить установку Visual Studio на компьютере сборки путем обращения к пакету из Microsoft.Net.Compilers. Если вы не планируете использовать определенную версию компилятора, удалите ссылки на 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 в командной строке. Убедитесь, что вы ссылаетесь на пакет NuGet Microsoft.Net.Compilers версии 2.6 или выше.
Журналы MSBuild и VSBuild не найдены
Задача сборки анализаторов Roslyn должна получить из Azure DevOps журнал MSBuild для задачи сборки MSBuild. Если задача анализатора запускается сразу после задачи MSBuild, журнал еще не будет доступен. Поместите другие задачи между задачей MSBuild и задачей анализаторов Roslyn. К примерам других задач относятся BinSkim и сканер защиты от вредоносных программ.
Дальнейшие действия
Если вам нужна дополнительная помощь, поддержка анализа кода безопасности Майкрософт доступна с понедельника по пятницу с 09:00 до 17:00 по тихоокеанскому времени.
Подключение: см. документацию по подключению.
Поддержка: отправьте сообщение электронной почты нашей команде поддержки анализа кода безопасности Майкрософт.