목록으로

Programming Notes

AI 에이전트를 위한 쉬프트-레프트(Shift-Left) 거버넌스: 에이전트 거버넌스 툴킷(AGT)으로 위반 사항을 포착하는 방법

이 시리즈의 파트 1에서는 정책 엔진, 제로 트러스트 ID, 실행 샌드박싱, 그리고 OWASP 에이전틱 AI 리스크 매핑 등 AGT의 런타임 거버넌스에 대해 다루었습니다.

지난 포스팅은 에이전트가 행동할 때 발생하는 일들에 초점을 맞췄습니다. 즉, 도구 호출이 실행되는 순간의 정책 평가, 에이전트 간 통신 시의 신뢰 점수 산정, 의사 결정 시의 감사 로깅 등이 그 예입니다. 런타임 거버넌스는 필수적이지만, 이는 최후의 방어선일 뿐입니다.

첫 번째 포스팅이 게시된 후, AGT를 도입하려는 팀들과 대화를 나누면서 한 가지 패턴이 발견되었습니다. 모두가 똑같은 질문을 던졌습니다. "런타임 체크도 유용하지만, 프로덕션 이전 단계는 어떻게 하나요?" 저희는 런타임 거버넌스가 전체 이야기의 절반에 불과하다는 것을 깨달았습니다. 그래서 다시 개발에 착수하여, 개발자가 파일을 저장하는 순간부터 아티팩트가 사용자에게 배포되는 순간까지 소프트웨어 개발 수명 주기(SDLC)의 모든 단계를 위한 도구를 구축했습니다.

왜 런타임 거버넌스만으로는 부족한가

AI 에이전트는 새로운 유형의 워크로드입니다. 에이전트는 수행할 작업을 추론하고, 도구를 선택하고, API를 호출하고, 데이터베이스를 읽고, 하위 프로세스를 생성하며, 이 모든 과정은 종종 직접적인 인간의 감독 없이 루프로 실행됩니다. 2025년 12월에 발표된 OWASP 에이전틱 AI 10대 리스크(Top 10)는 과도한 권한(Excessive Agency), 불안전한 도구 사용, 권한 상승, 공급망 침해와 같은 위험을 식별했습니다. 이러한 리스크는 런타임뿐만 아니라 전체 수명 주기에 걸쳐 존재합니다.

런타임 거버넌스만으로는 예방할 수 없는 몇 가지 시나리오를 생각해 보십시오.

  • 개발자가 실수로 모든 '거부(deny)' 규칙을 비활성화하는 오타가 포함된 정책 YAML 파일을 커밋합니다. 누군가 발견할 때까지 에이전트는 보호되지 않은 상태로 실행됩니다.
  • 종속성 업데이트로 인해 알려진 심각한 CVE가 포함된 패키지가 도입됩니다. 보안 팀이 검토하기도 전에 에이전트는 취약한 라이브러리를 사용하기 시작합니다.
  • 기여자가 애플리케이션 모듈에 원시 암호화(Raw cryptographic) 임포트를 추가하여 보안 감사를 마친 서명 라이브러리를 우회합니다. 코드는 그대로 컴파일되어 배포됩니다.
  • GitHub Actions 워크플로우가 표현식 주입(Expression Injection) 패턴을 사용하여 공격자가 CI에서 임의의 코드를 실행할 수 있게 합니다.
  • 소프트웨어 자재 명세서(SBOM) 없이 릴리스가 배포되어, 다음번 log4j 스타일의 취약점이 발생했을 때 어떤 구성 요소가 영향을 받는지 추적할 수 없게 됩니다.

이러한 각 사례는 거버넌스 실패이지만, 런타임에 발생하는 것은 하나도 없습니다. 이들은 커밋 시점, PR 검토 시점, 빌드 시점 또는 릴리스 시점에 발생합니다. 포괄적인 거버넌스 전략은 모든 단계에서의 커버리지를 필요로 합니다.

프리런타임(Pre-Runtime) 거버넌스의 4단계

거버넌스 위반 사항은 개발 수명 주기의 네 가지 고유한 단계에서 코드베이스에 유입될 수 있습니다. 각 단계는 서로 다른 등급의 리스크를 가지며, 각기 다른 종류의 체크가 필요합니다.

