์๋น์ค์ ๊ฐ์ฌ ์ ์ฑ ๊ตฌ์ฑ
์ด ํํ ๋ฆฌ์ผ์์๋ ํด๋ฌ์คํฐ ๋ด ์ปจํธ๋กค ํ๋ ์ธ ๊ตฌํ๋ง ์ง์ํฉ๋๋ค.
๊ฐ์ฌ ์ ์ฑ ์ ์ฌ์ฉํ๋ฉด Cloud Service Mesh์์ ์๋น์ค์ ๋ํ ๋ฐ์ดํฐ ์ก์ธ์ค๋ฅผ ๊ฐ์ฌํ ์ ์์ต๋๋ค. ์๋น์ค๋ฅผ ๊ฐ์ฌํ๋ฉด '๋๊ฐ, ๋ฌด์์, ์ธ์ , ์ ํ๋์ง'๋ผ๋ ์ง๋ฌธ์ ๋ตํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๊ฐ์ฌ ์ ์ฑ ์ ์ฌ์ฉํ๋ฉด ๊ฐ์ฌ ๋ก๊ทธ๊ฐ ์์ฑ๋๋ ์์ ๊ณผ ๋ก๊ทธ์ ์ฝํ ์ธ ๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ์ด ๊ฐ์ด๋์์๋ ๊ฐ์ฌ ์ ์ฑ ์ ์ฌ์ฉํ ์ ์๋๋ก Cloud Service Mesh๋ฅผ ์ค์นํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
๊ฐ์ฌ ๋ก๊ทธ๋ Google Cloud ์ฝ์์ Cloud Logging ๋ก๊ทธ ํ์๊ธฐ์์ ํ์ธํ๋ฏ๋ก ๊ฐ์ฌ ์ ์ฑ ์ ๋ค์ ํ๋ซํผ์์๋ง ์ง์๋ฉ๋๋ค.
- Google Cloud์ฉ GKE
- VMware์ฉ Google Distributed Cloud(์ํํธ์จ์ด ์ ์ฉ)
- ๋ฒ ์ด๋ฉํ์ฉ Google Distributed Cloud(์ํํธ์จ์ด ์ ์ฉ)
๊ฐ์ฌ ์ ์ฑ
์ AUDIT
์์
์ ์ถ๊ฐํ์ฌ AuthorizationPolicy๋ฅผ ํ์ฅํฉ๋๋ค. ๋์ ์ ์ฑ
๋ฒ์(์ํฌ๋ก๋, ๋ค์์คํ์ด์ค ๋๋ ์ ์ฒด ๋ฉ์์ผ ์ ์์)์๋ง ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์ ์ฑ
์ ORed
๋ก ๊ฒฐํฉ๋ฉ๋๋ค. ์ฆ, ์ ์ฑ
์ด ๋ค์๊ณผ ๊ฐ์ด ํ์๋๋ฉด ์์ฒญ์ด ๋ก๊น
๋ฉ๋๋ค. ์ง์ ๋ ์ํฌ๋ก๋์ ๊ฐ์ฌ ์ ์ฑ
์ด ์์ผ๋ฉด ํด๋น ์ํฌ๋ก๋์ ๋ํ ๊ฐ์ฌ ๋ก๊ทธ๊ฐ ์์ฑ๋์ง ์์ต๋๋ค.
๋ค์์ myapi
์ /user/profile/*
๊ฒฝ๋ก์ ๋ํ ๋ชจ๋ WRITE ์ก์ธ์ค๋ฅผ ๊ฐ์ฌํ๋ ๊ฐ์ฌ ์ ์ฑ
์ ์์์
๋๋ค.
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
namespace: ns1
name: anyname
spec:
selector:
matchLabels:
app: myapi
action: AUDIT
rules:
- to:
- operation:
methods: ["POST", "UPDATE", "DELETE"]
paths: ["/user/profile/*"]
์ ํ์ฌํญ
- ์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด์๋ ๊ฐ์ฌ ๋ก๊ทธ๊ฐ ์์ต๋๋ค.
- ๊ฐ์ฌ ์ฝํ ์ธ ๋ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
- ํ์ฌ Cloud Service Mesh ๊ฐ์ฌ ๋ก๊ทธ์๋ ์ผ๋ฐ ์ก์ธ์ค ๋ก๊ทธ์ ๋์ผํ ์ ๋ขฐ์ฑ ์์ฑ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ํฌ๋ก๋ ํฌ๋๊ฐ ๋ค์ ์์๋๋ฉด ์ํฌ๋ก๋์ ๋ํ ์ผ๋ถ ๊ฐ์ฌ ๋ก๊ทธ๊ฐ ์ ์ง๋์ง ์๋ ๊ฒฝ์ฐ ์์ค๋ ์ ์์ต๋๋ค.
์์ํ๊ธฐ ์ ์
์ข ์ ๋๊ตฌ ์ค์น ๋ฐ ํด๋ฌ์คํฐ ๊ฒ์ฆ์ ๋จ๊ณ๋ฅผ ๋ฐ๋ผ ๋ค์์ ์ํํฉ๋๋ค.- ํ์ ๋๊ตฌ ์ค์น
asmcli
๋ค์ด๋ก๋- ํด๋ฌ์คํฐ์ ๊ด๋ฆฌ์ ๊ถํ ๋ถ์ฌ
- ํ๋ก์ ํธ ๋ฐ ํด๋ฌ์คํฐ ๊ฒ์ฆ
๊ฒ์ดํธ์จ์ด ๊ตฌ์ฑ ์ค๋น
Cloud Service Mesh๋ ์๋น์ค ๋ฉ์์ ์ผ๋ถ๋ก ๊ฒ์ดํธ์จ์ด๋ฅผ ๋ฐฐํฌ ๋ฐ ๊ด๋ฆฌํ๋ ์ต์ ์ ์ ๊ณตํฉ๋๋ค. ๊ฒ์ดํธ์จ์ด๋ ๋ค์ด์ค๊ฑฐ๋ ๋๊ฐ๋ HTTP/TCP ์ฐ๊ฒฐ์ ์์ ํ๋ ๋ฉ์์ง์ ์์ง์์ ์๋ํ๋ ๋ถํ ๋ถ์ฐ๊ธฐ๋ฅผ ์ค๋ช ํฉ๋๋ค. ๊ฒ์ดํธ์จ์ด๋ ๋ฉ์๋ก ๋ค์ด์ค๊ณ ๋๊ฐ๋ ํธ๋ํฝ์ ๋ฏธ์ธํ๊ฒ ์ ์ดํ ์ ์๋ Envoy ํ๋ก์์ ๋๋ค.
asmcli
๋ istio-ingressgateway
๋ฅผ ์ค์นํ์ง ์์ต๋๋ค. ์ปจํธ๋กค ํ๋ ์ธ๊ณผ ๊ฒ์ดํธ์จ์ด๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ๋ฐฐํฌํ๊ณ ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ๊ฒ์ดํธ์จ์ด ์ค์น ๋ฐ ์
๊ทธ๋ ์ด๋๋ฅผ ์ฐธ์กฐํ์ธ์.
Cloud Service Mesh ์ค์น ๋ง์ถค์ค์
๊ฐ์ฌ ์ ์ฑ ์ ์ฌ์ฉํ๋ ค๋ฉด Cloud Service Mesh ์ค์น๋ฅผ ๋ง์ถค์ค์ ํฉ๋๋ค.
์ค์น
Cloud Service Mesh ์ค์น ๋จ๊ณ๋ฅผ ์ํํฉ๋๋ค.
asmcli install
์ ์คํํ ๋ ๋ค์ ์ต์ ์ ํฌํจํฉ๋๋ค.--option audit-authorizationpolicy
์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
./asmcli install \ --project_id PROJECT_ID \ --cluster_name CLUSTER_NAME \ --cluster_location CLUSTER_LOCATION \ --ca mesh_ca \ --output_dir DIR_PATH \ --enable_all \ --option audit-authorizationpolicy
Cloud Service Mesh๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ํ์ํ ๋ค๋ฅธ ์ค๋ฒ๋ ์ด ํ์ผ์ ์ง์ ํด์ผ ํฉ๋๋ค.
์ํฌ๋ก๋์์ ์๋ ์ฌ์ด๋์นด ํ๋ก์ ์ฝ์ ์ ์ฌ์ฉ ์ค์ ํ๋ ค๋ฉด Cloud Service Mesh ์ค์น๋ฅผ ์๋ฃํฉ๋๋ค. ์ํฌ๋ก๋ ๋ฐฐํฌ ๋ฐ ์ฌ๋ฐฐํฌ๋ฅผ ์ฐธ์กฐํ์ธ์.
์ ๊ทธ๋ ์ด๋
Cloud Service Mesh ์ ๊ทธ๋ ์ด๋ ๋จ๊ณ๋ฅผ ์ํํฉ๋๋ค.
asmcli install
์ ์คํํ ๋ ๋ค์ ์ต์ ์ ํฌํจํฉ๋๋ค.--option audit-authorizationpolicy
์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
./asmcli install \ --project_id PROJECT_ID \ --cluster_name CLUSTER_NAME \ --cluster_location CLUSTER_LOCATION \ --ca mesh_ca \ --output_dir DIR_PATH \ --enable_all \ --option audit-authorizationpolicy
Cloud Service Mesh๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ํ์ํ ๋ค๋ฅธ ์ค๋ฒ๋ ์ด ํ์ผ์ ์ง์ ํด์ผ ํฉ๋๋ค.
์ํฌ๋ก๋์์ ์๋ ์ฌ์ด๋์นด ํ๋ก์ ์ฝ์ ์ ์ฌ์ฉ ์ค์ ํ๋ ค๋ฉด Cloud Service Mesh ์ค์น๋ฅผ ์๋ฃํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ์ ์ ์ด ์์ญ์ผ๋ก ์ ํ์ ์ฐธ์กฐํ์ธ์.
๊ฐ์ฌ ๋ก๊น ์ฌ์ฉ
์ด ์น์ ์์๋ Bookinfo ์ํ์ ์ฌ์ฉํ์ฌ ๊ฐ์ฌ ๋ก๊น ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
Bookinfo ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ณธ ๋ค์์คํ์ด์ค์ ๋ฐฐํฌํฉ๋๋ค.
์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด์ ์ธ๋ถ IP ์ฃผ์๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฒญ์ ์ ์กํ์ฌ ์ผ๋ถ ํธ๋ํฝ์ ์์ฑํฉ๋๋ค.
Google Cloud ์ฝ์์์ ํ์ ๋ฉ๋ด
๋ก ์ด๋ํ๊ณ Logging > ๋ก๊ทธ ํ์๊ธฐ๋ฅผ ์ ํํฉ๋๋ค.Google Cloud ํ๋ก์ ํธ๋ฅผ ์ ํํฉ๋๋ค.
์์ง ๊ฐ์ฌ ์ ์ฑ ์ ๋ฐฐํฌํ์ง ์์์ผ๋ฏ๋ก ๊ฐ์ฌ ๋ก๊ทธ๊ฐ ์์ต๋๋ค. ๊ฐ์ฌ ๋ก๊ทธ๋ ์ก์ธ์ค ๋ก๊ทธ์ ๋ค๋ฆ ๋๋ค.
stackdriver
์ก์ธ์ค ๋ก๊ทธ๋ฅผ ๋ณด๋ ค๋ฉด ์ฟผ๋ฆฌ ๋น๋ ํ๋์ ๋ค์ ์ฟผ๋ฆฌ๋ฅผ ์ ๋ ฅํ๊ณ ์ฟผ๋ฆฌ ์คํ์ ํด๋ฆญํฉ๋๋ค.logName="projects/PROJECT_ID/logs/server-accesslog-stackdriver"
๋ก๊ทธ ํ์๊ธฐ ์ฌ์ฉ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ก๊ทธ ํ์๊ธฐ ๊ฐ์๋ฅผ ์ฐธ์กฐํ์ธ์.
๊ฐ์ฌ ์ ์ฑ ๊ตฌ์ฑ ๋ฐ ๊ฐ์ฌ ๋ก๊ทธ ํ์ธ
์ด ์น์ ์์๋ Bookinfo ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ์ฌํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ์ต์ ์ ์ ๊ณตํฉ๋๋ค. ๊ฐ์ฌ ์ ์ฑ ์ ๋ฐฐํฌํ ํ์๋ ์ผ๋ถ ์์ฒญ์ ์ ์กํ ํ ๋ก๊ทธ ํ์๊ธฐ์์ ๊ฐ์ฌ ๋ก๊ทธ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
๋ค์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ ํด๋ฌ์คํฐ์ ์ํธ์์ฉํฉ๋๋ค. ๋ํ ์ด ๋ช ๋ น์ด๋
kubectl
์ ํ์ฌ ์ปจํ ์คํธ๋ฅผ ํด๋ฌ์คํฐ๋ก ์ค์ ํฉ๋๋ค.gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
๋ค์ ๊ฐ์ฌ ์ ์ฑ ์ ์ ์ฉํ์ฌ
/productpage
๊ฒฝ๋ก์ ๋ํGET
์์ฒญ์ ๊ฐ์ฌํฉ๋๋ค.kubectl apply -f - << EOF apiVersion: "security.istio.io/v1beta1" kind: "AuthorizationPolicy" metadata: name: "audit-productpage" namespace: default spec: action: AUDIT rules: - to: - operation: methods: ["GET"] paths: ["/productpage"] EOF
Bookinfo์ ์ผ๋ถ ์์ฒญ์ ๋ณด๋ ๋๋ค.
๋ก๊ทธ ํ์๊ธฐ์์ ์ฟผ๋ฆฌ ๋น๋ ํ๋์ ๋ค์ ์ฟผ๋ฆฌ๋ฅผ ์ ๋ ฅํ๊ณ ์ฟผ๋ฆฌ ์คํ์ ํด๋ฆญํฉ๋๋ค.
logName="projects/PROJECT_ID/logs/server-istio-audit-log"
์ด ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ์ ์ฌํ ๋ก๊ทธ๋ฅผ ๋ฐํํฉ๋๋ค.
๋ค์ ์ ์ฑ ์ ์ ์ฉํ์ฌ
bookinfo-ratings
์๋น์ค์ ๋ํ ์์ฒญ์ ๊ฐ์ฌํฉ๋๋ค. ๊ฐ์ฌ ์ ์ฑ ์ ์ถ๊ฐ๋ฉ๋๋ค. ๋ค์ ์ ์ฑ ์ ์ ์ฉํ๋ฉด ProductPage ๋ฐ Ratings ์์ฒญ์ ๋ํ ๊ฐ์ฌ ๋ก๊ทธ๊ฐ ํ์๋ฉ๋๋ค.kubectl apply -f - << EOF apiVersion: "security.istio.io/v1beta1" kind: "AuthorizationPolicy" metadata: name: "audit-ratings" namespace: default spec: action: AUDIT rules: - from: - source: principals: ["cluster.local/ns/default/sa/bookinfo-ratings"] to: - operation: methods: ["GET"] EOF
์ ๊ฐ์ฌ ์ ์ฑ ์ด ์ ์ฉ๋๊ธฐ ์ ์ ๋จผ์ ์ ํ๋์ด์ผ ํฉ๋๋ค.
Bookinfo์ 10๊ฐ ์ด์์ ์์ฒญ์ ์ ์กํ์ฌ ํ๊ฐ ์๋น์ค์ ๋๋ฌํ ํ ๋ก๊ทธ ํ์๊ธฐ์์ ๊ฐ์ฌ ๋ก๊ทธ๋ฅผ ํ์ธํฉ๋๋ค. ๊ฐ์ฌ ๋ก๊ทธ๋ ๋ค์๊ณผ ์ ์ฌํฉ๋๋ค.
๋ค์ ์ ์ฑ ์ ์ ์ฉํ์ฌ ๊ธฐ๋ณธ ๋ค์์คํ์ด์ค์ ๋ชจ๋ ์๋น์ค๋ฅผ ๊ฐ์ฌํฉ๋๋ค.
kubectl apply -f - << EOF apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: namespace: default name: "audit-all" spec: action: AUDIT rules: - {} EOF
Bookinfo์ ๋ช ๊ฐ์ง ์์ฒญ์ ๋ ์ ์กํ ํ ๋ก๊ทธ ํ์๊ธฐ์์ ๊ฐ์ฌ ๋ก๊ทธ๋ฅผ ํ์ธํฉ๋๋ค. ์ด์ ๊ฐ์ฌ ๋ก๊ทธ์ ๋ชจ๋ ์์ฒญ์ด ๊ธฐ๋ก๋ฉ๋๋ค.
๊ฐ์ฌ ์ ์ฑ ์ ProductPage ๋ฐ Rating์ผ๋ก ์ถ์ํ์ฌ ์ ํํ๋ ค๋ฉด
audit-all
์ ์ฑ ์ ์ญ์ ํ๋ฉด ๋ฉ๋๋ค.kubectl delete authorizationpolicy audit-all -n default
๋ฌธ์ ํด๊ฒฐ
๊ฐ์ฌ ์ ์ฑ ์ ์ฌ์ฉ ์ค์ ํ ํ ๊ฐ์ฌ ๋ก๊ทธ๊ฐ ํ์๋์ง ์์ผ๋ฉด ๋ค์ ๋ช ๊ฐ์ง ์ฌํญ์ ํ์ธํฉ๋๋ค.
๋ก๊ทธ ํ์๊ธฐ์์ ์ง์ ๋ ๊ธฐ๊ฐ ๋์ ํธ๋ํฝ์ด ์๋์ง ํ์ธํฉ๋๋ค. Bookinfo์์ ํ ์คํธํ๋ ๊ฒฝ์ฐ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ๋ฌ ๋ฒ ์คํํ์ฌ ์์ฒญ์ ๋ณด๋ผ ์ ์์ต๋๋ค.
curl -s http://EXTERNAL_IP/productpage | grep Bookstore
๊ฐ์ฌ ๋์ ์๋น์ค์ ๋ํ ์์ฒญ์ ์ฐจ๋จํ๋ ์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด์
AuthorizationPolicy
๊ฐ ์๋์ง ํ์ธํฉ๋๋ค.๋ก๊ทธ ํ์๊ธฐ์์ ๋ค์ ํํฐ๋ฅผ ์ฌ์ฉํ์ฌ
stackdriver
์ก์ธ์ค ๋ก๊ทธ๋ฅผ ํ์ธํ์ฌ ์์ฒญ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ฌํ์๋์ง ํ์ธํฉ๋๋ค.logName="projects/PROJECT_ID/logs/server-accesslog-stackdriver"
Stackdriver๊ฐ ๊ตฌ์ฑ๋์ด ์๊ณ ๊ฐ์ฌ ๋ก๊ทธ๊ฐ ์ฌ์ฉ ์ค์ ๋์ด ์๋์ง ํ์ธํ๋ ค๋ฉด ํ์ฌ
istiod
์ํ์ ๊ตฌ์ฑ์ ๋คํํฉ๋๋ค.config_dump
์์enable_audit_log
๋ฐ ๊ฐ์ฌ ์ ์ฑ ์ ์ด๋ฆ์ ๊ฒ์ํฉ๋๋ค.istioctl dashboard envoy POD_NAME.NAMESPACE
์์ฒญ์ด ๊ฐ์ฌ ์ ์ฑ ๊ท์น๊ณผ ์ผ์นํ๋์ง ํ์ธํ๋ ค๋ฉด ์ญํ ๊ธฐ๋ฐ ์ก์ธ์ค ์ ์ด (RBAC) ๋๋ฒ๊ทธ ๋ก๊ทธ๋ฅผ ํ์ธํ์ธ์. ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ RBAC ๋๋ฒ๊ทธ ๋ก๊น ์ ์ฌ์ฉ ์ค์ ํฉ๋๋ค.
kubectl exec POD_NAME -n NAMESPACE -c istio-proxy -- pilot-agent request POST 'logging?rbac=debug'
์์ฒญ์ ๋ณด๋ด๊ณ
kubectl logs
๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ Pod์ ๋ก๊ทธ๋ฅผ ํ์ธํฉ๋๋ค.kubectl logs POD_NAME -n NAMESPACE -c istio-proxy