1. AWS CloudTrail을 활용한 API 활동 로깅
CloudTrail은 AWS 계정의 모든 API 호출을 기록하여 보안 감사의 기반을 제공합니다. Spring Boot 애플리케이션에서 AWS 리소스에 접근할 때 발생하는 모든 활동을 추적할 수 있습니다.
1.1 CloudTrail 설정
AWS Management Console에서 CloudTrail을 설정하고, 로그를 저장할 S3 버킷을 지정합니다. 다음은 AWS CLI를 사용한 CloudTrail 설정 예시입니다:
# CloudTrail 생성
aws cloudtrail create-trail --name my-trail --s3-bucket-name my-bucket
# 로깅 활성화
aws cloudtrail start-logging --name my-trail
1.2 Spring Boot 애플리케이션에서 CloudTrail 로그 분석
애플리케이션에서 CloudTrail 로그를 분석하여 보안 관련 이벤트를 감지할 수 있습니다. 다음은 AWS SDK for Java를 사용하여 CloudTrail 로그를 읽고 분석하는 예시 코드입니다:
@Service
public class CloudTrailAnalyzer {
private final AWSCloudTrail cloudTrailClient;
public CloudTrailAnalyzer(AWSCloudTrail cloudTrailClient) {
this.cloudTrailClient = cloudTrailClient;
}
public List analyzeSecurityEvents() {
LookupEventsRequest request = new LookupEventsRequest()
.withLookupAttributes(Arrays.asList(
new LookupAttribute().withAttributeKey("EventName").withAttributeValue("ConsoleLogin")
));
LookupEventsResult result = cloudTrailClient.lookupEvents(request);
return result.getEvents();
}
}
이 코드는 콘솔 로그인 이벤트를 조회하는 예시입니다. 실제 구현 시에는 더 다양한 보안 관련 이벤트를 조회하고 분석해야 합니다.
2. AWS Config Rules를 이용한 리소스 규정 준수 모니터링
AWS Config Rules를 사용하여 AWS 리소스가 보안 정책을 준수하는지 지속적으로 모니터링할 수 있습니다.
2.1 사용자 정의 Config Rule 생성
Lambda 함수를 사용하여 사용자 정의 Config Rule을 생성할 수 있습니다. 다음은 VPC Flow Logs가 활성화되어 있는지 확인하는 Config Rule의 예시입니다:
import boto3
def evaluate_compliance(configuration_item, rule_parameters):
if configuration_item['resourceType'] != 'AWS::EC2::VPC':
return 'NOT_APPLICABLE'
vpc_id = configuration_item['configuration']['vpcId']
ec2_client = boto3.client('ec2')
flow_logs = ec2_client.describe_flow_logs(Filters=[{'Name': 'resource-id', 'Values': [vpc_id]}])
if flow_logs['FlowLogs']:
return 'COMPLIANT'
else:
return 'NON_COMPLIANT'
def lambda_handler(event, context):
invoking_event = json.loads(event['invokingEvent'])
configuration_item = invoking_event['configurationItem']
rule_parameters = json.loads(event['ruleParameters'])
return evaluate_compliance(configuration_item, rule_parameters)
2.2 Spring Boot에서 Config Rules 결과 모니터링
Spring Boot 애플리케이션에서 AWS SDK를 사용하여 Config Rules의 결과를 주기적으로 확인하고 보고할 수 있습니다:
@Service
public class ConfigRulesMonitor {
private final AmazonConfig configClient;
public ConfigRulesMonitor(AmazonConfig configClient) {
this.configClient = configClient;
}
@Scheduled(fixedRate = 3600000) // 1시간마다 실행
public void checkConfigRulesCompliance() {
DescribeComplianceByConfigRuleRequest request = new DescribeComplianceByConfigRuleRequest()
.withConfigRuleNames("vpc-flow-logs-enabled");
DescribeComplianceByConfigRuleResult result = configClient.describeComplianceByConfigRule(request);
for (ComplianceByConfigRule compliance : result.getComplianceByConfigRules()) {
if ("NON_COMPLIANT".equals(compliance.getComplianceType())) {
// 규정 위반 처리 로직
notifyNonCompliance(compliance);
}
}
}
private void notifyNonCompliance(ComplianceByConfigRule compliance) {
// 이메일 알림, 로그 기록 등의 처리
}
}
3. Spring Boot Actuator를 이용한 애플리케이션 수준의 감사
Spring Boot Actuator는 애플리케이션 내부의 활동을 모니터링하고 감사하는 강력한 도구를 제공합니다.
3.1 Actuator 설정
먼저 Spring Boot 프로젝트에 Actuator 의존성을 추가합니다:
org.springframework.boot
spring-boot-starter-actuator
3.2 사용자 정의 AuditEventRepository 구현
보안 이벤트를 저장하고 관리하기 위한 사용자 정의 AuditEventRepository를 구현합니다:
@Component
public class CustomAuditEventRepository implements AuditEventRepository {
private final List auditEvents = new ArrayList<>();
@Override
public void add(AuditEvent event) {
auditEvents.add(event);
}
@Override
public List find(String principal, Date after, String type) {
return auditEvents.stream()
.filter(event -> (principal == null || event.getPrincipal().equals(principal)))
.filter(event -> (after == null || event.getTimestamp().after(after)))
.filter(event -> (type == null || event.getType().equals(type)))
.collect(Collectors.toList());
}
}
3.3 사용자 정의 AuditListener 구현
특정 보안 이벤트를 감지하고 처리하기 위한 사용자 정의 AuditListener를 구현합니다:
@Component
public class CustomAuthenticationAuditListener extends AbstractAuthenticationAuditListener {
@Override
public void onApplicationEvent(AbstractAuthenticationEvent event) {
if (event instanceof AuthenticationSuccessEvent) {
onAuthenticationSuccessEvent((AuthenticationSuccessEvent) event);
} else if (event instanceof AuthenticationFailureEvent) {
onAuthenticationFailureEvent((AuthenticationFailureEvent) event);
}
}
private void onAuthenticationSuccessEvent(AuthenticationSuccessEvent event) {
AuditEvent auditEvent = createAuditEvent("AUTHENTICATION_SUCCESS", event);
publish(auditEvent);
}
private void onAuthenticationFailureEvent(AuthenticationFailureEvent event) {
AuditEvent auditEvent = createAuditEvent("AUTHENTICATION_FAILURE", event);
publish(auditEvent);
}
private AuditEvent createAuditEvent(String type, AbstractAuthenticationEvent event) {
Map<String, Object> data = new HashMap<>();
data.put("type", event.getClass().getSimpleName());
data.put("details", event.getAuthentication().getDetails());
return new AuditEvent(event.getAuthentication().getName(), type, data);
}
}
결론
AWS 환경에서 Spring Boot 애플리케이션의 보안 감사 및 모니터링을 구현하는 것은 복잡한 작업이지만, 적절한 도구와 방법을 사용하면 효과적으로 수행할 수 있습니다. CloudTrail, Config Rules, 그리고 Spring Boot Actuator를 조합하여 사용하면 애플리케이션과 인프라 전반에 걸친 포괄적인 보안 감사 시스템을 구축할 수 있습니다. 이러한 시스템을 통해 보안 위협을 조기에 감지하고, 규정 준수를 유지하며, 전반적인 보안 태세를 강화할 수 있습니다.