비밀 정보는 무엇일까?
Django 프로젝트를 생성하면 50자의 랜덤 문자로 SECRET_KEY가 생성되는데, 이것이 외부에 공개되면 Django의 보안 기능이 상실된다. 또한, 연결할 DB의 계정 비밀번호가 공개될 경우 외부인이 민감한 데이터에 접근이 가능해지고 이는 치명적인 보안위협이 될 수 있다.
어떻게 비밀 정보를 보호할까?
배포환경에 따라 구체적인 방법은 다르지만 가장 기본은 보호할 정보를 버전관리시스템에서 제외하는 것이다. 어떠한 경우에도 비밀정보(설정 값)가 github의 공개 저장소에 올라가면 안된다.
Two Scoops of Django 책에 따르면 환경 변수를 이용할 수 없는 경우에 비밀파일로 관리를 해야한다고 한다. 특히 Apache를 웹서버로 이용하는 경우라고 하는데 이부분에 대해선 나중에 웹서버를 다루면서 자세히 알아 볼 예정이다.
1차 프로젝트까지 아래의 방법으로 관리했다.
프로젝트 루트 디렉토리에 my_settings.py 를 만든다.
SECRET_KEY와 DB 계정 정보 등 공개하지 않을 설정정보를 변수에 담아 입력한다.
settings.py에 my_settings.py를 import해서 필요한 정보가 담긴 변수를 가져온다.
my_settings.py 를 gitignore에 추가한다.
환경변수란 프로세스가 OS 상에서 동작하는 방식에 영향을 미치는 값이다. 응용소프트웨어가 동작할때 참조하기 위한 설정이 기록된다. 환경 변수에 비밀 키를 보관하면 프로젝트를 그대로 github에 공개할 수 있다.
로컬 혹은 배포 환경이 어떤 os와 shell인지, 환경 변수가 어떻게 작동하는 지에 대한 이해가 필요하다.
2차 프로젝트는 아래의 방법으로 관리했다.
zsh을 사용 중이어서 .zshrc 파일에 환경 변수를 세팅한다.
$ 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'
# 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']
}
}
.bashrc
와 .zshrc
모두 설정값을 저장해둔 상태이다. 그리고 DB의 HOST를 로컬호스트가 아니라 RDS의 엔드포인트로 변경했다. 현재 EC2 서버에서 환경 변수를 bash에서 읽어오는지 zsh에서 읽어오는지는 테스트를 통해 알아볼 예정이다.docker run <이미지>
-> -e 옵션으로 환경변수를 모두 적어서 컨테이너를 실행할 수 있다.
Dockerfile을 만들면서 환경변수에 대한 설정을 지정할 수 있다?