์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿ›ก๏ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฉํ™”๋ฒฝ(WAF) ์„ค์ •๊ณผ ํ™œ์šฉ๋ฒ•: ๋‹น์‹ ์˜ ์›น์‚ฌ์ดํŠธ๋ฅผ ์ง€ํ‚ค๋Š” ์ตœ๊ฐ• ๋ฐฉํŒจ ๐Ÿš€

๐Ÿ›ก๏ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฉํ™”๋ฒฝ(WAF) ์„ค์ •๊ณผ ํ™œ์šฉ๋ฒ•: ๋‹น์‹ ์˜ ์›น์‚ฌ์ดํŠธ๋ฅผ ์ง€ํ‚ค๋Š” ์ตœ๊ฐ• ๋ฐฉํŒจ ๐Ÿš€

ํ•ด์ปค๋“ค์˜ ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณดํ˜ธํ•˜๋Š” ์‹ค์ „ ๊ฐ€์ด๋“œ

๐ŸŽฏ ์ด ๊ธ€์—์„œ ๋ฐฐ์šธ ๋‚ด์šฉ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฉํ™”๋ฒฝ(WAF)์€ ํ˜„๋Œ€ ์›น ๋ณด์•ˆ์˜ ํ•ต์‹ฌ ๋ฐฉ์–ด์„ ์ด์—์š”. SQL ์ธ์ ์…˜, XSS ๊ณต๊ฒฉ, DDoS ๋“ฑ ๋‹ค์–‘ํ•œ ์›น ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ์—ฌ๋Ÿฌ๋ถ„์˜ ์†Œ์ค‘ํ•œ ์„œ๋น„์Šค๋ฅผ ์ง€์ผœ์ฃผ๋Š” ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ ๋„๊ตฌ์ฃ . ์ด ๊ธ€์—์„œ๋Š” WAF์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ ์‹ค์ œ ์„ค์ • ๋ฐฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  ํšจ๊ณผ์ ์ธ ํ™œ์šฉ ์ „๋žต๊นŒ์ง€ ์นœ๊ตฌ์—๊ฒŒ ์„ค๋ช…ํ•˜๋“ฏ ์‰ฝ๊ณ  ์žฌ๋ฏธ์žˆ๊ฒŒ ์•Œ๋ ค๋“œ๋ฆด๊ฒŒ์š”! ๐Ÿ’ช

๐Ÿค” WAF๊ฐ€ ๋ญ๊ธธ๋ž˜ ์ด๋ ‡๊ฒŒ ์ค‘์š”ํ• ๊นŒ?

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฉํ™”๋ฒฝ(Web Application Firewall, WAF)์„ ์ดํ•ดํ•˜๋ ค๋ฉด ๋จผ์ € ์ผ๋ฐ˜ ๋ฐฉํ™”๋ฒฝ๊ณผ์˜ ์ฐจ์ด๋ฅผ ์•Œ์•„์•ผ ํ•ด์š”. ์ผ๋ฐ˜ ๋ฐฉํ™”๋ฒฝ์ด ๋„คํŠธ์›Œํฌ ๊ณ„์ธต์—์„œ IP ์ฃผ์†Œ์™€ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ํ•„ํ„ฐ๋งํ•œ๋‹ค๋ฉด, WAF๋Š” HTTP/HTTPS ํ”„๋กœํ† ์ฝœ ์ˆ˜์ค€์—์„œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ๋ถ„์„ํ•˜๊ณ  ์ฐจ๋‹จํ•˜๋Š” ํŠนํ™”๋œ ๋ณด์•ˆ ์†”๋ฃจ์…˜์ด์—์š”.

์ƒ๊ฐํ•ด๋ณด์„ธ์š”. ์—ฌ๋Ÿฌ๋ถ„์ด ์šด์˜ํ•˜๋Š” ์‡ผํ•‘๋ชฐ ์›น์‚ฌ์ดํŠธ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณผ๊ฒŒ์š”. ์ผ๋ฐ˜ ๋ฐฉํ™”๋ฒฝ์€ ๊ฑด๋ฌผ ์ž…๊ตฌ์˜ ๊ฒฝ๋น„์›์ฒ˜๋Ÿผ "์ด ์‚ฌ๋žŒ์€ ๋“ค์–ด์™€๋„ ๋˜๊ณ , ์ € ์‚ฌ๋žŒ์€ ์•ˆ ๋ผ"๋ผ๊ณ  ํŒ๋‹จํ•˜์ง€๋งŒ, WAF๋Š” ๊ฑด๋ฌผ ์•ˆ์—์„œ ๊ฐ ์ธต๋งˆ๋‹ค ๋ฐฐ์น˜๋œ ๋ณด์•ˆ์š”์›์ฒ˜๋Ÿผ "์ด ์‚ฌ๋žŒ์ด ํ•˜๋ ค๋Š” ํ–‰๋™์ด ์ •์ƒ์ ์ธ๊ฐ€? ์ˆ˜์ƒํ•œ๊ฐ€?"๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฒดํฌํ•˜๋Š” ๊ฑฐ์ฃ . ๐Ÿ•ต๏ธ

ํ•ด์ปค ์•…์˜์  ๊ณต๊ฒฉ ๐Ÿ’€ SQL Injection โš ๏ธ WAF ๋ฐฉํ™”๋ฒฝ ๐Ÿ›ก๏ธ ๊ณต๊ฒฉ ์ฐจ๋‹จ ์›น ์„œ๋ฒ„ ์•ˆ์ „ํ•œ ์„œ๋น„์Šค โœ“ ์ •์ƒ ํŠธ๋ž˜ํ”ฝ๋งŒ ๐Ÿ˜Š

๐Ÿ’ก ์žฌ๋Šฅ๋„ท TIP ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๋ณด์•ˆ ๋ถ„์•ผ์˜ ์ „๋ฌธ๊ฐ€๋ฅผ ์ฐพ๊ณ  ๊ณ„์‹ ๊ฐ€์š”? ์žฌ๋Šฅ๋„ท์—์„œ๋Š” WAF ์„ค์ •๋ถ€ํ„ฐ ์›น ๋ณด์•ˆ ์ปจ์„คํŒ…๊นŒ์ง€ ๋‹ค์–‘ํ•œ ๋ณด์•ˆ ์ „๋ฌธ๊ฐ€๋“ค์˜ ์žฌ๋Šฅ์„ ๋งŒ๋‚˜๋ณผ ์ˆ˜ ์žˆ์–ด์š”. ์‹ค์ „ ๊ฒฝํ—˜์ด ํ’๋ถ€ํ•œ ์ „๋ฌธ๊ฐ€๋“ค๊ณผ ํ•จ๊ป˜๋ผ๋ฉด ์—ฌ๋Ÿฌ๋ถ„์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋”์šฑ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค! ๐ŸŽ“

๐ŸŽฏ WAF๊ฐ€ ๋ง‰์•„์ฃผ๋Š” ์ฃผ์š” ๊ณต๊ฒฉ ์œ ํ˜•๋“ค

WAF๊ฐ€ ์–ด๋–ค ๊ณต๊ฒฉ๋“ค์„ ๋ฐฉ์–ดํ•˜๋Š”์ง€ ๊ตฌ์ฒด์ ์œผ๋กœ ์•Œ์•„๋ณผ๊นŒ์š”? ๊ฐ ๊ณต๊ฒฉ ์œ ํ˜•์„ ์ดํ•ดํ•˜๋ฉด WAF์˜ ์ค‘์š”์„ฑ์ด ๋”์šฑ ๋ช…ํ™•ํ•ด์งˆ ๊ฑฐ์˜ˆ์š”.

๐Ÿ”“ SQL ์ธ์ ์…˜ (SQL Injection)

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ์— ์•…์˜์ ์ธ SQL ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํƒˆ์ทจํ•˜๊ฑฐ๋‚˜ ์กฐ์ž‘ํ•˜๋Š” ๊ณต๊ฒฉ์ด์—์š”. ์˜ˆ๋ฅผ ๋“ค์–ด ๋กœ๊ทธ์ธ ํผ์— ' OR '1'='1 ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด์„œ ์ธ์ฆ์„ ์šฐํšŒํ•˜๋ ค๋Š” ์‹œ๋„์ฃ .

WAF ๋ฐฉ์–ด ๋ฐฉ์‹: SQL ๊ตฌ๋ฌธ ํŒจํ„ด์„ ๋ถ„์„ํ•˜๊ณ  ์˜์‹ฌ์Šค๋Ÿฌ์šด ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์„ ์ฐจ๋‹จํ•ด์š”.

โšก ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์Šคํฌ๋ฆฝํŒ… (XSS)

์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์›นํŽ˜์ด์ง€์— ์‚ฝ์ž…ํ•˜์—ฌ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ณต๊ฒฉ์ด์—์š”. ์‚ฌ์šฉ์ž์˜ ์ฟ ํ‚ค๋‚˜ ์„ธ์…˜ ์ •๋ณด๋ฅผ ํƒˆ์ทจํ•  ์ˆ˜ ์žˆ์–ด ๋งค์šฐ ์œ„ํ—˜ํ•ด์š”.

WAF ๋ฐฉ์–ด ๋ฐฉ์‹: JavaScript ์ฝ”๋“œ ํŒจํ„ด์„ ๊ฐ์ง€ํ•˜๊ณ  HTML ํƒœ๊ทธ ์‚ฝ์ž… ์‹œ๋„๋ฅผ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

๐ŸŒŠ DDoS ๊ณต๊ฒฉ

๋Œ€๋Ÿ‰์˜ ํŠธ๋ž˜ํ”ฝ์„ ๋™์‹œ์— ๋ฐœ์ƒ์‹œ์ผœ ์„œ๋ฒ„๋ฅผ ๋งˆ๋น„์‹œํ‚ค๋Š” ๊ณต๊ฒฉ์ด์—์š”. ์ •์ƒ์ ์ธ ์‚ฌ์šฉ์ž๋“ค์ด ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฑฐ์ฃ .

WAF ๋ฐฉ์–ด ๋ฐฉ์‹: ๋น„์ •์ƒ์ ์ธ ํŠธ๋ž˜ํ”ฝ ํŒจํ„ด์„ ๊ฐ์ง€ํ•˜๊ณ  ์š”์ฒญ ์†๋„๋ฅผ ์ œํ•œ(Rate Limiting)ํ•ด์š”.

๐Ÿ“ ํŒŒ์ผ ์—…๋กœ๋“œ ๊ณต๊ฒฉ

์•…์„ฑ ํŒŒ์ผ์„ ์„œ๋ฒ„์— ์—…๋กœ๋“œํ•˜์—ฌ ์‹œ์Šคํ…œ์„ ์žฅ์•…ํ•˜๋ ค๋Š” ์‹œ๋„์˜ˆ์š”. ์›น์‰˜(Web Shell)์„ ์—…๋กœ๋“œํ•ด์„œ ์„œ๋ฒ„๋ฅผ ์›๊ฒฉ ์ œ์–ดํ•˜๋ ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์š”.

WAF ๋ฐฉ์–ด ๋ฐฉ์‹: ํŒŒ์ผ ํ™•์žฅ์ž, MIME ํƒ€์ž…, ํŒŒ์ผ ๋‚ด์šฉ์„ ๊ฒ€์‚ฌํ•˜์—ฌ ์˜์‹ฌ์Šค๋Ÿฌ์šด ์—…๋กœ๋“œ๋ฅผ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ” ๋””๋ ‰ํ† ๋ฆฌ ํŠธ๋ž˜๋ฒ„์„ค

URL ๊ฒฝ๋กœ ์กฐ์ž‘์„ ํ†ตํ•ด ์„œ๋ฒ„์˜ ๋ฏผ๊ฐํ•œ ํŒŒ์ผ์— ์ ‘๊ทผํ•˜๋ ค๋Š” ๊ณต๊ฒฉ์ด์—์š”. ../../etc/passwd ๊ฐ™์€ ๊ฒฝ๋กœ๋กœ ์‹œ์Šคํ…œ ํŒŒ์ผ์„ ์ฝ์œผ๋ ค๊ณ  ์‹œ๋„ํ•˜์ฃ .

WAF ๋ฐฉ์–ด ๋ฐฉ์‹: ๊ฒฝ๋กœ ๋ฌธ์ž์—ด ํŒจํ„ด์„ ๋ถ„์„ํ•˜๊ณ  ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ ์ ‘๊ทผ ์‹œ๋„๋ฅผ ์ฐจ๋‹จํ•ด์š”.

๐ŸŽญ ์„ธ์…˜ ํ•˜์ด์žฌํ‚น

์ •์ƒ ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜ ID๋ฅผ ํƒˆ์ทจํ•˜์—ฌ ํ•ด๋‹น ์‚ฌ์šฉ์ž๋กœ ์œ„์žฅํ•˜๋Š” ๊ณต๊ฒฉ์ด์—์š”. ๋กœ๊ทธ์ธ ์—†์ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๊ณ„์ •์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฑฐ์ฃ .

WAF ๋ฐฉ์–ด ๋ฐฉ์‹: ์„ธ์…˜ ์ฟ ํ‚ค์˜ ๋น„์ •์ƒ์ ์ธ ์‚ฌ์šฉ ํŒจํ„ด์„ ๊ฐ์ง€ํ•˜๊ณ  ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

