Yozzang์˜ Cyber์ผ๊ธฐ ๐Ÿ’ป
article thumbnail
728x90

์˜ค๋Š˜์€ benign activity์™€ RBA ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์˜คํƒ/์ •ํƒ ์ด๋ถ„๋ฒ•์˜ ๋ฌธ์ œ

๋ณดํ†ต SOCํŒ€์ด๋‚˜ ๋ธ”๋ฃจํŒ€์ด ๋กœ๊ทธ๋ฅผ ํŒ๋‹จํ•˜๋Š” ๊ธฐ์ค€์€ ์˜คํƒ, ์ •ํƒ ๋”ฑ ๋‘ ๊ฐœ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ ์ข…์ข… ์• ๋งคํ•œ ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค.

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

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

๊ทธ๋Ÿฌ๋ฉด ์ด ํŒ์ • ์ฒด๊ณ„ ์ž์ฒด๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐ”๋กœ์žก์•„์•ผ ํ• ๊นŒ์š”? ํ•ด์™ธ์—์„œ ์“ฐ์ด๊ธฐ ์‹œ์ž‘ํ•œ ๊ฐœ๋…์ด TP-benign activity, ์ฆ‰ ์–‘์„ฑ ํ–‰์œ„์ž…๋‹ˆ๋‹ค. ์ •ํƒ์ด๊ธด ํ•˜๋‚˜ ์œ ํ•ดํ•˜์ง€ ์•Š์€ ๊ฒƒ. ๋ฃฐ ๊ทœ์น™์˜ ๊ด€์ ์—์„œ ํŒ๋‹จํ•˜๋Š” ๊ฒ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๋ฃฐ์ด ์ž˜ ์žก์•˜๊ณ (TP), ๋‹ค๋งŒ ์ด๊ฒŒ ์ •์ƒ ์‚ฌ์šฉ์ž์˜ ์–‘์„ฑ ํ–‰์œ„์˜€๋‹ค๋Š” ๊ฑฐ์ฃ .

์ด๋ ‡๊ฒŒ ์„ธ ๊ฐˆ๋ž˜(TP / TP-benign / FP)๋กœ ์ง‘๊ณ„ํ•˜๋ฉด ๋‚˜์ค‘์— ์ •์˜คํƒ ์ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ "๋ฃฐ ๋กœ์ง์˜ ๋ฌธ์ œ"์™€ "์ปจํ…์ŠคํŠธ ๋ณด์™„์˜ ๋ฌธ์ œ"๊ฐ€ ๋ถ„๋ฆฌ๋ผ์„œ, ์ตœ์ ํ™” ๋ฐฉํ–ฅ์„ ํ›จ์”ฌ ์ •ํ™•ํ•˜๊ฒŒ ์žก์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

RBA (Risk-Based Alerting)

benign activity ์ƒํ™ฉ์„ ๋†“๊ณ  ๋ณด๋ฉด, ๋ฃฐ ๋ฉ”์ธ ๋กœ์ง ์ž์ฒด๋Š” ์˜ค๋ฅ˜๊ฐ€ ์—†์ง€๋งŒ ์ถ”๊ฐ€ ์ปจํ…์ŠคํŠธ๋กœ ๋ณด์™„ํ•  ์—ฌ์ง€๊ฐ€ ๋งŽ์ด ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ๋กœ ํ•ด๊ฒฐํ•ด๋„ ๋˜์ง€๋งŒ, ๊ณต๊ฒฉ์ž๋‚˜ APT ๊ทธ๋ฃน์˜ ๋ณธ์งˆ์ ์ธ ๋ชฉ์  ๊ธฐ๋ฐ˜์œผ๋กœ ์ ‘๊ทผํ•˜์ž๋ฉด RBA(Risk-Based Alerting)๋ฅผ ์–ธ๊ธ‰ํ•  ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค.