단계 실행 시점 감지 대상 AGT 도구
커밋 시점 (Commit-time) 코드가 개발자 PC를 떠나기 전 잘못된 정책 형식, 스키마 위반, 시크릿(비밀번호 등), 스텁(Stub) 코드, 승인되지 않은 암호화 Pre-commit 훅, 품질 게이트(Quality gates)
PR 시점 (PR-time) 풀 리퀘스트(PR)가 생성되거나 업데이트될 때 취약한 종속성, 누락된 어테스테이션(증명), 히스토리 내 시크릿, 고정되지 않은 버전 GitHub Actions (어테스테이션, 종속성 검토, 시크릿 스캐닝, 공급망 체크)
CI/빌드 시점 (CI/Build-time) 메인 브랜치로의 모든 푸시 및 PR 발생 시 규정 준수 위반, 바이너리 보안 문제, 종속성 혼동(Dependency confusion), 워크플로우 주입 Governance Verify 액션, Security Scan 액션, CodeQL, BinSkim, 정책 유효성 검사
릴리스 시점 (Release-time) 아티팩트가 게시되기 전 출처(Provenance) 누락, 서명되지 않은 아티팩트, 불완전한 SBOM SBOM 생성, Sigstore 서명, 빌드 어테스테이션, OpenSSF Scorecard

버그와 마찬가지로, 거버넌스 위반 사항도 일찍 발견할수록 수정 비용이 저렴해집니다. 커밋 시점에 발견된 잘못된 정책 파일은 CI 비용을 전혀 소모하지 않습니다. PR 검토에서 발견된 시크릿은 기본 브랜치에 도달하지 못합니다. CI에서 차단된 종속성 혼동 공격은 프로덕션에 도달하지 않으며, 릴리스 시점에 차단된 서명되지 않은 아티팩트는 사용자에게 전달되지 않습니다.

1단계: Pre-commit 훅을 이용한 커밋 시점 거버넌스

가장 빠른 거버넌스 피드백 루프는 로컬에서 이루어집니다. AGT 프로젝트 내에서는 개발자가 커밋을 위해 파일을 스테이징할 때마다 자동으로 실행되는 세 가지 pre-commit 훅을 구현하여, 거버넌스 아티팩트가 개발자 머신을 떠나기 전에 유효성을 검사합니다.

기본 내장 훅

툴킷의 .pre-commit-hooks.yaml은 모든 저장소에서 채택할 수 있는 세 가지 훅을 정의합니다.

훅 ID 유효성 검사 내용 파일 패턴
validate-policy AGT 정책 스키마에 따라 YAML/JSON 정책 파일을 검사하여 필수 필드, 유효한 연산자 및 구조적 정확성을 확인 polic.yaml, polic.yml, polic.json와 일치하는 파일
validate-plugin-manifest 플러그인 매니페스트 파일의 필수 필드 및 스키마 준수 여부 확인 plugin.json, plugin.yaml, plugin.yml와 일치하는 파일
evaluate-plugin-policy 플러그인 매니페스트를 거버넌스 정책 파일과 대조하여 조직의 규칙에 따라 플러그인이 허용되는지 평가 plugin.json, plugin.yaml, plugin.yml와 일치하는 파일

이러한 훅을 적용하려면 AGT를 pre-commit 훅 소스로 추가하세요.

# .pre-commit-config.yaml
repos:
  - repo: https://github.com/microsoft/agent-governance-toolkit
    rev: main  # 프로덕션에서는 특정 릴리스 태그로 고정하세요
    hooks:
      - id: validate-policy
      - id: validate-plugin-manifest
      - id: evaluate-plugin-policy
        args: ['--policy', 'policies/marketplace-policy.yaml']

그 다음 설치 및 실행합니다.

pip install pre-commit
pre-commit install
pre-commit run --all-files

확장된 품질 게이트 (Quality Gates)

