Назад к обновлениям
New releaseSep 4, 2026

safe-chain v1.5.16

Защититесь от вредоносного кода, устанавливаемого через npm, yarn, pnpm, npx, pnpx, pip, uv и poetry, с помощью Aikido Safe Chain. Бесплатно, токены не требуются.

Поделиться

Aikido Safe Chain

Aikido Safe Chain

NPM Version NPM Downloads

  • Блокирует вредоносное ПО на ноутбуках разработчиков и в CI/CD
  • Поддерживает npm и PyPI — другие менеджеры пакетов скоро появятся
  • Блокирует пакеты новее 48 часов, не ломая вашу сборку
  • Без токенов, бесплатно, данные о сборках не передаются

Нужна защита за пределами npm и PyPI?

Aikido Device Protection строится на Safe Chain, расширяя защиту пакетов и расширений на большее количество экосистем: npm, PyPI, VS Code, Open VSX — (Cursor, Windsurf, Kiro, Vs Codium, ...), Maven, NuGet, Chrome extensions, Go, Skills.sh AI skills, Ruby, Rust и другие.

Получите централизованное управление политиками, рабочие процессы запроса и утверждения, а также видимость на каждой рабочей станции разработчика в вашей организации. Работает на том же канале данных Aikido Intel. Разверните вручную или управляйте через ваш MDM-инструмент (Jamf, Fleet или Iru).


Aikido Safe Chain поддерживает следующие менеджеры пакетов:

  • 📦 npm
  • 📦 npx
  • 📦 yarn
  • 📦 pnpm
  • 📦 pnpx
  • 📦 rush
  • 📦 rushx
  • 📦 bun
  • 📦 bunx
  • 📦 pip
  • 📦 pip3
  • 📦 uv
  • 📦 poetry
  • 📦 uvx
  • 📦 pipx
  • 📦 pdm

Использование

Aikido Safe Chain demo

Установка

Установить Aikido Safe Chain легко с помощью скрипта установки.

Unix/Linux/macOS```shell

curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.16/install-safe-chain.sh -o /tmp/install-safe-chain.sh
&& echo "7a7b6e54c2e0adbcb53bc1bf7d258cc974f8f31e77ed048b88e4d2e4ac758839 /tmp/install-safe-chain.sh" | sha256sum -c -
&& sh /tmp/install-safe-chain.sh
&& rm /tmp/install-safe-chain.sh

### Windows (PowerShell)```powershell
$installer = Join-Path $env:TEMP "install-safe-chain.ps1"
Invoke-WebRequest "https://github.com/AikidoSec/safe-chain/releases/download/1.5.16/install-safe-chain.ps1" -OutFile $installer -UseBasicParsing
$expectedHash = "6F46B5CFA42DDF9545616E169A567E764CE179E6321E6555D2C3A81768E2635D"
if ((Get-FileHash $installer -Algorithm SHA256).Hash -ne $expectedHash) {
    Remove-Item $installer -ErrorAction SilentlyContinue
    throw "Checksum verification failed for install-safe-chain.ps1"
}
& $installer
Remove-Item $installer

Команды установки выше всегда ссылаются на конкретный релиз. Чтобы установить другую версию, замените версию на нужный номер. Все доступные версии находятся на странице релизов.

Проверка целостности загрузки

Скрипты установки обслуживаются с URL-адреса версионированного релиза (releases/download/1.5.16/...). Релизы GitHub неизменяемы — после публикации артефакта по URL-адресу с версией его нельзя изменить или заменить, поэтому загружаемый файл гарантированно будет именно тем, что было выпущено.

Проверка установки

  1. ❗Перезапустите терминал, чтобы начать использовать Aikido Safe Chain.

    • Этот шаг крайне важен, поскольку он гарантирует, что псевдонимы оболочки для npm, npx, yarn, pnpm, pnpx, rush, rushx, bun, bunx, pip, pip3, poetry, uv, uvx, pipx и pdm загружены корректно. Если вы не перезапустите терминал, псевдонимы будут недоступны.
  2. Проверьте установку, выполнив команду проверки: ```shell npm safe-chain-verify pnpm safe-chain-verify pip safe-chain-verify uv safe-chain-verify

    Any other supported package manager: {packagemanager} safe-chain-verify

  • На выходе должно отобразиться «OK: Safe-chain works!», подтверждающее, что Aikido Safe Chain корректно установлен и запущен.
  1. (Необязательно) Проверьте блокировку вредоносного ПО, попытавшись установить тестовый пакет:

    Для JavaScript/Node.js: ```shell npm install safe-chain-test

