Вопрос или проблема
Я хочу настроить мой кластер ETCD, чтобы одновременно включить аутентификацию с использованием TLS-сертификата и пароля (для одного и того же соединения, а не просто включить два механизма аутентификации).
Чтобы клиент смог аутентифицироваться, он должен:
- предоставить действительный сертификат с именем пользователя, установленным в общем имени, и подписанный доверенным корневым центром сертификации
- предоставить пароль для этого конкретного пользователя
Я хочу сделать это для повышения безопасности. Таким образом, даже если мой клиентский сертификат или мой коренной центр сертификации будут скомпрометированы, все равно потребуется пароль для аутентификации.
Мне удалось включить аутентификацию по паролю без TLS, но если я включаю аутентификацию клиента по TLS (с помощью --client-cert-auth=true
при запуске кластера), она больше не запрашивает пароль (хотя у пользователя он есть).
Я запустил свой кластер из 3 узлов с помощью следующей команды (соответственно изменяя переменные окружения для каждого узла):
etcd --name ${THIS_NAME} --data-dir data/etcd/${TOKEN} \
--initial-cluster ${CLUSTER} --initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN} \
--initial-advertise-peer-urls https://${THIS_IP}:2380 --listen-peer-urls https://${THIS_IP}:2380 \
--peer-client-cert-auth --peer-trusted-ca-file=ca.pem \
--peer-cert-file=member.pem --peer-key-file=member-key.pem \
--advertise-client-urls https://${THIS_IP}:2379 --listen-client-urls https://${THIS_IP}:2379 \
--client-cert-auth --trusted-ca-file=ca.pem \
--cert-file=server.pem --key-file=server-key.pem
А аутентификацию я включил так:
etcdctl --endpoints=$ENDPOINTS --cacert=ca.pem --cert=root.pem --key=root-key.pem user add root --new-user-password=root
etcdctl --endpoints=$ENDPOINTS --cacert=ca.pem --cert=root.pem --key=root-key.pem role add root
etcdctl --endpoints=$ENDPOINTS --cacert=ca.pem --cert=root.pem --key=root-key.pem user grant-role root root
etcdctl --endpoints=$ENDPOINTS --cacert=ca.pem --cert=root.pem --key=root-key.pem auth enable
Обратите внимание, что прежде чем я включу аутентификацию, мне все равно нужно предоставить действительный клиентский сертификат, он просто не проверяет CN клиента для аутентификации существующего пользователя, в то время как после этого проверяет.
Я не могу найти, как это сделать в документации. Так возможно ли это сделать и если да, то как?
Ответ или решение
К сожалению, настройка ETCD для одновременной аутентификации с использованием TLS-сертификата и пароля не поддерживается в текущих версиях. Эта особенность ETCD препятствует возможности комбинирования двух методов аутентификации в одной сессии. В данной статье мы подробно рассмотрим особенности аутентификации в ETCD, проанализируем ваши шаги и предложим рекомендации.
1. Понимание аутентификации в ETCD
ETCD использует аутентификацию по сертификатам TLS и механизмы на основе паролей, но они функционируют отдельно. Когда вы активируете TLS аутентификацию клиента с помощью --client-cert-auth
, ETCD требует только действительный сертификат для аутентификации пользователя, который должен быть подписан доверенным центром сертификации и иметь имя пользователя в поле "common name" (CN).
2. Ваши шаги и конфигурация
На основе вашей конфигурации:
etcd --name ${THIS_NAME} --data-dir data/etcd/${TOKEN} \
--initial-cluster ${CLUSTER} --initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN} \
--initial-advertise-peer-urls https://${THIS_IP}:2380 --listen-peer-urls https://${THIS_IP}:2380 \
--peer-client-cert-auth --peer-trusted-ca-file=ca.pem \
--peer-cert-file=member.pem --peer-key-file=member-key.pem \
--advertise-client-urls https://${THIS_IP}:2379 --listen-client-urls https://${THIS_IP}:2379 \
--client-cert-auth --trusted-ca-file=ca.pem \
--cert-file=server.pem --key-file=server-key.pem
Вы правильно активировали аутентификацию с помощью TLS, но после этого, когда включаете аутентификацию пользователей через команду etcdctl user add
, функция аутентификации по паролю не срабатывает, так как работа с сертификатами уже достаточно для входа.
3. Необходимые разъяснения
На текущий момент, под управлением ETCD, авторизация пользователя происходит через SSL/TLS, что включает в себя только проверку сертификата. Назначение пароля не предусмотрено в этой логике; следовательно, пароль не требует проверки после успешной аутентификации по сертификату. Таким образом, вы попадаете в ситуацию, когда либо предоставляется аутентификация по сертификату, либо используются другие методы, но не одновременно.
4. Альтернативные подходы для повышения безопасности
Хотя комбинирование методов аутентификации, как вы хотели, невозможно, есть несколько способов повышения безопасности системы:
- Кратковременные сертификаты и регулярная ротация паролей. Чем чаще вы будете менять сертификаты и пароли, тем меньше вероятность скомпрометирования.
- Использование двухфакторной аутентификации (2FA). Например, добавление дополнительного уровня безопасности, например, через системы управления доступом, может быть хорошей альтернативой.
- Мониторинг и аудит. Внедрение логирования и мониторинга позволит выявить аномалии в доступе, что также повысит общую защищенность.
Заключение
Хотя ваша идея об одновременной аутентификации с использованием TLS и пароля кажется разумной с точки зрения безопасности, в текущих версиях ETCD это невозможно. Следует обратить внимание на улучшение других аспектов безопасности и рассмотреть возможность использования дополнительных мер для защиты ваших данных. Рекомендуем активно следить за обновлениями ETCD, так как новая функциональность может появиться в будущем.