스키마 유효성 검사를 넘어, 저희는 코드베이스에 흔히 발생하는 보안 안티 패턴을 방지하기 위해 추가적인 거버넌스 전용 품질 게이트가 포함된 pre-commit 롤아웃 템플릿(저장소의 전체 예시 보기)을 구축했습니다.

  • 정책 유효성 검사 (agt-validate): AGT 정책 CLI를 엄격 모드(strict mode)로 실행하여 스키마 오류뿐만 아니라 규칙 충돌과 같은 의미론적 문제까지 포착합니다.
  • 상태 점검 (agt-doctor): 프리푸시(pre-push, 코드가 완전히 머신을 떠나기 전) 단계에서 실행되어 거버넌스 구성에 대한 전반적인 상태 점검을 수행합니다.
  • 플러그인 메타데이터 체크 (agency-json-required): 모든 플러그인 디렉토리에 필수 agency.json 메타데이터 파일이 포함되어 있는지 확인합니다.
  • 스텁(Stub) 감지 (no-stubs): 스테이징된 프로덕션 코드에서 TODO, FIXME, HACK 및 NotImplementedError 발생 마커를 차단합니다. 테스트 파일은 제외됩니다.
  • 승인되지 않은 암호화 감지 (no-custom-crypto): 지정된 보안 모듈 외부에서 원시 암호화 임포트(hashlib, hmac, crypto.subtle, System.Security.Cryptography, ring, ed25519-dalek)를 차단합니다. 이는 모든 암호화 작업이 감사를 거친 AGT 서명 라이브러리를 통하도록 보장합니다.
  • 시크릿 스캐닝 (detect-secrets): 모든 커밋에서 패턴 기반 시크릿 감지를 위해 Yelp의 detect-secrets를 통합합니다.

팀을 위한 단계적 롤아웃

팀 전체에 pre-commit 훅을 도입하려면 사려 깊은 롤아웃이 필요합니다. AGT 문서에는 단계적 도입 가이드가 포함되어 있습니다.

  1. 1주 차: 허용 모드(permissive mode)로 훅을 설치합니다. 훅은 위반 사항에 대해 경고하지만 커밋을 차단하지는 않습니다. 이를 통해 개발자는 워크플로우를 방해받지 않고 무엇이 감지되는지 확인할 수 있습니다.
  2. 2주 차: 정책 유효성 검사에 대해서만 엄격 모드(strict mode)로 전환합니다. 정책 파일은 스키마 검증을 통과해야 커밋될 수 있습니다.
  3. 3주 차: 모든 훅을 차단 모드로 활성화합니다. 이제 스텁, 승인되지 않은 암호화, 시크릿은 커밋 시점에 차단됩니다.
  4. 4주 차: 완전한 차단 모드로 전환하고 허용 모드 폴백(fallback)을 제거합니다.

이러한 접근 방식은 거버넌스 도구가 하드 게이트(Hard Gate)가 되기 전에 팀이 도구에 대한 신뢰를 쌓는 데 도움을 줍니다.

2단계: PR 시점 게이트 (PR-Time Gates)

Pre-commit 훅은 개발자 머신에서 문제를 포착하지만, 우회할 수도 있습니다(강제 푸시, GitHub 직접 수정 등). PR 시점 게이트는 모든 풀 리퀘스트에서 병합이 허용되기 전에 GitHub Actions에서 실행되어 두 번째 방어선을 제공합니다.

거버넌스 어테스테이션 (Governance Attestation)

거버넌스 어테스테이션 액션은 PR 작성자가 코드를 병합하기 전에 구조화된 어테스테이션 체크리스트를 완료했는지 확인합니다. 기본 체크리스트는 다음 7개 섹션을 다룹니다.

  1. 보안 검토 (Security review)
  2. 개인정보 보호 검토 (Privacy review)
  3. 법적 검토 (Legal review)
  4. 책임 있는 AI 검토 (Responsible AI review)
  5. 접근성 검토 (Accessibility review)
  6. 릴리스 준비 / 안전한 배포 (Release Readiness / Safe Deployment)
  7. 조직별 출시 게이트 (Org-specific Launch Gates)

이 액션은 완전히 구성 가능합니다. 조직은 필수 섹션을 맞춤 설정하고, 최소 PR 본문 길이를 설정하며, 자체 어테스테이션 형식을 선택할 수 있습니다. 출력에는 유효성 검사 상태, 누락된 섹션에 대한 오류 목록, 체크박스 개수에 대한 JSON 매핑이 포함됩니다.

워크플로우 예시는 다음과 같습니다.