โš ๏ธ ์ฃผ์˜์‚ฌํ•ญ WAF๋Š” ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ ๋„๊ตฌ์ง€๋งŒ ๋งŒ๋Šฅ์€ ์•„๋‹ˆ์—์š”. WAF๋งŒ์œผ๋กœ๋Š” 100% ์™„๋ฒฝํ•œ ๋ณด์•ˆ์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ์•ˆ์ „ํ•œ ์ฝ”๋”ฉ ๊ด€ํ–‰, ์ •๊ธฐ์ ์ธ ๋ณด์•ˆ ์—…๋ฐ์ดํŠธ, ์นจํˆฌ ํ…Œ์ŠคํŠธ ๋“ฑ ๋‹ค์ธต์ ์ธ ๋ณด์•ˆ ์ „๋žต์ด ํ•จ๊ป˜ ํ•„์š”ํ•ด์š”. WAF๋Š” ๋ณด์•ˆ์˜ ํ•œ ์ธต(Layer)์ผ ๋ฟ์ด๋ผ๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”! ๐ŸŽฏ

๐Ÿ—๏ธ WAF์˜ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ์™€ ์ž‘๋™ ์›๋ฆฌ

WAF๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋“ค์—ฌ๋‹ค๋ณผ๊นŒ์š”? ๋ณต์žกํ•ด ๋ณด์ด์ง€๋งŒ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋ฉด ์„ค์ •๊ณผ ๊ด€๋ฆฌ๊ฐ€ ํ›จ์”ฌ ์‰ฌ์›Œ์ ธ์š”.

๐Ÿ“‹ 1. ๊ทœ์น™ ์—”์ง„ (Rule Engine)

WAF์˜ ๋‘๋‡Œ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด์—์š”. ๋ฏธ๋ฆฌ ์ •์˜๋œ ๊ทœ์น™(Rule)๋“ค์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋“ค์–ด์˜ค๋Š” HTTP ์š”์ฒญ์„ ๋ถ„์„ํ•˜๊ณ  ํŒ๋‹จํ•ด์š”. ๊ทœ์น™์€ ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€ ์œ ํ˜•์œผ๋กœ ๋‚˜๋‰˜์–ด์š”:

๐Ÿ”น ์‹œ๊ทธ๋‹ˆ์ฒ˜ ๊ธฐ๋ฐ˜ ๊ทœ์น™ (Signature-based Rules)

์•Œ๋ ค์ง„ ๊ณต๊ฒฉ ํŒจํ„ด์˜ ํŠน์ง•(์‹œ๊ทธ๋‹ˆ์ฒ˜)์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šคํ™”ํ•ด์„œ ๋งค์นญํ•˜๋Š” ๋ฐฉ์‹์ด์—์š”. ์˜ˆ๋ฅผ ๋“ค์–ด SQL ์ธ์ ์…˜ ๊ณต๊ฒฉ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” UNION SELECT, DROP TABLE ๊ฐ™์€ ํ‚ค์›Œ๋“œ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๊ฑฐ์ฃ .

์žฅ์ : ๋น ๋ฅด๊ณ  ์ •ํ™•ํ•˜๋ฉฐ ์˜คํƒ(False Positive)์ด ์ ์–ด์š”.
๋‹จ์ : ์ƒˆ๋กœ์šด ๊ณต๊ฒฉ ๊ธฐ๋ฒ•(Zero-day)์—๋Š” ๋Œ€์‘ํ•˜๊ธฐ ์–ด๋ ค์›Œ์š”.

๐Ÿ”น ํ–‰์œ„ ๊ธฐ๋ฐ˜ ๊ทœ์น™ (Behavior-based Rules)

์ •์ƒ์ ์ธ ํŠธ๋ž˜ํ”ฝ ํŒจํ„ด์„ ํ•™์Šตํ•˜๊ณ , ์ด์ƒ ํ–‰์œ„(Anomaly)๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋ฐฉ์‹์ด์—์š”. ์˜ˆ๋ฅผ ๋“ค์–ด ํ‰์†Œ์—๋Š” ์ดˆ๋‹น 10๊ฐœ์˜ ์š”์ฒญ์„ ๋ณด๋‚ด๋˜ IP๊ฐ€ ๊ฐ‘์ž๊ธฐ ์ดˆ๋‹น 1000๊ฐœ์˜ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ์˜์‹ฌ์Šค๋Ÿฝ๋‹ค๊ณ  ํŒ๋‹จํ•˜๋Š” ๊ฑฐ์ฃ .

์žฅ์ : ์•Œ๋ ค์ง€์ง€ ์•Š์€ ์ƒˆ๋กœ์šด ๊ณต๊ฒฉ๋„ ํƒ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์š”.
๋‹จ์ : ํ•™์Šต ๊ธฐ๊ฐ„์ด ํ•„์š”ํ•˜๊ณ  ์˜คํƒ๋ฅ ์ด ๋†’์„ ์ˆ˜ ์žˆ์–ด์š”.

๐Ÿ”น ํ‰ํŒ ๊ธฐ๋ฐ˜ ๊ทœ์น™ (Reputation-based Rules)

IP ์ฃผ์†Œ, ๋„๋ฉ”์ธ, URL์˜ ํ‰ํŒ ์ •๋ณด๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด์—์š”. ์ด๋ฏธ ์•…์„ฑ์œผ๋กœ ์•Œ๋ ค์ง„ IP ์ฃผ์†Œ๋‚˜ ๋ด‡๋„ท์—์„œ ์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ์„ ์ฐจ๋‹จํ•˜๋Š” ๊ฑฐ์ฃ .

์žฅ์ : ์•Œ๋ ค์ง„ ์•…์„ฑ ์†Œ์Šค๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์–ด์š”.
๋‹จ์ : ํ‰ํŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ตœ์‹ ์„ฑ์ด ์ค‘์š”ํ•ด์š”.

๐Ÿ” 2. ํŠธ๋ž˜ํ”ฝ ๋ถ„์„ ์—”์ง„

HTTP/HTTPS ์š”์ฒญ์˜ ๋ชจ๋“  ๋ถ€๋ถ„์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ๋ถ„์„ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ˆ์š”. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์š”์†Œ๋“ค์„ ๊ฒ€์‚ฌํ•ด์š”:

๊ฒ€์‚ฌ ๋Œ€์ƒ ์„ค๋ช… ์˜ˆ์‹œ
HTTP ํ—ค๋” ์š”์ฒญ ํ—ค๋”์˜ ๊ตฌ์กฐ์™€ ๋‚ด์šฉ์„ ๊ฒ€์‚ฌ User-Agent, Referer, Cookie ๋“ฑ
URL ํŒŒ๋ผ๋ฏธํ„ฐ ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์˜ ๊ฐ’๊ณผ ํŒจํ„ด ๋ถ„์„ ?id=1&name=test
POST ๋ฐ์ดํ„ฐ ์š”์ฒญ ๋ณธ๋ฌธ(Body)์˜ ๋‚ด์šฉ ๊ฒ€์‚ฌ ํผ ๋ฐ์ดํ„ฐ, JSON, XML ๋“ฑ
์ฟ ํ‚ค ์ฟ ํ‚ค ๊ฐ’์˜ ๋ฌด๊ฒฐ์„ฑ๊ณผ ์œ ํšจ์„ฑ ๊ฒ€์ฆ ์„ธ์…˜ ID, ์ธ์ฆ ํ† ํฐ ๋“ฑ
ํŒŒ์ผ ์—…๋กœ๋“œ ์—…๋กœ๋“œ๋˜๋Š” ํŒŒ์ผ์˜ ํƒ€์ž…๊ณผ ๋‚ด์šฉ ๊ฒ€์‚ฌ ํ™•์žฅ์ž, MIME ํƒ€์ž…, ํŒŒ์ผ ๋‚ด์šฉ

โš™๏ธ 3. ์ •์ฑ… ๊ด€๋ฆฌ ์‹œ์Šคํ…œ

๋ณด์•ˆ ์ •์ฑ…์„ ์ •์˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์ด์—์š”. ๊ด€๋ฆฌ์ž๋Š” ์—ฌ๊ธฐ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ค์ •์„ ํ•  ์ˆ˜ ์žˆ์–ด์š”:

๐ŸŽš๏ธ ๋ณด์•ˆ ๋ ˆ๋ฒจ ์„ค์ •
- Paranoid (ํŽธ์ง‘์ฆ ๋ชจ๋“œ): ๋งค์šฐ ์—„๊ฒฉํ•œ ๊ฒ€์‚ฌ, ์˜คํƒ ๊ฐ€๋Šฅ์„ฑ ๋†’์Œ
- High (๋†’์Œ): ์—„๊ฒฉํ•œ ๋ณด์•ˆ, ์ผ๋ถ€ ์ •์ƒ ํŠธ๋ž˜ํ”ฝ ์ฐจ๋‹จ ๊ฐ€๋Šฅ
- Medium (์ค‘๊ฐ„): ๊ท ํ˜•์žกํžŒ ๋ณด์•ˆ, ๋Œ€๋ถ€๋ถ„์˜ ํ™˜๊ฒฝ์— ์ ํ•ฉ
- Low (๋‚ฎ์Œ): ๋А์Šจํ•œ ๋ณด์•ˆ, ๋ช…ํ™•ํ•œ ๊ณต๊ฒฉ๋งŒ ์ฐจ๋‹จ

๐ŸŽญ ๋™์ž‘ ๋ชจ๋“œ ์„ค์ •
- Detection Only (ํƒ์ง€๋งŒ): ๊ณต๊ฒฉ์„ ํƒ์ง€ํ•˜๊ณ  ๋กœ๊ทธ๋งŒ ๊ธฐ๋ก, ์ฐจ๋‹จํ•˜์ง€ ์•Š์Œ
- Prevention (์ฐจ๋‹จ): ๊ณต๊ฒฉ์„ ํƒ์ง€ํ•˜๊ณ  ์ฆ‰์‹œ ์ฐจ๋‹จ
- Learning (ํ•™์Šต): ์ •์ƒ ํŠธ๋ž˜ํ”ฝ ํŒจํ„ด์„ ํ•™์Šตํ•˜๋Š” ๋ชจ๋“œ

๐Ÿ“Š 4. ๋กœ๊น… ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ

๋ชจ๋“  ๋ณด์•ˆ ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ์‹œ์Šคํ…œ์ด์—์š”. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •๋ณด๋“ค์ด ๋กœ๊ทธ์— ๊ธฐ๋ก๋ผ์š”:

[2024-01-15 14:23:45] ALERT - SQL Injection Detected
Source IP: 192.168.1.100
Target URL: /login.php?id=1' OR '1'='1
Rule ID: 981242
Action: BLOCKED
Severity: CRITICAL
Request Headers: {
  "User-Agent": "Mozilla/5.0...",
  "Referer": "http://attacker.com"
}

์ด๋Ÿฐ ๋กœ๊ทธ๋ฅผ ๋ถ„์„ํ•˜๋ฉด ๊ณต๊ฒฉ ํŒจํ„ด์„ ํŒŒ์•…ํ•˜๊ณ  ๋ณด์•ˆ ์ •์ฑ…์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์–ด์š”. ๐Ÿ“ˆ

๐Ÿš€ WAF ๋ฐฐํฌ ๋ฐฉ์‹: ์–ด๋–ค ๊ฑธ ์„ ํƒํ•ด์•ผ ํ• ๊นŒ?

WAF๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€๊ฐ€ ์žˆ์–ด์š”. ๊ฐ๊ฐ์˜ ์žฅ๋‹จ์ ์„ ๋น„๊ตํ•ด์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ํ™˜๊ฒฝ์— ๋งž๋Š” ๋ฐฉ์‹์„ ์„ ํƒํ•˜์„ธ์š”!

โ˜๏ธ ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ WAF (Cloud-based WAF)

AWS WAF, Cloudflare, Akamai ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค ํ˜•ํƒœ๋กœ ์ œ๊ณต๋˜๋Š” WAF์˜ˆ์š”. ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๊ณ  ๊ตฌ์ถ•์ด ์‰ฌ์šด ๋ฐฉ์‹์ด์ฃ .

โœ… ์žฅ์ :
โ€ข ๋น ๋ฅธ ๊ตฌ์ถ•: DNS๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ช‡ ๋ถ„ ์•ˆ์— ์ ์šฉ ๊ฐ€๋Šฅํ•ด์š”
โ€ข ๊ด€๋ฆฌ ํŽธ์˜์„ฑ: ์ธํ”„๋ผ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š” ์—†๊ณ  ์ž๋™ ์—…๋ฐ์ดํŠธ๋ผ์š”
โ€ข ํ™•์žฅ์„ฑ: ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€์— ์ž๋™์œผ๋กœ ๋Œ€์‘ํ•ด์š”
โ€ข ๊ธ€๋กœ๋ฒŒ ๋„คํŠธ์›Œํฌ: ์ „ ์„ธ๊ณ„ ์—ฃ์ง€ ์„œ๋ฒ„๋ฅผ ํ†ตํ•œ ๋น ๋ฅธ ์‘๋‹ต
โ€ข DDoS ๋ฐฉ์–ด: ๋Œ€๊ทœ๋ชจ DDoS ๊ณต๊ฒฉ๋„ ํšจ๊ณผ์ ์œผ๋กœ ๋ฐฉ์–ดํ•ด์š”

โŒ ๋‹จ์ :
โ€ข ๋น„์šฉ: ํŠธ๋ž˜ํ”ฝ์— ๋”ฐ๋ผ ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด์š”
โ€ข ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ์ œํ•œ: ์„ธ๋ฐ€ํ•œ ์„ค์ •์— ํ•œ๊ณ„๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์–ด์š”
โ€ข ๋ฐ์ดํ„ฐ ํ”„๋ผ์ด๋ฒ„์‹œ: ๋ชจ๋“  ํŠธ๋ž˜ํ”ฝ์ด ์ œ3์ž๋ฅผ ๊ฑฐ์ณ๊ฐ€์š”
โ€ข ๋ฒค๋” ์ข…์†: ํŠน์ • ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค์— ์˜์กดํ•˜๊ฒŒ ๋ผ์š”

