파비의 매일매일 공부기록

Two Scoops of Django - #26장 본문

Study/Python

Two Scoops of Django - #26장

fabichoi 2021. 6. 27. 23:30

이번장은 장고 보안의 실전 방법론이다.

페이지가 엄청 많다. 그래서 진짜 필요한 것들만 정리할 예정.

 

당연히 보안은 중요하다. 여기서 소개하는 내용들은 장고 보안에 대한 좋은 시작점 정도라고 보면 된다.

 

1. 서버를 견고하게 : SSH 포트 변경 및 불필요한 서비스 제거

 

2. 장고의 보안 기능에 대해 알아볼 것 : 기본 제공 보안 기능은 XSS, CSRF, SQL 인젝션, 클릭재킹, 보안 쿠키를 포함한 TLS, HTTPS, HSTS 지원, 기본 설정으로 SHA256과 PDKDF2 알고리즘을 이용한 안전 패스워드 저장, 자동 HTML 이스 캐이 핑, expat 파서를 통한 XML 폭탄 공격 대비, 강력해진 JSON, YAML, XML 직렬화/역직렬화 도구 등이다.

 

3. 상용 환경에서 DEBUG 모드 끄기 : 상용 환경에서는 당연히 DEBUG 모드로 운영해서는 안된다. 또한 ALLOWED_HOSTS도 반드시 설정해야 한다. 그렇지 않으면 500 에러를 생성하는 SuspiciousOperation 에러가 발생할 확률이 높다.

 

4. 보안 키 안전하게 보관하기 : SECRET_KEY가 안전하게 보관되지 않으면 원격으로 코드 실행 및 패스워드가 통째로 해킹당하는 등의 전반적인 보안 위협에 처할 수 있다. 

 

5. HTTPS 이용 : 사이트 전체를 HTTPS로 배포할 것. 중간에서 해커가 정보를 훔쳐보거나 이상한 곳으로 리다이렉션 시킬 수 있음. 사이트의 모든 부분이 HTTPS로 서비스되어야 함. 사이트가 정적 리소스 역시 HTTPS를 통해 서비스되어야 함. 만약 방문자들이 HTTP로 접속했다면 HTTPS로 리다이렉트 되어야 한다. 자체 서명 인증서를 이용하는 대신 공인된 지명도 높은 기관에서 SSL 인증서를 구매하는 것을 추천

 - 안전한 쿠키 이용

 - HSTS(HTTS strict transport security) 이용 : 웹서버 레벨에서 설정 가능. 

 - HTTPS 설정 도구 : SSL 설정 도구를 활용할 것

 

6. ALLOWED_HOSTS 설정 이용 : 상용 서비스에서는 반드시 ALLOWED_HOSTS 이용할 것. 가짜 HTTP 호스트 헤더를 가지고 요청하는 경우에 대한 보안 방어 수단이 됨.

 

7. 데이터를 수정하는 HTTP 폼에 대해서는 항상 CSRF 보안을 이용할 것 : 내장되어있으며 기본 기능으로 미들웨어를 통해 전체 사이트에 적용되어 있음

 

8. XSS 공격으로부터 사이트 방어 : 기본적으로 이스 케이 핑 처리해줌

 - mark_safe 보다는 장고 템플릿을 이용할 것

 - 사용자가 개별적인 HTML 태그 어트리뷰트를 이용하지 못하게 할 것

 - 자바스크립트에서 이용되는 데이터에는 항상 JSON 인코딩을 이용할 것

 

9. 파이썬 코드 인젝션 공격으로부터 사이트 방어하기

 - eval(), exec(), execfile()은 매우 주의해서 사용할 것

 - 코드를 실행할 수 없는 파이썬 표준 라이브러리 모듈 : pickle 모듈을 사용자에 의해 수정된 데이터를 역직렬화 하는데 쓰지 말 것

 - 코드를 실행할 수 있는 서드파티 라이브러리들 : PyYAML을 이용한다면 safe_load()만 이용할 것

 - 쿠키 기반 세션을 조심할 것 : 웬만하면 쓰지 말라고 함. 근데 제일 간단해서 쓰지 않나;

 

10. 장고 폼을 이용하여 모든 들어오는 데이터 검사 : 모든 데이터는 검사(validate) 되어야 함. 무결성 보호 및 안전하게 하는 방법임

 

