Django 모범 사례: 보안

Django는 성숙하고 전투의 시련을 겪은 웹 프레임워크로 지난 15년여 동안 안전 분야에서 부끄럽지 않은 명성을 누렸다.그러나 인터넷은 여전히 위험한 곳이고 네트워크 안전은 끊임없이 발전하는 분야이다.대부분의 웹 프레임워크와 마찬가지로 Django는 새 프로젝트를 만들 때 기본적으로 로컬 개발 설정을 사용합니다.개발자는 로컬 기본 설정과 맞춤형 생산 설정을 효과적으로 관리할 책임이 있다.
Django는 우수한 deployment checklist을 덧붙여서 배치하기 전에 사이트의 생산 버전에서 운행할 수 있다.그리고 security in the official documentation에 대한 대량의 주석.
이 자습서는 가장 중요한 것부터 끝까지 Django 보안 모범 사례를 설명합니다.

Django 버전
가장 중요한 보안 권장 사항은 항상 최신 버전의 Django를 사용하는 것입니다.Django는 약 9개월에 한 번씩 새로운 주요 버전(2.2, 3.0, 3.1 등)을 발표하고 거의 매달 한 번씩 안전/구멍 복구가 있는 부차적인 버전(3.1.1, 3.1.2 등)을 발표한다.최신 버전인 upgrading to a newer version에 정기적으로 업데이트되는 문서에는 공식 지침이 있습니다. 테스트 세트를 실행하고 Django 프로젝트를 계속 수행하십시오.
제출할 때마다 테스트를 실행할 수 있도록 전면적인 테스트를 작성하고 CI를 실현하십시오. 이것은 다른 강좌나 전체 책의 주제입니다.

환경 변수
현지 개발과 생산을 위한 환경 사이에는 근본적인 긴장 관계가 존재한다.로컬 개발은 속도, 건장한 버그 보고, 모든 기능에 대한 접근을 중시한다.제작은 사이트를 잠그고 방문을 최소화해야 한다.기본적으로 startproject 명령을 사용하여 만든 새 Django 프로젝트에는 로컬 개발 설정이 있습니다.개발자는 이를 생산 설정으로 업데이트하는 것을 책임진다.
현재 로컬과 생산 설정 사이를 전환하는 표준 방식은 environment variables이다.여러 개의 settings.py 파일과 달리 단일 settings.py 파일은 로컬이나 프로덕션 환경에 따라 로드된 변수와 함께 사용할 수 있습니다.
환경 변수와 각종 제3자 소프트웨어 패키지를 실현할 수 있는 여러 가지 방법이 있다.개인적으로 저는 environs을 즐겨 사용합니다. 이것은 Django 특유의 옵션이 있어서 설정에 도움이 되는 많은 추가 소프트웨어 패키지를 설치할 수 있습니다.

디버깅
모든 settings.py 파일의 상단 부근은 DEBUG으로 구성됩니다.기본적으로 True으로 설정되어 있으며, 이것은 현재 정의된 모든 Django 설정을 포함하는 풍부하고 상세한 오류 페이지를 생성합니다.이것은 로컬 디버깅의 노선도이지만, 만약 그들이 제품이 발표될 때 당신의 사이트를 파괴하려고 한다면, 그 어떠한 해커에게도 지침을 제공한다.따라서 생산 과정에서 DEBUGFalse으로 설정하는 것을 확보하세요!

비밀 키
SECRET_KEY은 무작위로 생성된 문자열로 startproject 명령을 실행할 때 생성된 cryptographic signing입니다.SECRET_KEY의 비밀은 매우 중요하다.
Git 제출 한 번만 하면 소스 코드에 액세스할 수 있는 모든 사용자가 SECRET_KEY을 볼 수 있습니다.실제로 대부분의 개발자들은 환경 변수와 제품 설정을 추가하기 전에 한 사이트의 업무 원형을 개발한다.따라서 첫 번째 배치에 앞서 새로운 SECRET_KEY을 만드는 데 시간이 걸린다.파이톤의 내장 secrets 모듈을 사용하는 방법이 있다.
$ python -c 'import secrets; print(secrets.token_urlsafe(38))'
매개변수 token_urlsafe은 URL 보안 텍스트 문자열의 바이트 수를 반환합니다.Base64 인코딩을 사용하여 바이트당 평균 1.3자입니다.따라서 이 예에서 38을 사용하면 51개의 문자가 발생한다.중요한 것은 너의 SECRET_KEY은 적어도 50글자가 있다는 것이다.이 명령을 실행할 때마다 새 값이 출력됩니다.

