Разработка системы аутентификации между клиентом, сервером и базой данных CouchDB

Вопрос или проблема

Я создаю саморазмещаемое приложение, которое полагается на CouchDB для хранения своих данных. Клиент (React) может получить доступ к базе данных, которая проксируется сервером Express по адресу myapp.com/database. Сервер также должен иметь доступ к базе данных. Вот что я могу придумать для первого процесса запуска:

  • Создать базы данных
  • Сгенерировать случайный секрет JWT и сохранить его где-то
  • Создать функции валидаторов для данных и разрешений
  • Закончить админскую партию, создав учетную запись администратора (учетные данные сгенерированы случайным образом и сохранены где-то с секретом)

Когда приложение запускается:

  • Удалить из _users всех end_user
  • Сгенерировать UUID экземпляра и сохранить его в памяти.

Процесс регистрации пользователя (который может произойти только один или два раза на сервере):

  1. На клиенте отправить запрос PUT /api/users с именем пользователя и паролем
  2. При получении этого запроса сервер генерирует безопасный хэш и соль, используя password-hash-and-salt, и затем сохраняет их в app_users (коллекция, доступная только пользователю-администратору – контроль через приложение на Node)

Базовый процесс входа

  1. На клиенте отправить запрос PUT /api/sessions
  2. На сервере, получив запрос, создать нового _users с сгенерированным случайным паролем с ролью end_user и в качестве _id users/:uid/:username (где uid – это UUID, сгенерированный при запуске сервера)
  3. Сохранить сгенерированный пароль в памяти
  4. Всё ещё на сервере, подписать JWT на 1 неделю, который включает имя пользователя и ID экземпляра, и вернуть его клиенту
  5. Поставить таймаут на 1 неделю на удаление созданного _user.

Основные операции с базой данных:

  1. На клиенте отправить запрос к /database/posts (например), с токеном сессии в заголовках
  2. На сервере перехватить запрос, прочитать заголовок сессии, проверить его и затем получить базу данных, сохраненную в (3) процесса входа. Заменить заголовок Авторизации на закодированный в Base64 password:username.
  3. Если у пользователя нет действительного токена, не проксировать, а вернуть 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. Процесс регистрации пользователя:

  1. Клиент отправляет запрос PUT /api/users с именем пользователя и паролем.
  2. Сервер принимает запрос, генерирует безопасный хэш и соль с использованием password-hash-and-salt и сохраняет их в коллекцию app_users, доступную только для аккаунта администратора.

4. Процесс входа в систему:

  1. Клиент отправляет запрос PUT /api/sessions.
  2. Сервер создает новую запись в _users с помощью случайно сгенерированного пароля и присваивает ей роль end_user, используя _id в формате users/:uid/:username, где uid — это ранее сгенерированный UUID.
  3. Сохраните сгенерированный пароль в памяти сервера.
  4. Сервер создает JWT с 1-недельным сроком действия, включающий имя пользователя и идентификатор экземпляра, а затем возвращает его клиенту.
  5. Установите таймер на удаление созданного пользователя через неделю.

5. Основные операции с базой данных:

  1. Клиент отправляет запрос на /database/posts с токеном сессии в заголовках.
  2. Сервер перехватывает запрос, проверяет токен сессии и извлекает сохраненные учетные данные из шага 3 процесса входа. Заголовок Authorization заменяется на базовое64 кодирование password:username.
  3. Если токен недействителен, сервер возвращает статус 401.

Дополнительные улучшения безопасности:

  • Шифрование трафика: Обязательно используйте TLS для защиты данных во время передачи. CouchDB поддерживает SSL/TLS с версии 3.0. Это значительно улучшает безопасность по сравнению с незащищенной аутентификацией HTTP.

  • Хранение паролей: Убедитесь, что пароли хранятся в зашифрованном виде и безопасном контексте, чтобы предотвратить их утечку.

  • Политики безопасности: Дополнительно развивайте политики управления сессиями, чтобы учитывать не только срок действия токенов, но и правила по сложности паролей и другие аспекты безопасности.

Заключение

Предложенная архитектура аутентификации между клиентом, сервером и CouchDB имеет свои плюсы и минусы. Если вы будете следовать указанным рекомендациям по улучшению безопасности, это значительно укрепит защиту вашей системы. Тем не менее, всегда оставайтесь в курсе новых уязвимостей и обновляйте свои методы безопасности, чтобы не допустить утечки данных.

Оцените материал
Добавить комментарий

Капча загружается...