Browsing Tag

waf

AWS

[AWS] Configuration of ManVSCloud Blog (with AWS WAF)

안녕하세요. ManVSCloud 김수현입니다.

최근 AWS Network Online Study 2기에서 AWS의 WAF에 대한 스터디가 진행되었습니다.
스터디 후 제 블로그에도 AWS WAF 기능을 도입하기로 결정하였습니다.

그리하여 오늘은 WAF 설정을 어떻게 했는지와 WAF 기능이 도입된 현재의 제 블로그가 어떻게 구성되어 있는지에 대해 포스팅 해보려합니다.


AWS WAF

사진 출처 : Anlab

우선 WAF란 Web Application Firewall, 웹 어플리케이션에 특화된 방화벽이라 볼 수 있습니다.
2019년 Anlab 자료에 따르면 웹/어플리케이션의 취약점을 이용한 공격이 상당히 많은 비중을 차지하고 있으며 다양한 방법의 공격이 존재합니다.

제 블로그도 AWS의 Security Group에서 80,443 포트는 0.0.0.0/0으로 OPEN 되어 있었기에
어떻게 웹 공격을 최소화 할 수 있을지 많은 고민을 하였습니다.

특히 해외 지역에서 공격성 접근이 많이 존재한다는 것을 알고 있어 해외쪽을 우선 차단하려 했습니다.
EC2 내에서 Apache의 Geoip를 이용하거나 iptables Geoip 등 다른 방법도 존재했지만
해당 인스턴스까지 접근하는 것자체가 조금 찝찝한 부분이 있어 WAF를 도입하기 전까지
제 블로그는 Route53의 지역 기반 라우팅을 이용하여 국내에서만 접근이 가능하도록 설정해둔 상태였었습니다.

현재는 WAF를 설정하였고 Route53의 지역 기반 라우팅을 이용하여 중국만 차단해두고 나머지 나라에서도 접근이 가능하도록 설정해둔 상태입니다.

제 블로그에서는 AWS WAF를 아래와 같이 설정하였습니다.

Associated AWS resouces : Application Load Balancer
Associated AWS resouces : ManVSCloud-Web-ALB-01 (Application Load Balancer)

Rule은 최대 100개까지 생성이 가능하고 Managed Rule Groups과 Own Rule and Rule Groups을 이용하여 추가가 가능합니다.
managed rule groups에는 다양한 보안 업체의 rule groups이 존재했는데 제 WAF에는 “AWS managed rule groups”을 적용했습니다.

AWS managed rule groups

AWS managed rule groups을 펼쳐보니… 아주 많이 있네요…
저는 Anonymous IP list, Core rule set, WordPress application 3개를 추가해둔 상태입니다.
(참고로 선택하실 때에 Capacity가 1500이 넘지 않도록 선택해주세요.)
(WCUs가 1500이 넘어야할 경우 Amazon에 문의하셔야합니다.)

  • Admin protection
    노출된 관리 페이지에 대한 외부 액세스를 차단할 수있는 규칙이 포함되어 있습니다.
    이는 타사 소프트웨어를 실행 중이거나 악의적인 행위자가 애플리케이션에 대한 관리 액세스 권한을 얻을 위험을 줄이려는 경우 유용 할 수 있습니다.
  • Amazon IP reputation list
    이 그룹에는 Amazon 위협 인텔리전스를 기반으로하는 규칙이 포함됩니다. 이는 봇 또는 기타 위협과 관련된 소스를 차단하려는 경우 유용합니다.
  • Anonymous IP list
    이 그룹에는 뷰어 ID의 난독화를 허용하는 서비스의 요청을 차단할 수있는 규칙이 포함되어 있습니다. 여기에는 VPN, 프록시, Tor 노드 및 호스팅 공급자에서 시작된 요청이 포함될 수 있습니다. 이는 애플리케이션에서 신원을 숨기려고 할 수있는 뷰어를 필터링하려는 경우에 유용합니다.
  • Core rule set
    일반적으로 웹 응용 프로그램에 적용되는 규칙을 포함합니다. 이를 통해 OWASP 출판물에 설명된 것과 같은 광범위한 취약성에 대한 공격으로부터 보호할 수 있습니다.
  • Known bad inputs
    잘못된 것으로 알려져 있고 취약성의 악용 또는 발견과 관련된 요청 패턴을 차단할 수있는 규칙을 포함합니다. 이를 통해 악의적 인 공격자가 취약한 애플리케이션을 발견할 위험을 줄일 수 있습니다.
  • Linux operating system
    LFI 공격을 포함하여 Linux에 특정한 취약성 악용과 관련된 요청 패턴을 차단하는 규칙을 포함합니다. 이렇게하면 파일 콘텐츠를 노출하거나 공격자가 액세스 할 수없는 코드를 실행하는 공격을 방지 할 수 있습니다.
  • PHP application
    안전하지 않은 PHP 함수 삽입을 포함하여 PHP 사용과 관련된 취약점 악용과 관련된 요청 패턴을 차단하는 규칙을 포함합니다. 이를 사용하면 공격자가 코드나 명령을 원격으로 실행할 수있는 악용을 방지 할 수 있습니다.
  • POSIX operating system
    LFI 공격을 포함하여 POSIX / POSIX-like OS에 특정한 취약성을 악용하는 것과 관련된 요청 패턴을 차단하는 규칙을 포함합니다. 이렇게하면 파일 콘텐츠를 노출하거나 액세스가 허용되지 않아야하는 코드를 실행하는 공격을 방지 할 수 있습니다.
  • SQL database
    SQL injection 공격과 같은 SQL 데이터베이스 악용과 관련된 요청 패턴을 차단할 수있는 규칙을 포함합니다. 이를 사용하면 권한 없는 쿼리의 원격 주입을 방지 할 수 있습니다.
  • Windows operating system
    Windows와 관련된 취약점 (예 : PowerShell 명령) 악용과 관련된 요청 패턴을 차단하는 규칙을 포함합니다. 이를 통해 공격자가 무단 명령을 실행하거나 악성 코드를 실행할 수있는 익스플로잇을 방지 할 수 있습니다.
  • WordPress application
    WordPress 애플리케이션 그룹에는 WordPress 사이트와 관련된 취약성 악용과 관련된 요청 패턴을 차단하는 규칙이 포함되어 있습니다.

