๋ณด์ ์ ๊ฒ ๋ชจ๋ํฐ(secwatch) ๊ฐ์ด๋
์กฐ์ง(csn)์ผ๋ก ๋ผ์ฐํ ๋ SQL ์ธ์ ์ 2์ฐจ ํ์ ๊ฒฐ๊ณผ(ํต์ง/๊ฒํ /๊ธฐ๋ก)๋ฅผ ํ๋ฉด์์ ๋ณด๊ณ , ๋์ผํ ๋ด์ฉ์ ์กฐ์ง SK๋ก ์ฝ๋ ์ฝ๊ธฐ ์ ์ฉ API๋ก ์กฐํํด AI๊ฐ ์ด์์งํ๋ฅผ ์ ๊ธฐ ์ ๊ฒํ ์ ์๊ฒ ํฉ๋๋ค.
๐ ๊ฐ์
GIIP์ secwatch(Jev ๊ธฐ๋ฐ SQL ์ธ์ ์
2์ฐจ ํ์ )๋ ์์ง๊ธฐ(lssn)๊ฐ ๋ณด๋ธ ์์ฌ ์ฌ๊ฑด์ ๊ฒ์ดํธ์จ์ด๊ฐ 1์ฐจ ๊ฒฐ์ ๋ก ๋ฃฐ + 2์ฐจ AI ํ์ ์ผ๋ก ๋ถ๋ฅํด tKVSSecurityCheck์ ์ ์ฌํ๊ณ , ๊ฐ ํ์ ์ ๋ผ์ฐํ
๋์์ผ๋ก ๋๋๋๋ค.
๋ผ์ฐํ
(kscRoutedTo) | ํ๋ฉด ํ๊ธฐ | ์๋ฏธ |
|---|---|---|
alert | ํต์ง | ์ ์ถ/์ฐ๊ธฐ ์๋ ์์ฌ ๋๋ ๊ณ ์ ๋ขฐ ๊ณต๊ฒฉ โ ์ฆ์ ํต์ง ๋์ |
review | ๊ฒํ | ๊ณต๊ฒฉ ๊ฐ๋ฅ์ฑ์ ์์ผ๋ ์๋ ํต์ง ์๊ณ๊ฐ ๋ฏธ๋ง โ ์ฌ๋ ๊ฒํ ๋์ |
log | ๊ธฐ๋ก | ์ ์/๋ ธ์ด์ฆ๋ก ํ์ โ ํต์งํ์ง ์๊ณ ๊ฑด์๋ง ๊ธฐ๋ก |
ํ๋ฉด(/ko/admin/secwatch-monitor)์ ์ด ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๊ฐ(์ต๊ทผ 1์๊ฐ/6์๊ฐ/24์๊ฐ/7์ผ)๊ณผ ๋ผ์ฐํ
๋์(์ ์ฒด/ํต์ง/๊ฒํ /๊ธฐ๋ก)์ผ๋ก ํํฐํด ๋ณด์ฌ์ค๋๋ค. ์ด ํ๋ฉด์ ๋ก๊ทธ์ธ ์ ์ ์๊ฒ ๊ณต๊ฐ๋๋ฉฐ, ์๊ธฐ ์กฐ์ง(csn)์ผ๋ก ๋ผ์ฐํ
๋ ๊ฒฐ๊ณผ๋ง ๋ณด์
๋๋ค(์๋ฒ SP๊ฐ ๋ณด์ฅ).
๐ ํ๋ฉด ์ฝ๋ ๋ฒ
ํ๋ฉด์ ๋ ์์ญ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- ์์ง ์ปค๋ฒ๋ฆฌ์ง ํจ๋ โ "๋ฌด์์ ๊ฒ์ฌํ๊ณ ์๊ณ , ์ด๋๋ง ์ด์์ด์๋". ์์ค๋ณ๋ก ๊ฒ์ฌ ๊ฑด์(scanned)ยทํ์ง ๊ฑด์(flagged)ยท๋ง์ง๋ง ๊ฒ์ฌ ์๊ฐ์ ๋ณด์ฌ์ฃผ๋ฉฐ, flagged๊ฐ 0์ด๋ฉด ๐ข ์ ์, 1๊ฑด ์ด์์ด๋ฉด ๐ด ์ด์์ ๋๋ค. ํ์ง๊ฐ ์์ด๋ "๊ฒ์ฌ๋ ๋๊ณ ์๋ค"๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
- ํ์ ๊ฒฐ๊ณผ ์นด๋ โ ๊ฐ ํ์ 1๊ฑด์ด ์นด๋ 1์ฅ. ํ์ ํญ๋ชฉ:
| ํ๋ฉด ํญ๋ชฉ | ํ๋ | ์๋ฏธ |
|---|---|---|
| ์๊ฐ | kscRegdt | ํ์ ์ ์ฌ ์๊ฐ |
| ๋ผ์ฐํ ๋ฐฐ์ง | kscRoutedTo | ํต์ง(alert)/๊ฒํ (review)/๊ธฐ๋ก(log) |
| ์ด๋ฒคํธ ์ ํ | kscFactor | ์ฌ๊ฑด ์ข
๋ฅ(secevt_*) |
| ์ฃผ์ ํ๋ฅ | kscIsInjection | SQL ์ธ์ ์ /๊ณต๊ฒฉ ์ค๋น ํ๋ฅ (0~1, ํ๋ฉด์ %) |
| ์ฌ๊ฐ๋ | kscSeverity | 0 ๋ ธ์ด์ฆ ยท 1 ์ ์ฐฐ ยท 2 ์ด๊ฑฐยท์ฝ๊ธฐ ยท 3 ์ธ์ฆ์ ๋ณดยท๊ฐ์ธ์ ๋ณด ์ฝ๊ธฐ ยท 4 ์ฐ๊ธฐยท๊ถํ ์กฐ์ |
| ๊ณต๊ฒฉ ์ ํ | kscAttackType | ๋ถ๋ฅ๋ ๊ณต๊ฒฉ ์ข ๋ณ |
| ํจํด | kscPatternNo | ๊ฐ์ ๋ฐฉ๋ฒ(csn ๋ด ํจํด ์ผ๋ จ๋ฒํธ) โ ๋ฐ๋ณต ๊ณต๊ฒฉ ์ถ์ ์ฉ |
| ๊ณต๊ฒฉ์ IP | kscActorIp | ๊ณต๊ฒฉ ์ถ์ฒ IP(์ถ์ ยท์ฐจ๋จ์ฉ) |
| ํ๋๊ทธ | kscIsInjection/kscDataExtracted/kscWriteAttempt | ๊ฐ ํ๋ฅ 0.7 ์ด์์ด๋ฉด ์ฃผ์ /๋ฐ์ดํฐ์ ์ถ/์ฐ๊ธฐ์๋ ๋ฐฐ์ง |
| ์ ๋ขฐ๋ | kscConfidence | ๋ถ๋ฅ/์ฌ๊ฐ๋ ํ์ ์ ๋ขฐ๋(0~1) |
| ์์ง | kscEngine | ํ์ ์์ง |
| ์์ง๊ธฐ | kscKey | ๊ฒฐ๊ณผ๋ฅผ ์ฌ๋ฆฐ ์์ง๊ธฐ(lssn) |
| ๋ผ์ฐํ ์ด์ | kscWhy | ๊ฒ์ดํธ์จ์ด๊ฐ ๋จ๊ธด ๋ผ์ฐํ ์ฌ์ |
์ฃผ์ ํ๋ฅ ยท๋ฐ์ดํฐ์ ์ถยท์ฐ๊ธฐ์๋๋ 0~1 ํ๋ฅ ๊ฐ์ด๋ฉฐ, ํ๋ฉด์ 0.7 ์ด์์ "์ฑ๋ฆฝ"์ผ๋ก ๋ณด๊ณ ๋ฐฐ์ง๋ฅผ ๋์๋๋ค.
๐ API ์ฐธ์กฐ (์ฝ๊ธฐ ์ ์ฉ โ AI/์ธ๋ถ ํด๋ผ์ด์ธํธ์ฉ)
ํ๋ฉด๊ณผ ๊ฐ์ ๋ด์ฉ์ ์กฐ์ง ์๋ณ๊ฐ(csn)๊ณผ ๊ทธ ์กฐ์ง์ ๋น๋ฐ ํค(SK)๋ก ์ฝ๋ ์ฝ๊ธฐ ์ ์ฉ API์
๋๋ค. ๋ฒ์ฉ ๋์คํจ์ฒ giipApiSk4๋ฅผ ํตํด ๋ ๊ฐ์ SP๋ฅผ ํธ์ถํฉ๋๋ค. ๋ฐ์ดํฐ ์ ์ฌยทํ์ ยท์ฐจ๋จ ๊ธฐ๋ฅ์ ํฌํจํ์ง ์์ต๋๋ค.
๊ณตํต ํธ์ถ ๊ท์ฝ
| ํญ๋ชฉ | ๊ฐ |
|---|---|
| ๋ฉ์๋ | POST (๋๋ GET) |
| URL | https://giipfaw.azurewebsites.net/api/giipApiSk4 |
| ๋ณธ๋ฌธ(form-urlencoded) ๋๋ ์ฟผ๋ฆฌ | text=<๋ช
๋ น>, token=<SK>, jsondata=<JSON> |
text์ ์ฒซ ํ ํฐ์ด ๋ช ๋ น ์ด๋ฆ์ด๊ณ , ์ดํ ํ ํฐ์jsondata์ ํค์ 1:1๋ก ๋งค์นญ๋๋ ํ๋๋ช ์ ๋๋ค. ํ ํฐ์ ์ ์ง ์์ผ๋ฉด ๊ทธ ํ๋ผ๋ฏธํฐ๋ SP ๊ธฐ๋ณธ๊ฐ์ ์๋๋ค(์๋ ์์๊ฐ ๊ฐ์ฅ ์์ ํ ํํ).token์๋ ์กฐ์ง์ SK๋ฅผ ๋ฃ์ต๋๋ค. SK๋ ๊ทธ SK๊ฐ ์ํ ์กฐ์ง(csn)์ ๊ฒฐ๊ณผ๋ง ๋ฐํํฉ๋๋ค(csn์ ๋ฐ๋ก ๋๊ธฐ์ง ์์๋ ์๋์ผ๋ก ๊ทธ ์กฐ์ง์ผ๋ก ์ค์ฝํ).- ์๋ต์ ํญ์ HTTP 200์ด๋ฉฐ ๋ณธ๋ฌธ์
{ "data": [ ... ], "debug": { ... } }ํ์์ ๋๋ค. ์ธ์ฆ/ํ๋ผ๋ฏธํฐ ์ค๋ฅ๋ HTTP 200์ผ๋ก ์ค๊ณ ,data[0]์{ "RstVal": 401|403, "RstMsg": "..." }๊ฐ ๋ด๊น๋๋ค โ AI๋data[0].RstVal์ ๋จผ์ ํ์ธํด์ผ ํฉ๋๋ค.
(1) ํ์ ๊ฒฐ๊ณผ ์กฐํ โ KVSSecurityCheckWindow
| ํ๋(jsondata) | ํ์ | ์๋ฏธ |
|---|---|---|
minutes | ์ ํ | ์กฐํ ์๊ฐ์ฐฝ(๋ถ). ๊ธฐ๋ณธ 60, ์ต๋ 10080(7์ผ). 1์๊ฐ=60 / 6์๊ฐ=360 / 24์๊ฐ=1440 / 7์ผ=10080 |
routedTo | ์ ํ | alert/review/log ์ค ํ๋. ์๋ตํ๋ฉด ์ ์ฒด |
์์ฒญ ์์ (์ต๊ทผ 24์๊ฐ ์ ์ฒด โ ๊ฐ์ฅ ์์ ํ ๊ธฐ๋ณธํ)
export GIIP_API_BASE_URL="https://giipfaw.azurewebsites.net"
export GIIP_SK="๋ฐํ์์๋ง_์ค์ "
curl --fail-with-body -X POST "${GIIP_API_BASE_URL}/api/giipApiSk4" \
--data-urlencode "text=KVSSecurityCheckWindow minutes" \
--data-urlencode "token=${GIIP_SK}" \
--data-urlencode 'jsondata={"minutes":1440}'
์์ฒญ ์์ (์ต๊ทผ 24์๊ฐ ์ค ํต์ง ๋์๋ง)
curl --fail-with-body -X POST "${GIIP_API_BASE_URL}/api/giipApiSk4" \
--data-urlencode "text=KVSSecurityCheckWindow minutes routedTo" \
--data-urlencode "token=${GIIP_SK}" \
--data-urlencode 'jsondata={"minutes":1440,"routedTo":"alert"}'
์ฑ๊ณต ์๋ต (ํ์ 1๊ฑด๋น data[] ํ ํ)
{
"data": [
{
"kscsn": 0, "kscKey": "12345", "kscFactor": "secevt_...",
"kscIsInjection": 0.97, "kscAttackType": "...", "kscSeverity": 4,
"kscDataExtracted": 0.10, "kscWriteAttempt": 0.95, "kscConfidence": 0.9,
"kscEngine": "...", "kscRoutedTo": "alert", "kscActorIp": "...",
"kscPatternNo": 1, "kscStatus": "...", "kscRegdt": "...", "kscWhy": "..."
}
],
"debug": { }
}
- ๊ฐ ํ์ ํ๋ฉด ์นด๋์ ํญ๋ชฉ๊ณผ ๊ทธ๋๋ก ๋์ํฉ๋๋ค(์ "ํ๋ฉด ์ฝ๋ ๋ฒ" ํ ์ฐธ์กฐ).
- SK/AK/ํค/DB ์ฐ๊ฒฐ์ ๋ณด๋ ์ด๋ค ์๋ต์๋ ํฌํจ๋์ง ์์ต๋๋ค.
(2) ์์ง ์ปค๋ฒ๋ฆฌ์ง ์กฐํ โ KVSSecurityCoverageWindow
"๊ฒ์ฌํ์ง๋ง ์ ๋ณด๋ธ(์ ์ ํฌํจ)" ์์ค๋ณ ์ง๊ณ์ ๋๋ค. ํ๋ฉด ์๋จ ์ปค๋ฒ๋ฆฌ์ง ํจ๋๊ณผ ๊ฐ์ ๋ด์ฉ์ ๋๋ค.
| ํ๋(jsondata) | ํ์ | ์๋ฏธ |
|---|---|---|
minutes | ์ ํ | ์กฐํ ์๊ฐ์ฐฝ(๋ถ). ๊ธฐ๋ณธ 1440, ์ต๋ 10080 |
์์ฒญ ์์
curl --fail-with-body -X POST "${GIIP_API_BASE_URL}/api/giipApiSk4" \
--data-urlencode "text=KVSSecurityCoverageWindow minutes" \
--data-urlencode "token=${GIIP_SK}" \
--data-urlencode 'jsondata={"minutes":1440}'
์ฑ๊ณต ์๋ต
{
"data": [
{ "ksvSource": "...", "ksvSystem": "...", "scanned": 1200, "flagged": 0, "lastTs": "...", "status": "normal" }
],
"debug": { }
}
status๋flagged๊ฐ 0์ด๋ฉดnormal, 1๊ฑด ์ด์์ด๋ฉดanomaly์ ๋๋ค.
์ค๋ฅ ์๋ต(๋ API ๊ณตํต)
data[0]์ ๋ด๊ฒจ ์ต๋๋ค(HTTP ์ํ์ฝ๋๋ ํญ์ 200).
| ์กฐ๊ฑด | RstVal | RstMsg |
|---|---|---|
| SK ๋๋ฝ ๋๋ ์ ํจํ์ง ์์ | 401 | Invalid sk |
| ์์ฒญ csn์ด SK์ csn๊ณผ ๋ค๋ฆ(๊ต์ฐจ csn ์ฐจ๋จ) | 403 | csn mismatch (sk ์ csn ๊ณผ ๋ค๋ฆ) |
โ ๏ธ ๋ณด์: SK๋ฅผ URL, ์ด์, ์ ์ฅ์, ํ๋กฌํํธ ๋ณธ๋ฌธ, ๋ก๊ทธ์ ๋ฃ์ง ๋ง์ธ์. ์คํ ํ๊ฒฝ๋ณ์ ๋๋ ๋น๋ฐ ์ ์ฅ์์์๋ง ์ ๋ฌํฉ๋๋ค.
๐ค AI ํธ์ถ ๊ณ ์ ์ ์ฐจ (์ด์์งํ ํ์ )
- ์กฐ์ง๋ณ ์กฐํ: ์ ๊ฒํ ๊ฐ ์กฐ์ง์ SK๋ก
KVSSecurityCheckWindow๋ฅผ ํธ์ถํ๋ค. ์๊ฐ์ฐฝ์ ์ ๊ฒ ์ฃผ๊ธฐ์ ๋ง์ถ๋ค(์: ๋งค์ ์ ๊ฒ์ด๋ฉดminutes=60, ํ๋ฃจ 1ํ๋ฉดminutes=1440). - ์ธ์ฆ ํ์ธ: ์๋ต
data[0].RstVal์ด 401/403์ด๋ฉด ๊ทธ ์กฐ์ง์ SK๊ฐ ์๋ชป๋๊ฑฐ๋ ์ ๊ทผ ๋ถ๊ฐ๋ก ๋ณด๊ณ ํ๊ณ ๋ค์ ์กฐ์ง์ผ๋ก ๋์ด๊ฐ๋ค. - ์ด์์งํ ํ์ :
data[]์์kscRoutedTo๊ฐalert(ํต์ง) ๋๋review(๊ฒํ )์ธ ํ์ด ํ๋๋ผ๋ ์์ผ๋ฉด ์ด์์งํ๋ก ๋ณด๊ณ ํ๋ค.log(๊ธฐ๋ก)๋ง ์์ผ๋ฉด ์ ์ ๊ธฐ๋ก์ผ๋ก ๋ณธ๋ค. - ์ฐ์ ์์ํ: ๋ณด๊ณ ์
kscSeverity(์ฌ๊ฐ๋ 0~4)์kscIsInjection(์ฃผ์ ํ๋ฅ )์ด ๋์ ์์ผ๋ก ์ ๋ ฌํ๊ณ ,kscActorIpยทkscPatternNo๋ก ๊ฐ์ ๊ณต๊ฒฉ์/๊ฐ์ ๋ฐฉ๋ฒ์ ๋ฐ๋ณต ์ฌ๋ถ๋ฅผ ํจ๊ป ์ ๋๋ค. - ์ปค๋ฒ๋ฆฌ์ง ๊ต์ฐจ ํ์ธ:
KVSSecurityCoverageWindow๋ก ๊ฐ ์์ค๊ฐ ์ค์ ๋ก ๊ฒ์ฌ๋๊ณ ์๋์ง ํ์ธํ๋ค. ์ด๋ค ์์ค์status๊ฐanomaly๋ฉด ๊ทธ ์์ค๋ฅผ ์ฐ์ ์ ๊ฒํ๊ณ , ๊ธฐ๋ํ ์์ค๊ฐ ์ปค๋ฒ๋ฆฌ์ง์ ์์ ์์ผ๋ฉด "์์ง ๋๋ฝ ๊ฐ๋ฅ"์ผ๋ก ํจ๊ป ๋ณด๊ณ ํ๋ค. - ์ ์กฐ์ง ์ค์: ๊ณ์ ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ ๊ฐ ์กฐ์ง(csn)์ ๋ํด 1~5๋ฅผ ๋ฐ๋ณตํ๋ค. SK๋ ์กฐ์ง ๋จ์์ด๋ฏ๋ก, ์ฌ๋ฌ ์กฐ์ง์ ์ ๊ฒํ๋ ค๋ฉด ๊ฐ ์กฐ์ง์ SK๋ก ๊ฐ๊ฐ ํธ์ถํ๋ค.
๐ ๋ฌธ์ ํด๊ฒฐ
| ์ฆ์ | ์์ธ | ํด๊ฒฐ |
|---|---|---|
| ํ๋ฉด์ "์ ๊ทผ ๊ฑฐ๋ถ" | ๋ก๊ทธ์ธํ์ง๋ง ๊ทธ ์กฐ์ง(csn) ์ปจํ ์คํธ/์์์ด ์์ | ํด๋น ์กฐ์ง ์์ ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธ. API๋ก๋ ๊ทธ ์กฐ์ง SK๋ฅผ ์ฐ๋ฉด ํ๋ฉด ์์ด๋ ์กฐํ ๊ฐ๋ฅ |
API data[0].RstVal=401 | SK ๋๋ฝ ๋๋ ๋ฌดํจ | token์ ์ฌ๋ฐ๋ฅธ ์กฐ์ง SK ์ ๋ฌ(ํ๊ฒฝ๋ณ์) |
API data[0].RstVal=403 | ์์ฒญ csn์ด SK์ csn๊ณผ ๋ค๋ฆ | csn์ ๋ฐ๋ก ๋๊ธฐ์ง ๋ง๊ณ ๊ทธ ์กฐ์ง SK๋ง ์ฌ์ฉ(SK๊ฐ csn์ ๊ฒฐ์ ) |
data๊ฐ ๋น ๋ฐฐ์ด | ๊ทธ ์๊ฐ์ฐฝ์ ํด๋น ์กฐ์ง ํ์ ๊ฒฐ๊ณผ๊ฐ ์์ | ์ ์(์ด์์งํ ์์)์ผ๋ก ๋ณธ๋ค. minutes๋ฅผ ๋๋ ค ์ฌ์กฐํ ๊ฐ๋ฅ |
| ์ปค๋ฒ๋ฆฌ์ง๊ฐ ๋น์ด ์์ | ๊ทธ ์๊ฐ์ฐฝ์ ์์ง ์ปค๋ฒ๋ฆฌ์ง ์ง๊ณ๊ฐ ์์ | ์์ง๊ธฐ๊ฐ ๋๋์ง ํ์ธํ๊ณ minutes๋ฅผ ๋๋ ค ์ฌ์กฐํ |
API ์ฐธ์กฐ
์ด ๊ฐ์ด๋๋ API ์์ธ(์๋ํฌ์ธํธยทํ๋ผ๋ฏธํฐยท์๋ตยท์ค๋ฅ)๋ฅผ ์ "๐ API ์ฐธ์กฐ" ์ ์ ์์ฒด ์๊ฒฐ์ ์ผ๋ก ํฌํจํฉ๋๋ค. ๋ณ๋ API ๊ฐ์ด๋๋ ์์ต๋๋ค.
๋ฒ์ : 1.0
์ต์ข
์
๋ฐ์ดํธ: 2026-10-30
๋ณ๊ฒฝ ์ด๋ ฅ: giip 4314 โ secwatch ๋ณด์ ์ ๊ฒ ๋ชจ๋ํฐ ์ ์ ๊ฐ์ด๋ ์ ๊ท ์์ฑ. ํ์ ๊ฒฐ๊ณผ(KVSSecurityCheckWindow)ยท์์ง ์ปค๋ฒ๋ฆฌ์ง(KVSSecurityCoverageWindow) SK ์ฝ๊ธฐ ์ ์ฉ API ๋ฌธ์ํ, AI ์ด์์งํ ํ์ ๊ณ ์ ์ ์ฐจ ํฌํจ.
์์ค ํ์ผ: giipv3/public/help/secwatch.ko.md
๊ด๋ จ ์ฌ๋ก
- ์๊ทธ๋์ฒ ํ์ง๊ฐ ์นจ๋ฌตํ ๋ โ sec-watch ์กฐ์ฌ ์ฌ๋ก: ๊ด๋ฆฌํ WAF ์๊ทธ๋์ฒ ๋ฃฐ์ด ๋ฐ์ํ์ง ์์ ์ค์ ์ ์ฐฐ ์บ ํ์ธ์ sec-watch๊ฐ ํ๋ฉดํํ๊ณ ์๋ณธ ๋ก๊ทธ์ ๋์กฐํด ๋น์ผ ๋ณด๊ณ ํ ์ฌ๋ก.