반응형

AWS에서 Web Application Firewall(WAF) 설정 방법입니다.

WAF는 웹 애플리케이션에서 흔히 발생하는 공격, 침해 시도 등을 탐지하고 차단하는 역할을 합니다.

AWS에서 사전에 정의한 빈도가 높은 공격, 침해 패턴을 적용할 수 있으며
사례에 따라 직접 패턴을 정의하여 사용할 수도 있습니다.

WAF는 Application Load Balancer(ALB)에도 적용하여
ALB로 패킷이 인입되기 전에 미리 공격, 침해 패턴을 분석하여 차단하는 역할을 수행합니다.

🛠 WAF 설정

AWS WAF 좌측 메뉴에서 Web ACLs을 선택하고
Region을 Asia Pacific(Seoul)로 맞춘 후, Create Web ACL을 누릅니다.

⚠️ Web ACL을 생성할 때 WAF가 참조할 ALB를 찾으려면, ALB가 있는 Region으로 맞춰야 합니다.

Web ACL의 이름을 설정합니다.

Web ACL의 이름을 입력하면, CloudWatch metric name이 Web ACL 이름과 동일하게 기본값으로 입력됩니다.

ALB에 WAF를 적용하려면 Resource type은 Regional resources를 선택하고
Region이 앞서 설정한 Asia Pacific(Seoul)이 맞는지 확인합니다.

Add AWS resources를 누르고
WAF를 적용할 리소스를 선택합니다.

여기서는 Application Load Balancer를 선택, 추가할 ALB를 선택하고 Add 합니다.

선택한 resource가 확인되면 Next를 누릅니다.

다음 화면에서 WAF에 적용할 룰을 등록합니다.

사전에 정의된 룰이나 사용자 정의 룰을 추가할 수 있으며,
여기서는 AWS에서 사전 정의한 룰을 추가하기 위해 Add managed rule groups를 선택합니다.

제일 상단에 AWS managed rule groups를 선택합니다.

rule groups에는 유료와 무료 룰이 있습니다.

여기서는 무료 룰 중에서 5가지를 선택하였습니다.

Rlue groups 설명
Amazon IP reputation list Amazon 위협 인텔리전스를 기반으로 하여, 봇이나 여러 위협 요소들의 소스 IP를 차단할 수 있습니다.
Anonymous IP list 접속자 확인이 어려운 익명의 IP를 차단할 수 있습니다.
Core rule set 이미 알려진 취약점이나 OWASP에서 발표한 취약점에 대해 대응합니다.
Known bad inputs 유효하지 않은 입력이나 취약점을 노린 입력 패턴 등을 차단합니다.
SQL databases SQL injection 등 DB 취약점 패턴 등을 차단합니다.

✍️ 예전의 WAF1에서는 최대 10개의 rule을 선택할 수 있었으나,
현재의 WAF2에서는 각 rule에 capacity를 적용하여, 최대 1500까지 추가할 수 있습니다.

선택한 rule의 목록과 capacity의 합계를 확인합니다.

설정한 rule 외의 요청은 allow로 처리하도록 선택합니다.

선택한 rule 중에서 AWSManagedRulesCommonRuleSet의 우선순위를 제일 위로 변경합니다.

CloudWatch 메트릭 설정은 기본값으로 둡니다.

입력 내용을 최종 확인하고 Create Web ACL를 누릅니다.

🧑‍💻 테스트

Web ACL을 적용한 후 ALB를 대상으로 XSS 테스트를 해보면 403 Forbidden이 확인됩니다.

AWS WAF ► Web ACLs 대시보드에서 접속/차단 내역을 모니터링할 수 있습니다.

⚠️ 주의

Web ACL 정책이 실제 적용되기 위해서는 꽤 많은 시간이 필요합니다.

저도 처음에 제대로 동작 안 하는 줄 알았다가, 30분 이상 시간이 지난 후에야 적용된 것을 확인했습니다.

정책 설정/변경이 필요할 경우 충분히 시간을 두고 적용해야 합니다.

🔗 참고 링크

https://docs.aws.amazon.com/ko_kr/waf/latest/developerguide/waf-chapter.html

https://docs.aws.amazon.com/ko_kr/waf/latest/developerguide/getting-started.html

https://techblog.woowahan.com/2699/

📖 참고 문헌

아라이 마사야 외, 양현 역, 〖AWS컨테이너 설계와 구축 철저 입문〗, 위키북스, 2022, p.363 ~ 374

반응형
반응형

AWS의 로드밸런서 중 하나인 Application Load Balancer(ALB) 설정 방법을 정리하였습니다.

