Секрети та захист даних
Ключі, токени та персональні дані - саме те, за чим справді полює зловмисник. Захищай їх у стані спокою, під час передачі та в історії вихідного коду.
Чек-лист
- Тримай секрети поза кодом і клієнтом. API-ключі, паролі до баз даних і секрети підпису мають зберігатися у змінних середовища або в менеджері секретів, ніколи не бути вбудованими в код і ніколи не надсилатися в браузер. Інструменти ШІ часто вбудовують ключі в клієнтський код; шукай у бандлі будь-що, схоже на ключ.
- Тримай секрети поза git. Додай
.env,*.pemі*.keyдо.gitignoreдо першого коміту. Все, що колись було закомічено, вважається скомпрометованим, навіть якщо його згодом видалено, бо воно лишається в історії. Заміни такі секрети. - Шифруй чутливі дані в стані спокою. Використовуй автентифіковане шифрування (AES-256-GCM) для збережених секретів і чутливого вмісту користувачів, а ключ тримай поза базою даних.
- Передавай усе через TLS. Жодного HTTP без шифрування для того, що містить облікові дані або персональні дані. Перенаправляй HTTP на HTTPS і встановлюй HSTS.
- Не клади секрети чи персональні дані в URL. Рядки запиту потрапляють у логи, історію браузера та заголовок Referer. Передавай їх у тілі запиту.
- Повертай мінімум. Профільна кінцева точка або кінцева точка "me" має повертати лише те, що потрібно інтерфейсу, ніколи хеші паролів, ключі чи внутрішні прапорці.
- Зберігай токени там, куди скрипт не дістане, коли це можливо. JWT у
localStorageдоступний для читання будь-якому скрипту, тож XSS його викраде. Cookie з httpOnly цього уникає (ціною необхідності обробляти CSRF). У будь-якому разі суворий Content-Security-Policy - це страховка. Див. інфраструктуру. - Підтримуй права на дані. Дай користувачам змогу експортувати та видаляти свої дані і очищати їх за розкладом. Це і хороша практика, і для багатьох юридична вимога.
Як тестувати
- Відкрий вкладку мережі в інструментах розробника браузера і JS-бандл; шукай
sk-,eyJ,password,secret,key. - Скануй репозиторій і його історію сканером секретів.
- Відкрий свою кінцеву точку "me" і прочитай кожне поле, яке вона повертає.