우선 WAF를 적용하고 Anonymous IP list를 제외한 나머지 Action을 Count로 적용해두었습니다. Count 모드로 탐지하여 운영상 문제가 있을 부분이 잡히는지 확인 후에 Block되도록 변경 예정입니다.

그러고보니 Anonymous IP list에 BLOCK된 로그가 있었는데 사진이 어디론가 사라지고 말았습니다. 따로 추가적인 모니터링 구성을 해주지 않으면 샘플 로그가 3시간까지밖에 남지않아 아쉽네요… 그래도 AWS WAF는 참 마음에 드는 기능인 듯합니다. (비용이 괜찮거든요…)


ManVSCloud

자, 그럼 이제 ManVSCloud 블로그가 어떻게 만들어져있고 어떻게 구성되어 있는지 알아보겠습니다.

아시다시피 제 블로그는 Amazon Web Services (AWS)를 이용하여 만들어졌습니다.
Apache + PHP + MariaDB와 WordPress로 웹 서비스를 운영 중입니다.

OS : Amazon Linux 2 x86_64
Apache : 2.4.46
PHP : 7.3.23
MariaDB : 10.4.13
(DB는 RDS 이용중입니다.)

아래 그림을 참고하여 조금 더 자세히 알아보도록 하겠습니다.

ManVSCloud Blog Architecture
(우클릭 후 ‘새 탭에서 이미지 열기’를 이용하면 이미지를 크게 볼 수 있습니다.)

아키텍처를 직접 그려보는 일이 없어 잘 그린 게 맞나싶네요…
일단 WAF를 제외하고 프리 티어를 최대한 활용하려 노력했습니다.
(물론 가용성은 조금 떨어집니다… )

Route53에 manvscloud.com 도메인을 등록하여 GEO Restriction을 이용해 중국에서는 제 블로그로 접속을 할 수 없지만 중국을 제외한 나머지 지역에서는 A레코드 별칭으로 저의 Application Load Balancer로 향하게 됩니다.

ALB 상단에서 WAF가 등록된 Rule에 따라 ALLOW/BLOCK 합니다.
허용된 접속자만 저의 블로그로 접속할 수 있게됩니다.
(참고로 ALB 쪽에서 ACM을 추가하여 SSL 인증서가 적용되도록 해두었습니다.)

ALB-보안그룹

무조건 ALB를 통해서만 접속이 가능하며 EC2 인스턴스로 80/443 접속이 불가능합니다.
현재 제 EC2 인스턴스에는 IAM 역할 하나와 2개의 보안그룹이 연결되어 있습니다.

보안그룹은 접속용 Admin 보안그룹(ssh, ftp 등)과 web 서버용 보안그룹(http,https)으로
나누어두었습니다.

인스턴스의 80,443는 Application Load Balancer만 연결되어있어 ALB를 제외한 다른 곳에서는 직접적인 접근이 접근이 불가능합니다.

