본문 바로가기
  • Survival Plan
개발 이야기/Python

[파이썬] 원격 주피터 노트북 만들기 - AWS에서 나만의 Remote Jupyter Notebook을 구동해 보자.

by IT/머신러닝 엔지니어의 독서/경제/육아 공부 리치윈드 - windFlex 2020. 6. 4.

보다 안정적인 방법으로는, Jupyter Notebook 또는 JupyterHub 등에 Oauth2 인증을 사용하는 방법이 있다. 그러나, 보안에 익숙하지 않은 사용자는 그 개념과 설정 자체가 어려울 수 있어서 간단한 방법을 소개한다. 

 

엄밀히 말하면 이 방법은 보안상으로 체력이 강하는 것은 아니다. 다만, 잠깐이나마 사용할 수 있는 방법을 제시한다. Jupyter Notebook을 외부에서 접속하여 서버로써 사용하기 위하여, 이번 포스팅에서 제시하는 방법은, 1) 패스워드 (sha 기반) 을 설정, 2) 네트워크 접근 제한 하는 방법이다. 이 방법을 소개하는 이유는 보안 전문가가 아니더라도 가장 쉽게 사용할 수 있는 방법이기 때문이다. 그러나, 오래 지속적으로 사용할 만한 방법은 아니다. 기본적으로, 패스워드를 무작위 대입하는 Bruteforece 공격에 대한 대응법이 적용되어 있지 않기 때문에 시간이 충분하면, 언제든 뚫릴 수 있다. 이를 위한 차선책으로 네트워크 접근통제를 해 두긴 했지만, 역시나 네트워크를 대역으로 열거나, 귀찮아서 광범위 대역을 열어두게 되면 크리티컬한 보안위협으로 발전될 수 있다. 

sha1 외에도 sha256 등 다른 해쉬도 사용할 수 있다. 
keyfile 형태의 인증방법도 존재한다. 

 

앞서 거론했지만, 장기적으로 볼 때 사용하기 좋은 방법은, Oauth2 인증 방법을 사용하는 것이다. 그리고, 필자가 자주 사용하는 방법은 SSH 터널링을 사용하는 방법이다. 각 방법은 추가적으로 시간을 마련하여 포스팅 예정이다. 

 

또한, 최근에는 굳이 자기 자신의 Jupyter Notebook Server를 사용하지 않고, 클라우드 Jupyter를 사용하는 방법 또한 다양하게 생성이 되었으므로, 기술적 참고 사항으로 살펴 보길 바란다. 

 


관련글

 

1. Jupyter Notebook 설정하기

 

로컬 PC가 아닌 외부에서 Jupyter Notebook을 접근하기 위해서는 첫번째로, jupyter_notebook_config.py 를 수정해야 한다.

Jupyter_notebook_config.py 파일은 Home Directory 아래 ".jupyter/jupyter_notebook_config.py"형태로 존재한다. 만약 해당 컨피그파일이 존재하지 않는다면, 아래와 같이 새로 생성할 수 있다. 

 

jupyter notebook --generate-config ~/.jupyter/jupyter_notebook_config.py

다음 과정 부터는 jupyter_notebook_config.py 를 열어 편집하여 진행 한다. 

 

2. Jupyter Notebook 패스워드 설정하기

 

[ 패스워드 설정 ]

 

Jupyter notebook은 코딩과 cli 명령이 가능하므로, 로그인 및 인증절차가 매우 중요하다. 따라서, Jupyter notebook의 설정은 가장 먼저 패스워드를 생성하고, 적용하는것 부터 진행해야 한다. jupyter_notebook_config.py 파일에 해당 내용을 설정해야 한다.  그러나, 그 전에 패스워드를 그대로 사용하지 않고, Hash (SHA1)을 사용하므로 패스워드 해쉬부터 확보하자. 

패스워드를 평문으로 저장하여 사용하면 위험하기 때문에, 패스워드의 일치 여부만 확인하는 방식을 사용한다.

 

앞서 거론한것과 같이, jupyter notebook의 패스워드 매핑은 config파일에서 진행하며, config파일에 입력하는 정보는 패스워드의 해쉬(Sha1) 값을 입력한다. (salt 포함) jupyter notebook에서 사용하는 salt로직이 포함되어 있으므로,다른 sha1 checksum 보다 ipython checksum 로직을 사용하도록 한다. 

 

[ SHA1 해쉬 확보 ]

따라서, ipython 또는 jupyter notebook에서 다음 명령어를 실행 한다. 

ipython 또는 jupyter notebook에서 실행하면된다. 일반 python에서는 notebook.auth 패키지 설치가 필요하다.
from notebook.auth import passwd
passwd()

