Перейти до вмісту

Уроки безпечного коду для Azure DevOps

RansomLeak може залишити в pull request в Azure Repos коментар із посиланням на короткий урок безпечного коду, коли сканер повідомляє про слабке місце в ньому. Це безкоштовно, не потребує облікового запису RansomLeak і не пов’язане з налаштуваннями вашої організації в RansomLeak. Працює в будь-якій організації Azure DevOps Services.

Складників два. Більшості команд достатньо завдання пайплайна. Застосунок RansomLeak — необов’язкове доповнення.

Завдання пайплайна Завдання пайплайна із застосунком
Що читає Файл SARIF від вашого сканера Той самий файл SARIF
Вартість Безкоштовно Безкоштовно, плюс одне місце Basic в Azure DevOps
Позначає завершений урок Під час наступного запуску пайплайна Одразу
Статус pull request Ні Так, ніколи не помилковий
Потрібен адміністратор каталогу Ні Так, один раз

Встановіть RansomLeak Secure Coding Lessons із Visual Studio Marketplace у свою організацію. Потім додайте завдання після кроку, який запускає сканер і записує SARIF.

steps:
# ... your scanner writes results.sarif ...
- task: RansomLeakLessons@1
condition: always()
inputs:
sarif: results.sarif

Завдання працює з CodeQL, Semgrep, Trivy, Gitleaks та іншими інструментами, правила яких мають CWE, CVE або GHSA, а також зі сканерами секретів. Воно запускається лише у збірках pull request для Git-репозиторіїв Azure Repos, тож додайте пайплайн як політику перевірки збірки (build validation) для цільової гілки. Інші збірки його пропускають.

Реєструватися чи додавати секрет не потрібно. Завдання входить у RansomLeak за допомогою власного токена ідентичності пайплайна, який підтверджує, у якій організації, проєкті й репозиторії воно працює. Підключення служби (service connection) не потрібне.

Коли сканер знаходить тип проблеми, для якого є урок, завдання додає до pull request одну гілку коментарів і надалі оновлює саме її. У ній до п’яти уроків, по одному на кожен окремий тип проблеми, кожен займає 5-10 хвилин.

Коментар відображає те, про що повідомляє ваш сканер, тож для меншого шуму запускайте його лише на змінених файлах або з базовим рівнем (baseline). Якщо результат SARIF має baselineState, враховуються лише результати new і updated.

Дозвольте пайплайну коментувати

Section titled “Дозвольте пайплайну коментувати”

Ідентичності пайплайна потрібен дозвіл на коментування. Зробіть це один раз для кожного репозиторію або один раз для всіх:

  1. Відкрийте Project settings, потім Repositories.
  2. Виберіть репозиторій або All Repositories і відкрийте Security.
  3. Виберіть користувача {Project} Build Service ({Organization}).
  4. Встановіть для Contribute to pull requests значення Allow.

Розділ Security репозиторію в Azure DevOps: для Build Service проєкту дозвіл Contribute to pull requests має значення Allow

Якщо дозволу немає, завдання виводить ці кроки як попередження й нічого не публікує.

Коли хтось завершує урок, позначка з’являється в гілці коментарів під час наступного запуску пайплайна для цього pull request, наприклад після наступного push. Без застосунку між запусками в pull request нічого не записується.

Завдання ніколи не завершує вашу збірку помилкою. Якщо RansomLeak недоступний, дозволу немає або файл SARIF відсутній чи пошкоджений, воно записує попередження й продовжує роботу. Pull request із форків пропускаються.

Тред RansomLeak у pull request: два уроки позначено як завершені, один ще відкритий

Застосунок RansomLeak (необов’язково)

Section titled “Застосунок RansomLeak (необов’язково)”

Застосунок позначає уроки одразу після завершення й встановлює статус pull request. Для цього у вашій організації потрібні три речі:

  • Схвалення адміністратора каталогу. Глобальний адміністратор, адміністратор хмарних застосунків або адміністратор застосунків Microsoft Entra схвалює застосунок для вашого тенанта.
  • Доступ Basic. Додайте застосунок до організації Azure DevOps як користувача з доступом Basic і до проєкту з репозиторієм. Доступ Stakeholder не бачить репозиторіїв. Кожна організація має 5 безкоштовних користувачів Basic: якщо одне місце вільне, воно нічого не коштує, інакше це платне місце Basic, яке ви купуєте в Microsoft.
  • Contribute to pull requests. Надайте цей дозвіл застосунку так само, як для Build Service вище, вибравши RansomLeak Secure Coding.

