Istio Security
๋ถ์ฐ ์์คํ ์์์ โ์๋ฒฝํโ ์๋น์ค ๋ฉ์ฌ๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด์ Istio๋ โ๋ณด์โ ๊ด๋ จ๋ ์ฌ๋ฌ ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํ๋ค!!
PeerAuthentication
์๊ฑด istio ์ํฌ๋ก๋์ mTLS
์ ํธ๋ํฝ์ ์ ๊ทผ๋ง ํ์ฉํ ๊ฒ์ธ์ง(STRICT
) ์๋๋ฉด mTLS๊ฐ ์ ์ฉ๋์ง ์์ ํธ๋ํฝ ์ ๊ทผ๋ ํ์ฉํ ๊ฒ์ธ์ง(PERMISSIVE
) ๊ฒฐ์ ํ๋ ์ ์ฑ
์ด๋ค.
$ kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: only-mtls-allow
namespace: default
spec:
mtls:
mode: STRICT
EOF
์ด๋ ๊ฒ ์ค์ ํ ๊ฒฝ์ฐ, default
๋ค์์คํ์ด์ค๋ก ํฅํ๋ ํธ๋ํฝ์ ๋ชจ๋ mTLS๋ก ์ํธํ ๋์ด์ผ ํ๋ค. ๊ทธ๋ฐ๋ฐ, mTLS ์ํธํ๊ฐ ๋์๋ค๋ ๋ง์ด ๊ณง ๊ทธ ์ํฌ๋ก๋๊ฐ Istio ์๋น์ค ๋ฉ์ฌ ์์ ์๋ค๋ ๋ง์ด๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ Istio ์๋น์ค ๋ฉ์ฌ์ ์ํฌ๋ก๋์ ์ ๊ทผ๋ง ํ์ฉํ๊ฒ ๋ค๋ ๊ฒ์ด๋ค.
$ kubectl exec ... -n non-istio -- sh
~# curl helloworld.default:5000/hello
curl: (56) Recv failure: Connection reset by peer
๋ง์ฝ istio ์ํฌ๋ก๋๊ฐ ์๋ ๊ณณ์์ ์์ฒญ์ ๋ณด๋ธ๋ค๋ฉด ์ด๋ ๊ฒ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋ค.
istio -> non-istio ๋ฐฉํฅ์ ํธ๋ํฝ ๋ง๊ธฐ
์์ PeerAuthentication
์ non-istio โก๏ธ istio ๋ฐฉํฅ์ ์ ๊ทผ์ ๋ง๋ ๋ฐฉ์์ด์๋ค. ๊ทธ๋ ๋ด ๋ฐ๋๋ก istio โก๏ธ non-istio ๋ฐฉํฅ์ ์ ๊ทผ์ ๋ง์ ์๋ ์์๊น?
์๊ฑด istio๊ฐ Istio Service Registry์ ๋ฑ๋ก๋ ์ํฌ๋ก๋์๋ง ์ ๊ทผํ๋๋ก MeshConfig.OutboundTrafficPolicy.mode
๋ฅผ STRICT
๋ก ์ค์ ํด์ฃผ๋ฉด ๋๋ค. ์ด๋ ๊ฒ ํ ๊ฒฝ์ฐ, K8s Service์ ServiceEntry
๋ก ๋ฑ๋กํ ์๋ํฌ์ธํธ๋ง ์ ๊ทผํ ์ ์๊ฒ ๋๋ค.
ํ์ง๋ง ๋จ์ ์ด ์๋๋ฐ ๋ณธ์ธ์ด ํ์ธ ํ์ ๋ ๋ชจ๋ K8s Service๋ istio๊ฑด non-istio๊ฑด ๋ชจ๋ Istio Service Registry์ ๋ฑ๋ก๋๋ค. ๊ทธ๋์ โistio โก๏ธ non-istio K8s Svcโ ๋ฐฉํฅ์ ์ ๊ทผ์ ๋ง์ ์ ์๋ค. ์ด ๋ฐฉ์์ โistio โก๏ธ non-istio external endpointโ ๋ฐฉํฅ์ ์ ๊ทผ๋ง ๋ง์ ์ ์๋ค.
Istio Service Registry์ ๋ํด ๋ ๊ถ๊ธํ๋ค๋ฉด, ํ์ ํฌ์คํธ๋ฅผ ์ฐธ๊ณ
โก๏ธ Istio Service Registry
AuthorizationPolicy
Istio์ AuthorizationPolicy
๋ ์๋น์ค์ ์ ๊ทผ ๊ท์น์ ๋ฏธ์ธํ ์์ค์ ์ ์ดํ๋ ๋ฆฌ์์ค์ด๋ค. ์์ฒญ(request)์ ์ถ๋ฐ์ง(source) ์์ฑ์ ๊ธฐ์ค์ผ๋ก ์ ์ดํ ์๋ ์๊ณ , ์์ฒญ์ ๋์ฐฉ์ง(to) ์์ฑ์ ๊ธฐ์ค์ผ๋ก ์ ์ดํ ์ ์๋ค. ๊ทธ์ธ์ ์์ฒญ์ด ๊ฐ์ง ์์ฑ๋ค(ex: request headers, JWT token principal ๋ฑ)์ ๊ธฐ์ค์ผ๋ก ์ ์ดํ ์๋ ์๋ค.
์ฌ๊ธฐ์ ์ดํด๋ณด๋ 3๊ฐ์ง ๋ฆฌ์์ค ์ค์์ ์ ๋ ์์ด ์ ์ผ ์ด๋ ค์ ๋ค ใ ใ
๊ฐ์ฅ ๊ฐ๋จํ default
๋ค์์คํ์ด์ค์ ์ํฌ๋ก๋๋ฅผ test
๋ค์์คํ์ด์ค๋ก๋ถํฐ ๋ณดํธํ๋ AuthorizationPolicy
๋ถํฐ ์ดํด๋ณด์.
$ kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: protect-from-test
namespace: default
spec:
action: DENY
rules:
- from:
- source:
namespaces: ["test"]
EOF
์์ ๊ฐ์ AuthPolicy๊ฐ ์์ฑ๋์๋ค๋ฉด, test
๋ค์์คํ์ด์ค๋ ์ํฌ๋ก๋์ ์ ๊ทผํ๋ ค๊ณ ํ ๋, ์ด๋ฐ ์๋ฌ๋ฅผ ๋ฐ๋๋ค.
$ kubectl exec -n test ... -- sh
~# curl helloworld.default:5000/hello
RBAC: access denied
๊ทธ๋ฐ๋ฐ ์์ AuthPolicy๋ test
๋ค์์คํ์ด์ค์ ์ ๊ทผ์ ๋ง์์ ๋ฟ ๋ค๋ฅธ ๋ค์์คํ์ด์ค์์์ ์ ๊ทผ์ ์ ์ด๋ค์ง๋ค!
๋ง์ฝ, ๋ฐ๋๋ก ํน์ ๋ค์์คํ์ด์ค์ ์ ๊ทผ๋ง์ ํ์ฉํ๊ณ ์ถ๋ค๋ฉด ๋ฆฌ์์ค๋ฅผ ์ด๋ ๊ฒ ๋ง๋ค์ด๋ณด์.
$ kubectl delete authorizationpolicy -n default protect-from-test
$ kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: only-allow-from-test
namespace: default
spec:
action: ALLOW
rules:
- from:
- source:
namespaces: ["test"]
EOF
์ด๋ ๊ฒ ํ๋ฉด, ๋ฐ๋๋ก test
๋ค์์คํ์ด์ค์ ์ ๊ทผ์ ํ์ฉํ์ง๋ง, ๋ค๋ฅธ ๋ค์์คํ์ด์ค๋ก๋ถํฐ์ ์ ๊ทผ์ ๊ฑฐ๋ถ ๋๋ค.
๋จ, ๊ฐ์ ๋ค์์คํ์ด์ค์ธ default
๋ค์์คํ์ด์ค์ ๋ฆฌ์์ค๋ค ๊ฐ์ ํต์ ๋ ๊ฑฐ๋ถ๋๊ธฐ ๋๋ฌธ์ ์ฃผ์ํ ๊ฒ!!
์ ์ฑ ํ๊ฐ ์์
AuthorizaitonPolicy
์ ์ ์ฑ
์ ALLOW
, DENY
, CUSTOM
, AUDIT
(๋
ผ์ธ)๊ฐ ๊ฐ๋ฅํ๋ฐ, ์ ์ฑ
๋ณ๋ก ํ๊ฐ๋๋ ์์๊ฐ ๋ค๋ฅด๋ค.
- ์๋ฌด๊ฒ๋ ์ ๊ฑธ๋ ค ์๋ค๋ฉด
- ๋ชจ๋ ์์ฒญ์ ์์ฉ
CUSTOM
์ ์ฑ ์ด ๊ฑธ๋ ค ์๋ค๋ฉด- ์ ์ฑ ์ ํ๊ฐํ ํ์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์์ฒญ์ ์์ฉํ๊ฑฐ๋ ๊ฑฐ๋ถ
DENY
์ ์ฑ ์ด ๊ฑธ๋ ค ์๋ค๋ฉด- ์ ์ฑ ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์ฒญ์ ๊ฑฐ๋ถ. ๋๋จธ์ง๋ ์์ฉ
ALLOW
์ ์ฑ ์ด ๊ฑธ๋ ค ์๋ค๋ฉด- ์ ์ฑ ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์ฒญ๋ง ์์ฉ. ๋๋จธ์ง๋ ๊ฑฐ๋ถ
๋จ, DENY
์ ์ฑ
์ผ๋ก ์์ฒญ์ด ๊ฑฐ๋ถ ๋์๋๋ผ๋, ALLOW
์ ์ฑ
์์ ํ์ฉํด์ค๋ค๋ฉด ํด๋น ์์ฒญ์ ์์ฉ ๋๋ค.
Request์ ์ถ๋ฐ์ง ์์ฑ์ ๊ธฐ์ค์ผ๋ก
์๋์ ์์ฒญ์ ์ถ๋ฐ์ง ์์ฑ์ ๊ธฐ์ค์ผ๋ก ์ ๊ทผ์ ์ ์ดํ ์ ์๋ค.
namespace
principal
ipBlocks
remoteIpBlocks
์์ ์์ ์์ namespace
๊ธฐ์ค์ ํด๋ดค์ผ๋ principal
์ ๊ธฐ์ค์ผ๋ก ํด๋ณด์.
$ kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: only-allow-from-sleep-sa
namespace: default
spec:
action: ALLOW
rules:
- from:
- source:
principals:
- "cluster.local/ns/default/sa/sleep"
EOF
์๋ ๊ฒ ํ๋ฉด ํน์ K8s ServiceAccount๋ฅผ ๋ฐ์ธ๋ฉํ ์ํฌ๋ก๋์ ์์ฒญ๋ง ํ์ฉํ ์ ์๋ค!! (,,โขoโข,,)
์ฐธ๊ณ ๋ก ServiceAccount์ ํจํด์ ์๋์ ๊ฐ๋ค.
<TRUST_DOMAIN>/ns/<NAMESPACE>/sa/<SERVICE_ACCOUNT>
- ์์:
cluster.local/ns/default/sa/sleep
Request์ ๋์ฐฉ์ง ์์ฑ์ ๊ธฐ์ค์ผ๋ก
์์ฒญ์ด ๋์ฐฉ์ง์ ๋๋ฌํด์ ์ํํ๋ ์์ (operation)์ ๊ธฐ์ค์ผ๋ก ์ ๊ทผ์ ์ ์ดํ ์๋ ์๋ค.
hosts
ports
methods
paths
$ kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: only-deny-get-access
namespace: default
spec:
action: DENY
rules:
- to:
- operation:
methods: ["GET"]
EOF
์์ ๊ฐ์ด ์ค์ ํ๋ฉด, default
๋ค์์คํ์ด์ค์ ์ํฌ๋ก๋์ ๋ค์ด์ค๋ ๋ชจ๋ GET
์์ฒญ์ด ๊ฑฐ๋ถ๋๋ค.
๊ทธ์ธ์๋ hsots
, ports
, paths
๋ฅผ ์ฌ์ฉํด ๋ ์ธ๋ถ์ ์ผ๋ก ์ ๊ทผ ์ ์ด๊ฐ ๊ฐ๋ฅํ๋ค.
Request๊ฐ ๊ฐ์ง ์์ฑ์ ๊ธฐ์ค์ผ๋ก
๋ง์ง๋ง์ผ๋ก when
์กฐ๊ฑด์ ํตํด์ ์์ฒญ์ด ๊ฐ์ง ์์ฑ์ ๊ธฐ์ค์ผ๋ก ์ ๊ทผ ์ ์ด๊ฐ ๊ฐ๋ฅํ๋ค.
๊ทธ ๋ชฉ๋ก์ โAuthorization Policy Conditionsโ ๋ฌธ์์์ ํ์ธํ ์ ์๋๋ฐ, ๋ช๊ฐ์ง ์ฌ๋ก๋ฅผ ์์์ ํจ๊ป ์ดํด๋ณด์.
$ kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: only-allow-header-haha-hoho
namespace: default
spec:
action: ALLOW
rules:
- when:
- key: request.headers[haha]
values: ["hoho"]
EOF
์์ ๊ฐ์ AuthorizationPolicy
๋ฅผ ๋ง๋ค๋ฉด, ์๋์ ๊ฐ์ด header์ haha: hoho
๊ฐ ์๋ ์์ฒญ๋ง ํ์ฉ ํ๋ค.
# With Header
$ curl -H "haha: hoho" http://helloworld.default:5000/hello
Hello version: v1, instance: helloworld-v1-77489ccb5f-jstpc
# No Header
$ curl http://helloworld.default:5000/hello
RBAC: access denied
๋, ์์์ source
, to
๊ท์น์ ์ฌ์ฉ ํ๋ ๋ช๋ช ์์ฑ๋ค์ when
๊ท์น์์๋ ๊ตฌ์ฑํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ์์ฒญ ์ํฌ๋ก๋์ principal
์ ๊ธฐ์ค์ผ๋ก ์ ๊ทผ ์ ์ดํ๋ ๊ฒ์ when
์กฐ๊ฑด์์๋ ์ํํ ์ ์๋ค.
$ kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: only-allow-sleep-sa
namespace: default
spec:
action: ALLOW
rules:
- when:
- key: source.principal
values: ["cluster.local/ns/default/sa/sleep"]
EOF
๊ทธ ์ธ์๋ ์์ฒญ์ ๋ด๊ธด JWT ํ ํฐ์ ์ ๋ณด๋ฅผ ๊ธฐ์ค์ผ๋ก๋ ์ ๊ทผ ์ ์ด๊ฐ ๊ฐ๋ฅํ๋ค๊ณ ํ๋ค. (์ ๋ง ๋ง๊ตฌ๋ง!!!)
Sidecar
Istio ์๋น์ค๋ฉ์ฌ์์ Envoy SideCar์ ๋ํ ๋คํธ์ํฌ ๊ตฌ์ฑ์ ๋ช ์ํ๋ ๋ฆฌ์์ค์ด๋ค.
Egress Listener
์๋ฅผ ๋ค์ด, ์๋์ Sidecar
๋ฆฌ์์ค๋ฅผ ๋ง๋ค๋ฉด, default
๋ค์์คํ์ด์ค์์ default
์ test
์ ์ํฌ๋ก๋๋ก๋ง ์ ๊ทผํ ์ ์๋ค.
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: Sidecar
metadata:
name: default-egress
namespace: default
spec:
egress:
- hosts:
- "default/*"
- "test/*"
EOF
๋ง์ฝ ๋ช
์๋์ง ์์ ์ํฌ๋ก๋์ curl
๋ช
๋ น์ ๋ ๋ฆฌ๋ฉด ์๋ฌด response๋ ๋ฐ์ง ๋ชป ํ๊ณ ํํฐ๋ง ๋๋ค.
์๋ ๊ฒ Sidecar
์ egress
๊ท์น์ ํ์ฉํ๋ฉด, ํด๋น ๋ค์์คํ์ด์ค๋ ์ํฌ๋ก๋์์ ์ ๊ทผ ๊ฐ๋ฅํ K8s ๋๋ Istio ์๋น์ค ๋ฉ์๋ฅผ ์ ํํ ์ ์๋ค. ์ฆ, ์ต์ํ์ ํ์๋ก ํ๋ ๋ณด์ ์ ๊ทผ๋ง์ ํ์ฉํ๋ ๊ฒ์ด๋ค. (Zero-Trust Network์ ์กฐ๊ฑด์ ์ถฉ์กฑ!)
์ ๊ทธ๋ฆฌ๊ณ ๋ง์ฝ ๊ฐ์ ๋ค์์คํ์ด์ค์ ์ํฌ๋ก๋๋ก๋ง egress host๋ฅผ ํ์ฉํ๋ ค๋ฉด ์๋์ ๊ฐ์ด ์์ฑํ ์๋ ์๋ค.
...
spec:
egress:
- hosts:
- "./*"
- "./helloworld"
์ด๋ ๊ฒ ์๋๊ฒฝ๋ก ํํ์ ์ฒ๋ผ ./
๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ ๋ค์์คํ์ด์ค์ ์ํฌ๋ก๋๋ง ํ์ฉํ๊ฒ ๋๋ค.
Ingress Listener
์ด๋ฒ์๋ ๋ฐ๋๋ก ์ ์ํฌ๋ก๋์ ์ ๊ทผ ๊ฐ๋ฅํ port๋ฅผ ์ ํํด๋ณด์.
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: Sidecar
metadata:
name: default-ingress
namespace: default
spec:
ingress:
- port: 5000
EOF
์ด๋ ๊ฒ ํ๋ฉด, default
๋ค์์คํ์ด์ค์ ๋ชจ๋ ์ํฌ๋ก๋์ ๋ํด์ 5000
ํฌํธ๋ง ์ด๋ ค์๊ฒ ๋๋ค.
์ ingress๋ port๋ฅผ ์ ํํ ๊น ์๊ฐ์ ์ข ํด๋ดค๋๋ฐโฆ
๋ณดํต K8s์ ์ํฌ๋ก๋์ ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด K8s Service ๋ฆฌ์์ค์ CoreDNS ์ฃผ์๋ก ์ ๊ทผ ํ๋ค. ๊ทธ๋ฐ๋ฐ, ์ด๊ฑด ํธ์๋ฅผ ์ํด ์ฐ๋ ๊ฒ์ด๊ณ ์ฌ์ค์ ๊ฐ Pod์ด ๋ถ์ฌ ๋ฐ์ Private IP๋ก๋ ์ํฌ๋ก๋์ ์ ๊ทผํ ์ ์๋ค.
K8s Service๋ฅผ ์ ๊ทผํ ๋๋ K8s Service๋ฅผ ์ ์ํ๋ฉด์ ์ํฌ๋ก๋์ ์ด๋ค ํฌํธ๋ฅผ ๋ ธ์ถํ ์ง ๊ฒฐ์ ์ ํ๊ฒ ๋์ง๋ง, ์ด๋ค ํฌํธ๋ K8s Svc๋ก ๋ ธ์ถํ๊ณ ์ถ์ง ์์ ์๋ ์๋ค.
Istio Sidecar
๋ ์ด๋ ๊ฒ Native K8s๊ฐ ๊ฐ๋ ์์น ์๋ ์ํฌ๋ก๋์ ํฌํธ๊ฐ ๋
ธ์ถ๋์ง ์๋๋ก Envoy Sidecar ์์ค์์ ingress port๋ฅผ ์ ํํ๋ ๊ฒ ๊ฐ๋ค. ์ด๋ป๊ฒ ๋ณด๋ฉด, AWS SG์ Ingress Rule์ฒ๋ผ Inbound ํฌํธ๋ฅผ ์ ํํ๋ ๊ฒ์ผ๋ก ๋ณด์ด๊ธฐ๋ ํ๋ค.
Workload Selector
์์ Sidecar
์์๋ค์ metadata.namespace
์ ๋ชจ๋ Envoy Sidecar์ ์ ์ฉ๋๋ ๊ท์น์ด์๋ค. ๋ง์ฝ ํน์ ์ํฌ๋ก๋์ Envoy Sidecar์๋ง ์ ์ฉํ๊ณ ์ถ๋ค๋ฉด, ์๋์ ๊ฐ์ด workflowSelector
๋ฅผ ํฌํจํ๋ฉด ๋๋ค.
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: Sidecar
metadata:
name: default-egress
namespace: default
spec:
workloadSelector:
labels:
app: helloworld
egress:
- hosts:
- "./*"
EOF
์์ฐ! ์์ ๊ฐ์ด Sidecar
๋ฅผ ๊ตฌ์ฑํ๋ฉด helloworld ์ํฌ๋ก๋๋ ์ค์ง ๊ฐ์ ๋ค์์คํ์ด์ค์ ์ํฌ๋ก๋๋ก๋ง ์ ๊ทผํ ์ ์๋ค!!
Istio์ Zero-trust Network
Istio๋ฅผ ๊ณต๋ถํ๋ฉด์ โZero-trust Networkโ(์ดํ ZTN)๋ผ๋ ์ฉ์ด๋ฅผ ์ฒ์ ๋ณด๊ฒ ๋์๋ค. ๋ณธ์ธ์ด ๋ณด์ ์ ๋ฌธ๊ฐ๋ ์๋๋ผ์ ์ฝ๊ฒ ์ดํด ๋์ง๋ ์์๋๋ฐโฆ
ํ ์คใ ฃSLASH 23 - ๊ณ ๊ฐ ๋ถ์์ 0์ผ๋ก ๋ง๋๋ ํ ์ค์ Istio Zero Trust์ ์์์ด Istio ZTN๋ฅผ ์ดํดํ๋๋ฐ ํฐ ๋์์ด ๋์๋ค.
ํ ์ค๋ ์๋ฌด๋๋ ๊ธ์ฉ ๊ธฐ์ ์ด๋ ์ํฌ๋ก๋๋ฅผ ์ด์ํ ๋ ๋์ ์์ค์ ๋ณด์์ ์๊ตฌํ ๊ฒ ๊ฐ๋ค. Istio๋ ํ ์ค์ K8s ํด๋ฌ์คํฐ์ ZTN๋ฅผ ์ ๊ณตํ๋ ์๋ฃจ์ ์ผ๋ก ์ ๊ธฐ๋ฅํ๋ ๊ฒ ๊ฐ๋ค.
์ง๊ธ๋ถํฐ๋ ์์ ์์์ ๋ด์ฉ ์์ฝ์ด๋ค!
- ํ ์ค๋ ๋ชจ๋ ์ํฌ๋ก๋์ mTLS
STRICT
๋ชจ๋์ด๋ค. ์ฆ, Istio ์๋น์ค ๋ฉ์ฌ ๋ฐ์์๋ ์๋น์ค ๋ฉ์ฌ๋ก ์ ๊ทผํ ์ ์๋ค. - ํ ์ค๋ Istio์
Sidecar
๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํด์ ์ํฌ๋ก๋๊ฐ ์ ๊ทผํ ์ ์๋ egress host๋ฅผ ์ ํํ๋ค. ๋ฐ๋ก ์ค์ ํด์ฃผ์ง ์์ผ๋ฉด ์ด๋ค ์ํฌ๋ก๋์๋ ์ ๊ทผํ ์ ์๋ค. (Least Privilliage ์ฌ๋ก) - ํ ์ค๋ Istio์
AuthorizationPolicy
๋ฆฌ์์ค๋ฅผ ์ค์ ํ์ฌ ์์์น ๋ชปํ ์ํฌ๋ก๋์ ์ ๊ทผ์ ๋ง๊ณ , ์ํฌ๋ก๋์ ์ ๊ทผ์ Endpoint ๋ ๋ฒจ๊น์ง ์ ํํ๋ค.
์ฆ, ์ํฌ๋ก๋ A๊ฐ ์ํฌ๋ก๋ B์ ์ ๊ทผํ๊ณ ์ ํ๋ค๋ฉด, (1) ๋๋ค Istio ์๋น์ค ๋ฉ์ฌ ์์ ์์ด์ผ ํ๊ณ , (2) ์ํฌ๋ก๋ A์ Sidecar
๋ฅผ ์ค์ ํด์ ์ํฌ๋ก๋ B์ egress ํ ์ ์๊ฒ ํ์ฉํด์ผ ํ๊ณ , (3) ์๋ฅด์ฝ๋ B์ AuthorizationPolicy
๋ฅผ ์ค์ ํด ์ํฌ๋ก๋ A์ ingress ํธ๋ํฝ์ ํ์ฉํด์ค์ผ ํ๋ค.
ํ ์ค์ ๊ฒฝ์ฐ, Sidecar
์ egress host ๋ชฉ๋ก์ด ๋ณ๊ฒฝ ๋๋ค๊ฑฐ๋, ์๋ ๋ฑ๋ก๋์ง ์์ egress host๋ก ์์ฒญ์ด ๋ฐ์ํ๋ค๋ฉด Slack ๋ฉ์์ง๋ ์ค๋ ๋ฑ Istio๋ฅผ ์ธ๋ฐํ๊ฒ ๋ชจ๋ํฐ๋ง ํ๊ณ ์๋ค. (์ต๊ทผ ์ฝ๋ ์ปค๋ฏธํฐ ๋ณด์ฌ์ฃผ๋ ๊ฒ๋ ์ ๊ธฐํ๋คโฆ ๐)
์ฒ์์๋ Istio๋ฅผ ์๋น์ค ๋ฉ์ฌ? ๋คํธ์ํฌ ํธ๋ํฝ์ ๋ชจ๋ํฐ๋ง ํ๊ณ , ๋ ์นด๋๋ฆฌ ๋ฐฐํฌ๋ฅผ ํ ์ ์๋ ๊ฑฐ๊ตฌ๋~~ ๋ผ๊ณ ๋ง ์๊ฐํ๋๋ฐ, ๋ถ์ฐ์ฒ๋ฆฌ ์์คํ ๊ณผ ๊ทธ๊ฒ์ ๋ณด์์ ์ํด ์ ๊ณ ์๋ ์๋น์ค ๋ฉ์ฌ๋ผ๋ ์๊ฐ์ด ๋ ๋ค. (์ญ์ CNCF!)
์ฐธ๊ณ ์๋ฃ
- Istio ๊ณต์ ๋ฌธ์๋ค
- Toss Slash 23
- ํ ์คใ ฃSLASH 23 - ๊ณ ๊ฐ ๋ถ์์ 0์ผ๋ก ๋ง๋๋ ํ ์ค์ Istio Zero Trust
- ๊ทธ์ธ์๋ ํ ์ค์์ Istio ๊ด๋ จํด์ ๋ง์ ์ฌ๋ก ์ผ์ด์ค๋ฅผ ์ ์ํ๊ณ ์๋ค!! (๋์ค์ ์ญ ๋ด์ผ์งโฆ)