Для Python: ```shell pip3 install safe-chain-pi-test

- Вывод должен показывать, что Aikido Safe Chain блокирует установку этих тестовых пакетов, поскольку они помечены как вредоносное ПО.

При выполнении команд `npm`, `npx`, `yarn`, `pnpm`, `pnpx`, `rush`, `rushx`, `bun`, `bunx`, `pip`, `pip3`, `uv`, `uvx`, `poetry`, `pipx` и `pdm` Aikido Safe Chain автоматически проверяет пакеты, которые вы пытаетесь установить, на наличие вредоносного ПО. Он также перехватывает вызовы модулей Python для pip, когда это доступно (например, `python -m pip install ...`, `python3 -m pip download ...`). Если обнаружено вредоносное ПО, вам будет предложено выйти из команды.

Проверить установленную версию можно, выполнив:```shell
safe-chain --version

Как это работает

Блокировка вредоносного ПО

Aikido Safe Chain работает, запуская легковесный прокси-сервер, который перехватывает загрузки пакетов из реестра npm и PyPI. Когда вы выполняете команды npm, npx, yarn, pnpm, pnpx, rush, rushx, bun, bunx, pip, pip3, uv, uvx, poetry, pipx или pdm, все загрузки пакетов направляются через этот локальный прокси, который проверяет пакеты в реальном времени по данным Aikido Intel - Open Sources Threat Intelligence. Если в каком-либо пакете (включая глубокие зависимости) обнаружено вредоносное ПО, прокси блокирует загрузку до того, как вредоносный код достигнет вашей машины.

Минимальный возраст пакета

Safe Chain применяет проверки минимального возраста пакета для поддерживаемых экосистем.

Текущие правила различаются в зависимости от экосистемы:

  • Менеджеры пакетов на основе npm:
    • во время обычного разрешения пакетов Safe Chain подавляет версии, которые новее настроенного минимального возраста, из метаданных пакета, возвращаемых реестром
    • для прямых запросов на загрузку пакета, которые обходят этот поток метаданных, Safe Chain может заблокировать сам запрос, используя кэшированный список недавно выпущенных пакетов
  • Менеджеры пакетов Python:
    • во время разрешения пакетов Safe Chain подавляет слишком свежие файлы и релизы из ответов метаданных PyPI
    • для прямых запросов на загрузку пакета, которые обходят этот поток метаданных, Safe Chain может заблокировать сам запрос, используя кэшированный список недавно выпущенных пакетов

По умолчанию минимальный возраст пакета составляет 48 часов. Это обеспечивает дополнительный уровень безопасности в критический период, когда недавно опубликованные пакеты наиболее уязвимы для содержания необнаруженных угроз. Вы можете настроить этот порог или полностью отключить эту защиту — см. раздел Конфигурация минимального возраста пакета ниже.

Интеграция с оболочкой

Aikido Safe Chain интегрируется с вашей оболочкой, обеспечивая бесшовный опыт при использовании npm, npx, yarn, pnpm, pnpx, rush, rushx, bun, bunx и менеджеров пакетов Python (pip, uv, uvx, poetry, pipx, pdm). Он настраивает алиасы для этих команд, чтобы они оборачивались командами Aikido Safe Chain, которые управляют прокси-сервером перед выполнением исходных команд. В настоящее время мы поддерживаем:

  • Bash
  • Zsh
  • Fish
  • PowerShell
  • PowerShell Core

Дополнительная информация об интеграции с оболочкой доступна в документации по интеграции с оболочкой.

Удаление

Чтобы удалить Aikido Safe Chain, используйте наш однострочный деинсталлятор:

Unix/Linux/macOS```shell

curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.16/uninstall-safe-chain.sh | sh

### Windows (PowerShell)```powershell
iex (iwr "https://github.com/AikidoSec/safe-chain/releases/download/1.5.16/uninstall-safe-chain.ps1" -UseBasicParsing)

