버전: v0.2.0-alpha
English | Deutsch | 中文 | 繁體中文 | Español | 日本語 | 한국어 | Čeština | Русский
퍼미션 시스템은 모든 AI가 시작한 작업이 적절하게 검증되고 감사되도록 보장합니다.
┌─────────────────────────────────────────────┐
│ 퍼미션 검증 │
├─────────────────────────────────────────────┤
│ 레벨 1: UserFrequencyCache │
│ ↓ 고빈도 사용자 결정 캐시 (HighDeny/HighAllow)│
│ 레벨 2: IPermissionCallback │
│ ↓ 맞춤형 로직 (Allowed/Denied/AskUser) │
│ 레벨 3: IsCurator? │
│ ↓ 예 → IPermissionAskHandler (사용자에게 문의)│
│ ↓ 아니오 → GlobalACL → 기본 거부 │
│ 결과: 허용 또는 거부 │
└─────────────────────────────────────────────┘
참고:
PermissionManager.CheckPermission()의 실제 쿼리 우선순위는 다음과 같습니다:
- UserFrequencyCache — 고빈도 사용자 결정 캐시를 먼저 확인
- IPermissionCallback — 맞춤형 콜백 규칙 평가
- 큐레이터 분기 — 콜백이 AskUser를 반환하거나 콜백이 없는 경우:
- 큐레이터 →
IPermissionAskHandler(IM을 통해 사용자에게 문의)- 비큐레이터 →
GlobalACL→ 기본 거부
각 비잉의 고빈도 사용자 결정 캐시(HighDeny/HighAllow)로, 메모리에만 존재합니다.
var cache = new UserFrequencyCache();
PermissionResult? cachedResult = cache.Query(permissionType, resource);
if (cachedResult.HasValue)
{
return cachedResult.Value == PermissionResult.Allowed;
}- HighDeny가 HighAllow보다 우선
- 메모리 전용: 캐시는 영속화되지 않으며, 재시작 시 손실
- 구성 가능한 만료 시간: 사용자가 캐시 항목의 유효 기간을 설정 가능
동적 퍼미션 로직을 위한 맞춤형 콜백입니다.
DefaultPermissionCallback은 다음을 포함한 포괄적인 기본 퍼미션 규칙을 제공합니다:
- 루프백 주소: localhost, 127.0.0.1, ::1 허용
- 사설 IP 주소:
- 192.168.x.x (Class C) - 허용
- 10.x.x.x (Class A) - 허용
- 172.16-31.x.x (Class B) - 사용자에게 문의
- 도메인 화이트리스트:
- 검색엔진: Google, Bing, DuckDuckGo, Yandex, Sogou 등
- AI 서비스: OpenAI, Anthropic, HuggingFace, Ollama 등
- 개발자 서비스: GitHub, StackOverflow, npm, NuGet 등
- 소셜 미디어: 웨이보, 즈후, Reddit, Discord 등
- 비디오 플랫폼: YouTube, Bilibili, 더우인, TikTok 등
- 날씨 정보: wttr.in
- 정부 웹사이트: .gov, .go.jp, .go.kr
- 도메인 블랙리스트:
- AI 사칭 웹사이트: chatgpt, openai, deepseek 등 사칭 도메인
- 악성 AI 도구: wormgpt, darkgpt, fraudgpt 등
- AI 콘텐츠 팜 및 블랙 마켓 관련 도메인
public class DefaultPermissionCallback : IPermissionCallback
{
public PermissionResult Evaluate(Guid callerId, PermissionType permissionType, string resource)
{
if (IsSafeOperation(permissionType, resource))
{
return PermissionResult.Allowed;
}
return PermissionResult.AskUser;
}
}콜백이 AskUser를 반환하거나 콜백이 구성되지 않은 경우, 시스템은 큐레이터 신원에 따라 분기합니다:
실리콘 큐레이터의 경우, 시스템은 인스턴트 메시지를 통해 사용자에게 결정을 요청합니다:
if (IsCurator)
{
if (_askHandler != null)
{
AskPermissionResult userDecision = _askHandler.AskUser(callerId, permissionType, resource);
// 사용자가 Web UI에서 확인 또는 거부
}
}비큐레이터 비잉의 경우, 시스템은 글로벌 ACL을 확인합니다. 일치하는 규칙이 없으면 기본적으로 요청을 거부합니다.
{
"rules": [
{
"permissionType": "NetworkAccess",
"resourcePrefix": "api.github.com",
"result": "Allowed"
},
{
"permissionType": "FileAccess",
"resourcePrefix": "C:\\Windows",
"result": "Denied"
}
]
}규칙은 순서대로 평가되며, 첫 번째로 일치하는 규칙이 적용됩니다. 실리콘 큐레이터만 글로벌 ACL을 수정할 수 있습니다.
{type}:{path}
예시:
- network:api.github.com
- file:C:\\Windows
- cli:rm -rf
큐레이터 작업에 사용자 확인이 필요한 경우, IPermissionAskHandler를 통해 사용자에게 퍼미션을 문의합니다.
IMPermissionAskHandler는 Web UI를 통해 사용자에게 퍼미션 요청을 전송합니다:
public class IMPermissionAskHandler : IPermissionAskHandler
{
public AskPermissionResult AskUser(Guid callerId, PermissionType permissionType, string resource)
{
// 인스턴트 메시지로 사용자에게 메시지 전송
SendMessageAsync($"Allow {resource}?");
// 사용자 응답 대기
var response = WaitForResponseAsync();
return response.Approved
? AskPermissionResult.Approved()
: AskPermissionResult.Denied();
}
}PermissionRequestQueue는 대기 중인 퍼미션 요청을 관리하며, 사용자 응답을 비동기적으로 대기합니다:
- 요청 인큐 — 퍼미션 체인이 레벨 5에 도달하면
TaskCompletionSource<AskPermissionResult>를 생성하여 인큐 - Web UI 표시 —
PermissionRequestController를 통해 Web UI에 대기 중인 퍼미션 요청 표시 - 사용자 응답 — 사용자가 Web UI에서 승인 또는 거부, 선택적으로 결정 캐시 및 캐시 지속 시간 설정 가능
- 캐시 옵션 — 사용자는 퍼미션 결정을 1시간, 24시간, 7일 또는 30일 동안 캐시 가능
- 타임아웃 메커니즘 — 60초 무응답 시 자동으로 요청 페이지 닫힘
모든 퍼미션 결정이 기록됩니다:
{
"timestamp": "2026-04-20T10:30:00Z",
"callerId": "being-uuid",
"permissionType": "FileAccess",
"resource": "C:\\data\\config.json",
"result": "Allowed",
"reason": "Global ACL"
}PermissionManager.EvaluatePermission() 메서드는 사용자 프롬프트를 트리거하지 않는 읽기 전용 퍼미션 사전 평가를 제공합니다. PermissionTool은 이 메서드를 사용하여 AI가 작업 시도 전 퍼미션 상태를 확인합니다.
public PermissionResult EvaluatePermission(
Guid callerId,
PermissionType permissionType,
string resource)반환값: 3상태 PermissionResult:
Allowed- 작업 허용Denied- 작업 거부AskUser- 실행 시 사용자 확인 필요
평가 순서:
- 빈도 캐시 - 캐시된 사용자 결정 확인
- IPermissionCallback - 맞춤형 콜백 평가
- 큐레이터 상태 - 큐레이터인 경우
AskUser반환 (확인 필요) - 글로벌 ACL - 접근 제어 규칙 확인
- 기본값 - 일치하는 규칙 없을 시 거부
참고: 전체 퍼미션 체인과 달리,
EvaluatePermission은IPermissionAskHandler를 호출하지 않습니다. 실행 시 결과가 무엇일지만 보고합니다.
Web UI를 통해:
- 퍼미션 관리로 이동
- 규칙 추가 클릭
- 설정:
- 사용자
- 리소스
- 허용/거부
- 지속 시간
API를 통해:
curl -X POST http://localhost:8080/api/permissions/save \
-H "Content-Type: application/json" \
-d '{
"permissionType": "FileAccess",
"resourcePrefix": "C:\\Projects",
"result": "Allowed",
"description": "Allow project directory access"
}'Web UI의 퍼미션 관리 페이지에서 조작합니다.
curl http://localhost:8080/api/permissions/list작업 레벨의 퍼미션 검증 체인 외에도, 시스템은 실리콘 비잉이 사용할 수 있는 툴을 제어하기 위한 툴 퍼미션 관리 메커니즘을 제공합니다.
툴 퍼미션은 두 가지 레벨로 나뉩니다:
- 실리콘 비잉 레벨 — 개별 실리콘 비잉이 사용할 수 있는 툴 작업을 제어
- 프로젝트 레벨 — 프로젝트 공간 내에서 사용 가능한 툴 작업을 제어하며, 실리콘 비잉 레벨 퍼미션과 독립적
각 툴의 각 작업은 독립적으로 허용 또는 거부로 구성할 수 있습니다:
{
"beingId": "being-uuid",
"permissions": {
"network:get": "allowed",
"network:post": "denied",
"disk:read": "allowed",
"disk:write": "denied",
"database:query": "allowed"
}
}시스템은 실리콘 비잉에 빠르게 적용할 수 있는 사전 정의된 툴 퍼미션 템플릿을 제공합니다:
- readonly — 읽기 전용 퍼미션 (읽기 작업 허용, 쓰기 작업 거부)
- full — 전체 퍼미션 (모든 작업 허용)
- restricted — 제한된 퍼미션 (기본 작업만 허용)
Web UI를 통해 툴 퍼미션 관리:
- 실리콘 비잉 툴 퍼미션 페이지 —
/beings/tool-permissions - 프로젝트 툴 퍼미션 페이지 —
/project/{id}/tool-permissions
| 엔드포인트 | 메서드 | 설명 |
|---|---|---|
/api/beings/tool-permissions |
GET | 실리콘 비잉 툴 퍼미션 조회 |
/api/beings/tool-permissions |
PUT | 실리콘 비잉 툴 퍼미션 업데이트 |
/api/beings/tool-permissions/templates |
GET | 퍼미션 템플릿 목록 조회 |
/api/beings/tool-permissions/apply-template |
POST | 퍼미션 템플릿 적용 |
/api/projects/{id}/tool-permissions |
GET | 프로젝트 툴 퍼미션 조회 |
/api/projects/{id}/tool-permissions |
PUT | 프로젝트 툴 퍼미션 업데이트 |
필요한 최소 퍼미션만 부여:
{
"permissionType": "FileAccess",
"resourcePrefix": "C:\\Projects\\MyApp\\config.json",
"result": "Allowed"
}절대적으로 필요하지 않은 한 영구 퍼미션을 부여하지 마세요.
정기적으로 감사 로그를 확인하여 다음 사항을 파악:
- 거부된 접근 시도
- 비정상 패턴
- 퍼미션 권한 상승
복잡한 로직의 경우 IPermissionCallback 사용:
public PermissionResult Evaluate(Guid callerId, PermissionType permissionType, string resource)
{
// 시간 기반 퍼미션
if (IsOutsideBusinessHours())
{
return PermissionResult.Denied;
}
// 리소스 기반 퍼미션
if (IsSensitiveResource(resource))
{
return PermissionResult.AskUser;
}
return PermissionResult.Allowed;
}AI: "config.json을 읽어야 합니다"
↓
퍼미션 체인:
1. UserFrequencyCache? 캐시된 결정 없음
2. IPermissionCallback? AskUser 반환 (명시적으로 허용되지 않음)
3. IsCurator? 아니오 → GlobalACL 확인
4. GlobalACL? 규칙 발견: file:... = Allowed
5. 결과: 허용
AI: "코드를 컴파일하고 실행하고 싶습니다"
↓
퍼미션 체인:
1. UserFrequencyCache? 캐시된 결정 없음
2. IPermissionCallback? AskUser 반환
3. IsCurator? 예 → IPermissionAskHandler
4. 사용자 승인
5. 결과: 허용
AI: "C:\Windows에 접근해야 합니다"
↓
퍼미션 체인:
1. UserFrequencyCache? HighDeny 캐시에서 발견
2. 결과: 거부 (추가 확인 없음)
확인:
- 사용자의 IsCurator 상태
- 빈도 캐시의 HighDeny 항목
- GlobalACL 규칙
- 콜백 로직
- 사용자 응답 타임아웃
확인:
expiresAt필드가 올바르게 설정됨- 시간대가 정확함
- 클록 동기화
확인:
- 감사 로거가 등록됨
- 스토리지 백엔드에 접근 가능
- 디스크 공간 충분