# .github/workflows/pr-governance.yml
name: PR Governance
on:
  pull_request:
    types: [opened, edited, synchronize]

jobs:
  attestation:
    runs-on: ubuntu-latest
    steps:
      - uses: microsoft/agent-governance-toolkit/action/governance-attestation@main
        with:
          required-sections: |
            1) Security review
            2) Privacy review
            3) Responsible AI review

종속성 검토 (Dependency Review)

종속성 검토 워크플로우는 알려진 CVE가 있거나 허용되지 않은 라이선스를 가진 종속성을 도입하는 PR을 차단하는 데 도움이 됩니다. 이는 엄선된 라이선스 허용 목록과 함께 GitHub의 dependency-review-action을 사용합니다.

- uses: actions/dependency-review-action@v4
  with:
    fail-on-severity: moderate
    comment-summary-in-pr: always
    allow-licenses: >
      MIT, Apache-2.0, BSD-2-Clause, BSD-3-Clause, ISC,
      PSF-2.0, Python-2.0, 0BSD, Unlicense, CC0-1.0,
      CC-BY-4.0, Zlib, BSL-1.0, MPL-2.0

이 작업은 종속성 매니페스트(package.json, Cargo.toml, pyproject.toml, requirements.txt)를 수정하는 모든 PR에서 실행됩니다. '보통(moderate)' 이상의 심각도를 가진 CVE가 있는 종속성은 플래그가 지정되고, 허용 목록에 없는 라이선스를 가진 종속성은 차단됩니다.

시크릿 스캐닝 (Secret Scanning)

시크릿 스캐닝 워크플로우는 메인 브랜치로의 모든 PR과 매주 한 번씩 실행됩니다. 두 가지 상호 보완적인 접근 방식을 결합합니다.

  • Gitleaks: 전체 git 히스토리에서 패턴 기반 시크릿 감지를 수행하여 이전에 커밋되었을 수 있는 API 키, 토큰 및 자격 증명을 포착합니다.
  • 고엔트로피(High-entropy) 문자열 스캐닝: GitHub 토큰(ghp_, gho_), AWS 액세스 키(AKIA), Slack 토큰(xox), 고엔트로피를 가진 base64 인코딩 문자열을 포함한 일반적인 시크릿 패턴을 정규식 기반으로 감지합니다.

공급망 무결성 (Supply Chain Integrity)

전용 공급망 체크 워크플로우는 종속성 매니페스트 파일이 변경될 때 트리거됩니다. 공급망 공격을 예방하는 두 가지 규칙을 적용합니다.

  • 정확한 버전 고정: package.json 파일에서 ^~ 버전 범위를 사용하지 않습니다. 이는 침해된 코드가 유입될 수 있는 예기치 않은 마이너/패치 버전 업데이트를 방지합니다.
  • 잠금 파일(Lockfile) 존재: 종속성이 있는 모든 패키지 디렉토리에는 해당 잠금 파일(package-lock.json, pnpm-lock.yaml 또는 yarn.lock)이 있어야 합니다. 잠금 파일은 검증된 무결성 해시를 통해 재현 가능한 빌드를 보장합니다.

품질 게이트 (Quality Gates)

품질 게이트 워크플로우는 PR 수준에서 pre-commit 훅을 미러링하여 심층 방어를 제공합니다. 모든 풀 리퀘스트에서 네 가지 체크를 수행합니다.

게이트 목적
No Stubs/TODOs 프로덕션 코드에서 TODO, FIXME, HACK 마커 차단 (테스트 파일 제외)
No Unauthorized Crypto 지정된 보안 모듈 외부에서 원시 암호화 임포트 차단
Security Audit Required 보안에 민감한 경로를 수정할 경우 감사 문서 동반 필수
Dependency Audit Trail 벤더 패치(Vendored patches) 시 패치 이유와 출처를 설명하는 감사 추적 필수

이러한 게이트는 pre-commit 훅을 우회하는 모든 것(강제 푸시, GitHub 웹 직접 수정, 훅을 설치하지 않은 기여자의 커밋 등)을 포착합니다.

3단계: CI/빌드 시점 거버넌스

PR이 게이트 워크플로우를 통과하면, 메인 CI 파이프라인과 전문 워크플로우가 더 깊고 컴퓨팅 집약적인 분석을 수행합니다.

