쿼카러버의 기술 블로그

주피터 서버 구축하기 (2/3) [SSL Certificate로 주피터 서버 보안 강화하기] (Window Server) 본문

[Infra & Server]/주피터 서버

주피터 서버 구축하기 (2/3) [SSL Certificate로 주피터 서버 보안 강화하기] (Window Server)

quokkalover 2019. 1. 27. 23:39

1) 주피터 서버를 아직 설치하지 않았다면 : https://etloveguitar.tistory.com/5

2) 제가 설치한 방식으로 똑같이 따라오고 싶으시다면 위 링크를 클릭하시면 됩니다.

 

 

SSL Encrypted Communication

앞 글에서 주피터 서버를 구현하고, Hashed Password를 사용하는 보안 방식을 채택하는데 까지 진행했다.

 

본 글에서는 SSL 인증서를 활용해서 보안 수준을 높이는 방법에 대해서 알아보겠다.

Hashed Password'sha1:67c9e60bb8b6:9ffede0825894254b2e042ea597d771089e11aed’이 친구는

우리는 못알아본다. 이렇게 알아볼 수 없게 만들어주는게 ‘SSL’(Secure Socket Layer)이다.

 

빨리 그냥 보안 강화만하고 SSL이 무엇인지는 별로 관심이 없는 분은 아래 노란 상자는 스킵해도 좋당

 

SSL 설명
 
SSL을 쉽게 설명하자면, 서버와 클라이언트가 서로 신뢰할 수 있다는 사이임을 인증해주는 도구라고
생각하면 되겠다. 아무나 서버에 접근할 수 있도록 하면 안되니까..
 
과정을 간략히 설명하자면 다음과 같다.
 
1) 클라이언트가 SSL로 암호화된 페이지를 요청한다.
2) 동시에 Public key를 인증서와 함께 전송한다.
3) 서버는 인증서가 내가 허용한 대상인지 확인하고
4) 같이 딸려온 암호화된 키를 확인하고 접근을 허용해준다.
 
더 복잡하지만 위와 같은 과정을 거친다고 생각하면 되겠다.
 
Public Key / Private Key?
 
Private Key / Public Key를 이용한 암호화는 하나의 키로 암호화하고, 나머지 다른 하나로는
복호화할 수 있도록 되어있다. * 복호화는 암호화된걸 다시 원상태로 돌리는 것을 의미
 
Private Key는 안전한 장소에 자기만 알 수 있도록 보관하고,
Public Key는 모든 사람들에게 퍼뜨린다. 그러면, 그 사람들은 나한테 무언갈 보낼 때 암호화된걸 보낼 수 있고, Private Key로 복호화해서 풀 수 있다.
 
문제는, 해커가 내 Public Key를 가지게되면 문제가 발생하는데,
그래서 대칭키(Thy Symmetric key)와 같은 대안이 존재한다.
 
인증서?
 
위에서 말하는 인증서는, 내가 누구인지, e-mail,용도 등 다양한 정보를 작성한 인증서를 말하며,
서버는 자신에게 등록된 인증서를 가진 사람을 신뢰하고, 접근을 허용해준다.
매번 접속할 때마다 정보를 입력하게 하는 것 보다는 이 인증서를 가지고 있으면 접근을 허용해주는 것이다.


 

 

 

! SSL 인증서를 만들어보자

 

아래 문구를 입력하면 key와 인증서 데이터의 내용이 적힌 365일간 유효한 인증서가 생성이 된다.

 
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mykey.key -out mycert.pem
 

 

cmd에 이를 써보자

 

 

이런! 에러가 발생했다.

 

위 에러는 openssl.cnf라고 ssl을 실행시켜주는 친구같은데, 이 친구를 못찾아서 그렇다.

우분투에서는 이런 에러가 없었는데 윈도우에서는 계속 발생한다.

해결법을 세 네시간동안 찾다가 결국 찾아냈다!!

 

일단, 내 아나콘다의

 

openssl.cnf라는 친구가 어디있는지 파일탐색기로 찾아내서,

보통, users 폴더에서 찾아보면 나오더라..

 
set OPENSSL_CONF=C:\OpenSSL-Win64\bin\openssl.cnf
 

 

위 내용을 cmd에 입력해주고

다시 생성하라고 했더니

 

 
 

성공!!

이제 내 인증서에 들어갈 내용을 잘 입력해주고 만들어준다.

 

만들어준 인증서를 jupyter_notebook_config.py에 입력

 

지금 내가 생성 요청을 실행한 경로가 내 사용자 경로(C:\Users\Steph)니까

내 사용자 경로에 mykey.keymycert.pem이 생긴다.

이를 내가 원하는 경로에 옮겨주고

 

jupyter_notebook_config.py에 가서

아래와 같이 내가 지정한 경로를 추가해준다.

 

어차피 주석되어있으니 제일 밑에 추가해주자.

 
c.NotebookApp.certfile = u'/absolute/path/to/your/certificate/mycert.pem'
c.NotebookApp.keyfile = u'/absolute/path/to/your/certificate/mykey.key'
 

 

이제 필요한 설정은 거의 끝이 났다.

 

이제는 여기에 접근하기 위한 ip, 그리고 port를 정해주어야 한다.

 

c.NotebookApp.ip = '*'
c.NotebookApp.password = u'sha1:bcd259ccf...<hashed password적어주고>'
c.NotebookApp.open_browser = False
 
# It is a good idea to set a known, fixed port for server access
c.NotebookApp.port = <내가 원하는 포트 번호, 근데 열어주면 방화벽에서도 풀어주어야 함>
 

 

위 코드 설명 :

1) c.NotebookApp.open_browser = False

요거는 주피터 노트북 실행할 때, 자동으로 브라우저 켜지는거 못하게 하는 것

2) c.NotebookApp.port = <내가 원하는 포트 번호, 근데 열어주면 방화벽에서도 풀어주어야 함>

요 포트도 열어주면 방화벽에서 인바운드 규칙에 추가해주어야 하는데, 이부분은 별도의

글에서 다루겠다.

 

만약 SSL 인증서를 통한 보안 장치를 마련하지 않고, 그냥 SSl Hashed 비밀번호만 쓰고 싶다면

 
#c.NotebookApp.certfile = u'/absolute/path/to/your/certificate/mycert.pem'
#c.NotebookApp.keyfile = u'/absolute/path/to/your/certificate/mykey.key'
 
 

이처럼 위 부분을 주석처리 하고 사용하면된다.

또한 한가지 주의사항은 SSL 인증서를 사용하면 server에 접근할 때 http://말고 https://로 접근해야 한다.

 

본 글은

https://jupyter-notebook.readthedocs.io/en/latest/public_server.html 를 인용한 글입니다.

Comments