AWS Security Workshop - 워크로드 보호

Glen·2023년 6월 23일
0

aws security workshop

목록 보기
5/10

아키텍처

  • 개인 계정으로 실습이기 때문에 waf lab dashboard는 없음.

환경설정

  • 제공해준 cloudformation 으로 설정한다(수정필요)
    • Runtime: 'python3.6’ > python3.9

실습

웹사이트 스캔 환경 및 도구

  • AWS WAF 규칙 세트를 테스트하기 위해 이 랩은 두 가지 스캔 기능으로 구성되었습니다.

  • 수동 스캐닝을 호출할 수 있는 레드 팀 호스트와 환경 외부에서 실행되는 자동 스캐너.

  • 스캐너는 일반적인 웹 공격 벡터를 시뮬레이션하고 완화하도록 설계된 10가지 기본 테스트를 수행

    1. Canary GET - Should not be blockedasd
    2. Canary POST - Should not be blocked
    3. SQL Injection (SQLi) in Query String
    4. SQL Injection (SQLi) in Cookie
    5. Cross Site Scripting (XSS) in Query String
    6. Cross Site Scripting (XSS) in Body
    7. Inclusion in Modules
    8. Cross Site Request Forgery (CSRF) Token Missing
    9. Cross Site Request Forgery (CSRF) Token Invalid
    10. Path Traversal
  • redteam host의 시스템매니저로 접속하여 아래의 명령어를 실행한다.

    • runscanner > 미리 작성되어 있는 url 호출 스크립트
    runscanner
    
    #urlib3 openssl error 발생시
    pip3 install urllib3==1.26.6
  • 스크립트 결과 확인

  • 스크립트를 실행하면 알 수 있듯이 해결해야 할 몇 가지 취약점이 존재

    • sql, xss, csrf, include module, path traversal
  • 요청을 차단하도록 웹 ACL을 구성해본다.

WAF

  • 앞서 실행한 runscanner의 로그들을 확인할수있다.

WAF 규칙을 계획할 때 고려해야 할것

  1. 규칙의 의도된 목적은?
  2. 규칙의 목적에 적용되는 HTTP 요청 구성 요소는?
  3. 해당 요청 구성 요소를 대상으로 하는 규칙 또는 규칙 그룹이 이미 존재하는지.
  4. 부울 논리 식에서 규칙의 목적을 어떻게 정의할지
  5. 규칙에 논리적 AND 또는 OR 규칙 문 아래에 중첩된 문이 필요한지.
  6. 입력 콘텐츠 유형과 관련된 변환이 존재하는지.

WAF rule 만들기

SQL 삽입 및 교차 사이트 스크립팅 완화

  • SQL 공격을 막기 위해 아래와 같은 옵션으로 설정
  • matchSQLi 편집, if request를 or로 변경
  • body, header 값에도 sql injection 체크.
    - oversize는 match로 둠
    - 검사할 수 있는 데이터 크기가 크면, 해당 규칙에서 차단함.
    - 참고
  • 위 규칙 적용 후 스크립트 실행 결과
    - sql query string, cookie 에 대한 차단 확인.

