Django : python으로 웹서비스 개발하기(10) - 민감정보 숨기기

harry jang·2023년 7월 23일
0

Django

목록 보기
10/12
post-thumbnail

오늘은 개발을 계속 진행하기 전에 챙겨야 할 것에 대해 알아보겠습니다.

따라오면서 자세히 보셨으면 아시겠지만, Database의 연결정보와 SecretKey 정보와 DB 연결정보 등의 보안이 필요한 민감성 정보들은 대부분 setting.py에 등록해서 사용하고 있습니다. 그렇기 때문에 이 파일을 그대로 github 등에 올리는 것은 보안위협에 그대로 노출되는 매우 어처구니 없는 상황이 발생하게 됩니다.

그래서 이번에는 settings의 민감성 정보들을 어떻게 숨기고 별도로 관리하는지에 대해 알아봅시다.

시크릿 파일 생성

먼저 별도로 관리할 시크릿 파일을 하나 만듭니다. 저는 프로젝트 디렉토리 최상단 manage.py와 같은 위치에 .secrets.json 파일을 하나 생성했습니다.

{
    "secretKey" : "iam-secret-key-for-django",

    "databases":{
        "common": {
            "username": "username123",
            "password": "password123",
            "host": "127.0.0.1",
            "port": "3306"
        },
    }
}

이 json 파일을 읽어올 수 있도록 /test_project/settings.py에 다음 코드를 추가합니다.

import os, json

secret_file = os.path.join(BASE_DIR, '.secrets.json')

# secrets.json 파일을 읽은 후 secrets 변수에 저장
with open(secret_file) as f:
    secrets = json.loads(f.read())
    
# get_secret 함수를 생성하여 호출 시 해당 키 값 리턴
def get_secret(*args, secrets=secrets):
    if len(args) == 0:
        raise ValueError("At least one JSON string is required.")
    
    try:
        result = secrets
        for key in args[0:]:
            result = result[key]
        return result
    except KeyError as e:
        raise ValueError(f"Key '{str(e)}' not found in the JSON data.")    

이렇게 시크릿 파일을 읽을 준비가 되면, 민감성 정보가 필요한 곳에 적용해줍니다.

...
SECRET_KEY = get_secret("secretKey")

...

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'common',
        'USER': get_secret("databases", "common", "username"),
        'PASSWORD': get_secret("databases", "common", "password"),
        'HOST': get_secret("databases", "common", "host"),
        'PORT': get_secret("databases", "common", "port"),
    },
...

이렇게 설정하고 정상적으로 서버가 동작하는지 확인해봅시다.
정상적으로 동작한다면 git에 푸시할 때 .secrets.json 파일은 .gitignore 파일에 추가하여 git 저장소에 같이 푸시되지 않도록 처리합니다.

이렇게 작업하면 일단 민감성 정보 숨기는 작업을 끝났습니다.

Git History에 이미 푸시된 민감정보 삭제

만약 이미 git에 해당 정보가 포함된 settings.py가 git에 푸시되어 있다면, 이 작업을 해도 히스토리 보기를 통해 과거의 내용을 볼 수 있습니다.
이런 경우를 위해 히스토리까지 싹 날리는 여러 방법이 존재합니다.
그 중 간단한 방법으로 git-filter-repo 패키지를 이용하여 삭제해봅시다.

먼저 다음 명령어로 git-filter-repo 패키지를 설치합니다.

sudo apt-get install git-filter-repo

그리고 다음 명령을 통해 히스토리를 삭제할 파일을 정해 삭제합니다.

주의!
해당 명령을 실행하면 settings.py 파일자체가 삭제되어 버리니 시크릿파일을 통해 민감정보 가져오기 작업된 settings.py 파일은 따로 백업해놓고 해당 작업 이후 재커밋해주셔야 합니다.

git filter-repo --invert-paths --path config/settings.py --force

이제 히스토리 보기를 해도 민감정보 작업 전 히스토리 내역은 보이지 않게 되었습니다.

profile
software engineer

1개의 댓글

comment-user-thumbnail
2023년 7월 23일

좋은 글이네요. 공유해주셔서 감사합니다.

답글 달기