passwd() 명령어를 실행하면, 다음과 같이 패스워드 입력을 요구한다. 여기서는 예제로 "test123"을 입력하였다. 

Enter password: test123
Verify password: test123

'sha1:5aaeec928577:f4ad5839144ff528a5ef60257ba697743366627e'

사용할 PW 를 입력하면 암호화된 값이 나온다.

ex) 'sha1:5aaeec928577:f4ad5839144ff528a5ef60257ba697743366627e'

bash/zsh에도 기본적으로 sha1 체크썸을 구하는 명령어가 있다. 그러나, jupyter notebook의 sha1은 salt가 포함되어 있어서 다른 결과가 나온다. 

 

[ Config 파일 수정 ]

sha1 해쉬값을 복사 한후,  jupyter_notebook_config.py을 열어서 다음과 같은 코드를 추가한다. 

# Password to use for web authentication
c = get_config()
c.NotebookApp.password = u'sha1:5aaeec928577:f4ad5839144ff528a5ef60257ba697743366627e'

자. 이제 패스워드 설정은 세팅이 되었다. 패스워드 세팅이 제대로 동작하는지 로컬에서 jupyter notebook을 실행해 보자. 

jupyter notebook 패스워드 설정 화면. 초기화면 (좌), 패스워드 실패 (invalid Credentials)

 

 

3. Jupyter Notebook 외부접속 설정하기

 


3.외부접속을 위한 IP / PORT 설정

Jupyter notebook 의 위험성을 앞에서 설명하였다. jupyter notebook 이 인가되지 않은 사용자에게 로그인을 허용하면, 해당 단말/서버는 장악되었다고 봐도 무방할 것이다. 따라서, 패스워드 외에도 네트워크 차원에서 접근통제를 하는 것을 기본으로 하고 있다. (로컬PC에서만 접속하도록 허용)

 

현재 접속하고 있는 PC/단말의 로컬 IP를 확인해 보자.

$ ifconfig

or

ifconfig | grep inet | grep -v inet6 | grep -v 127.0.0.1

or

ifconfig | grep inet | grep -v inet6 | grep -v 127.0.0.1 | awk '{print $2}'

or

https://findip.kr/ 에서 공인 IP를 확인한다. 

 

위에 결과에서 addr: 뒤의 값을 복사하여 jupyter_notebook_config.py 에 붙여 넣는다.

 

# The IP address the notebook server will listen on.
# c.NotebookApp.ip = 'localhost'
c.NotebookApp.ip = '11.111.111.131'
c.NotebookApp.port_retries = 1111 
위의 예에서, 접속하는 공인IP는 "11.111.111.131" 처리한 예이다.

 

 

4.기타 설정 - 백그라운드 실행 : 서버 실행할 때 브라우져 실행 안되도록 

 

 jupyter notebook 실행시 브라우져에서 실행 되지 않도록 설정

현재 Jupyter notebook을 원격 프로세스 (로컬에서 접속할 지라도)로 구동하고 있기 때문에, 서비스 형태로 실행되어야 한다. 따라서, 서비스로 실행되어 백그라운드로 구동되어야 하므로, 해당 프로세스가 바로 브라우저를 실행할 필요는 없다.

c.NotebookApp.open_browser = False

 jupyter notebook 디폴트 디렉토리 설정 ( full path 로 설정 )

c.NotebookApp.notebook_dir = u'/dev/dataAnalysis/'

 

5.AWS EC2에서 Jupyter notebook 구동하고, 외부에서 접속하기

 

만약, AWS EC2에서 서버에서 구동하거나, 혹은 Docker container로 구동을 한다면, 다음과 같이 실행 해 둘 수 있다. 

jupyter notebook&
http://ec2-11-11-111-111.ap-northeast-2.compute.amazonaws.com:1111

 여기까지 실행 했다면, 웹브라우저로 AWS 공인 IP 혹은, domain을 입력하여 접속하여 보자. Jupyter notebook 인증화면이 출력되면 성공이다. 이후, 2단계에서 설정한 패스워드를 입력하고 로그인 해 보자. 

 

이제 어디서든지 내가 작업하던 Jupyter Notebook에 접속하여 동일한 성능, 동일한 업무환경으로 일할 수 있다. Cloud IDE처럼 제한 받지 않고 나만의 환경을 얼마든지 활용할 수 있다..

 

오예~~~~

그런데, 그 서버가 Cloud 제공하는 것보다 성능이 낮으면,,?

ㅜ_ㅜ;;;;

댓글4