Щоб підключитися, відкрийте app.ransomleak.com/azure-devops/connect і виберіть Sign in with Microsoft. Після схвалення вкажіть організацію, проєкт і репозиторій і виберіть Check access. Сторінка точно покаже, чого бракує.

Сторінка підключення RansomLeak після успішної перевірки доступу: три пройдені перевірки

Після підключення уроки завдання публікуються від імені застосунку, а завершений урок позначається одразу. Застосунок також встановлює статус pull request ransomleak/secure-coding. Поки уроки відкриті, він має значення pending, а коли всі перелічені уроки завершено, — succeeded. Він ніколи не буває помилковим.

Застосунок редагує лише ті гілки коментарів, які створив сам. Якщо в pull request завдання вже опублікувало гілку до підключення застосунку, застосунок створить власну з усіма уроками й позначками та закриє гілку завдання, тож активною залишиться одна гілка з уроками. Це працює й навпаки: якщо застосунок відключено, наступний запуск завдання оновить свою гілку й закриє гілку застосунку.

Не робіть цей статус обов’язковою політикою: pull request без уроків ніколи про нього не звітують.

Якщо застосунок втрачає доступ, наприклад його видалено з організації, він позначається відключеним, і завдання знову бере роботу на себе. Повторний запуск Check access знову підключає його. Щоб припинити використання застосунку, виберіть Disconnect на сторінці підключення й видаліть його з користувачів організації.

Організації, які не прив’язані до Microsoft Entra ID, можуть використовувати лише завдання.

  • SQL-ін’єкції
  • Міжсайтовий скриптинг (XSS)
  • Обхід шляху (path traversal)
  • Ін’єкції команд
  • Підробка запитів на боці сервера (SSRF)
  • Секрети в коді
  • Зовнішні сутності XML (XXE)
  • Відкрите перенаправлення
  • Міжсайтова підробка запитів (CSRF)
  • Вразливі залежності

Для десеріалізації та слабкої криптографії уроків поки немає.

Знахідка зіставляється за її CWE. Знахідки сканерів секретів і рекомендації щодо залежностей зіставляються за типом сканера. Категорії OWASP і широкі батьківські CWE, як-от CWE-200, не використовуються, бо вони не вказують на один конкретний урок.

Виправлення коду не прибирає урок із гілки коментарів.

Завдання надсилає лише ідентифікатори: назву сканера, ідентифікатори CWE правил, що дали результат, ознаку того, що правило є рекомендацією CVE або GHSA, і номер pull request. Організація, проєкт і репозиторій беруться з токена ідентичності пайплайна. Вихідний код, шляхи до файлів, повідомлення, фрагменти й секрети не залишають агент.

Кожне посилання на урок містить токен з назвами й ідентифікаторами організації та проєкту, ідентифікатором репозиторію, номером pull request, уроком і внутрішніми ідентифікаторами. Вони потрібні, щоб завершений урок потрапив до правильного pull request. Токен підписаний, але не зашифрований, тому будь-хто з посиланням може його декодувати й прочитати ці значення.

RansomLeak не зберігає персональних даних розробників. Зберігається:

  • До двох записів про встановлення для кожної організації: один для завдання і, якщо ви його підключите, один для застосунку. Кожен містить ідентифікатори, а також ключ підпису й секрет прийому даних, які генеруємо ми й зберігаємо в зашифрованому вигляді. Запис застосунку також містить назву організації, ідентифікатор вашого тенанта Microsoft Entra і час підключення. Жодних персональних даних. Служба підтримки видаляє їх на запит.
  • Для кожного завершеного уроку одна позначка завершення для кожної організації, репозиторію, pull request і уроку, лише з ідентифікаторами й часом. Вона видаляється через 30 днів.

Див. політику конфіденційності.

Завершення не підтверджується

Section titled “Завершення не підтверджується”

Посилання на урок належить pull request, а не людині. Будь-хто, хто може відкрити pull request, може відкрити посилання й позначити урок завершеним.

Позначка означає, що урок завершено за цим посиланням. Сприймайте її як підказку, а не як доказ того, хто саме пройшов навчання.

  • Уроки англійською.
  • Лише Azure DevOps Services. Azure DevOps Server не підтримується.
  • Сповіщення GitHub Advanced Security for Azure DevOps самі по собі не створюють уроків, бо сповіщення, знайдені в гілках pull request, не зберігаються. Експортуйте результати сканування як SARIF і передайте файл завданню.
  • Pull request із форків не підтримуються.
  • Урок з’являється лише тоді, коли знахідка сканера має відповідний урок. Для знахідок без відповідного уроку коментаря немає, зокрема для знахідок лише з категорією OWASP.