RBA๋Š” ์‰ฝ๊ฒŒ ๋งํ•ด ๋ฆฌ์Šคํฌ ์ ์ˆ˜ ๊ธฐ๋ฐ˜ ์•Œ๋ฆผ์ž…๋‹ˆ๋‹ค. ์•Œ๋ฆผ์„ ์ด๋ฒคํŠธ ๋‹จ์œ„๋กœ ๋ฐ”๋กœ ์˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ(์œ ์ €, ํ˜ธ์ŠคํŠธ ๋“ฑ)์— ๋ฆฌ์Šคํฌ ์ ์ˆ˜๋ฅผ ๋ˆ„์ ์‹œํ‚ค๋Š” ๋ฐฉ์‹์ด์—์š”. ์˜ˆ๋ฅผ ๋“ค์–ด ํ™๊ธธ๋™์ด๋ผ๋Š” ์œ ์ €๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™๊ธธ๋™์ด ํŒจ์Šค์›Œ๋“œ๋ฅผ 5๋ฒˆ ํ‹€๋ฆด ๋•Œ๋งˆ๋‹ค ํ™๊ธธ๋™์—๊ฒŒ 30์ ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ˆ„์  ์ ์ˆ˜๊ฐ€ 100์ ์„ ๋„˜์„ ๋•Œ๋งŒ notable, ์ฆ‰ ์•Œ๋ฆผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ด๋Ÿฐ ์งˆ๋ฌธ์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "ํ•œ ๋ฒˆ์— 30์ ์ด๋ฉด ์ด 4๋ฒˆ, ์ฆ‰ 20๋ฒˆ์€ ํ‹€๋ ค์•ผ ์•Œ๋ฆผ์ด ๊ฐ€๋Š” ๊ฑฐ ์•„๋ƒ? ํ•ด์ปค๊ฐ€ 20๋ฒˆ ๋ฏธ๋งŒ์œผ๋กœ๋งŒ ์‹œ๋„ํ•˜๋ฉด ์˜์›ํžˆ ์•ˆ ์žกํžˆ๋Š” ๊ฑฐ ์•„๋ƒ?" ์—ฌ๊ธฐ๊นŒ์ง€ ์ƒ๊ฐํ•˜์…จ๋‹ค๋ฉด ์•„์ฃผ ํ›Œ๋ฅญํ•˜์‹  ๊ฒ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๊ทธ๊ฑด Usecase๊ฐ€ ํ•˜๋‚˜๋ฟ์ผ ๋•Œ ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ RBA๋ฅผ ์ ์šฉํ•œ๋‹ค๋ฉด ํ‚ฌ์ฒด์ธ์ด๋‚˜ MITRE ATT&CK ๊ธฐ๋ฐ˜์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Usecase๋ฅผ ๋งŒ๋“ค ํ…Œ๊ณ , ๊ฐ Usecase๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” risk object๊ฐ€ ์ „๋ถ€ ๊ฐ™์€ ์œ ์ €๋ผ๋ฉด ์ด์•ผ๊ธฐ๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ํ•ด์ปค๊ฐ€ ํ™๊ธธ๋™ ๊ณ„์ •์„ ํƒˆ์ทจํ•˜๋ ค ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด์ฃ . ํŒจ์Šค์›Œ๋“œ ์‹คํŒจ๋กœ 30์ , ์ด์–ด์„œ ๋‹ค๋ฅธ ์ˆ˜์ƒ ํ–‰์œ„๋ฅผ ์žก๋Š” Usecase๋“ค์ด ๊ฐ๊ฐ ์ถ”๊ฐ€ ์ ์ˆ˜๋ฅผ ์–น์Šต๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ๊ณ„์ • ํƒˆ์ทจ๋ผ๋Š” ๋ชฉ์ ์„ ํ–ฅํ•ด ํ›„์† ํ–‰๋™์„ ์ด์–ด๊ฐˆ ์ˆ˜๋ฐ–์— ์—†์œผ๋‹ˆ, ์‹œ๋‚˜๋ฆฌ์˜ค ๊ธฐ๋ฐ˜์œผ๋กœ Usecase๋ฅผ ์งœ๊ณ  ์ ์ˆ˜๋ฅผ ์ž˜ ๋ฐฐ๋ถ„ํ•ด ๋‘๋ฉด ๋‹จ์ผ ์ด๋ฒคํŠธ๋กœ๋Š” ์กฐ์šฉํ•ด ๋ณด์—ฌ๋„ ๋ˆ„์ ์œผ๋กœ๋Š” ๋ฐ˜๋“œ์‹œ ๋“œ๋Ÿฌ๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

