팀 프로젝트- 11회차

박형준·2024년 6월 25일

ALB를 통해 오토 스케일링 진행 시 WAF를 사용하여 보안 향상

  1. WAF 설정
    WAF는 웹 애플리케이션을 보호하기 위해 특정 HTTP 요청을 필터링하고 차단합니다. ALB와 통합하여 사용할 수 있습니다.
  • AWS Management Console 접속 후, WAF & Shield 서비스로 이동합니다.

  • Web ACLs 선택 후, 새로운 ACL을 생성합니다.

  • 웹 ACL 생성:

    • 리소스 유형을 선택하고, 보호할 ALB를 지정합니다.

    • ( 이름 예시: MyWebACL )

    • 규칙을 설정하여 원하는 보안 정책을 구현합니다. 예를 들어, SQL 인젝션, 크로스 사이트 스크립팅, 지정된 IP 차단 등의 규칙을 추가할 수 있습니다.

  • 웹 ACL을 생성한 후 ALB와 연결하여 요청을 필터링합니다.

  1. ALB 액세스 로그 설정
    ALB 액세스 로그는 들어오는 요청에 대한 상세 정보를 제공하여, 모니터링 및 보안 분석에 유용합니다.
  • EC2 대시보드에서 Load Balancers 섹션으로 이동합니다.

  • 보안을 강화하고자 하는 ALB를 선택합니다.

  • Attributes 탭에서 Access logging을 찾아 Edit을 클릭합니다.

  • Enable Access Logging을 선택하고, 로그를 저장할 S3 bucket을 지정합니다.

  • 필요한 경우, 로그 데이터 포맷을 사용자 정의할 수 있습니다.

  1. ALB와 WAF 연동 확인
    ALB에 설정된 WAF를 통해 보안이 강화되었는지 확인하기 위해 테스트를 진행할 수 있습니다.
  • 보안 규칙에 따라 차단되어야 하는 요청을 시뮬레이션하여 WAF가 제대로 작동하는지 확인합니다.

  • ALB 액세스 로그를 분석하여 차단된 요청을 검토할 수 있습니다.

추가 팁

  • CloudWatch와 AWS Lambda를 활용하여 액세스 로그를 실시간으로 분석하고, 특정 패턴이나 비정상적인 활동이 감지될 경우 자동으로 경고를 생성할 수 있습니다.
  • WAF의 Rate-based Rule을 사용하여 DDoS 공격과 같은 비정상적인 트래픽 증가를 감지하고 차단할 수 있습니다.

웹 서버 보호를 위한 WAF 규칙

  • SQL 인젝션 방지:

    • 이 규칙은 웹 애플리케이션에 대한 SQL 인젝션 공격을 차단합니다. 사용자 입력에서 SQL 명령어가 발견되면 요청을 차단합니다.

    • AWS Managed Rules for SQL Injection을 사용하면, AWS가 제공하는 표준 SQL 인젝션 방지 규칙을 적용할 수 있습니다.

  • 크로스 사이트 스크립팅(XSS) 방지:

    • XSS 공격을 방지하기 위해 사용자 입력에서 HTML 태그나 JavaScript 코드가 포함된 요청을 차단합니다.

    • AWS Managed Rules for Cross-Site Scripting을 활용하여 일반적인 XSS 패턴을 자동으로 차단할 수 있습니다.

  • 지정된 IP 차단:

    • 악의적인 IP 주소나 특정 지역에서 오는 요청을 차단합니다. 이는 DDoS 공격이나 브루트 포스 로그인 시도를 막는 데 유용합니다.

    • IP 세트를 생성하고, 해당 IP 주소에서 오는 모든 요청을 차단하는 규칙을 설정합니다.

DB 서버 보호를 위한 WAF 규칙

  • 웹 계층에서만 데이터베이스 접근 허용:

    • DB 서버에 대한 직접적인 접근을 차단하고, 오직 애플리케이션 서버를 통해서만 데이터베이스에 접근하도록 합니다.

    • 특정 URI 또는 API 엔드포인트를 통한 요청만을 허용하는 규칙을 설정합니다.

  • 알려진 취약점을 이용한 공격 차단:

    • 데이터베이스를 타깃으로 하는 특정 취약점을 이용한 공격 유형을 차단합니다.

    • 예를 들어, 특정 소프트웨어 버전의 취약점을 이용한 공격 시도를 차단하는 규칙을 구현합니다.

  • 비정상적인 트래픽 패턴 감지:

    • 비정상적으로 높은 요청 빈도나 이상한 시간대에 발생하는 요청을 감지하고 차단합니다.

    • AWS WAF의 Rate-based rules를 사용하여 초당 요청 수가 정상 범위를 벗어날 경우 자동으로 차단합니다.


