Skip to content

시크릿 관리

Triggerfish는 구성 파일에 자격 증명을 절대 저장하지 않습니다. 모든 시크릿 -- API 키, OAuth 토큰, 통합 자격 증명 -- 은 플랫폼 네이티브 보안 저장소에 저장됩니다: 개인 티어의 경우 OS 키체인, 엔터프라이즈 티어의 경우 vault 서비스. Plugin과 에이전트는 SDK를 통해 자격 증명과 상호 작용하며 엄격한 접근 통제가 시행됩니다.

저장소 백엔드

티어백엔드세부 사항
개인OS 키체인macOS Keychain, Linux Secret Service (D-Bus를 통해), Windows Credential Manager
엔터프라이즈Vault 연동HashiCorp Vault, AWS Secrets Manager, Azure Key Vault 또는 기타 엔터프라이즈 vault 서비스

두 경우 모두 시크릿은 저장소 백엔드에 의해 저장 시 암호화됩니다. Triggerfish는 시크릿에 대한 자체 암호화를 구현하지 않으며 -- 목적에 맞게 구축되고 감사된 시크릿 저장 시스템에 위임합니다.

네이티브 키체인이 없는 플랫폼(Credential Manager가 없는 Windows, Docker 컨테이너)에서는 ~/.triggerfish/secrets.json의 암호화된 JSON 파일로 폴백합니다. 항목은 ~/.triggerfish/secrets.key(권한: 0600)에 저장된 머신 바인딩된 256비트 키를 사용하는 AES-256-GCM으로 암호화됩니다. 각 항목은 모든 쓰기 시 새로운 무작위 12바이트 IV를 사용합니다. 레거시 평문 시크릿 파일은 첫 로드 시 자동으로 암호화된 형식으로 마이그레이션됩니다.

개인 티어는 시크릿에 대해 제로 구성을 요구합니다. 설정 중(triggerfish dive) 통합을 연결하면 자격 증명이 자동으로 OS 키체인에 저장됩니다. 운영 체제가 이미 제공하는 것 이상으로 설치하거나 구성할 필요가 없습니다. :::

구성에서의 시크릿 참조

Triggerfish는 triggerfish.yaml에서 secret: 참조를 지원합니다. 자격 증명을 평문으로 저장하는 대신 이름으로 참조하면 시작 시 OS 키체인에서 확인됩니다.

yaml
models:
  providers:
    anthropic:
      apiKey: "secret:provider:anthropic:apiKey"
    openai:
      apiKey: "secret:provider:openai:apiKey"

channels:
  telegram:
    botToken: "secret:channel:telegram:botToken"

리졸버는 구성 파일의 깊이 우선 탐색을 수행합니다. secret:으로 시작하는 모든 문자열 값은 해당 키체인 항목으로 대체됩니다. 참조된 시크릿을 찾을 수 없으면 명확한 오류 메시지와 함께 시작이 즉시 실패합니다.

기존 시크릿 마이그레이션

이전 버전의 구성 파일에 평문 자격 증명이 있는 경우 마이그레이션 명령이 자동으로 키체인으로 이동합니다:

bash
triggerfish config migrate-secrets

이 명령은:

  1. triggerfish.yaml에서 평문 자격 증명 값을 스캔합니다
  2. 각각을 OS 키체인에 저장합니다
  3. 평문 값을 secret: 참조로 교체합니다
  4. 원본 파일의 백업을 생성합니다

마이그레이션 후 백업 파일을 삭제하기 전에 에이전트가 올바르게 시작되는지 확인하십시오. 마이그레이션은 백업 없이는 되돌릴 수 없습니다. :::

위임된 자격 증명 아키텍처

Triggerfish의 핵심 보안 원칙은 데이터 쿼리가 시스템 자격 증명이 아닌 사용자의 자격 증명으로 실행된다는 것입니다. 이는 에이전트가 소스 시스템의 권한 모델을 상속하도록 보장합니다 -- 사용자는 직접 접근할 수 있는 데이터에만 접근할 수 있습니다.

위임된 자격 증명 아키텍처: 사용자가 OAuth 동의를 부여하고, 에이전트가 사용자의 토큰으로 쿼리하며, 소스 시스템이 권한을 시행합니다

이 아키텍처는 다음을 의미합니다:

  • 과도한 권한 부여 없음 -- 에이전트가 사용자가 직접 접근할 수 없는 데이터에 접근할 수 없습니다
  • 시스템 서비스 계정 없음 -- 손상될 수 있는 전능한 자격 증명이 없습니다
  • 소스 시스템 시행 -- 소스 시스템(Salesforce, Jira, GitHub 등)이 모든 쿼리에서 자체 권한을 시행합니다

