28
TWO Scoops of Django 26 : Two Scoops of Django 26 : 1

Django two scoop 26장 보안

Embed Size (px)

Citation preview

Page 1: Django two scoop 26장 보안

TWO Scoops of Django

26장: 실전보안 방법론

Two Scoops of Django 26장: 실전보안 방법론 1

Page 2: Django two scoop 26장 보안

서버를 견고하게 하자

간단히는 SSH포트 변경부터,불필요 서비스 끄기

Q. NMAP등 포트 스캐닝은 어떻게 막나?

Two Scoops of Django 26장: 실전보안 방법론 2

Page 3: Django two scoop 26장 보안

장고가 가진 보안기능

XSS 보안

CSRF 보안

SQL 인젝션 보안

클릭재킹 보안

보안쿠키: TLS/HTTPS/HSTS지원

SHA256+PBKDF2 Password

HTML Escaping

XML 폭탄 방어

Two Scoops of Django 26장: 실전보안 방법론 3

Page 4: Django two scoop 26장 보안

settings.py에서 DEBUG=FalseALLOWED_HOST 등록 (사용하는 도메인만!)이거 안해주면 SuspiciousOperation 발생 가능성 높음.

SECRET_KEY 안전하게 보관하기 (dev!=deploy)환경변수로 다루기 or envs.json으로 독립관리

깃헙 등 버전관리 시스템에서 이런 정보들 다루지 않아야 함

온라인에 올라간순간 내 것이 아님

Two Scoops of Django 26장: 실전보안 방법론 4

Page 5: Django two scoop 26장 보안

사이트는 전부 HTTPS 이용하기로그인은 당연히 HTTPS

사이트 전체 HTTPS시 Static Serving도 HTTPS이렇게 하지 않으면 "Insecure Resource" 경고 뜬다.

HTTP로 접속시 HTTPS로 리다이렉트

웹서버(Apache/NginX)가 하게 하는게 제일 낫다.

안되는 상황이라면 Django 미들웨어 이용.단 이 경우는 Static HTTPS는 따로 처리해주기