EC2 - Web App. 이중화를 위해 로드밸런서 설정입니다.

1. 타겟 그룹 생성

로드 밸런서를 설정하기 위해서는 먼저 로드 밸런서에 적용할 대상 그룹(target group)을 먼저 생성해야 합니다.

AWS의 EC2 대시보드에서 좌측 메뉴 중 로드 밸런싱 ► 대상 그룹에서 대상 그룹 생성을 선택합니다.

먼저 기본 구성에서 대상 유형으로 인스턴스를 선택합니다.

대상 그룹의 이름을 입력하고, 프로토콜(HTTP)과 포트(80)를 입력합니다.

대상 그룹에 추가할 인스턴스의 VPC를 선택하고, 프로토콜 버전은 HTTP1을 선택합니다.

상태 검사 프로토콜은 기본 설정으로 두고, 다음으로 넘어갑니다.

다음 화면에서 로드 밸런서에 적용할 인스턴스를 모두 선택하고, 아래에 보류 중인 것으로 포함을 선택합니다.

화면 하단, 대상 보기에 인스턴스들이 포함되었습니다. 여기서 대상 그룹 생성을 누릅니다.

2. Load Balancer 생성

로드 밸런싱 로드밸런서에서 로드 밸런서 생성을 선택합니다.

로드 밸런서 유형에서 Application Load Balancer 생성을 선택합니다.

각 로드 밸런서의 특징은 https://aws.amazon.com/ko/elasticloadbalancing/features/#Product_comparisons 에서 비교할 수 있습니다.

로드 밸런서의 이름을 입력하고 체계 - 인터넷 경계IP 주소 유형 - IPv4은 기본값을 유지합니다.

네트워크 매핑에서 타겟 그룹 인스턴스가 포함된 VPC를 선택하고, 매핑에서 2개 이상의 AZ를 선택합니다.

보안 그룹에서 새 보안 그룹 생성을 선택합니다.

ELB 전용 보안 그룹을 새로 생성합니다.

ELB는 외부의 HTTP 요청을 수신하고 EC2 인스턴스로 요청을 넘겨주므로,

인바운드 규칙: HTTP(80) - Anywhere,
아웃바운드 규칙: 모든 트래픽 - EC2 인스턴스가 포함된 보안 그룹을 지정합니다.

ALB의 보안 그룹 규칙에 대한 자세한 내용은 https://docs.aws.amazon.com/ko_kr/elasticloadbalancing/latest/application/load-balancer-update-security-groups.html에서 참고할 수 있습니다.

보안 그룹에서 default를 제거하고, 방금 생성한 보안 그룹을 추가합니다.

리스너 및 라우팅에서 앞서 생성한 대상 그룹을 선택합니다.

요약 내용을 확인하고, 로드 밸런서 생성을 선택합니다.

3. Load Balancer 테스트

방금 생성한 로드 밸런서가 활성 상태가 된 것을 확인합니다.

설명 탭의 DNS 이름을 참고하여 접근을 확인해 봅니다.

 

 

참고 링크

https://docs.aws.amazon.com/ko_kr/elasticloadbalancing/latest/application/application-load-balancer-getting-started.html

 

Application Load Balancer 시작하기 - Elastic Load Balancing

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

https://aws.amazon.com/ko/elasticloadbalancing/features/#Product_comparisons

 

네트워크 트래픽 분산 - Elastic Load Balancing - Amazon Web Services

 

aws.amazon.com

https://docs.aws.amazon.com/ko_kr/elasticloadbalancing/latest/application/load-balancer-update-security-groups.html

 

Application Load Balancer 보안 그룹 - Elastic Load Balancing

Application Load Balancer 보안 그룹 로드 밸런서가 리스너 포트 및 상태 확인 포트에서 등록된 대상과 통신을 할 수 있는지 확인해야 합니다. 로드 밸런서에 리스너를 추가하거나 로드 밸런서가 요청

docs.aws.amazon.com

 

반응형
반응형

Spring Boot에서 ElastiCache for Redis 연동하여 Session 관리 설정한 후 Spring Boot 시작 시 CONFIG 설정 관련 에러 발생하며 Spring Boot가 정상적으로 시작되지 않는 현상이 있습니다.

⛔️ org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'enableRedisKeyspaceNotificationsInitializer' defined in class path resource [org/springframework/boot/autoconfigure/session/RedisSessionConfiguration$SpringBootRedisHttpSessionConfiguration.class]: Invocation of init method failed; nested exception is org.springframework.data.redis.RedisSystemException: Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionException: ERR unknown command `CONFIG`, with args beginning with: `GET`, `notify-keyspace-events`

원인

