- Вопрос или проблема
- Ответ или решение
- 1. Начальная настройка
- Создание баз данных:
- Генерация секрета JWT:
- Валидаторы для данных и разрешений:
- Создание учетной записи администратора:
- 2. Запуск приложения:
- 3. Процесс регистрации пользователя:
- 4. Процесс входа в систему:
- 5. Основные операции с базой данных:
- Дополнительные улучшения безопасности:
- Заключение
Вопрос или проблема
Я создаю саморазмещаемое приложение, которое полагается на CouchDB для хранения своих данных. Клиент (React) может получить доступ к базе данных, которая проксируется сервером Express по адресу myapp.com/database
. Сервер также должен иметь доступ к базе данных. Вот что я могу придумать для первого процесса запуска:
- Создать базы данных
- Сгенерировать случайный секрет JWT и сохранить его где-то
- Создать функции валидаторов для данных и разрешений
- Закончить админскую партию, создав учетную запись администратора (учетные данные сгенерированы случайным образом и сохранены где-то с секретом)
Когда приложение запускается:
- Удалить из
_users
всехend_user
- Сгенерировать UUID экземпляра и сохранить его в памяти.
Процесс регистрации пользователя (который может произойти только один или два раза на сервере):
- На клиенте отправить запрос
PUT /api/users
с именем пользователя и паролем - При получении этого запроса сервер генерирует безопасный хэш и соль, используя password-hash-and-salt, и затем сохраняет их в
app_users
(коллекция, доступная только пользователю-администратору – контроль через приложение на Node)
Базовый процесс входа
- На клиенте отправить запрос
PUT /api/sessions
- На сервере, получив запрос, создать нового
_users
с сгенерированным случайным паролем с рольюend_user
и в качестве_id
users/:uid/:username
(гдеuid
– это UUID, сгенерированный при запуске сервера) - Сохранить сгенерированный пароль в памяти
- Всё ещё на сервере, подписать JWT на 1 неделю, который включает имя пользователя и ID экземпляра, и вернуть его клиенту
- Поставить таймаут на 1 неделю на удаление созданного
_user
.
Основные операции с базой данных:
- На клиенте отправить запрос к
/database/posts
(например), с токеном сессии в заголовках - На сервере перехватить запрос, прочитать заголовок сессии, проверить его и затем получить базу данных, сохраненную в (3) процесса входа. Заменить заголовок Авторизации на закодированный в Base64
password:username
. - Если у пользователя нет действительного токена, не проксировать, а вернуть 401.
Этот процесс позволяет сделать несколько вещей:
- Убедиться, что клиент никогда не знает ни одного пароля базы данных
- Клиент CouchDB будет отправлять в заголовке кодировку Base64 имени пользователя/пароля. Это избегает отправки пароля/имени пользователя в каждом запросе и, таким образом, уменьшает потенциальную поверхность атаки.
- Это позволяет создавать настраиваемые политики сессий, такие как истечение через 1 неделю или, возможно, правила для паролей (например, минимальная энтропия)
- Клиенту не нужно долго хранить пароль в памяти.
Насколько безопасным был бы этот поток аутентификации?
Проблема, касающаяся вашего потока, заключается в использовании учетных данных, закодированных в Base64, по сети, которые всегда уязвимы для прослушивания.
Первое решение этой проблемы – обеспечить использование TLS с защищенным шифром. Шифрование SSL/TLS теперь поддерживается с версии CouchDB 3.0. Гораздо лучше избавиться от небезопасной аутентификации через URI Basic HTTP, которую CouchDB использовал по умолчанию (http://user:[email protected]).
Ответ или решение
Разработка системы аутентификации между клиентом, сервером и базой данных CouchDB — это важный аспект безопасности вашего приложения. Рассмотрим предложенные вами шаги и некоторые моменты, которые следует учесть для повышения безопасности.
1. Начальная настройка
Создание баз данных:
- Необходимо создать все необходимые базы данных перед началом работы приложения.
Генерация секрета JWT:
- Случайно сгенерированный секрет JWT следует хранить в защищенном месте, желательно в переменных окружения или в безопасном хранилище конфигураций.
Валидаторы для данных и разрешений:
- Создайте функции валидаторов, которые будут проверять данные, поступающие от клиента, и управлять разрешениями для разных уровней доступа.
Создание учетной записи администратора:
- Создайте учетную запись администратора с уникальными, надежными учетными данными и сохраните их в безопасном месте.
2. Запуск приложения:
- Убедитесь, что все учетные записи
end_user
в_users
удалены перед запуском приложения. - Сгенерируйте уникальный UUID для экземпляра приложения и сохраните его в памяти.
3. Процесс регистрации пользователя:
- Клиент отправляет запрос
PUT /api/users
с именем пользователя и паролем. - Сервер принимает запрос, генерирует безопасный хэш и соль с использованием
password-hash-and-salt
и сохраняет их в коллекциюapp_users
, доступную только для аккаунта администратора.
4. Процесс входа в систему:
- Клиент отправляет запрос
PUT /api/sessions
. - Сервер создает новую запись в
_users
с помощью случайно сгенерированного пароля и присваивает ей рольend_user
, используя_id
в форматеusers/:uid/:username
, гдеuid
— это ранее сгенерированный UUID. - Сохраните сгенерированный пароль в памяти сервера.
- Сервер создает JWT с 1-недельным сроком действия, включающий имя пользователя и идентификатор экземпляра, а затем возвращает его клиенту.
- Установите таймер на удаление созданного пользователя через неделю.
5. Основные операции с базой данных:
- Клиент отправляет запрос на
/database/posts
с токеном сессии в заголовках. - Сервер перехватывает запрос, проверяет токен сессии и извлекает сохраненные учетные данные из шага 3 процесса входа. Заголовок
Authorization
заменяется на базовое64 кодированиеpassword:username
. - Если токен недействителен, сервер возвращает статус 401.
Дополнительные улучшения безопасности:
-
Шифрование трафика: Обязательно используйте TLS для защиты данных во время передачи. CouchDB поддерживает SSL/TLS с версии 3.0. Это значительно улучшает безопасность по сравнению с незащищенной аутентификацией HTTP.
-
Хранение паролей: Убедитесь, что пароли хранятся в зашифрованном виде и безопасном контексте, чтобы предотвратить их утечку.
-
Политики безопасности: Дополнительно развивайте политики управления сессиями, чтобы учитывать не только срок действия токенов, но и правила по сложности паролей и другие аспекты безопасности.
Заключение
Предложенная архитектура аутентификации между клиентом, сервером и CouchDB имеет свои плюсы и минусы. Если вы будете следовать указанным рекомендациям по улучшению безопасности, это значительно укрепит защиту вашей системы. Тем не менее, всегда оставайтесь в курсе новых уязвимостей и обновляйте свои методы безопасности, чтобы не допустить утечки данных.