settings.MIDDLEWARE_CLASSES = [django.middleware.security.SecurityMiddlewaresettings.SECURE_SSL_HOST = True

Two Scoops of Django 26장: 실전보안 방법론 5

Page 6: Django two scoop 26장 보안

안전하게 쿠키 쓰기HTTPS 외 접속에선 쿠키 전송하지 못하게 하기

SESSION_COOKIE_SECURE = TrueCSRF_COOKIE_SECURE = True

쿠키 기반 세션 주의 (쓰지 않기)Django는 DB세션 기반 Or 캐시세션 기반

쿠키는 얼마든지 사용자가 조작가능하다!

공격자가 SECRET_KEY를 알 수도 있다.

Two Scoops of Django 26장: 실전보안 방법론 6

Page 7: Django two scoop 26장 보안

HSTS 이용하기HTTP Strict Transport Security

웹 서버 레벨에서 설정

HSTS기간을 신중하게 설정할 것.잘못 설정하면 사이트 도메인을 아예 바꿔야 함.

Two Scoops of Django 26장: 실전보안 방법론 7

Page 8: Django two scoop 26장 보안

HTTPS에도 수준이 있다모질라에서 하라는 �로 해보자

HTTPS 테스트하기

https://www.ssllabs.com/ssltest

Two Scoops of Django 26장: 실전보안 방법론 8

Page 9: Django two scoop 26장 보안

XSS방어Django에서는 기본적으로 HTML Escaping으로 방어

장고 템플릿 이용하기 (mark_safe X)

사용자가 HTML입력 할수 없게 만들기

JSON으로 데이터 주고받기 (파이썬 객체 넣기 X)

Two Scoops of Django 26장: 실전보안 방법론 9

Page 10: Django two scoop 26장 보안

파이썬 코드 인젝션기본 내장함수 중 eval(), exec(), exec�le()은아주 신중하게 사용할 것

pickle로 직렬화된 입력값을 역직렬화 하지 말 것

YAML문서 사용시 yaml.safe_load()만 사용할 것

Two Scoops of Django 26장: 실전보안 방법론 10

Page 11: Django two scoop 26장 보안

민감한 정보 필드는 자동완성 Xfrom django import forms

class SpecialForm(forms.Form): my_secret = forms.CharField( widget=forms.TextInput(attrs={'autocomplete': 'off'}))

이와 같이 폼 필드 자체를 PasswordInput으로 만들기도

방법.

from django import forms

class SpecialForm(forms.Form): my_secret = forms.CharField( widget=forms.PasswordInput())

Two Scoops of Django 26장: 실전보안 방법론 11

Page 12: Django two scoop 26장 보안

사용자가 올린 파일은 다른 곳에아예 다른 도메인을 가진 곳 이용하기

CDN: 안전하고 빠르다

Content-Disposition: attatchement

통해서 브라우저에서 인라인으로 보이지 않게 설정

업로드 받은 파일은 실행 권한 없는 폴더에 두기

파일 확장자를 화이트리스트로 관리

파일이 악의적이면 Form Validation도 이미 늦음(to_python()실행이 이미 되어버림)

File validation (FileField / ImageField)Two Scoops of Django 26장: 실전보안 방법론 12

Page 13: Django two scoop 26장 보안

ModelForm에는 Meta.�elds이용

Meta.exclude 사용시 �량 매개변수 입력 취약점 생김

�량매개변수입력취약점

https://www.kevinlondon.com/2015/10/16/answers-to-django-security-questions.htmlDjango1.6 미만의 버전에서는 ModelForm에서 �eld정의 않을 경우 취약점 있음1.6이상에서는 �eld명시 않을 경우 장고단에서 막음exclude를 쓰지맙시다

exclude사용시 model변경시마다 Form을 새로 작성귀찮

Two Scoops of Django 26장: 실전보안 방법론 13

Page 14: Django two scoop 26장 보안

SQL Injection 피하기장고에서는 기본적으로 SQL Injection을 방어해준다

단 raw Query를 날리는 경우(ORM을 배제한 경우) SQLInjection에 취약해 질 수 있음

ORM Method중에서도 raw(), extra()는 주의해야함

전달되는 Parameter를 Escaping해줘야 한다

사용자 입력값을 바로 넣으면 안된다

Two Scoops of Django 26장: 실전보안 방법론 14

Page 15: Django two scoop 26장 보안

서버에 민감한 정보 저장하지 않기신용카드정보 >> Paypal 등 결제 �행사에 맡길 것

만약 꼭 저장 하는 경우가 필요하다면 PCI-DSS보안표준그리고 PCI 규약을 체크하자. 돈이 많이든다

암호화한다 하더라도 저장하지 말자

개별적인 ID/PW를 관리하기 >> SocialAuth

구Ú / 페이스북 / 깃헙 / etc...

Two Scoops of Django 26장: 실전보안 방법론 15

Page 16: Django two scoop 26장 보안

12개의 PCI-DSS 요구사항 개요

https://aws.amazon.com/ko/compliance/pci-dss-level-1-faqs/Two Scoops of Django 26장: 실전보안 방법론 16

Page 17: Django two scoop 26장 보안

장고 어드민 관리하기기본 url 변경하기

django-admin-honeypot 이용하기

어드민 페이지는 HTTPS그냥 사이트 전체 HTTPS �시다

admin접속에는 화이트리스트 IP만 접속 가능하게

장고 어드민 문서 Url을 /admin/doc에서 다른거로 변경

Two Scoops of Django 26장: 실전보안 방법론 17

Page 18: Django two scoop 26장 보안

사이트 모니터링하기

Q. 여러분은 어떻게 Django사이트를 모니터링중이신가요?

Two Scoops of Django 26장: 실전보안 방법론 18

Page 19: Django two scoop 26장 보안

의존성 패키지 최신으로 유지하기requires.io 를 이용해 최신 버전 체킹하기

PyCharm의 패키지 매니저에서도 관리 가능

클릭재킹 예방하기장고에서 기본적으로 예방하도록 동작함

DefusedXML로 XML폭탄막기lxml같은 라이브러리도 XML공격에 취약함

Two Scoops of Django 26장: 실전보안 방법론 19

Page 20: Django two scoop 26장 보안

이중인증 쓰기OTP / TOTP

email Token

SMS

django-two-factor-auth

Two Scoops of Django 26장: 실전보안 방법론 20

Page 21: Django two scoop 26장 보안

강한 패스워드 사용하기문자 + 숫자 + �문자 + 특수기호

길이 1X자 이상

django-passwords

django-autoadmin

Two Scoops of Django 26장: 실전보안 방법론 21

Page 22: Django two scoop 26장 보안

사이트 보안 검사하기포니 체크업 (ponycheckup.com)

Two Scoops of Django 26장: 실전보안 방법론 22

Page 23: Django two scoop 26장 보안

사용자들의 보안 리포트 받기

Two Scoops of Django 26장: 실전보안 방법론 23

Page 24: Django two scoop 26장 보안

remove_tags 사용 금지1.10에서 이미 사라짐

�신 bleach를 사용하자

Two Scoops of Django 26장: 실전보안 방법론 24

Page 25: Django two scoop 26장 보안

만약 실제 보안 문제가 생겼다면서버를 멈추고

정적으로 바꾼다음에

백업을 시작하고

djangoproject팀에 연락한 후

문제를 살펴보자

Two Scoops of Django 26장: 실전보안 방법론 25

Page 26: Django two scoop 26장 보안

서버를 멈추고 나서

heroku등에서 maintance:on

503 관리중 페이지 띄우기

django-db-tools 로 DB를 읽기전용으로 변환

django-readonly-site

정적 HTML '보수중'페이지 띄우고

백업을 한다

테스트 + CI를 통해 빠른 보수 & 테스트Two Scoops of Django 26장: 실전보안 방법론 26

Page 27: Django two scoop 26장 보안

알아보기 어려운 PKmodels.UUIDField를 pk로 사용

문제: 느려진다

실시간 보안 뉴스 확인하기트위터

해커뉴스

보안 관련 질문은 장고 커뮤니티로!Two Scoops of Django 26장: 실전보안 방법론 27

Page 28: Django two scoop 26장 보안

FIN

Two Scoops of Django 26장: 실전보안 방법론 28