๐Ÿ’ฐ ๋น„์šฉ ์˜ˆ์‹œ:
- AWS WAF: ์›น ACL๋‹น $5/์›” + ๊ทœ์น™๋‹น $1/์›” + ์š”์ฒญ 100๋งŒ ๊ฑด๋‹น $0.60
- Cloudflare: ๋ฌด๋ฃŒ ํ”Œ๋žœ๋ถ€ํ„ฐ Enterprise๊นŒ์ง€ ๋‹ค์–‘
- Akamai: ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰, ๋งž์ถคํ˜• ๊ฐ€๊ฒฉ

๐ŸŽฏ ์ถ”์ฒœ ๋Œ€์ƒ: ์ค‘์†Œ๊ทœ๋ชจ ์›น์‚ฌ์ดํŠธ, ๋น ๋ฅธ ๊ตฌ์ถ•์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ๊ด€๋ฆฌ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ถ€์กฑํ•œ ํŒ€

๐Ÿ–ฅ๏ธ ์˜จํ”„๋ ˆ๋ฏธ์Šค WAF (On-premise WAF)

์ž์ฒด ๋ฐ์ดํ„ฐ์„ผํ„ฐ์— ํ•˜๋“œ์›จ์–ด ์–ดํ”Œ๋ผ์ด์–ธ์Šค๋‚˜ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ์‹์ด์—์š”. F5, Imperva, Barracuda ๊ฐ™์€ ์ œํ’ˆ๋“ค์ด ์žˆ์–ด์š”.

โœ… ์žฅ์ :
โ€ข ์™„์ „ํ•œ ์ œ์–ด: ๋ชจ๋“  ์„ค์ •์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๊ฐ€๋Šฅํ•ด์š”
โ€ข ๋ฐ์ดํ„ฐ ๋ณด์•ˆ: ํŠธ๋ž˜ํ”ฝ์ด ์™ธ๋ถ€๋กœ ๋‚˜๊ฐ€์ง€ ์•Š์•„์š”
โ€ข ๊ทœ์ • ์ค€์ˆ˜: ๊ธˆ์œต, ์˜๋ฃŒ ๋“ฑ ์—„๊ฒฉํ•œ ๊ทœ์ œ ์‚ฐ์—…์— ์ ํ•ฉํ•ด์š”
โ€ข ์„ฑ๋Šฅ ์ตœ์ ํ™”: ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ์— ์ตœ์ ํ™”๋œ ์„ฑ๋Šฅ
โ€ข ์ผํšŒ์„ฑ ๋น„์šฉ: ์ดˆ๊ธฐ ํˆฌ์ž ํ›„ ์ถ”๊ฐ€ ๋น„์šฉ์ด ์ ์–ด์š”

โŒ ๋‹จ์ :
โ€ข ๋†’์€ ์ดˆ๊ธฐ ๋น„์šฉ: ํ•˜๋“œ์›จ์–ด์™€ ๋ผ์ด์„ ์Šค ๋น„์šฉ์ด ๋น„์‹ธ์š”
โ€ข ๊ด€๋ฆฌ ๋ถ€๋‹ด: ์ „๋ฌธ ์ธ๋ ฅ์ด ํ•„์š”ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๋ณต์žกํ•ด์š”
โ€ข ํ™•์žฅ์„ฑ ์ œํ•œ: ํ•˜๋“œ์›จ์–ด ์šฉ๋Ÿ‰์— ์ œํ•œ์ด ์žˆ์–ด์š”
โ€ข ์—…๋ฐ์ดํŠธ: ์ˆ˜๋™์œผ๋กœ ํŒจ์น˜์™€ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•ด์š”
โ€ข ๊ตฌ์ถ• ์‹œ๊ฐ„: ์„ค์น˜์™€ ์„ค์ •์— ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ ค์š”

๐Ÿ’ฐ ๋น„์šฉ ์˜ˆ์‹œ:
- F5 BIG-IP ASM: $10,000 ~ $100,000+ (์šฉ๋Ÿ‰์— ๋”ฐ๋ผ)
- Imperva SecureSphere: $15,000 ~ $50,000+
- ์—ฐ๊ฐ„ ์œ ์ง€๋ณด์ˆ˜: ์ดˆ๊ธฐ ๋น„์šฉ์˜ 15-20%

๐ŸŽฏ ์ถ”์ฒœ ๋Œ€์ƒ: ๋Œ€๊ธฐ์—…, ๊ธˆ์œต/์˜๋ฃŒ ๊ธฐ๊ด€, ๋†’์€ ๋ณด์•ˆ ์š”๊ตฌ์‚ฌํ•ญ, ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ

๐Ÿ”ง ํ˜ธ์ŠคํŠธ ๊ธฐ๋ฐ˜ WAF (Host-based WAF)

์›น ์„œ๋ฒ„์— ์ง์ ‘ ์„ค์น˜ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ํ˜•ํƒœ์˜ WAF์˜ˆ์š”. ModSecurity๊ฐ€ ๋Œ€ํ‘œ์ ์ธ ์˜คํ”ˆ์†Œ์Šค ์†”๋ฃจ์…˜์ด์ฃ .

โœ… ์žฅ์ :
โ€ข ์ €๋ ดํ•œ ๋น„์šฉ: ์˜คํ”ˆ์†Œ์Šค๋Š” ๋ฌด๋ฃŒ, ์ƒ์šฉ๋„ ์ €๋ ดํ•ด์š”
โ€ข ๊นŠ์€ ํ†ตํ•ฉ: ์›น ์„œ๋ฒ„์™€ ๊ธด๋ฐ€ํ•˜๊ฒŒ ํ†ตํ•ฉ๋ผ์š”
โ€ข ์„ธ๋ฐ€ํ•œ ์ œ์–ด: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ ์ •๋ฐ€ํ•œ ์ œ์–ด ๊ฐ€๋Šฅ
โ€ข ํ•™์Šต ๊ธฐํšŒ: ์ง์ ‘ ์„ค์ •ํ•˜๋ฉด์„œ ๋ณด์•ˆ ์ง€์‹์„ ์Œ“์„ ์ˆ˜ ์žˆ์–ด์š”
โ€ข ์˜คํ”„๋ผ์ธ ํ™˜๊ฒฝ: ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ ์—†์ด๋„ ์ž‘๋™ํ•ด์š”

โŒ ๋‹จ์ :
โ€ข ์„œ๋ฒ„ ๋ฆฌ์†Œ์Šค: CPU์™€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ถ”๊ฐ€๋กœ ์†Œ๋น„ํ•ด์š”
โ€ข ๊ด€๋ฆฌ ๋ณต์žก๋„: ๊ฐ ์„œ๋ฒ„๋งˆ๋‹ค ๊ฐœ๋ณ„ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•ด์š”
โ€ข ์ „๋ฌธ ์ง€์‹: ์„ค์ •๊ณผ ํŠœ๋‹์— ์ „๋ฌธ ์ง€์‹์ด ํ•„์š”ํ•ด์š”
โ€ข DDoS ์ทจ์•ฝ: ๋Œ€๊ทœ๋ชจ DDoS ๊ณต๊ฒฉ์—๋Š” ํšจ๊ณผ๊ฐ€ ์ œํ•œ์ ์ด์—์š”
โ€ข ํ™•์žฅ์„ฑ: ์„œ๋ฒ„๊ฐ€ ๋งŽ์•„์ง€๋ฉด ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›Œ์ ธ์š”

๐Ÿ’ฐ ๋น„์šฉ ์˜ˆ์‹œ:
- ModSecurity: ๋ฌด๋ฃŒ (์˜คํ”ˆ์†Œ์Šค)
- NAXSI: ๋ฌด๋ฃŒ (์˜คํ”ˆ์†Œ์Šค)
- ์ƒ์šฉ ์†”๋ฃจ์…˜: $500 ~ $5,000/์„œ๋ฒ„

๐ŸŽฏ ์ถ”์ฒœ ๋Œ€์ƒ: ์Šคํƒ€ํŠธ์—…, ๊ฐœ๋ฐœ์ž, ํ•™์Šต ๋ชฉ์ , ์˜ˆ์‚ฐ์ด ์ œํ•œ์ ์ธ ๊ฒฝ์šฐ, ์†Œ๊ทœ๋ชจ ์„œ๋ฒ„ ํ™˜๊ฒฝ

ํด๋ผ์šฐ๋“œ WAF โ˜๏ธ ๋น ๋ฅธ ๊ตฌ์ถ• ์ž๋™ ํ™•์žฅ ๊ด€๋ฆฌ ํŽธ์˜์„ฑ ์ถ”์ฒœ ๋Œ€์ƒ ์ค‘์†Œ๊ทœ๋ชจ ์›น์‚ฌ์ดํŠธ ๋น„์šฉ ์›” $10 ~ $1000+ โญโญโญโญโญ ์ธ๊ธฐ๋„ ์˜จํ”„๋ ˆ๋ฏธ์Šค WAF ๐Ÿ–ฅ๏ธ ์™„์ „ํ•œ ์ œ์–ด ๋ฐ์ดํ„ฐ ๋ณด์•ˆ ๊ทœ์ • ์ค€์ˆ˜ ์ถ”์ฒœ ๋Œ€์ƒ ๋Œ€๊ธฐ์—…, ๊ธˆ์œต/์˜๋ฃŒ ๋น„์šฉ $10,000 ~ $100,000+ โญโญโญ ์ธ๊ธฐ๋„ ํ˜ธ์ŠคํŠธ ๊ธฐ๋ฐ˜ WAF ๐Ÿ”ง ์ €๋ ดํ•œ ๋น„์šฉ ๊นŠ์€ ํ†ตํ•ฉ ํ•™์Šต ๊ธฐํšŒ ์ถ”์ฒœ ๋Œ€์ƒ ์Šคํƒ€ํŠธ์—…, ๊ฐœ๋ฐœ์ž ๋น„์šฉ ๋ฌด๋ฃŒ ~ $5,000 โญโญโญโญ ์ธ๊ธฐ๋„

โšก ์‹ค์ „! ModSecurity๋กœ WAF ๊ตฌ์ถ•ํ•˜๊ธฐ

์ด์ œ ์‹ค์ œ๋กœ WAF๋ฅผ ์„ค์ •ํ•ด๋ณผ๊นŒ์š”? ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ์˜คํ”ˆ์†Œ์Šค WAF์ธ ModSecurity๋ฅผ Apache ์›น ์„œ๋ฒ„์— ์„ค์น˜ํ•˜๋Š” ๊ณผ์ •์„ ๋‹จ๊ณ„๋ณ„๋กœ ์•Œ์•„๋ณผ๊ฒŒ์š”. ๐Ÿ› ๏ธ

๐Ÿ“ฆ 1๋‹จ๊ณ„: ModSecurity ์„ค์น˜

Ubuntu/Debian ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์—์„œ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์—์š”:

# ํŒจํ‚ค์ง€ ์—…๋ฐ์ดํŠธ
sudo apt update

# Apache์™€ ModSecurity ์„ค์น˜
sudo apt install apache2 libapache2-mod-security2 -y

# ModSecurity ๋ชจ๋“ˆ ํ™œ์„ฑํ™”
sudo a2enmod security2

# Apache ์žฌ์‹œ์ž‘
sudo systemctl restart apache2

# ์„ค์น˜ ํ™•์ธ
apachectl -M | grep security

๋งˆ์ง€๋ง‰ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ security2_module์ด ๋ณด์ด๋ฉด ์„ฑ๊ณต์ด์—์š”! ๐ŸŽ‰

โš™๏ธ 2๋‹จ๊ณ„: ๊ธฐ๋ณธ ์„ค์ • ํŒŒ์ผ ๊ตฌ์„ฑ

ModSecurity์˜ ์„ค์ • ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜๊ณ  ๊ธฐ๋ณธ ์„ค์ •์„ ํ•ด๋ณผ๊ฒŒ์š”:

# ๊ธฐ๋ณธ ์„ค์ • ํŒŒ์ผ ๋ณต์‚ฌ
sudo cp /etc/modsecurity/modsecurity.conf-recommended \
       /etc/modsecurity/modsecurity.conf

# ์„ค์ • ํŒŒ์ผ ํŽธ์ง‘
sudo nano /etc/modsecurity/modsecurity.conf

์„ค์ • ํŒŒ์ผ์—์„œ ์ค‘์š”ํ•œ ๋ถ€๋ถ„๋“ค์„ ์‚ดํŽด๋ณผ๊นŒ์š”:

# ๋ณด์•ˆ ์—”์ง„ ํ™œ์„ฑํ™” (DetectionOnly์—์„œ On์œผ๋กœ ๋ณ€๊ฒฝ)
SecRuleEngine On

# ์š”์ฒญ ๋ณธ๋ฌธ ๊ฒ€์‚ฌ ํ™œ์„ฑํ™”
SecRequestBodyAccess On

# ์‘๋‹ต ๋ณธ๋ฌธ ๊ฒ€์‚ฌ ํ™œ์„ฑํ™” (์„ฑ๋Šฅ ์˜ํ–ฅ ์žˆ์Œ, ํ•„์š”์‹œ์—๋งŒ)
SecResponseBodyAccess Off

# ์ตœ๋Œ€ ์š”์ฒญ ๋ณธ๋ฌธ ํฌ๊ธฐ (13MB)
SecRequestBodyLimit 13107200

# ํŒŒ์ผ ์—…๋กœ๋“œ ํฌ๊ธฐ ์ œํ•œ (100MB)
SecRequestBodyNoFilesLimit 131072

