contexa-core
Enterprise
@SoarTool 어노테이션
메서드 또는 클래스를 AI 기반 호출에 사용 가능한 SOAR 대응 Tool로 표시합니다. 각 Tool의 승인 요구 사항, 속도 제한, 환경 제한, 재시도 동작, 감사 설정을 구성합니다.
개요
@SoarTool 어노테이션은 일반 Java 메서드를 SOAR가 호출할 수 있는 Tool로 변환합니다. SOAR Pipeline의 LLM이 특정 대응 액션이 필요하다고 판단하면 (예: IP 차단, 호스트 격리, 알림 전송), Tool의 name과 description을 기반으로 적절한 @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);
}
}