그리고 연결되어 있는 IAM은 아래와 같이 되어있습니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "cloudwatch:PutMetricData",
                "ec2:DescribeTags",
                "cloudwatch:GetMetricStatistics",
                "cloudwatch:ListMetrics",
                "s3:*"
            ],
            "Resource": "*"
        }
    ]
}

CloudWatch가 EC2로 부터 Metric을 수집하여 대시보드로 추가적인 Report를 확인하였으며
경보를 추가하여 SNS에 등록된 구독자에게 E-mail로 알림을 보낼 수 있도록 설정 해둔 상태입니다.
제가 E-mail이 아닌 텔레그램을 이용하여 모바일로 알림을 받도록 설정하려 했는데 일정이 너무 빠듯하여 계속 미뤄지고 있네요…

S3도 추가해두었는데 이는 현재 진행중인 작업으로 mysqldump 와 특정 log 파일들을 S3로 백업하여 아카이브로 저장할 예정입니다.

마지막으로 블로그에 업로드되는 이미지들은 S3에 저장되고 해당 정적 이미지들은 Cloudfront를 이용하여 배포됩니다.

개발자 모드에서 확인해보시면 cdn.manvscloud.com 도메인으로 따로 이미지를 불러오고 있는 것을 알 수 있습니다.
ex) https://cdn.manvscloud.com/wp-content/uploads/2021/03/06075013/ncp-manvscloud-1024×562.png

최근 cloudfront에 Origin Shield를 적용하고 Hit가 상당히 많아졌습니다.
캐시를 이용하여 웹이 조금 더 빨라져 상당히 기분이 좋습니다.

현재 캐시 적중률 늘리기에 대해서도 포스팅 중인데 먼저 해결하려 했던
“Cloudfront + Lambda@Edge를 활용한 Image Resizing” 포스팅이 아직 잘 해결되지 않고 있어 늦춰지고 있습니다.

빠른 시일내에 포스팅 할 수 있도록 해보겠습니다.


Thanks to everyone

이번에 제 블로그 아키텍처를 그리며 참 많은 생각이 들었습니다.
AWS를 시작한지 1년이라는 시간이 지났습니다.

클라우드에 대해 궁금했고 AWS를 배워보고자 한 카카오톡 오픈채팅방에 들리게 되었습니다. 클라우드를 시작하기에 조금의 기반도 갖춰지지 않은 상태에서
“아마존 웹 서비스 AWS Discovery Book” 책을 하나 구매한 채 하나씩 따라해보았고
어느 날 “AWSKRUG – AWS 한국사용자모임 – 강남 비기너”에서 AWS 네트워크에 관련된 내용으로 스터디가 있어 참가하게 되었습니다.

당시 Master Seo님께서 많은 것을 알려주셨습니다.
많은 사람들 앞에서 그렇게 알려주시는 모습이 진짜 너무 멋있었습니다.
아마 그때부터 정말 열심히 해보자는 마음이 들게 되었던 것같습니다.

물론 당시 제 노트북의 OS가 한창 리눅스를 연습하고 싶어 리눅스를 설치해둔 상태라
ssh 접속하는 방법도 모르던 때다보니 제대로 따라가지 못한 것이 생각나네요.

이후 Master Seo님이 운영하시는 Brunch 블로그 URL을 외워가서 몇 번이고 다시 해보았었습니다. 정말 제가 클라우드를 시작할 때 많은 영향을 주신 분입니다.

그리고 또 한 번의 기회가 생깁니다.

제 스승님… 리눅서님이 우리 사당스터디를 모집하셨습니다.
이 스터디에서 참 많은 걸 배우게 됐습니다. 정말 많이요.
스터디원 모두에게 늘 감사하는 마음을 갖고있습니다.

여기서 첫 클라우드 자격증 SAA를 얻게되었으며 이후 참 많은 자격증을 따며 공부하였습니다. NCA, AZ-300, AZ-301, CLF, DBS…

블로그 아키텍처를 그려나가는데 문득 내가 언제 이런걸 할 수 있게 된거지?…라고 생각이 들며 조금 가슴이 뭉클해졌습니다.
1년이라는 시간동안 저를 어디까지 성장을 시켜주신 건지… ?

그리고 제가 요즘 많이 배우고 있는 AWS Network Online Study!!
제 매주 일요일의 행복입니다.

특히 가시다님의 8주차 WAF 강의는 정말 재밌으면서도 많은 도움되었던 강의 중에 하나입니다! 덕분에 블로그에 WAF를 추가할 수 있게 되었습니다.
벌써 8주차가 끝나버렸습니다.
11주차가 끝나버리면 이젠 매주 일요일 뭐할지 걱정되네요.

이상으로 제가 성장할 수 있도록 가르침을 주신 모든 분들께 감사의 인사올립니다.

긴 글 읽어주셔서 감사합니다.