contexa-core Enterprise

@SoarTool 어노테이션

메서드 또는 클래스를 AI 기반 호출에 사용 가능한 SOAR 대응 Tool로 표시합니다. 각 Tool의 승인 요구 사항, 속도 제한, 환경 제한, 재시도 동작, 감사 설정을 구성합니다.

개요

@SoarTool 어노테이션은 일반 Java 메서드를 SOAR가 호출할 수 있는 Tool로 변환합니다. SOAR Pipeline의 LLM이 특정 대응 액션이 필요하다고 판단하면 (예: IP 차단, 호스트 격리, 알림 전송), Tool의 namedescription을 기반으로 적절한 @SoarTool 어노테이션 메서드를 선택합니다.

실행 전에 프레임워크는 승인 요구 사항을 확인하고, 권한을 검증하며, 속도 제한을 적용하고, 환경 호환성을 확인합니다. 실행 후에는 auditRequired가 활성화된 경우 감사 추적을 기록합니다.

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface SoarTool
io.contexa.contexacommon.annotation

속성

속성타입기본값설명
name String "" LLM Tool 선택에 사용되는 고유 Tool 이름. 비어있으면 메서드 이름이 사용됩니다.
description String "" Tool 목적에 대한 사람이 읽을 수 있는 설명. LLM Tool 선택 프롬프트에 포함됩니다.
approval ApprovalRequirement AUTO 이 Tool 실행 전 필요한 승인 수준. ApprovalRequirement enum을 참조하세요.
requiredPermissions String[] {} 이 Tool을 호출하는 데 필요한 보안 권한. 현재 세션의 부여된 권한에 대해 확인됩니다.
allowedEnvironments String[] {"dev", "staging", "prod"} 이 Tool을 사용할 수 있는 환경. 위험한 Tool을 비프로덕션 또는 그 반대로 제한합니다.
maxExecutionsPerHour int 100 시간당 이 Tool을 호출할 수 있는 최대 횟수. 제어되지 않는 자동화를 방지합니다.
auditRequired boolean true Tool 실행이 CentralAuditFacade에 기록되는지 여부.
retryable boolean true 일시적 장애 시 Tool을 자동으로 재시도할 수 있는지 여부.
maxRetries int 3 retryable이 true인 경우 최대 재시도 횟수.
timeoutMs long 30000 Tool 호출이 취소되기 전 최대 실행 시간 (밀리초).

ApprovalRequirement

Tool 실행 전 필요한 사람의 감독 수준을 정의합니다.

public enum ApprovalRequirement (@SoarTool 내부에 중첩)
설명사용 사례
NONE 승인 불필요. Tool이 즉시 실행됩니다. 저위험 읽기 전용 작업 (로그 조회, 상태 확인).
AUTO 위험 평가 및 Tool 정책에 따른 자동 승인. 대부분의 Tool의 기본값. ToolApprovalPolicyManager가 결정합니다.
NOTIFICATION 승인자에게 알림을 보낸 후 지연 후 자동 진행. 인지는 필요하지만 차단은 불필요한 중위험 액션.
REQUIRED 실행 전 단일 승인자가 명시적으로 승인해야 합니다. 고위험 액션 (IP 차단, 계정 정지).
MULTI_APPROVAL 실행 전 여러 승인자가 독립적으로 승인해야 합니다. 중요 액션 (방화벽 규칙 변경, 데이터 삭제, 프로덕션 배포).

코드 예제

읽기 전용 조사 Tool

Java
@SoarTool(
    name = "lookup_user_activity",
    description = "Retrieves recent activity logs for a specific user",
    approval = ApprovalRequirement.NONE,
    maxExecutionsPerHour = 500,
    timeoutMs = 10000
)
public List<ActivityLog> lookupUserActivity(String userId, int hours) {
    return activityLogRepository.findRecentByUserId(userId, hours);
}

고위험 차단 Tool

Java
@SoarTool(
    name = "block_ip_address",
    description = "Blocks an IP address at the firewall level",
    approval = ApprovalRequirement.REQUIRED,
    requiredPermissions = {"SOAR_BLOCK_IP"},
    allowedEnvironments = {"staging", "prod"},
    maxExecutionsPerHour = 50,
    retryable = false,
    timeoutMs = 60000
)
public BlockResult blockIpAddress(String ipAddress, String reason, int durationHours) {
    return firewallService.blockIp(ipAddress, reason, Duration.ofHours(durationHours));
}

핵심 인프라 Tool

Java
@SoarTool(
    name = "isolate_host",
    description = "Isolates a compromised host from the network",
    approval = ApprovalRequirement.MULTI_APPROVAL,
    requiredPermissions = {"SOAR_ISOLATE_HOST", "INFRA_ADMIN"},
    allowedEnvironments = {"prod"},
    maxExecutionsPerHour = 10,
    retryable = false,
    auditRequired = true,
    timeoutMs = 120000
)
public IsolationResult isolateHost(String hostname, String incidentId) {
    return networkService.isolateHost(hostname, incidentId);
}

클래스 수준 어노테이션

Java
// Class-level annotation applies defaults to all methods in the class
@SoarTool(
    approval = ApprovalRequirement.NOTIFICATION,
    requiredPermissions = {"SOAR_NOTIFICATION"},
    maxExecutionsPerHour = 200
)
@Component
public class NotificationTools {

    @SoarTool(
        name = "send_slack_alert",
        description = "Sends a security alert to the designated Slack channel"
    )
    public void sendSlackAlert(String channel, String message, String severity) {
        slackService.sendMessage(channel, formatAlert(message, severity));
    }

    @SoarTool(
        name = "send_email_alert",
        description = "Sends a security alert email to the incident response team"
    )
    public void sendEmailAlert(String subject, String body, List<String> recipients) {
        emailService.send(recipients, subject, body);
    }
}

관련 문서