
Aikido Safe Chain を使用して、npm、yarn、pnpm、npx、pnpx、pip、uv、poetry を介してインストールされた悪意のあるコードから保護します。無料で使用でき、トークンは不要です。
Aikido Device Protection はSafe Chainを基盤に、パッケージと拡張機能のセキュリティをさらに多くのエコシステムに拡張します: npm, PyPI, VS Code, Open VSX - (Cursor, Windsurf, Kiro, Vs Codium, ...), Maven, NuGet, Chrome拡張機能, Go, Skills.sh AIスキル, Ruby, Rust, など。
一元化されたポリシー管理、リクエストと承認のワークフロー、そして組織内のすべての開発者ワークステーションにわたる可視性を実現します。同じAikidoインテルフィードを利用しています。手動でデプロイするか、MDMツール(Jamf、Fleet、Iru)で管理できます。
Aikido Safe Chainは以下のパッケージマネージャーをサポートしています:

Aikido Safe Chainのインストールは、インストールスクリプトを使えば簡単です。
curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.15/install-safe-chain.sh -o /tmp/install-safe-chain.sh
&& echo "de0565e3d6346407a604e84e639e95fea8758748063da2216bbfdca5feda5dd2 /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.15/install-safe-chain.ps1" -OutFile $installer -UseBasicParsing
$expectedHash = "5FC22EEF74814BEF6828AA07C0EAEC79598F343F98B94A4ACAB823769AD56DA1"
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.15/...)から提供されます。GitHubリリースは不変です — バージョン付きURLでアーティファクトが公開されると、それを変更したり置き換えたりすることはできないため、ダウンロードするファイルはリリースされたものと正確に一致することが保証されます。
❗ターミナルを再起動 して、Aikido Safe Chainを使い始めます。
インストールの確認 は、確認コマンドを実行して行います: ```shell npm safe-chain-verify pnpm safe-chain-verify pip safe-chain-verify uv safe-chain-verify
(任意)マルウェアブロックのテスト は、テストパッケージをインストールして確認します:
JavaScript/Node.js の場合:
shell
npm install safe-chain-test
Pythonの場合: ```shell
pip3 install safe-chain-pi-test
npm、npx、yarn、pnpm、pnpx、rush、rushx、bun、bunx、pip、pip3、uv、uvx、poetry、pipx、pdm コマンドを実行すると、Aikido Safe Chain はインストールしようとしているパッケージにマルウェアがないか自動的にチェックします。また、利用可能な場合には pip の Python モジュール呼び出し(例: 、)もインターセプトします。マルウェアが検出された場合は、コマンドを終了するように促します。
インストール済みのバージョンは、次のコマンドで確認できます:```shell safe-chain --version
## How it works
### Malware Blocking
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](https://intel.aikido.dev/?tab=malware)** に対してパッケージをリアルタイムで検証します。いずれかのパッケージ(深い依存関係を含む)でマルウェアが検出された場合、プロキシは悪意のあるコードがマシンに到達する前にダウンロードをブロックします。
### Minimum package age
Safe Chain は、対応するエコシステムに対して最小パッケージ期間のチェックを適用します。
現在の適用方法はエコシステムによって異なります:
- npmベースのパッケージマネージャー:
- 通常のパッケージ解決中、Safe Chain はレジストリから返されるパッケージメタデータから、設定された最小期間より新しいバージョンを除外します
- そのメタデータフローを迂回する直接パッケージダウンロードリクエストに対しては、Safe Chain は新しく公開されたパッケージのキャッシュリストを使用してリクエスト自体をブロックできます
- Pythonパッケージマネージャー:
- パッケージ解決中、Safe Chain はPyPIメタデータ応答から、公開されて間もないファイルとリリースを除外します
- そのメタデータフローを迂回する直接パッケージダウンロードリクエストに対しては、Safe Chain は新しく公開されたパッケージのキャッシュリストを使用してリクエスト自体をブロックできます
デフォルトでは、最小パッケージ期間は48時間です。これは、新しく公開されたパッケージが未検出の脅威を含む可能性が最も高い重要な期間に、追加のセキュリティ層を提供します。このしきい値を設定したり、この保護を完全に無効にしたりできます。詳細は、下記の [Minimum Package Age Configuration](#minimum-package-age) セクションを参照してください。
### Shell Integration
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**
シェル統合の詳細については、[shell integration documentation](https://github.com/AikidoSec/safe-chain/blob/main/docs/shell-integration.md)を参照してください。
## Uninstallation
Aikido Safe Chain をアンインストールするには、ワンライナーアンインストーラーを使用します:
### Unix/Linux/macOS```shell
curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.15/uninstall-safe-chain.sh | sh
iex (iwr "https://github.com/AikidoSec/safe-chain/releases/download/1.5.15/uninstall-safe-chain.ps1" -UseBasicParsing)
**❗アンインストール後、ターミナルを再起動してください** すべてのエイリアスが確実に削除されるように。
# 設定
## ロギング
Aikido Safe Chain の出力は、`--safe-chain-logging` フラグまたは `SAFE_CHAIN_LOGGING` 環境変数を使用して制御できます。
### 設定オプション
ロギングレベルは複数のソースから設定できます(優先順位の高い順):
1. **CLI 引数**(最優先):
- `--safe-chain-logging=silent` - マルウェアがブロックされた場合を除き、Aikido Safe Chain のすべての出力を抑制します。パッケージマネージャーの出力は通常どおり stdout に書き込まれ、Safe Chain はマルウェアをブロックしてプロセスを終了させた場合にのみ短いメッセージを書き込みます。
```shell
npm install express --safe-chain-logging=silent
```
- `--safe-chain-logging=verbose` - Aikido Safe Chain の詳細な診断出力を有効にします。問題のトラブルシューティングや、Safe Chain が舞台裏で何をしているかを理解するのに役立ちます。
```shell
npm install express --safe-chain-logging=verbose
```
2. **環境変数**: ```shell
export SAFE_CHAIN_LOGGING=verbose
npm install express
Valid values: silent, normal, verbose
これは、ターミナルセッションまたはCI/CD環境内のすべてのパッケージマネージャーコマンドにデフォルトのログレベルを設定する場合に便利です。
--safe-chain-log-file フラグまたは SAFE_CHAIN_LOG_FILE 環境変数を使用して、Aikido Safe Chain の出力をログファイルにミラーリングできます。ファイルロギングはデフォルトでは無効で、パスが設定されると有効になります。ファイル形式(--safe-chain-log-file-format)と詳細度(--safe-chain-log-file-verbosity)は、ターミナル出力とは独立して制御されます。
次のいずれかから設定します(優先順位の高い順):
~/.safe-chain/config.json): ```json
{
"logFile": "~/safe-chain.log",
"logFileFormat": "plain",
"logFileVerbosity": "normal"
}
logFileFormat — json (default) or plain.
logFileVerbosity — silent, normal, or verbose (default). Independent from --safe-chain-logging.
Safe Chain がパッケージのインストールを許可するまでに、パッケージが存在していなければならない期間を設定できます。デフォルトでは、パッケージは 48 時間以上経過している必要があります。
npm ベースのパッケージマネージャーでは、このチェックには現在 2 つの適用モードがあります:
Python パッケージマネージャーでは、このチェックには現在 2 つの適用モードがあります:
最小パッケージ経過時間は、複数のソースから設定できます(優先順位の順):
~/.safe-chain/config.json): ```json
{
"minimumPackageAgeHours": 48
}
信頼済みパッケージを最小経過期間フィルタリングの対象から除外するには、環境変数または設定ファイルを使用します(両方ともマージされます)。@scope/* を使用すると、組織のすべてのパッケージを信頼できます:```shell
export SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS="@aikidosec/*"
### チャネルとトラフィックの暗号化なし (OPSEC)
> ターゲットの暗号化されていない通信を見逃さないでください。
我々は傍受して、C2のアドレスを特定し、資格情報やその他多くの詳細を入手するチャンスがあります。```json
{
"npm": {
"minimumPackageAgeExclusions": ["@aikidosec/*"]
},
"pip": {
"minimumPackageAgeExclusions": ["requests"]
}
}
カスタムまたはプライベートレジストリからパッケージをスキャンするように Safe Chain を設定します。
サポートされているエコシステム:
環境変数または設定ファイルを使用してカスタムレジストリを設定できます。両方のソースはマージされます。
~/.safe-chain/config.json): ```json
{
"npm": {
"customRegistries": ["npm.company.com", "registry.internal.net"]
},
"pip": {
"customRegistries": ["pip.company.com", "registry.internal.net"]
}
}
pip の設定に pip.conf ファイルを使用している場合は、Safe Chain がそれをマージできるよう、PIP_CONFIG_FILE 環境変数で pip に明示的に指定する必要があります。
Safe Chain は MITM プロキシの背後で pip を実行し、証明書とプロキシ設定を注入するための一時的な pip 設定ファイルを作成します。PIP_CONFIG_FILE が設定されている場合、Safe Chain は設定をファイルのコピーにマージします(元のファイルは変更されません)。そのため、index-url、認証情報、その他のオプションは保持されます。PIP_CONFIG_FILE が設定されていない場合、pip のユーザーレベルの設定(例: ~/.config/pip/pip.conf)が Safe Chain の一時ファイルによって上書きされる可能性があり、設定が反映されません。
カスタムミラー URL からマルウェアデータベースと新しいパッケージリストを取得するように Safe Chain を設定します。これにより、Aikido マルウェアデータベースの独自コピーをホストできます。
マルウェアリストのベース URL は、複数のソースから設定できます(優先順位の順):
~/.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 はプロジェクト設定ファイルをサポートしています。これにより、設定をリポジトリにチェックインしてチーム全体で共有でき、マシンごとに設定する必要がなくなります。
リポジトリのルートにある .aikido ファイルに safe-chain: セクションを追加してください(他の 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*` オプションなどの設定は、プロジェクト設定ファイルからは設定できません。ホームディレクトリの設定、CLI 引数、または環境変数からのみ設定できます。
## カスタムインストールディレクトリ
デフォルトでは、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.15/install-safe-chain.sh -o /tmp/install-safe-chain.sh \
&& echo "de0565e3d6346407a604e84e639e95fea8758748063da2216bbfdca5feda5dd2 /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
$installer = Join-Path $env:TEMP "install-safe-chain.ps1" Invoke-WebRequest "https://github.com/AikidoSec/safe-chain/releases/download/1.5.15/install-safe-chain.ps1" -OutFile $installer -UseBasicParsing $expectedHash = "5FC22EEF74814BEF6828AA07C0EAEC79598F343F98B94A4ACAB823769AD56DA1" 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
# Usage in CI/CD
CI/CD パイプラインを悪意のあるパッケージから保護するには、ビルドプロセスに Aikido Safe Chain を統合します。これにより、自動ビルド中にインストールされるすべてのパッケージが、インストール前にマルウェアの有無をチェックされるようになります。
## Installation for CI/CD
`--ci` フラグを使用すると、CI/CD 環境向けに Aikido Safe Chain が自動的に設定されます。これにより、シェルエイリアスではなく、PATH 内に実行可能な shim がセットアップされます。
### Unix/Linux/macOS(GitHub Actions、Azure Pipelines など)```shell
curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.15/install-safe-chain.sh -o /tmp/install-safe-chain.sh \
&& echo "de0565e3d6346407a604e84e639e95fea8758748063da2216bbfdca5feda5dd2 /tmp/install-safe-chain.sh" | sha256sum -c - \
&& sh /tmp/install-safe-chain.sh --ci \
&& rm /tmp/install-safe-chain.sh
$installer = Join-Path $env:TEMP "install-safe-chain.ps1" Invoke-WebRequest "https://github.com/AikidoSec/safe-chain/releases/download/1.5.15/install-safe-chain.ps1" -OutFile $installer -UseBasicParsing $expectedHash = "5FC22EEF74814BEF6828AA07C0EAEC79598F343F98B94A4ACAB823769AD56DA1" 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
## Supported Platforms
- ✅ **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.15/install-safe-chain.sh -o /tmp/install-safe-chain.sh
echo "de0565e3d6346407a604e84e639e95fea8758748063da2216bbfdca5feda5dd2 /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
task: NodeTool@0 inputs: versionSpec: "22.x" displayName: "Install Node.js"
script: | curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.15/install-safe-chain.sh -o /tmp/install-safe-chain.sh echo "de0565e3d6346407a604e84e639e95fea8758748063da2216bbfdca5feda5dd2 /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.15/install-safe-chain.sh -o /tmp/install-safe-chain.sh
echo "de0565e3d6346407a604e84e639e95fea8758748063da2216bbfdca5feda5dd2 /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
注: 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.15/install-safe-chain.sh -o /tmp/install-safe-chain.sh
echo "de0565e3d6346407a604e84e639e95fea8758748063da2216bbfdca5feda5dd2 /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.15/install-safe-chain.sh -o /tmp/install-safe-chain.sh
echo "de0565e3d6346407a604e84e639e95fea8758748063da2216bbfdca5feda5dd2 /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
After setup, all subsequent package manager commands in your CI pipeline will automatically be protected by Aikido Safe Chain's malware detection.
GitLabパイプラインにsafe-chainを追加するには、パイプラインを実行するイメージにインストールする必要があります。これは次のようにして行えます。
ビルドを実行するためのdockerfileを定義します ```dockerfile FROM node:lts
RUN curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.15/install-safe-chain.sh -o /tmp/install-safe-chain.sh
&& echo "de0565e3d6346407a604e84e639e95fea8758748063da2216bbfdca5feda5dd2 /tmp/install-safe-chain.sh" | sha256sum -c -
&& sh /tmp/install-safe-chain.sh --ci
&& rm /tmp/install-safe-chain.sh
ENV PATH="/root/.safe-chain/shims:/root/.safe-chain/bin:${PATH}"
CIパイプラインでDockerイメージをビルドする ```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
パイプラインでイメージを使用します: ```yaml npm-ci: stage: install image: $CI_REGISTRY_IMAGE:latest script: - npm ci
この例の完全なパイプラインは次のようになります:```yaml stages:
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/HEAD/docs/troubleshooting.md) を参照してください。
# 問題の報告
問題が発生した場合:
1. [GitHub Issues](https://github.com/AikidoSec/safe-chain/issues) にアクセスしてください
2. 以下を含めてください:
* オペレーティングシステムとバージョン
* シェルの種類とバージョン
* `safe-chain --version` の出力
* 検証コマンドからの出力
* 失敗したコマンドの詳細ログ (`--safe-chain-logging=verbose` 引数を追加)
python -m pip install ...python3 -m pip download ...