RUDE

Реализация аутентификации RDS IAM в приложении PHP/MySQL

CoderStudio, 25.04.2022 14:51
Реализация аутентификации RDS IAM в приложении PHP/MySQL

В этой статье пошагово показано, как пример кода PHP-приложения (работающего на EC2) работает для подключения экземпляра MySQL RDS с использованием аутентификации IAM.

Аутентификация IAM

  • Работает с MariaDB, MySQL и PostgreSQL
  • При подключении к экземпляру RDS вместо пароля базы данных используется токен аутентификации. Токены генерируются с помощью AWS Signature Version 4 со сроком действия 15 минут.
  • Сетевой трафик к базе данных и от нее шифруется с помощью Secure Socket Layer (SSL) или Transport Layer Security (TLS).
  • Не поддерживает все глобальные контекстные ключи условий и CNAME.
  • Подходит, когда приложению требуется менее 200 новых подключений к базе данных в секунду

Включение и отключение аутентификации IAM

Это можно сделать с помощью AWS Management Console, AWS CLI или API и включить/выключить при создании нового экземпляра, изменении экземпляра или восстановлении снимка базы данных.

выберите Пароль и аутентификация базы данных IAM, чтобы включить аутентификацию базы данных IAM
выберите Пароль и аутентификация базы данных IAM, чтобы включить аутентификацию базы данных IAM

Создание учетной записи пользователя db для аутентификации IAM

При использовании MariaDB или MySQL аутентификация обрабатывается AWS Authentication Plugin. После подключения к экземпляру RDS выполните следующую команду.

Примечание: Для выполнения этого шага необходимо войти в экземпляр RDS, используя учетные данные главного пользователя с помощью клиента MySQL.

CREATE USER testu IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS';

После создания учетной записи пользователя, как указано выше, пользователь может управлять привилегиями обычной учетной записи, изменяя их (GRANT, REVOKE, ALTER).

Создание политики IAM и прикрепление к EC2

На этом этапе создайте IAM роль, назначив сервис AWS в качестве доверенного лица и EC2 в качестве сценария использования. После создания IAM-роли настройте внутреннюю политику, чтобы разрешить пользователю доступ к базе данных.

Примечание: Убедитесь, что указанное имя пользователя базы данных совпадает с именем ресурса в политике IAM для доступа к базе данных IAM.

Следующий пример политики позволяет пользователю IAM подключаться к экземпляру базы данных, используя аутентификацию базы данных IAM.

{ "
Version": "2012-10-17 ",

"Statement": [ { "

Effect": "Allow ", "


Action": [ "
rds-db:connect
" ], "


Resource": [ "
arn:aws:rds-db:<регион>:<account-id>:dbuser:<resourceId>/<db-username>
" ]
}
]
}

Замените следующие слова соответствующим образом,

  • <регион> : Регион AWS для экземпляра БД
  • <account-id> : номер учетной записи AWS для экземпляра БД
  • <resourceId> : идентификатор ресурса экземпляра RDS. Этот идентификатор уникален для региона AWS, никогда не меняется и начинается с "db-"
  • <db-username> : имя учетной записи базы данных, которую нужно связать с аутентификацией IAM. Согласно этому примеру, учетная запись базы данных - testu.

После того, как все сделано с политикой, прикрепите роль к EC2, на котором запущено приложение.

Выберите ранее созданную IAM-роль и сохраните
Выберите ранее созданную IAM-роль и сохраните

Подключение к экземпляру RDS с помощью аутентификации IAM

Аутентификация базы данных IAM использует токен аутентификации при подключении к экземпляру БД. Токен аутентификации - это строка символов, которая используется вместо пароля.

Каждый токен аутентификации должен сопровождаться действительной подписью, используя подпись AWS версии 4. AWS SDK, например AWS SDK для Java или Python или PHP, может автоматически подписывать каждый создаваемый вами токен, а также может использоваться для программного создания и программной подписи токена аутентификации.

В этой статье описано, как подключиться из командной строки к экземпляру БД Amazon RDS с помощью AWS CLI и инструмента командной строки mysql.

Следующий пример PHP-кода показывает, как сгенерировать токен аутентификации с помощью AWS SDK, а затем использовать его для подключения к экземпляру под управлением MariaDB или MySQL.

<?php
$clusterEndpoint = "<ENDPOINT-URL>";
$clusterPort = <PORT>;
$clusterRegion = "<REGION>";
$dbUsername = "<USER-NAME>";
$dbDatabase = "USER";
// Установка AWS-PHP-SDK через Composer
require 'vendor/autoload.php';
use Aws\Credentials\CredentialProvider;
$provider = CredentialProvider::defaultProvider();
$RdsAuthGenerator = new Aws\Rds\AuthTokenGenerator($provider);
$token = $RdsAuthGenerator->createToken($clusterEndpoint . ":" . $clusterPort, $clusterRegion, $dbUsername);
$mysqli = mysqli_init();
$mysqli->ssl_set(NULL,NULL,'/home/global-bundle.pem',NULL,NULL);
$mysqli->real_connect($clusterEndpoint, $dbUsername, $token, $dbDatabase, $clusterPort);
if ($mysqli->connect_errno) {
echo "Ошибка: Failed to make a MySQL connection, here is why: <br />";
echo "Errno: " . $mysqli->connect_errno . "<br />";
echo "Ошибка: " . $mysqli->connect_error . "<br />";
exit;
}
/***** Пример кода для выполнения запроса и возврата всех таблиц в БД *****/
$tableList = array();
$res = mysqli_query($mysqli, "SHOW TABLES");
while($cRow = mysqli_fetch_array($res))
{
$tableList[] = $cRow[0];
}
echo '<pre>';
print_r($tableList);
echo '</pre>';

Замените следующие слова соответствующим образом,

  • <ENDPOINT-URL>: URL конечной точки RDS
  • <PORT> : порт конечной точки RDS
  • <REGION>: регион AWS
  • <USER-NAME>: имя пользователя базы данных. Согласно этому примеру, учетной записью базы данных является testu.

Для подключения и аутентификации клиента через IAM требуется SSL. Во время выполнения код ищет сертификат в том же каталоге, что и этот пример PHP-кода, чтобы загрузчик классов мог его найти. Используйте эту ссылку, чтобы получить пакет сертификатов, содержащий промежуточный и корневой сертификаты для всех регионов AWS.

Когда приведенный выше пример кода будет запущен на EC2, он вернет имена всех таблиц в базе данных USER , как показано ниже.

member и users - это таблицы в базе данных USER
member и users - это таблицы в базе данных USER