RBA์˜ ์žฅ์ ์„ ์ •๋ฆฌํ•˜๋ฉด ์ด๋ ‡์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ์ด๋ฒคํŠธ ์•Œ๋ฆผ์ด ํ™• ์ค„์–ด๋“œ๋‹ˆ ๋ถ„์„๊ฐ€์˜ ์•Œ๋ฆผ ํ”ผ๋กœ๊ฐ€ ๋‚ด๋ ค๊ฐ€๊ณ , benign activity๋Š” ์ ์ˆ˜๋งŒ ์Œ“๊ณ  ์•Œ๋ฆผ๊นŒ์ง€๋Š” ์•ˆ ๊ฐ€๋‹ˆ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ฑธ๋Ÿฌ์ง€๊ณ , ๋ฐ˜๋Œ€๋กœ ์ €๊ฐ•๋„๋กœ ์˜ค๋ž˜ ์›€์ง์ด๋Š” ๊ณต๊ฒฉ์ž๋Š” ๋ˆ„์  ์ ์ˆ˜๋กœ ์žกํž™๋‹ˆ๋‹ค.

์ผ๋ฐ˜ Splunk์—์„œ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ

Splunk Enterprise Security์—๋Š” RBA ๋ชจ๋“ˆ์ด ๋‚ด์žฅ๋ผ ์žˆ์ง€๋งŒ ์›Œ๋‚™ ๋น„์‹ธ๋‹ค ๋ณด๋‹ˆ, ์ผ๋ฐ˜ Splunk๋‚˜ ํƒ€ ํ”Œ๋žซํผ(Sentinel, ELK ๋“ฑ)์—์„œ๋„ ๊ฐ™์€ ๊ฐœ๋…์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์‹œ๋ฅผ ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•ต์‹ฌ ๊ตฌ์กฐ๋Š” ๋‘ ์ธต์ž…๋‹ˆ๋‹ค. Usecase ๋ฃฐ์€ ์•Œ๋ฆผ์„ ์˜์ง€ ์•Š๊ณ  ๋ฆฌ์Šคํฌ ์ด๋ฒคํŠธ๋งŒ ์Œ“๊ณ , ๋ณ„๋„์˜ ์ง‘๊ณ„ ๋ฃฐ์ด ๋ˆ„์  ์ ์ˆ˜๋ฅผ ๋ณด๊ณ  ์•Œ๋ฆผ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.

[Usecase ํƒ์ง€๋ฃฐ] โ€” ๋กœ๊ทธ์ธ ์‹คํŒจ 5ํšŒ ์ด์ƒ์„ ์žก๋˜, ์•Œ๋ฆผ ๋Œ€์‹  ๋ฆฌ์Šคํฌ ์ธ๋ฑ์Šค์— ์ ์ˆ˜๋ฅผ ์ ์žฌํ•ฉ๋‹ˆ๋‹ค.

index=wineventlog EventCode=4625
| bin _time span=10m
| stats count as fail_count values(src) as src by _time, user
| where fail_count >= 5
| eval risk_object=user,
       risk_object_type="user",
       risk_score=30,
       risk_rule="AUTH-001_excessive_login_failure",
       risk_message="10๋ถ„ ๋‚ด ๋กœ๊ทธ์ธ ์‹คํŒจ ".fail_count."ํšŒ (src: ".mvjoin(src,", ").")",
       mitre_technique="T1110"
| fields _time, risk_object, risk_object_type, risk_score, risk_rule, risk_message, mitre_technique
| collect index=risk_index

ํฌ์ธํŠธ๋Š” ๋งˆ์ง€๋ง‰ collect์ž…๋‹ˆ๋‹ค. ์ด ๋ฃฐ์€ ์Šค์ผ€์ค„๋งŒ ๋Œ ๋ฟ ๋ˆ„๊ตฌํ•œํ…Œ๋„ ์•Œ๋ฆผ์„ ๋ณด๋‚ด์ง€ ์•Š๊ณ , risk_index์— ๋ฆฌ์Šคํฌ ์ด๋ฒคํŠธ๋ฅผ ๋‚จ๊ธฐ๋Š” ๊ฒƒ์œผ๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ Usecase๋“ค(์ˆ˜์ƒํ•œ ํ”„๋กœ์„ธ์Šค ์‹คํ–‰, ๋น„์ •์ƒ ์‹œ๊ฐ„๋Œ€ ์ ‘์†, ์‹ ๊ทœ ๊ตญ๊ฐ€ ๋กœ๊ทธ์ธ ๋“ฑ)๋„ ์ „๋ถ€ ๊ฐ™์€ ํฌ๋งท์œผ๋กœ ์ด ์ธ๋ฑ์Šค์— ์Œ“์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. risk_rule์— ๋ฃฐ ID๋ฅผ, mitre_technique์— ATT&CK ๋ฒˆํ˜ธ๋ฅผ ๋ฐ•์•„๋‘๋ฉด ๋‚˜์ค‘์— ์ง‘๊ณ„ํ•  ๋•Œ ๊ณต๊ฒฉ ํ๋ฆ„์ด ๊ทธ๋Œ€๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