거버넌스 검증 액션 (Governance Verify Action)

거버넌스 검증 액션은 CI 시점의 주요 거버넌스 체크 도구입니다. 이는 툴킷을 설치하고 저장소에 대해 준수성(compliance) CLI를 실행하는 GitHub Actions 복합 액션입니다. 네 가지 모드를 지원합니다.

명령 수행 내용
governance-verify 전체 거버넌스 검증 스위트를 실행하여 거버넌스 컨트롤을 확인하고 통과 개수 보고
marketplace-verify 플러그인 매니페스트가 마켓플레이스 요구 사항(필수 필드, 서명, 메타데이터)을 충족하는지 검증
policy-evaluate 특정 정책 파일을 JSON 컨텍스트와 대조하여 평가하고, 일치하는 규칙과 함께 허용/거부 결정 반환
all governance-verify를 실행한 후, 해당 경로가 제공되면 marketplace-verify 및 policy-evaluate 실행

예시는 다음과 같습니다.

# .github/workflows/governance-ci.yml
name: Governance CI
on: [push, pull_request]

jobs:
  verify:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: microsoft/agent-governance-toolkit/action@main
        with:
          command: all
          policy-path: policies/
          manifest-path: plugin.json
          output-format: json
          fail-on-warning: 'true'

이 액션은 통과한 컨트롤 수, 총 컨트롤 수, 위반 건수, 전체 명령 출력을 JSON 형식으로 포함하는 구조화된 데이터를 출력합니다. 이를 통해 대시보드, Slack 알림 또는 하위 의사 결정 로직과 쉽게 통합할 수 있습니다.

보안 스캔 액션 (Security Scan Action)

별도의 보안 스캔 액션은 디렉토리에서 시크릿, CVE, 위험한 코드 패턴을 스캔합니다. git 히스토리에 집중하는 PR 시점 시크릿 스캐닝과 달리, 이 액션은 현재 코드베이스의 콘텐츠를 심층 분석합니다.

- uses: microsoft/agent-governance-toolkit/action/security-scan@main
  with:
    paths: 'plugins/ scripts/'
    min-severity: high
    exemptions-file: .security-exemptions.json

이 액션은 구성 가능한 심각도 임계값(Critical, High, Medium, Low), 알려진 결과에 대한 예외 파일, 발견된 항목 수 및 세부 정보를 포함하는 구조화된 JSON 출력을 지원합니다.

정책 유효성 검사 워크플로우

전용 정책 유효성 검사 워크플로우는 YAML 파일이나 정책 엔진 소스 코드가 변경될 때마다 트리거됩니다. 두 가지 작업을 차례로 수행합니다.

  1. 정책 유효성 검사: 정책 명명 규칙과 일치하는 모든 정책 파일을 찾아 AGT 정책 CLI를 사용하여 각 파일을 검증합니다.
  2. 정책 테스트: 정책 CLI 유닛 테스트를 실행하여 변경 후에도 정책 평가 동작이 올바른지 확인합니다.

이를 통해 정책 파일 수정이 정책 엔진을 망가뜨리지 않고 정책의 의미가 보존되도록 보장합니다.

CodeQL 및 정적 분석

AGT는 Python 및 TypeScript 코드의 의미론적 정적 분석을 위해 GitHub의 CodeQL을 사용합니다. CodeQL 워크플로우는 푸시 및 PR 발생 시 실행되어 단순 패턴 매칭을 넘어서는 심층 데이터 흐름 분석을 수행합니다. 결과는 GitHub의 Security 탭에 SARIF 파일로 업로드되어 코드 품질 문제에 대한 중앙 집중식 뷰를 제공합니다.

종속성 혼동 스캐닝 (Dependency Confusion Scanning)

전용 CI 작업이 모든 빌드에서 종속성 혼동 스캐너를 실행합니다. 이는 공격자가 내부 패키지와 동일한 이름으로 공개 패키지를 등록하는 특정 공급망 공격 벡터에 대한 타겟 방어입니다. 스캐너는 다음 사항을 확인합니다.

  • 내부 패키지 이름이 공개 PyPI 또는 npm 패키지와 충돌하지 않는지
  • Notebook의 pip install 명령이 등록되고 예상된 패키지만 참조하는지

