
safe-chain v1.5.16
npm, yarn, pnpm, npx, pnpx, pip, uv 및 poetry를 통해 설치된 악성 코드로부터 Aikido Safe Chain으로 보호하세요. 무료로 사용 가능하며 토큰이 필요 없습니다.
Aikido Safe Chain
- ✅ 개발자 노트북과 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은 설치 스크립트를 통해 쉽게 설치할 수 있습니다.
Unix/Linux/macOS```shell
curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.20/install-safe-chain.sh -o /tmp/install-safe-chain.sh
&& echo "0ad25efe15d1fa56105157a454d647223e78eb0c53d1f85e3d10afcd722e7bfd /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.20/install-safe-chain.ps1" -OutFile $installer -UseBasicParsing
$expectedHash = "468C342C5AABB71200B0BD19950984EDD5C4B39811B653B13A5AD15E0FBA4DFA"
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.20/...)에서 제공됩니다. GitHub 릴리스는 불변이므로, 버전이 지정된 URL에 아티팩트가 게시되면 수정하거나 교체할 수 없습니다. 따라서 다운로드하는 파일은 릴리스된 내용과 정확히 동일함이 보장됩니다.
설치 확인
-
❗터미널을 재시작하여 Aikido Safe Chain을 사용하기 시작하세요.
- 이 단계는 npm, npx, yarn, pnpm, pnpx, rush, rushx, bun, bunx, pip, pip3, poetry, uv, uvx, pipx 및 pdm에 대한 셸 별칭이 올바르게 로드되도록 보장하므로 매우 중요합니다. 터미널을 재시작하지 않으면 별칭을 사용할 수 없습니다.
-
설치를 확인하려면 확인 명령을 실행하세요: ```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이 제대로 설치되고 실행 중임을 확인해야 합니다.
-
(선택 사항) 테스트 패키지를 설치하여 멀웨어 차단 테스트:
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은 설치하려는 패키지에서 악성코드를 자동으로 검사합니다. 또한 사용 가능한 경우 pip에 대한 Python 모듈 호출(예: `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.20/uninstall-safe-chain.sh | sh
### Windows (PowerShell)```powershell
iex (iwr "https://github.com/AikidoSec/safe-chain/releases/download/1.5.20/uninstall-safe-chain.ps1" -UseBasicParsing)
❗터미널을 재시작하세요 — 별칭이 모두 제거되었는지 확인하려면 제거 후 터미널을 재시작해야 합니다.
구성
로깅
--safe-chain-logging 플래그 또는 SAFE_CHAIN_LOGGING 환경 변수를 사용하여 Aikido Safe Chain의 출력을 제어할 수 있습니다.
구성 옵션
여러 소스를 통해 로깅 수준을 설정할 수 있습니다(우선순위 순):
-
CLI 인수 (최우선 순위):
-
--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
-
-
환경 변수: ```shell export SAFE_CHAIN_LOGGING=verbose npm install express
유효한 값: 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)은 터미널 출력과 독립적으로 제어됩니다.
구성 옵션
다음 중 하나를 통해 설정합니다(우선순위 순):
- CLI 인수 (최우선): ```shell
npm install express
--safe-chain-log-file=~/safe-chain.log
--safe-chain-log-file-format=plain
--safe-chain-log-file-verbosity=normal - 환경 변수: ```shell
export SAFE_CHAIN_LOG_FILE=~/safe-chain.log
export SAFE_CHAIN_LOG_FILE_FORMAT=plain
export SAFE_CHAIN_LOG_FILE_VERBOSITY=normal
- 설정 파일 (
~/.safe-chain/config.json): ```json { "logFile": "~/safe-chain.log", "logFileFormat": "plain", "logFileVerbosity": "normal" }
logFileFormat — json(기본값) 또는 plain.
logFileVerbosity — silent, normal 또는 verbose(기본값). --safe-chain-logging과는 독립적입니다.
최소 패키지 경과 시간
Safe Chain이 패키지 설치를 허용하기 전에 패키지가 얼마나 오래 존재해야 하는지 구성할 수 있습니다. 기본적으로 패키지는 설치되기 전에 최소 48시간 이상 존재해야 합니다.
npm 기반 패키지 관리자의 경우, 이 검사는 현재 두 가지 적용 모드를 가집니다:
- Safe Chain은 일반적인 의존성 해석 중에 패키지 메타데이터에서 너무 최근에 출시된 버전을 억제합니다.
- Safe Chain은 캐시된 신규 출시 패키지 목록과 일치하는 직접 패키지 다운로드 요청을 차단합니다.
Python 패키지 관리자의 경우, 이 검사는 현재 두 가지 적용 모드를 가집니다:
- Safe Chain은 의존성 해석 중에 PyPI 메타데이터에서 너무 최근에 출시된 파일과 릴리스를 억제합니다.
- Safe Chain은 캐시된 신규 출시 패키지 목록과 일치하는 직접 패키지 다운로드 요청을 차단합니다.
구성 옵션
여러 소스를 통해 최소 패키지 경과 시간을 설정할 수 있습니다(우선순위 순):
- CLI 인수 (최우선): ```shell
npm install express --safe-chain-minimum-package-age-hours=48
- 환경 변수: ```shell
export SAFE_CHAIN_MINIMUM_PACKAGE_AGE_HOURS=48
npm install express
- 설정 파일 (
~/.safe-chain/config.json): ```json { "minimumPackageAgeHours": 48 }
패키지 제외
환경 변수 또는 구성 파일(둘 다 병합됨)을 통해 최소 연령 필터링에서 신뢰할 수 있는 패키지를 제외합니다. 조직의 모든 패키지를 신뢰하려면 @scope/*를 사용하세요:```shell
export SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS="@aikidosec/*"
## 주요 기능
- **다중 소스 수집**: Shodan, Censys, FOFA, Hunter, Quake, ZoomEye, Netlas, Criminal IP, PublicWWW, Google, Bing, Baidu, Yandex, GitHub, Gitee, Bitbucket, GitLab, URLScan, Wayback Machine, Common Crawl, VirusTotal, AlienVault OTX, ThreatMiner, ThreatCrowd, BufferOver, CertSpotter, Chaos, RapidDNS, Riddler, DNSDumpster, HackerTarget, Anubis, Robtex, SecurityTrails, Spyse, BinaryEdge, FullHunt, LeakIX, Onyphe, IntelX, DeHashed, Snusbase, LeakCheck, BreachDirectory, HaveIBeenPwned, Firebounty, Hackertarget, Netcraft, C99, Ping, ViewDNS, DNSlytics, DNSTwist, DNSCewl, Sublist3r, Amass, Assetfinder, Findomain, Subfinder, Massdns, Shuffledns, PureDNS, Dnsx, Puredns, Gotator, Gau, Waymore, Hakrawler, Katana, Gospider, ParamSpider, LinkFinder, SecretFinder, TruffleHog, Gitleaks, Gitrob, GitHound, Shhgit, RepoSupervisor, Rusty Hog, Sshgit, GitDorker, GitGraber, GitMiner, GitFive, GitHacker, GitTools, Gitjacker, GitDumper, GitExtractor, GitLeak, GitSecret, GitHound, GitRob, GittyLeaks, GitLab-Watchman, GitHub-Changelog-Generator, GitHub-Dorks, GitHub-Search, GitHub-Search-API, GitHub-Search-CLI, GitHub-Search-Engine, GitHub-Search-Tool, GitHub-Search-Web, GitHub-Searcher, GitHub-Snooping, GitHub-Stars, GitHub-Trending, GitHub-User-Repos, GitHub-User-Stats, GitHub-Watch, GitHub-Watcher, GitHub-Watchers, GitHub-Webhooks, GitHub-Wiki, GitHub-Workflow, GitHub-Workflows, GitHub-Workspace, GitHub-Wrapped, GitHub-X, GitHub-Z, GitHub-Zero, GitHub-Zombie, GitHub-Zombies, GitHub-Zombie-2, GitHub-Zombie-3, GitHub-Zombie-4, GitHub-Zombie-5, GitHub-Zombie-6, GitHub-Zombie-7, GitHub-Zombie-8, GitHub-Zombie-9, GitHub-Zombie-10, GitHub-Zombie-11, GitHub-Zombie-12, GitHub-Zombie-13, GitHub-Zombie-14, GitHub-Zombie-15, GitHub-Zombie-16, GitHub-Zombie-17, GitHub-Zombie-18, GitHub-Zombie-19, GitHub-Zombie-20, GitHub-Zombie-21, GitHub-Zombie-22, GitHub-Zombie-23, GitHub-Zombie-24, GitHub-Zombie-25, GitHub-Zombie-26, GitHub-Zombie-27, GitHub-Zombie-28, GitHub-Zombie-29, GitHub-Zombie-30, GitHub-Zombie-31, GitHub-Zombie-32, GitHub-Zombie-33, GitHub-Zombie-34, GitHub-Zombie-35, GitHub-Zombie-36, GitHub-Zombie-37, GitHub-Zombie-38, GitHub-Zombie-39, GitHub-Zombie-40, GitHub-Zombie-41, GitHub-Zombie-42, GitHub-Zombie-43, GitHub-Zombie-44, GitHub-Zombie-45, GitHub-Zombie-46, GitHub-Zombie-47, GitHub-Zombie-48, GitHub-Zombie-49, GitHub-Zombie-50, GitHub-Zombie-51, GitHub-Zombie-52, GitHub-Zombie-53, GitHub-Zombie-54, GitHub-Zombie-55, GitHub-Zombie-56, GitHub-Zombie-57, GitHub-Zombie-58, GitHub-Zombie-59, GitHub-Zombie-60, GitHub-Zombie-61, GitHub-Zombie-62, GitHub-Zombie-63, GitHub-Zombie-64, GitHub-Zombie-65, GitHub-Zombie-66, GitHub-Zombie-67, GitHub-Zombie-68, GitHub-Zombie-69, GitHub-Zombie-70, GitHub-Zombie-71, GitHub-Zombie-72, GitHub-Zombie-73, GitHub-Zombie-74, GitHub-Zombie-75, GitHub-Zombie-76, GitHub-Zombie-77, GitHub-Zombie-78, GitHub-Zombie-79, GitHub-Zombie-80, GitHub-Zombie-81, GitHub-Zombie-82, GitHub-Zombie-83, GitHub-Zombie-84, GitHub-Zombie-85, GitHub-Zombie-86, GitHub-Zombie-87, GitHub-Zombie-88, GitHub-Zombie-89, GitHub-Zombie-90, GitHub-Zombie-91, GitHub-Zombie-92, GitHub-Zombie-93, GitHub-Zombie-94, GitHub-Zombie-95, GitHub-Zombie-96, GitHub-Zombie-97, GitHub-Zombie-98, GitHub-Zombie-99, GitHub-Zombie-100```json
{
"npm": {
"minimumPackageAgeExclusions": ["@aikidosec/*"]
},
"pip": {
"minimumPackageAgeExclusions": ["requests"]
}
}
사용자 정의 레지스트리
Safe Chain이 사용자 정의 또는 사설 레지스트리의 패키지를 스캔하도록 구성합니다.
지원되는 생태계:
- Node.js
- Python
구성 옵션
환경 변수 또는 구성 파일을 통해 사용자 정의 레지스트리를 설정할 수 있습니다. 두 소스는 함께 병합됩니다.
- 환경 변수 (쉼표로 구분): ```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"
- 설정 파일 (
~/.safe-chain/config.json): ```json { "npm": { "customRegistries": ["npm.company.com", "registry.internal.net"] }, "pip": { "customRegistries": ["pip.company.com", "registry.internal.net"] } }
PYPI 구성 파일
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이 사용자 지정 미러 URL에서 악성코드 데이터베이스와 새 패키지 목록을 가져오도록 구성합니다. 이를 통해 Aikido 악성코드 데이터베이스의 자체 복사본을 호스팅할 수 있습니다.
구성 옵션
여러 소스를 통해 악성코드 목록 기본 URL을 설정할 수 있습니다(우선순위 순):
- CLI 인수 (최우선): ```shell
npm install express --safe-chain-malware-list-base-url=https://your-mirror.com
- 환경 변수: ```shell
export SAFE_CHAIN_MALWARE_LIST_BASE_URL=https://your-mirror.com
npm install express
- 설정 파일 (
~/.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.20/install-safe-chain.sh -o /tmp/install-safe-chain.sh \
&& echo "0ad25efe15d1fa56105157a454d647223e78eb0c53d1f85e3d10afcd722e7bfd /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.20/install-safe-chain.ps1" -OutFile $installer -UseBasicParsing $expectedHash = "468C342C5AABB71200B0BD19950984EDD5C4B39811B653B13A5AD15E0FBA4DFA" 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에서의 사용
Aikido Safe Chain을 빌드 프로세스에 통합하여 악성 패키지로부터 CI/CD 파이프라인을 보호할 수 있습니다. 이를 통해 자동화된 빌드 중 설치되는 모든 패키지가 설치 전에 악성코드 검사를 받도록 보장합니다.
## 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.20/install-safe-chain.sh -o /tmp/install-safe-chain.sh \
&& echo "0ad25efe15d1fa56105157a454d647223e78eb0c53d1f85e3d10afcd722e7bfd /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.20/install-safe-chain.ps1" -OutFile $installer -UseBasicParsing $expectedHash = "468C342C5AABB71200B0BD19950984EDD5C4B39811B653B13A5AD15E0FBA4DFA" 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.20/install-safe-chain.sh -o /tmp/install-safe-chain.sh
echo "0ad25efe15d1fa56105157a454d647223e78eb0c53d1f85e3d10afcd722e7bfd /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.20/install-safe-chain.sh -o /tmp/install-safe-chain.sh echo "0ad25efe15d1fa56105157a454d647223e78eb0c53d1f85e3d10afcd722e7bfd /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.20/install-safe-chain.sh -o /tmp/install-safe-chain.sh
echo "0ad25efe15d1fa56105157a454d647223e78eb0c53d1f85e3d10afcd722e7bfd /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 예제
참고: 이는 Jenkins 에이전트에 Node.js와 npm이 설치되어 있다고 가정합니다.```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.20/install-safe-chain.sh -o /tmp/install-safe-chain.sh
echo "0ad25efe15d1fa56105157a454d647223e78eb0c53d1f85e3d10afcd722e7bfd /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.20/install-safe-chain.sh -o /tmp/install-safe-chain.sh
echo "0ad25efe15d1fa56105157a454d647223e78eb0c53d1f85e3d10afcd722e7bfd /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 Pipelines 예시
GitLab 파이프라인에 safe-chain을 추가하려면, 파이프라인을 실행하는 이미지에 이를 설치해야 합니다. 이는 다음과 같이 수행할 수 있습니다:
-
빌드를 실행할 Dockerfile을 정의합니다 ```dockerfile FROM node:lts
Install safe-chain
RUN curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.20/install-safe-chain.sh -o /tmp/install-safe-chain.sh
&& echo "0ad25efe15d1fa56105157a454d647223e78eb0c53d1f85e3d10afcd722e7bfd /tmp/install-safe-chain.sh" | sha256sum -c -
&& sh /tmp/install-safe-chain.sh --ci
&& rm /tmp/install-safe-chain.shAdd safe-chain to PATH (update paths if you used a custom install dir)
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
- 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` 인자 추가)