Open Sources

LDAP서버 설치

Happy@Cloud 2020. 5. 14. 11:14

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

 

LDAP에 사용자/그룹 추가 하기

kubepia.github.io/cloudpak/cp4app/install/cp4app01.html#ldap%EC%84%9C%EB%B2%84-%EC%84%A4%EC%B9%98-%EB%B0%8F-user-group%EC%B6%94%EA%B0%80 CP4App-Common Service 설치 | Kubepia Documents CP4App-Common..

happycloud-lee.tistory.com