LDAP 인증 사용 - Amazon EMR

LDAP 인증 사용

LDAP(Lightweight Directory Access Protocol)는 Active Directory 또는 OpenLDAP 서버와 같은 LDAP 호환 디렉터리 서비스 공급자에 저장된 사용자 및 컴퓨터와 같은 리소스에 해당하는 객체를 쿼리 및 수정하기 위한 애플리케이션 프로토콜입니다. Amazon EMR에서 JupyterHub와 함께 JupyterHub용 LDAP 인증자 플러그인을 사용하여 사용자 인증에 LDAP를 사용할 수 있습니다. 이 플러그인은 LDAP 사용자용 로그인 세션을 처리하고 사용자 정보를 Jupyter에 제공합니다. 이렇게 하면 사용자가 LDAP 호환 서버에 저장된 자신의 ID에 대한 자격 증명을 사용하여 JupyterHub 및 노트북에 연결할 수 있습니다.

이 단원의 단계에서는 다음 단계를 통해 JupyterHub용 LDAP 인증자 플러그인을 사용하여 LDAP를 설정 및 활성화하는 방법을 안내합니다. 마스터 노드 명령줄에 연결되어 있는 동안 단계를 수행해야 합니다. 자세한 내용은 프라이머리 노드 및 노트북 서버에 연결 섹션을 참조하세요.

  1. 호스트 IP 주소, 포트, 바인딩 이름 등과 같은 LDAP 서버에 대한 정보를 사용하여 LDAP 구성 파일을 생성합니다.

  2. JupyterHub용 LDAP 인증자 플러그인을 활성화하도록 /etc/jupyter/conf/jupyterhub_config.py를 수정합니다.

  3. jupyterhub 컨테이너 내에서 LDAP를 구성하는 스크립트를 생성하고 실행합니다.

  4. 사용자용 LDAP를 조회한 다음, 해당 사용자를 위해 컨테이너 내에 홈 디렉터리를 생성합니다. JupyterHub를 사용하려면 노트북을 호스팅하는 홈 디렉터리가 있어야 합니다.

  5. JupyterHub를 다시 시작하는 스크립트 실행

중요

LDAP를 설정하기 전에, 네트워크 인프라를 테스트하여 LDAP 서버 및 클러스터 마스터 노드가 필요 시 통신할 수 있도록 합니다. TLS는 일반적으로 일반 TCP 연결을 통해 포트 389를 사용합니다. LDAP 연결에서 SSL을 사용하는 경우 SSL용 잘 알려진 TCP 포트는 636입니다.

LDAP 구성 파일 생성

아래 예에서는 다음 자리 표시자 구성 값을 사용합니다. 이를 자신의 구현 상황에 맞는 파라미터로 바꿉니다.

  • LDAP 서버는 버전 3을 실행하고 있으며 포트 389에서 사용할 수 있습니다. 이 포트는 LDAP용 표준 비SSL 포트입니다.

  • 기본 고유 이름(DN)은 dc=example, dc=org입니다.

텍스트 편집기를 사용하여 다음과 유사한 내용으로 ldap.conf 파일을 생성합니다. LDAP 구현 상황에 적절한 값을 사용합니다. host를 LDAP 서버의 IP 주소 또는 확인 가능한 호스트 이름으로 바꿉니다.

base dc=example,dc=org uri ldap://host ldap_version 3 binddn cn=admin,dc=example,dc=org bindpw admin

JupyterHub용 LDAP 인증자 플러그인 활성화

텍스트 편집기를 사용하여 /etc/jupyter/conf/jupyterhub_config.py 파일을 수정하고 다음과 유사하게 ldapauthenticator 속성을 추가합니다. host를 LDAP 서버의 IP 주소 또는 확인 가능한 호스트 이름으로 바꿉니다. 이 예에서는 사용자 객체가 people이라는 조직 단위(OU) 내에 있으며 ldap.conf를 사용하여 앞에서 설정한 고유 이름 구성 요소를 사용한다고 가정합니다.

c.JupyterHub.authenticator_class = 'ldapauthenticator.LDAPAuthenticator' c.LDAPAuthenticator.use_ssl = False c.LDAPAuthenticator.server_address = 'host' c.LDAPAuthenticator.bind_dn_template = 'cn={username},ou=people,dc=example,dc=org'

컨테이너 내에서 LDAP 구성

텍스트 편집기를 사용하여 다음 콘텐츠가 포함된 bash 스크립트를 생성합니다.