[RBA ์ง‘๊ณ„๋ฃฐ] โ€” 24์‹œ๊ฐ„ ๋ˆ„์  ์ ์ˆ˜๊ฐ€ ์ž„๊ณ„์น˜๋ฅผ ๋„˜๋Š” ์—”ํ‹ฐํ‹ฐ๋งŒ ์•Œ๋ฆผ์œผ๋กœ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค.

index=risk_index earliest=-24h
| stats sum(risk_score) as total_score,
        dc(risk_rule) as distinct_rules,
        values(risk_rule) as triggered_rules,
        values(mitre_technique) as techniques,
        values(risk_message) as messages,
        latest(_time) as last_seen
        by risk_object, risk_object_type
| where total_score >= 100 OR distinct_rules >= 3
| eval last_seen=strftime(last_seen, "%Y-%m-%d %H:%M:%S")
| sort - total_score

์กฐ๊ฑด์„ total_score >= 100 OR distinct_rules >= 3์œผ๋กœ ๊ฑด ๊ฒŒ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. ์ ์ˆ˜ ์ดํ•ฉ๋ฟ ์•„๋‹ˆ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฃฐ ๋ช‡ ๊ฐœ์— ๊ฑธ๋ ธ๋Š”์ง€๋„ ๋ด…๋‹ˆ๋‹ค. ์ €๊ฐ•๋„๋ผ๋„ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์— ๊ฑธ์ณ ์›€์ง์ด๋Š” ๊ณต๊ฒฉ์ž๋Š” distinct_rules ์ชฝ์— ๊ฑธ๋ฆฌ๊ฒŒ ๋˜๋Š” ๊ฑฐ์ฃ . ์ด ์ง‘๊ณ„๋ฃฐ๋งŒ ์Šค์ผ€์ค„ ์•Œ๋ฆผ์œผ๋กœ ๊ฑธ์–ด๋‘๋ฉด, ๋ถ„์„๊ฐ€๋Š” ๊ฐœ๋ณ„ ์ด๋ฒคํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ "์ง€๊ธˆ ์ ์ˆ˜๊ฐ€ ์Œ“์ด๊ณ  ์žˆ๋Š” ์—”ํ‹ฐํ‹ฐ" ๋ชฉ๋ก์„ ๋ณด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Sentinel(KQL)์—์„œ๋Š”

Sentinel์—๋Š” UEBA ๊ธฐ๋ฐ˜ ์—”ํ‹ฐํ‹ฐ ์Šค์ฝ”์–ด๋ง์ด ๋‚ด์žฅ๋ผ ์žˆ์ง€๋งŒ, ์—ฌ๊ธฐ์„œ๋Š” ๊ฐ™์€ 2์ธต ๊ตฌ์กฐ๋ฅผ KQL๋กœ ์ง์ ‘ ์งœ๋Š” ์˜ˆ์‹œ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Sentinel์—” Splunk์˜ collect ๊ฐ™์€ ๊ฒŒ ์—†์œผ๋‹ˆ, ๊ฐ Usecase๋ฅผ ์ €์žฅ ํ•จ์ˆ˜(saved function)๋กœ ๋งŒ๋“ค์–ด ๋‘๊ณ  ์ง‘๊ณ„ ์ฟผ๋ฆฌ์—์„œ union์œผ๋กœ ๋ชจ์œผ๋Š” ํŒจํ„ด์ด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

[Usecase ํƒ์ง€๋ฃฐ] โ€” ํ•จ์ˆ˜ AUTH001_LoginFailures๋กœ ์ €์žฅ:

SecurityEvent
| where EventID == 4625
| summarize fail_count = count(), srcs = make_set(IpAddress, 10)
    by bin(TimeGenerated, 10m), TargetUserName
