Keycloak을 사용하여 Kubernetes에 ActiveDirectory 인증을 고정합니다.

이 문서는 이미 확장하기 위해 작성되었습니다. 기존의, 그러나 Microsoft ActiveDirectory 번들의 기능에 대해 설명하고 이를 보완합니다.

이 기사에서는 설치 및 구성 방법에 대해 설명합니다.

  • 열쇠망토 오픈 소스 프로젝트입니다. 애플리케이션에 대한 단일 진입점을 제공합니다. 관심 있는 LDAP 및 OpenID를 포함하여 많은 프로토콜과 함께 작동합니다.
  • 열쇠고리 문지기 - Keycloak을 통해 인증을 통합할 수 있는 리버스 프록시 애플리케이션입니다.
  • 통로 - OpenID를 통해 Kubernetes API에 로그인하고 연결할 수 있는 kubectl에 대한 구성을 생성하는 애플리케이션입니다.

Kubernetes에서 권한이 작동하는 방식.

RBAC를 사용하여 사용자/그룹 권한을 관리할 수 있습니다. 이에 대한 많은 기사가 이미 작성되었으므로 이에 대해 자세히 설명하지 않겠습니다. 문제는 RBAC를 사용하여 사용자 권한을 제한할 수 있지만 Kubernetes는 사용자에 대해 아무것도 모른다는 것입니다. Kubernetes에서 사용자 전달 메커니즘이 필요하다는 것이 밝혀졌습니다. 이를 위해 Kuberntes OpenID에 공급자를 추가하여 그러한 사용자가 실제로 존재한다고 말하고 Kubernetes 자체가 그에게 권한을 부여합니다.

훈련

  • Kubernetes 클러스터 또는 minikube가 필요합니다.
  • Active Directory의
  • 도메인:
    keycloak.example.org
    kubernetes-dashboard.example.org
    Gangway.example.org
  • 도메인용 인증서 또는 자체 서명된 인증서

자체 서명된 인증서를 만드는 방법에 대해서는 자세히 설명하지 않겠습니다. 2개의 인증서를 만들어야 합니다. 이것은 *.example.org 도메인의 루트(인증 기관) 및 와일드카드 클라이언트입니다.

인증서를 받거나 발급한 후 클라이언트를 Kubernetes에 추가해야 합니다. 이를 위해 비밀을 생성합니다.

kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pem

다음으로 Ingress 컨트롤러에 사용할 것입니다.

키클로크 설치

이를 위해 기성 솔루션, 즉 투구 차트를 사용하는 것이 가장 쉬운 방법이라고 결정했습니다.

리포지토리를 설치하고 업데이트합니다.

helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo update

다음 콘텐츠로 keycloak.yml 파일을 만듭니다.

keycloak.yml

keycloak:
  # Имя администратора
  username: "test_admin"
  # Пароль администратор  
  password: "admin"
  # Эти флаги нужны что бы позволить загружать в Keycloak скрипты прямо через web морду. Это нам 
  понадобиться что бы починить один баг, о котором ниже.
  extraArgs: "-Dkeycloak.profile.feature.script=enabled -Dkeycloak.profile.feature.upload_scripts=enabled" 
  # Включаем ingress, указываем имя хоста и сертификат который мы предварительно сохранили в secrets
  ingress:
    enabled: true 
    path: /
    annotations:
      kubernetes.io/ingress.class: nginx
      ingress.kubernetes.io/affinity: cookie
    hosts:
      - keycloak.example.org
    tls:
    - hosts:
        - keycloak.example.org
      secretName: tls-keycloak
  # Keycloak для своей работы требует базу данных, в тестовых целях я разворачиваю Postgresql прямо в Kuberntes, в продакшене так лучше не делать!
  persistence:
    deployPostgres: true
    dbVendor: postgres

postgresql:
  postgresUser: keycloak
  postgresPassword: ""
  postgresDatabase: keycloak
  persistence:
    enabled: true

페더레이션 설정

다음으로 웹 인터페이스로 이동합니다. keycloak.example.org

왼쪽 모서리에서 클릭 영역 추가


가치관

성함
쿠 버네 티스

표시 이름
Kubernetes

사용자 이메일 확인 비활성화:
클라이언트 범위 —> 이메일 —> 매퍼 —> 확인된 이메일(삭제)

우리는 ActiveDirectory에서 사용자를 가져오기 위해 페더레이션을 설정했습니다. 아래에 스크린샷을 남길 것입니다. 더 명확할 것이라고 생각합니다.

사용자 연합 —> 공급자 추가… —> ldap

페더레이션 설정Keycloak을 사용하여 Kubernetes에 ActiveDirectory 인증을 고정합니다.
Keycloak을 사용하여 Kubernetes에 ActiveDirectory 인증을 고정합니다.

모든 것이 잘되면 버튼을 누른 후 모든 사용자 동기화 성공적인 사용자 가져오기에 대한 메시지가 표시됩니다.

다음으로 그룹을 매핑해야 합니다.

