이 문서는 이미 확장하기 위해 작성되었습니다.
이 기사에서는 설치 및 구성 방법에 대해 설명합니다.
- 열쇠망토 오픈 소스 프로젝트입니다. 애플리케이션에 대한 단일 진입점을 제공합니다. 관심 있는 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
페더레이션 설정
다음으로 웹 인터페이스로 이동합니다.
왼쪽 모서리에서 클릭 영역 추가
키
가치관
성함
쿠 버네 티스
표시 이름
Kubernetes
사용자 이메일 확인 비활성화:
클라이언트 범위 —> 이메일 —> 매퍼 —> 확인된 이메일(삭제)
우리는 ActiveDirectory에서 사용자를 가져오기 위해 페더레이션을 설정했습니다. 아래에 스크린샷을 남길 것입니다. 더 명확할 것이라고 생각합니다.
사용자 연합 —> 공급자 추가… —> ldap
페더레이션 설정
모든 것이 잘되면 버튼을 누른 후 모든 사용자 동기화 성공적인 사용자 가져오기에 대한 메시지가 표시됩니다.
다음으로 그룹을 매핑해야 합니다.
사용자 연합 --> ldap_localhost --> 매퍼 --> 생성
매퍼 만들기
클라이언트 설정
Keycloak과 관련하여 클라이언트를 생성해야 합니다. 이것은 클라이언트로부터 인증을 받을 애플리케이션입니다. 스크린 샷에서 중요한 부분을 빨간색으로 강조 표시하겠습니다.
클라이언트 —> 생성
클라이언트 설정
그룹을 위한 스쿠프를 만들어 봅시다:
클라이언트 범위 —> 만들기
범위 만들기
그리고 그들을 위해 매퍼를 설정하십시오.
클라이언트 범위 —> 그룹 —> 매퍼 —> 생성
매퍼
기본 클라이언트 범위에 그룹 매핑을 추가합니다.
클라이언트 —> kubernetes —> 클라이언트 범위 —> 기본 클라이언트 범위
선택 그룹 в 사용 가능한 클라이언트 범위, 프레스 선택 항목 추가
우리는 Keycloak에서 인증에 사용할 비밀을 얻고 스레드에 씁니다.
클라이언트 —> kubernetes —> 자격 증명 —> 비밀
이렇게 하면 설정이 완료되지만 인증에 성공한 후 오류 403이 표시되는 오류가 발생했습니다.
고치다:
클라이언트 범위 —> 역할 —> 매퍼 —> 생성
매퍼
스크립트 코드
// 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"
이후에 가려고 하면
통로 설치
편의를 위해 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-----
이렇게 생겼습니다. 구성 파일을 즉시 다운로드하고 일련의 명령을 사용하여 생성할 수 있습니다.
출처 : habr.com