11. 결제 필드에서 자동 완성 기능 비활성화 : 결제 부분에서는 HTML 필드에 대한 자동완성 기능은 비활성화되어야 함. 공공장소에서 컴퓨터를 이용할 수 있고 개인 컴퓨터의 경우에도 여러 사람에게 쉽게 노출될 수 있기 때문

 

12. 사용자가 올린 파일 다루기 : 사용자가 제공한 콘텐츠를 안전하게 서비스하는 유일한 방법은 서로 다른 도메인을 이용하는 것. CDN을 추천

 - CDN 이용 못할 경우 : 업로드된 파일들을 저장하는 폴더는 실행 불가능하게 설정할 것. 웹 서버 설정에 좀 더 주의를 기울일 것

 - 장고와 사용자 업로드 파일 : 보안 문제를 피하기 위해 어디로 파일을 업로드하는지, 그리고 업로드되는 파일이 어떤 건지 항상 주의할 것. ImageField의 경우 PIL을 이용해서 진짜 이미지 파일인지 확인

 

13. ModelForms.Meta.exclude 이용하지 않기 : 대량 매개변수 입력 취약점과 같은 심각한 보안 위협을 초래할 수 있기에 유의할 것

 

14. ModelForms.Meta.field = "__all__" 이용하지 않기

 

15. SQL 인젝션 공격 피하기 : 기본 제공. 그러나. raw(),. extra(), 데이터베이스 커서에 직접 접근하는 경우에는 유의해야 한다

 

16. 신용 카드 정보를 절대 저장하지 말 것 : 써드 파티 서비스를 활용할 것.

 

17. 장고 어드민 안전하게 관리 : 특별한 기능들을 제공하기에 보안에 꼭 신경 쓸 것.

 - 기본 어드민 URL 변경

 - django-admin-hoenypot 이용

 - 어드민 접근에 HTTPS만 허용

 - IP 기반으로 접속 제한

 - allow_tags 어트리뷰트 주의해서 쓰기 : 보안 문제 야기할 수 있음

 

18. 어드민 문서의 보안 : 어드민과 동일함

 

19. 사이트 모니터링 하기 : 웹 서버의 접근과 에러 로그를 주기적으로 확인할 것

 

20. 의존성 최신으로 유지 : 최신 안정화 버전을 유지할 것. 그렇지 않으면 해킹에 취약할 수 있음

 

21. 클릭재킹 예방 : 숨겨진 프레임 등에 다른 사이트를 로드하도록 허용하면 안 됨

 

22. defusedxml을 이용해서 XML 폭탄 막기 : XML 공격에 취약하니 조심할 것

 

23. 이중 인증 살펴보기 : 사용자들에게 서로 다른 두 개의 식별 수단을 조합하여 인증하는 ㅂ아법.

 

24. SecurityMiddleware 이용 : 장고의 기본 제공 기능

 

25. 강력한 패스워드 이용하게 만들 것 : 단지 문자 리스트 외에 숫자, 기호 등을 활용해 복잡도를 이루도록 구성하게 할 것

 

26. 사이트 보안 검사 : 포니 체크업이라는 사이트 등을 이용해서 보안 검사할 것

 

27. 취약점 보고 페이지 만들기 : 사용자들이 취약점 발견 시 보고할 수 있는 페이지 만들 것

 

28. django.utils.html.remove_tag 이용하지 말 것 : 장고 2.0에서는 제거 예정

 

29. 문제가 일어났을 때의 대응 방법을 마련할 것

 - i : 모든 것을 정지하거나 읽기 전용 모드로 바꾼다

 - ii : 정적 HTML 페이지 띄운다

 - iii : 백업을 시작한다.

 - iv : 설사 여러분의 실수로 발생한 문제라도 security@djangoproject.com으로 메일 보낸다

 - v : 문제를 살펴본다.

 - 상세한 내용은 책을 참조

 

30. UUID를 이용한 난해한 프라이머리 키 : models.UUIDField를 활용 가능 하나 부담만 가중될 수 있으니 유의해서 사용할 것

 

31. 부록의 보안 관련 세팅 참조

 

32. 보안 사항 일반에 대해 늘 최신 정보를 유지할 것

 

 

 

반응형

'Study > Python' 카테고리의 다른 글

Two Scoops of Django - #28장  (0) 2021.06.29
Two Scoops of Django - #27장  (0) 2021.06.28
Two Scoops of Django - #25장  (0) 2021.06.26
Two Scoops of Django - #24장  (0) 2021.06.25
Two Scoops of Django - #23장  (0) 2021.06.24
Comments