보안 기존 AI 에이전트 플랫폼은 종종 모든 사용자를 대신하여 통합에 접근하기 위해 단일 시스템 서비스 계정을 사용합니다. 이는 에이전트가 통합의 모든 데이터에 접근할 수 있고 각 사용자에게 무엇을 보여줄지 LLM이 결정하는 것에 의존합니다. Triggerfish는 이 위험을 완전히 제거합니다: 쿼리는 사용자 자신의 위임된 OAuth 토큰으로 실행됩니다. :::

Plugin SDK 시행

Plugin은 Triggerfish SDK를 통해서만 자격 증명과 상호 작용합니다. SDK는 권한 인식 메서드를 제공하고 시스템 수준 자격 증명에 접근하려는 모든 시도를 차단합니다.

허용: 사용자 자격 증명 접근

python
def get_user_opportunities(sdk, params):
    # SDK가 보안 저장소에서 사용자의 위임된 토큰을 검색합니다
    # 사용자가 Salesforce를 연결하지 않은 경우 유용한 오류를 반환합니다
    user_token = sdk.get_user_credential("salesforce")

    # 쿼리가 사용자의 권한으로 실행됩니다
    # 소스 시스템이 접근 제어를 시행합니다
    return sdk.query_as_user(
        integration="salesforce",
        query="SELECT Id, Name, Amount FROM Opportunity",
        user_id=sdk.current_user_id
    )

차단: 시스템 자격 증명 접근

python
def get_all_opportunities(sdk, params):
    # PermissionError 발생 -- SDK에 의해 차단됨
    token = sdk.get_system_credential("SALESFORCE_TOKEN")
    return query_salesforce(token, "SELECT * FROM Opportunity")

sdk.get_system_credential()은 항상 차단됩니다. 이를 활성화하는 구성, 관리자 재정의, escape hatch가 없습니다. 이것은 no write-down 규칙과 같은 고정 보안 규칙입니다. :::

LLM 호출 가능 시크릿 도구

에이전트는 세 가지 도구를 통해 시크릿을 관리할 수 있습니다. 중요한 점은 LLM이 실제 시크릿 값을 절대 보지 못한다는 것입니다 -- 입력과 저장은 대역 외에서 발생합니다.

secret_save

시크릿 값을 안전하게 입력하도록 프롬프트합니다:

  • CLI: 터미널이 숨김 입력 모드로 전환됩니다(문자가 에코되지 않음)
  • Tidepool: 웹 인터페이스에 보안 입력 팝업이 나타납니다

LLM은 시크릿 저장을 요청하지만 실제 값은 사용자가 보안 프롬프트를 통해 입력합니다. 값은 키체인에 직접 저장되며 -- LLM 컨텍스트를 통과하지 않습니다.

secret_list

저장된 모든 시크릿의 이름을 나열합니다. 값은 절대 노출하지 않습니다.

secret_delete

이름으로 키체인에서 시크릿을 삭제합니다.

도구 인수 대체

에이전트가 시크릿이 필요한 도구를 사용할 때(예: MCP 서버 환경 변수에 API 키 설정) 도구 인수에서 {{secret:name}} 구문을 사용합니다:

tool_call: set_env_var
arguments: { "key": "API_TOKEN", "value": "{{secret:my-api-token}}" }

런타임은 도구가 실행되기 전에 LLM 계층 아래에서 {{secret:name}} 참조를 확인합니다. 확인된 값은 대화 기록이나 로그에 절대 나타나지 않습니다.

보안 {{secret:name}} 대체는 LLM이 아닌 코드에 의해 시행됩니다. LLM이 확인된 값을 로깅하거나 반환하려 해도 정책 계층이 PRE_OUTPUT hook에서 시도를 포착합니다. :::

SDK 권한 메서드

메서드동작
sdk.get_user_credential(integration)지정된 통합에 대한 사용자의 위임된 OAuth 토큰을 반환합니다. 사용자가 통합을 연결하지 않은 경우 지시 사항과 함께 오류를 반환합니다.
sdk.query_as_user(integration, query)사용자의 위임된 자격 증명을 사용하여 통합에 대한 쿼리를 실행합니다. 소스 시스템이 자체 권한을 시행합니다.
sdk.get_system_credential(name)항상 차단됩니다. PermissionError를 발생시킵니다. 보안 이벤트로 로깅됩니다.
sdk.has_user_connection(integration)사용자가 지정된 통합을 연결했으면 true, 아니면 false를 반환합니다. 자격 증명 데이터를 노출하지 않습니다.