워크플로우 보안 감사

GitHub Actions 워크플로우 파일이 변경되면, 워크플로우 보안 작업이 일반적인 CI/CD 보안 문제를 스캔합니다.

  • 표현식 주입 (Expression injection): run: 블록에서 ${{ github.event.pull_request.title }}과 같은 패턴이 직접 사용되어 임의의 코드가 실행될 수 있는 경우를 감지합니다.
  • 과도하게 허용적인 권한: 필요 이상의 권한을 요청하는 워크플로우에 플래그를 지정합니다.
  • 고정되지 않은 액션 참조: 브랜치 이름으로 참조된 액션을 감지합니다. 이는 공급망 리스크이므로 커밋 SHA를 사용해야 합니다.

BinSkim을 이용한 .NET 바이너리 분석

.NET SDK(Microsoft.AgentGovernance)의 경우, CI 파이프라인이 컴파일된 어셈블리에 대해 Microsoft BinSkim 바이너리 보안 분석을 실행합니다. BinSkim은 DEP(데이터 실행 방지), ASLR(주소 공간 레이아웃 임의화), 스택 보호 등 컴파일된 바이너리의 보안 관련 컴파일러 및 링커 설정을 확인합니다. 결과는 CodeQL 결과와 함께 GitHub 코드 스캐닝에 SARIF로 업로드됩니다.

ci-complete 게이트 패턴

경로 필터에 따라 조건부로 실행되는 많은 CI 작업이 있는 경우, AGT는 ci-complete라는 패턴을 사용합니다. 이는 브랜치 보호에서 유일하게 필수적인 상태 체크로 구성된 단일 게이트 작업입니다. 이 작업은 무조건 실행되며(if: always()), 다른 모든 CI 작업에 의존하고 그 중 실패한 작업이 없는지 확인합니다. 관련 파일이 변경되지 않아 건너뛴 작업은 수용됩니다. 이 패턴은 조건부 CI 작업이 있는 경우 브랜치 보호가 올바르게 작동하도록 보장하며, 건너뛴 작업이 "skipped"로 보고되어 필수 상태 체크를 통과하지 못하는 일반적인 문제를 방지합니다.

언어별 컴파일 시점 적용

언어 중립적인 CI 체크 외에도, 각 AGT SDK는 해당 언어의 기본 컴파일러와 도구를 사용하여 컴파일 시점에 거버넌스 표준을 적용합니다.

.NET: 가장 엄격한 컴파일 시점 체크

.NET SDK(Microsoft.AgentGovernance)는 Directory.Build.propsDirectory.Build.targets의 MSBuild 속성을 통해 컴파일 시점 거버넌스를 적용하며, 이는 SDK의 모든 프로젝트에 자동으로 적용됩니다.

기능 MSBuild 속성 효과
Nullable 참조 형식 <Nullable>enable</Nullable> 컴파일러가 가능한 모든 null 역참조에 대해 경고하여 런타임 NullReferenceException 예방
경고를 오류로 처리 <TreatWarningsAsErrors>true 컴파일러 경고가 빌드 오류가 됨; 경고가 포함된 상태로 배포 불가
강력한 이름 서명 <SignAssembly>true</SignAssembly> 어셈블리가 강력한 이름 키(AgentGovernance.snk)로 서명되어 ID 검증 가능
결정론적 빌드 <ContinuousIntegrationBuild>true 동일 소스 코드가 CI에서 비트 단위로 동일한 바이너리 생성; 빌드 검증 가능
SourceLink Microsoft.SourceLink.GitHub 패키지 사용자가 디버깅 중에 AGT 소스 코드로 들어갈 수 있어 투명성 및 감사 가능성 지원
심볼 패키지 <IncludeSymbols>true</IncludeSymbols> 디버깅 지원을 위해 .snupkg 심볼 패키지가 NuGet 패키지와 함께 게시됨

TypeScript: 엄격한 컴파일 및 린팅

