์ด ํ์ด์ง์๋ ๋ด ๊ด๋ฆฌ๋ฅผ ์ํ Google Cloud Armor ๋ณด์ ์ ์ฑ ๊ท์น์ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ๋ด ๊ด๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ ค๋ฉด ๋จผ์ ๋ด ๊ด๋ฆฌ ๊ฐ์์ ์ ๋ณด๋ฅผ ์์งํด์ผ ํฉ๋๋ค.
์์ํ๊ธฐ ์ ์
๋ค์ ์น์
์์๋ Google Cloud Armor ๋ณด์ ์ ์ฑ
์ ๊ตฌ์ฑํ๋ ๋ฐ ํ์ํ ๋ชจ๋ Identity and Access Management(IAM) ์ญํ ๋ฐ ๊ถํ์ ์ค๋ช
ํฉ๋๋ค. ์ด ๋ฌธ์์ ์ฌ์ฉ ์ฌ๋ก์์๋ compute.securityPolicies.create
๋ฐ compute.securityPolicies.update
๊ถํ๋ง ํ์ํฉ๋๋ค.
Google Cloud Armor ๋ณด์ ์ ์ฑ ์ IAM ๊ถํ ์ค์
๋ค์ ์์
์๋ Identity and Access Management(IAM) Compute ๋ณด์ ๊ด๋ฆฌ์ ์ญํ (roles/compute.securityAdmin
)์ด ํ์ํฉ๋๋ค.
- Google Cloud Armor ๋ณด์ ์ ์ฑ ๊ตฌ์ฑ, ์์ , ์ ๋ฐ์ดํธ, ์ญ์
- ๋ค์ API ๋ฉ์๋ ์ฌ์ฉ:
SecurityPolicies insert
SecurityPolicies delete
SecurityPolicies patch
SecurityPolicies addRule
SecurityPolicies patchRule
SecurityPolicies removeRule
Compute ๋คํธ์ํฌ ๊ด๋ฆฌ์ ์ญํ (roles/compute.networkAdmin
)์ด ์๋ ์ฌ์ฉ์๋ ๋ค์ ์์
์ ์ํํ ์ ์์ต๋๋ค.
- ๋ฐฑ์๋ ์๋น์ค์ Google Cloud Armor ๋ณด์ ์ ์ฑ ์ค์
- ๋ค์ API ๋ฉ์๋ ์ฌ์ฉ:
BackendServices setSecurityPolicy
BackendServices list
(gcloud
๋ง)
๋ณด์ ๊ด๋ฆฌ์ ์ญํ (roles/iam.securityAdmin
) ๋ฐ Compute ๋คํธ์ํฌ ๊ด๋ฆฌ์ ์ญํ ์ด ์๋ ์ฌ์ฉ์๋ SecurityPolicies
API ๋ฉ์๋ get
, list
, getRule
์ ์ฌ์ฉํ์ฌ Google Cloud Armor ๋ณด์ ์ ์ฑ
์ ๋ณผ ์ ์์ต๋๋ค.
์ปค์คํ ์ญํ ์ ๋ํ IAM ๊ถํ ์ค์
๋ค์ ํ์๋ IAM ์ญํ ์ ๊ธฐ๋ณธ ๊ถํ๊ณผ ๊ด๋ จ API ๋ฉ์๋๊ฐ ๋์ ์์ต๋๋ค.
IAM ๊ถํ | API ๋ฉ์๋ |
---|---|
compute.securityPolicies.create |
SecurityPolicies insert |
compute.securityPolicies.delete |
SecurityPolicies delete |
compute.securityPolicies.get |
SecurityPolicies get SecurityPolicies getRule |
compute.securityPolicies.list |
SecurityPolicies list |
compute.securityPolicies.use |
BackendServices setSecurityPolicy |
compute.securityPolicies.update |
SecurityPolicies patch SecurityPolicies addRule SecurityPolicies patchRule SecurityPolicies removeRule |
compute.backendServices.setSecurityPolicy |
BackendServices setSecurityPolicy |
reCAPTCHA ์๋ ํ ์คํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๊ฐ๊ณผ ์๋ ํด๋ผ์ด์ธํธ ๊ตฌ๋ณ
Google Cloud Armor์ ํจ๊ป reCAPTCHA ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด CHALLENGEPAGE
์ ํ์ reCAPTCHA WAF ์ฌ์ดํธ ํค(reCAPTCHA ํค)๋ฅผ ๋ณด์ ์ ์ฑ
๊ณผ ์ฐ๊ฒฐํด์ผ ํฉ๋๋ค. reCAPTCHA ํค์ ๋ํ ์์ธํ ๋ด์ฉ์ reCAPTCHA ํค ๊ฐ์๋ฅผ ์ฐธ์กฐํ์ธ์.
์์ฒด reCAPTCHA ํค๋ฅผ ๋ณด์ ์ ์ฑ ๊ณผ ์ฐ๊ฒฐํ๊ฑฐ๋ ์ฐ๊ฒฐ ํด์ ํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
gcloud compute security-policies update SECURITY_POLICY \ --recaptcha-redirect-site-key SITE_KEY
๋ค์์ ๋ฐ๊ฟ๋๋ค.
SECURITY_POLICY
: ๋ณด์ ์ ์ฑ ์ ์ด๋ฆSITE_KEY
: reCAPTCHACHALLENGEPAGE
ํค
reCAPTCHA ํค ์ฐ๊ฒฐ
๋ค์ ์์์์๋ reCAPTCHA ํค๋ฅผ ๋ณด์ ์ ์ฑ ๊ณผ ์ฐ๊ฒฐํฉ๋๋ค. ์ฐ๊ฒฐ๋ reCAPTCHA ํค๋ ํน์ ๋ณด์ ์ ์ฑ ์ ๋ฐ๋ผ ์๋ ํ ์คํธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๋ชจ๋ ๊ท์น์ ์ ์ฉ๋ฉ๋๋ค.
gcloud compute security-policies update SECURITY_POLICY \ --recaptcha-redirect-site-key "SITE_KEY"
reCAPTCHA ํค ์ฐ๊ฒฐ ํด์
reCAPTCHA ํค์ ๋ณด์ ์ ์ฑ ์ ์ฐ๊ฒฐ์ ํด์ ํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
gcloud compute security-policies update SECURITY_POLICY \ --recaptcha-redirect-site-key ""
reCAPTCHA ํ๊ฐ๋ฅผ ์ํด ํธ๋ํฝ ๋ฆฌ๋๋ ์
reCAPTCHA ํค๋ฅผ ๋ณด์ ์ ์ฑ ๊ณผ ์ฐ๊ฒฐํ ๊ฒฝ์ฐ ํด๋น ์ ์ฑ ๋ด์์ reCAPTCHA ํ๊ฐ๋ฅผ ์ํด ํธ๋ํฝ์ ๋ด๋ถ์ ์ผ๋ก ๋ฆฌ๋๋ ์ ํ๋ ๊ท์น์ ๋ง๋ค ์ ์์ต๋๋ค. gcloud CLI์์ ๋ค์ ํ์์ ์ฌ์ฉํ์ฌ ํธ๋ํฝ์ ๋ฆฌ๋๋ ์ ํฉ๋๋ค.
gcloud compute security-policies rules create PRIORITY \ --security-policy SECURITY_POLICY \ {--expression EXPRESSION | --src-ip-ranges SRC_IP_RANGE} \ --action redirect \ --redirect-type google-recaptcha
๋ค์์ ๋ฐ๊ฟ๋๋ค.
PRIORITY
: ๊ท์น์ ๋ง๋ค ๋ ๋ฐ๋ฅด๋ ์ฐ์ ์์SECURITY_POLICY
: ๋ณด์ ์ ์ฑ ์ ์ด๋ฆEXPRESSION
: reCAPTCHA ํ๊ฐ๋ฅผ ์ ์ฉํ ํธ๋ํฝ๊ณผ ์ผ์นํ๋ ์ปค์คํ ๊ท์น ์ธ์ด ํํ์SRC_IP_RANGE
: IP ์ฃผ์ ๋ฒ์. ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ฒ์์ ๋ชจ๋ ์์ฒญ์ reCAPTCHA ํ๊ฐ๋ฅผ ์ ์ฉํฉ๋๋ค.
๋ค์ ์์์์๋ reCAPTCHA ์๋ ํ
์คํธ์ ๋ํด /login.html
์ ๋๋ฌํ๋ ค๊ณ ์๋ํ๋ ํธ๋ํฝ์ ๋ฆฌ๋๋ ์
ํ๋ ๊ท์น์ ๋ง๋ญ๋๋ค.
gcloud compute security-policies rules create 1000 \ --security-policy SECURITY_POLICY \ --expression "request.path.matches(\"/login.html\")" \ --action redirect \ --redirect-type google-recaptcha
reCAPTCHA ์ํํ ํ๊ฐ ์ํ
๊ณ์ํ๊ธฐ ์ ์ reCAPTCHA ์์ ํ ํฐ ๋๋ ์ธ์ ํ ํฐ ์ฌ์ฉ์ ๋ํ ๊ธฐ๋ณธ ์๊ฑด์ ๋ด ๊ด๋ฆฌ ๊ฐ์๋ฅผ ์ฐธ์กฐํ์ธ์.
reCAPTCHA ์์
ํ ํฐ์์ ์์ฑ์ ์ถ์ถํ๋ ค๋ฉด token.recaptcha_action.ATTRIBUTE
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. ATTRIBUTE
๋ฅผ Google Cloud Armor ๊ท์น ์ธ์ด์ ์ ํจํ ํ ํฐ ์์ฑ์ผ๋ก ๋ฐ๊ฟ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก token.recaptcha_session.ATTRIBUTE
๋ฅผ ์ฌ์ฉํ์ฌ reCAPTCHA ์ธ์
ํ ํฐ์์ ์์ฑ์ ์ถ์ถํฉ๋๋ค. ์ฌ์ฉ ๊ฐ๋ฅํ reCAPTCHA ํ ํฐ ์์ฑ์ ๊ตฌ๋ฌธ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๊ท์น ์ธ์ด ์ฐธ์กฐ๋ฅผ ํ์ธํ์ธ์.
์์
ํ ํฐ์ ์น ์ ํ๋ฆฌ์ผ์ด์
, iOS ์ ํ๋ฆฌ์ผ์ด์
๋๋ Android ์ ํ๋ฆฌ์ผ์ด์
์์ ์์๋ ์ ์์ง๋ง ์ธ์
ํ ํฐ์ ์น ์ ํ๋ฆฌ์ผ์ด์
์์๋ง ๋ฐ์ํ ์ ์์ต๋๋ค. ํ๋ซํผ๋ง๋ค ๋ณ๋์ reCAPTCHA ํค๊ฐ ํ์ํฉ๋๋ค. token.recaptcha_action.ATTRIBUTE
๋ฐ token.recaptcha_session.ATTRIBUTE
ํํ์์ ์ด๋ฌํ ํ๋ซํผ์ ํ ํฐ์ ์ ์ฉ๋ฉ๋๋ค. ํ ํฐ์ ํ๋ซํผ๋ง๋ค ๊ตฌ๋ถํ๊ณ ํ ํฐ ๋๋์ ๋ฐฉ์งํ๋ ค๋ฉด ์ด๋ฌํ ํํ์์ ์ฌ์ฉํ๋ ๊ท์น์ ๊ตฌ์ฑํ ๋ reCAPTCHA ํค๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์์
์ฒซ ๋ฒ์งธ ์์์์๋ ์ ์๊ฐ 0.8
์ด์์ธ reCAPTCHA ์์
ํ ํฐ์ผ๋ก /login.html
์ ํ๊ฒํ
ํ๋ ํธ๋ํฝ์ ํ์ฉํ๋ ๊ท์น์ ๋ง๋ญ๋๋ค.
gcloud compute security-policies rules create 1000 \ --security-policy SECURITY_POLICY \ --expression "request.path.matches(\"/login.html\") && token.recaptcha_action.score >= 0.8" \ --action allow
๋ ๋ฒ์งธ ์์๋ ์ฒซ ๋ฒ์งธ ์์์ ๋์ผํ์ง๋ง ์์
ํ ํฐ์ด example-site-key-1
๋๋ example-site-key-2
์ reCAPTCHA ํค๋ก ๋ฐ๊ธ๋์ด์ผ ํฉ๋๋ค.
gcloud compute security-policies rules create 1000 \ --security-policy SECURITY_POLICY \ --expression "request.path.matches(\"/login.html\") && token.recaptcha_action.score >= 0.8" \ --recaptcha-action-site-keys "example-site-key-1,example-site-key-2" \ --action allow
์ธ ๋ฒ์งธ ์์์์๋ example-site-key-3
์ reCAPTCHA ํค๋ก ๋ฐ๊ธ๋ reCAPTCHA ์ธ์
ํ ํฐ์ ์ฌ์ฉํ๊ณ ์ ์๊ฐ 0.8
์ด์์ธ /login.html
์ ํ๊ฒํ
ํ๋ ํธ๋ํฝ์ ํ์ฉํ๋ ๊ท์น์ ๋ง๋ญ๋๋ค.
gcloud compute security-policies rules create 1000 \ --security-policy SECURITY_POLICY \ --expression "request.path.matches(\"/login.html\") && token.recaptcha_session.score >= 0.8" \ --recaptcha-session-site-keys "example-site-key-3" \ --action allow
๋ฆฌ๋๋ ์ (302 ์๋ต)
ํธ๋ํฝ์ ์ฌ์ฉ์ ๊ตฌ์ฑ URL๋ก ๋ฆฌ๋๋ ์ ํ๋ ๊ท์น์ ๋ง๋ค๋ ค๋ฉด Google Cloud CLI์์ ๋ค์ ํ์์ ์ฌ์ฉํฉ๋๋ค.
gcloud compute security-policies rules create PRIORITY \ --security-policy SECURITY_POLICY \ {--expression EXPRESSION | --src-ip-ranges SRC_IP_RANGE} \ --action redirect \ --redirect-type external-302 \ --redirect-target REDIRECT_URL
๋ค์์ ๋ฐ๊ฟ๋๋ค.
PRIORITY
: ๊ท์น์ ๋ง๋ค ๋ ๋ฐ๋ฅด๋ ์ฐ์ ์์SECURITY_POLICY
: ๋ณด์ ์ ์ฑ ์ ์ด๋ฆEXPRESSION
: reCAPTCHA ํ๊ฐ๋ฅผ ์ ์ฉํ ํธ๋ํฝ๊ณผ ์ผ์นํ๋ ์ปค์คํ ๊ท์น ์ธ์ด ํํ์SRC_IP_RANGE
: IP ์ฃผ์ ๋ฒ์. ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ฒ์์ ๋ชจ๋ ์์ฒญ์ reCAPTCHA ํ๊ฐ๋ฅผ ์ ์ฉํฉ๋๋ค.REDIRECT_URL
: ํธ๋ํฝ์ ๋ฆฌ๋๋ ์ ํ URL
๋ค์์ 10.10.10.0/24์์ ๋ค์ด์ค๋ ํธ๋ํฝ์ https://www.example.com์ผ๋ก ๋ฆฌ๋๋ ์ ํ๋ ๊ท์น์ ๋ง๋๋ ์์์ ๋๋ค.
gcloud compute security-policies rules create 1000 \ --security-policy SECURITY_POLICY \ --src-ip-ranges "10.10.10.0/24" \ --action redirect \ --redirect-type external-302 \ --redirect-target "https://www.example.com"
์์ฒญ ๋ฐ์ฝ๋ ์ด์
ํธ๋ํฝ์ ํ์ฉํ์ง๋ง ์ปค์คํ ํค๋์ ์ฌ์ฉ์ ์ ์ ์ ์ ๊ฐ์ ๋ณดํธ๋ ๋ฐฑ์๋๋ก ์ ์กํ๊ธฐ ์ ์ ์ถ๊ฐํ๋ ๊ท์น์ ๋ง๋ค๋ ค๋ฉด gcloud CLI์์ ๋ค์ ํ์์ ์ฌ์ฉํฉ๋๋ค.
gcloud compute security-policies rules create PRIORITY \ --security-policy SECURITY_POLICY \ {--expression EXPRESSION | --src-ip-ranges SRC_IP_RANGE} \ --action allow \ --request-headers-to-add HEADER_1=VALUE_1,HEADER_2=VALUE_2,...
๋ค์์ ๋ฐ๊ฟ๋๋ค.
PRIORITY
: ๊ท์น์ ๋ง๋ค ๋ ๋ฐ๋ฅด๋ ์ฐ์ ์์SECURITY_POLICY
: ๋ณด์ ์ ์ฑ ์ ์ด๋ฆEXPRESSION
: reCAPTCHA ํ๊ฐ๋ฅผ ์ ์ฉํ ํธ๋ํฝ๊ณผ ์ผ์นํ๋ ์ปค์คํ ๊ท์น ์ธ์ด ํํ์SRC_IP_RANGE
: IP ์ฃผ์ ๋ฒ์. ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ฒ์์ ๋ชจ๋ ์์ฒญ์ reCAPTCHA ํ๊ฐ๋ฅผ ์ ์ฉํฉ๋๋ค.HEADER_#
: ์์ฒญ์ ๋ฐ์ฝ๋ ์ด์ ํ ์์ฒญ ํค๋์ ์ด๋ฆVALUE_#
: ์์ฒญ์ ๋ฐ์ฝ๋ ์ด์ ํ ์์ฒญ ํค๋์ ๊ฐ
๋ค์ ์์์์๋ ์์ฒญ์ reCAPTCHA ์์
ํ ํฐ ์ ์๊ฐ 0.2
์ดํ์ธ ๊ฒฝ์ฐ /login.html
์ ํ๊ฒํ
ํ๋ ํธ๋ํฝ์ ํ์ฉํ๋ ๊ท์น์ ๋ง๋ญ๋๋ค.
gcloud compute security-policies rules create 1000 \ --security-policy SECURITY_POLICY \ --expression "request.path.matches("/login.html") && token.recaptcha_action.score < 0.2" \ --action allow \ --request-headers-to-add "reCAPTCHA-Warning=high"
๋ค์ ๋จ๊ณ
- ๋น์จ ์ ํ ๊ฐ์ ๋ณด๊ธฐ
- ๋ด ๊ด๋ฆฌ ์์๋ณด๊ธฐ