TIL 40. Django - OS 환경변수로 비밀 정보 관리하기

문승준·2021년 10월 31일
0

Django

목록 보기
6/7
post-thumbnail

비밀 정보 관리 (SECRET_KEY, DB 정보 등)

비밀 정보는 무엇일까?
Django 프로젝트를 생성하면 50자의 랜덤 문자로 SECRET_KEY가 생성되는데, 이것이 외부에 공개되면 Django의 보안 기능이 상실된다. 또한, 연결할 DB의 계정 비밀번호가 공개될 경우 외부인이 민감한 데이터에 접근이 가능해지고 이는 치명적인 보안위협이 될 수 있다.

어떻게 비밀 정보를 보호할까?
배포환경에 따라 구체적인 방법은 다르지만 가장 기본은 보호할 정보를 버전관리시스템에서 제외하는 것이다. 어떠한 경우에도 비밀정보(설정 값)가 github의 공개 저장소에 올라가면 안된다.


비밀파일로 관리

  • Two Scoops of Django 책에 따르면 환경 변수를 이용할 수 없는 경우에 비밀파일로 관리를 해야한다고 한다. 특히 Apache를 웹서버로 이용하는 경우라고 하는데 이부분에 대해선 나중에 웹서버를 다루면서 자세히 알아 볼 예정이다.

  • 1차 프로젝트까지 아래의 방법으로 관리했다.

  1. 프로젝트 루트 디렉토리에 my_settings.py 를 만든다.

  2. SECRET_KEY와 DB 계정 정보 등 공개하지 않을 설정정보를 변수에 담아 입력한다.

  3. settings.py에 my_settings.py를 import해서 필요한 정보가 담긴 변수를 가져온다.

  4. my_settings.py 를 gitignore에 추가한다.

  • 위와 동일한 원리로 JSON 파일을 작성하는 방법도 있다. 또한, 비밀 변수를 가져오지 못할 경우에 대한 예외처리를 해놓을 수도 있다.

환경변수로 관리

  • 환경변수란 프로세스가 OS 상에서 동작하는 방식에 영향을 미치는 값이다. 응용소프트웨어가 동작할때 참조하기 위한 설정이 기록된다. 환경 변수에 비밀 키를 보관하면 프로젝트를 그대로 github에 공개할 수 있다.

  • 로컬 혹은 배포 환경이 어떤 os와 shell인지, 환경 변수가 어떻게 작동하는 지에 대한 이해가 필요하다.

  • 2차 프로젝트는 아래의 방법으로 관리했다.

  1. zsh을 사용 중이어서 .zshrc 파일에 환경 변수를 세팅한다.

  2. $ vi ~/.zshrc로 파일을 열어 아래 설정을 추가하고, $ zsh 명령어로 리셋 적용한다.

export NOSLEEPPLACE_SECRET_KEY='django-insecure-dasflk aji3foasf --- 시크릿 키 내용'
export DB_NAME='project'
export DB_USER='root'
export DB_PASSWORD='mypassword'
export DB_HOST='localhost'
export PORT='3306'
  1. 프로젝트 settings.py와 연결하기
# settings.py
import os

SECRET_KEY = os.environ['NOSLEEPPLACE_SECRET_KEY']

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME' : os.environ['DB_NAME'],
        'USER' : os.environ['DB_USER'],
        'PASSWORD' : os.environ['DB_PASSWORD'],
        'HOST' : os.environ['DB_HOST'],
        "PORT" : os.environ['PORT']
    }
}
  • 위와 같이 로컬 shell에 비밀 정보를 저장하고, django에서는 그것을 불러와 사용하게 할 수 있다.

배포 상황에서 환경변수 설정 시도하기

EC2 우분투 서버

  • EC2와 RDS을 이용해 배포할때 os 환경 변수 설정으로 정상 작동하는 것을 확인했다. EC2 우분투 서버에 기본 shell을 bash에서 zsh로 변경했는데 .bashrc.zshrc 모두 설정값을 저장해둔 상태이다. 그리고 DB의 HOST를 로컬호스트가 아니라 RDS의 엔드포인트로 변경했다. 현재 EC2 서버에서 환경 변수를 bash에서 읽어오는지 zsh에서 읽어오는지는 테스트를 통해 알아볼 예정이다.

도커로 배포하는 경우?

  • 로컬에서 Dockerfile을 만들어 이미지를 빌드하고 hub를 통해 EC2 서버로 가져온 다음 실행(run)을 해보았다. Dockerfile을 만들때부터 문제가 많은 과정이었지만.. 어쨌든
  1. docker run <이미지> -> -e 옵션으로 환경변수를 모두 적어서 컨테이너를 실행할 수 있다.

  2. Dockerfile을 만들면서 환경변수에 대한 설정을 지정할 수 있다?

  • EC2 서버의 os위에 컨테이너를 실행하는거니까 해당 os에 환경변수를 저장하면 된다는 단순한 생각을 했었다.
    그럼 여러 컨테이너를 실행하는 경우 누가 어떤 변수를 참조할지 어떻게 작성할까? rc 파일이 지저분해질텐데?
    컨테이너를 실행할때 환경변수를 입력하는 것이라면 수정은 어떻게 하나? 서버 무중단이 가능할까?
    컨테이너의 작동 원리와 도커에 대해 더 알아보면서 다양한 시도를 할 예정이다.

profile
개발자가 될 팔자

0개의 댓글