TypeScript SDK(@microsoft/agentmesh-sdk)는 엄격한 컴파일러 설정과 ESLint를 빌드 시점 거버넌스에 사용합니다.

  • **엄격 모드 ("strict": true in tsconfig.json)**는 noImplicitAny, strictNullChecks, strictFunctionTypes 등을 포함한 모든 엄격한 타입 체크 옵션을 활성화합니다.
  • **일관된 파일 명명 (forceConsistentCasingInFileNames)**은 대소문자를 구분하지 않는 시스템(Windows, macOS)에서 작동하던 임포트가 대소문자를 구분하는 시스템(Linux CI)에서 실패하는 크로스 플랫폼 문제를 방지합니다.
  • **선언 생성 (declaration: truedeclarationMap: true)**은 소비자를 위한 .d.ts 파일을 생성하여 다운스트림 타입 체크를 가능하게 합니다.
  • @typescript-eslint를 포함한 ESLint는 빌드 프로세스 중에 정적 분석을 제공하여 TypeScript 컴파일러가 확인하지 못하는 문제를 포착합니다.

Python: 타입 안정성 및 빠른 린팅

AGT의 Python 패키지는 pyproject.toml에 구성된 정적 분석 도구와 타입 지정 패키지 마커를 사용합니다.

  • py.typed 마커: 각 패키지에는 py.typed 파일이 포함되어 타입 체크 도구(mypy, pyright, Pylance)에 해당 패키지가 타입 체크를 지원함을 알립니다. 소비자가 AGT API를 잘못 사용하면 타입 오류가 발생합니다.
  • mypy: pyproject.toml의 프로젝트별 설정과 함께 개발 종속성으로 구성됩니다. 런타임 전에 타입 불일치를 포착하는 정적 타입 체크를 제공합니다.
  • ruff: Rust로 작성된 빠른 Python 린터로, pyproject.toml에 구성되어 CI에서 적용됩니다. Ruff는 빌드 시점에 수백 개의 코드 품질 규칙을 체크합니다.

4단계: 릴리스 시점 게이트 (Release-Time Gates)

아티팩트가 사용자에게 도달하기 전, 릴리스 파이프라인은 마지막 검증 레이어를 추가합니다. 이러한 게이트는 배포되는 것이 빌드된 것과 정확히 일치하는지, 예상된 게시자가 서명했는지, 구성 요소의 완전한 인벤토리가 있는지 확인하는 데 도움이 됩니다.

게이트 도구 생산물
SBOM 생성 Anchore/Syft 모든 구성 요소, 종속성 및 라이선스를 나열하는 SPDX 및 CycloneDX 소프트웨어 자재 명세서
Python 서명 Sigstore OpenID Connect ID를 사용한 암호화 서명 (수동 키 배포 없이 검증 가능)
.NET 서명 릴리스 파이프라인 릴리스 파이프라인을 통한 Microsoft Authenticode 및 NuGet 서명
빌드 출처(Provenance) actions/attest-build-provenance 아티팩트를 소스 커밋 및 빌드 환경과 연결하는 SLSA 출처 어테스테이션
SBOM 어테스테이션 actions/attest-sbom SBOM을 특정 릴리스 아티팩트에 바인딩하여 인벤토리와 바이너리 간의 검증 가능한 링크 생성

추가적으로, OpenSSF Scorecard가 주기적으로 실행되어 브랜치 보호, 종속성 관리, CI/CD 관행 등을 포괄하는 자동화된 보안 태세 평가를 제공합니다. 점수는 OpenSSF Scorecard 웹사이트에 게시되어 소비자에게 프로젝트 보안 관행에 대한 투명한 뷰를 제공합니다.

모든 것이 어떻게 조화를 이루는가: 심층 방어 (Defense in Depth)

이 접근 방식은 심층 방어 원칙을 따릅니다. 모든 체크는 여러 계층에 걸쳐 존재하므로 한 계층을 우회하더라도 전체 시스템이 침해되지 않습니다.

예를 들어 시크릿 스캐닝은 세 단계로 실행됩니다. 커밋 시점의 detect-secrets(pre-commit 훅), PR 시점의 Gitleaks(시크릿 스캐닝 워크플로우), CI 시점의 Security Scan 액션(콘텐츠 분석)입니다. Pre-commit 훅을 우회하는 개발자는 PR 시점 게이트에서 잡히게 됩니다. PR 게이트를 강제 푸시로 통과하려는 기여자는 CI 파이프라인에서 잡히게 됩니다.