| where fail_count >= 5
| project TimeGenerated,
          risk_object = TargetUserName,
          risk_object_type = "user",
          risk_score = 30,
          risk_rule = "AUTH-001_excessive_login_failure",
          mitre_technique = "T1110"

[RBA ์ง‘๊ณ„๋ฃฐ] โ€” ๋ถ„์„ ๋ฃฐ(Analytics rule)๋กœ ์Šค์ผ€์ค„:

union
    AUTH001_LoginFailures(),
    PROC002_SuspiciousProcess(),
    GEO003_NewCountryLogin()
| where TimeGenerated > ago(24h)
| summarize total_score = sum(risk_score),
            distinct_rules = dcount(risk_rule),
            triggered_rules = make_set(risk_rule),
            techniques = make_set(mitre_technique)
    by risk_object, risk_object_type
| where total_score >= 100 or distinct_rules >= 3
| order by total_score desc

์ง‘๊ณ„ ์ฟผ๋ฆฌ ํ•˜๋‚˜๋งŒ Analytics rule๋กœ ๋“ฑ๋กํ•ด์„œ ์ธ์‹œ๋˜ํŠธ๋ฅผ ๋งŒ๋“ค๊ฒŒ ํ•˜๋ฉด, Usecase ํ•จ์ˆ˜๋“ค์€ ์กฐ์šฉํžˆ ์ ์ˆ˜ ๊ณต๊ธ‰๋งŒ ํ•˜๋Š” ๊ตฌ์กฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๋ฆฌ์Šคํฌ ์ด๋ฒคํŠธ๋ฅผ ์‹ค์ œ ํ…Œ์ด๋ธ”๋กœ ์ ์žฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด Logic App์ด๋‚˜ DCR ๊ธฐ๋ฐ˜ ์ปค์Šคํ…€ ํ…Œ์ด๋ธ”๋กœ ๋นผ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋Š”๋ฐ, ์†Œ๊ทœ๋ชจ๋ผ๋ฉด union ํŒจํ„ด์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

ELK์—์„œ๋Š”

Elastic๋„ 8.x๋ถ€ํ„ฐ Entity Risk Scoring์ด ๋‚ด์žฅ๋˜๊ธฐ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ, ๊ฐœ๋… ์ดํ•ด์šฉ์œผ๋กœ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ES|QL๋กœ ์งœ๋ณด๋ฉด ์ด๋ ‡์Šต๋‹ˆ๋‹ค. Usecase ๋ฃฐ์€ ํƒ์ง€ ๋ฃฐ์˜ ์ธ๋ฑ์Šค ์•ก์…˜(๋˜๋Š” transform)์œผ๋กœ risk-events ์ธ๋ฑ์Šค์— ๊ฒฐ๊ณผ๋ฅผ ์ ์žฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

[Usecase ํƒ์ง€๋ฃฐ]

FROM logs-windows*
| WHERE event.code == "4625"
| STATS fail_count = COUNT(*), srcs = VALUES(source.ip)
    BY user.name, bucket = BUCKET(@timestamp, 10 minutes)
| WHERE fail_count >= 5
| EVAL risk_object = user.name,
       risk_object_type = "user",
       risk_score = 30,
       risk_rule = "AUTH-001_excessive_login_failure",
       mitre_technique = "T1110"

[RBA ์ง‘๊ณ„๋ฃฐ]

FROM risk-events
| WHERE @timestamp > NOW() - 24 hours
| STATS total_score = SUM(risk_score),
        distinct_rules = COUNT_DISTINCT(risk_rule),
        triggered_rules = VALUES(risk_rule),
        techniques = VALUES(mitre_technique)
    BY risk_object, risk_object_type
| WHERE total_score >= 100 OR distinct_rules >= 3
| SORT total_score DESC

ํ”Œ๋žซํผ์ด ๋‹ฌ๋ผ๋„ ๋ผˆ๋Œ€๋Š” ๋˜‘๊ฐ™๋‹ค๋Š” ๊ฒŒ ๋ณด์ด์‹ค ๊ฒ๋‹ˆ๋‹ค. ์ ์ˆ˜๋ฅผ ์Œ“๋Š” ์ธต๊ณผ ํŒ๋‹จํ•˜๋Š” ์ธต์„ ๋ถ„๋ฆฌํ•œ๋‹ค, ์ด๊ฑฐ ํ•˜๋‚˜์˜ˆ์š”.