❗Перезапустите терминал после удаления, чтобы убедиться, что все алиасы удалены.

Конфигурация

Логирование

Вы можете управлять выводом Aikido Safe Chain с помощью флага --safe-chain-logging или переменной окружения SAFE_CHAIN_LOGGING.

Параметры конфигурации

Уровень логирования можно задать через несколько источников (в порядке приоритета):

  1. Аргумент командной строки (наивысший приоритет):

    • --safe-chain-logging=silent — подавляет весь вывод Aikido Safe Chain, кроме случаев блокировки вредоносного ПО. Вывод менеджера пакетов записывается в stdout как обычно, а Safe Chain выводит только короткое сообщение, если он заблокировал вредоносное ПО и вызвал завершение процесса.

      npm install express --safe-chain-logging=silent
      
    • --safe-chain-logging=verbose — включает подробный диагностический вывод от Aikido Safe Chain. Полезно для устранения неполадок или понимания того, что Safe Chain делает в фоновом режиме.

      npm install express --safe-chain-logging=verbose
      
  2. Переменная окружения: ```shell export SAFE_CHAIN_LOGGING=verbose npm install express

Допустимые значения: silent, normal, verbose

Это полезно для установки уровня логирования по умолчанию для всех команд менеджера пакетов в вашем терминальном сеансе или в среде CI/CD.

Логирование в файл

Вы можете дублировать вывод Aikido Safe Chain в файл журнала с помощью флага --safe-chain-log-file или переменной окружения SAFE_CHAIN_LOG_FILE. Логирование в файл отключено по умолчанию и включается при указании пути. Формат файла (--safe-chain-log-file-format) и уровень подробности (--safe-chain-log-file-verbosity) управляются независимо от вывода в терминал.

Параметры конфигурации

Задаются через любой из этих способов (в порядке приоритета):

  1. Аргумент командной строки (наивысший приоритет): ```shell npm install express
    --safe-chain-log-file=~/safe-chain.log
    --safe-chain-log-file-format=plain
    --safe-chain-log-file-verbosity=normal
  2. Переменная окружения: ```shell export SAFE_CHAIN_LOG_FILE=~/safe-chain.log export SAFE_CHAIN_LOG_FILE_FORMAT=plain export SAFE_CHAIN_LOG_FILE_VERBOSITY=normal
  3. Файл конфигурации (~/.safe-chain/config.json): ```json { "logFile": "~/safe-chain.log", "logFileFormat": "plain", "logFileVerbosity": "normal" }

logFileFormatjson (по умолчанию) или plain.

logFileVerbositysilent, normal или verbose (по умолчанию). Не зависит от --safe-chain-logging.

Минимальный возраст пакета

Вы можете настроить, как долго пакеты должны существовать, прежде чем Safe Chain разрешит их установку. По умолчанию пакеты должны быть не моложе 48 часов, прежде чем их можно будет установить.

Для менеджеров пакетов на основе npm эта проверка в настоящее время имеет два режима применения:

  • Safe Chain скрывает слишком молодые версии из метаданных пакетов во время обычного разрешения зависимостей.
  • Safe Chain блокирует прямые запросы на загрузку пакетов, когда они сопоставляются с кэшированным списком недавно выпущенных пакетов.

Для менеджеров пакетов Python эта проверка в настоящее время имеет два режима применения:

  • Safe Chain скрывает слишком молодые файлы и релизы из метаданных PyPI во время разрешения зависимостей.
  • Safe Chain блокирует прямые запросы на загрузку пакетов, когда они сопоставляются с кэшированным списком недавно выпущенных пакетов.

Параметры конфигурации

Вы можете задать минимальный возраст пакета через несколько источников (в порядке приоритета):

  1. Аргумент CLI (наивысший приоритет): ```shell npm install express --safe-chain-minimum-package-age-hours=48
  2. Переменная окружения: ```shell export SAFE_CHAIN_MINIMUM_PACKAGE_AGE_HOURS=48 npm install express
  3. Файл конфигурации (~/.safe-chain/config.json): ```json { "minimumPackageAgeHours": 48 }

Исключение пакетов

Исключите доверенные пакеты из фильтрации по минимальному возрасту через переменную окружения или файл конфигурации (оба объединяются). Используйте @scope/*, чтобы доверять всем пакетам из организации:```shell export SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS="@aikidosec/*"