# ๋กœ๊ทธ ๋””๋ ‰ํ† ๋ฆฌ ์„ค์ •
SecAuditLog /var/log/apache2/modsec_audit.log

# ๋กœ๊ทธ ๋ ˆ๋ฒจ (0=์—†์Œ, 9=๋ชจ๋‘)
SecAuditLogRelevantStatus "^(?:5|4(?!04))"

# ๋””๋ฒ„๊ทธ ๋กœ๊ทธ (๋ฌธ์ œ ํ•ด๊ฒฐ์‹œ ์œ ์šฉ)
SecDebugLog /var/log/apache2/modsec_debug.log
SecDebugLogLevel 0

๐Ÿ’ก Pro Tip ์ฒ˜์Œ์—๋Š” SecRuleEngine DetectionOnly๋กœ ์„ค์ •ํ•ด์„œ ์‹ค์ œ๋กœ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ณ  ๋กœ๊ทธ๋งŒ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ด์š”. ์ •์ƒ ํŠธ๋ž˜ํ”ฝ์ด ์ฐจ๋‹จ๋˜๋Š” ์˜คํƒ(False Positive)์„ ํ™•์ธํ•˜๊ณ  ๊ทœ์น™์„ ํŠœ๋‹ํ•œ ํ›„์— On์œผ๋กœ ๋ณ€๊ฒฝํ•˜์„ธ์š”! ๐ŸŽฏ

๐Ÿ“š 3๋‹จ๊ณ„: OWASP Core Rule Set (CRS) ์„ค์น˜

OWASP CRS๋Š” ModSecurity๋ฅผ ์œ„ํ•œ ํฌ๊ด„์ ์ธ ๋ณด์•ˆ ๊ทœ์น™ ์„ธํŠธ์˜ˆ์š”. ๋Œ€๋ถ€๋ถ„์˜ ์ผ๋ฐ˜์ ์ธ ์›น ๊ณต๊ฒฉ์„ ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ทœ์น™๋“ค์ด ํฌํ•จ๋˜์–ด ์žˆ์ฃ :

# CRS ๋‹ค์šด๋กœ๋“œ
cd /tmp
wget https://github.com/coreruleset/coreruleset/archive/v3.3.4.tar.gz

# ์••์ถ• ํ•ด์ œ
tar -xvzf v3.3.4.tar.gz

# ModSecurity ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™
sudo mv coreruleset-3.3.4 /etc/modsecurity/crs

# ๊ธฐ๋ณธ ์„ค์ • ํŒŒ์ผ ๋ณต์‚ฌ
cd /etc/modsecurity/crs
sudo cp crs-setup.conf.example crs-setup.conf

# Apache ์„ค์ •์— CRS ํฌํ•จ
sudo nano /etc/apache2/mods-enabled/security2.conf

security2.conf ํŒŒ์ผ์— ๋‹ค์Œ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”:

<IfModule security2_module>
    # ModSecurity ๊ธฐ๋ณธ ์„ค์ •
    Include /etc/modsecurity/modsecurity.conf
    
    # OWASP CRS ์„ค์ •
    Include /etc/modsecurity/crs/crs-setup.conf
    Include /etc/modsecurity/crs/rules/*.conf
</IfModule>

๐ŸŽจ 4๋‹จ๊ณ„: ๋ณด์•ˆ ๋ ˆ๋ฒจ ์„ค์ • (Paranoia Level)

CRS๋Š” Paranoia Level์ด๋ผ๋Š” ๊ฐœ๋…์œผ๋กœ ๋ณด์•ˆ ๊ฐ•๋„๋ฅผ ์กฐ์ ˆํ•ด์š”. ๋ ˆ๋ฒจ์ด ๋†’์„์ˆ˜๋ก ๋” ๋งŽ์€ ๊ทœ์น™์ด ํ™œ์„ฑํ™”๋˜์ง€๋งŒ ์˜คํƒ ๊ฐ€๋Šฅ์„ฑ๋„ ๋†’์•„์ ธ์š”:

# crs-setup.conf ํŒŒ์ผ ํŽธ์ง‘
sudo nano /etc/modsecurity/crs/crs-setup.conf

# Paranoia Level ์„ค์ • (1~4)
# Level 1: ๊ธฐ๋ณธ, ๋Œ€๋ถ€๋ถ„์˜ ํ™˜๊ฒฝ์— ์ ํ•ฉ
# Level 2: ์ถ”๊ฐ€ ๋ณด์•ˆ, ์ผ๋ถ€ ์˜คํƒ ๊ฐ€๋Šฅ
# Level 3: ๋†’์€ ๋ณด์•ˆ, ์˜คํƒ ์ฃผ์˜ ํ•„์š”
# Level 4: ์ตœ๊ณ  ๋ณด์•ˆ, ๋งŽ์€ ์˜คํƒ ์˜ˆ์ƒ

SecAction \
  "id:900000,\
   phase:1,\
   nolog,\
   pass,\
   t:none,\
   setvar:tx.paranoia_level=1"

๐Ÿ”ง 5๋‹จ๊ณ„: ์ปค์Šคํ…€ ๊ทœ์น™ ์ž‘์„ฑ

์ž์‹ ๋งŒ์˜ ๋ณด์•ˆ ๊ทœ์น™์„ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ์–ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด ํŠน์ • IP๋ฅผ ์ฐจ๋‹จํ•˜๊ฑฐ๋‚˜ ํŠน์ • URL ํŒจํ„ด์„ ๋ณดํ˜ธํ•˜๋Š” ๊ทœ์น™์„ ๋งŒ๋“ค์–ด๋ณผ๊ฒŒ์š”:

# ์ปค์Šคํ…€ ๊ทœ์น™ ํŒŒ์ผ ์ƒ์„ฑ
sudo nano /etc/modsecurity/custom-rules.conf

๋‹ค์Œ์€ ์œ ์šฉํ•œ ์ปค์Šคํ…€ ๊ทœ์น™ ์˜ˆ์‹œ๋“ค์ด์—์š”:

# 1. ํŠน์ • IP ์ฃผ์†Œ ์ฐจ๋‹จ
SecRule REMOTE_ADDR "@ipMatch 192.168.1.100" \
    "id:1001,\
     phase:1,\
     deny,\
     status:403,\
     log,\
     msg:'Blocked IP address'"

# 2. SQL ์ธ์ ์…˜ ํŒจํ„ด ๊ฐ์ง€
SecRule ARGS "@rx (?i)(union.*select|insert.*into|delete.*from)" \
    "id:1002,\
     phase:2,\
     deny,\
     status:403,\
     log,\
     msg:'SQL Injection attempt detected'"

# 3. ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€ ์ ‘๊ทผ ์ œํ•œ (ํŠน์ • IP๋งŒ ํ—ˆ์šฉ)
SecRule REQUEST_URI "@beginsWith /admin" \
    "id:1003,\
     phase:1,\
     chain,\
     deny,\
     status:403,\
     log,\
     msg:'Admin access denied'"
    SecRule REMOTE_ADDR "!@ipMatch 10.0.0.0/8"

# 4. ํŒŒ์ผ ์—…๋กœ๋“œ ํ™•์žฅ์ž ์ œํ•œ
SecRule FILES_NAMES "@rx (?i)\.(php|exe|sh|bat)$" \
    "id:1004,\
     phase:2,\
     deny,\
     status:403,\
     log,\
     msg:'Dangerous file upload blocked'"

# 5. Rate Limiting (์ดˆ๋‹น ์š”์ฒญ ์ œํ•œ)
SecAction "id:1005,\
           phase:1,\
           nolog,\
           pass,\
           initcol:ip=%{REMOTE_ADDR}"

SecRule IP:REQUEST_COUNT "@gt 100" \
    "id:1006,\
     phase:1,\
     deny,\
     status:429,\
     log,\
     msg:'Rate limit exceeded',\
     setvar:ip.request_count=+1"

# 6. User-Agent ๊ฒ€์‚ฌ (๋ด‡ ์ฐจ๋‹จ)
SecRule REQUEST_HEADERS:User-Agent "@rx (?i)(bot|crawler|spider|scraper)" \
    "id:1007,\
     phase:1,\
     deny,\
     status:403,\
     log,\
     msg:'Bot detected and blocked'"

# 7. XSS ๊ณต๊ฒฉ ํŒจํ„ด ๊ฐ์ง€
SecRule ARGS "@rx (?i)(<script|javascript:|onerror=|onload=)" \
    "id:1008,\
     phase:2,\
     deny,\
     status:403,\
     log,\
     msg:'XSS attack detected'"

์ปค์Šคํ…€ ๊ทœ์น™์„ Apache ์„ค์ •์— ํฌํ•จ์‹œํ‚ค์„ธ์š”:

sudo nano /etc/apache2/mods-enabled/security2.conf

# ๋‹ค์Œ ์ค„ ์ถ”๊ฐ€
Include /etc/modsecurity/custom-rules.conf

๐Ÿงช 6๋‹จ๊ณ„: ํ…Œ์ŠคํŠธ ๋ฐ ๊ฒ€์ฆ

์„ค์ •์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•ด๋ณผ๊นŒ์š”:

# Apache ์„ค์ • ๋ฌธ๋ฒ• ๊ฒ€์‚ฌ
sudo apachectl configtest

# ๋ฌธ์ œ๊ฐ€ ์—†์œผ๋ฉด Apache ์žฌ์‹œ์ž‘
sudo systemctl restart apache2

# ๋กœ๊ทธ ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง
sudo tail -f /var/log/apache2/modsec_audit.log

์ด์ œ ์‹ค์ œ ๊ณต๊ฒฉ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ด์„œ WAF๊ฐ€ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•ด๋ด์š”:

# SQL ์ธ์ ์…˜ ํ…Œ์ŠคํŠธ
curl "http://your-domain.com/test?id=1' OR '1'='1"

# XSS ํ…Œ์ŠคํŠธ
curl "http://your-domain.com/test?name=<script>alert('XSS')</script>"

# ๋””๋ ‰ํ† ๋ฆฌ ํŠธ๋ž˜๋ฒ„์„ค ํ…Œ์ŠคํŠธ
curl "http://your-domain.com/../../etc/passwd"

์ด๋Ÿฐ ์š”์ฒญ๋“ค์ด ์ฐจ๋‹จ๋˜๊ณ  ๋กœ๊ทธ์— ๊ธฐ๋ก๋˜๋ฉด ์„ฑ๊ณต์ด์—์š”! ๐ŸŽŠ

โš ๏ธ ์ค‘์š”ํ•œ ์ฃผ์˜์‚ฌํ•ญ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธํ•˜์ง€ ๋งˆ์„ธ์š”! ์‹ค์ œ ์„œ๋น„์Šค ์ค‘์ธ ์›น์‚ฌ์ดํŠธ์—์„œ ๊ณต๊ฒฉ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ํ•˜๋ฉด ์ •์ƒ ์‚ฌ์šฉ์ž์—๊ฒŒ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์–ด์š”. ๋ฐ˜๋“œ์‹œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด๋‚˜ ์Šคํ…Œ์ด์ง• ํ™˜๊ฒฝ์—์„œ ์ถฉ๋ถ„ํžˆ ํ…Œ์ŠคํŠธํ•œ ํ›„์— ํ”„๋กœ๋•์…˜์— ์ ์šฉํ•˜์„ธ์š”. ๐Ÿšจ

โ˜๏ธ AWS WAF ์„ค์ • ๊ฐ€์ด๋“œ

ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” AWS WAF ์„ค์ • ๋ฐฉ๋ฒ•๋„ ์•Œ์•„๋ณผ๊ฒŒ์š”. AWS WAF๋Š” CloudFront, Application Load Balancer(ALB), API Gateway์™€ ํ†ตํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

๐ŸŽฌ 1๋‹จ๊ณ„: Web ACL ์ƒ์„ฑ

AWS Management Console์—์„œ WAF & Shield ์„œ๋น„์Šค๋กœ ์ด๋™ํ•œ ํ›„:

1๏ธโƒฃ Web ACL ์ƒ์„ฑ ์‹œ์ž‘
โ€ข "Create web ACL" ๋ฒ„ํŠผ ํด๋ฆญ
โ€ข Name: ์˜ˆ) my-web-app-waf
โ€ข CloudWatch metric name: ์ž๋™ ์ƒ์„ฑ๋จ
โ€ข Resource type: CloudFront ๋˜๋Š” Regional resources ์„ ํƒ
โ€ข Region: ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ๋Š” ๋ฆฌ์ „ ์„ ํƒ (CloudFront๋Š” Global)

2๏ธโƒฃ ๋ณดํ˜ธํ•  ๋ฆฌ์†Œ์Šค ์—ฐ๊ฒฐ
โ€ข Add AWS resources ํด๋ฆญ
โ€ข ALB, CloudFront distribution, ๋˜๋Š” API Gateway ์„ ํƒ
โ€ข ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค๋ฅผ ๋™์‹œ์— ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ์–ด์š”

๐Ÿ“‹ 2๋‹จ๊ณ„: ๊ทœ์น™ ์ถ”๊ฐ€

AWS WAF๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด์š”:

๐Ÿ›ก๏ธ AWS Managed Rules ์‚ฌ์šฉ (์ถ”์ฒœ)

AWS๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์‚ฌ์ „ ๊ตฌ์„ฑ๋œ ๊ทœ์น™ ์„ธํŠธ์˜ˆ์š”. ๊ฐ€์žฅ ์‰ฝ๊ณ  ๋น ๋ฅธ ๋ฐฉ๋ฒ•์ด์ฃ :

โ€ข Core rule set (CRS): OWASP Top 10 ์œ„ํ˜‘ ๋ฐฉ์–ด
โ€ข Known bad inputs: ์•Œ๋ ค์ง„ ์•…์„ฑ ์ž…๋ ฅ ์ฐจ๋‹จ
โ€ข SQL database: SQL ์ธ์ ์…˜ ๋ฐฉ์–ด
โ€ข Linux operating system: Linux ๊ด€๋ จ ๊ณต๊ฒฉ ๋ฐฉ์–ด
โ€ข PHP application: PHP ์ทจ์•ฝ์  ๋ฐฉ์–ด
โ€ข WordPress application: WordPress ํŠนํ™” ๋ณดํ˜ธ

Add rules โ†’ Add managed rule groups โ†’ AWS managed rule groups์—์„œ ํ•„์š”ํ•œ ๊ทœ์น™ ์„ ํƒ

โœ๏ธ ์ปค์Šคํ…€ ๊ทœ์น™ ์ž‘์„ฑ

์ž์‹ ๋งŒ์˜ ๊ทœ์น™์„ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์–ด์š”. ์˜ˆ์‹œ๋ฅผ ๋ณผ๊นŒ์š”:

# IP ๊ธฐ๋ฐ˜ ์ฐจ๋‹จ ๊ทœ์น™
{
  "Name": "BlockSpecificIP",
  "Priority": 1,
  "Statement": {
    "IPSetReferenceStatement": {
      "Arn": "arn:aws:wafv2:region:account:regional/ipset/blocked-ips/..."
    }
  },
  "Action": {
    "Block": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "BlockSpecificIP"
  }
}

# Rate limiting ๊ทœ์น™
{
  "Name": "RateLimitRule",
  "Priority": 2,
  "Statement": {
    "RateBasedStatement": {
      "Limit": 2000,
      "AggregateKeyType": "IP"
    }
  },
  "Action": {
    "Block": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "RateLimitRule"
  }
}

# ํŠน์ • ๊ฒฝ๋กœ ๋ณดํ˜ธ ๊ทœ์น™
{
  "Name": "ProtectAdminPath",
  "Priority": 3,
  "Statement": {
    "AndStatement": {
      "Statements": [
        {
          "ByteMatchStatement": {
            "SearchString": "/admin",
            "FieldToMatch": {
              "UriPath": {}
            },
            "TextTransformations": [
              {
                "Priority": 0,
                "Type": "LOWERCASE"
              }
            ],
            "PositionalConstraint": "STARTS_WITH"
          }
        },
        {
          "NotStatement": {
            "Statement": {
              "IPSetReferenceStatement": {
                "Arn": "arn:aws:wafv2:region:account:regional/ipset/admin-ips/..."
              }
            }
          }
        }
      ]
    }
  },
  "Action": {
    "Block": {}
  }
}

โš™๏ธ 3๋‹จ๊ณ„: ๊ธฐ๋ณธ ๋™์ž‘ ์„ค์ •

๊ทœ์น™์— ๋งค์นญ๋˜์ง€ ์•Š๋Š” ์š”์ฒญ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ๋™์ž‘์„ ์„ค์ •ํ•ด์š”:

โ€ข Allow: ๋ชจ๋“  ํŠธ๋ž˜ํ”ฝ ํ—ˆ์šฉ (๊ทœ์น™์œผ๋กœ ์ฐจ๋‹จํ•  ๊ฒƒ๋งŒ ์ฐจ๋‹จ)
โ€ข Block: ๋ชจ๋“  ํŠธ๋ž˜ํ”ฝ ์ฐจ๋‹จ (๊ทœ์น™์œผ๋กœ ํ—ˆ์šฉํ•  ๊ฒƒ๋งŒ ํ—ˆ์šฉ)

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ Allow๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๊ณ , ํŠน์ • ๊ณต๊ฒฉ ํŒจํ„ด๋งŒ ์ฐจ๋‹จํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์š”.

๐Ÿ“Š 4๋‹จ๊ณ„: ๋กœ๊น… ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ์„ค์ •

AWS WAF์˜ ํ™œ๋™์„ ์ถ”์ ํ•˜๊ณ  ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•œ ๋กœ๊น…์„ ์„ค์ •ํ•ด์š”:

# CloudWatch Logs๋กœ ๋กœ๊น… ์„ค์ •
aws wafv2 put-logging-configuration \
  --logging-configuration \
    ResourceArn=arn:aws:wafv2:region:account:regional/webacl/...,\
    LogDestinationConfigs=arn:aws:logs:region:account:log-group:aws-waf-logs-...

# S3๋กœ ๋กœ๊น… (Kinesis Data Firehose ์‚ฌ์šฉ)
aws wafv2 put-logging-configuration \
  --logging-configuration \
    ResourceArn=arn:aws:wafv2:region:account:regional/webacl/...,\
    LogDestinationConfigs=arn:aws:firehose:region:account:deliverystream/aws-waf-logs-...

CloudWatch์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”ํŠธ๋ฆญ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์–ด์š”:

โ€ข AllowedRequests: ํ—ˆ์šฉ๋œ ์š”์ฒญ ์ˆ˜
โ€ข BlockedRequests: ์ฐจ๋‹จ๋œ ์š”์ฒญ ์ˆ˜
โ€ข CountedRequests: ์นด์šดํŠธ๋งŒ ๋œ ์š”์ฒญ ์ˆ˜
โ€ข PassedRequests: ๊ทœ์น™ ํ‰๊ฐ€๋ฅผ ํ†ต๊ณผํ•œ ์š”์ฒญ ์ˆ˜

๐ŸŽฏ 5๋‹จ๊ณ„: ์‹ค์ „ ์˜ˆ์‹œ - ์™„์ „ํ•œ Web ACL ๊ตฌ์„ฑ

์‹ค์ œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์™„์ „ํ•œ Web ACL ๊ตฌ์„ฑ ์˜ˆ์‹œ์˜ˆ์š”:

{
  "Name": "ProductionWebACL",
  "Scope": "REGIONAL",
  "DefaultAction": {
    "Allow": {}
  },
  "Rules": [
    {
      "Name": "AWSManagedRulesCommonRuleSet",
      "Priority": 1,
      "Statement": {
        "ManagedRuleGroupStatement": {
          "VendorName": "AWS",
          "Name": "AWSManagedRulesCommonRuleSet",
          "ExcludedRules": []
        }
      },
      "OverrideAction": {
        "None": {}
      },
      "VisibilityConfig": {
        "SampledRequestsEnabled": true,
        "CloudWatchMetricsEnabled": true,
        "MetricName": "AWSManagedRulesCommonRuleSet"
      }
    },
    {
      "Name": "AWSManagedRulesKnownBadInputsRuleSet",
      "Priority": 2,
      "Statement": {
        "ManagedRuleGroupStatement": {
          "VendorName": "AWS",
          "Name": "AWSManagedRulesKnownBadInputsRuleSet"
        }
      },
      "OverrideAction": {
        "None": {}
      },
      "VisibilityConfig": {
        "SampledRequestsEnabled": true,
        "CloudWatchMetricsEnabled": true,
        "MetricName": "AWSManagedRulesKnownBadInputsRuleSet"
      }
    },
    {
      "Name": "RateLimitPerIP",
      "Priority": 3,
      "Statement": {
        "RateBasedStatement": {
          "Limit": 2000,
          "AggregateKeyType": "IP"
        }
      },
      "Action": {
        "Block": {
          "CustomResponse": {
            "ResponseCode": 429,
            "CustomResponseBodyKey": "rate-limit-exceeded"
          }
        }
      },
      "VisibilityConfig": {
        "SampledRequestsEnabled": true,
        "CloudWatchMetricsEnabled": true,
        "MetricName": "RateLimitPerIP"
      }
    },
    {
      "Name": "GeoBlockingRule",
      "Priority": 4,
      "Statement": {
        "GeoMatchStatement": {
          "CountryCodes": ["CN", "RU", "KP"]
        }
      },
      "Action": {
        "Block": {}
      },
      "VisibilityConfig": {
        "SampledRequestsEnabled": true,
        "CloudWatchMetricsEnabled": true,
        "MetricName": "GeoBlockingRule"
      }
    }
  ],
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "ProductionWebACL"
  }
}

๐Ÿ’ฐ ๋น„์šฉ ์ตœ์ ํ™” ํŒ AWS WAF๋Š” ์‚ฌ์šฉ๋Ÿ‰ ๊ธฐ๋ฐ˜ ๊ณผ๊ธˆ์ด์—์š”:
โ€ข Web ACL: $5/์›”
โ€ข ๊ทœ์น™: $1/์›” per rule
โ€ข ์š”์ฒญ: $0.60 per 1 million requests

๋น„์šฉ์„ ์ ˆ๊ฐํ•˜๋ ค๋ฉด ๋ถˆํ•„์š”ํ•œ ๊ทœ์น™์„ ์ œ๊ฑฐํ•˜๊ณ , CloudFront ์บ์‹ฑ์„ ์ ๊ทน ํ™œ์šฉํ•ด์„œ WAF๋กœ ์ „๋‹ฌ๋˜๋Š” ์š”์ฒญ ์ˆ˜๋ฅผ ์ค„์ด์„ธ์š”! ๐Ÿ’ธ

๐Ÿ” WAF ๋กœ๊ทธ ๋ถ„์„๊ณผ ํŠœ๋‹

WAF๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•ด์š”. ์ง€์†์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ํŠœ๋‹์ด ํ•„์š”ํ•˜์ฃ . ๋กœ๊ทธ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์˜คํƒ์„ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณผ๊ฒŒ์š”! ๐Ÿ“ˆ

๐Ÿ“Š ๋กœ๊ทธ ๋ถ„์„์˜ ์ค‘์š”์„ฑ

WAF ๋กœ๊ทธ๋ฅผ ๋ถ„์„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ธ์‚ฌ์ดํŠธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์–ด์š”:

โ€ข ๊ณต๊ฒฉ ํŒจํ„ด ํŒŒ์•…: ์–ด๋–ค ์ข…๋ฅ˜์˜ ๊ณต๊ฒฉ์ด ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š”์ง€
โ€ข ์˜คํƒ ๋ฐœ๊ฒฌ: ์ •์ƒ ํŠธ๋ž˜ํ”ฝ์ด ์ž˜๋ชป ์ฐจ๋‹จ๋˜๋Š” ๊ฒฝ์šฐ ์‹๋ณ„
โ€ข ๊ทœ์น™ ํšจ๊ณผ์„ฑ: ๊ฐ ๊ทœ์น™์ด ์‹ค์ œ๋กœ ์–ผ๋งˆ๋‚˜ ์œ ์šฉํ•œ์ง€ ํ‰๊ฐ€
โ€ข ํŠธ๋ Œ๋“œ ๋ถ„์„: ์‹œ๊ฐ„๋Œ€๋ณ„, ์ง€์—ญ๋ณ„ ๊ณต๊ฒฉ ํŠธ๋ Œ๋“œ ํŒŒ์•…
โ€ข ๋ณด์•ˆ ์ •์ฑ… ๊ฐœ์„ : ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜์˜ ๋ณด์•ˆ ์ •์ฑ… ์ˆ˜๋ฆฝ

๐Ÿ”Ž ModSecurity ๋กœ๊ทธ ๋ถ„์„

ModSecurity์˜ ๊ฐ์‚ฌ ๋กœ๊ทธ(Audit Log)๋Š” JSON ํ˜•์‹์œผ๋กœ ์ €์žฅ๋ผ์š”. ์‹ค์ œ ๋กœ๊ทธ ์˜ˆ์‹œ๋ฅผ ๋ณผ๊นŒ์š”:

{
  "transaction": {
    "time": "15/Jan/2024:14:23:45 +0000",
    "transaction_id": "YbJQ8CoAAQEAAHi-AAAAAA",
    "remote_address": "192.168.1.100",
    "remote_port": 54321
  },
  "request": {
    "method": "GET",
    "http_version": "HTTP/1.1",
    "uri": "/login.php?id=1' OR '1'='1",
    "headers": {
      "Host": "example.com",
      "User-Agent": "Mozilla/5.0...",
      "Accept": "*/*"
    }
  },
  "response": {
    "status": 403,
    "protocol": "HTTP/1.1"
  },
  "audit_data": {
    "messages": [
      {
        "message": "SQL Injection Attack Detected",
        "data": "Matched Data: ' OR '1'='1 found within ARGS:id",
        "file": "/etc/modsecurity/crs/rules/REQUEST-942-APPLICATION-ATTACK-SQLI.conf",
        "line": "1234",
        "id": "942100",
        "severity": "CRITICAL",
        "tags": ["OWASP_CRS", "SQLI"]
      }
    ]
  }
}

์ด ๋กœ๊ทธ๋ฅผ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•œ ์œ ์šฉํ•œ ๋ช…๋ น์–ด๋“ค์ด์—์š”:

# ๊ฐ€์žฅ ๋งŽ์ด ์ฐจ๋‹จ๋œ IP ์ฃผ์†Œ Top 10
cat /var/log/apache2/modsec_audit.log | \
  grep -oP '"remote_address":\s*"\K[^"]+' | \
  sort | uniq -c | sort -rn | head -10

# ๊ฐ€์žฅ ๋งŽ์ด ํŠธ๋ฆฌ๊ฑฐ๋œ ๊ทœ์น™ ID
cat /var/log/apache2/modsec_audit.log | \
  grep -oP '"id":\s*"\K[^"]+' | \
  sort | uniq -c | sort -rn | head -10

# ์‹œ๊ฐ„๋Œ€๋ณ„ ๊ณต๊ฒฉ ๋นˆ๋„
cat /var/log/apache2/modsec_audit.log | \
  grep -oP '"time":\s*"\K[^:]+' | \
  cut -d'/' -f1 | \
  sort | uniq -c