마찬가지로 정책 유효성 검사도 커밋 시점(validate-policy 훅), PR 시점(품질 게이트), CI 시점(정책 유효성 검사 워크플로우)에서 실행됩니다. 각 계층은 깊이를 더합니다. 커밋 시점 훅은 스키마 오류를 잡고, CI 파이프라인은 의미론적 문제와 회귀 테스트를 수행합니다.

ci-complete 게이트 작업은 이 모든 것을 하나로 묶습니다. 모든 CI 작업에 의존하고 단일 필수 상태 체크 역할을 함으로써, 모든 관련 체크가 통과되지 않으면 코드가 메인 브랜치에 병합되지 않도록 보장합니다.

시작하기

AGT의 쉬프트-레프트 거버넌스는 점진적으로 도입할 수 있습니다. 낮은 노력부터 높은 노력 순으로 세 가지 시작 지점을 제안합니다.

1. 거버넌스 검증 액션 추가 (5분)

모든 PR에서 준수성 체크를 실행하는 단일 GitHub Actions 워크플로우를 추가하세요.

# .github/workflows/governance.yml
name: Governance
on: [pull_request]
jobs:
  verify:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: microsoft/agent-governance-toolkit/action@main
        with:
          command: governance-verify

2. Pre-commit 훅 활성화 (15분)

AGT의 훅을 참조하는 .pre-commit-config.yaml을 추가하고 설치한 뒤, 기존의 모든 파일에 대해 실행하여 기준점을 만드세요. 허용 모드로 시작하여 4주에 걸쳐 엄격 모드로 전환하세요.

3. 전체 파이프라인 통합 (1~2시간)

PR 시점 게이트(어테스테이션, 종속성 검토, 시크릿 스캐닝, 공급망 체크, 품질 게이트)의 전체 세트를 추가하고, 플러그인 디렉토리에 대해 Security Scan 액션을 구성하며, 릴리스 워크플로우에서 SBOM 생성 및 서명을 활성화하세요. AGT 저장소 자체가 참조 구현체 역할을 합니다. 이 포스팅에서 설명된 모든 워크플로우는 aka.ms/agent-governance-toolkit에서 실제로 실행되고 있습니다.

중요 고지

본 포스팅에 포함된 정책 파일, 워크플로우 구성 및 코드 샘플은 설명을 위한 예시입니다. 조직의 거버넌스 요구 사항은 다를 수 있습니다. 프로덕션에 배포하기 전에 모든 구성을 검토하고 맞춤 설정하십시오. 에이전트 거버넌스 툴킷은 조직이 AI 에이전트를 위한 거버넌스 컨트롤을 구현하도록 돕기 위해 설계되었으며, 특정 규제 프레임워크의 준수를 보장하지는 않습니다. 거버넌스 정책을 정의할 때는 항상 조직의 보안 및 법무 팀과 상담하십시오.

향후 계획

프리런타임 거버넌스는 퍼즐의 한 조각입니다. 이 시리즈의 1부에서 다룬 런타임 거버넌스 기능(정책 엔진, 제로 트러스트 ID, 실행 샌드박싱, 감사 로깅)과 결합하여 전체 수명 주기에 걸친 커버리지를 제공합니다.

프로젝트는 계속 성장하고 있습니다. 초기 출시 이후, 저희는 다단계 정책 파이프라인(pre_input, pre_tool, post_tool, pre_output 단계), 인간 개입형(Human-in-the-loop) 게이트를 포함한 승인 워크플로우, 단조로운(Monotonic) 세션 상태를 위한 DLP 속성 래칫, 거버넌스 운영을 위한 OpenTelemetry 계측 등을 추가했습니다. 문서에서는 45개 이상의 단계별 튜토리얼을 확인할 수 있습니다.

이 포스팅에서 설명된 모든 내용은 현재 공개 GitHub 저장소에서 이용 가능합니다. 전체 소스, 문서, 튜토리얼 및 예제는 aka.ms/agent-governance-toolkit에 있으며, MIT 라이선스 하에 오픈 소스로 제공됩니다. 커뮤니티의 기여, 피드백 및 이슈 보고를 언제나 환영합니다.