XSS 차단 규칙 생성

  • 위와 같은 or로 설정
  • body, cookie헤더에 대한 xss 공격 체크
  • 규칙 저장후 json 확인해보자
    • matchXSS
      {
        "Name": "matchXSS",
        "Priority": 2,
        "Statement": {
          "OrStatement": {
            "Statements": [
              {
                "XssMatchStatement": {
                  "FieldToMatch": {
                    "AllQueryArguments": {}
                  },
                  "TextTransformations": [
                    {
                      "Priority": 0,
                      "Type": "URL_DECODE"
                    }
                  ]
                }
              },
              {
                "XssMatchStatement": {
                  "FieldToMatch": {
                    "Body": {
                      "OversizeHandling": "MATCH"
                    }
                  },
                  "TextTransformations": [
                    {
                      "Priority": 0,
                      "Type": "HTML_ENTITY_DECODE"
                    },
                    {
                      "Priority": 1,
                      "Type": "URL_DECODE"
                    }
                  ]
                }
              },
              {
                "XssMatchStatement": {
                  "FieldToMatch": {
                    "SingleHeader": {
                      "Name": "cookie"
                    }
                  },
                  "TextTransformations": [
                    {
                      "Priority": 0,
                      "Type": "URL_DECODE"
                    }
                  ]
                }
              }
            ]
          }
        },
        "Action": {
          "Block": {}
        },
        "VisibilityConfig": {
          "SampledRequestsEnabled": true,
          "CloudWatchMetricsEnabled": true,
          "MetricName": "matchXSS"
        }
      }
  • /reportBuilder/Editor.aspx 에 대한 액세스를 허용하도록 XSS 규칙 수정
    • 제공해준 json으로 수정
      • json 수정본
        {
            "Name": "matchXSS",
            "Priority": 2,
            "Action": {
                "Block": {}
            },
            "VisibilityConfig": {
                "SampledRequestsEnabled": true,
                "CloudWatchMetricsEnabled": true,
                "MetricName": "matchXSS"
            },
            "Statement": {
                "AndStatement": {
                    "Statements": [{
                            "NotStatement": {
                                "Statement": {
                                    "ByteMatchStatement": {
                                        "SearchString": "/reportBuilder/Editor.aspx",
                                        "FieldToMatch": {
                                            "UriPath": {}
                                        },
                                        "TextTransformations": [{
                                            "Priority": 0,
                                            "Type": "NONE"
                                        }],
                                        "PositionalConstraint": "STARTS_WITH"
                                    }
                                }
                            }
                        },
                        {
                            "OrStatement": {
                                "Statements": [{
                                        "XssMatchStatement": {
                                            "FieldToMatch": {
                                                "QueryString": {}
                                            },
                                            "TextTransformations": [{
                                                "Priority": 0,
                                                "Type": "URL_DECODE"
                                            }]
                                        }
                                    },
                                    {
                                        "XssMatchStatement": {
                                            "FieldToMatch": {
                                                "Body": {}
                                            },
                                            "TextTransformations": [{
                                                    "Priority": 0,
                                                    "Type": "HTML_ENTITY_DECODE"
                                                },
                                                {
                                                    "Priority": 1,
                                                    "Type": "URL_DECODE"
                                                }
                                            ]
                                        }
                                    },
                                    {
                                        "XssMatchStatement": {
                                            "FieldToMatch": {
                                                "SingleHeader": {
                                                    "Name": "cookie"
                                                }
                                            },
                                            "TextTransformations": [{
                                                "Priority": 0,
                                                "Type": "URL_DECODE"
                                            }]
                                        }
                                    }
                                ]
                            }
                        }
                    ]
                }
            }
        }
  • 공격 호스트에서 스크립트 실행 결과 확인.
    - xss에 대한 차단 확인

Mitigate File Inclusion & Path Traversal

  • 확인해봐야할것
    - url 뒤에 특정 uri가 포함되어있는지.
    - 경로조작을 할수 없도록 어떻게 설정해야 하는지.
  • 룰 적용 후 결과 확인

Enforce Request Hygiene

  • 문자열 및 정규식 일치, 크기 제약 조건 및 IP 주소 일치를 사용하여 부적합하거나 값이 낮은 HTTP 요청을 차단하는 규칙을 생성.
  • regex pattern set 메뉴로 이동
  • 생성 후에 상위 메뉴에서 copy ARN 저장.
  • 다시 rule 메뉴로 돌아가서 json editor로 제공한 rule로 수정
    • csrf json
      {
          "Name": "matchCSRF",
          "Priority": 3,
          "Action": {
              "Block": {}
          },
          "VisibilityConfig": {
              "SampledRequestsEnabled": true,
              "CloudWatchMetricsEnabled": true,
              "MetricName": "matchCSRF"
          },
          "Statement": {
              "AndStatement": {
                  "Statements": [{
                          "NotStatement": {
                              "Statement": {
                                  "RegexPatternSetReferenceStatement": {
                                      "ARN": "arn:aws:wafv2:YOUR_REGION:ACCOUNT_ID:regional/regexpatternset/csrf/YOUR_REGEX_PATTERN_ID",
                                      "FieldToMatch": {
                                          "SingleHeader": {
                                              "Name": "x-csrf-token"
                                          }
                                      },
                                      "TextTransformations": [{
                                          "Priority": 0,
                                          "Type": "URL_DECODE"
                                      }]
                                  }
                              }
                          }
                      },
                      {
                          "OrStatement": {
                              "Statements": [{
                                      "ByteMatchStatement": {
                                          "SearchString": "/form.php",
                                          "FieldToMatch": {
                                              "UriPath": {}
                                          },
                                          "TextTransformations": [{
                                              "Priority": 0,
                                              "Type": "NONE"
                                          }],
                                          "PositionalConstraint": "STARTS_WITH"
                                      }
                                  },
                                  {
                                      "ByteMatchStatement": {
                                          "SearchString": "/form.php",
                                          "FieldToMatch": {
                                              "UriPath": {}
                                          },
                                          "TextTransformations": [{
                                              "Priority": 0,
                                              "Type": "NONE"
                                          }],
                                          "PositionalConstraint": "EXACTLY"
                                      }
                                  }
                              ]
                          }
                      }
                  ]
              }
          }
      }
    • arn 은 위에서 복사해둔걸로 수정
  • 룰 저장 이후 스크립트 결과 확인
    - csrf에 대한 차단 확인

