본문으로 건너뛰기

기계 번역입니다. 정식 기준은 영어판이며, 원어민 검수는 아직 완료되지 않았습니다.

least-privilege

허용된 것과 관찰된 것: 일류 발견으로서의 드리프트

작성자 Olivares AI 8 분 소요

동반 게시물은 AI 에이전트가 수행하도록 허용된 작업과 수행이 관찰되는 작업 사이에 gap와 같은 최소 권한 드리프트를 도입했습니다. 해당 게시물에서는 gap가 형성되는 이유, 읽기 우선 관찰이 허용 대 관찰 차이를 생성하는 방법, 코드형 정책이 액세스 시 이를 닫는 방법 등의 개념을 다루었습니다. 이 게시물은 드리프트가 보안 모듈 내부에서 구조화되고, 분류되고, 분류 가능한 결과가 되는 방법과 드리프트가 존재하면 어떻게 되는지 한 단계 더 깊이 설명합니다.

짧은 버전: 드리프트는 대시보드 측정항목이나 로그 라인이 아닙니다. 분류, 심각도, 신뢰 수준 및 분류 수명 주기를 갖춘 지속형 엔터티입니다. 변칙 대기열을 제공하고, 포렌식 타임라인을 강화하며, 증명할 수 있는 것과 증명할 수 없는 것에 대해 정직합니다.

세 가지 신호 소스

액세스 맵의 모든 에지는 원본(에이전트, ID, 세션)과 리소스 간의 액세스 관계를 기록합니다. 각 모서리에는 허용관찰이라는 두 개의 부울 플래그가 있습니다. 흥미로운 가장자리는 해당 플래그가 일치하지 않는 가장자리입니다.

그러나 깃발은 허공에서 나타나지 않습니다. 이는 각기 다른 신뢰 프로필을 가진 고유한 신호 소스에서 나옵니다.

정책(허용됨). signal_source=policy 또는 signal_source=scoped_grant가 있는 에지는 선언된 권한 부여를 나타냅니다. 자격 증명, IAM 역할 또는 플랫폼 자체 소스 범위 플레인은 이 에이전트가 수행할 수 있음을 나타냅니다. 이러한 가장자리는 원격 측정으로 확증될 때까지 permitted=true, observed=false입니다. 그들은 천장입니다. ID 커넥터(WIF 발급자, API 키 목록, 작업 영역 역할)가 이 측면에 피드를 제공합니다. 작업 영역에서 규칙의 OAuth 범위를 허용하는 페더레이션 서비스 계정은 그러한 에지 중 하나입니다.

원격 측정(관찰). OpenTelemetry 추적, pgAudit 로그, CloudTrail 레코드, MCP 주석, A2A 프로토콜 관찰 및 GitHub/GitLab 웹후크의 협력 신호. 이는 observed=true 가장자리를 생성합니다. 신뢰도는 소스에 따라 다릅니다. pgAudit READ 분류는 attributed입니다(데이터베이스는 누가 쿼리했는지, 읽기인지 쓰기인지 알고 있음). MCP readOnlyHint는 사양에 따라 approximate입니다. MCP 사양 자체에서는 도구 주석을 신뢰할 수 없다고 말합니다.

커널(지상 진실). eBPF 백스톱(signal_source=ebpf)은 syscall 수준에서 관찰합니다. 에이전트가 라우팅할 수 없는 신호입니다. eBPF 레이어가 협력적 원격 측정이 보고하지 않은 connect() 또는 write()를 발견하면 이는 로깅 gap가 아니며 회피 방지 신호입니다. 보안 모듈은 커널 측 관찰과 협력 측 관찰을 상관 이상 현상으로 결합하므로 자체 원격 측정을 침묵시키는 에이전트는 사각지대가 아닌 발견물이 됩니다.

액세스 맵은 별도의 스키마가 아닌 이러한 에지에 대한 쿼리입니다. 최소 권한 드리프트는 두 플래그가 일치하지 않는 하위 집합입니다.

드리프트가 발견이 되는 방법

PermittedObserved 사이의 불일치가 원시 신호입니다. 엔진은 이상 대기열에 들어가기 전에 이를 두 가지 드리프트 종류 중 하나로 분류합니다.

// DriftKind는 허용된 권한과 관찰된 권한 간의 최소 권한 드리프트를 분류합니다.
type DriftKind string

const (
    // DriftUnusedGrant는 관찰되지 않은 허용된 액세스입니다(과잉 프로비저닝).
    DriftUnusedGrant DriftKind = "unused_grant"
    // DriftViolation은 허용되지 않는 관찰된 액세스입니다.
    DriftViolation DriftKind = "violation"
)