📦 Установка

🐍 Установка с помощью pip

pip install pywhisker

🐳 Установка с помощью Docker

docker build -t pywhisker .
docker run -it pywhisker

🛠️ Установка из исходного кода

git clone https://github.com/ShutdownRepo/pywhisker.git
cd pywhisker
pip install -r requirements.txt

🚀 Использование

Базовый синтаксис

pywhisker -d <домен> -u <пользователь> -p <пароль> --target <целевой_пользователь> --action <действие>

Доступные действия

ДействиеОписание
listПеречисляет атрибуты msDS-KeyCredentialLink целевого объекта
addДобавляет новый ключ к атрибуту msDS-KeyCredentialLink целевого объекта
removeУдаляет ключ из атрибута msDS-KeyCredentialLink целевого объекта
clearОчищает атрибут msDS-KeyCredentialLink целевого объекта
infoПоказывает информацию о конкретном ключе
exportЭкспортирует ключ в формате PFX

Примеры

Перечисление ключей

pywhisker -d "contoso.local" -u "john.doe" -p "P@ssw0rd" --target "victim" --action list

Добавление нового ключа

pywhisker -d "contoso.local" -u "john.doe" -p "P@ssw0rd" --target "victim" --action add --filename exported_key

Удаление ключа

pywhisker -d "contoso.local" -u "john.doe" -p "P@ssw0rd" --target "victim" --action remove --key-id <идентификатор_ключа>

Параметры аутентификации

ПараметрОписание
-d, --domainДомен (FQDN)
-u, --userИмя пользователя
-p, --passwordПароль
-k, --kerberosИспользовать аутентификацию Kerberos
--dc-ipIP-адрес контроллера домена
--use-ldapsИспользовать LDAPS вместо LDAP
--hashesИспользовать хэши NTLM для аутентификации
--aes-keyИспользовать ключ AES для аутентификации
{
  "npm": {
    "minimumPackageAgeExclusions": ["@aikidosec/*"]
  },
  "pip": {
    "minimumPackageAgeExclusions": ["requests"]
  }
}
```
## Пользовательские реестры

Настройте Safe Chain для сканирования пакетов из пользовательских или частных реестров.

Поддерживаемые экосистемы:

- Node.js
- Python

### Параметры конфигурации

Вы можете задать пользовательские реестры через переменную окружения или файл конфигурации. Оба источника объединяются вместе.

1. **Переменная окружения** (через запятую):   ```shell
   export SAFE_CHAIN_NPM_CUSTOM_REGISTRIES="npm.company.com,registry.internal.net"
   export SAFE_CHAIN_PIP_CUSTOM_REGISTRIES="pip.company.com,registry.internal.net"
   ```
2. **Файл конфигурации** (`~/.safe-chain/config.json`):   ```json
   {
     "npm": {
       "customRegistries": ["npm.company.com", "registry.internal.net"]
     },
     "pip": {
       "customRegistries": ["pip.company.com", "registry.internal.net"]
     }
   }
   ```
## Файл конфигурации PYPI

Если вы полагаетесь на файл `pip.conf` для конфигурации pip, вы должны явно указать на него pip через переменную окружения `PIP_CONFIG_FILE`, чтобы Safe Chain мог объединить его.

Safe Chain запускает pip за своим MITM-прокси и записывает временный файл конфигурации pip для внедрения своего сертификата и настроек прокси. Когда задан `PIP_CONFIG_FILE`, Safe Chain объединяет свои настройки в копию вашего файла (ваш исходный файл никогда не изменяется), поэтому ваши `index-url`, учетные данные и другие параметры сохраняются. Когда `PIP_CONFIG_FILE` не задан, пользовательская конфигурация pip (например, `~/.config/pip/pip.conf`) может быть переопределена временным файлом Safe Chain, и ваши настройки не будут учтены.

## Базовый URL списка вредоносных программ

Настройте Safe Chain для получения баз данных вредоносных программ и списков новых пакетов с пользовательского зеркального URL. Это позволяет размещать собственную копию базы данных вредоносных программ Aikido.

### Параметры конфигурации

Вы можете задать базовый URL списка вредоносных программ через несколько источников (в порядке приоритета):

1. **Аргумент CLI** (наивысший приоритет):   ```shell
   npm install express --safe-chain-malware-list-base-url=https://your-mirror.com
   ```
2. **Переменная окружения**:   ```shell
   export SAFE_CHAIN_MALWARE_LIST_BASE_URL=https://your-mirror.com
   npm install express
   ```
3. **Файл конфигурации** (`~/.safe-chain/config.json`):   ```json
   {
     "malwareListBaseUrl": "https://your-mirror.com"
   }
   ```
Базовый URL должен указывать на сервер, который повторяет структуру `https://malware-list.aikido.dev/`, включая следующие пути:
- `/malware_predictions.json` (база данных вредоносных программ в экосистеме JavaScript)
- `/malware_pypi.json` (база данных вредоносных программ в экосистеме Python)
- `/releases/npm.json` (список новых пакетов JavaScript)
- `/releases/pypi.json` (список новых пакетов Python)