이상 감지 및 완화

  • rate limit 규칙을 사용하여 각 발신 IP 주소에 대한 요청 속도를 추적하고 제한을 초과하는 속도로 IP를 차단
  • 제한은 5분당 100개.
  • or문으로 설정
    - uri path, 문자열 시작, /form.php
    - http method, 정확히 일치하는 문자열, POST
  • redteam host에서 이번엔 다른 스크립트 실행
    ```jsx
    runratest
    ```
    
    - 400개의 요청을 보냄. 설정한 규칙이 트리거 되어 차단된것을 확인
        - 403 forbidden 확인
        
  • action block 확인.
  • 일정시간 지난후에 다시 해보면 200으로 성공하게된다

AWS WAF용 관리형 규칙 배포

  • 규칙을 작성할 필요 없이 트래픽에 대한 보호 기능을 제공하는 관리형 서비스.
  • 관리형 규칙은 AWS Marketplace 를 통해서도 사용할 수 있습니다 .
  • 위에서 생성한 WAF 규칙(SQL 삽입 및 교차 사이트 스크립팅)을 제거하고 AWS 관리형 규칙으로 바꾼다.
  • managed rule set을 선택하여 해당 rule 활성화
  • 이후 runscanner 스크립트 실행시 ManagedRule 로 차단된것을 확인

호스트 취약점 식별 및 수정 - inspector

  • 인스턴스를 평가하고 나중에 수정할 보안 결과를 식별합니다.

호스트 취약점 식별 및 수정 - system manager

AWS Systems Manager 패치 관리자 사용

  • 생성된 패치기준을 인스턴스에 적용하기위해 “지금 패치 적용” 클릭
    - workshop이랑 ui가 다름…
  • 시스템 매니저 > 명령 실행 > 명령 기록 부분에서 RunPatchBaseLine 목록 확인
    - 명령 ID를 클릭하면 인스턴스 3개에 대해서 완료 확인

  • 인스턴스 id 클릭시 명령 output, error 확인
  • 패치 완료됐으니 inspector로 다시 평가 진행.
    - 템플릿 선택하여 실행. 15분 걸림
  • inspector 평가 진행하는 동안, system manager의 유지관리 기간에 대해 살펴본다.
  • 일정은 다음과 같이 설정
  • 앞서 만든 유지 관리 일정을 클릭하여 대상을 지정
  • 다음으로 유지기간에 어떤 작업을 할지 등록한다.
  • 앞에서 실행되었던, RunPatchBaseline을 선택
    - 문서버전은 런타임 기본, 최신 선택가능
  • 대상은 앞서 생성한 대상 그룹으로 선택
  • 동시성, 오류는 1로
  • iam 서비스는 별도로 생성한 role로 지정해야됨
    - 옛날 자료에는 SystemManager role을 선택할수 있었으나 현재는 메뉴가 없음.

  • 평가결과 확인
    - 드라마틱하게 줄진 않는거보니 패치기준에 문제가 있는듯?
    - 이 기능은 재부팅하기 어려운 인스턴스말고는 사용할일은 없을거같음.
    - 골든이미지로 배포이전에 업데이트 해놓으면 될듯?
profile
어제보다 나은 엔지니어가 되기 위해서 공부중

0개의 댓글