Чеклист по безопасности для веб-разработчика [Перевод]

Перевод статьи о том, как защитить ваш веб-сервис от злоумышлеников от 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

Written on June 5, 2018