브라우저에서 많이 사용되는 HTTPS의 경우에도 공식적으로 발급한 인증키를 이용하여 데이터를 암호화하여 전달 하도록 구성되어 있다.
위와 같은 방식으로 데이터를 전달하면 중간에 해커 등이 데이터를 가로채도(MITM 공격) 데이터를 복호화 할수가 없게 된다. (서버만이 이를 해석할 수 있는 Private Key를 가지므로)
하지만 웹브라우저에서 Istio Ingress Gateway 까지는 안전하게 데이터가 보호되지만, k8s 클러스터 내부에서는 통신 같은 경우 변조되거나 손실 될 수도 있다.
그러나 수많은 마이크로서비스 간 통신에 https 적용하는 것은 복잡하고 많은 시간/자원 소요, 상대적으로 느린 처리속도가 발생한다.
특히 클라우드 같은 경우 하나의 서버 또는 하나의 존으로 구성되지 않으며 다수의 노드들 간의 연결로 구성되는 복잡한 형태로 되어 있다. (ap-northeast-2a, ap-northeast-2b 등등)
Istio를 이용해서 mTLS(Mutual TLS)를 적용하게 되면, TLS가 아닌 모든 통신은 차단하여 불법적인 접근을 막아준다.
Pod 내부의 통신은 localhost에서 동작한다 즉 네트워크 카드를 통하지 않으므로 외부에서 접근 자체가 불가능 따라서 Pod 내부적으로 Container 간에는 http 사용 가능하다
다른 Pod 끼리의 통신은 Istio-proxy container가 대신하여 통신하는데 이때 proxy container 끼리는 TLS 통신으로 안전하게 통신한다.
istio 1.5부터는 자동으로 proxy 간 통신에 TLS가 적용되었다. kiali를 통해 확인 가능
해당 자물쇠 모양이 TLS 적용 되었다는 것을 뜻한다.
- Permissive mTLS
위와 같이 Istio가 제어할 수 없는 Pod에서 Http 전송하는 경우가 있다면 Permissive mTLS 이용 해야 한다.
서비스의 http 접근을 위해 노드포트로 개방
apiVersion: v1
kind: Service
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"fleetman-position-tracker","namespace":"default"},"spec":{"ports":[{"name":"http","port":8080}],"selector":{"app":"position-tracker"},"type":"ClusterIP"}}
creationTimestamp: "2023-11-13T05:17:01Z"
name: fleetman-position-tracker
namespace: default
resourceVersion: "5307171"
uid: 1e1771d6-8714-4f3e-bace-828a5e052d19
spec:
clusterIP: 10.233.37.37
clusterIPs:
- 10.233.37.37
externalTrafficPolicy: Cluster
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- name: http
nodePort: 32000
port: 8080
protocol: TCP
targetPort: 8080
selector:
app: position-tracker
sessionAffinity: None
type: NodePort
status:
loadBalancer: {}
fleetman-position-tracker 서비스의 32000포트를 노드포트로 열었다.
root # kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
api-gateway-57b8dc6b6d-trdhf 2/2 Running 0 15m 10.233.125.173 mng-kube-dev1 <none> <none>
details-v1-7745b6fcf4-scgmn 2/2 Running 2 (13d ago) 13d 10.233.119.77 mng-kube-dev3 <none> <none>
dnsutils 2/2 Running 2 (13d ago) 13d 10.233.119.87 mng-kube-dev3 <none> <none>
position-simulator-d76977c-vttbj 2/2 Running 0 15m 10.233.94.107 mng-kube-dev2 <none> <none>
position-tracker-5fc869955f-xmvzq 2/2 Running 0 15m 10.233.125.174 mng-kube-dev1 <none> <none>
productpage-v1-6f89b6c557-27cpp 2/2 Running 2 (13d ago) 13d 10.233.119.75 mng-kube-dev3 <none> <none>
ratings-v1-77bdbf89bb-j84zk 2/2 Running 2 (13d ago) 13d 10.233.119.78 mng-kube-dev3 <none> <none>
reviews-v1-667b5cc65d-v6bgm 2/2 Running 2 (13d ago) 13d 10.233.119.79 mng-kube-dev3 <none> <none>
reviews-v2-6f76498fc8-bq6lq 2/2 Running 2 (13d ago) 13d 10.233.119.88 mng-kube-dev3 <none> <none>
reviews-v3-5d8667cc66-kwmk4 2/2 Running 2 (13d ago) 13d 10.233.119.81 mng-kube-dev3 <none> <none>
staff-service-549787d74-g9qzp 2/2 Running 0 15m 10.233.94.106 mng-kube-dev2 <none> <none>
staff-service-risky-version-67fc49944c-lrlcs 2/2 Running 0 15m 10.233.119.118 mng-kube-dev3 <none> <none>
vehicle-telemetry-5b8cb65d5-jlnkz 2/2 Running 0 15m 10.233.119.114 mng-kube-dev3 <none> <none>
webapp-5c79796df5-6cc7c 2/2 Running 0 15m 10.233.119.119 mng-kube-dev3 <none> <none>
fleetman-position-tracker 서비스의 파드가 어느 노드에 떳는지 확인
position-tracker-5fc869955f-xmvzq 2/2 Running 0 15m 10.233.125.174 mng-kube-dev1 <none> <none>
sri-mng-kube-dev1에 떠있는 것을 확인 했다.
root # curl http://192.168.2.124:32000/vehicles/
[{"name":"Huddersfield Truck A","lat":53.6099460,"lng":-1.8139280,"timestamp":"2023-11-13T05:31:22.565+0000","speed":24.7517309806046603544},{"name":"London Riverside","lat":51.5112820,"lng":-0.1003120,"timestamp":"2023-11-13T05:31:22.139+0000","speed":17.2594644682047764384},{"name":"City Truck","lat":53.37262733839452266693115234375,"lng":-1.484639234840869903564453125,"timestamp":"2023-11-13T05:31:33.279+0000","speed":7.4770534017002185024},{"name":"Village Truck","lat":53.2844950,"lng":-1.6663290,"timestamp":"2023-11-13T05:31:09.810+0000","speed":25.3164561038853680528},{"name":"Huddersfield Truck B","lat":53.6204240,"lng":-1.8052050,"timestamp":"2023-11-13T05:31:34.307+0000","speed":6.02688378286800533520}]
curl로 노드포트로 호출 해보면 호출이 된다.
kiali에서도보면 fleetman-position-tracker로 호출 되지만 자물쇠가 없는 것으로 보인다.
- Strict mTLS
이 옵션은 어떤 외부의 접속이라도 TLS가 적용 되지 않으면 접속을 완전히 차단하는 방식이다.
PeerAuthentication 이라는 리소스를 사용하여 모드를 설정한다.
apiVersion: "security.istio.io/v1beta1"
kind: "PeerAuthentication"
metadata:
name: "default"
namespace: "istio-system"
spec:
mtls:
mode: STRICT
확인
root # kubectl get peerauthentication -A
NAMESPACE NAME MODE AGE
istio-system default STRICT 94s
잘 생성 되었고 curl 호출 해보면
root # curl http://192.168.2.124:32000/vehicles/
curl: (56) Recv failure: Connection reset by peer
root # curl https://192.168.2.124:32000/vehicles/
curl: (60) SSL certificate problem: self signed certificate in certificate chain
More details here: https://curl.haxx.se/docs/sslcerts.html
curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
호출이 막힌 것으로 보인다.
'IT > Istio' 카테고리의 다른 글
Istio Traffic Management 트래픽 통제하기 (0) | 2023.11.10 |
---|---|
서킷 브레이킹 (0) | 2023.11.10 |