2.3. 서비스 메시 보안
권한 부여 정책 및 mTLS를 사용하면 서비스 메시를 보호할 수 있습니다.
프로세스
테넌트의 모든 Red Hat OpenShift Serverless 프로젝트가 멤버와 동일한
ServiceMeshMemberRoll
오브젝트에 포함되어 있는지 확인합니다.apiVersion: maistra.io/v1 kind: ServiceMeshMemberRoll metadata: name: default namespace: istio-system spec: members: - knative-serving # static value, needs to be here, see setup page - knative-eventing # static value, needs to be here, see setup page - team-alpha-1 # example OpenShift project that belongs to the team-alpha tenant - team-alpha-2 # example OpenShift project that belongs th the team-alpha tenant - team-bravo-1 # example OpenShift project that belongs to the team-bravo tenant - team-bravo-2 # example OpenShift project that belongs th the team-bravo tenant
메시에 속하는 모든 프로젝트는 strict 모드에서 mTLS를 적용해야 합니다. 이렇게 하면 Istio가 클라이언트-인증서가 있는 연결만 수락하고 Service Mesh 사이드카가
AuthorizationPolicy
오브젝트를 사용하여 원본을 검증할 수 있습니다.knative-serving
및knative-eventing
네임스페이스에서AuthorizationPolicy
오브젝트를 사용하여 구성을 생성합니다.knative-default-authz-policies.yaml
구성 파일의 예apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: deny-all-by-default namespace: knative-eventing spec: { } --- apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: deny-all-by-default namespace: knative-serving spec: { } --- apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: allow-mt-channel-based-broker-ingress-to-imc-dispatcher namespace: knative-eventing spec: action: ALLOW selector: matchLabels: app.kubernetes.io/component: "imc-dispatcher" rules: - from: - source: namespaces: [ "knative-eventing" ] principals: [ "cluster.local/ns/knative-eventing/sa/mt-broker-ingress" ] to: - operation: methods: [ "POST" ] --- apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: allow-mt-channel-based-broker-ingress-to-kafka-channel namespace: knative-eventing spec: action: ALLOW selector: matchLabels: app.kubernetes.io/component: "kafka-channel-receiver" rules: - from: - source: namespaces: [ "knative-eventing" ] principals: [ "cluster.local/ns/knative-eventing/sa/mt-broker-ingress" ] to: - operation: methods: [ "POST" ] --- apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: allow-kafka-channel-to-mt-channel-based-broker-filter namespace: knative-eventing spec: action: ALLOW selector: matchLabels: app.kubernetes.io/component: "broker-filter" rules: - from: - source: namespaces: [ "knative-eventing" ] principals: [ "cluster.local/ns/knative-eventing/sa/knative-kafka-channel-data-plane" ] to: - operation: methods: [ "POST" ] --- apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: allow-imc-to-mt-channel-based-broker-filter namespace: knative-eventing spec: action: ALLOW selector: matchLabels: app.kubernetes.io/component: "broker-filter" rules: - from: - source: namespaces: [ "knative-eventing" ] principals: [ "cluster.local/ns/knative-eventing/sa/imc-dispatcher" ] to: - operation: methods: [ "POST" ] --- apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: allow-probe-kafka-broker-receiver namespace: knative-eventing spec: action: ALLOW selector: matchLabels: app.kubernetes.io/component: "kafka-broker-receiver" rules: - from: - source: namespaces: [ "knative-eventing" ] principals: [ "cluster.local/ns/knative-eventing/sa/kafka-controller" ] to: - operation: methods: [ "GET" ] --- apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: allow-probe-kafka-sink-receiver namespace: knative-eventing spec: action: ALLOW selector: matchLabels: app.kubernetes.io/component: "kafka-sink-receiver" rules: - from: - source: namespaces: [ "knative-eventing" ] principals: [ "cluster.local/ns/knative-eventing/sa/kafka-controller" ] to: - operation: methods: [ "GET" ] --- apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: allow-probe-kafka-channel-receiver namespace: knative-eventing spec: action: ALLOW selector: matchLabels: app.kubernetes.io/component: "kafka-channel-receiver" rules: - from: - source: namespaces: [ "knative-eventing" ] principals: [ "cluster.local/ns/knative-eventing/sa/kafka-controller" ] to: - operation: methods: [ "GET" ] --- apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: allow-traffic-to-activator namespace: knative-serving spec: selector: matchLabels: app: activator action: ALLOW rules: - from: - source: namespaces: [ "knative-serving", "istio-system" ] --- apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: allow-traffic-to-autoscaler namespace: knative-serving spec: selector: matchLabels: app: autoscaler action: ALLOW rules: - from: - source: namespaces: [ "knative-serving" ]
이러한 정책은 Serverless 시스템 구성 요소 간 네트워크 통신에 대한 액세스 규칙을 제한합니다. 특히 다음 규칙을 적용합니다.
-
knative-serving
및knative-eventing
네임스페이스에서 명시적으로 허용되지 않은 모든 트래픽을 거부합니다. -
istio-system
및knative-serving
네임스페이스의 트래픽을 활성화하도록 허용 -
knative-serving
네임스페이스의 트래픽을 자동 스케일러로 허용 -
knative-eventing
네임스페이스에서 Apache Kafka 구성 요소에 대한 상태 프로브 허용 -
knative-eventing
네임스페이스에서 채널 기반 브로커에 대한 내부 트래픽 허용
-
권한 부여 정책 구성을 적용합니다.
$ oc apply -f knative-default-authz-policies.yaml
서로 통신할 수 있는 OpenShift 프로젝트를 정의합니다. 이 통신을 위해 테넌트의 모든 OpenShift 프로젝트에는 다음이 필요합니다.
-
테넌트의 프로젝트로 들어오는 트래픽을 직접 제한하는 하나의
AuthorizationPolicy
오브젝트 -
knative-serving
프로젝트에서 실행되는 Serverless의 활성화 구성 요소를 사용하여 들어오는 트래픽을 제한하는AuthorizationPolicy
오브젝트 -
Kubernetes가 Knative 서비스에서
PreStopHooks
를 호출할 수 있도록 하는 하나의AuthorizationPolicy
오브젝트
이러한 정책을 수동으로 생성하는 대신
helm
유틸리티를 설치하고 각 테넌트에 필요한 리소스를 생성합니다.helm
유틸리티 설치$ helm repo add openshift-helm-charts https://charts.openshift.io/
팀 알파
에 대한 구성 예 생성$ helm template openshift-helm-charts/redhat-knative-istio-authz --version 1.33.0 --set "name=team-alpha" --set "namespaces={team-alpha-1,team-alpha-2}" > team-alpha.yaml
팀 bravo
의 구성 예 생성$ helm template openshift-helm-charts/redhat-knative-istio-authz --version 1.31.0 --set "name=team-bravo" --set "namespaces={team-bravo-1,team-bravo-2}" > team-bravo.yaml
-
테넌트의 프로젝트로 들어오는 트래픽을 직접 제한하는 하나의
권한 부여 정책 구성을 적용합니다.
$ oc apply -f team-alpha.yaml team-bravo.yaml