ShardingSphere-Proxy — это прозрачный прокси базы данных, поддерживающий взаимодействие с любым клиентом по протоколам MySQL, PostgreSQL или openGauss.
Прокси обеспечивает аутентификацию пользователя и может адаптироваться к различным режимам аутентификации для различных протоколов базы данных. Однако есть вопрос, который редко поднимался и почти не имеет соответствующей проблемы даже в сообществе Github:
«Как ShardingSphere-Proxy аутентифицирует своих клиентов?»
Примечание.в этом сообщении обсуждается только аутентификация с помощью пароля и не рассматриваются методы аутентификации без пароля, такие как UDS (сокет домена Unix).
Справочная информация
Для начала давайте посмотрим, как несколько распространенных баз данных аутентифицируют своих пользователей.
MySQL
Взяв в качестве примера MySQL 5.7
, вы можете легко понять взаимодействие аутентификации между клиентом и сервером следующим образом:
- Клиент и сервер осуществляют рукопожатие протокола, включая согласование того, какой протокол аутентификации использовать. Значение по умолчанию:
mysql_native_password.
. - Сервер генерирует 20-байтовые случайные данные и отправляет их клиенту.
- На основе случайных данных клиент шифрует пароли, введенные пользователями, а затем отправляет зашифрованную информацию на сервер для проверки пароля. [1]
Выше приведено краткое описание встроенной аутентификации MySQL. Это может помочь нам понять, что происходит, когда пользователи вводят пароли.
Чтобы адаптироваться к различным сценариям, MySQL предоставляет несколько протоколов аутентификации в форме плагина [2].
mysql_native_password
: собственная аутентификация, используемая по умолчанию до версии 8.0.caching_sha2_password
: Аутентификация кэша на основе SHA-256, используемая по умолчанию после версии 8.0.mysql_clear_password
: аутентификация по паролю открытым текстом, подходящая для определенных сценариев.
Корпоративные версии MySQL также предоставляют подключаемые модули аутентификации, такие как:
authentication_windows
: проверка подлинности на основе служб Windows.authentication_ldap_simple
: Аутентификация на основе LDAP.
Теперь давайте взглянем на механизмы аутентификации PostgreSQL и openGauss.
PostgreSQL
Общие методы аутентификации для PostgreSQL [3] включают в себя:
scram-sha-256
: SHA-256аутентификация на основе SCRAM (механизм аутентификации с ответом на вызов с солью).md5
: с использованием шифрования MD5.password
: использование паролей открытым текстом.
openГаусс
Общие методы аутентификации для openGauss [4] включают:
scram-sha-256
: SHA-256аутентификация на основе SCRAM.md5
: с использованием шифрования MD5.sm3
: с использованием шифрования SM3.
Обзор
Как мощный прокси-сервер базы данных, ShardingSphere-Proxy поддерживает несколько протоколов базы данных и обеспечивает аутентификацию пользователей с помощью своего AuthenticationEngine.
Целью AuthenticationEngine является достижение подтверждения протокола и аутентификации личности.
ShardingSphere-Proxy поддерживает протоколы рукопожатия и аутентификации для MySQL, PostgreSQL и openGauss, а также предоставляет несколько алгоритмов аутентификации, в том числе:
MySQL
mysql_native_password
mysql_clear_password
PostgreSQL
md5
password
openGauss
md5
scram-sha-256
Обратите внимание, что в Proxy стандартными алгоритмами аутентификации для MySQL, PostgreSQL и openGauss являются mysql_native_password
, md5
и scram-sha-256
соответственно.
Настройка аутентификации ShardingSphere-Proxy
В версии 5.3.2 в ShardingSphere добавлены элементы конфигурации, связанные с аутентификатором, чтобы пользователи могли указывать алгоритмы аутентификации по мере необходимости при использовании прокси. Формат следующий:
authority: users: - user: # Combination of the authorized host and the username used to log in to the computer node. Format:<username>@<hostname>. When hostname is % an empty string, it indicates no limit to the authorized host. password: # User password. authenticationMethodName: # Optional, used to specify the password authentication method for users. authenticators: # Optional, no configuration is required by default. Proxy is automatically selected based on the front-end protocol type. authenticatorName: type: # Password authentication type. defaultAuthenticator: # It is optional that you can specify an authenticatorName as the default password authentication method. privilege: type: # Type of Authority provider, with a default value of ALL_PERMITTED.
AuthenticationMethodName
, authenticators
и defaultAuthenticator
являются необязательными и настраиваются только при необходимости.
Прокси также поддерживает настройку аутентификации на уровне пользователя, где пользователи могут использовать различные алгоритмы аутентификации.
Теперь давайте возьмем openGauss
в качестве примера, чтобы объяснить, как использовать недавно добавленный алгоритм аутентификации MD5 для входа в psql.
Подготовка
Перед выполнением конкретных настроек мы сравним производительность gsql
и psql
при подключении к прокси.
сервер.yaml
authority: users: - user: root@% password: root - user: sharding password: sharding props: proxy-frontend-database-protocol-type: openGauss
Примечание.
- Указываем
openGauss
как интерфейсный протокол. - Не указан тип аутентификации. Прокси принимает значение по умолчанию
scram-sha-256
.
config-sharding.yaml
databaseName: sharding_db dataSources: ds_0: url: jdbc:opengauss://127.0.0.1:15432/demo_ds username: username password: password connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 10 minPoolSize: 1
вход в gsql
Подключение успешно.
Здесь мы используем gsql в opengauss:3.1.0 для доступа к ShardingSphere-Proxy.
вход в psql
Ошибка подключения.
Мы видим, что на самом деле это связано с протоколом аутентификации.
Клиент psql по умолчанию требует аутентификации по протоколу md5, но поскольку для прокси-сервера требуется scram-sha-256 по протоколу openGuass, согласование завершается неудачей и генерируется исключение.
Следующие шаги
Теперь мы указываем MD5 в качестве метода аутентификации для сегментирования пользователей, сохраняя при этом настройку по умолчанию использования scram-sha-256
для поддержки разных пользователей и клиентов.
сервер.yaml
authority: users: - user: root@% password: root - user: sharding password: sharding authenticationMethodName: md5 authenticators: md5: type: MD5 scram_sha256: type: SCRAM_SHA256 # SCRAM_SHA256 is the SPI name that provides scram-sha-256 authentication alogorithm defaultAuthenticator: scram_sha256 props: proxy-frontend-database-protocol-type: openGauss
Примечания:
- Указываем
openGauss
как интерфейсный протокол. - Указываем
MD5
как алгоритм аутентификации для шардирования пользователей. - Указанная аутентификация по умолчанию остается
scram-sha-256
, что означает, что пользователям root требуется аутентификацияscram-sha-256
.
config-sharding.yaml
Остается неизменной.
вход в gsql
Подключение успешно.
psql войти как пользователь root
Ошибка подключения.
Psql не может подключиться, так как механизм аутентификации scram-sha-256
не поддерживается. Тогда как насчет пользователя шардинга?
psql войти как пользователь шардинга
Подключение успешно.
Теперь мы видим, что psql
успешно подключился к ShardingSphere-Proxy по протоколу openGuass.
Планы на будущее
В ShardingSphere уже реализована структура Proxy для различных протоколов баз данных и алгоритмов аутентификации. Мы также предоставили дополнительные алгоритмы аутентификации для нескольких протоколов баз данных. В будущем мы планируем расширить нашу поддержку алгоритмов аутентификации в более широком диапазоне протоколов баз данных.
Мы считаем, что наше сообщество является ключом к тому, чтобы сделать ShardingSphere лучше. Мы приглашаем больше людей присоединиться к нам и внести свой вклад в развитие проекта.
Краткое содержание
В этом посте мы обсудили настройку протоколов аутентификации для ShardingSphere-Proxy. Для получения дополнительной информации по этой теме, пожалуйста, обратитесь к официальной документации на нашем сайте [5].
Если у вас есть какие-либо вопросы или предложения по Apache ShardingSphere, задайте их в списке проблем GitHub [6] или посетите наше сообщество Slack [7] для дальнейшего обсуждения.
Полезные ссылки
[1] Собственная аутентификация MySQL
[2] Подключаемая аутентификация MySQL
[3] Аутентификация пароля PostgreSQL
[4] Справочник по файлу конфигурации openGauss