# ํŠน์ • ๊ทœ์น™ ID๋กœ ํ•„ํ„ฐ๋ง
cat /var/log/apache2/modsec_audit.log | \
  jq 'select(.audit_data.messages[].id == "942100")'

# ์ฐจ๋‹จ๋œ ์š”์ฒญ์˜ URI ํŒจํ„ด ๋ถ„์„
cat /var/log/apache2/modsec_audit.log | \
  grep -oP '"uri":\s*"\K[^"]+' | \
  sort | uniq -c | sort -rn | head -20

๐ŸŽจ ์˜คํƒ(False Positive) ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•

์ •์ƒ์ ์ธ ํŠธ๋ž˜ํ”ฝ์ด ์ฐจ๋‹จ๋˜๋Š” ์˜คํƒ์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ•ด์น˜๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ํ•ด๊ฒฐํ•ด์•ผ ํ•ด์š”. ์˜คํƒ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์š”:

๋ฐฉ๋ฒ• 1: ํŠน์ • ๊ทœ์น™ ๋น„ํ™œ์„ฑํ™”

ํŠน์ • ๊ทœ์น™์ด ๊ณ„์† ์˜คํƒ์„ ์ผ์œผํ‚จ๋‹ค๋ฉด ํ•ด๋‹น ๊ทœ์น™์„ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์–ด์š”:

# ModSecurity ์„ค์ • ํŒŒ์ผ์— ์ถ”๊ฐ€
# ๊ทœ์น™ ID 942100์„ ๋น„ํ™œ์„ฑํ™”
SecRuleRemoveById 942100

# ์—ฌ๋Ÿฌ ๊ทœ์น™์„ ํ•œ๋ฒˆ์— ๋น„ํ™œ์„ฑํ™”
SecRuleRemoveById 942100 942110 942120

๋ฐฉ๋ฒ• 2: ํŠน์ • URL์— ๋Œ€ํ•ด ๊ทœ์น™ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

ํŠน์ • ๊ฒฝ๋กœ์—์„œ๋งŒ ๊ทœ์น™์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด:

# /api/upload ๊ฒฝ๋กœ์—์„œ๋งŒ ํŒŒ์ผ ์—…๋กœ๋“œ ๊ทœ์น™ ๋น„ํ™œ์„ฑํ™”
SecRule REQUEST_URI "@beginsWith /api/upload" \
    "id:1100,\
     phase:1,\
     nolog,\
     pass,\
     ctl:ruleRemoveById=942100"

# /search ๊ฒฝ๋กœ์—์„œ SQL ์ธ์ ์…˜ ๊ทœ์น™ ์™„ํ™”
SecRule REQUEST_URI "@beginsWith /search" \
    "id:1101,\
     phase:1,\
     nolog,\
     pass,\
     ctl:ruleRemoveTargetById=942100;ARGS:query"

๋ฐฉ๋ฒ• 3: ํŠน์ • ํŒŒ๋ผ๋ฏธํ„ฐ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ

ํŠน์ • ํŒŒ๋ผ๋ฏธํ„ฐ์—์„œ๋งŒ ๊ทœ์น™์„ ์ ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด:

# 'content' ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” HTML ํƒœ๊ทธ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ XSS ๊ทœ์น™ ์ œ์™ธ
SecRuleUpdateTargetById 941100 "!ARGS:content"

# ์—ฌ๋Ÿฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ์ œ์™ธ
SecRuleUpdateTargetById 941100 "!ARGS:content" "!ARGS:description"

๋ฐฉ๋ฒ• 4: IP ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ

์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” IP ์ฃผ์†Œ๋Š” WAF ๊ฒ€์‚ฌ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์–ด์š”:

# ํŠน์ • IP ์ฃผ์†Œ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ
SecRule REMOTE_ADDR "@ipMatch 10.0.0.0/8,172.16.0.0/12" \
    "id:1200,\
     phase:1,\
     nolog,\
     pass,\
     ctl:ruleEngine=Off"

# ํŠน์ • IP์—์„œ ์˜ค๋Š” ์š”์ฒญ์€ ๋ชจ๋“  ๊ทœ์น™ ๋น„ํ™œ์„ฑํ™”
SecRule REMOTE_ADDR "@ipMatchFromFile /etc/modsecurity/whitelist-ips.txt" \
    "id:1201,\
     phase:1,\
     nolog,\
     pass,\
     ctl:ruleEngine=Off"

๐Ÿ“ˆ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ์ตœ์ ํ™”

WAF๋Š” ๋ชจ๋“  HTTP ์š”์ฒญ์„ ๊ฒ€์‚ฌํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์–ด์š”. ์„ฑ๋Šฅ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์—์š”:

# Apache ์ƒํƒœ ๋ชจ๋“ˆ ํ™œ์„ฑํ™”
sudo a2enmod status

# server-status ํŽ˜์ด์ง€ ์„ค์ •
sudo nano /etc/apache2/mods-enabled/status.conf

status.conf์— ๋‹ค์Œ ๋‚ด์šฉ ์ถ”๊ฐ€:

<Location "/server-status">
    SetHandler server-status
    Require ip 127.0.0.1
</Location>

์ด์ œ http://localhost/server-status์—์„œ ์‹ค์‹œ๊ฐ„ ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.

์„ฑ๋Šฅ ์ตœ์ ํ™” ํŒ:

โ€ข ์‘๋‹ต ๋ณธ๋ฌธ ๊ฒ€์‚ฌ ๋น„ํ™œ์„ฑํ™”: SecResponseBodyAccess Off (ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋งŒ On)
โ€ข ๋กœ๊ทธ ๋ ˆ๋ฒจ ์กฐ์ •: ํ”„๋กœ๋•์…˜์—์„œ๋Š” SecDebugLogLevel 0
โ€ข ๋ถˆํ•„์š”ํ•œ ๊ทœ์น™ ์ œ๊ฑฐ: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” CRS ๊ทœ์น™ ํŒŒ์ผ ์ œ์™ธ
โ€ข ์ •๊ทœํ‘œํ˜„์‹ ์ตœ์ ํ™”: ๋ณต์žกํ•œ ์ •๊ทœํ‘œํ˜„์‹์€ ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์ฃผ๋ฒ”
โ€ข ์บ์‹ฑ ํ™œ์šฉ: ์ •์  ์ฝ˜ํ…์ธ ๋Š” WAF ๊ฒ€์‚ฌ ์ „์— ์บ์‹œ์—์„œ ์„œ๋น™

WAF ์„ฑ๋Šฅ ์˜ํ–ฅ ๋น„๊ต WAF ์—†์Œ 100ms WAF ์ตœ์ ํ™” 120ms WAF ๊ณผ๋„ํ•œ ์„ค์ • 250ms ๋น ๋ฆ„ โšก ์ ์ • โœ“ ๋А๋ฆผ ๐ŸŒ ์ตœ์ ํ™” ์ฒดํฌ๋ฆฌ์ŠคํŠธ: ์‘๋‹ต ๋ณธ๋ฌธ ๊ฒ€์‚ฌ ๋น„ํ™œ์„ฑํ™” ๋””๋ฒ„๊ทธ ๋กœ๊ทธ ๋ ˆ๋ฒจ 0์œผ๋กœ ์„ค์ • ๋ถˆํ•„์š”ํ•œ ๊ทœ์น™ ์ œ๊ฑฐ ์ •์  ์ฝ˜ํ…์ธ  ์บ์‹ฑ ํ™œ์šฉ ์ •๊ทœํ‘œํ˜„์‹ ์ตœ์ ํ™” ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ์ ๊ทน ํ™œ์šฉ ๋ณด์•ˆ ๋ ˆ๋ฒจ ์ ์ ˆํžˆ ์กฐ์ • ์ฃผ๊ธฐ์ ์ธ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง

๐Ÿ› ๏ธ ๊ณ ๊ธ‰ WAF ํ™œ์šฉ ์ „๋žต

๊ธฐ๋ณธ์ ์ธ ์„ค์ •์„ ๋„˜์–ด์„œ WAF๋ฅผ ๋”์šฑ ํšจ๊ณผ์ ์œผ๋กœ ํ™œ์šฉํ•˜๋Š” ๊ณ ๊ธ‰ ์ „๋žต๋“ค์„ ์•Œ์•„๋ณผ๊ฒŒ์š”! ๐Ÿš€

๐Ÿค– ๋จธ์‹ ๋Ÿฌ๋‹ ๊ธฐ๋ฐ˜ ์œ„ํ˜‘ ํƒ์ง€

์ตœ์‹  WAF ์†”๋ฃจ์…˜๋“ค์€ ๋จธ์‹ ๋Ÿฌ๋‹์„ ํ™œ์šฉํ•ด์„œ ์ƒˆ๋กœ์šด ๊ณต๊ฒฉ ํŒจํ„ด์„ ์ž๋™์œผ๋กœ ํ•™์Šตํ•˜๊ณ  ํƒ์ง€ํ•ด์š”. AWS WAF์˜ ๊ฒฝ์šฐ Fraud Control์ด๋‚˜ Bot Control ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ฃ .

AWS WAF Bot Control ์„ค์ • ์˜ˆ์‹œ:

{
  "Name": "BotControlRule",
  "Priority": 10,
  "Statement": {
    "ManagedRuleGroupStatement": {
      "VendorName": "AWS",
      "Name": "AWSManagedRulesBotControlRuleSet",
      "ManagedRuleGroupConfigs": [
        {
          "AWSManagedRulesBotControlRuleSet": {
            "InspectionLevel": "COMMON"
          }
        }
      ]
    }
  },
  "OverrideAction": {
    "None": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "BotControlRule"
  }
}

์ด ๊ทœ์น™์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ด‡๋“ค์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ์ฐจ๋‹จํ•ด์š”:
โ€ข ๊ฒ€์ƒ‰ ์—”์ง„ ํฌ๋กค๋Ÿฌ (ํ—ˆ์šฉ ๊ฐ€๋Šฅ)
โ€ข ์•…์„ฑ ์Šคํฌ๋ž˜ํผ
โ€ข ์ž๋™ํ™”๋œ ๊ณต๊ฒฉ ๋„๊ตฌ
โ€ข ๊ณ„์ • ํƒˆ์ทจ ์‹œ๋„ ๋ด‡
โ€ข ์žฌ๊ณ  ํ™•์ธ ๋ด‡ (์Šค๋‹ˆ์ปค ๋ด‡ ๋“ฑ)

๐Ÿ” API ๋ณด์•ˆ ๊ฐ•ํ™”

RESTful API๋‚˜ GraphQL API๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•œ ํŠน๋ณ„ํ•œ WAF ์„ค์ •์ด ํ•„์š”ํ•ด์š”:

API ์ „์šฉ ๋ณด์•ˆ ๊ทœ์น™:

# JSON ํŽ˜์ด๋กœ๋“œ ํฌ๊ธฐ ์ œํ•œ
SecRule REQUEST_HEADERS:Content-Type "@contains application/json" \
    "id:2001,\
     phase:1,\
     chain,\
     pass,\
     nolog"
    SecRule REQUEST_BODY "@gt 1048576" \
        "deny,\
         status:413,\
         msg:'JSON payload too large'"

# API ํ‚ค ๊ฒ€์ฆ
SecRule REQUEST_URI "@beginsWith /api/" \
    "id:2002,\
     phase:1,\
     chain,\
     deny,\
     status:401,\
     msg:'Missing or invalid API key'"
    SecRule &REQUEST_HEADERS:X-API-Key "@eq 0"

# Rate limiting (API๋ณ„๋กœ ๋‹ค๋ฅธ ์ œํ•œ)
SecRule REQUEST_URI "@beginsWith /api/public" \
    "id:2003,\
     phase:1,\
     pass,\
     nolog,\
     setvar:tx.rate_limit=100"

SecRule REQUEST_URI "@beginsWith /api/premium" \
    "id:2004,\
     phase:1,\
     pass,\
     nolog,\
     setvar:tx.rate_limit=1000"

# GraphQL ์ฟผ๋ฆฌ ๊นŠ์ด ์ œํ•œ
SecRule REQUEST_BODY "@rx \"query\".*\{.*\{.*\{.*\{.*\{" \
    "id:2005,\
     phase:2,\
     deny,\
     status:400,\
     msg:'GraphQL query too deep'"

# SQL ์ธ์ ์…˜ (JSON ํŽ˜์ด๋กœ๋“œ ๋‚ด๋ถ€)
SecRule REQUEST_BODY "@rx (?i)(union.*select|insert.*into)" \
    "id:2006,\
     phase:2,\
     deny,\
     status:403,\
     msg:'SQL injection in JSON payload'"

๐ŸŒ ์ง€๋ฆฌ์  ์ฐจ๋‹จ (Geo-blocking)

ํŠน์ • ๊ตญ๊ฐ€๋‚˜ ์ง€์—ญ์—์„œ ์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ์„ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ๋„ ํšจ๊ณผ์ ์ธ ๋ณด์•ˆ ์ „๋žต์ด์—์š”:

ModSecurity์—์„œ GeoIP ์‚ฌ์šฉ:

# GeoIP ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์น˜
sudo apt install libmaxminddb0 libmaxminddb-dev mmdb-bin

# GeoIP ๋ชจ๋“ˆ ์„ค์ •
SecGeoLookupDB /usr/share/GeoIP/GeoLite2-Country.mmdb

# ํŠน์ • ๊ตญ๊ฐ€ ์ฐจ๋‹จ
SecRule REMOTE_ADDR "@geoLookup" \
    "id:3001,\
     phase:1,\
     chain,\
     deny,\
     status:403,\
     msg:'Access denied from blocked country'"
    SecRule GEO:COUNTRY_CODE "@rx ^(CN|RU|KP)$"