## Файл конфигурации проекта

В дополнение к файлу конфигурации в домашнем каталоге (`~/.safe-chain/config.json`), Safe Chain поддерживает файл конфигурации проекта, чтобы настройки можно было хранить в репозитории и использовать совместно всей командой, а не настраивать на каждой машине отдельно.

Добавьте раздел `safe-chain:` в файл `.aikido` в корне вашего репозитория (тот же файл, который используется другими инструментами Aikido; Safe Chain читает только свой собственный раздел `safe-chain:` и игнорирует остальное). При обнаружении его настройки объединяются поверх файла конфигурации из домашнего каталога: значения, заданные в конфигурации проекта, имеют приоритет, а массивы (например, `customRegistries`) объединяются из обоих файлов, а не заменяются одним другим.

Из файла конфигурации проекта можно задать только следующие настройки:```yaml
safe-chain:
  minimumPackageAgeHours: 48
  npm:
    customRegistries:
      - npm.company.com
    minimumPackageAgeExclusions:
      - "@aikidosec/*"
  pip:
    customRegistries:
      - pip.company.com
    minimumPackageAgeExclusions:
      - requests
```
Настройки, такие как `scanTimeout`, `malwareListBaseUrl` и параметры `logFile*`, не могут быть заданы из файла конфигурации проекта — они могут поступать только из конфигурации в вашем домашнем каталоге, аргументов командной строки или переменных окружения.

## Пользовательский каталог установки

По умолчанию Safe Chain устанавливается в `~/.safe-chain`. Вы можете изменить это, передав установщику явный каталог установки. Это полезно для системных установок (например, внутри Docker-образа) или когда необходимо избежать конфликтов с другими инструментами.

При задании этого параметра все данные Safe Chain (бинарный файл, shims, скрипты, конфигурация) размещаются в пользовательском каталоге вместо `~/.safe-chain`.

### Unix/Linux/macOS```shell
curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.16/install-safe-chain.sh -o /tmp/install-safe-chain.sh \
  && echo "7a7b6e54c2e0adbcb53bc1bf7d258cc974f8f31e77ed048b88e4d2e4ac758839  /tmp/install-safe-chain.sh" | sha256sum -c - \
  && sh /tmp/install-safe-chain.sh --install-dir /usr/local/.safe-chain \
  && rm /tmp/install-safe-chain.sh