ACL 생성

  1. WAF Web ACL 생성
  • AWS Management Console에 로그인하고, Services에서 WAF & Shield를 선택합니다.

  • Create web ACL 버튼을 클릭합니다.

  • Name 필드에 웹 ACL의 이름을 입력합니다 (예: MyWebACL).

  • Region을 선택합니다. 이는 ALB가 위치한 리전과 일치해야 합니다.

  • Resource type to associate with web ACL에서 Application Load Balancer를 선택하고, 보호할 ALB를 지정합니다.

  • Add rules 섹션에서 Add my own rules and rule groups를 선택합니다. 여기서는 예를 들어 SQL 인젝션 방지 규칙을 추가할 수 있습니다.

    • SQL 인젝션 방지 규칙 추가 ( web server )

      • Add rules 섹션에서 Managed rule group 를 선택합니다.

      • Vendor name: 드롭다운 메뉴에서 AWS를 선택합니다.

      • Managed rule groups 섹션에서 SQL database을 찾아 체크합니다. 이 규칙 그룹은 SQL 인젝션 공격을 자동으로 감지하고 차단하는 규칙을 포함합니다.

      • Add rule 버튼을 클릭하여 이 규칙을 웹 ACL에 추가합니다.

    • XSS 방지 및 웹 취약점 방어 규칙 추가 ( web server )

      • 같은 방법으로 Add rule을 클릭합니다.

      • Vendor name: 드롭다운 메뉴에서 AWS를 선택합니다.

      • Managed rule groups 섹션에서 Core rule set을 찾아 체크합니다. 이 규칙 그룹은 SQL 인젝션 공격을 자동으로 감지하고 차단하는 규칙을 포함합니다.

      • Add rule 버튼을 클릭하여 이 규칙을 웹 ACL에 추가합니다.

    • 지정된 IP 차단 규칙 추가 ( web server )

      • AWS Management Console에 로그인합니다.

      • Services에서 WAF & Shield를 선택합니다.

      • 원하는 Web ACL을 선택하거나 새로 생성합니다.

      • IP sets 섹션으로 이동하여 Create IP set을 클릭합니다.

      • IP set의 이름을 입력하고, 차단하고자 하는 IP 주소 또는 범위를 추가합니다.
        (예: BlockListedIPs)
        (예: 192.168.1.1/32, 10.0.0.0/24)

      • 생성된 IP set을 사용하는 새로운 규칙을 만들어 웹 ACL에 추가합니다. 이 규칙에서는 해당 IP - set에 있는 IP 주소에서 오는 요청을 Block 액션으로 설정하여 차단합니다.
        (예: BlockSpecificIPs)

    • 특정 URI 또는 API 엔드포인트 통한 요청 허용 규칙 추가 ( db server )

      • Add rules 섹션에서 Add my own rules and rule groups를 선택합니다.

      • Create rule을 클릭합니다.

      • Name에 규칙 이름을 입력합니다 (예: AllowSpecificURIs).

      • Rule type에서 Regular rule을 선택하고, IF 섹션에서 A request를 선택합니다.

      • Matches the statement를 선택하고, Statement에서 String match을 선택합니다.

      • Part of the request to inspect에서 URI를 선택하고, Match type에서 Starts with를 선택합니다.

      • String value에 허용할 특정 URI 또는 API 엔드포인트 경로를 입력합니다 (예: /api/data).

      • Action에서 Allow를 선택합니다.

      • Add rule을 클릭하여 웹 ACL에 규칙을 추가합니다.

    • 비정상적인 트래픽 패턴 감지 규칙 추가 ( db server )

      • 다시 Add rule을 클릭합니다.

      • Name에 규칙 이름을 입력합니다 (예: RateLimitAbnormalTraffic).

      • Rule type에서 Rate-based rule을 선택합니다.

      • Rate limit에 초당 허용할 요청 수를 입력합니다 (예: 1000).

      • Action에서 Block를 선택합니다.

      • Add rule을 클릭하여 웹 ACL에 규칙을 추가합니다.

  • 웹 ACL 활성화 및 모니터링

    • 모든 규칙을 추가한 후 Next를 클릭하고, 모든 설정을 검토합니다.

    • Create web ACL을 클릭하여 웹 ACL을 생성하고, 지정된 ALB와 연동합니다.

    • 설정을 완료한 후, 웹 ACL이 트래픽을 적절히 필터링하고 있는지 모니터링합니다.