# ํŠน์ • ๊ตญ๊ฐ€๋งŒ ํ—ˆ์šฉ (ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹)
SecRule REMOTE_ADDR "@geoLookup" \
    "id:3002,\
     phase:1,\
     chain,\
     deny,\
     status:403,\
     msg:'Access allowed only from specific countries'"
    SecRule GEO:COUNTRY_CODE "!@rx ^(US|KR|JP)$"

# ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€๋Š” ํŠน์ • ๊ตญ๊ฐ€์—์„œ๋งŒ ์ ‘๊ทผ ํ—ˆ์šฉ
SecRule REQUEST_URI "@beginsWith /admin" \
    "id:3003,\
     phase:1,\
     chain,\
     deny,\
     status:403,\
     msg:'Admin access restricted by country'"
    SecRule REMOTE_ADDR "@geoLookup" \
        "chain"
    SecRule GEO:COUNTRY_CODE "!@rx ^(KR)$"

๐Ÿ”„ ๋™์  IP ํ‰ํŒ ์‹œ์Šคํ…œ

๊ณต๊ฒฉ์„ ์‹œ๋„ํ•œ IP ์ฃผ์†Œ๋ฅผ ์ž๋™์œผ๋กœ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•˜๋Š” ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์–ด์š”:

# ๊ณต๊ฒฉ ์‹œ๋„ ์นด์šดํ„ฐ ์ฆ๊ฐ€
SecRule REQUEST_URI "@rx (?i)(\.\.\/|etc\/passwd|union.*select)" \
    "id:4001,\
     phase:2,\
     pass,\
     log,\
     msg:'Attack attempt detected',\
     setvar:ip.attack_count=+1,\
     expirevar:ip.attack_count=3600"

# 3ํšŒ ์ด์ƒ ๊ณต๊ฒฉ ์‹œ๋„์‹œ 1์‹œ๊ฐ„ ์ฐจ๋‹จ
SecRule IP:ATTACK_COUNT "@gt 2" \
    "id:4002,\
     phase:1,\
     deny,\
     status:403,\
     msg:'IP temporarily blocked due to multiple attack attempts',\
     setvar:ip.blocked=1,\
     expirevar:ip.blocked=3600"

# ์ฐจ๋‹จ๋œ IP ํ™•์ธ
SecRule IP:BLOCKED "@eq 1" \
    "id:4003,\
     phase:1,\
     deny,\
     status:403,\
     msg:'IP is currently blocked'"

๐Ÿ“ฑ ๋ชจ๋ฐ”์ผ ์•ฑ API ๋ณดํ˜ธ

๋ชจ๋ฐ”์ผ ์•ฑ์˜ API๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•œ ํŠน๋ณ„ํ•œ ์ „๋žต์ด์—์š”:

1. ์•ฑ ์ธ์ฆ (App Attestation)
์ •ํ’ˆ ์•ฑ์—์„œ๋งŒ API ํ˜ธ์ถœ์„ ํ—ˆ์šฉํ•˜๋„๋ก ์„ค์ •:

# iOS App Attestation ๊ฒ€์ฆ
SecRule REQUEST_HEADERS:X-App-Attestation "@rx ^[A-Za-z0-9+/=]+$" \
    "id:5001,\
     phase:1,\
     pass,\
     nolog,\
     setvar:tx.app_verified=1"

SecRule TX:APP_VERIFIED "!@eq 1" \
    "id:5002,\
     phase:1,\
     deny,\
     status:401,\
     msg:'App attestation required'"

# Android SafetyNet ๊ฒ€์ฆ
SecRule REQUEST_HEADERS:X-SafetyNet-Token "@rx ^[A-Za-z0-9._-]+$" \
    "id:5003,\
     phase:1,\
     pass,\
     nolog,\
     setvar:tx.safetynet_verified=1"

2. ์ธ์ฆ์„œ ํ”ผ๋‹ (Certificate Pinning) ๊ฒ€์ฆ
HTTPS ์—ฐ๊ฒฐ์˜ ์ธ์ฆ์„œ๋ฅผ ๊ฒ€์ฆํ•ด์„œ ์ค‘๊ฐ„์ž ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€:

# ํŠน์ • ์ธ์ฆ์„œ ์ง€๋ฌธ๋งŒ ํ—ˆ์šฉ
SecRule REQUEST_HEADERS:X-Certificate-Fingerprint \
    "!@rx ^(abc123def456|789ghi012jkl)$" \
    "id:5004,\
     phase:1,\
     deny,\
     status:403,\
     msg:'Invalid certificate fingerprint'"

3. ๋””๋ฐ”์ด์Šค ํ•‘๊ฑฐํ”„๋ฆฐํŒ…
์˜์‹ฌ์Šค๋Ÿฌ์šด ๋””๋ฐ”์ด์Šค๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์ฐจ๋‹จ:

# ๋ฃจํŒ…/ํƒˆ์˜ฅ๋œ ๋””๋ฐ”์ด์Šค ์ฐจ๋‹จ
SecRule REQUEST_HEADERS:X-Device-Jailbroken "@eq true" \
    "id:5005,\
     phase:1,\
     deny,\
     status:403,\
     msg:'Jailbroken/rooted devices not allowed'"

# ์—๋ฎฌ๋ ˆ์ดํ„ฐ ์ฐจ๋‹จ
SecRule REQUEST_HEADERS:X-Device-Emulator "@eq true" \
    "id:5006,\
     phase:1,\
     deny,\
     status:403,\
     msg:'Emulators not allowed'"

๐Ÿ’ก ์žฌ๋Šฅ๋„ท์—์„œ ์ „๋ฌธ๊ฐ€ ์ฐพ๊ธฐ ์ด๋Ÿฐ ๊ณ ๊ธ‰ WAF ์„ค์ •์€ ์ „๋ฌธ ์ง€์‹์ด ํ•„์š”ํ•ด์š”. ์žฌ๋Šฅ๋„ท์—์„œ๋Š” ๋ณด์•ˆ ์ „๋ฌธ๊ฐ€, ํด๋ผ์šฐ๋“œ ์•„ํ‚คํ…ํŠธ, DevSecOps ์—”์ง€๋‹ˆ์–ด ๋“ฑ ๋‹ค์–‘ํ•œ ์ „๋ฌธ๊ฐ€๋“ค์˜ ๋„์›€์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด์š”. ์‹ค์ „ ๊ฒฝํ—˜์ด ํ’๋ถ€ํ•œ ์ „๋ฌธ๊ฐ€์™€ ํ•จ๊ป˜๋ผ๋ฉด ์—ฌ๋Ÿฌ๋ถ„์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋”์šฑ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค! ๐Ÿ›ก๏ธ

๐Ÿšจ WAF ์šด์˜ ์‹œ ์ฃผ์˜์‚ฌํ•ญ๊ณผ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค

WAF๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์šด์˜ํ•˜๊ธฐ ์œ„ํ•œ ์‹ค์ „ ๋…ธํ•˜์šฐ๋ฅผ ๊ณต์œ ํ• ๊ฒŒ์š”! ๐Ÿ’ช

โœ… ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค

1๏ธโƒฃ ๋‹จ๊ณ„์  ๋ฐฐํฌ

Detection Only โ†’ Learning โ†’ Prevention

์ฒ˜์Œ๋ถ€ํ„ฐ ์ฐจ๋‹จ ๋ชจ๋“œ๋กœ ์šด์˜ํ•˜์ง€ ๋งˆ์„ธ์š”. ๋จผ์ € ํƒ์ง€๋งŒ ํ•˜๋ฉด์„œ ๋กœ๊ทธ๋ฅผ ๋ถ„์„ํ•˜๊ณ , ์˜คํƒ์„ ์ œ๊ฑฐํ•œ ํ›„์— ์ฐจ๋‹จ ๋ชจ๋“œ๋กœ ์ „ํ™˜ํ•˜์„ธ์š”.

2๏ธโƒฃ ์ •๊ธฐ์ ์ธ ๊ทœ์น™ ์—…๋ฐ์ดํŠธ

์ตœ์‹  ์œ„ํ˜‘์— ๋Œ€์‘

OWASP CRS๋‚˜ ๊ด€๋ฆฌํ˜• ๊ทœ์น™ ์„ธํŠธ๋ฅผ ์ •๊ธฐ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜์„ธ์š”. ์ƒˆ๋กœ์šด ์ทจ์•ฝ์ ๊ณผ ๊ณต๊ฒฉ ๊ธฐ๋ฒ•์ด ๊ณ„์† ๋“ฑ์žฅํ•˜๋‹ˆ๊นŒ์š”.

3๏ธโƒฃ ๋ฐฑ์—…๊ณผ ๋กค๋ฐฑ ๊ณ„ํš

์•ˆ์ „ํ•œ ๋ณ€๊ฒฝ ๊ด€๋ฆฌ

WAF ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์ „์— ํ•ญ์ƒ ๋ฐฑ์—…ํ•˜๊ณ , ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ์ฆ‰์‹œ ๋กค๋ฐฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ„ํš์„ ์„ธ์šฐ์„ธ์š”.

4๏ธโƒฃ ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ์•Œ๋ฆผ

์‹ค์‹œ๊ฐ„ ์œ„ํ˜‘ ๋Œ€์‘

CloudWatch, Prometheus, Grafana ๋“ฑ์„ ํ™œ์šฉํ•ด์„œ WAF ๋ฉ”ํŠธ๋ฆญ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ , ์ด์ƒ ์ง•ํ›„ ๋ฐœ๊ฒฌ ์‹œ ์ฆ‰์‹œ ์•Œ๋ฆผ์„ ๋ฐ›์œผ์„ธ์š”.

5๏ธโƒฃ ๋ฌธ์„œํ™”

์ง€์‹ ๊ณต์œ ์™€ ์œ ์ง€๋ณด์ˆ˜

๋ชจ๋“  ์ปค์Šคํ…€ ๊ทœ์น™๊ณผ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด ๋ช…ํ™•ํ•˜๊ฒŒ ๋ฌธ์„œํ™”ํ•˜์„ธ์š”. ์™œ ์ด ๊ทœ์น™์„ ์ถ”๊ฐ€ํ–ˆ๋Š”์ง€, ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”์ง€ ๊ธฐ๋กํ•˜์„ธ์š”.

6๏ธโƒฃ ์ •๊ธฐ์ ์ธ ๋ณด์•ˆ ํ…Œ์ŠคํŠธ

ํšจ๊ณผ์„ฑ ๊ฒ€์ฆ

์นจํˆฌ ํ…Œ์ŠคํŠธ๋‚˜ ์ทจ์•ฝ์  ์Šค์บ”์„ ์ •๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์„œ WAF๊ฐ€ ์‹ค์ œ๋กœ ๊ณต๊ฒฉ์„ ์ž˜ ๋ง‰๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

โš ๏ธ ํ”ผํ•ด์•ผ ํ•  ์‹ค์ˆ˜๋“ค

โŒ ํ•˜์ง€ ๋ง์•„์•ผ ํ•  ๊ฒƒ๋“ค: 1. ๊ณผ๋„ํ•œ ๊ทœ์น™ ์„ค์ •
๋„ˆ๋ฌด ๋งŽ์€ ๊ทœ์น™์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋˜๊ณ  ์˜คํƒ์ด ์ฆ๊ฐ€ํ•ด์š”. ํ•„์š”ํ•œ ๊ทœ์น™๋งŒ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์„ธ์š”.

2. ๋กœ๊ทธ ๋ถ„์„ ์†Œํ™€
WAF๋ฅผ ์„ค์น˜๋งŒ ํ•˜๊ณ  ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์œผ๋ฉด ๊ณต๊ฒฉ์„ ๋†“์น˜๊ฑฐ๋‚˜ ์˜คํƒ์„ ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ•ด์š”.

3. ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๋‚จ์šฉ
ํŽธ์˜๋ฅผ ์œ„ํ•ด ๋„ˆ๋ฌด ๋งŽ์€ IP๋‚˜ ๊ฒฝ๋กœ๋ฅผ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋ณด์•ˆ ๊ตฌ๋ฉ์ด ์ƒ๊ฒจ์š”.

4. ์—…๋ฐ์ดํŠธ ๋ฏธ๋ฃจ๊ธฐ
WAF ์†Œํ”„ํŠธ์›จ์–ด๋‚˜ ๊ทœ์น™ ์„ธํŠธ๋ฅผ ์˜ค๋ž˜ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒˆ๋กœ์šด ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•ด์ ธ์š”.

5. ๋‹จ์ผ ๋ฐฉ์–ด์„  ์˜์กด
WAF๋งŒ์œผ๋กœ ๋ชจ๋“  ๋ณด์•ˆ์„ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ•˜์ง€ ๋งˆ์„ธ์š”. ๋‹ค์ธต ๋ฐฉ์–ด ์ „๋žต์ด ํ•„์š”ํ•ด์š”.

๐Ÿ“‹ WAF ์šด์˜ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