```
### Windows```powershell
$installer = Join-Path $env:TEMP "install-safe-chain.ps1"
Invoke-WebRequest "https://github.com/AikidoSec/safe-chain/releases/download/1.5.16/install-safe-chain.ps1" -OutFile $installer -UseBasicParsing
$expectedHash = "6F46B5CFA42DDF9545616E169A567E764CE179E6321E6555D2C3A81768E2635D"
if ((Get-FileHash $installer -Algorithm SHA256).Hash -ne $expectedHash) {
    Remove-Item $installer -ErrorAction SilentlyContinue
    throw "Checksum verification failed for install-safe-chain.ps1"
}
& $installer -InstallDir 'C:\ProgramData\safe-chain'
Remove-Item $installer
```
# Использование в CI/CD

Вы можете защитить свои CI/CD конвейеры от вредоносных пакетов, интегрировав Aikido Safe Chain в процесс сборки. Это гарантирует, что любые пакеты, устанавливаемые во время автоматических сборок, проверяются на наличие вредоносного ПО перед установкой.

## Установка для CI/CD

Используйте флаг `--ci`, чтобы автоматически настроить Aikido Safe Chain для сред CI/CD. Это создает исполняемые заглушки (shims) в PATH вместо псевдонимов оболочки.

### Unix/Linux/macOS (GitHub Actions, Azure Pipelines и др.)```shell
curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.16/install-safe-chain.sh -o /tmp/install-safe-chain.sh \
  && echo "7a7b6e54c2e0adbcb53bc1bf7d258cc974f8f31e77ed048b88e4d2e4ac758839  /tmp/install-safe-chain.sh" | sha256sum -c - \
  && sh /tmp/install-safe-chain.sh --ci \
  && rm /tmp/install-safe-chain.sh
```
### Windows (Azure Pipelines и т. д.)```powershell
$installer = Join-Path $env:TEMP "install-safe-chain.ps1"
Invoke-WebRequest "https://github.com/AikidoSec/safe-chain/releases/download/1.5.16/install-safe-chain.ps1" -OutFile $installer -UseBasicParsing
$expectedHash = "6F46B5CFA42DDF9545616E169A567E764CE179E6321E6555D2C3A81768E2635D"
if ((Get-FileHash $installer -Algorithm SHA256).Hash -ne $expectedHash) {
    Remove-Item $installer -ErrorAction SilentlyContinue
    throw "Checksum verification failed for install-safe-chain.ps1"
}
& $installer -ci
Remove-Item $installer
```
## Поддерживаемые платформы

- ✅ **GitHub Actions**
- ✅ **Azure Pipelines**
- ✅ **CircleCI**
- ✅ **Jenkins**
- ✅ **Bitbucket Pipelines**
- ✅ **GitLab Pipelines**

## Пример GitHub Actions```yaml
- name: Setup Node.js
  uses: actions/setup-node@v4
  with:
    node-version: "22"
    cache: "npm"

- name: Install safe-chain
  run: |
    curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.16/install-safe-chain.sh -o /tmp/install-safe-chain.sh
    echo "7a7b6e54c2e0adbcb53bc1bf7d258cc974f8f31e77ed048b88e4d2e4ac758839  /tmp/install-safe-chain.sh" | sha256sum -c -
    sh /tmp/install-safe-chain.sh --ci
    rm /tmp/install-safe-chain.sh

- name: Install dependencies
  run: npm ci
```
## Пример Azure DevOps```yaml
- task: NodeTool@0
  inputs:
    versionSpec: "22.x"
  displayName: "Install Node.js"

- script: |
    curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.16/install-safe-chain.sh -o /tmp/install-safe-chain.sh
    echo "7a7b6e54c2e0adbcb53bc1bf7d258cc974f8f31e77ed048b88e4d2e4ac758839  /tmp/install-safe-chain.sh" | sha256sum -c -
    sh /tmp/install-safe-chain.sh --ci
    rm /tmp/install-safe-chain.sh
  displayName: "Install safe-chain"

- script: npm ci
  displayName: "Install dependencies"
```
## Пример CircleCI```yaml
version: 2.1
jobs:
  build:
    docker:
      - image: cimg/node:lts
    steps:
      - checkout
      - run: |
          curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.16/install-safe-chain.sh -o /tmp/install-safe-chain.sh
          echo "7a7b6e54c2e0adbcb53bc1bf7d258cc974f8f31e77ed048b88e4d2e4ac758839  /tmp/install-safe-chain.sh" | sha256sum -c -
          sh /tmp/install-safe-chain.sh --ci
          rm /tmp/install-safe-chain.sh
      - run: npm ci
workflows:
  build_and_test:
    jobs:
      - build
