📦 shieldfy / API-Security-Checklist

📄 README-ru.md · 92 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92[English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [বাংলা](./README-bn.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ພາສາລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md)

# Контрольный список безопасности API
Чеклист наиболее важных контрмер по безопасности при разработке, тестировании и выпуске вашего API.


---

## Аутентификация
- [ ] Не используйте `Basic Auth`. Используйте стандартную проверку подлинности (например: JWT, OAuth).
- [ ] Не изобретайте велосипед для `аутентификации`, `создании токенов`, `хранения паролей`. Используйте стандарты, проверенные библиотеки.
- [ ] Используйте `Max Retry` и функции jail во время аутентификации.
- [ ] Используйте шифрование для всех конфиденциальных данных.

### JWT (JSON Web Token)
- [ ] Используйте случайный сложный ключ (`JWT Secret`), чтобы сделать брут форс токена бесполезным.
- [ ] Не полагайтесь на переданное в заголовках название алгоритма, лучше закрепите его константой на сервере (`HS256` или `RS256`).
- [ ] Сделайте срок действия токена (`TTL`, `RTTL`) как можно короче.
- [ ] Не храните конфиденциальные данные в JWT, его можно [легко декодировать.](https://jwt.io/#debugger-io).
- [ ] Избегайте хранения слишком большого количества данных. JWT обычно используется в header, и они имеют ограничение по размеру.

## Доступ
- [ ] Установите ограничение на кол-во запросов в минуту (Throttling, RPM-Limit), чтобы избежать DDoS / Brute Force атак.
- [ ] Используйте HTTPS на стороне сервера, чтобы избежать [MITM](https://ru.wikipedia.org/wiki/Атака_посредника) (Man In The Middle Attack / атака "человек посередине").
- [ ] Используйте заголовок `HSTS` (HTTP Strict Transport Security) с SSL, чтобы избежать атаки SSL Strip (перехват SSL соединений).
- [ ] Отключите списки каталогов.
- [ ] Для частных API, разрешите доступ только с IP-адресов/хостов из белого списка.

## Авторизация

### OAuth
- [ ] Всегда проверяйте `redirect_uri` на стороне сервера, чтобы разрешать только URL-адреса из белых списков (whitelist).
- [ ] Всегда старайтесь использовать одноразовый code, а не токены (не использовать `response_type=token`).
- [ ] Используйте параметр `state` со случайным хешем, чтобы предотвратить CSRF в процессе аутентификации OAuth.
- [ ] Определите scope по умолчанию, а также проверяйте параметры для каждого приложения.

## Запрос
- [ ] Используйте соответствующий HTTP-метод в соответствии с операцией: `GET (чтение)`, `POST (создание)`, `PUT / PATCH (замена / обновление)` и `DELETE (удаление)`, а также ответьте `405 Method Not Allowed`, если запрошенный метод не подходит для запрашиваемого ресурса.
- [ ] Проверяй тип данных в заголовке `Accept`, чтобы разрешить только поддерживаемые форматы (например, `application/xml`, `application/json` и т.д.) И отвечайте `406 Not Acceptable`, если тип не поддерживается.
- [ ] Проверяйте, сможете ли вы обработать тип получаемых данных (например, `application/x-www-form-urlencoded`, `multipart/form-data`, `application/json` и т.д.).
- [ ] Проверьте пользовательский ввод во избежание распространенных уязвимостей (например: `XSS`, `SQL-инъекций`, `удаленное выполнение кода` и т.д.).
- [ ] Не передавайте конфиденциальные данные (`учетные данные`, `пароли`, `токены` или `ключи API`) в URL-адресе, вместо него используйте стандартный заголовок `Authorization`.
- [ ] Используйте только шифрование на стороне сервера.
- [ ] Используйте единый API-шлюз, чтобы можно было настроить кеширование, ограничение на кол-во запросов, Spike Arrest, а также динамическое развертывание API.

## Обработка
- [ ] Проверьте, защищены ли все точки входа аутентификацией, чтобы не нарушить процедуру проверки подлинности.
- [ ] Следует избегать ID собственного ресурса. Используйте `/me/orders` вместо `/user/654321/orders`.
- [ ] Не используйте автоинкремент для ID. Вместо этого используйте `UUID`.
- [ ] Если вы разбираете XML-файлы, убедитесь, что парсинг сущностей выключен, чтобы избежать `XXE` (XML external entity).
- [ ] Если вы разбираете XML-файлы, убедитесь, что расширение сущности выключено, чтобы избежать `Billion Laughs / XML bomb` через атаку экспоненциального расширения сущностей.
- [ ] Используйте CDN для загрузки файлов.
- [ ] Если вы имеете дело с огромным количеством данных, используйте Workers and Queues, чтобы обрабатывать как можно больше в фоновом режиме и быстро возвращать ответ, чтобы избежать блокирования HTTP.
- [ ] Не забудьте выключить режим отладки (debug).
- [ ] Используйте неисполняемые stack когда они доступны.

## Ответ
- [ ] Отправляйте заголовок `X-Content-Type-Options: nosniff`.
- [ ] Отправляйте заголовок `X-Frame-Options: deny`.
- [ ] Отправляйте заголовок `Content-Security-Policy: default-src 'none'`.
- [ ] Удалите заголовки, которые могут помочь злоумышленнику в исследовании вашего ресурса на уязвимости - `X-Powered-By`, `Server`, `X-AspNet-Version` и т.д.
- [ ] Зафиксируйте `Content-Type` для вашего ответа, если вы возвращаете `application/json`, тогда запрос должен быть в `application/json`.
- [ ] Не возвращайте конфиденциальные данные, такие как `учетные данные`, `пароли`, `токены`.
- [ ] Возвращайте код состояния в соответствии с итогами обработки. (Например: `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed` и т.д.).

## Непрерывная интеграция и Непрерывная доставка (CI & CD)
- [ ] Проверяйте ваш проект во время CI/CD. Покрывайте код unit/интеграционными тестами.
- [ ] Используйте процесс проверки кода (Code Review) коллегами. Не апрувьте сами себя (no Self-Approval).
- [ ] Убедитесь, что ваше приложение сканируются с помощью антивирусов перед отправкой в прод, включая библиотеки и другие зависимости.
- [ ] Постоянно запускайте тесты безопасности (статический/динамический анализ) вашего кода.
- [ ] Проверьте свои зависимости (как программное обеспечение и ОС) на наличие известных уязвимостей.
- [ ] Сделайте возможным быстрый откат на предыдущую версию.

## Мониторинг
- [ ] Используйте централизованные входы для всех служб и компонентов.
- [ ] Используйте агенты для мониторинга всего трафика, ошибок, запросов, и ответов.
- [ ] Используйте оповещения для SMS, Slack, электронной почты, Telegram, Kibana, Cloudwatch, и т.д.
- [ ] Убедитесь, что вы не регистрируете какие-либо конфиденциальные данные, такие как кредитные карты, пароли, PIN-коды, и т.д.
- [ ] Используйте систему IDS и/или IPS для мониторинга запросов и экземпляров API.


---

## Смотрите также:
- [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - Сбор полезных ресурсов для создания RESTful HTTP+JSON API.


---

# Вклад
Не стесняйтесь вносить вклад, открывая этот репозиторий, внося некоторые изменения и отправляя `Pull Requests`. По любым вопросам напишите нам письмо по адресу `team@shieldfy.io`.