redis 보안 규칙에서는 원격 유저가 redis의 설정을 임의로 변경할 수 없도록 CONFIG 명령을 비활성할 것을 권고하고 있습니다.

Spring의 RedisHttpSessionConfiguration에서는 초기화 과정에서 CONFIG 명령에 접근합니다.

해결책

Spring Session 1.0.1에서는 CONFIG 명령 사용을 제한할 수 있는 옵션을 추가하였습니다.

다음의 코드를 Bean으로 등록 후 빌드/배포하면 Spring Boot가 정상적으로 실행됩니다.

@Configuration
public class AppConfig {
 
   @Bean
   public ConfigureRedisAction configureRedisAction() {
       return ConfigureRedisAction.NO_OP;
   }
}

참고 링크

https://github.com/spring-projects/spring-session/issues/124

 

ERR unknown command 'CONFIG' when using Secured Redis · Issue #124 · spring-projects/spring-session

Redis security recommends disabling the CONFIG command so that remote users cannot reconfigure an instance. The RedisHttpSessionConfiguration requires access to this during its initialization. Host...

github.com

https://redis.io/docs/management/security/

 

Redis security

Security model and features in Redis

redis.io

https://somida.tistory.com/189

반응형
반응형

EC2 인스턴스의 Web App.에 Multi-part로 파일 업로드 시도 시 403 Forbidden 발생하여 조치한 내용입니다.

원인

관련된 내용을 구글링 하던 중 ELB의 WAF에서 차단되는 경우 403 Forbidden이 발생한다는 내용을 확인하였습니다.

AWF의 Web ACLs 대시보드를 살펴본 결과, 파일 업로드 요청이 403 차단된 것을 확인하였습니다.

차단된 규칙은 AWSManagedRulesCommonRuleSet 규칙 그룹의 SizeRestrictions_BODY 규칙입니다.

해결책

AWF는 악성 스크립트 탐지를 위해 POST로 전송되는 파일의 앞 8KB 부분을 검사합니다.

이때 업로드 하는 파일의 문자열이 악성 스크립트 내용과 유사하게 판단되어 차단되게 됩니다.

이를 해결하기 위해 기존 규칙에서 파일 업로드 요청 URI만 허용하는 예외를 추가한 규칙을 생성합니다.

1. Web ACL Rule Set 편집

AWS WAF에서 Web ACL을 선택합니다.

Rules 탭에서 AWSManagedRulesCommonRuleSet 을 선택하고 Edit 합니다.

차단이 발생한 SizeRestrictions_BODY 규칙을 count 모드로 설정하고 저장합니다.

2. 신규 Rule 추가

Rules 탭에서 Add rulesAdd my own rules and rule groups를 선택합니다.

Rule type - Rule binder를 선택하고, 이름 입력 후 Type - Regular type을 선택합니다.

Statement 1 에서
If a request matches all the statements (AND),
Inspect - Has a label,
Match scope - Label,
Match key - awswaf:managed:aws-core-rule-set:SizeRestrictions_Body 선택합니다.

Statement 2에서
Negate statement results 체크,
Inspect - URI path 선택,
Match type - Exactly matches string 선택,
String to match - 업로드 서비스 URI (/upload/s3/image/service) 입력합니다.

Action - Block을 선택하고, Add rule 합니다.

우선 순위에서 새로 생성한 규칙을 AWSManagedRulesCommonRuleSet 아래로 이동 시킵니다.

파일 업로드 시도 시 Status Code 200으로 응답이 오며, 정상적으로 파일이 업로드 되었습니다.
 

참고 링크

https://docs.aws.amazon.com/ko_kr/elasticloadbalancing/latest/application/load-balancer-troubleshooting.html#http-403-issues

 

Application Load Balancer 문제 해결 - Elastic Load Balancing

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

https://docs.aws.amazon.com/ko_kr/waf/latest/developerguide/aws-managed-rule-groups-baseline.html#aws-managed-rule-groups-baseline-crs

 

기준 규칙 그룹 - AWS WAF, AWS Firewall Manager, 및 AWS Shield Advanced

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

https://aws.amazon.com/ko/premiumsupport/knowledge-center/waf-upload-blocked-files/?nc1=h_ls 

 

AWS WAF가 차단한 파일 업로드

AWS WAF가 차단한 파일을 업로드하려면 어떻게 해야 하나요? 최종 업데이트 날짜: 2022년 7월 27일 AWS WAF가 차단한 확장자를 사용하는 파일을 업로드(POST)해야 합니다. AWS WAF가 차단한 파일을 업로드

aws.amazon.com

 

반응형

+ Recent posts