```
## Пример Jenkins

Примечание: Предполагается, что Node.js и npm установлены на агенте Jenkins.```groovy
pipeline {
  agent any

  environment {
    // Jenkins does not automatically persist PATH updates from setup-ci,
    // so add the shims + binary directory explicitly for all stages.
    // If you installed into a custom directory, replace ~/.safe-chain with that path here.
    PATH = "${env.HOME}/.safe-chain/shims:${env.HOME}/.safe-chain/bin:${env.PATH}"
  }

  stages {
    stage('Install safe-chain') {
      steps {
        sh '''
          set -euo pipefail

          # Install Safe Chain for CI
          curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.16/install-safe-chain.sh -o /tmp/install-safe-chain.sh
          echo "7a7b6e54c2e0adbcb53bc1bf7d258cc974f8f31e77ed048b88e4d2e4ac758839  /tmp/install-safe-chain.sh" | sha256sum -c -
          sh /tmp/install-safe-chain.sh --ci
          rm /tmp/install-safe-chain.sh
        '''
      }
    }

    stage('Install project dependencies etc...') {
      steps {
        sh '''
          set -euo pipefail
          npm ci
        '''
      }
    }
  }
}
```
## Пример Bitbucket Pipelines```yaml
image: node:22

steps:
  - step:
      name: Install
      script:
        - |
          curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.16/install-safe-chain.sh -o /tmp/install-safe-chain.sh
          echo "7a7b6e54c2e0adbcb53bc1bf7d258cc974f8f31e77ed048b88e4d2e4ac758839  /tmp/install-safe-chain.sh" | sha256sum -c -
          sh /tmp/install-safe-chain.sh --ci
          rm /tmp/install-safe-chain.sh
        - export PATH=~/.safe-chain/shims:~/.safe-chain/bin:$PATH
        - npm ci
```
После настройки все последующие команды менеджера пакетов в вашем конвейере CI будут автоматически защищены обнаружением вредоносных программ Aikido Safe Chain.

## Пример конвейеров GitLab

Чтобы добавить safe-chain в конвейеры GitLab, необходимо установить его в образ, выполняющий конвейер. Это можно сделать следующим образом:

1. Определите dockerfile для запуска вашей сборки   ```dockerfile
   FROM node:lts

   # Install safe-chain
   RUN curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.16/install-safe-chain.sh -o /tmp/install-safe-chain.sh \
     && echo "7a7b6e54c2e0adbcb53bc1bf7d258cc974f8f31e77ed048b88e4d2e4ac758839  /tmp/install-safe-chain.sh" | sha256sum -c - \
     && sh /tmp/install-safe-chain.sh --ci \
     && rm /tmp/install-safe-chain.sh

   # Add safe-chain to PATH (update paths if you used a custom install dir)
   ENV PATH="/root/.safe-chain/shims:/root/.safe-chain/bin:${PATH}"
   ```
2. Соберите Docker-образ в вашем CI-конвейере   ```yaml
   build-image:
     stage: build-image
     image: docker:latest
     services:
       - docker:dind
     script:
       - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
       - docker build -t $CI_REGISTRY_IMAGE:latest .
       - docker push $CI_REGISTRY_IMAGE:latest
   ```
3. Используйте образ в вашем конвейере:   ```yaml
   npm-ci:
     stage: install
     image: $CI_REGISTRY_IMAGE:latest
     script:
       - npm ci
   ```
Полный конвейер для этого примера выглядит так:```yaml
stages:
  - build-image
  - install

build-image:
  stage: build-image
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t $CI_REGISTRY_IMAGE:latest .
    - docker push $CI_REGISTRY_IMAGE:latest

npm-ci:
  stage: install
  image: $CI_REGISTRY_IMAGE:latest
  script:
    - npm ci
```
# Устранение неполадок

Возникли проблемы? Обратитесь к [Руководству по устранению неполадок](https://github.com/aikidosec/safe-chain/blob/main/docs/troubleshooting.md) за помощью с распространёнными проблемами.

# Сообщить о проблемах

Если вы столкнулись с проблемами:

1. Посетите [GitHub Issues](https://github.com/AikidoSec/safe-chain/issues)
2. Укажите:
   * Операционную систему и её версию
   * Тип оболочки и её версию
   * Вывод команды `safe-chain --version`
   * Вывод команд проверки
   * Подробные журналы сбойной команды (добавьте аргумент `--safe-chain-logging=verbose`)

Категории