์ฃผ๊ธฐ ์ž‘์—… ๋‹ด๋‹น
๋งค์ผ โ€ข ์ฐจ๋‹จ๋œ ์š”์ฒญ ๋กœ๊ทธ ํ™•์ธ
โ€ข ์ด์ƒ ํŠธ๋ž˜ํ”ฝ ํŒจํ„ด ๋ชจ๋‹ˆํ„ฐ๋ง
โ€ข ์•Œ๋ฆผ ํ™•์ธ ๋ฐ ๋Œ€์‘
๋ณด์•ˆ ์šด์˜ํŒ€
๋งค์ฃผ โ€ข ์˜คํƒ ๋ถ„์„ ๋ฐ ๊ทœ์น™ ํŠœ๋‹
โ€ข ์„ฑ๋Šฅ ๋ฉ”ํŠธ๋ฆญ ๋ฆฌ๋ทฐ
โ€ข ์ƒˆ๋กœ์šด ๊ณต๊ฒฉ ํŒจํ„ด ๋ถ„์„
๋ณด์•ˆ ์—”์ง€๋‹ˆ์–ด
๋งค์›” โ€ข ๊ทœ์น™ ์„ธํŠธ ์—…๋ฐ์ดํŠธ
โ€ข ๋ณด์•ˆ ์ •์ฑ… ๋ฆฌ๋ทฐ
โ€ข ํŠธ๋ Œ๋“œ ๋ถ„์„ ๋ฆฌํฌํŠธ ์ž‘์„ฑ
๋ณด์•ˆ ๊ด€๋ฆฌ์ž
๋ถ„๊ธฐ๋ณ„ โ€ข ์นจํˆฌ ํ…Œ์ŠคํŠธ ์ˆ˜ํ–‰
โ€ข WAF ํšจ๊ณผ์„ฑ ํ‰๊ฐ€
โ€ข ๋ณด์•ˆ ์ •์ฑ… ๊ฐœ์„ 
๋ณด์•ˆ ํŒ€ ์ „์ฒด
์—ฐ๊ฐ„ โ€ข ์ „์ฒด ๋ณด์•ˆ ์•„ํ‚คํ…์ฒ˜ ๋ฆฌ๋ทฐ
โ€ข WAF ์†”๋ฃจ์…˜ ์žฌํ‰๊ฐ€
โ€ข ์˜ˆ์‚ฐ ๋ฐ ๋ฆฌ์†Œ์Šค ๊ณ„ํš
CISO/๋ณด์•ˆ ์ฑ…์ž„์ž

๐ŸŽ“ ํŒ€ ๊ต์œก๊ณผ ์—ญ๋Ÿ‰ ๊ฐ•ํ™”

WAF๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์šด์˜ํ•˜๋ ค๋ฉด ํŒ€์›๋“ค์˜ ๋ณด์•ˆ ์—ญ๋Ÿ‰์ด ์ค‘์š”ํ•ด์š”:

์ถ”์ฒœ ํ•™์Šต ๋ฆฌ์†Œ์Šค:
โ€ข OWASP Top 10: ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฃผ์š” ๋ณด์•ˆ ์œ„ํ˜‘ ์ดํ•ด
โ€ข ModSecurity Handbook: ModSecurity ๊ณต์‹ ๊ฐ€์ด๋“œ
โ€ข AWS WAF Workshop: AWS ๊ณต์‹ ํ•ธ์ฆˆ์˜จ ์›Œํฌ์ƒต
โ€ข SANS SEC542: ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์นจํˆฌ ํ…Œ์ŠคํŠธ ๊ณผ์ •
โ€ข Certified Ethical Hacker (CEH): ์œค๋ฆฌ์  ํ•ดํ‚น ์ž๊ฒฉ์ฆ

์‹ค์Šต ํ™˜๊ฒฝ ๊ตฌ์ถ•:
โ€ข DVWA (Damn Vulnerable Web Application): ์ทจ์•ฝํ•œ ์›น ์•ฑ์œผ๋กœ ๊ณต๊ฒฉ ์‹ค์Šต
โ€ข WebGoat: OWASP์˜ ๊ต์œก์šฉ ์ทจ์•ฝํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
โ€ข Juice Shop: ํ˜„๋Œ€์ ์ธ ์›น ๊ธฐ์ˆ  ์Šคํƒ์˜ ์ทจ์•ฝ์  ํ•™์Šต
โ€ข HackTheBox: ์‹ค์ „ ๊ฐ™์€ ํ•ดํ‚น ์ฑŒ๋ฆฐ์ง€ ํ”Œ๋žซํผ

๐Ÿ”ฎ WAF์˜ ๋ฏธ๋ž˜์™€ ํŠธ๋ Œ๋“œ

์›น ๋ณด์•ˆ ๊ธฐ์ˆ ์€ ๊ณ„์† ์ง„ํ™”ํ•˜๊ณ  ์žˆ์–ด์š”. ์•ž์œผ๋กœ WAF๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐœ์ „ํ• ์ง€ ์‚ดํŽด๋ณผ๊นŒ์š”? ๐Ÿš€

๐Ÿค– AI/ML ๊ธฐ๋ฐ˜ ์ง€๋Šฅํ˜• WAF

์ธ๊ณต์ง€๋Šฅ๊ณผ ๋จธ์‹ ๋Ÿฌ๋‹์„ ํ™œ์šฉํ•œ ์ฐจ์„ธ๋Œ€ WAF๊ฐ€ ๋“ฑ์žฅํ•˜๊ณ  ์žˆ์–ด์š”:

โ€ข ํ–‰์œ„ ๊ธฐ๋ฐ˜ ์ด์ƒ ํƒ์ง€: ์ •์ƒ ํŠธ๋ž˜ํ”ฝ ํŒจํ„ด์„ ํ•™์Šตํ•˜๊ณ  ์ด์ƒ ํ–‰์œ„๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€
โ€ข ์ œ๋กœ๋ฐ์ด ๊ณต๊ฒฉ ๋Œ€์‘: ์•Œ๋ ค์ง€์ง€ ์•Š์€ ์ƒˆ๋กœ์šด ๊ณต๊ฒฉ๋„ ํŒจํ„ด ๋ถ„์„์œผ๋กœ ํƒ์ง€
โ€ข ์ž๋™ ๊ทœ์น™ ์ƒ์„ฑ: ๊ณต๊ฒฉ ํŒจํ„ด์„ ๋ถ„์„ํ•ด์„œ ์ž๋™์œผ๋กœ ๋ฐฉ์–ด ๊ทœ์น™ ์ƒ์„ฑ
โ€ข ์˜คํƒ ์ž๋™ ๊ฐ์†Œ: ๋จธ์‹ ๋Ÿฌ๋‹์œผ๋กœ ์˜คํƒ์„ ํ•™์Šตํ•˜๊ณ  ์ž๋™์œผ๋กœ ๊ทœ์น™ ํŠœ๋‹
โ€ข ์˜ˆ์ธก์  ๋ฐฉ์–ด: ๊ณต๊ฒฉ ์ง•ํ›„๋ฅผ ์‚ฌ์ „์— ๊ฐ์ง€ํ•˜๊ณ  ์„ ์ œ์ ์œผ๋กœ ๋Œ€์‘

โ˜๏ธ ์„œ๋ฒ„๋ฆฌ์Šค WAF

์„œ๋ฒ„๋ฆฌ์Šค ์•„ํ‚คํ…์ฒ˜์— ์ตœ์ ํ™”๋œ WAF๊ฐ€ ๋ฐœ์ „ํ•˜๊ณ  ์žˆ์–ด์š”:

โ€ข Lambda@Edge WAF: CloudFront ์—ฃ์ง€์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒฝ๋Ÿ‰ WAF
โ€ข API Gateway ํ†ตํ•ฉ: ์„œ๋ฒ„๋ฆฌ์Šค API๋ฅผ ์œ„ํ•œ ๋„ค์ดํ‹ฐ๋ธŒ ๋ณด์•ˆ
โ€ข ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋ฐฉ์–ด: ๊ณต๊ฒฉ ๊ฐ์ง€ ์‹œ ์ž๋™์œผ๋กœ Lambda ํ•จ์ˆ˜ ์‹คํ–‰
โ€ข ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๋ณดํ˜ธ: ๊ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ณ„ ๋…๋ฆฝ์ ์ธ WAF ์ •์ฑ…

๐ŸŒ ์—ฃ์ง€ ์ปดํ“จํŒ…๊ณผ WAF

5G์™€ ์—ฃ์ง€ ์ปดํ“จํŒ…์˜ ๋ฐœ์ „์œผ๋กœ WAF๋„ ์—ฃ์ง€๋กœ ์ด๋™ํ•˜๊ณ  ์žˆ์–ด์š”:

โ€ข ์ดˆ์ €์ง€์—ฐ ๋ฐฉ์–ด: ์‚ฌ์šฉ์ž์™€ ๊ฐ€๊นŒ์šด ์—ฃ์ง€์—์„œ ์ฆ‰์‹œ ๊ณต๊ฒฉ ์ฐจ๋‹จ
โ€ข ๋ถ„์‚ฐ ๋ฐฉ์–ด: ์ „ ์„ธ๊ณ„ ์—ฃ์ง€ ๋…ธ๋“œ์—์„œ ๋™์‹œ์— ๋ฐฉ์–ด
โ€ข IoT ๋ณด์•ˆ: IoT ๋””๋ฐ”์ด์Šค์˜ API๋ฅผ ์—ฃ์ง€์—์„œ ๋ณดํ˜ธ
โ€ข 5G ๋„คํŠธ์›Œํฌ ์Šฌ๋ผ์ด์‹ฑ: ๋„คํŠธ์›Œํฌ ๋ ˆ๋ฒจ์—์„œ ๋ณด์•ˆ ์ •์ฑ… ์ ์šฉ

๐Ÿ” Zero Trust ์•„ํ‚คํ…์ฒ˜์™€ WAF

Zero Trust ๋ณด์•ˆ ๋ชจ๋ธ์ด ํ™•์‚ฐ๋˜๋ฉด์„œ WAF์˜ ์—ญํ• ๋„ ๋ณ€ํ™”ํ•˜๊ณ  ์žˆ์–ด์š”:

โ€ข ์ง€์†์ ์ธ ๊ฒ€์ฆ: ๋ชจ๋“  ์š”์ฒญ์„ ๋งค๋ฒˆ ๊ฒ€์ฆ
โ€ข ๋งˆ์ดํฌ๋กœ ์„ธ๊ทธ๋ฉ˜ํ…Œ์ด์…˜: ์„ธ๋ฐ€ํ•œ ์ ‘๊ทผ ์ œ์–ด
โ€ข ์ปจํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ์ •์ฑ…: ์‚ฌ์šฉ์ž, ๋””๋ฐ”์ด์Šค, ์œ„์น˜, ์‹œ๊ฐ„ ๋“ฑ์„ ๊ณ ๋ คํ•œ ๋™์  ์ •์ฑ…
โ€ข ํ†ตํ•ฉ ๋ณด์•ˆ ํ”Œ๋žซํผ: IAM, SIEM, SOAR๊ณผ์˜ ๊ธด๋ฐ€ํ•œ ํ†ตํ•ฉ

๐Ÿ“Š ์ž๋™ํ™”์™€ DevSecOps

๋ณด์•ˆ์ด ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค์— ํ†ตํ•ฉ๋˜๋ฉด์„œ WAF๋„ ์ž๋™ํ™”๋˜๊ณ  ์žˆ์–ด์š”:

# Infrastructure as Code๋กœ WAF ๊ด€๋ฆฌ
# Terraform ์˜ˆ์‹œ
resource "aws_wafv2_web_acl" "main" {
  name  = "production-waf"
  scope = "REGIONAL"

  default_action {
    allow {}
  }

  rule {
    name     = "RateLimitRule"
    priority = 1

    statement {
      rate_based_statement {
        limit              = 2000
        aggregate_key_type = "IP"
      }
    }

    action {
      block {}
    }

    visibility_config {
      cloudwatch_metrics_enabled = true
      metric_name                = "RateLimitRule"
      sampled_requests_enabled   = true
    }
  }

  visibility_config {
    cloudwatch_metrics_enabled = true
    metric_name                = "ProductionWAF"
    sampled_requests_enabled   = true
  }
}

# CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— WAF ํ…Œ์ŠคํŠธ ํ†ตํ•ฉ
# GitLab CI ์˜ˆ์‹œ
waf_test:
  stage: security
  script:
    - echo "Testing WAF rules..."
    - python test_waf_rules.py
    - echo "Checking for false positives..."
    - python check_false_positives.py
  only:
    - main
WAF ๊ธฐ์ˆ  ์ง„ํ™” ํƒ€์ž„๋ผ์ธ 2000๋…„๋Œ€ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ๊ธฐ๋ฐ˜ WAF ๋“ฑ์žฅ ๊ทœ์น™ ๊ธฐ๋ฐ˜ 2010๋…„๋Œ€ ํด๋ผ์šฐ๋“œ WAF ํ™•์‚ฐ SaaS ๋ชจ๋ธ 2020๋…„๋Œ€ AI/ML ๊ธฐ๋ฐ˜ ์ง€๋Šฅํ˜• WAF ๋จธ์‹ ๋Ÿฌ๋‹ ํ˜„์žฌ Zero Trust ํ†ตํ•ฉ ๋ณด์•ˆ ํ†ตํ•ฉ ํ”Œ๋žซํผ ๋ฏธ๋ž˜ ์ž์œจ ๋ฐฉ์–ด ์‹œ์Šคํ…œ ์™„์ „ ์ž๋™ํ™” ๐Ÿ›ก๏ธ โ˜๏ธ ๐Ÿค– ๐Ÿ” ๐Ÿš€ ๋ณด์•ˆ ์œ„ํ˜‘์˜ ์ง„ํ™”์™€ ํ•จ๊ป˜ WAF๋„ ๊ณ„์† ๋ฐœ์ „ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ๋” ์ง€๋Šฅ์ ์ด๊ณ , ๋” ๋น ๋ฅด๊ณ , ๋” ์ •ํ™•ํ•œ ๋ฐฉ์–ด ์‹œ์Šคํ…œ์œผ๋กœ
๋Œ“๊ธ€ ์ž‘์„ฑ

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0
๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.