허용\u 호스트
ALLOWED_HOSTS 설정은 Django 사이트에서 서비스할 수 있는 호스트/도메인 이름을 나열합니다.기본적으로 사이트는 빈 목록 []으로 설정되어 있으며 모든 호스트나 도메인에서 액세스할 수 있습니다.이것은 HTTP 헤드 공격을 피하기 위해 생산 과정에서 변경해야 한다.
로컬 개발의 경우 Django에서 일반적으로 localhost:8000127.0.0.1:8000을 사용하기 때문에 이 두 가지를 설정에 명확하게 추가해야 한다.생산지의 사용자 정의 URL이 생기면, 예를 들어 Heroku를 사용하면, .herokuapp.com을 포함하고, 이것도 추가되어야 한다.
따라서 Heroku 애플리케이션의 일반 ALLOWED_HOSTS 설정은 다음과 같습니다.
# settings.py
ALLOWED_HOSTS = ['.herokuapp.com', 'localhost', '127.0.0.1'] 

HTTPS/SSL
이제 HTTPS 뒤에 사이트 전체를 배치하지 않을 이유가 없다.그렇지 않으면 해커가 인증 자격 증명, API 키 또는 클라이언트와 서버 간에 전송된 정보를 탐지할 수 있습니다.전체 SSL 지원을 활성화할 수 있는 다양한 설정이 Django 프로젝트에 있습니다.
SECURE_SSL_REDIRECT은 자동으로 HTTP 요청을 HTTPS로 리디렉션합니다.True으로 설정해야 합니다.
HTTP Strict Transport Security (HSTS)은 저희 서버가 Strict-Transport-Security header을 추가함으로써 웹 브라우저가 HTTPS를 통해서만 상호작용을 할 수 있도록 하는 보안 정책입니다.settings.py 파일에는 다음과 같은 세 가지 암시적 HSTS 구성이 필요합니다.

  • SECURE_HSTS_SECONDS = 0

  • SECURE_HSTS_INCLUDE_SUBDOMAINS = False

  • SECURE_HSTS_PRELOAD = False
  • 기본적으로 SECURE_HSTS_SECONDS0으로 설정되지만 보안을 위해 크면 클수록 좋습니다.좋은 기본 설정은 한 달 2592000초로 설정하는 것입니다.SECURE_HSTS_INCLUDE_SUBDOMAINS 강제 서브도메인도 SSL을 전문적으로 사용하기 때문에 생산 과정에서 True으로 설정해야 한다.SECURE_HSTS_PRELOADSECURE_HSTS_SECONDS에 0이 아닌 값이 있을 때만 유효하지만 우리가 방금 하나를 설치했기 때문에 True으로 설정해야 한다.

    미디어 파일
    대부분의 Django 웹 사이트에는 CSS, JavaScript, 이미지 등 고정적이고 변하지 않는 파일이 포함됩니다.이 문서들은 통상적으로 Static문서라고 불린다.일부 사이트에서 사용자가 올린 내용은 인스타그램과 비슷한 이미지 공유 사이트와 같은 관건적인 기능이다.Django는 사용자가 올린 콘텐츠를 Media이라고 하며 추가 예방 조치를 취해야 한다.
    일반적으로 말하면, 너는 너의 사용자를 신임할 수 없다.특히 그들이 당신의 사이트에 뭔가를 올릴 능력이 있다면따라서 미디어 파일이 있는 사이트에 대해 모든 정적 내용을 클라우드 서비스나 CDN(예를 들어 아마존의 S3)에 위탁 관리하는 것이 필요하다.타사 패키지 django-storages은 귀하의 사이트에 이 패키지를 설정하고 미디어 보안 문제를 완화하는 데 자주 사용하는 방법입니다.

    행정
    Django 관리 애플리케이션은 강력한 내장 기능입니다.그러나 모든 Django 프로젝트가 기본적으로 /admin에 있기 때문에 해커는 이 URL을 통해 모든 Django 사이트에 강제로 들어가기 쉽다.관리자의 안전을 보호하는 간단한 방법 중 하나는 관리자의 URL을 간단하게 바꾸는 것이다.다음 예제에서는 anything-but-admin으로 변경되었습니다.
    # config/urls.py
    urlpatterns = [
        path('anything-but-admin/', admin.site.urls), 
    
    강화 관리자에 대한 더 많은 힌트는 글 10 Tips for Making the Django Admin More Secure을 참조하십시오.

    결론
    Django 프로젝트에서 더 많은 보안 개선을 추가할 수 있지만 이것이 가장 중요합니다.필요한 모든 변경 사항이 있는지 확인하기 위해 생산 설정에서 Django 배치 검사표를 실행해야 합니다.
    $ python manage.py check --deploy
    
    안전성에 대한 더 많은 도움을 얻기 위해 Django for Professionals은 적당한 안전 기능, 성능 알림, Docker 사용법 등을 갖춘 생산형 사이트를 구축하는 방법을 상세하게 소개했다.

    좋은 웹페이지 즐겨찾기