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

[5] Аутентификация и авторизация ShardingSphere-Proxy

[6] Список проблем GitHub

[7] Слабое сообщество