๋ณด์ ์ ์ฑ ์ด๋ฆ, ์ผ์น ๊ท์น ์ฐ์ ์์, ๊ด๋ จ ์์ , ๊ด๋ จ ์ ๋ณด์ ๋ํ Google Cloud Armor ์์ฒญ๋ณ ๋ก๊ทธ๋ ์ธ๋ถ ์ ํ๋ฆฌ์ผ์ด์ ๋ถํ ๋ถ์ฐ๊ธฐ ๋ฐ ์ธ๋ถ ํ๋ก์ ๋คํธ์ํฌ ๋ถํ ๋ถ์ฐ๊ธฐ์ ๋ํ ๋ก๊น ์ ์ผ๋ถ๋ก ๋ก๊น ๋ฉ๋๋ค. ์ ๋ฐฑ์๋ ์๋น์ค ๋ก๊น ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์ง๋์ด ์์ผ๋ฏ๋ก Google Cloud Armor์ ์ ์ฒด ๋ก๊น ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๋ ค๋ฉด ๋ก๊น ์ ์ฌ์ฉ ์ค์ ํด์ผ ํฉ๋๋ค.
Google Cloud Armor ๋ก๊ทธ๋ Cloud Load Balancing ๋ก๊ทธ์ ์ผ๋ถ์ ๋๋ค. ์ฆ, Google Cloud Armor ๋ก๊ทธ ์์ฑ์๋ ๋ถํ ๋ถ์ฐ๊ธฐ์ ๊ตฌ์ฑ๋ ๋ก๊ทธ ์ํ๋ง ๋ ์ดํธ๊ฐ ์ ์ฉ๋ฉ๋๋ค. ๋ถํ ๋ถ์ฐ๊ธฐ์ ์ํ๋ง ๋ ์ดํธ๋ฅผ ์ค์ด๋ฉด Google Cloud Armor ์์ฒญ ๋ก๊ทธ๊ฐ ์ค์ด๋ ๋ ์ดํธ๋ก ์ํ๋ง๋ฉ๋๋ค. ๋ํ ๊ต์ฐจ ํ๋ก์ ํธ ์๋น์ค ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ถํ ๋ถ์ฐ๊ธฐ์ ํ๋ฐํธ์๋ ๋ฐ URL ๋งต์ ํฌํจํ๋ ํธ์คํธ ๋๋ ์๋น์ค ํ๋ก์ ํธ์์ ๋ก๊ทธ๊ฐ ์์ฑ๋ฉ๋๋ค. ๋ฐ๋ผ์ ํ๋ฐํธ์๋ ํ๋ก์ ํธ์ ๊ด๋ฆฌ์๋ ๋ฐฑ์๋ ํ๋ก์ ํธ์ ๊ด๋ฆฌ์์๊ฒ ๋ก๊ทธ์ ์ธก์ ํญ๋ชฉ์ ์ฝ์ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ก๊น
์ ์ฌ์ฉํ๋ฉด Google Cloud Armor ๋ณด์ ์ ์ฑ
์ผ๋ก ํ๊ฐ๋ ๋ชจ๋ ์์ฒญ๊ณผ ๊ฐ์ฅ ๋์ ์ฐ์ ์์ ์ผ์น ๊ท์น์ ๋ฐ๋ผ ์ํ๋ ๊ฒฐ๊ณผ ๋๋ ์กฐ์น๋ฅผ ๋ณผ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๊ฑฐ๋ถ๋ ์์ฒญ์ ๋ณด๋ ค๋ฉด jsonPayload.enforcedSecurityPolicy.outcome="DENY"
๋๋ jsonPayload.statusDetails="denied_by_security_policy"
๊ฐ์ ํํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
๋ํ ๋ณด์ ์ ์ฑ ๋ฐ ๊ท์น์ด ์๋ํ ๋๋ก ์๋ํ๋์ง ํ๊ฐํ๋ ๋ฐ ๋์์ด ๋๋ ์ฌ๋ฌ ๋ก๊น ์์ค์ ์ค์ ํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์์ธ ๋ก๊น ์ ์ฐธ์กฐํ์ธ์.
๋ณด์ ์ ์ฑ ๋ก๊ทธ ํญ๋ชฉ
๋ก๊ทธ ํ์๊ธฐ์ ๋ค์ ๋ก๊ทธ ํญ๋ชฉ์ Google Cloud Armor ๋ณด์ ์ ์ฑ
๋ฐ ๊ท์น ๋ก๊น
์ ๋ํ ๊ฒ์
๋๋ค. ํญ๋ชฉ์๋ jsonPayload
์ ๋ค์ ๊ตฌ์กฐ๊ฐ ํฌํจ๋ฉ๋๋ค. HTTP ์์ฒญ ์ธ๋ถ์ ๋ณด๋ httpRequest
๋ฉ์์ง์ ํ์๋ฉ๋๋ค.
statusDetails
: ์๋ต ์ฝ๋์ ํ ์คํธ ์ค๋ชredirected_by_security_policy
: ์์ฒญ์ดGOOGLE_RECAPTCHA
๋๋EXTERNAL_302
๋ฆฌ๋๋ ์ ๊ท์น์ ์ํด ๋ฆฌ๋๋ ์ ๋์์ต๋๋ค.denied_by_security_policy
: ์์ฒญ์ด Google Cloud Armor ๋ณด์ ์ ์ฑ ์ผ๋ก ์ธํด ๋ถํ ๋ถ์ฐ๊ธฐ์ ์ํด ๊ฑฐ๋ถ๋์์ต๋๋ค.body_denied_by_security_policy
: Google Cloud Armor ๋ณด์ ์ ์ฑ ์ผ๋ก ์ธํด ๋ถํ ๋ถ์ฐ๊ธฐ์์ ์์ฒญ ๋ณธ๋ฌธ์ด ๊ฑฐ๋ถ๋์์ต๋๋ค.
enforcedSecurityPolicy
: ์ ์ฉ๋ ๋ณด์ ์ ์ฑ ๊ท์นname
: ๋ณด์ ์ ์ฑ ์ ์ด๋ฆpriority
: ๋ณด์ ์ ์ฑ ์์ ์ผ์นํ๋ ๊ท์น์ ์ซ์ ์ฐ์ ์์adaptiveProtection
: ํด๋น๋๋ ๊ฒฝ์ฐ ์๋์ผ๋ก ๋ฐฐํฌ๋ Adaptive Protection ๊ท์น์ ๋ํ ์ ๋ณด์ ๋๋ค.autoDeployAlertId
: Adaptive Protection์์ ๊ฐ์งํ ์ด๋ฒคํธ์ ์๋ฆผ ID์ ๋๋ค.
configuredAction
: ์ผ์นํ๋ ๊ท์น์ ๊ตฌ์ฑ๋ ์์ ์ด๋ฆ์ ๋๋ค. ์:ALLOW
,DENY
,GOOGLE_RECAPTCHA
,EXTERNAL_302
,THROTTLE
(์ ํ ๊ท์น์ ๊ฒฝ์ฐ),RATE_BASED_BAN
(๋น์จ ๊ธฐ๋ฐ ์ฐจ๋จ ๊ท์น์ ๊ฒฝ์ฐ)rateLimitAction
: ์ ํ ๊ท์น ๋๋ ๋น์จ ๊ธฐ๋ฐ ์ฐจ๋จ ๊ท์น์ด ์ผ์นํ ๋ ๋น์จ ์ ํ ์์ ์ ๋ํ ์ ๋ณดkey
: ๋น์จ ์ ํ ํค ๊ฐ(์ต๋ 36๋ฐ์ดํธ) ํค ์ ํ์ดALL
์ด๊ฑฐ๋, ํค ์ ํ์ดHTTP-HEADER
๋๋HTTP-COOKIE
์ธ๋ฐ ์ง์ ๋ ํค๋ ๋๋ ์ฟ ํค๊ฐ ์์ฒญ์ ์๋ ๊ฒฝ์ฐ ์ด ํ๋๋ ์๋ต๋ฉ๋๋ค.outcome
: ๊ฐ๋ฅํ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.- ๊ตฌ์ฑ๋ ๋น์จ ์ ํ ๊ธฐ์ค ๋ฏธ๋ง์ธ ๊ฒฝ์ฐ
"RATE_LIMIT_THRESHOLD_CONFORM"
- ๊ตฌ์ฑ๋ ๋น์จ ์ ํ ๊ธฐ์ค์ ์ด๊ณผํ๋ ๊ฒฝ์ฐ
"RATE_LIMIT_THRESHOLD_EXCEED"
- ๊ตฌ์ฑ๋ ์ฐจ๋จ ๊ธฐ์ค์ ์ด๊ณผํ๋ ๊ฒฝ์ฐ
"BAN_THRESHOLD_EXCEED"
- ๊ตฌ์ฑ๋ ๋น์จ ์ ํ ๊ธฐ์ค ๋ฏธ๋ง์ธ ๊ฒฝ์ฐ
outcome
: ๊ตฌ์ฑ๋ ์์ ์ ์คํํ ๊ฒฐ๊ณผ์ ๋๋ค. ์:ACCEPT
,DENY
,REDIRECT
,EXEMPT
preconfiguredExprIds
: ๊ท์น์ ํธ๋ฆฌ๊ฑฐํ ๋ชจ๋ ์ฌ์ ๊ตฌ์ฑ๋ WAF ๊ท์น ํํ์์ IDthreatIntelligence
: Google Threat Intelligence์ ์ผ์นํ๋ IP ์ฃผ์ ๋ชฉ๋ก์ ๋ํ ์ ๋ณด(ํด๋นํ๋ ๊ฒฝ์ฐ)categories
: ์ผ์นํ๋ IP ์ฃผ์ ๋ชฉ๋ก ์ด๋ฆ
addressGroup
: ์ผ์นํ๋ ์ฃผ์ ๊ทธ๋ฃน์ ๋ํ ์ ๋ณด(ํด๋นํ๋ ๊ฒฝ์ฐ)names
: ์ผ์นํ๋ ์ฃผ์ ๊ทธ๋ฃน ์ด๋ฆ
previewSecurityPolicy
: ์์ฒญ์ด ๋ฏธ๋ฆฌ๋ณด๊ธฐ์ฉ์ผ๋ก ๊ตฌ์ฑ๋ ๊ท์น๊ณผ ์ผ์นํ๋ฉด ์ฑ์์ง(๋ฏธ๋ฆฌ๋ณด๊ธฐ ๊ท์น์ด ์ ์ฉ๋ ๊ท์น๋ณด๋ค ์ฐ์ ํ ๋๋ง ํ์๋จ)name
: ๋ณด์ ์ ์ฑ ์ ์ด๋ฆpriority
: ๋ณด์ ์ ์ฑ ์์ ์ผ์นํ๋ ๊ท์น์ ์ซ์ ์ฐ์ ์์configuredAction
: ์ผ์นํ๋ ๊ท์น์ ๊ตฌ์ฑ๋ ์์ ์ด๋ฆ์ ๋๋ค. ์:ALLOW
,DENY
,GOOGLE_RECAPTCHA
,EXTERNAL_302
,THROTTLE
(์ ํ ๊ท์น์ ๊ฒฝ์ฐ),RATE_BASED_BAN
(๋น์จ ๊ธฐ๋ฐ ์ฐจ๋จ ๊ท์น์ ๊ฒฝ์ฐ)rateLimitAction
: ์ ํ ๊ท์น ๋๋ ๋น์จ ๊ธฐ๋ฐ ์ฐจ๋จ ๊ท์น์ด ์ผ์นํ ๋ ๋น์จ ์ ํ ์์ ์ ๋ํ ์ ๋ณดkey
: ๋น์จ ์ ํ ํค ๊ฐ(์ต๋ 36๋ฐ์ดํธ) ํค ์ ํ์ดALL
์ด๊ฑฐ๋, ํค ์ ํ์ดHTTP-HEADER
๋๋HTTP-COOKIE
์ธ๋ฐ ์ง์ ๋ ํค๋ ๋๋ ์ฟ ํค๊ฐ ์์ฒญ์ ์๋ ๊ฒฝ์ฐ ์ด ํ๋๋ ์๋ต๋ฉ๋๋ค.outcome
: ๊ฐ๋ฅํ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.- ๊ตฌ์ฑ๋ ๋น์จ ์ ํ ๊ธฐ์ค ๋ฏธ๋ง์ธ ๊ฒฝ์ฐ
"RATE_LIMIT_THRESHOLD_CONFORM"
- ๊ตฌ์ฑ๋ ๋น์จ ์ ํ ๊ธฐ์ค์ ์ด๊ณผํ๋ ๊ฒฝ์ฐ
"RATE_LIMIT_THRESHOLD_EXCEED"
- ๊ตฌ์ฑ๋ ์ฐจ๋จ ๊ธฐ์ค์ ์ด๊ณผํ๋ ๊ฒฝ์ฐ
"BAN_THRESHOLD_EXCEED"
- ๊ตฌ์ฑ๋ ๋น์จ ์ ํ ๊ธฐ์ค ๋ฏธ๋ง์ธ ๊ฒฝ์ฐ
outcome
: ๊ตฌ์ฑ๋ ์์ ์ ์คํํ ๊ฒฐ๊ณผ์ ๋๋ค. ์:ACCEPT
,DENY
,REDIRECT
,EXEMPT
preconfiguredExprIds
: ๊ท์น์ ํธ๋ฆฌ๊ฑฐํ ๋ชจ๋ ์ฌ์ ๊ตฌ์ฑ๋ WAF ๊ท์น ํํ์์ IDthreatIntelligence
: ์ํ ์ธํ ๋ฆฌ์ ์ค์ ์ผ์นํ๋ IP ์ฃผ์ ๋ชฉ๋ก์ ๋ํ ์ ๋ณด(ํด๋นํ๋ ๊ฒฝ์ฐ)categories
: ์ผ์นํ๋ IP ์ฃผ์ ๋ชฉ๋ก ์ด๋ฆ
addressGroup
: ์ผ์นํ๋ ์ฃผ์ ๊ทธ๋ฃน์ ๋ํ ์ ๋ณด(ํด๋นํ๋ ๊ฒฝ์ฐ)names
: ์ผ์นํ๋ ์ฃผ์ ๊ทธ๋ฃน ์ด๋ฆ
enforcedEdgeSecurityPolicy
: ์ ์ฉ๋ ์์ง ๋ณด์ ์ ์ฑ ๊ท์นname
: ๋ณด์ ์ ์ฑ ์ ์ด๋ฆpriority
: ๋ณด์ ์ ์ฑ ์์ ์ผ์นํ๋ ๊ท์น์ ์ฐ์ ์์configuredAction
: ์ผ์นํ๋ ๊ท์น์ ๊ตฌ์ฑ๋ ์์ ์ด๋ฆ์ ๋๋ค. ์:ALLOW
,DENY
outcome
: ๊ตฌ์ฑ๋ ์์ ์ ์คํํ ๊ฒฐ๊ณผ์ ๋๋ค. ์:ACCEPT
,DENY
previewEdgeSecurityPolicy
: ์์ฒญ์ด ๋ฏธ๋ฆฌ๋ณด๊ธฐ์ฉ์ผ๋ก ๊ตฌ์ฑ๋ ์์ง ๋ณด์ ์ ์ฑ ๊ท์น๊ณผ ์ผ์นํ๋ ๊ฒฝ์ฐ ์ฑ์์งpreviewEdgeSecurityPolicy
๋ก๊ทธ ํญ๋ชฉ์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๊ท์น์ด ์ ์ฉ๋ ๊ท์น๋ณด๋ค ์ฐ์ ํ๋ ๊ฒฝ์ฐ์๋ง ํ์๋ฉ๋๋ค.name
: ๋ณด์ ์ ์ฑ ์ ์ด๋ฆpriority
: ๋ณด์ ์ ์ฑ ์์ ์ผ์นํ๋ ๊ท์น์ ์ซ์ ์ฐ์ ์์configuredAction
: ์ผ์นํ๋ ๊ท์น์ ๊ตฌ์ฑ๋ ์์ ์ด๋ฆ์ ๋๋ค. ์:ALLOW
,DENY
outcome
: ๊ตฌ์ฑ๋ ์์ ์ ์คํํ ๊ฒฐ๊ณผ์ ๋๋ค. ์:ACCEPT
,DENY
๋ก๊ทธ ๋ณด๊ธฐ
Google Cloud Armor ๋ณด์ ์ ์ฑ ๋ก๊ทธ๋Google Cloud ์ฝ์์์๋ง ๋ณผ ์ ์์ต๋๋ค.
์ฝ์
Google Cloud ์ฝ์์์ Google Cloud Armor ์ ์ฑ ์ผ๋ก ์ด๋ํฉ๋๋ค.
์์ ์ ํด๋ฆญํฉ๋๋ค.
๋ก๊ทธ ๋ณด๊ธฐ๋ฅผ ์ ํํฉ๋๋ค.
๋ฐ์ดํฐ ๋ก๊น ์์ฒญ
Google Cloud Armor์ ํจ๊ป ์ฌ์ฉํ ๊ฒฝ์ฐ jsonPayload
์ ๋ค์๊ณผ ๊ฐ์ ์ถ๊ฐ ํ๋๊ฐ ํฌํจ๋ฉ๋๋ค.
securityPolicyRequestData
: ์ต์ข ์ ์ผ๋ก ์ผ์นํ๋ ๊ท์น๊ณผ ๊ด๊ณ์์ด ๋ณด์ ์ ์ฑ ์ ๋ฐ๋ผ ์ฒ๋ฆฌ ์ค์ธ ์์ฒญ๊ณผ ๊ด๋ จ๋ ๋ฐ์ดํฐrecaptchaActionToken
: reCAPTCHA ์์ ํ ํฐ๊ณผ ๊ด๋ จ๋ ๋ฐ์ดํฐscore
: reCAPTCHA ์์ ํ ํฐ์ ์ฝ์ ๋ ์ฌ์ฉ์ ์ ๋ฒ์ฑ ์ ์. reCAPTCHA ์์ ํ ํฐ์ด ์์ฒญ์ ์ฐ๊ฒฐ๋๊ณ ๋ณด์ ์ ์ฑ ๊ท์น์ ๋ฐ๋ผ ์ฑ๊ณต์ ์ผ๋ก ๋์ฝ๋ฉ๋๋ ๊ฒฝ์ฐ์๋ง ํ์๋ฉ๋๋ค. ์์ธํ ๋ด์ฉ์ reCAPTCHA ํ๊ฐ ์ํ์ ์ฐธ์กฐํ์ธ์.
recaptchaSessionToken
: reCAPTCHA ์ธ์ ํ ํฐ๊ณผ ๊ด๋ จ๋ ๋ฐ์ดํฐ.score
: reCAPTCHA ํ ํฐ์ ์ฝ์ ๋ ์ฌ์ฉ์ ์ ๋ฒ์ฑ ์ ์. reCAPTCHA ์ธ์ ํ ํฐ์ด ์์ฒญ์ ์ฐ๊ฒฐ๋๊ณ ๋ณด์ ์ ์ฑ ๊ท์น์ ๋ฐ๋ผ ์ฑ๊ณต์ ์ผ๋ก ๋์ฝ๋ฉ๋๋ ๊ฒฝ์ฐ์๋ง ํ์๋ฉ๋๋ค.
tlsJa4Fingerprint
: ํด๋ผ์ด์ธํธ๊ฐHTTPS
,HTTP/2
,HTTP/3
์ ์ฌ์ฉํ์ฌ ์ฐ๊ฒฐํ๋ ๊ฒฝ์ฐ JA4 TTL/SSL ๋์งํธ ์ง๋ฌธ์ ๋๋ค. ๋์งํธ ์ง๋ฌธ์ ์ฌ์ฉํ ์ ์๊ณ ์ ์ฑ ์ ํํ์์ด ์์ฒญ๊ณผ ์ผ์นํ๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ์์ฒญ์ ํ๊ฐํ๋ ๋ณด์ ์ ์ฑ ์ด ์์ ๋๋ง ์ ๊ณต๋ฉ๋๋ค.tlsJa3Fingerprint
: ํด๋ผ์ด์ธํธ๊ฐHTTPS
,HTTP/2
,HTTP/3
์ ์ฌ์ฉํ์ฌ ์ฐ๊ฒฐํ๋ ๊ฒฝ์ฐ JA3 TTL/SSL ๋์งํธ ์ง๋ฌธ์ ๋๋ค. ๋์งํธ ์ง๋ฌธ์ ์ฌ์ฉํ ์ ์๊ณ ์ ์ฑ ์ ํํ์์ด ์์ฒญ๊ณผ ์ผ์นํ๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ์์ฒญ์ ํ๊ฐํ๋ ๋ณด์ ์ ์ฑ ์ด ์์ ๋๋ง ์ ๊ณต๋ฉ๋๋ค.
๋ก๊ทธ ์์
๋ค์์ ์์ฒญ์ ์ฐจ๋จํ๋ ์ ํ ๊ท์น์ ๋ก๊ทธ ์ธ๋ถ์ ๋ณด ์์์ ๋๋ค.
jsonPayload: { enforcedSecurityPolicy: { priority: 100 name: "sample-prod-policy" configuredAction: "THROTTLE" outcome: "DENY" rateLimitAction: { key:"sample-key" outcome:"RATE_LIMIT_THRESHOLD_EXCEED" } } @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry" statusDetails: "denied_by_security_policy" } httpRequest: {8} resource: {2} timestamp: "2021-03-17T19:16:48.185763Z"
๋ค์์ ์์ฒญ์ ์ฐจ๋จํ๋ ๋น์จ ๊ธฐ๋ฐ ์ฐจ๋จ ๊ท์น์ ๋ก๊ทธ ์ธ๋ถ์ ๋ณด ์์์ ๋๋ค.
jsonPayload: { @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry" enforcedSecurityPolicy: { priority: 150 name: "sample-prod-policy" outcome: "DENY" configuredAction: "RATE_BASED_BAN" rateLimitAction: { key:"sample-key" outcome:"BAN_THRESHOLD_EXCEED" } } statusDetails: "denied_by_security_policy" } httpRequest: {8} resource: {2} timestamp: "2021-03-17T19:27:17.393244Z"
๋ค์ ๋จ๊ณ
- Google Cloud Armor ๋ฌธ์ ํด๊ฒฐ ์์๋ณด๊ธฐ