엔터프라이즈 AI 에이전트를 위한 DevSecOps 파이프라인 설계
AI 에이전트는 프롬프트, 도구 스키마, 외부 SDK가 얽힌 비결정적 코드베이스다. 시크릿 탐지부터 Veracode SCA·SAST까지 4단계로 나눈 GitHub Actions 파이프라인 설계를 정리했다.

Architecting a Resilient DevSecOps Pipeline for Enterprise AI Agents
A four-stage DevSecOps CI/CD architecture for securing enterprise AI agents with GitHub Actions, secret scanning, AI-assisted review, Veracode SCA, and Pipeline SAST.
개요 #
자율 AI 에이전트가 늘어나면서 기업 소프트웨어 공급망의 성격이 바뀌었다. 외부 API를 스스로 호출하고, 코드를 생성하고, 데이터베이스 상태를 직접 건드리는 시스템이기 때문이다. 기존 마이크로서비스는 코드 경로가 예측 가능했지만, 에이전트 아키텍처는 일반 백엔드 코드에 비결정적인 프롬프트 템플릿, 동적 함수 호출 스키마, 빠르게 바뀌는 서드파티 SDK가 뒤섞여 있다.
엔터프라이즈 클라우드·AI 아키텍트 Jitendra Gupta는 이런 구조를 예전 CI/CD 워크플로 위에 그대로 올리면 공격 표면이 커진다고 지적한다. 그가 제시한 대안은 시크릿 탐지, AI 코드 리뷰, 프롬프트 보안 검사, Veracode의 두 엔진(Agent-Based SCA와 Pipeline SAST)을 GitHub Actions 안에서 4단계로 엮은 파이프라인이다.
하드닝 없는 파이프라인이 만드는 구멍 #
원문은 네 가지 취약점을 짚는다.
첫째, 모델 자격증명과 토큰 노출이다. 빠르게 반복 개발하는 팀은 테스트용 API 키나 클라우드 서비스 계정, MCP(Model Context Protocol) 인증 토큰을 소스 관리에 그대로 커밋하는 일이 잦다.
둘째, 프롬프트 인젝션과 과도한 권한 문제다. 리포지터리에 들어 있는 자연어 시스템 프롬프트는 적대적 탈옥이나 인젝션 공격에 대한 검증을 거치지 않은 경우가 많다. OWASP LLM01이 다루는 위험이며, 공격자가 에이전트 실행 흐름을 조작할 수 있는 통로가 된다.
셋째, 오픈소스 의존성 오염이다. LangChain, LlamaIndex, AutoGen 같은 프레임워크는 전이 의존성 트리가 깊다. 검증되지 않은 패키지 하나가 공급망 취약점을 기업 환경까지 끌고 들어온다.
넷째, PR 시점에 걸러지지 않는 코드 결함이다. SAST 피드백 주기가 길어지면 개발팀은 릴리스 속도를 위해 보안 게이트를 우회하고, 처리되지 않은 CWE가 스테이징과 운영까지 넘어간다.
기준이 되는 시나리오: 코어 뱅킹 결제 오케스트레이터 #
저자는 설계를 설명하려고 사례를 하나 세워 둔다. 비동기 거래 분쟁을 처리하고, MCP 도구로 코어 SAP 원장을 조회하고, 잔액을 조정하는 결제 오케스트레이터 에이전트다.
이 서비스는 금융 거래 엔드포인트와 민감한 고객 PII에 직접 접근한다. HTTP 클라이언트 라이브러리의 미해결 CVE, 커스텀 도구 정의에 들어간 이스케이프되지 않은 SQL 파라미터, 노출된 API 토큰, 분쟁 내용 파싱 단계의 프롬프트 인젝션 벡터 — 어느 하나만 뚫려도 금전 손실과 규제 제재로 이어진다. 그래서 이 서비스를 건드리는 모든 PR은 머지 전에 4단계 파이프라인을 통과해야 한다.
Photo by Blackcurrant Great on Pexels
4단계 파이프라인 #
1단계 — 커밋과 시크릿 차단 #
첫 방어선은 빌드나 패키징보다 앞에 있다. PR이 열리면 GitHub Actions가 Gitleaks, TruffleHog 같은 고속 시크릿 탐지 엔진을 실행한다.
스캐너는 git diff를 훑으면서 커밋 이력, 커밋 메시지, 설정 파일에서 엔트로피가 높은 문자열을 찾는다. 클라우드 토큰, 파운데이션 모델 API 키(Anthropic, OpenAI, Google Gemini 등), 내부 프라이빗 키의 패턴 시그니처가 대상이다.
해시 처리되지 않은 자격증명이 발견되면 워크플로는 즉시 0이 아닌 종료 코드로 실패한다. 하위 단계 실행을 막아, 임시 러너 빌드 로그나 컨테이너 레이어에 자격증명이 남는 것을 차단한다.
2단계 — AI 코드 리뷰와 프롬프트 보안 감사 #
시크릿이 없다고 판단되면 두 종류의 AI 검증이 돌아간다.
자율 AI 코드 리뷰어는 권한을 낮춘 읽기 전용 GitHub 토큰으로 동작한다. PR diff에서 안티패턴, 누락된 입력 검증, 동시성 경쟁 조건, 아키텍처 규약 위반을 찾는다.
AI 프롬프트 보안 스캐너는 프롬프트 템플릿과 에이전트 지시 파일(.txt, .yaml, .json)을 Giskard나 PyRIT 휴리스틱 같은 전용 평가 도구에 넣는다. 인젝션 패턴을 시험하고, 사용자가 넘기는 템플릿 변수로 시스템 지시를 덮어쓸 수 없는지 확인하고, 도구 실행 설명이 최소 권한을 지키는지 검증한다.
3단계 — Veracode Agent-Based SCA #
에이전트 애플리케이션은 외부 패키지 생태계에 크게 의존한다. 오픈소스 리스크를 통제하기 위해 파이프라인은 Veracode Agent-Based Scanning을 실행한다.
경량 Veracode CLI 에이전트가 GitHub Actions 러너 안에서 초기화된다. 소스 코드를 업로드할 필요 없이 러너 위의 패키지 매니페스트(package-lock.json, poetry.lock, pom.xml, requirements.txt)와 설치된 라이브러리를 직접 검사한다.
에이전트는 SBOM(Software Bill of Materials)을 구성한 뒤 직접·전이 의존성 전체를 Veracode 자체 취약점 데이터베이스와 대조한다. 취약한 오픈소스 컴포넌트, 라이선스 리스크, 유지보수가 끊긴 패키지가 걸러진다. 스캔 결과는 기업 취약점 정책에 맞춰 보고, 고위험 CVE가 나오면 그 자리에서 집어내 자동 수정 PR 가이드까지 뽑아 준다.
4단계 — Veracode Pipeline SAST #
퍼스트파티 코드 품질은 개발 속도를 죽이지 않는 방식으로 검증한다. 빌드 산출물을 Veracode Pipeline Scan에 제출하는 단계다.
스프린트 말미에 돌리는 무거운 정적 분석과 달리 Pipeline Scan은 CI/CD용으로 만들어졌고, 대부분의 코드베이스에서 90초 안에 끝난다. 컴파일된 바이너리나 소스 패키지를 엄격한 결함 필터 규칙에 대조한다.
결과는 SARIF(Static Analysis Results Interchange Format) 파일로 변환돼 GitHub Code Scanning Alerts에 올라간다. CVSS 7.0 이상 결함, 예컨대 SQL 인젝션(CWE-89)이나 OS 커맨드 인젝션(CWE-78)이 잡히면 파이프라인 상태 검사가 실패하고 수정 전까지 머지가 막힌다.
GitHub Actions 워크플로 전문 #
원문이 공개한 .github/workflows/agentic-devsecops.yml 전체 구성이다.
name: Enterprise AI Agent DevSecOps Pipeline
on:
pull_request:
branches: [ main, release/* ]
push:
branches: [ main ]
permissions:
contents: read
pull-requests: write
security-events: write
jobs:
secret-scan:
name: "Stage 1: Secret Scanning"
runs-on: ubuntu-latest
steps:
- name: Checkout Source Code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Run Gitleaks Secret Scanner
uses: gitleaks/gitleaks-action@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITLEAKS_LICENSE: ${{ secrets.GITLEAKS_LICENSE }} # Optional for enterprise
ai-review-and-prompt-scan:
name: "Stage 2: AI Code Review & Prompt Audit"
needs: secret-scan
runs-on: ubuntu-latest
steps:
- name: Checkout Source Code
uses: actions/checkout@v4
- name: Set up Python Runtime
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install AI Prompt & Security Linters
run: |
python -m pip install --upgrade pip
pip install promptfoo giskard
- name: Run Prompt Injection & Jailbreak Scans
run: |
echo "Scanning prompt manifests and templates against OWASP LLM01..."
promptfoo eval --config tests/promptfoo-security.yaml --no-telemetry
- name: Run AI Code Reviewer
uses: coderabbitai/ai-pr-reviewer@v1
if: github.event_name == 'pull_request'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
veracode-agent-sca:
name: "Stage 3: Veracode Agent-Based SCA"
needs: secret-scan
runs-on: ubuntu-latest
steps:
- name: Checkout Source Code
uses: actions/checkout@v4
- name: Run Veracode Agent-Based Scan
env:
SRCCLR_API_TOKEN: ${{ secrets.SRCCLR_API_TOKEN }}
run: |
echo "Executing Veracode Agent-Based Scanning for dependencies..."
curl -sSL https://download.sourceclear.com/ci.sh | bash -s -- scan \
--update-advisor \
--allow-dirty
veracode-pipeline-sast:
name: "Stage 4: Veracode Pipeline SAST Scan"
needs: secret-scan
runs-on: ubuntu-latest
steps:
- name: Checkout Source Code
uses: actions/checkout@v4
- name: Build / Package Application Artifact
run: |
echo "Building agent service deployment package..."
zip -r deployment-package.zip . -x "*.git*" "tests/*" "*.github/*"
- name: Download Veracode Pipeline Scan CLI
run: |
curl -sSO https://downloads.veracode.com/securityscan/pipeline-scan-LATEST.zip
unzip pipeline-scan-LATEST.zip
- name: Execute Veracode Pipeline SAST Scan
run: |
java -jar pipeline-scan.jar \
--veracode_api_id "${{ secrets.VERACODE_API_ID }}" \
--veracode_api_key "${{ secrets.VERACODE_API_KEY }}" \
--file "deployment-package.zip" \
--policy_file "tests/veracode-policy.json" \
--fail_on_severity "Very High, High" \
--json_output_file "results.json" \
--gl_issue_generation true || exit 1
- name: Convert & Upload Results to GitHub Security Tab
if: always()
uses: veracode/veracode-pipeline-scan-results-to-sarif@v2.0.0
with:
scan-results-json: "results.json"
output-results-sarif: "veracode-results.sarif"
- name: Publish SARIF to GitHub Code Scanning
if: always()
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: "veracode-results.sarif"1단계 시크릿 스캔만 선행 작업이고, 2·3·4단계는 모두 needs: secret-scan으로 병렬 실행된다는 점이 구조의 핵심이다.
저자가 못 박은 세 가지 원칙 #
프롬프트와 스키마도 자동 정적 테스트 대상이다. 프롬프트 파일을 관리 밖의 평문으로 취급하지 말라는 뜻이다. 모든 시스템 프롬프트와 도구 스키마에 애플리케이션 소스 코드와 똑같은 회귀·보안 테스트를 적용해야 한다.
빠른 게이트와 무거운 비동기 스캔을 분리한다. PR 검증 루프에는 가벼운 SAST·SCA만 넣어 개발자가 3분 안에 피드백을 받게 한다. 포괄적 동적 분석과 정기 컴플라이언스 감사는 머지 이후 비동기 작업으로 넘긴다.
Policy-as-Code 품질 게이트를 강제한다. 미해결 고위험 CVE나 정적 결함(CVSS 7.0 이상)이 남은 PR은 머지되지 않는다. 결함 예외는 리포지터리 감사 로그에 등록된 암호학적 서명 승인을 요구해야 한다.
아키텍트의 결론 #
글은 자율 에이전트 플랫폼 보안이 런타임만으로는 완성되지 않는다는 말로 끝난다. 취약한 라이브러리, 이스케이프되지 않은 도구 파라미터, 하드코딩된 시크릿이 CI를 그대로 통과하면 런타임 가드레일과 프록시는 불리한 싸움을 떠안는다.
배포 수명주기를 GitHub Actions에 고정해 두고 커밋 시점에 시크릿을 걸러내는 것, AI 프롬프트 리뷰를 자동화하고 Veracode Agent-Based SCA와 Pipeline SAST를 함께 강제하는 것. 저자는 이 조건이 갖춰져야 운영에 올라가는 에이전트가 첫날부터 복원력과 컴플라이언스를 갖춘다고 본다.
참고 자료 #
- Veracode Pipeline Scan | Veracode Docs
- Manage security policies | Veracode Docs
- How-tos for securing secrets — GitHub Docs
- OWASP Top 10 for Large Language Model Applications
- gitleaks/gitleaks
- Open Source Security Foundation
이 글은 위 출처를 바탕으로 한국 독자를 위해 재작성한 기사입니다. 원문의 사실과 수치에 근거하며, 별도의 견해를 포함하지 않습니다.
