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 стане значно більш захищеним. Готуйтеся до того, що ваша робота виглядатиме набагато професійніше, а дані користувачів опиняться в надійних руках!

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