

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# LDAP 인증 사용
<a name="emr-jupyterhub-ldap-users"></a>

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

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

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

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

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

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

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

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

## LDAP 구성 파일 생성
<a name="emr-jupyterhub-ldap-config"></a>

아래 예에서는 다음 자리 표시자 구성 값을 사용합니다. 이를 자신의 구현 상황에 맞는 파라미터로 바꿉니다.
+ LDAP 서버는 버전 3을 실행하고 있으며 포트 389에서 사용할 수 있습니다. 이 포트는 LDAP용 표준 비SSL 포트입니다.
+ 기본 고유 이름(DN)은 `dc=example, dc=org`입니다.

텍스트 편집기를 사용하여 다음과 유사한 내용으로 [ldap.conf](http://manpages.ubuntu.com/manpages/bionic/man5/ldap.conf.5.html) 파일을 생성합니다. 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 인증자 플러그인 활성화
<a name="emr-jupyterhub-ldap-plugin"></a>

텍스트 편집기를 사용하여 `/etc/jupyter/conf/jupyterhub_config.py` 파일을 수정하고 다음과 유사하게 [ldapauthenticator](https://github.com/jupyterhub/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 구성
<a name="emr-jupyterhub-ldap-container"></a>

텍스트 편집기를 사용하여 다음 콘텐츠가 포함된 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에 속성 추가
<a name="emr-jupyterhub-ldap-adproperties"></a>

데이터베이스에서 각 사용자를 찾고 적절한 항목을 만들려면, 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](https://blogs.technet.microsoft.com/activedirectoryua/2016/02/09/identity-management-for-unix-idmu-is-deprecated-in-windows-server/) 기사의 *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*과 같습니다.

## 사용자 홈 디렉터리 생성
<a name="emr-jupyterhub-ldap-directories"></a>

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

첫 번째 단계는 다음 예에 표시된 대로 [ldapsearch](http://manpages.ubuntu.com/manpages/xenial/man1/ldapsearch.1.html)를 사용하여 각 사용자의 사용자 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`명령은 *shirley*와 *diego* 사용자를 위해 다음과 유사하게 표시되는 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`)용 홈 디렉터리를 생성합니다. `uidNumber` 및 `gidNumber`를 사용하여 해당 사용자에 대한 홈 디렉터리용 소유권을 수정합니다. 다음 예시 명령은 사용자 *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](https://github.com/jupyterhub/ldapauthenticator#configuration-note-on-local-user-creation)을 참조하세요.  
로컬 사용자를 수동으로 생성하려면 다음 명령을 사용합니다.  

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

## Jupyterhub 컨테이너 다시 시작
<a name="emr-jupyterhub-ldap-restart"></a>

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

```
sudo docker stop jupyterhub
sudo docker start jupyterhub
```