django의 secret_key 분리해서 관리하기

django의 secret_key 분리해서 관리하기

장고의 secret_key는 보안에 있어서 매우 중요한 역할을 한다. 해쉬 값을 만들때 사용되는 등 장고의 전반적인 보안과 밀접한 관계를 가지고 있기때문에 외부에 노출이 되어서는 안된다.

50자의 랜덤한 문자로 이루어져 있고, 만약 오픈 해놓은 프로젝트의 비밀 키가 노출되었다는 생각이 들면 바꾸는 것이 좋을 것 같다.

여기를 통해 50자의 새로운 비밀키를 생성할 수 있다.

비밀 키 관리방법 두 가지

비밀 키를 관리하는 방법에는 보통 두 가지가 있다.

  1. 환경 변수 패턴: secret_key를 환경 변수로 관리
  2. 비밀 파일 패턴: secret_key를 별도 파일로 관리

환경 변수 패턴

프로세스가 동적으로 참조하는 환경 변수에 비밀 키를 등록하여 직접적인 코드로부터 분리하는 방법이다.

방법은 꽤 단순하다. 사용하는 쉘의 설정파일에 등록해주면 된다.

1
2
# vi ~/.zshrc
export DJANGO_SECRET_KEY='비밀 키 입력'

터미널 재실행 또는 source를 통해 쉘 설정파일을 반영한다. 그리고 제대로 환경 변수가 등록 되었는지 확인하기 위해 출력해보자.

1
2
3
4
source ~/.zshrc

# 값 출력해보기
echo $DJANGO_SECRET_KEY

echo의 결과로 비밀 키가 출력된다면 환경 변수로 저장이 잘 된것이다. 이렇게 저장한 환경 변수를 장고의 settings.py의 SECRET_KEY의 값으로 지정해주면 된다. os 모듈을 임포트하고 environ 함수를 통해 접근할 수 있다.

1
2
3
4
# vi 장고의 settings.py
import os

SECRET_KEY = os.environ["DJANGO_SECRET_KEY"]

또는 예외 처리를 할 수 있도록 함수로 만들어서 적용하는 방법도 좋다.

1
2
3
4
5
6
7
8
9
10
11
12
# vi settings.py
import os
from django.core.exceptions import ImproperlyConfigured

def get_env_variable(key):
try:
return os.environ[key]
except KeyError:
error_msg = f"Set the {key} environment variable"
raise ImproperlyConfigured(error_msg)

SECRET_KEY = get_env_variable("DJANGO_SECRET_KEY")

runserver에 문제가 없다면 성공한 것이다.

개인적으로는 환경 변수를 통해서 비밀 키값을 관리하고 있었는데 mailgun 서비스를 사용하기 위해 설정하던 중 환경 변수로 등록한 값들을 참조하지 못하는 일이 발생했다. 아파치를 사용하고 있지는 않았지만 간혹 이런 경우가 발생한다고 해서 두 번째 방법인 비밀 파일 패턴 방식으로 관리 방법을 바꾸었다.

비밀 파일 패턴

json / xml / yaml과 같은 파일에 외부에 노출되어서는 안되는 값을 분리하고 settings.py에서 참조할 수 있도록 하는 관리 방법이다.

이름이 secrets인 json 파일을 만들어서 key: value 방식으로 장고에서 사용할 세팅 값들을 저장하면 된다.

1
2
3
4
5
6
# vi secrets.json

{
"DJANGO_SECRET_KEY": "비밀 키 값 입력",
"EMAIL_HOST_PASSWORD": "비밀번호"
}

첫 번째 방법과 마찬가지로 함수를 하나 만들어서 참조할 수 있도록 해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import os
import json
from django.core.exceptions import ImproperlyConfigured

# 프로젝트 루트로부터 secrets.json 파일 경로 찾기
secret_file = os.path.join(BASE_DIR, 'secrets.json')

with open(secret_file) as f:
secrets = json.loads(f.read())

def get_env_variable(key):
try:
return secrets[key]
except KeyError:
error_msg = f"Set the {key} environment variable"
raise ImproperlyConfigured(error_msg)

SECRET_KEY = get_env_variable("DJANGO_SECRET_KEY")

물론 git과 같은 버전관리시스템이 추적하면 안되기 때문에 secrets.json 파일은 .gitignore에 등록해야 한다!!


[참고]
책 - Two Scoops of Django

https://wayhome25.github.io/django/2017/07/11/django-settings-secret-key

Share

우분투에 RabbitMQ 설치하기

우분투에 RabbitMQ 설치하기

우분투 16.04 버전에 RabbitMQ 설치하는 법을 정리해보자.

다른 일반적인 소프트웨어 처럼 apt를 통해서 바로 설치할 수 있지만, 최신 버전의 RabbitMQ를 설치할 수 없다. 때문에 최신 버전의 RabbitMQ를 이용하려면 아래의 두 가지 방법을 통해 설치하는 것이 추천된다.

  • apt repository on Package Cloud or Bintray 사용하기(공식문서에서 추천하는 방법)
  • dpgk -i를 통해 수동으로 설치

첫 번째 방법인 apt repo on Bintray를 통해 설치하는 법을 정리하려고 하고 Erlang/OTP가 설치되어 있어야 한다.

Install Erlang from an Apt Repostory on Bintray

참고: Erlang 설치하기 - 여기