사용자 연합 --> ldap_localhost --> 매퍼 --> 생성

매퍼 만들기Keycloak을 사용하여 Kubernetes에 ActiveDirectory 인증을 고정합니다.

클라이언트 설정

Keycloak과 관련하여 클라이언트를 생성해야 합니다. 이것은 클라이언트로부터 인증을 받을 애플리케이션입니다. 스크린 샷에서 중요한 부분을 빨간색으로 강조 표시하겠습니다.

클라이언트 —> 생성

클라이언트 설정Keycloak을 사용하여 Kubernetes에 ActiveDirectory 인증을 고정합니다.

그룹을 위한 스쿠프를 만들어 봅시다:

클라이언트 범위 —> 만들기

범위 만들기Keycloak을 사용하여 Kubernetes에 ActiveDirectory 인증을 고정합니다.

그리고 그들을 위해 매퍼를 설정하십시오.

클라이언트 범위 —> 그룹 —> 매퍼 —> 생성

매퍼Keycloak을 사용하여 Kubernetes에 ActiveDirectory 인증을 고정합니다.

기본 클라이언트 범위에 그룹 매핑을 추가합니다.

클라이언트 —> kubernetes —> 클라이언트 범위 —> 기본 클라이언트 범위
선택 그룹 в 사용 가능한 클라이언트 범위, 프레스 선택 항목 추가

우리는 Keycloak에서 인증에 사용할 비밀을 얻고 스레드에 씁니다.

클라이언트 —> kubernetes —> 자격 증명 —> 비밀
이렇게 하면 설정이 완료되지만 인증에 성공한 후 오류 403이 표시되는 오류가 발생했습니다. 버그 보고서.

고치다:

클라이언트 범위 —> 역할 —> 매퍼 —> 생성

매퍼Keycloak을 사용하여 Kubernetes에 ActiveDirectory 인증을 고정합니다.

스크립트 코드

// add current client-id to token audience
token.addAudience(token.getIssuedFor());

// return token issuer as dummy result assigned to iss again
token.getIssuer();

쿠버네티스 구성

사이트의 루트 인증서가 있는 위치와 OIDC 공급자가 있는 위치를 지정해야 합니다.
이렇게 하려면 /etc/kubernetes/manifests/kube-apiserver.yaml 파일을 편집합니다.

kube-apiserver.yaml


...
spec:
  containers:
  - command:
    - kube-apiserver
...
    - --oidc-ca-file=/var/lib/minikube/certs/My_Root.crt
    - --oidc-client-id=kubernetes
    - --oidc-groups-claim=groups
    - --oidc-issuer-url=https://keycloak.example.org/auth/realms/kubernetes
    - --oidc-username-claim=email
...

클러스터에서 kubeadm 구성을 업데이트합니다.

kubeadmconfig

kubectl edit -n kube-system configmaps kubeadm-config


...
data:
  ClusterConfiguration: |
    apiServer:
      extraArgs:
        oidc-ca-file: /var/lib/minikube/certs/My_Root.crt
        oidc-client-id: kubernetes
        oidc-groups-claim: groups
        oidc-issuer-url: https://keycloak.example.org/auth/realms/kubernetes
        oidc-username-claim: email
...

인증 프록시 설정

keycloak 게이트키퍼를 사용하여 웹 애플리케이션을 보호할 수 있습니다. 이 리버스 프록시는 페이지를 표시하기 전에 사용자에게 권한을 부여한다는 사실 외에도 헤더의 최종 애플리케이션에 귀하에 대한 정보를 전달합니다. 따라서 애플리케이션이 OpenID를 지원하는 경우 사용자에게 즉시 권한이 부여됩니다. Kubernetes 대시보드의 예를 고려하십시오.

Kubernetes 대시보드 설치


helm install stable/kubernetes-dashboard --name dashboard -f values_dashboard.yaml

value_dashboard.yaml

enableInsecureLogin: true
service:
  externalPort: 80
rbac:
  clusterAdminRole: true
  create: true
serviceAccount:
  create: true
  name: 'dashboard-test'

액세스 권한 설정:

DataOPS 그룹의 사용자에게 클러스터 관리자 권한(표준 ClusterRole cluster-admin)을 부여하는 ClusterRoleBinding을 생성해 보겠습니다.


kubectl apply -f rbac.yaml

rbac.yaml


apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: dataops_group
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: DataOPS

keycloak 게이트키퍼 설치:


helm repo add gabibbo97 https://gabibbo97.github.io/charts/
helm repo update
helm install gabibbo97/keycloak-gatekeeper --version 2.1.0 --name keycloak-gatekeeper -f values_proxy.yaml

값_프록시.yaml



# Включаем ingress
ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
  path: /
  hosts:
    - kubernetes-dashboard.example.org
  tls:
   - secretName: tls-keycloak
     hosts:
       - kubernetes-dashboard.example.org

