Python 프로그램이 사용해야하는 암호 및 기타 비밀을 저장하는 몇 가지 옵션이 있습니다. 특히 사용자에게 암호를 입력하도록 요청할 수없는 백그라운드에서 실행해야하는 프로그램이 있습니다.
피해야 할 문제 :
- 다른 개발자 또는 일반인이 볼 수있는 소스 제어에 암호를 확인합니다.
- 동일한 서버의 다른 사용자가 구성 파일 또는 소스 코드에서 암호를 읽습니다.
- 편집하는 동안 다른 사람이 어깨 너머로 볼 수있는 소스 파일에 암호가 있습니다.
옵션 1 : SSH
이것이 항상 옵션은 아니지만 아마도 최선일 것입니다. 개인 키는 네트워크를 통해 전송되지 않으며 SSH는 올바른 키가 있음을 증명하기 위해 수학적 계산을 실행합니다.
작동하려면 다음이 필요합니다.
- 데이터베이스 또는 액세스중인 모든 항목은 SSH로 액세스 할 수 있어야합니다. "SSH"와 액세스중인 서비스를 검색해보십시오. 예 : "ssh postgresql" . 이것이 데이터베이스의 기능이 아닌 경우 다음 옵션으로 이동하십시오.
- 데이터베이스를 호출 할 서비스를 실행할 계정을 만들고 SSH 키를 생성합니다 .
- 호출 할 서비스에 공개 키를 추가하거나 해당 서버에 로컬 계정을 만들고 여기에 공개 키를 설치합니다.
옵션 2 : 환경 변수
이것은 가장 간단하므로 시작하기에 좋은 곳일 수 있습니다. Twelve Factor App에 잘 설명되어 있습니다 . 기본 아이디어는 소스 코드가 환경 변수에서 암호 또는 기타 비밀을 가져온 다음 프로그램을 실행하는 각 시스템에서 해당 환경 변수를 구성하는 것입니다. 대부분의 개발자에게 작동하는 기본값을 사용하면 좋은 터치가 될 수도 있습니다. 소프트웨어를 "기본적으로 보안"하는 것과 균형을 맞춰야합니다.
다음은 환경 변수에서 서버, 사용자 이름 및 비밀번호를 가져 오는 예입니다.
import os
server = os.getenv('MY_APP_DB_SERVER', 'localhost')
user = os.getenv('MY_APP_DB_USER', 'myapp')
password = os.getenv('MY_APP_DB_PASSWORD', '')
db_connect(server, user, password)
운영 체제에서 환경 변수를 설정하는 방법을 찾고 자체 계정으로 서비스를 실행하는 것을 고려하십시오. 이렇게하면 자신의 계정에서 프로그램을 실행할 때 환경 변수에 민감한 데이터가 없습니다. 이러한 환경 변수를 설정할 때 다른 사용자가 읽을 수 없도록 각별히주의하십시오. 예를 들어 파일 권한을 확인하십시오. 물론 루트 권한이있는 모든 사용자는 읽을 수 있지만 어쩔 수 없습니다.
옵션 3 : 구성 파일
이것은 환경 변수와 매우 유사하지만 텍스트 파일에서 비밀을 읽습니다. 여전히 배포 도구 및 지속적 통합 서버와 같은 항목에 대해 환경 변수가 더 유연하다는 것을 알았습니다. 구성 파일을 사용하기로 결정한 경우 Python은 표준 라이브러리에서 JSON , INI , netrc 및 XML 과 같은 여러 형식을 지원합니다 . PyYAML 및 TOML 과 같은 외부 패키지를 찾을 수도 있습니다 . 개인적으로 JSON과 YAML이 가장 사용하기 쉽고 YAML은 주석을 허용합니다.
구성 파일에 대해 고려해야 할 세 가지 사항 :
- 파일은 어디에 있습니까? 과 같은 기본 위치와
~/.my_app
다른 위치를 사용하는 명령 줄 옵션 일 수 있습니다.
- 다른 사용자가 파일을 읽을 수 없는지 확인하십시오.
- 분명히 구성 파일을 소스 코드에 커밋하지 마십시오. 사용자가 홈 디렉토리에 복사 할 수있는 템플릿을 커밋 할 수 있습니다.
옵션 4 : Python 모듈
일부 프로젝트는 비밀을 Python 모듈에 바로 넣습니다.
db_server = 'dbhost1'
db_user = 'my_app'
db_password = 'correcthorsebatterystaple'
그런 다음 해당 모듈을 가져와 값을 가져옵니다.
from settings import db_server, db_user, db_password
db_connect(db_server, db_user, db_password)
이 기술을 사용하는 한 프로젝트는 Django 입니다. 사용자가 복사하고 수정할 수있는 settings.py
라는 파일을 커밋하고 싶을 수 있지만 소스 제어에 커밋해서는 안됩니다 settings_template.py
.
이 기술에 몇 가지 문제가 있습니다.
- 개발자는 실수로 파일을 소스 제어에 커밋 할 수 있습니다.
.gitignore
그 위험 을 줄이기 위해 그것을 추가하십시오 .
- 일부 코드는 소스 제어를받지 않습니다. 훈련을 받고 여기에 문자열과 숫자 만 넣으면 문제가되지 않습니다. 여기서 로깅 필터 클래스를 작성하기 시작하면 중지하십시오!
프로젝트에서 이미이 기술을 사용하는 경우 환경 변수로 쉽게 전환 할 수 있습니다. 모든 설정 값을 환경 변수로 이동하고 Python 모듈을 해당 환경 변수에서 읽도록 변경하십시오.