IT/코딩 관련 팁

AWS에서 Spring Boot 애플리케이션의 보안 감사 및 모니터링 구현 가이드

KeepGooing 2024. 11. 17. 01:24
반응형

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를 조합하여 사용하면 애플리케이션과 인프라 전반에 걸친 포괄적인 보안 감사 시스템을 구축할 수 있습니다. 이러한 시스템을 통해 보안 위협을 조기에 감지하고, 규정 준수를 유지하며, 전반적인 보안 태세를 강화할 수 있습니다.

보안 감사 및 모니터링은 지속적인 과정입니다. 새로운 보안 위협과 규정이 계속해서 등장하므로, 감사 시스템을 정기적으로 검토하고 업데이트하는 것이 중요합니다. 또한, 팀 전체가 보안의 중요성을 인식하고 일상적인 개발 및 운영 프로세스에 보안 고려사항을 통합하는 문화를 조성해야 합니다.

반응형