์šด์˜ ํŒ

์šด์˜ํ•˜๋ฉด์„œ ์กฐ์ •ํ•  ๋ถ€๋ถ„์€ ์„ธ ๊ฐ€์ง€ ์ •๋„์ž…๋‹ˆ๋‹ค. Usecase๋ณ„ ์ ์ˆ˜ ๋ฐฐ๋ถ„(์น˜๋ช…์ ์ธ ํ–‰์œ„์ผ์ˆ˜๋ก ๋†’๊ฒŒ), ์ง‘๊ณ„ ์œˆ๋„์šฐ(24์‹œ๊ฐ„์ด ๊ธฐ๋ณธ์ด์ง€๋งŒ ์ €์† ๊ณต๊ฒฉ ๋Œ€๋น„๋กœ 7์ผ ์œˆ๋„์šฐ๋ฅผ ํ•˜๋‚˜ ๋” ๋‘๋Š” ๊ฒƒ๋„ ๋ฐฉ๋ฒ•), ๊ทธ๋ฆฌ๊ณ  ์ž„๊ณ„์น˜์ž…๋‹ˆ๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ ์™„๋ฒฝํ•˜๊ฒŒ ์žก์œผ๋ ค ํ•˜๊ธฐ๋ณด๋‹ค ์ผ๋‹จ ๊ตด๋ฆฌ๋ฉด์„œ notable ์ˆ˜๋ฅผ ๋ณด๊ณ  ๋งž์ถ”๋Š” ๊ฒŒ ํ˜„์‹ค์ ์ž…๋‹ˆ๋‹ค.

๋งˆ๋ฌด๋ฆฌ

์ •๋ฆฌํ•˜๋ฉด ์ด๋ ‡์Šต๋‹ˆ๋‹ค. ์˜คํƒ/์ •ํƒ ์ด๋ถ„๋ฒ•์— TP-benign์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฃฐ ๋กœ์ง์˜ ๋ฌธ์ œ์™€ ์ปจํ…์ŠคํŠธ์˜ ๋ฌธ์ œ๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ๋ณผ ์ˆ˜ ์žˆ๊ณ , RBA๋ฅผ ์–น์œผ๋ฉด benign activity๋Š” ์กฐ์šฉํžˆ ์ ์ˆ˜๋งŒ ์Œ“๋‹ค ์‚ฌ๋ผ์ง€๊ณ  ์ง„์งœ ๊ณต๊ฒฉ ํ๋ฆ„์€ ๋ˆ„์ ์œผ๋กœ ๋“œ๋Ÿฌ๋‚ฉ๋‹ˆ๋‹ค.

์‚ฌ์‹ค ์˜ค๋Š˜ ๋‹ค๋ฃฌ ๊ฑด ๋ง›๋ณด๊ธฐ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ์ ์ˆ˜ ์„ค๊ณ„๋ฅผ ์–ด๋–ป๊ฒŒ ํ•˜๋Š”์ง€, ํ‚ฌ์ฒด์ธ ๋‹จ๊ณ„๋ณ„๋กœ Usecase๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐฐ์น˜ํ•˜๋Š”์ง€, ์ ์ˆ˜ ๊ฐ์‡ (decay)๋‚˜ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ์™€์˜ ์กฐํ•ฉ์€ ์–ด๋–ป๊ฒŒ ๊ฐ€์ ธ๊ฐ€๋Š”์ง€ ๋“ฑ ์‹ค์ „์—์„œ ๋ถ€๋”ชํžˆ๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ํ›จ์”ฌ ๋งŽ๊ฑฐ๋“ ์š”. ๋‹ค์Œ์—๋Š” Threat Detection Panorama์™€ RBA, ๊ทธ๋ฆฌ๊ณ  RBA์˜ ํ•ต์‹ฌ์ธ Finding-Based Detection์„ ์ œ๋Œ€๋กœ ํŒŒ๋Š” ์ƒ์„ธ ํฌ์ŠคํŠธ๋กœ ์ฐพ์•„์˜ค๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ์—ฌ๊ธฐ๊นŒ์ง€ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

profile

Yozzang์˜ Cyber์ผ๊ธฐ ๐Ÿ’ป

@์š”์งฑ

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!