설정 검토: 규칙 그룹을 웹 ACL에 추가하기 전에, 해당 규칙 그룹이 어떤 유형의 공격을 탐지하고 차단하는지, 어떤 설정이 포함되어 있는지 검토하는 것이 좋습니다. AWS WAF의 설명서나 관리 콘솔에서 이 정보를 확인할 수 있습니다.

Default web ACL action for requests that don't match any rules

  • Allow: 이 액션을 기본으로 설정하면, 명시된 규칙과 일치하지 않는 모든 요청이 자동으로 허용됩니다. 즉, 명시적으로 차단하거나 카운트하지 않은 요청은 모두 웹 애플리케이션으로 통과시킵니다. 이 설정은 규칙을 통해 특정 악의적인 요청만을 차단하고자 할 때 유용합니다.
  • Block: 이 액션을 기본으로 설정하면, 규칙과 일치하지 않는 모든 요청이 자동으로 차단됩니다. 이 설정은 보안을 최우선으로 하며, 오직 명시적으로 허용된 요청만을 웹 애플리케이션에 도달하게 하고자 할 때 적합합니다. 이는 기본적으로 보안 수준을 높이는 설정입니다.

Request sampling options

  • Enable sampled requests: 이 옵션을 선택하면, 웹 ACL 규칙과 일치하는 요청의 샘플을 활성화하여 볼 수 있습니다. 즉, 규칙에 맞는 요청 중 일부를 무작위로 선택하여 상세 정보(원인, 출처, 내용 등)를 검토할 수 있습니다.
  • Disable sampled requests: 이 옵션을 선택하면, 규칙과 일치하는 요청의 샘플링을 비활성화합니다. 이 경우, 요청의 상세 정보를 볼 수 없으며, 오직 규칙 매칭 통계만을 제공받게 됩니다. 보안 로그를 최소화하려는 경우나 성능 최적화를 원할 때 유용할 수 있습니다.
  • Enable sampled requests with exclusions: 이 옵션을 사용하면, 특정 조건이나 매개변수를 기준으로 요청의 샘플링을 제외할 수 있습니다. 예를 들어, 특정 IP 주소나 URI 패턴에 대한 요청은 샘플링에서 제외하도록 설정할 수 있습니다. 이를 통해 중요하거나 민감한 데이터를 포함할 수 있는 요청의 상세 정보를 보호하거나, 불필요하게 많은 데이터를 수집하는 것을 방지할 수 있습니다.

AWS WAF에서 요청의 원본 IP 주소를 식별하는 방법

  • Source IP address
    이 옵션은 요청이 도착한 IP 주소, 즉 프록시나 로드 밸런서의 IP 주소를 사용합니다. 이는 일반적으로 요청의 직접적인 출처를 식별할 때 사용됩니다. 예를 들어, 요청이 CDN 또는 로드 밸런서를 거쳐 오는 경우, 이 IP 주소는 CDN 또는 로드 밸런서의 주소가 됩니다.
  • IP address in header
    많은 프록시 서비스나 CDN은 원본 클라이언트의 IP 주소를 HTTP 헤더에 추가하여 전달합니다. 이를 사용하여 원본 IP 주소를 식별할 수 있습니다. 예를 들어, 흔히 사용되는 X-Forwarded-For 헤더는 원본 클라이언트의 IP 주소를 포함할 수 있습니다.

WAF & Shield 서비스의 생성한 로드밸런서 연결 후 접근 확인 ( 설정한 rule을 위반하지 않는 )


ACL rule test 및 로그 확인 ( s3 )

S3 버킷 생성 ( 사전 준비 )

  • AWS Management Console에 로그인합니다.

  • 상단의 서비스 메뉴에서 S3를 선택합니다.

  • Create bucket 버튼을 클릭합니다.

  • 버킷 생성 폼에서 다음을 수행합니다:

    • Bucket name: 고유한 이름을 입력합니다. ( 예: aws-waf-logs-view )

    • Region: 버킷을 생성할 리전을 선택합니다. 보통 WAF와 동일한 리전을 선택하는 것이 좋습니다.

    • 나머지 옵션은 기본 설정을 유지하거나 필요에 따라 조정할 수 있습니다.

  • Create 버튼을 클릭하여 버킷을 생성합니다.

