Я создаю систему, которая должна собирать некоторые конфиденциальные данные пользователя через защищенное веб-соединение, безопасно хранить их на сервере для последующего автоматического дешифрования и повторного использования. Система также должна позволять пользователю просматривать некоторую часть защищенных данных (например, *****ze
) и / или полностью изменять их через Интернет. Система должна обеспечивать разумный уровень безопасности.
Я думал о следующей инфраструктуре:
Сервер приложений (веб) 1
Веб-сервер с надлежащей поддержкой TLS для защищенных веб-соединений.
Используйте алгоритм с открытым ключом (например, RSA), чтобы зашифровать введенные конфиденциальные данные пользователя и отправить их на Сервер приложений 2 через односторонний исходящий защищенный канал (например, ssh-2), не сохраняя их где-либо на Сервер приложений 1 или Сервер БД 1.
Используйте алгоритм симметричного ключа, зависящий от пароля пользователя, чтобы зашифровать некоторую часть введенных данных (например, последние несколько букв / цифр) и сохранить их на сервере БД 1 для последующего извлечения с помощью сервера приложений 1 во время веб-сеанса пользователя.
Повторно используйте шаг 2 для изменения данных пользователем через Интернет.
Сервер БД 1
- Храните незащищенные и не конфиденциальные данные пользователей.
- Храните часть конфиденциальных данных пользователя в зашифрованном виде на сервере приложений 1 (см. Шаг 3 выше).
Сервер приложений 2
- НЕ НИКОГДА отправляйте что-либо НА Сервер приложений 1 или Сервер БД 1.
- Получите зашифрованные конфиденциальные данные пользователя с сервера приложений 1 и сохраните их на сервере БД 2.
- Получите зашифрованные конфиденциальные данные пользователя с сервера БД 2 в соответствии с локальным расписанием, расшифруйте их с помощью закрытого ключа (см. Сервер приложений 1, шаг 2), хранящегося локально в приложении. Сервер 2 с правильным управлением ключами.
Сервер БД 2
- Храните зашифрованные конфиденциальные данные пользователя (см. Сервер приложений 2, шаг 2)
Если либо Сервер приложений (веб) 1, либо Сервер БД 1 либо оба будут скомпрометированы, злоумышленник не сможет получить какие-либо конфиденциальные данные пользователя (зашифрованные или нет). Все, что будет у злоумышленника, - это доступ к открытым ключам и алгоритмам шифрования, которые и так хорошо известны. Однако злоумышленник сможет изменить веб-сервер, чтобы получить пароли зарегистрированных пользователей в открытом виде и расшифровать часть конфиденциальных данных пользователя, хранящихся на сервере БД 1 (см. Сервер приложений 1, шаг 3), чего я не делаю. не считаю большим делом. Злоумышленник сможет (посредством модификации кода) также перехватить конфиденциальные данные пользователя, введенные пользователями через Интернет во время потенциальной атаки. Позже я рассматриваю как более высокий риск, но при условии, что злоумышленнику сложно (не так ли?) Изменить код, не заметив того, что кто-то не заметит, я думаю, мне не стоит сильно об этом беспокоиться.
Если Сервер приложений 2 и закрытый ключ скомпрометированы, злоумышленник получит доступ ко всему, но Сервер приложений 2 или Сервер БД 2 не имеют доступа в Интернет. так что это не должно быть проблемой.
Насколько безопасна эта архитектура? Правильно ли я понимаю, как работают алгоритмы шифрования и защищенные протоколы?
Спасибо!