unused_grant는 에이전트가 한 번도 본 적이 없는 작업을 수행할 수 있다는 정책을 의미합니다. 이것은 죽은 특권입니다. 아무런 이익도 없이 위험을 감수하는 것입니다. 정기적인 액세스 검토를 위한 정리 신호입니다. 실행되지 않은 항목을 취소합니다.

violation는 에이전트가 정책이나 허가가 허용되지 않는 작업을 수행하는 것이 관찰되었음을 의미합니다. 이것이 활성 결과입니다. “검토되지 않은 쓰기”라고 표시된 것은 diff 테이블의 행입니다. 즉, 중요한 가장자리, 이상 대기열이 우선순위를 두는 가장자리입니다.

분류는 ‘괜찮음’과 ‘문제’ 사이의 이분법이 아닙니다. PrivilegeDrift 구조체는 문제가 되는 가장자리를 해당 종류와 쌍으로 연결합니다.

// PrivilegeDrift는 최소 권한 불일치이며, Permitted 플래그와
// Observed 플래그가 일치하지 않는 에지다.
type PrivilegeDrift struct {
    Edge AccessEdge
    Kind DriftKind
}

에지 자체는 원본(에이전트), 리소스, read/write 모드, 이를 생성한 신호 소스, 속성에 대한 신뢰도, 관찰 창(FirstSeen, LastSeen, OccurrenceCount) 등 전체 출처를 전달합니다. 표류 발견은 결코 “어딘가에서 뭔가 잘못되었습니다”가 아닙니다. 특정 수집기가 관찰한 특정 에이전트, 특정 리소스, 특정 액세스 모드를 시간 범위와 함께 가리킵니다.

변칙 대기열: 단지 “다르다”는 것이 아니라 분류되어 있습니다.

보안 모듈은 이상 보기(GET /v1/m/security/anomalies 엔드포인트)를 구축할 때 액세스 에지 저장소에서 드리프트를 가져와 각 violation를 우선 순위가 지정된 이상 항목으로 분류합니다. 분류는 원시 가장자리가 전달하지 않는 컨텍스트를 추가합니다.

액세스 드리프트. 기준: 관찰되었지만 허용되지 않은 액세스입니다. 예외 항목의 제목은 “예기치 않은 액세스: 관찰되었지만 허용되지 않음” 심각도 중간이며 confidence=approximate로 플래그가 지정되었습니다. 저장소 수준 드리프트가 원시 신호(아직 전체 에이전트-ID 그래프에 대해 조정되지 않음)이기 때문입니다. 조정된 보기는 액세스 맵의 자체 /drift 엔드포인트에 있습니다. 이상 큐는 원시 신호를 소비하고 정직하게 레이블을 지정합니다.

