Skip to content

AI Guard 정책

판옵티콘이 본 것을 정책으로 막는 것이 AI Guard입니다. 베타에서 4종 정책을 설계 중입니다.

🔬 일부 정책은 설계 단계입니다

이 페이지가 다루는 4종 정책 중 HITL 승인 endpointSoft Kill Switch CLI 는 현재 코드베이스에 구현되지 않았습니다 (2026-05-15 audit). start.1pass.dev/developer 콘솔에서 정책을 정의하더라도 logi 서버는 다음을 아직 제공하지 않습니다:

  • POST /panopticon/approval/request — 미구현 (404)
  • GET /panopticon/approval/<request_uuid> — 미구현 (404)
  • logi panopticon kill <client_id> CLI — 미구현
  • OauthApplication#killed_at 등 kill switch 상태 컬럼 — 미구현

현재 동작 가능한 정책: Scope Drift log_only (기본), Rate Limit (rack-attack 단의 /oauth/token·/oauth/userinfo throttle). 그 외는 콘솔 UI 에서 정의는 되지만 enforcement 미연동입니다. 진행 상황은 GitHub issues 에서 추적합니다.

정책 한눈에

정책즉시성RP 측 부담상태
Rate Limit (rack-attack /oauth/*)즉시 (서버)없음✓ 구현 완료
Rate Limit (per-application × tool)즉시 (서버)webhook 수신🔬 설계 중
Soft Kill Switch≤ 15분없음🔬 설계 중
HITL 승인사용자 응답 시endpoint 추가 호출🔬 설계 중
Scope Drift Policy log_only즉시없음✓ 구현 완료
Scope Drift Policy alert / block즉시 (/oauth/authorize)없음🔬 설계 중

베타에서는 정책 설정·집행은 가능하지만 quota 강제와 과금은 비활성입니다 (구현된 정책 한정).


1. Rate Limit

LLM 환각으로 인한 도구 호출 폭주 방어.

두 종류의 Rate Limit이 존재하며 적용 지점이 다릅니다.

A. logi endpoint throttle (rack-attack 기존)

/oauth/token, /oauth/userinfo 등 logi가 직접 호스팅하는 endpoint에 대한 보호. application/IP 단위.

B. AI Guard tool throttle (Panopticon 신규)

RP가 trace를 보고하는 application에 대해 Panopticon이 logi 측에서 카운팅하는 (application × user, application × tool) 한도. 한도 초과 시 logi는 webhook(panopticon.anomaly_detected)을 발사하고, RP는 자기 정책에 따라 차단/경고를 결정합니다. logi가 도구 호출 자체를 막지는 않습니다 — RP는 webhook을 받아 자기 측에서 차단해야 합니다.

기본값 (per application × user):

  • 분당 60회
  • 동일 도구 분당 20회

override (콘솔 또는 CLI):

bash
logi panopticon policy <client_id> --rate-limit '{"per_minute":120,"per_tool_per_minute":40}'

2. Soft Kill Switch 🔬 (설계 단계)

미구현 — 설계 사양

아래 발동 절차 (CLI · 콘솔 1-click) 는 logi 서버에 아직 라우트가 없습니다. OauthApplication#killed_at 컬럼, logi panopticon kill CLI 명령, 콘솔 Kill Switch 탭 모두 backlog 입니다.

현재 가능한 차단 수단:

  • Refresh token 회전+재사용 탐지: 이미 구현됨 (Oauth::TokensController#rotate_refresh_token + OauthAccessToken#revoke_chain!). 재사용 감지 시 chain 전체가 자동 revoke 되므로, 도난 시나리오에서는 사실상 즉시 차단 효과.
  • 수동 DB revoke: OauthAccessToken.where(oauth_application_id: APP_ID).find_each(&:revoke!) 콘솔 실행. RT 가 revoke 되면 다음 회전 시도에서 거부.

특정 application 또는 (application × user) 단위 즉시 차단.

발동 (계획)

콘솔 → application → Kill Switch 탭 → 사용자 매트릭스에서 1-click

또는 CLI:

bash
logi panopticon kill <client_id>                    # application 전체
logi panopticon kill <client_id> --user user_xyz    # 특정 user만
logi agent revoke <client_id>                       # ALIAS for kill

동작 (계획)

  1. 해당 OauthAccessToken의 모든 refresh token revoke
  2. 기존 access token은 최대 15분 후 자연 만료 (TTL 15분)
  3. panopticon.kill_switch webhook 발사

즉시 차단을 원하면

RP가 매 호출마다 /oauth/introspect 호출 (latency 본인 부담, opt-in). 기본 RP는 15분 지연 수용.


3. HITL 승인 (민감 도구 opt-in) 🔬 (설계 단계)

미구현 — 라우트 없음

아래 POST /panopticon/approval/requestGET /panopticon/approval/<request_uuid>server/config/routes.rb 에 존재하지 않습니다 (2026-05-15 audit). 샘플 코드를 그대로 호출하면 404 가 떨어집니다.

PATCH /api/v1/me/panopticon/approvals/:id (사용자 세션 인증) 만 부분적으로 존재 — RP-facing PAK 인증 API 가 아니므로 RP 통합용으로 사용할 수 없습니다.

특정 도구는 사용자의 logi 앱 푸시 승인이 있어야만 실행.

설정

bash
logi panopticon policy <client_id> --hitl payment.charge,memory.delete,calendar.delete

또는 콘솔 → Policies → HITL 도구 목록에 도구 이름 추가.

RP 측 흐름

python
# 도구 실행 직전
async def call_payment_tool(amount, user_sub):
    # 1. logi에 승인 요청
    resp = await httpx.post(
        f"{LOGI_URL}/panopticon/approval/request",
        headers={"Authorization": f"Bearer {PANOPTICON_PAK}"},
        json={
            "tool_name": "payment.charge",
            "tool_args_summary": {"amount": amount, "currency": "KRW"},
            "user_sub": user_sub,
        }
    )
    request_uuid = resp.json()["request_uuid"]

    # 2. 사용자 응답 대기 (polling 또는 webhook)
    while True:
        status = await poll_approval(request_uuid)
        if status == "approved":
            return await execute_payment(amount)
        elif status in ("denied", "expired"):
            raise PermissionError(status)
        await asyncio.sleep(2)

poll endpoint:

http
GET /panopticon/approval/<request_uuid>
Authorization: Bearer pano_pak_...

응답: {"status":"pending|approved|denied|expired","approved_at":"..."}

TTL: 5분. 만료 후엔 expired 반환.

사용자 경험

  1. RP 도구 호출 시 사용자 logi 앱에 푸시 알림 도착
  2. "MyAgent가 결제 도구 실행 요청 — 승인하시겠습니까?"
  3. 사용자가 logi 앱(또는 Universal Link로 /auth/approve/<uuid>)에서 승인/거부
  4. 결과가 polling 또는 webhook으로 RP에 전달

4. Scope Drift Policy

LLM이 등록되지 않은 scope를 요청하는 경우의 처리.

3단계 정책

정책동작추천
log_only (기본)기존 동작: drift 기록 + scope.drift_detected webhook + 등록된 scope subset으로 진행일반 application
alertlog_only + 콘솔에 inline 알림 카드 노출활발히 모니터링 중인 application
block/oauth/authorize에서 미등록 scope 발견 시 400 invalid_scope 반환 (인가 자체 거부, RFC 6749 §4.1.2.1)보안 민감 application

변경

bash
logi panopticon policy <client_id> --drift block

또는 콘솔 → Policies → Scope Drift Policy 라디오.

Scope Drift는 모두 기록됨

정책에 관계없이 ScopeDriftRecord는 모든 drift 이벤트를 적재합니다. 첫 발생 시 scope.drift_detected webhook, escalation 후 scope.drift_unresolved webhook이 발사됩니다 (Webhook 가이드).


사용량과 정책의 관계

베타 동안 정책은 모두 enforcement만 하고 quota를 차단하지 않습니다. 즉:

  • Rate Limit: 분당 한도 초과 시 throttle (적용됨)
  • Soft Kill: 사용자가 실행 시에만 (자동 트리거 없음)
  • HITL: 사용자 승인이 필수 (적용됨)
  • Scope Drift block: invalid scope 시 거부 (적용됨)

정식 출시 후 추가될 quota 정책 (월 trace 한도, tier별 차등)은 별도 spec에서 다룹니다.

다음

MIT License · Identity가 제품의 신뢰를 만듭니다.