글 작성자: 모두의 근삼이

Jupyter Notebook 자체 기능만으로는 사용자 관리에 Ldap연동을 하여 사용하는것이 불가능하다. 때문에 방법을 찾아보던 중 JupyterHub라는 것을 알게 되었다.

JupyterHub

JupyterHub는 Jupyter notebook을 다중 사용자가 이용하기에 적합한 기능을 간편하게 제공한다. JupyterHub는 이름에서도 느껴지듯이 여러 인스턴스의 notebook 서버를 대상으로 생성, 관리, 접근 등의 기능을 제공하는 멀티 유저 허브로써의 기능을 수행한다.

JupyterHub의 아키텍쳐는 위와 같다. 크게 네가지로 컴포넌트를 볼 수 있는데, 아래와 같다.

  • HUB
  • HTTP Proxy
  • notebook SERVER
  • Authentication class

이번 글은 LDAP을 설명하는 글이 아니기 때문에, 자세한 내용은 스킵한다.

Jupyter Hub Install

Jupyter Hub를 설치할때 보다 간편한 세팅이 가능한 환경은 Conda를 활용하는 것이다. 하지만 테스트 환경의 문제로 Conda를 사용하기 어려운 상황이므로 Conda를 사용하지 않고 설치하는 방법에 대해서 알아보려고 한다. (Conda를 활용한 Install은 공식 Document를 참고하면 좋다.)

Nodejs, NPM 설치

#bash(debian/ubuntu)

apt-get update
apt-get install -y curl software-properties-common
curl -sL https://deb.nodesource.com/setup_12.x | bash -
apt-get install -y nodejs

HUB, Notebook 설치

#bash

python3 -m pip install jupyterhub
npm install -g configurable-http-proxy
python3 -m pip install notebook

설치 확인. 각 명령어들의 헬프 페이지가 뜬다면 정상 설치 된 것이다.

#bash

jupyterhub -h
configurable-http-proxy -h

Config 생성

#bash

mkdir -p /etc/jupyterhub && cd /etc/jupyterhub
jupyterhub --generate-config

접속할 계정생성 및 암호 세팅

#bash

useradd -m <생성할 유저이름>
echo -e '<사용할 암호>\n<사용할 암호>\n' | passwd <생성한 유저이름>

JupyterHub 접속 테스트

jupyterhub -f /etc/jupyterhub/jupyterhub_config.py

ldapauthenticator

JupyterHub에서 ldap인증 기능을 사용하기 위해서는 추가적으로 관련 모듈과 OS 디펜던시를 설치해야한다. 참고로 ldapauthenticator는 보안상의 문제로 인해 로컬에 사용자 생성기능까지는 제공하지 않는다. 때문에, LDAP인증을 활용하더라도 해당 사용자로 정상적으로 로그인 하기 위해서는 패스워드는 따로 지정하지 않더라도, 사용자 생성은 반드시 사전에 진행되어야 한다.

ldapauthenticator install

#bash
pip install jupyterhub-ldapauthenticator

주의. jupyterhub 서버를 실행하면 hub를 실행한 디렉토리에 아래 두개의 로그인 세션과 유관한 파일들을 생성된다. 기존에 접속했던 사용자나, 접속해 있는 사용자가 있는 상태에서 인증모듈을 바꾸거나 생성하게 될 경우, 정상적으로 접속되어야 하는 사용자가 접속하지 못하는 경우가 생길 수 있으므로, 새로운 설정으로 서버를 시작하기 전에 반드시 아래 두개의 파일을 제거하고 시작하도록 하자.
- jupyterhub.sqlite
- jupyterhub_cookie_secret

Config

config파일에 아래 양식에 맞게 LDAP 인증에 필요한 정보등을 작성한다. 아래의 세팅은 192.168.0.230:30389에 위치한 LDAP서버로부터,
DN = "cn=kbsys,cn=kbsys,dc=example,dc=com" ,

DN = "cn=yeom,cn=kbsys,dc=example,dc=com" 인 사용자에 대한 접속을 허용하는 세팅이다.

물론 사전에 설명한 것 처럼, linux 로컬 서버에는 kbsys, yeom 이라는 유저가 존재해야한다.

# jupyter_config.py

#인증모듈을 LDAP으로 활성화.
c.JupyterHub.authenticator_class = 'ldapauthenticator.LDAPAuthenticator'

#LDAP서버의 주소. 포트와 프로토콜등은 생략하고 작성한다.
c.LDAPAuthenticator.server_address = '192.168.0.230'

#LDAP서버의 포트. Default Port(389)를 사용할 경우 생략가능하다.
c.LDAPAuthenticator.server_port = 30389

#bind_dn_template기능을 활요하기 위해서는 아래를 False로 설정해야한다.
c.LDAPAuthenticator.lookup_dn = False

#LDAP에서 조회할 사용자의 ID의 dn 템플릿 {username}부분이 사용자가 ID로 입력한 값과 치환된다.
c.LDAPAuthenticator.bind_dn_template = [
    "cn={username},cn=kbsys,dc=example,dc=com",
]

#로그인 가능한 사용자 화이트리스트 생성
c.Authenticator.whitelist = {'kbsys', 'yeom'}

#Jupyterhube 로그인시 처음 보여줄 홈 디렉토리
c.Spawner.notebook_dir = '/some/path/to/use'

Docker

jupyterhub와 ldap 인증기능이 포함된 이미지는 DockerHub에 이미 잘 만들어진 것이 있다.

하지만, 프로젝트 사정상 이미 만들어진 별도의 Docker이미지를 활용해서 JupyterHub와 LDAP인증 기능만 추가해야하는 상황이었기 때문에, 별도의 Docker이미지를 생성해야 한다. 참고로 파이썬 버전은 3.5버전 이상이어야 한다.

#Dockerfile

#아래의 FROM 이미지 부분은 개인 환경에 맞게 수정
FROM python:3.6-slim-stretch

RUN sed -i 's_deb.debian.org_mirror.kakao.com_g' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y curl software-properties-common
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash -
RUN apt-get install -y nodejs
RUN python3 -m pip install jupyterhub
RUN npm install -g configurable-http-proxy
RUN python3 -m pip install notebook
RUN mkdir -p /etc/jupyterhub

COPY jupyterhub_config.py /etc/jupyterhub/jupyterhub_config.py

Kubernetes

Kubernetes에 설정할때도 마찬가지로 기존에 만들어진 heml을 이용하면 간편하다.

 

하지만, 위와 마찬가지로 기존에 만들어진 Docker이미지를 상속해야 하는 입장에서, 위에서 만들 개인 이미지를 이용해 Deployment를 배포한다. 딱히 더 불편하지는 않다.

#bash

kubectl run jupyter-hub-ldap -n aihub --image=[만든 이미지 이름] --port 8000
kubectl expose deployment jupyter-hub-ldap -n aihub --type=NodePort
반응형