LLM 접근 제어 및 모니터링 구현을 위한 모범 사례
요약
본 글은 AI 에이전트의 보안 문제를 다루며, 전통적인 모델 정렬이나 콘텐츠 필터링과는 다른 접근 방식을 제시합니다. 핵심은 자율적 시스템에 부여된 권한을 '세션 전체'가 아닌 '개별 도구 호출 단위'로 제한하는 것입니다. 이를 통해 신뢰할 수 없는 입력으로 인한 의도치 않은 도구 사용(권한 오용)을 막는 모범 사례를 설명합니다.
핵심 포인트
- AI 에이전트 보안은 권한 제약 문제이며, 모델 정렬과는 다릅니다.
- 에이전트는 스스로 행동을 결정하므로, 세션 전체 권한 부여가 위험합니다.
- 권한 평가는 요청 경로(request path)의 도구 호출 시점마다 이루어져야 합니다.
- 도구 호출은 '호출자 신원', '도구 범위', '작업 컨텍스트' 3가지 기준으로 평가되어야 합니다.
질문
엔지니어들은 LLM 접근 제어에 대해 구체적인 질문을 합니다. 통제는 어디에 속하며, 실제로 무엇을 확인하는가 하는 것입니다. 이 글이 그 답을 제시합니다. 본문은 이미 도구를 호출하는 에이전트를 실행하고 있으며, 프롬프트 인젝션(prompt injection)이 무엇인지 알고 있다는 것을 전제로 합니다.
여기서 AI 에이전트 보안이란 무엇인가
AI 에이전트 보안은 자율적이거나 반자율적인 시스템이 보유한 권한으로 무엇을 할 수 있는지 제약하는 학문입니다. 이는 모델 정렬(model alignment)이 아닙니다. 콘텐츠 필터링도 아닙니다. 이는 다른 모든 특권 워크로드와 동일한 문제입니다: 신원(identity), 범위(scope), 그리고 감사(audit).
차이점은 에이전트가 다음 행동을 스스로 결정한다는 것입니다. 전통적인 서비스는 고정된 일련의 엔드포인트를 호출합니다. 반면, 에이전트는 방금 읽은 텍스트를 기반으로 어떤 도구를 호출할지 선택하며, 이 텍스트는 사용자, 문서, 웹 페이지 또는 다른 에이전트로부터 올 수 있습니다.
공격 표면(Attack Surface), 구체적으로
세 가지 도구(티켓 읽기, 고객 기록 읽기, 이메일 보내기)를 가진 에이전트를 가정해 봅시다. 사용자가 티켓 요약을 요청합니다.
티켓 본문에는 지침처럼 보이는 텍스트가 포함되어 있습니다. 에이전트는 이를 자신의 작업의 일부로 읽습니다. 이제 에이전트는 고객 기록 도구와 이메일 도구를 호출할 그럴듯한 이유를 갖게 됩니다.
고전적인 의미에서 악용된 것은 아무것도 없습니다. 자격 증명(credential)도 탈취되지 않았습니다. 에이전트는 이미 가지고 있던 권한을 사용했을 뿐입니다. 실패는 그 권한이 호출 단위가 아니라 세션 전체에 부여되었다는 점입니다.
이것이 핵심적인 실패 모드입니다. 세션 전반의 권한(Session wide authority)과 신뢰할 수 없는 입력(untrusted input)이 결합하면 의도하지 않은 도구 사용을 초래합니다. 이는 이론적인 문제가 아닙니다. 왜냐하면 신뢰할 수 없는 입력은 문서를 읽거나, 티켓을 처리하거나, 웹 콘텐츠를 다루는 모든 에이전트의 일반적인 사례이기 때문입니다.
이를 막는 메커니즘
제어는 요청 경로(request path), 즉 에이전트와 도구 사이의 지점에 속해야 합니다. 프롬프트나 시스템 메시지, 또는 정책 문서에 있는 것이 아닙니다.
모든 도구 호출은 세 가지 항목을 기준으로 평가됩니다:
- 호출자 신원(The caller identity). 어떤 에이전트가, 어떤 사용자를 대신하여, 어떤 세션에서 호출했는지.
- 도구 범위(The tool scope). 어떤 특정 도구를, 어떤 매개변수로, 어떤 리소스에 대해 사용할 것인지.
- 작업 컨텍스트(The task context). 에이전트에게 무엇을 하도록 요청받았으며, 이 호출이 그와 일관성이 있는지 여부.
결정은 호출마다 이루어집니다. 권한은 한 번의 호출에 대해서만 부여되고 이후 폐기됩니다. 나중의 호출은 '0'부터 시작합니다.
이 순서가 중요합니다. 만약 세션 시작 시점에 한 번 평가한다면, 에이전트가 행동을 유도할 입력(input)을 읽기도 전에 결정이 내려집니다. 하지만 호출마다 평가하면, 에이전트가 무엇을 하려는지에 대한 전체 컨텍스트를 가지고 결정이 내려집니다.
모니터링은 두 번째 절반입니다. 모든 호출에 대해 결정 내용, 확인된 범위(scope), 그리고 결과를 기록해야 합니다. 단 한 번 거부된 호출은 노이즈일 뿐입니다. 하지만 특정 에이전트, 또는 특정 도구, 또는 특정 사용자로부터 반복적으로 거부되는 패턴은 조치를 취할 가치가 있는 신호입니다.
구체적인 실패 사례(A concrete failure mode)
에이전트에게 지원 티켓을 요약하도록 요청받았습니다. 이 티켓에는 에이전트가 해당 스레드를 외부 주소로 전달하라는 내용의 삽입된 텍스트가 포함되어 있습니다.
세션 전체 권한(session wide authority)을 사용할 경우, 에이전트는 이미 이메일 도구(email tool)를 가지고 있습니다. 에이전트는 이를 호출합니다. 호출은 성공합니다. 감사 로그(audit log)에는 합법적인 에이전트에 의한 성공적인 전송 기록이 남습니다.
하지만 호출별 평가(per call evaluation)를 사용하면, 이메일 호출이 작업 컨텍스트와 비교됩니다. 작업은 '요약'이었지 '전송'이 아니었습니다. 따라서 호출은 거부됩니다. 이 거부는 에이전트 신원, 도구, 그리고 이유와 함께 기록됩니다.
차이는 모델 자체가 아닙니다. 제어(control)가 어디에 위치하며 얼마나 자주 실행되는지에 있습니다.
RESK를 사용한 구현(Implementation with RESK)
reskSecure는 요청 경로에서 도구 호출을 평가함으로써 에이전트에 최소 권한 원칙(least privilege)을 강제합니다. 모든 호출은 도구에 도달하기 전에 신원, 범위, 그리고 작업 컨텍스트와 비교됩니다. 권한은 호출 간에 유지되지 않습니다.
ReskPoints는 모니터링 계층을 제공합니다. 이 시스템은 각 결정과 결과를 기록하여 에이전트별로 거부된 호출, 반복 시도, 비정상적인 도구 사용 내역을 확인할 수 있게 합니다. 이 두 가지 기능(enforcement와 visibility)을 함께 사용하여 동일한 경로에서 통제 및 가시성을 확보할 수 있습니다.
먼저 에이전트가 호출할 수 있는 모든 도구를 목록화하는 것부터 시작하세요. 그런 다음 도구별 범위를 정의하고, 호출을 reskSecure를 통해 라우팅하며, 무언가를 강화하기 전에 첫 주 동안 ReskPoints 데이터를 읽어보세요.
체크리스트
- 에이전트가 호출할 수 있는 모든 도구를 나열하세요.
- 각 도구가 필요로 하는 최소 범위를 정의하세요.
- 권한 부여 결정을 요청 경로(request path)로 이동시키세요.
- 세션 단위가 아닌, 호출(call) 단위로 평가하세요.
- 호출자 신원(caller identity), 도구 범위(tool scope), 작업 컨텍스트(task context)를 확인에 포함시키세요.
- 모든 결정과 결과를 기록하세요.
- 거부된 호출을 매주 검토하세요.
- 하나의 에이전트가 반복적으로 거부되는 경우 이를 사고(incident)로 간주하세요.
- 도구가 새로운 파라미터를 얻을 때 범위를 재확인하세요.
에이전트에게 최소 권한 원칙(least privilege)을 적용하세요: https://resk.fr/projects/resksecure.html
도구 수준의 권한과 관련된 주제는 AI 에이전트 도구 권한에 대한 기사를 참고하세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기