Egress/exfiltration가 의심됩니다. 드리프트 에지의 리소스가 외부의 비공개 대상에 대한 네트워크 엔드포인트인 경우(eBPF 커넥터는 이를 tcp://host:port URI로 내보냄) 이상 현상이 egress_exfil_suspected로 재분류되고 심각도 높음으로 승격됩니다. 액세스 권한이 부여되지 않은 외부 엔드포인트에 쓰는 에이전트는 범위가 지정되지 않은 데이터베이스 테이블을 읽는 에이전트와 검색 결과의 형태가 다릅니다.

민감도 에스컬레이션. 리소스에 민감도 레이블(high 또는 secret)이 있으면 액세스가 송신인지 여부에 관계없이 심각도가 승격됩니다. 고감도 리소스에 대한 violation는 대상이 내부인 경우에도 더 빠른 분류를 보장합니다.

각 이상 현상에는 원시 세부정보가 포함된 evidence 지도가 포함되어 있습니다.

ev := map[string]any{
    "origin_kind":      edge.OriginKind,
    "origin_id":        edge.OriginID.String(),
    "resource_id":      edge.ResourceID.String(),
    "mode":             string(edge.Mode),
    "signal_source":    string(edge.SignalSource),
    "occurrence_count": edge.OccurrenceCount,
    "reconciled":       false,
}

reconciled: false는 의도적인 것입니다. 이는 소비자에게 이것이 액세스 맵의 조정된 에이전트-신원 보기가 아니라 원시 매장 수준 신호임을 ​​알려줍니다. 이상 대기열은 조정이 violation로 나타날 때까지 기다리지 않습니다. 그러나 그렇지 않은 경우 귀속이 확고한 척하지 않습니다.

신뢰 수준: 입증할 수 있는 것

액세스 맵의 모든 에지는 신뢰 수준을 전달합니다. 이 제품은 두 가지를 사용합니다.

  • 속성(confidence=attributed): 수집가 자신의 증거에 의해 액세스가 출처와 단단히 연결되어 있습니다. 에이전트의 데이터베이스 역할을 명명하는 pgAudit 레코드, 에이전트의 IAM 자격 증명에 연결된 CloudTrail 이벤트, 런타임이 에이전트로 확인된 프로세스 ID에 연결된 eBPF 관찰. 어트리뷰션 체인은 엔드투엔드(end-to-end)입니다.

  • 대략(confidence=approximate): 속성이 추론되며 손실이 있을 수 있습니다. 신호는 여러 에이전트가 동일한 자격 증명을 사용하는 공유 서비스 계정, 손실이 있는 저장소(연결당 ID를 기록하지 않는 Redis 인스턴스) 또는 사양에 신뢰할 수 없다고 표시된 MCP 주석에서 나왔습니다. 가장자리는 여전히 신호이지만 운영자는 증명이 약하다는 것을 알고 있습니다.

신뢰 수준은 변칙의 우선순위 점수에 영향을 미칩니다. 우선순위 함수(priorityFor)는 각 이상 징후를 0에서 100까지 점수를 매기고 approximate 신뢰도 드리프트는 할인됩니다.

if confidence == string(sdkmodel.ConfidenceApproximate) {
    // 할인: 조정되지 않은 드리프트는 시끄럽습니다.
}

이렇게 하면 시끄러운 공유 ID 신호가 attributed violation를 옆으로 밀어내는 것을 방지할 수 있습니다. 둘 다 대기열에 나타납니다. approximate는 순위가 더 낮습니다. 포렌식 강화가 적용되는 것과 동일한 원칙입니다. 공유 ID(SharedIdentity: true, AgentCount > 1)가 발견되면 타임라인은 속성이 정확한 척하는 대신 “에이전트별 속성이 모호할 수 있음”을 기록합니다.

제품은 결코 확실성을 위조하지 않습니다. MCP 주석 전용 모서리는 eBPF 확증 모서리와 동일한 가중치를 전달하지 않습니다. 공유 서비스 계정의 드리프트 결과는 에이전트별 ID의 드리프트 결과와 동일한 가중치를 갖지 않습니다. 운영자는 차이점을 확인하고 그에 따라 분류합니다.

포렌식 타임라인의 드리프트

드리프트 발견 항목은 변칙 대기열에만 존재하지 않습니다. 법의학 사례가 열리고 해당 타임라인이 해시 체인 감사 원장에서 재구성되면 보안 모듈은 주체의 드리프트를 통해 재구성을 강화합니다.

out.Drift = subjectDrift(r.Context(), sc, c.SubjectRef)

subjectDrift 함수는 주체가 원본인 violation 종류 드리프트에 대한 액세스 에지 저장소를 쿼리하고 driftRefDTO 항목 목록을 반환합니다. 각 항목에는 원본, 리소스, 액세스 모드, 신호 소스, 발생 횟수 및 마지막으로 확인된 타임스탬프가 포함되어 있습니다. 이는 보안 모듈에 의해 재계산되지 않고 저장소 자체의 드리프트 계산에서 읽혀집니다.

타임라인에는 피험자의 신원 속성과 데이터 계보도 포함되므로 사례를 검토하는 조사관은 에이전트가 누구 역할을 하는지(및 해당 신원이 공유되는지 여부), 액세스했지만 가져서는 안되는 대상, 답변을 도출한 데이터 등 전체 그림을 볼 수 있습니다. 각 강화 기능은 이웃이 없는 경우에도 허용됩니다. 지식 모듈이 설치되지 않은 경우 계보는 위조되지 않고 생략됩니다. ID에 해결된 에이전트 바인딩이 없으면 속성은 이를 발명하는 대신 “아직 바인딩되지 않음”이라고 표시됩니다.

심사 수명주기

드리프트에서 시작된 결과가 open 상태로 시스템에 입력됩니다. 이후에는 표준 찾기 분류 수명 주기를 따릅니다.

  • 공개: 결과가 존재하지만 아직 이에 대한 조치를 취한 사람이 없습니다.
  • 분류됨: 운영자가 이를 승인하고 검토를 위해 할당했습니다.
  • 해결됨: 근본 원인이 수정되었습니다(허가 취소, 정책 강화, 에이전트 범위 조정).
  • 해제됨: 운영자가 이를 검토한 후 실제 위험이 아니라고 판단했습니다(알려진 동작, approximate 속성의 거짓 긍정).

모든 심사 상태 변경은 실제 주체에 대해 자체 감사됩니다. 발견 사항을 기각하는 행위 자체가 변조 방지 원장에 기록되므로 감사자는 어떤 드리프트가 발생했는지뿐만 아니라 누가 이를 검토했으며 무엇을 결정했는지 확인할 수 있습니다. 발견 항목의 증거(종류, 심각도, 세부 해시)는 생성 후에 변경할 수 없습니다. 심사는 워크플로 상태만 변경합니다.

이것이 실제로 무엇을 의미하는가

에이전트에는 Claude 작업공간으로 범위가 지정된 API 키가 제공됩니다. ID 커넥터는 작업 영역의 명단을 읽고 정책 에지를 내보냅니다. 이 키는 이 작업 영역에서 API를 호출하는 데 허용됩니다. 에이전트는 3주 동안 실행됩니다. 원격 분석에서는 드리프트 없이 해당 작업 공간에서 API를 호출하는 것으로 표시됩니다. 그런 다음 배포 변경으로 인해 에이전트가 두 번째 작업 영역의 키에 액세스할 수 있습니다. 원격 분석은 두 작업 영역을 모두 호출하는 에이전트를 관찰합니다. 두 번째 작업공간에는 정책 에지가 없습니다. violation 종류의 드리프트 발견 항목이 생성되었습니다. 관찰되었지만 허용되지 않았습니다. access_drift, 심각도 중간, 신뢰도 approximate로 변칙 대기열에 들어갑니다(에지는 아직 ID 그래프에 대해 조정되지 않았습니다). 두 번째 작업공간의 리소스에 high 민감도 레이블이 있으면 심각도가 승격됩니다. 결과는 누군가 분류할 때까지 운영자의 대기열에 보관됩니다.

이것이 로깅과 구조적 드리프트의 차이점입니다. 결과는 분류되고, attributed(정직한 확신을 가지고), 우선순위가 지정되고 선별 가능합니다. 누군가가 문제를 해결하거나 무시할 때까지 지속됩니다. 에이전트가 나중에 사건 사례의 대상이 되는 경우 포렌식 타임라인에 나타납니다. 그리고 그에 대한 모든 조치는 제품의 무결성을 입증할 수 있는 체인에 기록됩니다.


드리프트는 최소화하기 위한 지표가 아닙니다. 선별검사 결과입니다. 에이전트가 수행하도록 허용된 작업과 수행이 관찰되는 작업 사이의 gap는 최소 권한 적용을 위한 가장 높은 신호 노출 영역입니다. 그러나 gap가 증명할 수 있는 내용에 대해 구조화되고 분류되고 정직한 경우에만 가능합니다.

달리는 부지의 액세스 지도와 표류면을 보려면 액세스 지도 제품 페이지 또는 제품 개요를 방문하세요.

관련 글

자주 묻는 질문

unused_grant 드리프트와 violation 드리프트의 차이점은 무엇입니까?

unused_grant는 관찰된 적이 없는 허용된 액세스입니다. 즉, 에이전트가 보유하고 있지만 행사하지 않는 데드 권한입니다. violation는 그 반대입니다. 어떤 정책이나 허가도 허용하지 않는 관찰된 액세스입니다. 둘 다 드리프트이지만 서로 다른 위험 프로필과 서로 다른 대응 기대치를 가지고 있습니다. unused_grant는 정리 대상입니다. violation는 즉각적인 분류가 필요할 수 있는 활성 결과입니다.

이상 대기열 할인 approximate-신뢰도가 드리프트되는 이유는 무엇입니까?

드리프트 에지가 approximate로 플래그 지정되면 해당 속성이 입증되지 않고 추론됩니다. 이는 에이전트별 속성이 붕괴되는 공유 서비스 계정이나 손실이 있는 신호 소스에서 발생할 수 있습니다. 우선순위 점수에서 이를 할인하면 조정되지 않고 잠재적으로 시끄러운 드리프트가 더 높은 신뢰도 결과를 밀어내는 것을 방지할 수 있습니다. 드리프트가 여전히 대기열에 나타납니다. 속성이 확정되거나 운영자가 분류할 때까지 순위가 더 낮습니다.

에이전트가 무엇에 접근할 수 있는지 확인하세요

Olivares AI는 당신의 AI 환경을 위한 개방형 자체 호스팅 플랫폼입니다. 자체 인프라에 배포하고 보안 및 플랫폼 팀이 필요로 하는 액세스 맵을 확보하세요.