LDAP서버 설치
LDAP서버를 설치하는 방법은 docker로 설치하는 방법과 k8s Pod로 설치하는 방법이 있습니다.
빠르게 설치하려면 docker로 설치하십시오.
실제 업무에 적용할때는 Pod로 설치하여 이중화하는것이 좋습니다.
docker로 설치
1) LDAP서버, LDAP Client 설치
$ docker run -d -e DOMAIN={LDAP host} -e PASSWORD={admin password} --name={container name} -p 389:389 -p 9580:9580 -v /var/lib/ldap/data:/var/ldap -v /var/lib/ldap/conf:/etc/ldap/slapd.d siji/openldap:2.4.42
아래는 LDAP주소를 myldap.io로 설치하는 예제입니다.
[root@osboxes ~]# docker run -d -e DOMAIN=myldap.io -e PASSWORD=happy@cloud --name=myldap -p 389:389 -p 9580:9580 -v /var/lib/ldap/data:/var/ldap -v /var/lib/ldap/conf:/etc/ldap/slapd.d siji/openldap:2.4.42
Unable to find image 'siji/openldap:2.4.42' locally
2.4.42: Pulling from siji/openldap
ae79f2514705: Pull complete
5ad56d5fc149: Pull complete
170e558760e8: Pull complete
395460e233f5: Pull complete
6f01dc62e444: Pull complete
787cff8b2458: Pull complete
bf2ada941824: Pull complete
Digest: sha256:615c4822c31e9b752a92798501406f25ecb66d5006bc66770c8d60791e6dc680
Status: Downloaded newer image for siji/openldap:2.4.42
d5921029902f8461803a44a9a85e7b20eaa57000eeff3f54b4a47700971bae36
- DOMAIN, PASSWORD는 적절히 변경
2) LDAP 도메인 등록
DNS서버에 LDAP host를 등록합니다. 없으면 LDAP을 이용하는 모든 VM과 Host PC의 hosts파일에 등록합니다.
3) /var/lib/ldap 소유권 변경
root로 설치시에는 하지 않아도 됩니다.
user계정으로 설치시에는 /var/lib/ldap 디렉토리의 소유권을 변경해 줘야 합니다.
안 하면 ldap 로그인 후 좌측 아래에 아래와 같은 에러 메시지가 뜹니다.
'This base cannot be created with PLA'
만약 pocuser로 설치하였다면 아래와 같이 변경하시면 됩니다.
[pocuser@bastion]$ sudo chown -R pocuser:pocuser /var/lib/ldap
4) 설치 확인
웹 브라우저에서 http://{LDAP host}:9580/phpldapadmin 페이지를 접근합니다.
Login DN(Distinguished Name)은 cn=admin,dc={1st LDAP host part},dc={2nd LDAP host part},....입니다.
예를 들어 myldap.ibm.com이 LDAP host이면, cn=admin,dc=myldap,dc=ibm,dc=com이 됩니다.
암호는 설치 시 지정한 환경변수 'PASSWORD'값입니다. 이 예제에서는 happy@cloud입니다.
위 설치 예제에서는 아래와 같이 로그인하면 됩니다.
DN : cn=admin,dc=myldap,dc=io
password: happy@cloud
pod로 설치
사전준비
1) helm client 설치: https://happycloud-lee.tistory.com/3?category=832245
2) namespace생성과 기본 Service Accont에 anyuid 권한부여
- vanilla k8s
$ kubectl create ns ldap
$ kubectl create clusterrolebinding crb_ldap_default --clusterrole=cluster-admin --serviceaccount=ldap:default
- OCP
$ oc new-project ldap
$ oc adm policy add-scc-to-user anyuid -z default
ldap서버 설치
1) 작업 디렉토리를 만듭니다.
$ mkdir -p ~/install/ldap
$ cd ~/install/ldap
2) helm registry를 추가합니다.
2020.11월 경부터 helm 3.0을 지원하는 새 registry를 사용해야 합니다.
$helm repo add stable https://charts.helm.sh/stable
$ helm repo add stable https://kubernetes-charts.storage.googleapis.com
3) 설치 환경 설정을 합니다.
$ helm repo update
$ helm inspect values stable/openldap > values-openldap
$ vi values-openldap
DOMAIN과 admin암호, storageClass를 적절히 바꾸십시오.
persistence.enabled는 'true'로 변경하십시오.
storage class는 kubectl get sc로 확인합니다.
사전에 k8s에 NFS 서버설치와 dynamic provisioning설정이 되어 있어야 합니다.
# Default configuration for openldap as environment variables. These get injected directly in the container.
# Use the env variables from https://github.com/osixia/docker-openldap#beginner-guide
env:
...
LDAP_DOMAIN: "myldap.io"
...
# Default Passwords to use, stored as a secret. If unset, passwords are auto-generated.
# You can override these at install time with
# helm install openldap --set openldap.adminPassword=<passwd>,openldap.configPassword=<passwd>
adminPassword: "happy@cloud"
...
## Persist data to a persistent volume
persistence:
enabled: true
...
storageClass: "nfs-standard"
...
4) LDAP서버를 설치합니다.
$ helm install ldap -f values-openldap stable/openldap -n ldap
phpldapadmin 설치
$ helm repo add cetic https://cetic.github.io/helm-charts
$ helm repo update
$ helm inspect values cetic/phpldapadmin > values-phpldapadmin
$ vi values-phpldapadmin
- LDAP_DOMAIN은 ldap 서비스명을 입력함. ldap service가 다른 namespace에 있으면 ldap-openldap.<namespace>.svc.cluster.local로 입력. 만약 다른 cluster라면 외부에서 접속할 수 있는 ingress주소를 입력함.
- Ingress설정은 하지 마십시오. 설정을 하면 아래와 같이 에러가 납니다. Ingress는 수동으로 만들어 줄 겁니다.
Error: INSTALLATION FAILED: unable to build kubernetes objects from release manifest: unable to recognize "": no matches for kind "Ingress" in version "extensions/v1beta1"
- readinessProbe와 livenessProbe는 아래와 같이 설정을 리마크하거나 삭제하십시오. 이 설정을 하면 Pod가 제대로 동작하지 않습니다.
## TODO: add this in the deployment.yaml
env:
PHPLDAPADMIN_LDAP_HOSTS: "ldap-openldap"
...
...
service:
type: ClusterIP
...
## Configure liveness and readiness probes
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/
##
readinessProbe:
# httpGet:
# path: /
# port: http
livenessProbe:
# httpGet:
# path: /
# port: http
phpldapadmin을 설치합니다.
$ helm install ldapadm -f values-phpldapadmin cetic/phpldapadmin -n ldap
ingress 생성
ingress controller가 먼저 설치되어 있어야 합니다.
minikube에서는 아래와 같이 간단히 설치할 수 있습니다.
$ minikube addons enable ingress
멀티노드에 설치한 경우는 아래 글을 참조하여 ingress를 설치 하십시오.
https://happycloud-lee.tistory.com/167
$ vi ing.yaml
host값의 ip는 worker node중 하나의 ip로 지정함(생성 후 연결이 안되면 kubectl get ing 결과의 ADDRESS column의 ip로 바꾸면 됨)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: "nginx"
generation: 1
labels:
app: phpldapadmin
chart: phpldapadmin-0.1.4
heritage: Helm
release: ldapadm
name: ldapadm-phpldapadmin
namespace: ldap
spec:
rules:
- host: myldap.io
http:
paths:
- backend:
service:
name: ldapadm-phpldapadmin
port:
number: 80
path: /
pathType: Prefix
$ kubectl apply -f ing.yaml
로그인
작업 PC의 hosts파일에 ingress host를 등록 합니다.
위 예제대로 설치하였다면 http://myldap.io 로 접근하여, 아래 값으로 로그인하면 됩니다.
DN : cn=admin,dc=myldap,dc=io
password: happy@cloud
참고: 복수의 ldap서버를 관리하려면..
phpldapadmin : https://libraries.io/github/osixia/docker-phpLDAPadmin
위 values-phpldapadmin의 PHPLDAPADMIN_LDAP_HOSTS 필드에 ldap server의 서비스 이름을 복수로 입력하여 여러개의 ldap server를 관리할 수 있어야 하는데 아직 잘 안됩니다.
아래와 같이 deployment 의 YAML을 수정하면 됩니다.
$ kubectl get deploy ldapadm-phpldapadmin -o yaml > deploy.yaml
$ vi deploy.yaml
먼저, 불필요한 부분 정리합니다.
- createTimestamp
- managedFields포함하여 전부 ( name: 바로 전 줄까지 삭제)
- resourceVersion, selfLink, uid 삭제
- status 포함하여 모두 삭제
아래 예제와 같이 envFrom의 3줄을 지우거나, remark 하시고, env: 항목에 환경변수를 직접 지정합니다.
이때 PHPLDAPADMIN_LDAP_HOSTS값에 ldap service명과 bind_id를 적절하게 지정하시면 됩니다.
spec:
containers:
- resources: {}
...
env:
- name: PHPLDAPADMIN_HTTPS
value: 'false'
- name: PHPLDAPADMIN_LDAP_HOSTS
value: |-
#PYTHON2BASH:[{'ldap-openldap': [{'server': [{'tls': False}]},
{'login': [{'bind_id': 'cn=admin,dc=ldap,dc=io'}]}]},{'ldap2-openldap': [{'server': [{'tls': False}]},
{'login': [{'bind_id': 'cn=admin,dc=ldap2,dc=io'}]}]}]
- name: PHPLDAPADMIN_TRUST_PROXY_SSL
value: 'true'
#envFrom:
# - configMapRef:
# name: ldap-admin-phpldapadmin
...
지정 후에는 Pod를 삭제하십시오. 자동으로 새 Pod가 생성되면서 지정된 환경변수값을 읽어 여러개의 ldap서버를 지원하게 phpldap admin앱이 실행됩니다.
cluster 외부에서 LDAP서버를 389포트로 접근하려면
LDAP과 연동하는 서버(image registry, k8s 등)에서 LDAP서버를 389포트로 접근하려면 아래와 같이, externalIPs를 이용합니다.
$ kubectl edit svc ldap-openldap
...
spec:
...
externalIPs:
- 169.56.84.41
...
이제 ldap://169.56.84.41 으로 접근할 수 있습니다.
사용자와 그룹 추가 방법은 아래 글을 참조하세요 .
happycloud-lee.tistory.com/172?category=832250