JavaRush /Курсы /Модуль 3: Django /Обеспечение безопасности с помощью HTTPS

Обеспечение безопасности с помощью HTTPS

Модуль 3: Django
21 уровень , 7 лекция
Открыта

Перед тем как начать, давайте вспомним: кто-нибудь когда-нибудь говорил вам, что ваш API небезопасен? Если да, то скорее всего вы еще не включили HTTPS — ключевой компонент для защиты передаваемых данных. Сегодняшняя лекция посвящена тому, как HTTPS помогает сделать ваши приложения настолько безопасными, ч то злоумышленникам придется пойти искать другую жертву. А еще мы разберемся, как это все настроить в вашем Django-проекте.

Основы HTTPS

HTTPS (HyperText Transfer Protocol Secure) — это протокол для безопасной передачи данных между пользователем и сервером. В отличие от HTTP, HTTPS использует шифрование с помощью SSL/TLS-сертификатов. Это делает ваши данные невидимыми для злоумышленников, даже если они пытаются перехватить трафик между клиентом и сервером.

Ключевые преимущества HTTPS:

  • Конфиденциальность: передаваемые данные зашифрованы и недоступны для перехвата.
  • Целостность: гарантия, что данные не были изменены в процессе передачи.
  • Аутентификация: убедитесь, что вы подключаетесь именно к тому серверу, к которому собирались.

Почему HTTPS важен для API? Дело в том, что API, особенно те, которые работают с клиентскими приложениями, часто передают чувствительные данные: пароли, токены, личную информацию. Использование HTTP оставляет эти данные без защиты. Вы ведь не хотите, чтобы злоумышленники смогли украсть токен доступа вашего пользователя, верно?

Интересный факт:

Google с 2018 года стал помечать сайты без HTTPS как "небезопасные". Хотите, чтобы ваш API выглядел солидно? Переходите на HTTPS.

Настройка HTTPS в проекте Django

Теперь, когда мы поняли зачем нам HTTPS, пора переходить к практике. Мы рассмотрим настройку HTTPS как в локальной среде, так и для продакшена.

Настройка HTTPS на локальной системе

В локальной разработке HTTPS обычно не используется, так как разработчики работают с localhost, и данные не передаются через интернет. Но если вы хотите тестировать HTTPS, вот простой способ настроить его при помощи бесплатного SSL-сертификата.

  1. Установите OpenSSL.

    Убедитесь, что OpenSSL установлен на вашей машине. Например:

    sudo apt-get install openssl  # Для Ubuntu
    brew install openssl         # Для macOS
    
  2. Создайте самоподписанный сертификат.

    Используйте OpenSSL для создания сертификата:

    openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout localhost.key -out localhost.crt
    

    После выполнения команды у вас появятся два файла:

    • localhost.key — это приватный ключ.
    • localhost.crt — это ваш сертификат.
  3. Настройте сервер Django для использования сертификата.

    Django — фреймворк дружелюбный, поэтому он позволяет легко настроить использование SSL-сертификатов в локальной разработке. Запустите сервер с SSL:
    python manage.py runserver_plus --cert-file localhost.crt --key-file localhost.key
    

    Для этого вам потребуется установить пакет django-extensions:

    pip install django-extensions
    

Теперь ваш сервер будет доступен по адресу https://127.0.0.1:8000. Браузер может пожаловаться на самоподписанный сертификат, но для целей разработки это нормально.

Настройка HTTPS в продакшене

В продакшене все становится серьезнее. Здесь важно гарантировать безопасность пользователей, пропустить сертификаты через доверенные центра сертификации (CA) и правильно выполнять настройку.

Для продакшена вам нужен настоящий сертифицированный SSL. Вот несколько распространенных вариантов:

  • Let’s Encrypt: Бесплатный, автоматический SSL-сертификат.
  • Платные сертификаты: Покупаются у таких организаций, как GlobalSign или DigiCert.

Установка Let’s Encrypt:

  1. Установите клиент Certbot для вашего сервера:
    sudo apt install certbot python3-certbot-nginx
    
  2. Настройте сертификат для вашего домена:
    sudo certbot --nginx -d your-domain.com -d www.your-domain.com
    

Это автоматически сгенерирует сертификаты и настроит ваш Nginx сервер для использования HTTPS.

Настройка HTTPS для Gunicorn и Nginx

Если вы используете Django на Gunicorn с Nginx, настройка будет следующей:

Добавьте в ваш Nginx-конфигурационный файл секцию для HTTPS:

server {
    listen 443 ssl;
    server_name your-domain.com www.your-domain.com;

    ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

server {
    listen 80;
    server_name your-domain.com www.your-domain.com;
    return 301 https://$host$request_uri;
}

Это позволяет автоматически перенаправлять все HTTP-запросы на HTTPS.

Обратная связь от Django: SECURE_HSTS_SECONDS

Django обладает функциями, которые помогают усилить безопасность с HTTPS:

  1. HTTP Strict Transport Security (HSTS):

    Данный заголовок говорит браузерам всегда использовать HTTPS при обращении к вашему сайту.

    В настройках Django:

    SECURE_HSTS_SECONDS = 3600  # Рекомендуется начинать с небольшой цифры
    SECURE_HSTS_INCLUDE_SUBDOMAINS = True
    SECURE_HSTS_PRELOAD = True
    
  2. Ограничение использования cookies:

    Сделайте ваши cookies безопасными:

    SESSION_COOKIE_SECURE = True
    CSRF_COOKIE_SECURE = True
    

Рекомендации и потенциальные ошибки

Ошибка №1: использование самоподписанных сертификатов в продакшене.
Не делайте этого! Самоподписанные сертификаты подходят только для разработки.

Ошибка №2: оставление HTTP включенным.
Убедитесь, что все запросы на HTTP перенаправляются на HTTPS.

Ошибка №3: игнорирование SSL-сертификата перед его истечением.
Большинство сертификатов недействительны через 90 дней. Настройте автоматическое обновление для Let’s Encrypt.

Практическое применение

На реальных собеседованиях знание HTTPS и умение настроить безопасное соединение может стать козырем. Кроме того, практически все клиенты требуют, чтобы их веб-приложения и API были защищены, так что это неизбежная часть вашей работы.

Еще одна причина использовать HTTPS: это требование для работы с OAuth2, Stripe, PayPal и других сервисов, интеграция которых возможна только на защищенных серверах.

На этом этапе ваше API станет значительно более защищенным. Готовьтесь к тому, что ваша работа будет выглядеть гораздо профессиональнее, а данные пользователей окажутся в надежных руках!

1
Задача
Модуль 3: Django, 21 уровень, 7 лекция
Недоступна
Генерация самоподписанного SSL-сертификата
Генерация самоподписанного SSL-сертификата
1
Задача
Модуль 3: Django, 21 уровень, 7 лекция
Недоступна
Настройка Django для HTTPS
Настройка Django для HTTPS
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