
AI 코딩 에이전트를 개인이 사용할 때는 설정이 단순하다.
개발자
↓
Codex / Claude Code / Copilot
↓
프로젝트 작업
사용할 모델을 고르고, 필요한 MCP Server나 Plugin을 연결한 뒤 작업하면 된다.
하지만 팀 전체가 에이전트를 사용하기 시작하면 문제가 달라진다.
개발자 A
→ 승인 없이 모든 명령 자동 실행
개발자 B
→ 검증되지 않은 Plugin 설치
개발자 C
→ 개인 MCP Server 연결
개발자 D
→ 비용이 높은 모델을 항상 사용
Cloud Agent
→ 로컬과 다른 정책으로 작업
각 개발자가 설정을 따로 관리하면 조직의 AI 개발 환경은 빠르게 흩어진다.
보안 담당자는 다음을 알기 어렵다.
누가 어떤 Plugin을 사용하는가?
어떤 Marketplace에서 설치했는가?
Agent가 명령 실행 승인을 건너뛸 수 있는가?
Cloud Agent도 같은 정책을 적용받는가?
사용자가 로컬에서 정책을 덮어쓸 수 있는가?
최근 GitHub는 Enterprise Managed Settings의 적용 범위를 Copilot 앱과 Copilot Cloud Agent까지 확대했다.
이제 하나의 managed-settings.json으로 여러 Copilot Client에 공통 Guardrail을 적용할 수 있다.
구조는 다음과 같다.
Enterprise Policy Repository
copilot/managed-settings.json
│
├── VS Code
├── Copilot CLI
├── Copilot App
└── Copilot Cloud Agent
이번 글에서는 이를 단순한 GitHub 기능 소개가 아니라 AI Coding Agent용 Policy as Code 관점에서 정리해본다.
기존 Infrastructure as Code는 Server와 Network 구성을 코드로 관리한다.
Terraform
Kubernetes YAML
CloudFormation
Policy as Code는 보안과 운영 규칙을 코드로 관리한다.
누가 무엇을 실행할 수 있는가
어떤 Resource에 접근할 수 있는가
어떤 변경에 승인이 필요한가
AI Agent에서도 같은 구조가 필요하다.
Agent가 어떤 Tool을 사용할 수 있는가
어떤 Plugin을 설치할 수 있는가
명령 실행 승인을 건너뛸 수 있는가
어떤 모델을 기본값으로 사용할 것인가
Telemetry를 어디로 보낼 것인가
이 규칙을 관리자 화면에서만 설정하지 않고 Repository의 파일로 관리하는 것이 Agent Policy as Code다.
개발자 로컬 설정은 편하지만 조직 정책으로는 약하다.
예를 들어 사용자가 자신의 설정 파일에서 다음과 같이 구성할 수 있다고 하자.
{
"permissions": {
"allowAllCommands": true
}
}
또는 승인 없이 명령을 실행하는 모드를 켤 수 있다.
Agent
→ Shell 명령 제안
→ 승인 생략
→ 즉시 실행
개인 프로젝트에서는 개발자가 위험을 감수할 수 있다.
하지만 기업 Repository에서는 다르다.
rm
git reset --hard
curl
npm install
brew install
배포 Script
Cloud CLI
이런 명령을 Agent가 승인 없이 실행할 수 있으면 사고 범위가 커진다.
조직 정책은 사용자 설정보다 높은 우선순위를 가져야 한다.
관리형 설정에서는 여러 설정 출처가 존재할 수 있다.
MDM
Server-managed Policy
로컬 File
User Setting
일반적으로 상위 관리 정책이 하위 개인 설정보다 우선해야 한다.
개념적으로는 다음과 같다.
MDM Policy
↓
Enterprise Server Policy
↓
Project / File Setting
↓
User Setting
사용자가 로컬 설정을 바꿔도 Enterprise Policy가 강제한 항목은 덮어쓸 수 없어야 한다.
Enterprise
승인 우회 금지
Developer Local
승인 우회 활성화
최종 결과:
승인 우회 금지
이게 관리형 정책의 핵심이다.
GitHub 방식에서는 보통 Enterprise 내부의 비공개 관리 Repository를 사용한다.
구조는 다음과 같다.
.github-private/
└── copilot/
└── managed-settings.json
이 Repository는 일반 제품 코드와 분리하는 것이 좋다.
제품 Repository
my-ios-app
backend-api
admin-web
AI 정책 Repository
.github-private
정책 변경 권한도 제한한다.
Enterprise Owner
AI Platform Team
Security Team
일반 개발자가 직접 Merge하지 못하게 한다.
처음에는 정책을 너무 많이 넣지 않는다.
가장 위험도가 높은 세 가지부터 시작한다.
{
"permissions": {
"disableBypassPermissionsMode": true
},
"strictKnownMarketplaces": true,
"enabledPlugins": []
}
의미는 단순하다.
승인 우회 제한
허용된 Marketplace만 사용
승인된 Plugin만 사용
실제 지원되는 값과 Schema는 사용하는 GitHub Enterprise 및 Client 버전의 공식 Reference에 맞춰 확인해야 한다.
Agent Tool에는 Side Effect가 있다.
파일 수정
Shell 실행
URL 접근
외부 API 호출
Git Push
일반적인 Interactive Client는 실행 전 사용자에게 묻는다.
Agent가 이 명령을 실행하려고 합니다.
허용하시겠습니까?
그러나 일부 Client에는 모든 승인을 건너뛰는 모드가 있을 수 있다.
흔히 다음처럼 부른다.
YOLO Mode
Auto Approve
Bypass Permissions
Enterprise에서는 이를 기본적으로 차단하는 편이 안전하다.
{
"permissions": {
"disableBypassPermissionsMode": true
}
}
이 정책의 목적은 Agent 사용을 막는 것이 아니다.
읽기와 분석
→ 빠르게
위험한 실행
→ 확인 후
으로 경계를 나누는 것이다.
반대로 명령 하나마다 승인을 요구하면 Agent Workflow가 지나치게 느려진다.
파일 읽어도 될까요?
검색해도 될까요?
테스트를 실행할까요?
Git Diff를 볼까요?
그래서 위험도에 따라 구분하는 것이 좋다.
파일 읽기
코드 검색
Git Diff
Local Test
정적 분석
자동 허용 후보.
작업 폴더 파일 수정
Package Lockfile 변경
Local Build Script 실행
팀 정책에 따라 허용.
외부 Network 요청
새 Package 설치
Git Push
Issue 생성
PR 생성
명시적인 승인 또는 제한된 Scope.
Production Deploy
Secret 변경
Repository 삭제
Database Migration
Signing 변경
사람 승인 필수.
정책 파일 하나만 보면 운영 의도를 이해하기 어려울 수 있다.
Repository에 설명 문서를 함께 둔다.
.github-private/
├── copilot/
│ └── managed-settings.json
│
└── docs/
├── permission-matrix.md
├── plugin-policy.md
└── incident-response.md
permission-matrix.md 예시:
# Agent Permission Matrix
| Action | Interactive Agent | Cloud Agent | Approval |
|---|---|---|---|
| Read repository | Allow | Allow | No |
| Run unit tests | Allow | Allow | No |
| Modify task files | Allow | Allow | No |
| Install package | Ask | Deny | Yes |
| Push branch | Ask | Allow on task branch | Policy |
| Merge PR | Deny | Deny | Human |
| Deploy production | Deny | Deny | Human |
Agent 제품이 표의 모든 항목을 직접 지원하지 않더라도 조직의 기준을 명확하게 만드는 데 도움이 된다.
Plugin을 단순한 UI Extension으로 생각하면 안 된다.
AI Coding Agent Plugin은 다음을 포함할 수 있다.
새 Tool
새 Command
새 Agent
MCP 연결
Skill
외부 실행 코드
즉 Plugin 설치는 Agent의 권한을 확장하는 행동이다.
Agent
기본 Tool
에서
Agent
기본 Tool
+
Database Tool
+
Cloud Tool
+
Deployment Tool
로 바뀐다.
따라서 Plugin도 Package Dependency처럼 검토해야 한다.
개발자가 임의의 Marketplace를 추가할 수 있으면 검증되지 않은 Plugin이 들어올 수 있다.
Public Marketplace
개인 Registry
알 수 없는 URL
Fork된 Plugin
조직에서는 허용된 Source만 사용하게 만든다.
개념적인 설정:
{
"strictKnownMarketplaces": true,
"extraKnownMarketplaces": [
{
"name": "company-agent-marketplace",
"url": "https://example.invalid/agent-marketplace"
}
]
}
실제 조직 주소와 인증 방식은 외부 공개 문서나 일반 Repository에 넣지 않는다.
사내 Agent Resource를 중앙에서 관리할 수 있다.
Private Agent Marketplace
├── ios-review-plugin
├── backend-migration-plugin
├── security-review-agent
├── release-note-skill
└── internal-mcp-tools
개발자는 승인된 Resource만 설치한다.
Developer
↓
Approved Marketplace
↓
Reviewed Plugin
개인 URL에서 바로 설치하는 흐름을 막는다.
새 Plugin을 바로 허용 목록에 넣지 않는다.
Discover
↓
Quarantine
↓
Source Review
↓
Permission Review
↓
Sandbox Test
↓
Approve
↓
Marketplace 등록
검토 항목은 다음과 같다.
어떤 Tool을 추가하는가?
외부 Network 요청을 하는가?
파일 시스템 어디까지 읽는가?
Shell 명령을 실행하는가?
Secret에 접근하는가?
자동 업데이트되는가?
의존 Package가 무엇인가?
앞에서 다룬 Agent Skills Supply Chain과 같은 원리가 Plugin에도 적용된다.
허용 Plugin을 명시적으로 관리한다.
개념 예시:
{
"enabledPlugins": [
"company/ios-review",
"company/security-check",
"company/test-runner"
]
}
좋은 운영 원칙은 다음과 같다.
기본 거부
필요한 Plugin만 허용
Version 또는 Revision 고정
업데이트 시 재검토
사용 기록 수집
모든 Plugin을 기본 허용하고 문제가 생긴 뒤 차단하는 방식보다 안전하다.
로컬 Interactive Agent와 Cloud Agent는 실행 환경이 다르다.
개발자가 화면 앞에 있음
실행 요청을 바로 확인 가능
중간에 취소 가능
Background에서 실행
개발자가 자리를 비울 수 있음
수십 분 뒤 PR 생성
여러 Task 동시 진행
Cloud Agent에서는 실행 중 매번 사람에게 Prompt를 띄우기 어렵다.
그래서 사전에 경계를 더 명확하게 정해야 한다.
허용 Plugin
허용 Marketplace
Repository 범위
Branch 정책
Network 정책
Secret Scope
PR 완료 조건
중앙 설정을 공유하더라도 모든 Key가 모든 Client에서 똑같이 동작하는 것은 아니다.
예를 들어 승인 우회 제어는 사용자가 상호작용하는 Client에 적용하기 자연스럽다.
Copilot App
Copilot CLI
VS Code
Cloud Agent는 사용자에게 매 명령 승인 Prompt를 보여주는 방식이 아니므로, 다른 정책 계층이 필요하다.
Repository Permission
Workflow Permission
Plugin Allowlist
Branch Protection
Ruleset
Environment Approval
따라서 중앙 설정 하나로 모든 보안 문제가 해결된다고 생각하면 안 된다.
Cloud Agent의 결과는 PR로 들어오게 한다.
Issue
↓
Cloud Agent
↓
Task Branch
↓
Pull Request
↓
CI
↓
Code Review
↓
Merge
Agent가 main에 직접 반영하지 않게 한다.
GitHub 쪽에서는 다음을 같이 적용한다.
Branch Protection
Required Review
Required Status Check
CODEOWNERS
Ruleset
Environment Approval
Agent Policy와 Repository Policy를 함께 사용해야 한다.
조직에서 모델 선택을 완전히 사용자에게 맡기면 비용과 결과가 크게 달라질 수 있다.
개발자 A
항상 최고급 모델
개발자 B
항상 빠른 모델
개발자 C
매번 임의 선택
Model Router를 중앙에서 직접 구현하지 않더라도 기본값을 정할 수 있다.
예:
{
"model": "auto"
}
Auto Model Selection을 기본으로 두면 Client가 작업에 따라 적절한 모델을 선택하도록 할 수 있다.
다만 다음은 구분해야 한다.
기본값
≠
강제 고정
지원되는 Client와 Key에 따라 사용자가 변경할 수 있는 범위가 다를 수 있다.
Model 기본값만으로 비용을 통제하기 어렵다.
다음도 같이 본다.
사용자별 Budget
Cost Center
AI Credit Pool
Session Limit
Input / Output Token Limit
정책 구조는 다음처럼 나눌 수 있다.
managed-settings.json
→ Client 동작과 Guardrail
GitHub Billing / AI Controls
→ 사용자·조직 비용
Repository Policy
→ 어떤 작업에 Agent를 쓰는가
하나의 설정 파일에 모든 책임을 넣지 않는다.
BYOK나 Custom Endpoint를 사용할 경우 Input·Output Token Limit을 설정할 수 있는 Client가 있다.
예를 들어
maxInputToken
maxOutputToken
을 지나치게 크게 설정하면 비용과 지연 시간이 늘어난다.
지나치게 작으면 Agent가 필요한 Context를 읽지 못한다.
Task Type별 기준을 잡는 편이 좋다.
간단한 Q&A
작은 Context
일반 Coding
중간 Context
Repository Review
큰 Context
모든 Task에 최대 Context를 주는 방식은 피한다.
Agent Workflow에서는 일반 IDE 사용보다 더 많은 운영 정보가 필요하다.
Agent Run
Model
Tool Call
Latency
Token
Error
Approval
Plugin
OpenTelemetry로 내보내면 기존 관찰 시스템과 연결할 수 있다.
Copilot Client
↓
OpenTelemetry Export
↓
Collector
↓
Grafana / Datadog / New Relic / 사내 시스템
다만 Source Code와 Prompt 전체를 무조건 수집하면 안 된다.
권장 후보:
Client 종류
Agent Session ID
Model 이름
실행 시간
Tool 호출 수
성공·실패
승인 요청 수
사용 Credit
Error Code
주의할 데이터:
전체 Prompt
Source Code 원문
Secret
사용자 개인정보
Private Repository 경로
Tool Argument 전체
Telemetry Schema를 미리 정의한다.
{
"sessionId": "session-142",
"client": "copilot-app",
"model": "auto",
"durationMs": 94211,
"toolCalls": 18,
"approvalRequests": 3,
"status": "completed"
}
Source Code는 넣지 않는다.
무분별하게 모든 Attribute를 Export하지 않는다.
telemetry:
attributes:
allow:
- client.type
- model.name
- session.duration_ms
- tool.call_count
- run.status
deny:
- prompt.content
- tool.arguments
- source.code
- authorization
제품이 이 정확한 YAML 구조를 지원한다는 의미는 아니다.
조직의 Telemetry Policy를 표현한 예시다.
한 개발자가 여러 Surface를 사용할 수 있다.
VS Code에서 코드 작성
Copilot App에서 긴 Task 실행
CLI에서 Repository 조사
Cloud Agent에 Issue 위임
한 Client만 보호하면 우회 경로가 생긴다.
예:
VS Code
미승인 Plugin 차단
하지만
Copilot App
미승인 Plugin 허용
이면 정책이 약해진다.
보안은 가장 느슨한 Surface 기준으로 무너진다.
그래서 중앙 Policy가 모든 Client를 따라가야 한다.
이전에는 managed-settings.json이 VS Code와 Copilot CLI를 중심으로 적용됐다.
최근 업데이트로 Copilot 앱과 Cloud Agent도 같은 관리 범위에 들어왔다.
Before
VS Code
Copilot CLI
After
VS Code
Copilot CLI
Copilot App
Copilot Cloud Agent
조직이 하나의 정책 파일을 더 넓은 Agent Surface에 적용할 수 있게 된 것이다.
모든 조직이 Desktop Agent App을 허용해야 하는 것은 아니다.
이제 Copilot App 자체의 접근 정책을 독립적으로 관리할 수 있다.
개념적인 선택은 다음과 같다.
전체 허용
전체 차단
Organization별 결정
CLI는 허용하지만 App은 차단할 수도 있다.
Copilot CLI
Enabled
Copilot App
Disabled
Client별 위험과 운영 준비 상태가 다를 수 있기 때문이다.
Agent Policy는 Pilot을 거치는 편이 좋다.
1단계
AI Platform Team
2단계
개발 조직 일부
3단계
일반 Engineering
4단계
전사 확대
Pilot에서는 다음을 본다.
업무가 지나치게 막히는가?
필요한 Plugin이 차단되는가?
승인 Prompt가 너무 많은가?
Cloud Agent가 Task를 끝낼 수 있는가?
Telemetry가 충분한가?
비용이 예상 범위인가?
처음부터 모든 것을 차단하면 사용자가 정책 우회를 찾게 된다.
추천 출발점:
승인 전체 우회 차단
Marketplace Allowlist
Plugin Allowlist
Production 관련 Tool 금지
Cloud Agent는 PR만 생성
Telemetry 기본 수집
그다음 실제 사용 데이터를 보고 조정한다.
아래는 구조를 이해하기 위한 개념 예시다.
실제 적용 전에는 최신 GitHub Reference의 Key와 Value Type을 확인해야 한다.
{
"permissions": {
"disableBypassPermissionsMode": true
},
"strictKnownMarketplaces": true,
"extraKnownMarketplaces": [
{
"name": "company-approved",
"url": "https://example.invalid/marketplace"
}
],
"enabledPlugins": [
"company/ios-review",
"company/security-check"
],
"model": "auto"
}
정책 파일에는 Secret을 넣지 않는다.
Token
Private Key
Marketplace Credential
API Key
는 별도 Secret Store에서 관리한다.
설정 파일의 오타는 전사 Client에 영향을 줄 수 있다.
예:
{
"disableBypassPermissionMode": true
}
정확한 Key가 아니라면 적용되지 않을 수 있다.
CI에서 Schema를 검증한다.
Pull Request
↓
JSON Parse
↓
Schema Validation
↓
Policy Test
↓
Security Review
↓
Merge
간단한 Node Script를 만들 수 있다.
import { readFile } from "node:fs/promises";
async function main(): Promise<void> {
const raw = await readFile(
"copilot/managed-settings.json",
"utf8"
);
const value = JSON.parse(raw);
if (typeof value !== "object" || value === null) {
throw new Error("managed-settings.json must be an object");
}
console.log("JSON syntax is valid.");
}
main().catch(error => {
console.error(error);
process.exit(1);
});
이 코드는 JSON 문법만 확인한다.
실제 Key 검증에는 공식 Schema 또는 조직에서 유지하는 별도 Schema가 필요하다.
GitHub 공식 지원 Key 외에도 조직 정책을 별도 파일로 관리할 수 있다.
policy/
├── copilot-policy.yaml
├── plugin-allowlist.yaml
├── tool-risk.yaml
└── telemetry-policy.yaml
예:
version: 1
clients:
copilot-app:
enabled: true
copilot-cli:
enabled: true
cloud-agent:
enabled: true
permissions:
bypass: denied
plugins:
default: deny
cloudAgent:
directMainPush: denied
pullRequestRequired: true
production:
deploy: human-approval
이 파일을 기준으로 managed-settings.json과 GitHub 정책이 일치하는지 CI에서 확인할 수 있다.
같은 규칙이 다음에 모두 들어가면 문제가 생긴다.
managed-settings.json
Repository AGENTS.md
Security 문서
Cloud Agent Prompt
Plugin 설정
한 곳은 강제 정책, 다른 곳은 설명이나 작업 지침으로 나눈다.
managed-settings.json
AI Controls
Branch Ruleset
Environment Approval
AGENTS.md
Custom Agent Instruction
Skill
Policy Documentation
강제할 수 없는 Prompt 문장을 보안 정책처럼 믿지 않는다.
관리 설정이 Client 수준의 Guardrail이라면 AGENTS.md는 Repository 작업 규칙을 담당한다.
# Repository Agent Rules
## Scope
- Modify only files required by the assigned task.
- Do not change generated files.
- Ask before adding dependencies.
## Validation
- Run relevant tests after behavior changes.
- Never report a test as passed unless it ran successfully.
## Git
- Never push directly to main.
- Submit changes through a pull request.
## High-risk actions
- Do not modify signing settings.
- Do not deploy production.
- Do not rotate secrets.
역할을 구분한다.
managed-settings.json
→ Client와 Tool 사용 경계
AGENTS.md
→ Repository 안의 작업 방식
Plugin이 허용됐다고 Plugin이 제공하는 모든 Tool을 자동 허용할 필요는 없다.
예:
GitHub Plugin
├── read_pull_request
├── create_issue
├── merge_pull_request
└── delete_repository
Plugin 전체는 승인됐지만 위험 Tool은 별도 제한할 수 있어야 한다.
plugin: github
tools:
read_pull_request:
risk: low
action: allow
create_issue:
risk: medium
action: ask
merge_pull_request:
risk: high
action: deny
delete_repository:
risk: critical
action: deny
Client가 Tool 단위 정책을 직접 지원하지 않으면 MCP Gateway나 Tool Server에서 강제한다.
Client Policy는 Plugin과 Marketplace를 통제한다.
MCP Gateway는 실제 Tool 호출을 통제한다.
Copilot Client
↓
Managed Settings
↓
Approved MCP Plugin
↓
MCP Gateway
↓
Tool Authorization
↓
GitHub / Database / Cloud
두 계층이 필요하다.
Client Guardrail
어떤 확장을 연결할 수 있는가
Runtime Guardrail
실제로 무엇을 실행할 수 있는가
Cloud Agent가 사내 Resource를 사용하려면 Credential이 필요할 수 있다.
좋지 않은 방식:
Enterprise-wide Admin Token
권장 방식:
Task별 단기 Credential
Repository 제한 Token
Read-only Scope
만료 시간 설정
가능하면 Agent에게 Secret 값을 직접 보여주지 않는다.
Agent
→ Tool 호출
Tool Server
→ Secret 사용
구조로 둔다.
managed-settings.json의 한 줄이 전체 개발 환경을 바꿀 수 있다.
Plugin 허용
Marketplace 추가
승인 우회 설정
모델 기본값 변경
일반 설정 파일보다 엄격하게 관리한다.
Pull Request
↓
AI Platform Review
↓
Security Review
↓
Policy Test
↓
Merge
CODEOWNERS 예시:
/copilot/managed-settings.json @ai-platform @security
/policy/ @ai-platform @security
예:
# Agent Policy 2026-08-01
## Added
- Approved `company/ios-review` plugin.
- Enabled Copilot App for mobile team pilot.
## Changed
- Default model selection set to auto.
## Restricted
- Bypass permission mode disabled.
- Unknown plugin marketplaces blocked.
## Rollback
Revert commit `abc123`.
문제가 생기면 어느 변경 때문인지 추적할 수 있다.
정책 변경으로 모든 개발자의 Workflow가 막힐 수 있다.
예:
필수 Plugin이 Allowlist에서 빠짐
Marketplace URL 오류
설정 Schema 오류
Rollback 절차를 미리 만든다.
문제 감지
↓
이전 Commit Revert
↓
Client Refresh 확인
↓
영향 사용자 공지
정책도 Deployment처럼 취급한다.
중앙 정책이 Merge됐다고 모든 Client에 즉시 반영된다고 가정하면 안 된다.
일반적인 반영 시점은 다음과 같을 수 있다.
주기적 Refresh
Client 재시작
다시 로그인
다음 Cloud Task
정책 변경 후 검증 Matrix를 사용한다.
VS Code
적용 확인
Copilot CLI
적용 확인
Copilot App
적용 확인
Cloud Agent
새 Task에서 확인
각 Client에서 현재 Effective Policy를 확인할 수 있다면 결과를 수집한다.
{
"client": "copilot-app",
"policyVersion": "2026-08-01.1",
"bypassDisabled": true,
"marketplaceStrict": true
}
서버 정책 파일과 비교한다.
Expected Policy
vs
Effective Policy
불일치한 Client를 찾는다.
Policy Drift는 중앙 정책과 실제 Client 상태가 달라지는 것이다.
원인:
오래된 Client Version
정책 Refresh 실패
로그인 계정 불일치
MDM 설정 충돌
지원하지 않는 Key
Network 문제
Drift 상태를 다음처럼 관리할 수 있다.
Compliant
Outdated
Unsupported
Unknown
Conflicting
보안 정책이 강하다고 무조건 좋은 것은 아니다.
개발 업무를 지나치게 막으면 실패한다.
대표 Task를 만들어본다.
Task 1
일반 Bug Fix
Task 2
Unit Test 실행
Task 3
새 Package가 필요한 기능
Task 4
Cloud Agent PR 생성
각 정책에서 성공하는지 본다.
Task Completion Rate
Approval Prompt 수
차단된 정상 Tool 수
허용된 위험 Tool 수
평균 완료 시간
Agent Retry 수
Developer Override 요청
Security Incident
예:
{
"policyVersion": "2026-08-01.1",
"task": "normal-bug-fix",
"completed": true,
"approvalPrompts": 3,
"blockedTools": [],
"durationSec": 412
}
정책이 너무 느슨한지, 너무 강한지 조정한다.
긴급 장애 상황에서는 평소보다 높은 권한이 필요할 수 있다.
그러나 개발자가 자신의 로컬 설정으로 임의 우회하면 안 된다.
별도의 Break-glass 절차를 둔다.
긴급 요청
↓
승인자 확인
↓
시간 제한 권한
↓
모든 행동 Audit
↓
자동 만료
↓
사후 Review
Agent의 승인 우회 기능을 항상 열어두는 것과 완전히 다르다.
팀마다 다른 정책이 필요할 수 있다.
모바일 팀
Xcode Tool 필요
Backend 팀
Kubernetes Tool 필요
하지만 모든 팀에 별도 정책을 만들면 관리가 어려워진다.
구조를 계층화한다.
Enterprise Baseline
↓
Team Extension
↓
Repository Rule
승인 우회 차단
미승인 Marketplace 차단
Production 직접 실행 금지
허용 Plugin 추가
AGENTS.md 작업 규칙
.github-private/
│
├── copilot/
│ └── managed-settings.json
│
├── policy/
│ ├── baseline.yaml
│ ├── plugin-allowlist.yaml
│ ├── tool-risk.yaml
│ └── telemetry.yaml
│
├── schema/
│ └── organization-policy.schema.json
│
├── tests/
│ ├── validate-settings.ts
│ ├── validate-plugins.ts
│ └── policy-fixtures/
│
├── docs/
│ ├── permission-matrix.md
│ ├── plugin-review.md
│ └── break-glass.md
│
└── CODEOWNERS
정책, 문서, 검증 코드를 한 Repository에서 관리한다.
name: Validate Agent Policy
on:
pull_request:
paths:
- "copilot/**"
- "policy/**"
- "schema/**"
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- run: npm ci
- name: Validate JSON
run: npm run validate:settings
- name: Validate plugin allowlist
run: npm run validate:plugins
- name: Run policy fixtures
run: npm run test:policy
이 Pipeline을 실제로 실행하지 않았다면 통과한다고 주장해서는 안 된다.
tests/
└── policy-fixtures/
├── approved-plugin.json
├── unknown-marketplace.json
├── bypass-request.json
└── production-deploy.json
예:
{
"name": "unknown-marketplace",
"input": {
"marketplace": "https://unknown.invalid"
},
"expected": {
"decision": "deny"
}
}
정책 변경마다 회귀 테스트한다.
type PolicyDecision = {
decision:
| "allow"
| "ask"
| "deny";
reason: string;
policyId: string;
requiresHumanApproval: boolean;
};
예:
{
"decision": "deny",
"reason": "Marketplace is not enterprise-approved.",
"policyId": "PLUGIN-MARKETPLACE-001",
"requiresHumanApproval": false
}
Agent에게 자연어 한 줄만 주는 것보다 Audit하기 쉽다.
다음 문장을 Agent Prompt에 적을 수 있다.
위험한 명령은 실행하지 마.
하지만 이것만으로는 강제 정책이 아니다.
Agent가 잘못 판단하거나 Prompt 충돌이 발생할 수 있다.
보안 경계는 다음 위치에서 강제해야 한다.
Client Managed Settings
MCP Gateway
Tool Server
GitHub Ruleset
Environment Approval
Prompt는 행동을 안내하지만 권한 시스템을 대체하지 않는다.
AI Coding Agent는 이제 IDE 안의 보조 기능 하나가 아니다.
Desktop App
CLI
IDE
Cloud Agent
Issue Automation
PR Review
MCP Tool
여러 Surface에서 동작한다.
Agent가 늘어날수록 개별 개발자의 좋은 판단에만 의존하기 어렵다.
설정 공유
Plugin 검증
권한 통제
비용 관리
Telemetry
Audit
가 Platform 기능이 된다.
기존 Platform Engineering 팀은 다음을 관리했다.
CI/CD
Developer Portal
Cloud Environment
Observability
Security Baseline
앞으로는 여기에 Agent Runtime이 추가된다.
Approved Models
Agent Clients
MCP Registry
Plugin Marketplace
Skills
Permission Policy
Eval
Cost
Trace
Agent Policy as Code는 이 작업의 기본 단위가 될 수 있다.
Enterprise 기능을 사용하지 않더라도 같은 원칙을 프로젝트에 적용할 수 있다.
.ai-policy/
├── allowed-tools.yaml
├── allowed-mcp.yaml
├── plugin-lock.json
├── risk-policy.yaml
└── README.md
예:
tools:
read_file: allow
run_tests: allow
install_package: ask
git_push: ask
deploy_production: deny
Codex나 Claude Code 자체가 이 파일을 자동 강제하지 않더라도 Wrapper, MCP Gateway, Script에서 활용할 수 있다.
version: 1
filesystem:
allowed:
- "./"
network:
default: deny
commands:
safe:
- git status
- git diff
- swift test
approval:
- git push
- npm install
denied:
- rm -rf
- git push --force
production:
deploy: denied
처음에는 이 정도만 있어도 Agent 사용 경계를 명확하게 만들 수 있다.
AI Coding Agent가 한 명일 때는 개인 설정으로 충분해 보인다.
하지만 Agent가 여러 Client와 Cloud 환경으로 확장되면 문제가 달라진다.
VS Code
Copilot CLI
Copilot App
Cloud Agent
각 Surface가 서로 다른 Plugin과 권한 정책을 가지면 가장 약한 지점이 전체 보안 경계가 된다.
최근 GitHub의 변화는 Agent 운영이 다음 단계로 넘어가고 있음을 보여준다.
개발자가 Agent를 선택한다.
↓
조직이 Agent의 행동 경계를 코드로 관리한다.
좋은 Agent Policy는 무조건 차단하는 정책이 아니다.
낮은 위험 작업
→ 빠르게 자동화
높은 위험 작업
→ 승인과 검증
으로 나누는 정책이다.
기본 구조는 다음과 같다.
managed-settings.json
→ Client Guardrail
Plugin / Marketplace Policy
→ 확장 공급망 통제
MCP Gateway / Tool Policy
→ 실제 행동 통제
Branch Ruleset / CI
→ 코드 반영 통제
OpenTelemetry / Audit
→ 실행 관찰
한 줄로 정리하면 이렇다.
AI Agent 시대의 Policy as Code는
에이전트에게 무엇을 시킬지 적는 문서가 아니라,
에이전트가 어디까지 행동할 수 있는지를
모든 개발 환경에서 일관되게 강제하는 코드다.
앞으로 Agent를 팀 단위로 운영할수록 좋은 Prompt보다 먼저 필요한 것은 Plugin Allowlist, Permission Gate, Model Policy, Telemetry, Rollback을 포함한 공통 Guardrail이 될 가능성이 높다.
GitHub Changelog — Enterprise managed settings in the GitHub Copilot app and Copilot cloud agent
managed-settings.json의 적용 범위가 Copilot 앱과 Cloud Agent까지 확대된 최신 변경 사항을 설명하는 공식 자료.
GitHub Docs — Configuring enterprise-managed settings
Server-managed, MDM-managed, File-based 배포 방식과 .github-private Repository를 이용한 중앙 설정 방법을 확인할 수 있는 공식 문서.
GitHub Docs — Enterprise managed settings reference
Permission 우회 제한, Plugin, Marketplace, Model, Telemetry 등 현재 지원되는 Key와 Client별 지원 여부를 확인할 수 있는 공식 Reference.
GitHub Changelog — Manage GitHub Copilot app access with a dedicated policy
Copilot 앱과 CLI 접근 정책을 독립적으로 관리하는 방법과 Enterprise·Organization 단위 선택지를 설명하는 공식 자료.
GitHub Changelog — Copilot for JetBrains OpenTelemetry and model management
Agent Workflow의 OpenTelemetry Export, BYOK Token Limit, Model 제어, MCP Server와 Custom Agent 연결 관련 최신 변경을 설명하는 공식 자료.
GitHub는 2026년 7월 27일부터 Enterprise Managed Settings를 Copilot 앱과 Copilot Cloud Agent까지 확대했다. 기존 VS Code와 Copilot CLI를 포함해 하나의 정책 파일이 더 많은 Agent Surface에 적용된다.
관리자는 managed-settings.json으로 허용 Plugin, Plugin Marketplace, 승인 우회 제한, Auto Model Selection 같은 설정을 중앙에서 배포할 수 있으며, 지원되는 Key에서는 관리 설정이 사용자 로컬 설정보다 우선한다.
Copilot 앱은 Interactive Client이므로 Permission Prompt 우회 제한을 적용할 수 있지만, Cloud Agent는 매 명령마다 사용자 Prompt를 띄우는 구조가 아니므로 Plugin·Marketplace 제한과 함께 Repository Permission, Branch Ruleset, Required Review, Environment Approval을 별도로 구성해야 한다.
정책은 .github-private Repository의 copilot/managed-settings.json에서 관리할 수 있으며, 지원 Client는 인증·재시작·주기적 Refresh 또는 다음 Cloud Task에서 변경된 설정을 반영한다.
따라서 managed-settings.json 하나를 전체 보안 시스템으로 보기보다, Client Guardrail을 담당하는 첫 번째 계층으로 두고 MCP Gateway·Tool Authorization·GitHub Ruleset·Telemetry와 함께 운영하는 것이 적절하다.