Чеклист по безопасности для веб-разработчика [Перевод]
Перевод статьи о том, как защитить ваш веб-сервис от злоумышлеников от Michael O’Brien.
Разработка безопасного, надежного, устойчивого веб приложения хостящегося в облаке, задача не из легких. Если вам кажется, что это просто, вы или существо высшего порядка или вас ждет болезненное озарение.
Если вы целиком доверились идее MVP и считаете, что сможете создать за один месяц безопасный и ценный продукт, подумайте дважды над его запуском. После того, как ознакомитесь с списком ниже, поймите что сохраняете множество из описанных изъянов в безопасности вашего сервиса. Как минимум будьте честны с собой и со своимим потенциальными пользователями и оповестите их, что предлагаете им прототип, который не обеспечивает полноценную безопасность.
Этот список прост и отнудь не полон. Занимаясь веб разработкой последние 14 лет я собрал в него самые важные и болезненные уроки, которые получил в процессе. Надеюсь, вы примете его серьезно, когда будете заниматься своим проектом.
Пожалуйста оповестите, если вам есть, что добавить в список.
База данных
-
Используйте шифрование для данных идентифицирующих пользователей и остальной чувствительной информации (токены, электронная почта, данные по биллингу).
-
Если ваша СУБД поддерживает не дорогое шифрование хранящихся данных, включите его. Так же убедитесь, что все резервные копии так же зашифрованы.
-
Максимально ограничьте в правах пользователя с доступом к БД. Не используйте root и проверяйте наличие лишних аккаунтов, так же как и аккаунтов с слабым паролем.
-
Храните и распространяйте секретные данные используя сервисы предназначенные для этого, такие как Vault или AWS Secret Manager. Не хардкодьте секретные данные в код и НИКОГДА не загружайте их в GitHub репозиторий.
-
Полностью исключите возможность SQL-инъекций используя только подготовленные SQL выражения. Например, если используете NPM, используйте npm-mysql2 вместо npm-mysql, т.к. он поддерживает подготовленные SQL выражения.
Разработка
-
Убедитесь что все версии каждого компонента вашей программы, проверены на уязвимости. Это может быть автоматизированно в CI-CD.
-
Обеспечьте сервисам процесса разработки такую же безопасность, как продакшену.
Авторизация
-
Убедитесь, что все пароли хешируются с использованием надежных криптоалгоритмов, таких как bcrypt. Никогда не разрабатывайте свои собственные алгоритмы шифрования и правильно инициализируйте существующие алгоритмы случайными данными. Используйте best-practices и компоненты, которые прошли проверку временем для авторизации, востановления пароля итд. Не изобретайте велосипед - очень тяжело протестировать его на всех возможных ситуациях.
-
Введите простые, но адекватные, правила для паролей, которые стимулируют пользователей делать их длинными и сложными.
-
Используйте многофакторную авторизацию для доступа к поставщикам услуг.
Защититесь от DoS
-
Удостоверьтесь что DoS атаки на ваш API не нанесут урона вашему сервису. Как минимум, установите ограничители на медленные методы и API для работы с авторизацией. Включите капчу на фронтэнде, чтобы защитить серверсайд от DoS атак.
-
Введите разумные фильтры на размер и структуру запросов и данных, получаемых от пользователя.
-
Рассматривайте сервисы с кеширующим прокси для смягчения последствий DDoS атак. Их можно включать на время атак, а в остальное время использовать как DNS сервер.
Траффик
-
Используйте TLS на всем сайте. Никогда не включайте TLS отдельно для форм авторизации. По-хорошему используйте strict-transport-security заголовок, чтобы принудительно использовать HTTPS для всех запросов.
-
Cookies должны быть httpOnly и ограничены путем и доменом.
-
Используйте Content Security Policy без правил с *. Тяжело настроить, но оно того стоит. Используйте CSP Subresource Integrity для содержимого из CDN.
-
X-Frame-Option и X-XSS-Protection должны быть добавленые в заголовки для ответов. Используйте https://observatory.mozilla.org для проверки сайта.
-
Воспользуйтесь HSTS для того, чтобы принудительно давать доступ только по TLS. Перенаправляйте все HTTP запросы на HTTPS на сервере для надежности.
-
Введите CSRF токены во всех формах и используйте новый SameSite Cookie заголовок, который исправляет работу с CSRF на всех новых браузерах.
API
-
Убедитесь, что ваши сущности нельзя перебрать с помощью вашего публичного API.
-
Удостоверьтесь, что пользователи полностью авторизованы и у них есть права для использования методов.
-
Используйте проверки в API для определения ненормальных запросов, которые указывают на атаку.
Валидация и кодирование
-
Проверяйте все вводимые данные на стороне клиента, для быстрого фидбека юзеру, но не доверяйте им полностью.
-
Валидируйте каждый бит вводимой пользователем информации используя белые списки на сервере. Никогда не добавляйте пользовательский ввод в ответы напрямую. Никогда не используйте не проверенные данные в SQL выражениях и другой логике.
Конфигурация облака
- Убедитесь, что все ненужные порты закрыты. Несмотря на то, что безопасность через скрытность не лучшая тактика, использование нестандартных портов немного усложнит задачу хакерам.
-
Хостите сервисы и базы данных на приватных VPC, которые не видимы из публичных сетей. Будьте осторожны, когда настраиваете группы безопасности в AWS и коммуникацию между VPC, чтобы случайно не сделать их видимыми из публичной сети.
-
Изолируйте сервисы в отдельных VPCs и используйте приватную сеть для межсервисной коммуникации.
-
Фильтруйте адреса с которых сервисы будут принимать запросы.
-
Ограничьте исходящий трафик по адресам и портам, чтобы уменьшить вероятность попадания в ботнет.
-
[ ] Всегда используйте пользователей и роли из AWS IAM , а не рут. Потратьте время на изучение IAM, для более эффективного использования.
-
Ограничьте права всех разработчиков и администраторов до минимально необходимых для выполнения своей работы.
- Регулярно изменяйте пароли и ключи доступа в соответствии с расписанием.
Инфраструктура
-
Постарайтесь при обновлении минимизировать downtime. Убедитесь, что процесс обновления полностью автоматизирован.
-
Создайте всю инфраструктуру в утилите типа Terraform. Она должны быть представлена в виде кода и все должно подниматься по нажатию кнопки. Старайтесь не использовать ресурсы созданные из консоли облака.
-
Используйте централизованную систему журналирования для всех сервисов. Вы никогда не должны подключаться по SSH для просмотра логов.
-
Используйте SSH только в редких случаях. Частое подключение по SSH говорит о том, что вы не автоматизировали что-то важное.
-
Не держите 22 порт постоянно открытым. Так же, если вам необходим SSH, подключайтесь с помощью PKA, а не паролей.
-
Поднимайте неизменяемые хосты, вместо серверов долгожителей которые вы постоянно патчите и обновляете.
-
Используйте IDS - системы определения вторжения.
Работа
- Отключайте ненужные сервисы и хосты. Самый защищенный сервер - выключенный сервер. Также вырубайте девелоп сервер, если в данный момент он не используется.
Тестирование
-
Проводите аудит вашей архитектуры и ее имплементации в коде.
-
Проводите тесты на проникновение - пытайтесь взломать себя. Так же хорошо если пентестом будет заниматься кто-то еще кроме вас.
Обучение
- Объясняйте вашим работникам опасности и техники используемые в социальной инженерии.
Наконец, имейте план действий
-
Разработайте модель угроз, которая описывает от чего вам стоит защищаться. В нем должен быть описан список возможных угроз по приоритетам.
-
Имейте готовый план действий, на случай атаки. Однажды он может пригодиться.
Оригинал: https://medium.com/simple-security/web-developer-security-checklist-f2e4f43c9c56
Github: https://github.com/virajkulkarni14/WebDeveloperSecurityChecklist