Прямой ответ
WebSocket безопасность требует аутентификации соединений и проверки origin, поэтому несанкционированный доступ к WebSocket prevented.
| Параметр | Что задаёт |
|---|---|
| Аутентификация | Проверка токена при подключении |
| Origin check | Проверка источника подключения |
| Rate limiting | Ограничение числа сообщений |
| Validation | Проверка формата сообщений |
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
import jwt
app = FastAPI()
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket, token: str):
try:
payload = jwt.decode(token, "secret", algorithms=["HS256"])
await websocket.accept()
except jwt.InvalidTokenError:
await websocket.close(code=4001)
Аутентификация при подключении проверяет токен, поэтому несанкционированный доступ к WebSocket prevented. О CORS настройке — в статье про CORS практику.
Аутентификация, origin check и защита
Аутентификация соединений проверяет токен при подключении, поэтому несанкционированный доступ к WebSocket prevented.
Аутентификация при подключении. Токен проверяется при подключении, поэтому несанкционированный доступ prevented.
Origin check. Источник подключения проверяется, поэтому подключения с неразрешённых источников отклоняются.
Rate limiting. Число сообщений ограничивается, поэтому DoS атаки prevented.
Практическое следствие: отсутствие аутентификации позволяет любому клиенту подключиться к WebSocket, поэтому несанкционированный доступ не prevented.
Отдельный аспект — валидация сообщений. Проверка формата сообщений предотвращает выполнение произвольных команд.
Три признака некорректной реализации WebSocket безопасности.
Отсутствие аутентификации. Любой клиент может подключиться, поэтому несанкционированный доступ не prevented.
Отсутствие origin check. Подключения с неразрешённых источников не отклоняются, поэтому атаки выполняются.
Отсутствие валидации сообщений. Произвольные команды выполняются, поэтому атаки выполняются.
О защите от атак — в статье про защиту API от атак; о WebSocket практике — в статье про WebSocket практику.
Проверка подключений и диагностика
Проверка аутентификации и origin при подключении предотвращает несанкционированный доступ к WebSocket.
Проверка токена. Токен проверяется при подключении, поэтому несанкционированный доступ prevented.
Проверка origin. Источник подключения проверяется, поэтому подключения с неразрешённых источников отклоняются.
Фиксация в логе. Запись подключений позволяет определить, когда и кем было установлено соединение при диагностике.
Практическое следствие: отсутствие проверки приводит к тому, что несанкционированный доступ к WebSocket не prevented.
Практика: настройка WebSocket безопасности
1. Аутентифицируйте соединения при подключении. Проверка токена при подключении предотвращает несанкционированный доступ.
2. Проверяйте origin подключения. Проверка источника предотвращает подключения с неразрешённых источников.
3. Ограничивайте число сообщений. Rate limiting предотвращает DoS атаки.
4. Валидируйте формат сообщений. Проверка формата предотвращает выполнение произвольных команд.
5. Фиксируйте подключения в логе. Запись подключений позволяет определить, когда и кем было установлено соединение.
6. Закрывайте неаутентифицированные соединения. Соединение без валидного токена закрывается, поэтому несанкционированный доступ prevented.
7. Используйте WSS вместо WS. Шифрование предотвращает перехват сообщений.
Рекомендации:
- Не пропускайте аутентификацию. Отсутствие аутентификации позволяет любому клиенту подключиться.
- Учитывайте origin check при настройке. Проверка источника предотвращает подключения с неразрешённых источников.
- Сопоставляйте rate limiting с нагрузкой. Ограничение числа сообщений предотвращает DoS атаки.
- Фиксируйте подключения в ошибке. Признак в записи ошибки позволяет определить, когда было установлено соединение.
- Пересматриваем rate limiting при изменении нагрузки. Рост числа клиентов требует изменения ограничения.
Практический сценарий: несанкционированный доступ к WebSocket
Контекст: несанкционированный клиент подключился к WebSocket, поэтому получил доступ к данным.
- Диагностика. Проверка показала, что аутентификация при подключении не выполнялась. Любой клиент мог подключиться к WebSocket, поэтому несанкционированный доступ не prevented.
- Причина. Аутентификация соединений не была настроена, поэтому несанкционированный доступ не prevented.
- Действия. (а) Добавили аутентификацию при подключении, чтобы токен проверялся; (б) добавили origin check, чтобы подключения с неразрешённых источников отклонялись; (в) настроили rate limiting, чтобы DoS атаки prevented; (г) добавили валидацию сообщений, чтобы произвольные команды не выполнялись; (д) настроили фиксацию подключений в логе для диагностики.
- Результат. Несанкционированный доступ к WebSocket prevented, поэтому данные защищены.
Вывод: отсутствие аутентификации позволяет любому клиенту подключиться к WebSocket. Аутентификация при подключении и проверка origin предотвращают несанкционированный доступ.
Дополнительная защита
Таймаут соединения. Соединение закрывается при отсутствии активности, поэтому ресурсы не расходуются на неактивные соединения.
Ограничение размера сообщений. Ограничение размера предотвращает перегрузку сервера большими сообщениями.
Пинг-понг механизм. Периодическая проверка активности соединения обнаруживает разрыв соединения, поэтому ресурсы освобождаются.
Ограничение числа одновременных соединений. Ограничение предотвращает исчерпание ресурсов сервера.
Валидация формата сообщений. Проверка формата предотвращает выполнение произвольных команд через сообщения.
Мониторинг подключений. Мониторинг обнаруживает аномальную активность подключений, поэтому атаки выявляются.
Практическое следствие: отсутствие таймаута, ограничения размера, пинг-понг механизма, ограничения числа соединений, валидации формата и мониторинга позволяет расходование ресурсов, перегрузку сервера и выполнение произвольных команд.
Практический сценарий: несанкционированный доступ к WebSocket
Контекст: несанкционированный клиент подключился к WebSocket, поэтому получил доступ к данным.
- Диагностика. Проверка показала, что аутентификация при подключении не выполнялась. Любой клиент мог подключиться к WebSocket, поэтому несанкционированный доступ не prevented.
- Причина. Аутентификация соединений не была настроена, поэтому несанкционированный доступ не prevented.
- Действия. (а) Добавили аутентификацию при подключении, чтобы токен проверялся; (б) добавили origin check, чтобы подключения с неразрешённых источников отклонялись; (в) настроили rate limiting, чтобы DoS атаки prevented; (г) добавили валидацию сообщений, чтобы произвольные команды не выполнялись; (д) настроили фиксацию подключений в логе для диагностики.
- Результат. Несанкционированный доступ к WebSocket prevented, поэтому данные защищены.
Вывод: отсутствие аутентификации позволяет любому клиенту подключиться к WebSocket. Аутентификация при подключении и проверка origin предотвращают несанкционированный доступ.
FAQ
Как аутентифицируются WebSocket соединения? Проверка токена выполняется при подключении. Соединение без валидного токена закрывается, поэтому несанкционированный доступ prevented.
Зачем нужен origin check? Проверка источника подключения предотвращает подключения с неразрешённых источников. Отсутствие проверки позволяет атаки с произвольных источников.
Как защищаются от DoS атак? Через rate limiting, ограничивающий число сообщений. Ограничение предотвращает перегрузку сервера.
Почему важен WSS вместо WS? Шифрование предотвращает перехват сообщений. WS передаёт сообщения в открытом виде, поэтому они могут быть перехвачены.
Источники: RFC 6455, OWASP WebSocket Attacks, FastAPI WebSockets — ссылки в шапке.