ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • django secret key 안전하게 저장하기
    Python/django 2016. 11. 14. 10:27

    먼저 이번 포스트는 Django SECRET_KEY에만 해당하지 않는다는 점을 명시한다.

    본 포스트에서 소개하는 방법은 서버에서 지정되는, 그리고 외부로 부터 숨김 필요가 있는 모든 유니크한 키에 대해 적용할 수 있다.


    Django로 프로젝트를 만들고 나면 settings.py에  SECRET_KEY라는 문자열 상수를 저장하는 변수가 있다

    이 항목에 대한 자세한 내용은 https://docs.djangoproject.com/en/1.10/ref/settings/#std:setting-SECRET_KEY 여기를 참고하시고

    뭐 내용을 긁어오자면 아래와 같다


    A secret key for a particular Django installation. This is used to provide cryptographic signing, and should be set to a unique, unpredictable value.

    The secret key is used for:

    • All sessions if you are using any other session backend than django.contrib.sessions.backends.cache, or are using the default get_session_auth_hash().
    • All messages if you are using CookieStorage or FallbackStorage.
    • All password_reset() tokens.
    • Any usage of cryptographic signing, unless a different key is provided.


    암호화에 사용되는 유니크하고 예측 불가능한(난수로 생성된) 값이며, 그 사용 용도는 세션, 메시지, 패스워드, 별도의 키값이 정의되지 않은 모든 암호화 과정에서 사용된다고 한다. (뭐 단어나 그런건 다를 수 있지만 대충 내용은 비슷할테니 그냥 넘어가자)


    문제는 이 코드가 settings.py에 박혀있어서 Github과 같은 git remote repository에 업로드 할 때 그대로 올려버리면 키값이 유출된다는 문제가 있다. private repo면 상관없겠지만..


    일단 유출되었다면 아래 Django Secretkey Generator로 새로 생성해서 다시 설정하는 것을 권장한다

    http://superclass.io/tools/django-secret-key-generator.html


    그럼 이 문제는 어떻게 해결할 수 있을까?

    크게 방법은 두가지이다.


    1. 환경변수로 설정

    2. 별도 파일을 만들어 관리


    1. 환경변수로 설정

    말 그대로 서버의 환경변수에 저장하고 서버 실행할 때 읽어온 환경 변수로 SECRET_KEY를 초기화해주는 것이다.

    Windows, Unix 등 대부분(사실상 우리가 사용하는 거의 모든 OS)의 환경에서는 환경변수를 지원한다.

    Ubuntu와 같은 Linux 계열(Unix도 같은 방식인지는 모르겠다. 확인 필요)에서는 아래와 같은 방법으로 환경변수 설정이 가능하다.


    export ENV_KEY=ENV_VALUE


    문제는 재부팅하면 적용되지 않는다.

    이 문제는 /etc/bash.bashrc에 추가해주면 해결된다.

    환경변수 설정과 관련된 자세한 내용은 http://ngee.tistory.com/488를 참고하면 되겠다.


    python에서는 환경변수를 불러올 수 있는 기능을 제공한다.


    파이썬 환경에서 환경변수를 읽어오는 방법은 http://ohgyun.com/697를 참고하자

    이제 settings.py에서

    로 설정하면 된다.


    os.getenv()는 해당 값이 없을경우 None을 리턴하므로 django docs 설명에 따르면 서버가 실행되지 않고 에러가 뜰 것이다.

    안뜨면 SECRET_KEY가 None일때 raise Exception 해주자.



    2. 별도 파일을 만들어 관리

    다른 방법으로는 별도 파일을 만들어서 따로 관리하는 것이다.

    정말 간단한 방법이므로 따로 코드를 적거나 하지는 않겠다.

    로컬 어느곳이든 파일을 만든 후 해당 파일에 SECRET_KEY를 적고 저장을 한 후 settings.py에서 파일입출력으로 값을 설정해주면 된다.


    이 방법에서 중요한것은 .gitignore 파일에 추가하는 것이다.

    우리는 git remote repo에서 key의 유출을 막기 위해 이러한 방법을 사용하는 것이므로 파일을 업로드 대상에서 제외해버리면 문제가 해결된다.

    댓글

Designed by Tistory.