#!/bin/bash # Uncomment the following lines to install LDAP client libraries only if # using Amazon EMR release version 5.14.0. Later versions install libraries by default. # sudo docker exec jupyterhub bash -c "sudo apt-get update" # sudo docker exec jupyterhub bash -c "sudo apt-get -y install libnss-ldap libpam-ldap ldap-utils nscd" # Copy ldap.conf sudo docker cp ldap.conf jupyterhub:/etc/ldap/ sudo docker exec jupyterhub bash -c "cat /etc/ldap/ldap.conf" # configure nss switch sudo docker exec jupyterhub bash -c "sed -i 's/\(^passwd.*\)/\1 ldap/g' /etc/nsswitch.conf" sudo docker exec jupyterhub bash -c "sed -i 's/\(^group.*\)/\1 ldap/g' /etc/nsswitch.conf" sudo docker exec jupyterhub bash -c "sed -i 's/\(^shadow.*\)/\1 ldap/g' /etc/nsswitch.conf" sudo docker exec jupyterhub bash -c "cat /etc/nsswitch.conf" # configure PAM to create home directories sudo docker exec jupyterhub bash -c "echo 'session required pam_mkhomedir.so skel=/etc/skel umask=077' >> /etc/pam.d/common-session" sudo docker exec jupyterhub bash -c "cat /etc/pam.d/common-session" # restart nscd service sudo docker exec jupyterhub bash -c "sudo service nscd restart" # Test sudo docker exec jupyterhub bash -c "getent passwd" # Install ldap plugin sudo docker exec jupyterhub bash -c "pip install jupyterhub-ldapauthenticator"

스크립트를 마스터 노드에 저장한 다음 이를 마스터 노드 명령줄에서 실행합니다. 예를 들어, configure_ldap_client.sh라고 저장한 스크립트를 사용하여 파일을 실행 파일로 만듭니다.

chmod +x configure_ldap_client.sh

그런 다음 스크립트를 실행합니다.

./configure_ldap_client.sh

Active Directory에 속성 추가

데이터베이스에서 각 사용자를 찾고 적절한 항목을 만들려면, JupyterHub 도커 컨테이너에 Active Directory의 해당 사용자 객체에 대한 다음 UNIX 속성이 필요합니다. 자세한 내용은 Clarification regarding the status of identity management for Unix (IDMU) and NIS server role in Windows Server 2016 technical preview and beyond 기사의 How do I continue to edit the GID/UID RFC 2307 attributes now that the Unix Attributes Plug-in is no longer available for the Active Directory Users and Computers MMC snap-in? 섹션을 참조하세요.

  • homeDirectory

    사용자 홈 디렉터리의 위치이며 보통 /home/username입니다.

  • gidNumber

    다른 사용자가 아직 사용하지 않은 60000보다 큰 값입니다. 사용 중인 GID는 etc/passwd 파일에서 확인하십시오.

  • uidNumber

    다른 그룹이 아직 사용하지 않은 60000보다 큰 값입니다. 사용 중인 UID는 etc/group 파일에서 확인하십시오.

  • uid

    username과 같습니다.

사용자 홈 디렉터리 생성

JupyterHub에서는 LDAP 사용자를 인증하고 인스턴스 데이터를 저장하기 위해 컨테이너 내에 홈 디렉터리가 있어야 합니다. 다음 예는 LDAP 디렉터리에 있는 두 명의 사용자 shirleydiego를 보여줍니다.

첫 번째 단계는 다음 예에 표시된 대로 ldapsearch를 사용하여 각 사용자의 사용자 ID 및 그룹 ID 정보를 LDAP 서버에 조회하는 것입니다. 이때 host는 LDAP 서버의 IP 주소 또는 확인 가능한 호스트 이름으로 바꿉니다.

ldapsearch -x -H ldap://host \ -D "cn=admin,dc=example,dc=org" \ -w admin \ -b "ou=people,dc=example,dc=org" \ -s sub \ "(objectclass=*)" uidNumber gidNumber

ldapsearch명령은 shirleydiego 사용자를 위해 다음과 유사하게 표시되는 LDIF 형식 응답을 반환합니다.

# extended LDIF # LDAPv3 # base <ou=people,dc=example,dc=org> with scope subtree # filter: (objectclass=*) # requesting: uidNumber gidNumber sn # people, example.org dn: ou=people,dc=example,dc=org # diego, people, example.org dn: cn=diego,ou=people,dc=example,dc=org sn: B uidNumber: 1001 gidNumber: 100 # shirley, people, example.org dn: cn=shirley,ou=people,dc=example,dc=org sn: A uidNumber: 1002 gidNumber: 100 # search result search: 2 result: 0 Success # numResponses: 4 # numEntries: 3

응답에서 획득한 정보로 컨테이너 내 명령을 실행하여 각 사용자의 일반 이름(cn)용 홈 디렉터리를 생성합니다. uidNumbergidNumber를 사용하여 해당 사용자에 대한 홈 디렉터리용 소유권을 수정합니다. 다음 예시 명령은 사용자 shirley에 대해 이 작업을 수행합니다.

sudo docker container exec jupyterhub bash -c "mkdir /home/shirley" sudo docker container exec jupyterhub bash -c "chown -R $uidNumber /home/shirley" sudo docker container exec jupyterhub bash -c "sudo chgrp -R $gidNumber /home/shirley"
참고

JupyterHub의 LDAP 인증자는 로컬 사용자 생성을 지원하지 않습니다. 자세한 내용은 LDAP authenticator configuration note on local user creation을 참조하세요.

로컬 사용자를 수동으로 생성하려면 다음 명령을 사용합니다.

sudo docker exec jupyterhub bash -c "echo 'shirley:x:$uidNumber:$gidNumber::/home/shirley:/bin/bash' >> /etc/passwd"

Jupyterhub 컨테이너 다시 시작

jupyterhub 컨테이너를 다시 시작하려면 다음 명령을 실행합니다.

sudo docker stop jupyterhub sudo docker start jupyterhub