Linkerd Tap 보안
Linkerd Tap 보안 (Securing Linkerd Tap)
Tap이 노출하는 민감 데이터를 보호하고, RBAC으로 Tap 접근을 제어하며, GKE와 대시보드 등 다양한 환경에서 Tap 접근을 안전하게 활성화하는 방법을 다루는 문서예요.
본문
Linkerd는 사용자가 실시간 트래픽을 실시간으로 들여다볼 수 있게 해주는 tap이라는 강력한 도구를 제공합니다. 강력하지만, 이 기능은 요청·응답 헤더 같은 민감한 데이터를 노출할 수 있으며, 여기에는 기밀 정보가 포함될 수 있어요. 이 위험을 완화하기 위해 Linkerd에는 tap.ignoreHeaders라는 구성 필드가 있어, 특정 헤더가 tap에 캡처되지 않도록 제외할 수 있습니다. tap에 대한 접근은 역할 기반 접근 제어(RBAC)로 통제됩니다.
이 페이지는 이 인트로스펙션을 안전한 방식으로 활성화하는 모범 사례를 다룹니다.
Tap
Linkerd의 Viz 확장은 Tap 지원을 포함합니다. 이 기능은 다음 명령을 통해 사용할 수 있습니다:
- linkerd viz tap
- linkerd viz top
- linkerd viz profile --tap
- linkerd viz dashboard
RBAC 설정에 따라, 사용자(들)가 Tap 작업을 수행하도록 하려면 추가 단계가 필요할 수 있습니다.
Note
GKE를 사용 중이라면 아래 GKE 섹션으로 건너뛰세요.
Tap 접근 확인 (Check for Tap access)
kubectl을 사용해 사용자가 tap 작업을 수행할 권한이 있는지 확인하세요. 자세한 내용은 Kubernetes 인가 문서를 참고하세요.
모든 네임스페이스에서 파드를 watch할 수 있는지 확인하려면:
`kubectl auth can-i watch pods.tap.linkerd.io --all-namespaces
`
emojivoto 네임스페이스에서 deployment를 watch할 수 있는지 확인하려면:
`kubectl auth can-i watch deployments.tap.linkerd.io -n emojivoto
`
특정 사용자가 emojivoto 네임스페이스에서 deployment를 watch할 수 있는지 확인하려면:
`kubectl auth can-i watch deployments.tap.linkerd.io -n emojivoto --as $(whoami)
`
Linkerd CLI의 --as 플래그로도 확인할 수 있어요:
`$ linkerd viz tap -n linkerd deploy/linkerd-controller --as $(whoami)
Cannot connect to Linkerd Viz: namespaces is forbidden: User "XXXX" cannot list resource "namespaces" in API group "" at the cluster scope
Validate the install with: linkerd viz check
...
`
Tap 접근 활성화 (Enabling Tap access)
위 명령이 추가 접근이 필요하다고 표시하면, 원하는 만큼 세밀하게 접근을 활성화할 수 있습니다.
세밀한 Tap 접근 (Granular Tap access)
모든 네임스페이스의 모든 리소스에 대해 tap 접근을 활성화하려면, 기본으로 설치되는 linkerd-linkerd-tap-admin ClusterRole에 사용자를 바인딩할 수 있어요:
`$ kubectl describe clusterroles/linkerd-linkerd-viz-tap-admin
Name: linkerd-linkerd-viz-tap-admin
Labels: component=tap
linkerd.io/extension=viz
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"rbac.authorization.k8s.io/v1","kind":"ClusterRole","metadata":{"annotations":{},"labels":{"component=tap...
PolicyRule:
Resources Non-Resource URLs Resource Names Verbs
--------- ----------------- -------------- -----
*.tap.linkerd.io [] [] [watch]
`
Note
이 ClusterRole 이름은 Linkerd Viz 네임스페이스를 포함하므로, Viz를 기본이 아닌 네임스페이스에 설치했다면 달라질 수 있어요: linkerd-[LINKERD_VIZ_NAMESPACE]-tap-admin
특정 사용자에게 linkerd-linkerd-viz-tap-admin ClusterRole을 바인딩하려면:
`kubectl create clusterrolebinding \
$(whoami)-tap-admin \
--clusterrole=linkerd-linkerd-viz-tap-admin \
--user=$(whoami)
`
이제 tap 접근이 생겼는지 다음으로 확인할 수 있습니다:
`$ linkerd viz tap -n linkerd deploy/linkerd-controller --as $(whoami)
req id=3:0 proxy=in src=10.244.0.1:37392 dst=10.244.0.13:9996 tls=not_provided_by_remote :method=GET :authority=10.244.0.13:9996 :path=/ping
...
`
클러스터 어드민 접근 (Cluster admin access)
간단히 사용자에게 cluster-admin 접근을 주려면:
`kubectl create clusterrolebinding \
$(whoami)-cluster-admin \
--clusterrole=cluster-admin \
--user=$(whoami)
`
Note
프로덕션에는 권장하지 않으며, 테스트/개발용으로만 하세요.
GKE
Google Kubernetes Engine (GKE)는 Google Cloud IAM을 통해 Kubernetes 클러스터에 접근을 제공합니다. 자세한 내용은 GKE IAM 문서를 참고하세요.
GCloud가 이 추가 접근 계층을 제공하기 때문에, kubectl auth can-i가 RBAC 사용자가 실제로는 없는데 Tap 접근이 있다고 보고하는 경우가 있습니다. 이를 검증하려면, GCloud 사용자에게 Tap 접근이 있는지 확인하세요:
`$ kubectl auth can-i watch pods.tap.linkerd.io --all-namespaces
yes
`
그리고 RBAC 사용자에게 Tap 접근이 있는지 검증하세요:
`$ kubectl auth can-i watch pods.tap.linkerd.io --all-namespaces --as $(gcloud config get-value account)
no - no RBAC policy matched
`
두 번째 명령이 접근이 없다고 보고했다면, 다음으로 접근을 활성화할 수 있습니다:
`kubectl create clusterrolebinding \
$(whoami)-tap-admin \
--clusterrole=linkerd-linkerd-viz-tap-admin \
--user=$(gcloud config get-value account)
`
간단히 사용자에게 cluster-admin 접근을 주려면:
`kubectl create clusterrolebinding \
$(whoami)-cluster-admin \
--clusterrole=cluster-admin \
--user=$(gcloud config get-value account)
`
Note
프로덕션에는 권장하지 않으며, 테스트/개발용으로만 하세요.
Linkerd 대시보드 tap 접근 (Linkerd Dashboard tap access)
기본적으로 Linkerd 대시보드는 리소스를 tap하는 데 필요한 RBAC 권한을 가집니다.
확인하려면:
`$ kubectl auth can-i watch pods.tap.linkerd.io --all-namespaces --as system:serviceaccount:linkerd-viz:web
yes
`
이 접근은 linkerd-linkerd-viz-web-admin ClusterRoleBinding을 통해 활성화됩니다:
`$ kubectl describe clusterrolebindings/linkerd-linkerd-viz-web-admin
Name: linkerd-linkerd-viz-web-admin
Labels: component=web
linkerd.io/extensions=viz
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"rbac.authorization.k8s.io/v1","kind":"ClusterRoleBinding","metadata":{"annotations":{},"labels":{"component=web...
Role:
Kind: ClusterRole
Name: linkerd-linkerd-viz-tap-admin
Subjects:
Kind Name Namespace
---- ---- ---------
ServiceAccount web linkerd-viz
`
Linkerd 대시보드의 tap 접근을 제한하고 싶다면, --set dashboard.restrictPrivileges 플래그로 Linkerd viz를 설치할 수 있어요:
`linkerd viz install --set dashboard.restrictPrivileges
`
이렇게 하면 linkerd-linkerd-web-admin ClusterRoleBinding이 빠집니다. 이미 Linkerd를 설치했다면, ClusterRoleBinding을 수동으로 그냥 삭제하면 됩니다:
`kubectl delete clusterrolebindings/linkerd-linkerd-viz-web-admin
`
확인하려면:
`$ kubectl auth can-i watch pods.tap.linkerd.io --all-namespaces --as system:serviceaccount:linkerd-viz:web
no
`
더 알아보기 (Learn more)
- Linkerd Viz 확장과 Tap 기능에 대한 자세한 내용은 관련 문서를 참고하세요.