로그 파일 보기 및 관리를 위한 권한 설정
AWS WAF 로그를 저장하기 위해 버킷에 적절한 권한을 설정해야 합니다. 이는 버킷 정책을 통해 구현할 수 있습니다.

  • 생성한 S3 버킷을 클릭하여 버킷의 세부 정보 페이지로 이동합니다.

  • Permissions 탭을 클릭합니다.

  • Bucket Policy 버튼을 클릭하여 버킷 정책 편집기를 엽니다.

  • 다음 예시 정책을 사용하여 WAF 로그 파일에 대한 접근 권한을 설정할 수 있습니다. 이 정책은 WAF 서비스가 로그 파일을 버킷에 쓸 수 있도록 허용합니다: ( WAF에서 버킷 생성하고 지정하면 권한 자동 지정 )

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "Service": "waf.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::aws-waf-logs-view/*"
        },
        {
            "Sid": "AWSLogDeliveryWrite",
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::aws-waf-logs-view/AWSLogs/533267020503/*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "533267020503",
                    "s3:x-amz-acl": "bucket-owner-full-control"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:logs:ap-northeast-2:533267020503:*"
                }
            }
        },
        {
            "Sid": "AWSLogDeliveryAclCheck",
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com"
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::aws-waf-logs-view",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "533267020503"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:logs:ap-northeast-2:533267020503:*"
                }
            }
        }
    ]
}
  • 정책을 입력하고 Save를 클릭합니다.
  1. 로깅 활성화
    AWS WAF에서 규칙에 대한 로깅을 활성화하여, 규칙에 의해 처리되는 요청의 상세 정보를 확인할 수 있습니다.
  • AWS Management Console에 로그인합니다.

  • WAF & Shield 서비스로 이동합니다.

  • 원하는 Web ACL을 선택합니다.

  • Logging 탭을 클릭하고, 로깅을 활성화합니다. 로그 데이터를 저장할 Amazon S3 버킷을 지정해야 합니다.

  1. 테스트 요청 보내기
    규칙을 테스트하기 위해 의도적으로 규칙과 일치하거나 일치하지 않는 요청을 보냅니다. 예를 들어, SQL 인젝션 방지 규칙을 테스트하기 위해 SQL 인젝션 공격을 시뮬레이션하는 요청을 보낼 수 있습니다.
  • 공격 시뮬레이션 도구나 스크립트를 사용하여 테스트 요청을 보냅니다.

  • XSS 방지를 테스트하기 위해 XSS 공격 코드를 포함한 요청을 보내 보세요.

  • 지정된 IP 차단을 테스트하기 위해 차단된 IP 목록에 있는 IP 주소에서 요청을 보내보세요.

  1. CloudWatch 메트릭스 검토
    AWS WAF는 Amazon CloudWatch와 통합되어 규칙에 대한 통계와 메트릭스를 제공합니다.
  • CloudWatch로 이동합니다.

  • Metrics 섹션에서 WAF & Shield를 선택합니다.

  • 원하는 Web ACL과 규칙을 찾아 트래픽과 차단된 요청의 수를 모니터링합니다.

  1. CloudWatch 알람 설정( 선택 )
    특정 조건이 충족될 때 알람을 설정하여 적극적으로 모니터링할 수 있습니다.
  • CloudWatch에서 규칙 관련 메트릭에 대해 알람을 생성합니다.

  • 예를 들어, 특정 시간 동안 차단된 요청의 수가 임계값을 초과하면 알람을 설정할 수 있습니다.


SQL 인젝션 공격 시뮬레이션

  • SQL 인젝션 테스트는 웹 어플리케이션이 사용자 입력을 적절히 처리하지 않을 때 발생할 수 있는 보안 취약점을 확인합니다.

  • Postman 또는 curl 사용 예:

XSS 공격 시뮬레이션

  • XSS(Cross-Site Scripting) 공격은 사용자가 제공한 데이터가 웹 페이지에 안전하지 않게 포함되었을 때 발생할 수 있습니다.

  • XSS 공격 코드 포함 요청 예:

curl -X POST "http://example.com/comment" -d "comment=<script>alert('XSS')</script>"

클라우드 워치를 통한 모니터링

WAF log를 s3에 실시간 저장


VPC Endpoint 사용

  • AWS DynamoDB에 접근하는 경우, 인터넷을 통하지 않고 AWS PrivateLink를 사용하여 VPC Endpoint를 설정할 수 있습니다. 이 방법을 사용하면 프라이빗 서브넷의 인스턴스가 보다 안전하게 DynamoDB 서비스에 접근할 수 있습니다.

    • VPC Endpoint: AWS 서비스와 프라이빗 연결을 설정하여 인터넷 게이트웨이, NAT 디바이스, VPN 연결, AWS Direct Connect 연결 없이 서비스를 이용할 수 있게 합니다.

    • DynamoDB의 경우, Gateway Type VPC Endpoint (DynamoDB용)을 구성할 수 있습니다.

VPC Endpoint 생성 시, 다음과 같은 단계를 따릅니다:

  • VPC 콘솔에 접속하고, Endpoints 섹션에서 Create Endpoint를 선택합니다.

  • 서비스 이름을 선택하고, Interface 유형을 선택합니다.

    • 이름: com.amazonaws.ap-northeast-2.dynamodb, 유형: interface
  • 사용할 VPC와 서브넷을 선택합니다. 이 때, 각 서브넷에 할당할 IP 주소를 지정할 수 있습니다.

    • VPC: vec-prd-vpc, 서브넷: VEC-PRD-DB-PRI-2A, VEC-PRD-DB-PRI-2C

    • IP 주소 지정 체크, IP: 10.250.3.254, 10.250.13.254

  • 보안 그룹을 설정하여 Endpoint에 대한 접근을 제어합니다.

    • VEC-PRD-DB-PRI-SG-2A

    • 정책: 전체 엑세스

  • 설정을 완료하고 Endpoint를 생성합니다.

  • 확인 및 테스트

    • Endpoint가 성공적으로 생성되었는지 확인합니다.

    • 해당 VPC 내의 EC2 인스턴스나 다른 서비스에서 DynamoDB에 접근 테스트를 수행하여 Endpoint가 정상적으로 작동하는지 확인합니다.

보안 고려사항

  • VPC Endpoint 생성 시 적절한 보안 정책을 설정하여 DynamoDB 접근을 제어합니다.

  • 필요한 경우, IAM 정책을 사용하여 DynamoDB 테이블에 대한 접근을 더욱 세밀하게 제어할 수 있습니다.

NAT 게이트웨이의 역할

  • NAT 게이트웨이는 프라이빗 서브넷 내의 인스턴스가 인터넷에 연결하여 필요한 업데이트나 패치를 다운로드하거나 외부 서비스와 통신할 수 있게 해주지만, 인터넷에서는 이 인스턴스들에 직접 접근할 수 없도록 합니다. 이는 인터넷으로부터의 직접적인 접근을 차단하여 보안을 강화하는 동시에, 필요한 외부 연결은 가능하게 하는 이상적인 구성을 제공합니다.

VPC Endpoint와의 관계

  • VPC Endpoint가 설정된 경우, DynamoDB와 같은 AWS 서비스에 대한 트래픽은 NAT 게이트웨이를 사용하지 않고 VPC Endpoint를 통해 직접 라우팅됩니다. 이는 비용 효율성을 높이고 네트워크 지연 시간을 줄이는 방법입니다. 그러므로, DynamoDB 접근에는 NAT 게이트웨이 설정이 필요 없으며, NAT 게이트웨이는 다른 인터넷 통신이 필요한 경우에만 사용됩니다.

private link

  • Vpc 엔드포인트와 dynamodb 진행하는 것은 후 순위로 배정하여 terraform을 수행한 후에 진행
  • dynamodb Pitr( 백업 ) 과 private link 같이 진행하면 좋을 것 같다
  • dynamodb 백업 기능을 통한 데이터 저장 파일과 WAF log 파일을 같이 저장시키면 좋을 것 같다
  • vpc 엔드포인트를 gateway 유형으로 생성하여 private 서브넷과 dynamodb를 연결시켜 주었을 때 nat gateway를 삭제하면 dynamodb와 연결이 되지만 외부와의 연결이 끊어지는 것을 확인

0개의 댓글