# Говорим где мы будем авторизовываться у OIDC провайдера
discoveryURL: "https://keycloak.example.org/auth/realms/kubernetes"
# Имя клиента которого мы создали в Keycloak
ClientID: "kubernetes"
# Secret который я просил записать
ClientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
# Куда перенаправить в случае успешной авторизации. Формат <SCHEMA>://<SERVICE_NAME>.><NAMESAPCE>.<CLUSTER_NAME>
upstreamURL: "http://dashboard-kubernetes-dashboard.default.svc.cluster.local"
# Пропускаем проверку сертификата, если у нас самоподписанный
skipOpenidProviderTlsVerify: true
# Настройка прав доступа, пускаем на все path если мы в группе DataOPS
rules:
  - "uri=/*|groups=DataOPS"

이후에 가려고 하면 kubernetes-dashboard.example.org, Keycloak으로 리디렉션되고 인증에 성공하면 이미 로그인한 대시보드로 이동합니다.

통로 설치

편의를 위해 kubectl에 대한 구성 파일을 생성하는 갱웨이를 추가할 수 있으며 이를 통해 사용자가 Kubernetes에 들어갈 수 있습니다.


helm install --name gangway stable/gangway -f values_gangway.yaml

value_gangway.yaml


gangway:
  # Произвольное имя кластера
  clusterName: "my-k8s"
  # Где у нас OIDC провайдер
  authorizeURL: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/auth"
  tokenURL: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/token"
  audience: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/userinfo"
  # Теоритически сюда можно добавить groups которые мы замапили
  scopes: ["openid", "profile", "email", "offline_access"]
  redirectURL: "https://gangway.example.org/callback"
  # Имя клиента
  clientID: "kubernetes"
  # Секрет
  clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
  # Если оставить дефолтное значние, то за имя пользователя будет братья <b>Frist name</b> <b>Second name</b>, а при "sub" его логин
  usernameClaim: "sub"
  # Доменное имя или IP адресс API сервера
  apiServerURL: "https://192.168.99.111:8443"

# Включаем Ingress
ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/proxy-buffer-size: "64k"
  path: /
  hosts:
  - gangway.example.org
  tls:
  - secretName: tls-keycloak
    hosts:
      - gangway.example.org

# Если используем самоподписанный сертификат, то его(открытый корневой сертификат) надо указать.
trustedCACert: |-
 -----BEGIN CERTIFICATE-----
 MIIDVzCCAj+gAwIBAgIBATANBgkqhkiG9w0BAQsFADA1MQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRGF0YU9QUzEUMBIGA1UEAxMLbXkgcm9vdCBrZXkwHhcNMjAwMjE0MDkxODAwWhcNMzAwMjE0MDkxODAwWjA1MQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRGF0YU9QUzEUMBIGA1UEAxMLbXkgcm9vdCBrZXkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDyP749PqqIRwNSqaK6qr0Zsi03G4PTCUlgaYTPZuMrwUVPK8xX2dWWs9MPRMOdXpgr8aSTZnVfmelIlVz4D7o2vK5rfmAe9GPcK0WbwKwXyhFU0flS9sU/g46ogHFrk03SZxQAeJhMLfEmAJm8LF5HghtGDs3t4uwGsB95o+lqPLiBvxRB8ZS3jSpYpvPgXAuZWKdZUQ3UUZf0X3hGLp7uIcIwJ7i4MduOGaQEO4cePeEJy9aDAO6qV78YmHbyh9kaW+1DL/Sgq8NmTgHGV6UOnAPKHTnMKXl6KkyUz8uLBGIdVhPxrlzG1EzXresJbJenSZ+FZqm3oLqZbw54Yp5hAgMBAAGjcjBwMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHISTOU/6BQqqnOZj+1xJfxpjiG0MAsGA1UdDwQEAwIBBjARBglghkgBhvhCAQEEBAMCAAcwHgYJYIZIAYb4QgENBBEWD3hjYSBjZXJ0aWZpY2F0ZTANBgkqhkiG9w0BAQsFAAOCAQEAj7HC8ObibwOLT4ZYmISJZwub9lcE0AZ5cWkPW39j/syhdbbqjK/6jy2D3WUEbR+s1Vson5Ov7JhN5In2yfZ/ByDvBnoj7CP8Q/ZMjTJgwN7j0rgmEb3CTZvnDPAz8Ijw3FP0cjxfoZ1Z0V2F44Ry7gtLJWr06+MztXVyto3aIz1/XbMQnXYlzc3c3B5yUQIy44Ce5aLRVsAjmXNqVRmDJ2QPNLicvrhnUJsO0zFWI+zZ2hc4Ge1RotCrjfOc9hQY63jZJ17myCZ6QCD7yzMzAob4vrgmkD4q7tpGrhPY/gDcE+lUNhC7DO3l0oPy2wsnT2TEn87eyWmDiTFG9zWDew==
 -----END CERTIFICATE-----

이렇게 생겼습니다. 구성 파일을 즉시 다운로드하고 일련의 명령을 사용하여 생성할 수 있습니다.

Keycloak을 사용하여 Kubernetes에 ActiveDirectory 인증을 고정합니다.

출처 : habr.com

코멘트를 추가