아마 Erlang을 설치했다면 /etc/apt/sources.list.d/bintray.rabbitmq.list 파일을 만들고 RabbitMQ 팀에서 관리하는 apt repo를 추가했을 것이다. 마찬가지로 같은 파일에 RabbitMQ를 위한 저장소를 추가해야 한다.

1
2
3
4
5
# vi in /etc/apt/sources.list.d/bintray.rabbitmq.list
# echo "deb https://dl.bintray.com/rabbitmq/debian {distribution} main" | sudo tee /etc/apt/sources.list.d/bintray.rabbitmq.list
# {distribution}에 각자의 환경에 맞는 우분투 버전명을 적어준다

echo "deb https://dl.bintray.com/rabbitmq/debian xenial main" | sudo tee /etc/apt/sources.list.d/bintray.rabbitmq.list

추가된 저장소를 반영시키기 위해 apt 업데이트를 진행한 후 RabbitMQ를 설치하면 된다.

1
2
sudo apt-get update -y
sudo apt-get install -y rabbitmq-server

RabbitMQ 실행에 대한 간단한 설명

apt를 통해 설치를 진행했다면 관련 스크립트 및 서비스 또한 우분투 시스템에 자동으로 반영이 된다. 따라서 systemctl 커맨드를 통해 다른 소프트웨어처럼 사용할 수 있다.

변경하지 않았다면 기본적인 포트번호는 5672를 사용한다. 그리고 기본 계정인 guest를 만들어주며 비밀번호도 guest이다. 기본적으로 제공해주는 guest 유저는 RabbitMQ가 localhost로서 동작할때만 권한을 가지게 되어 사용할 수 있다. RabbitMQ를 단독으로 사용하려면 새로운 유저를 만들고 vhost까지 등록해주어야 사용할 수 있다!!

Share

우분투에 Erlang 설치하기

우분투에 Erlang 설치하기

우분투 16.04

우분투 16.04 버전에 Erlang 설치하는 과정을 정리해보자. Erlang을 사용하진 않지만 RabbitMQ가 erlang으로 되어있기 때문에 필수적으로 설치를 선행해야한다.

Install Erlang from an Apt Repostory on Bintray

기존의 우분투 apt repo가 제공하는 Erlang/OTP은 최신 버전을 제공하지 않는 경향이 많기 때문에, RabbitMQ 팀이 지원하는 apt repo를 이용하여 설치하는 것을 추천한다.

아래의 리눅스 배포판에서 사용할 수 있다.

  • Ubuntu 18.04 (Bionic)
  • Ubuntu 16.04 (Xenial)
  • Debian Buster
  • Debian Stretch

또한 이 apt repo는 아래의 Erlang 버전을 제공한다.

  • 22.x
  • 21.x
  • 20.3.x
  • 19.3.x
  • master (23.x)
  • R16B03 (16.x)

RabbitMQ 팀이 제공하는 apt repo를 사용하는 방법은 크게 아래의 네 가지 절차를 거친 후에 사용할 수 있다.

  1. repository signing key를 임포트 함으로써 설치하는동안 apt가 package signatures를 확인한다
  2. 새로운 repo를 위한 source list 추가
  3. 패키지 메타데이터 업데이트
  4. Erlang 설치

본격적인 설치

필요하다면 sudo 권한을 이용해서 설치를 진행하자

현재의 apt repo를 업데이트 한다.

1
sudo apt-get update -y

설치에 필요한 소프트웨어를 설치한다.

1
sudo apt-get install curl gnupg -y

RabbitMQ Signing Key를 설치한다

1
curl -fsSL https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc | sudo apt-key add -

apt HTTPS transport를 설치한다

1
sudo apt-get install apt-transport-https

Bintray repositories를 추가한다

1
2
3
4
5
6
7
sudo vi /etc/apt/sources.list.d/bintray.rabbitmq.list

# bintray.rabbitmq.list 파일 안에 추가
# 사용중인 리눅스 배포판과 설치하려는 Erlang 버전을 뒤에 적는다
# deb https://dl.bintray.com/rabbitmq-erlang/debian $distribution $component
# deb https://dl.bintray.com/rabbitmq-erlang/debian xenial erlang-22.x
deb https://dl.bintray.com/rabbitmq-erlang/debian xenial erlang # 최신의 안정화 버전을 설치한다

참고로 $distribution과 $component는 자신의 환경에 맞게 설정하면 된다.

  • bionic for Ubuntu 18.04
  • xenial for Ubuntu 16.04
  • buster for Debian Buster
  • stretch for Debian Stretch

추가된 apt repo를 반영하기 위해 apt update

1
sudo apt update -y

Erlang을 설치한다

1
2
3
4
5
6
7
8
sudo apt-get install -y erlang-base \
erlang-asn1 erlang-crypto erlang-eldap erlang-ftp erlang-inets \
erlang-mnesia erlang-os-mon erlang-parsetools erlang-public-key \
erlang-runtime-tools erlang-snmp erlang-ssl \
erlang-syntax-tools erlang-tftp erlang-tools erlang-xmerl

# rabbitmq-server와 의존성 패키지 설치
sudo apt-get install rabbitmq-server -y --fix-missing

에러없이 여기까지 왔다면 설치는 무사히 끝난다.


[참고]
https://www.rabbitmq.com/install-debian.html#apt-bintray-erlang

Share