본 글은 Django 공식문서를 참조하였습니다.
django의 보안 정책들에 대해 공부해 볼 것이다
카카오 정보보안실 체험인턴 인터뷰에 원활한 답변을 할 수 있도록 준비해보았다.
추후 직무 인터뷰에서도 언젠가 했어야할 공부
웹 사이트 상 악성 스크립트를 주입하는 행위를 말합니다. 해커가 악성 코드를 주입하고, 악성 스크립트가 포함된 게시글을 열람한 피해자들의 쿠키가 해커에게 전송됩니다. 이를 통해 해커는 피해자의 브라우저에서 스크립트를 싱행해 세션을 가로채거나, 웹사이트를 변조하거나, 악의적인 콘텐츠 삽입 또는 피싱 공격등을 할 수 있게 됩니다.
django의 templates의 제한사항을 충분히 이해하고, 사용하면 대부분의 XSS공격을 막을 수 있습니다.
django의 templates는 몇몇 HTML에 위험한 문자를 자동으로 바꿔주는 escape 문자들이 있습니다. 대부분의 공격을 막아주지만 완전하지는 않습니다.
django가 자동으로 바꿔주는 escape문은 defualt로 설정되어 있지만, 사용자에 따라 on/off 할 수 있는데, 이를 off했을 경우 주의가 필요합니다.
ㅤ
CSRF 공격은 공격자가 사용자의 동의 없이 사용자의 자격 증명을 할 수 있는 공격을 뜻합니다. XSS와 차이점은 XSS는 사용자의 PC에서 공격이 실행되는 반면, CSRF는 서버를 통해 침투하여 공격합니다. django에서는 CSRF에 대한 대부분 공격 보호가 내장되어 있어 이를 활성화 하여 사용할 수 있습니다. 하지만 CSRF 모듈을 전역적으로 또는 특정 보기에 대해 비활성화 할 수 있으며, 이럴 땐 수행 중인 작업을 알고 있는 경우에만 수행하는 것이 좋습니다.
django의 templates로 프론트를 구성한다면 POST요청에서 CSRF보호를 할 수 있습니다. 요청에 CSRF Token을 발급하여 고유 키를 같이 보낸다면 서버에서 이를 확인하고 제어하기에, 공격자는 고유 키를 알아야 CSRF를 알지 못한다면 공격할 수 없습니다.
📌 HTTPS를 통해 배포된 서버의 경우 CsrfMiddlewareHTTP 리퍼러 헤더가 동일한 출처의 URL로 설정되어 있는지 확인합니다. HTTPS는 추가 보안을 제공하므로 안전하지 않은 연결 요청을 브라우저에 전달하여 HSTS를 사용하여 HTTPS로 사용하게 하는 것이 중요합니다.
이 부분은 장고 공식문서를 그대로 가져온 글인데 아직 무슨 말인지 이해를 못했다.. 공부해서 수정하겠습니다.
ㅤ
SQL 인젝션은 공격자가 사용자의 데이터베이스에 임의의 SQL문을 삽입하여 데이터베이스의 정보를 유출하거나 삭제하는 공격 유형입니다.
django의 쿼리셋은 매개변수화를 사용하여 구성하기 때문에 SQL 주입으로부터 보호됩니다.쿼리의 SQL 코드는 쿼리의 매개변수와 별도로 정의됩니다.매개변수는 사용자가 제공하여 안전하지 않을 수 있으므로 기본 데이터베이스 드라이버에 의해 escape됩니다.
하지만 사용자가 원시 쿼리를 작성하거나 지정 SQL을 실행할 수 있도록 완화 정책을 제공합니다. 이런 경우에 SQL 인젝션을 주의해야하고, 사용자가 제어할 수 있는 매개변수를 적절하게 이스케이프하도록 항상 주의해야 합니다.
공격자가 여러 투명 또는 불투명 레이어를 사용하여 사용자가 최상위 페이지를 클릭하려고 할 때 다른 페이지의 버튼이나 링크를 클릭하도록 속이는 방법입니다. 공격자는 자신의 페이지에 대한 클릭을 유도하여 다른 작업을 수행하도록 합니다.
django는 X-Frame_Options 미들웨어 형태로 클릭재 킹을 방지하며, 이것을 지원하는 브라우저 안에는 사이트가 렌더링 되는 것을 방지합니다.
# How To Use
MIDDLEWARE = [
...
django.middleware.clickjacking.XFrameOptionsMiddleware',
...
]
ㅤ
HTTPS 설정하여 사이트를 배포하는 것이 보안을 위해 항상 더 좋습니다. 설정이 되어있지 않다면 악의적인 네트워크 사용자가 사용자 인증 자격 또는 클라이언트와 서버 간에 전송되는 기타 정보를 갈취할 수 있고, 경우에 따라서 활성 네트워크 공격자가 양방향으로 전송되는 데이터를 변경할 수 있습니다.
ㅤ
django는 URL구성을 위해 클라이언트에서 제공된 Host header를 사용합니다. 이런 값들은 XSS, CSRF, 캐쉬 중독, 감염된 이메일 링크 방지에 사용됩니다.
겉보기에 안전한 웹 서버도 fake HOST header에 취약하기 때문에 django는 django.http.HttpRequest.get_host() 메서드의 ALLOWED_HOSTS 설정에 대해 호스트 헤더를 검증합니다.
이 유효성 검사는 get_host()를 통해서만 적용되며, 코드가 request.META에서 직접 HOST header에 엑세스 하는 경우 이 보안 보호를 무시합니다.
ALLOWED_HOSTS
default: [](빈 배열)
django 사이트가 호스트 헤더 공격을 방지하기 위해 허락한 호스트/도메인 이름을 나타내는 문자열 목록. get_host()를 통해서만 적용됨.
ㅤ
django는 Opinionated한 프레임워크로 기본적으로 우수한 보안 기능들을 제공합니다. 하지만 애플리케이션을 적절하게 배포하고, 웹서버, 운영체제 및 기타 구성 요소의 보안 보호 기능을 활용하는 것은 여전히 중요합니다.
1. Python 코드가 웹서버 루트 외부에 있는지 확인합시다. 이렇게하면 Python코드가 실수로 일반 텍스트로 제공되거나 실수로 실행되지 않습니다.
django는 사용자 인증 요청을 조절하지 않습니다. 인증 시스템에 대한 브루트포스 공격으로 보호하기 위해 django 플러그인 또는 웹서버 모듈을 사용하여 이런 경우를 피할 수 있습니다.
SECRET_KEY 또는 SECRET_KEY_FALLBALCKS를 사용 중인 경우 비공개를 유지하십시오.
방화벽 사용으로 당신의 캐싱시스템, 데이터베이스에 대한 접근 제한을 걸 수 있습니다.
Mozilla 제단이 제안하는 웹 보안 또는 OWASP(Open Web Application Security Project)에 방문해서 최신 악성 공격에 대해 공부하고, 예방하세요
ㅤ
ㅤ
django 공식문서를 이렇게 제대로 공부한 건 처음인데 내가 모르는 부분과 내가 아는 부분도 제대로 아는게 아닌 것들이 많았다. 웹은 단순히 https만 설정하면 된다고 오만하게 생각한 과거를 반성한다..
ㅤ
ㅤ