권한 인식 데이터 접근

위임된 자격 증명 아키텍처는 분류 시스템과 함께 작동합니다. 사용자가 소스 시스템에서 데이터에 접근할 권한이 있더라도 Triggerfish의 분류 규칙이 해당 데이터가 검색된 후 흐를 수 있는 곳을 관리합니다.

시크릿 확인 흐름: 구성 파일 참조가 LLM 계층 아래에서 OS 키체인으로부터 확인됩니다

예시:

사용자: "Acme 거래를 요약하고 아내에게 보내줘"

단계 1: 권한 확인
  --> 사용자의 Salesforce 토큰 사용
  --> Salesforce가 Acme 기회를 반환 (사용자에게 접근 권한 있음)

단계 2: 분류
  --> Salesforce 데이터가 CONFIDENTIAL로 분류됨
  --> 세션 taint가 CONFIDENTIAL로 상승

단계 3: 출력 확인
  --> 아내 = EXTERNAL 수신자
  --> CONFIDENTIAL --> EXTERNAL: 차단

결과: 데이터 검색됨 (사용자에게 권한 있음), 그러나 전송 불가
      (분류 규칙이 유출을 방지)

사용자는 Salesforce에서 Acme 거래에 합법적으로 접근할 수 있습니다. Triggerfish는 이를 존중하고 데이터를 검색합니다. 그러나 분류 시스템은 해당 데이터가 외부 수신자에게 흐르는 것을 방지합니다. 데이터에 대한 접근 권한은 공유 권한과 별개입니다.

시크릿 접근 로깅

모든 자격 증명 접근은 SECRET_ACCESS 시행 hook을 통해 로깅됩니다:

json
{
  "timestamp": "2025-01-29T10:23:45Z",
  "hook_type": "SECRET_ACCESS",
  "session_id": "sess_456",
  "decision": "ALLOW",
  "details": {
    "method": "get_user_credential",
    "integration": "salesforce",
    "user_id": "user_456",
    "credential_type": "oauth_delegated"
  }
}

차단된 시도도 로깅됩니다:

json
{
  "timestamp": "2025-01-29T10:23:46Z",
  "hook_type": "SECRET_ACCESS",
  "session_id": "sess_456",
  "decision": "BLOCK",
  "details": {
    "method": "get_system_credential",
    "requested_name": "SALESFORCE_TOKEN",
    "reason": "System credential access is prohibited",
    "plugin_id": "plugin_789"
  }
}

차단된 자격 증명 접근 시도는 상승된 알림 수준으로 로깅됩니다. 엔터프라이즈 배포에서는 이러한 이벤트가 보안 팀에 알림을 트리거할 수 있습니다. :::

엔터프라이즈 Vault 연동

엔터프라이즈 배포는 자격 증명 관리를 위해 Triggerfish를 중앙 집중식 vault 서비스에 연결할 수 있습니다:

Vault 서비스연동
HashiCorp Vault네이티브 API 연동
AWS Secrets ManagerAWS SDK 연동
Azure Key VaultAzure SDK 연동
커스텀 vault플러그형 SecretProvider 인터페이스

엔터프라이즈 vault 연동은 다음을 제공합니다:

  • 중앙 집중식 순환 -- 자격 증명이 vault에서 순환되고 Triggerfish가 자동으로 반영합니다
  • 접근 정책 -- vault 수준 정책이 어떤 에이전트와 사용자가 어떤 자격 증명에 접근할 수 있는지 제어합니다
  • 감사 통합 -- Triggerfish와 vault의 자격 증명 접근 로그를 상관시킬 수 있습니다

구성 파일에 절대 저장되지 않는 것

다음은 triggerfish.yaml 또는 다른 구성 파일에 평문 값으로 절대 나타나지 않습니다. OS 키체인에 저장되고 secret: 구문으로 참조되거나 secret_save 도구를 통해 관리됩니다:

  • LLM 제공자의 API 키
  • 통합의 OAuth 토큰
  • 데이터베이스 자격 증명
  • Webhook 시크릿
  • 암호화 키
  • 페어링 코드 (임시, 메모리 내에서만)

Triggerfish 구성 파일에서 평문 자격 증명(secret: 참조가 아닌 값)을 발견하면 문제가 발생한 것입니다. triggerfish config migrate-secrets를 실행하여 키체인으로 이동하십시오. 평문으로 발견된 자격 증명은 즉시 순환해야 합니다. :::

관련 페이지