Implementierung der RDS IAM-Authentifizierung in einer PHP/MySQL-Anwendung

CoderStudio, 25.04.2022 14:51
Implementierung der RDS IAM-Authentifizierung in einer PHP/MySQL-Anwendung

Dieser Artikel zeigt Schritt für Schritt, wie der Code einer Beispiel-PHP-Anwendung (die auf EC2 läuft) funktioniert, um eine Verbindung zur MySQL-RDS-Instanz mit IAM-Authentifizierung herzustellen.

IAM-Authentifizierung

  • Funktioniert mit MariaDB, MySQL und PostgreSQL
  • Bei der Verbindung mit der RDS-Instanz wird ein Authentifizierungs-Token anstelle des DB-Passworts verwendet. Die Token werden mit AWS Signature Version 4 mit einer Lebensdauer von 15 Minuten generiert
  • Der Netzwerkverkehr zur und von der Datenbank wird mit Secure Socket Layer (SSL) oder Transport Layer Security (TLS) verschlüsselt
  • Unterstützt nicht alle globalen Bedingungskontextschlüssel und CNAMEs
  • Geeignet, wenn die Anwendung weniger als 200 neue Datenbankverbindungen pro Sekunde benötigt

Aktivieren und Deaktivieren der IAM-Authentifizierung

Dies kann über die AWS Management Console, die AWS CLI oder die API erfolgen und kann beim Erstellen einer neuen Instanz, beim Ändern der Instanz oder beim Wiederherstellen des db-Snapshots aktiviert/deaktiviert werden.

wählen Sie Passwort und IAM-Datenbankauthentifizierung, um die IAM-Datenbankauthentifizierung zu aktivieren
wählen Sie Passwort und IAM-Datenbankauthentifizierung, um die IAM-Datenbankauthentifizierung zu aktivieren

Erstellen eines db-Benutzerkontos für IAM auth

Bei MariaDB oder MySQL wird die Authentifizierung über das AWS Authentication Plugin abgewickelt. Nachdem Sie sich mit der RDS-Instanz verbunden haben, führen Sie den folgenden Befehl aus.

Hinweis: Um diesen Schritt abzuschließen, müssen Sie sich bei der RDS-Instanz mit den Master-Benutzeranmeldeinformationen über den MySQL-Client anmelden.

CREATE USER testu IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS';

Nach der Erstellung des Benutzerkontos, wie oben beschrieben, kann der Benutzer seine Rechte wie ein normales Konto verwalten und ändern (GRANT, REVOKE, ALTER)

IAM-Richtlinie erstellen und mit EC2 verknüpfen

In diesem Schritt erstellen Sie eine IAM-Rolle, indem Sie AWS Service als vertrauenswürdige Entität und EC2 als Anwendungsfall zuweisen. Nachdem Sie die IAM-Rolle erstellt haben, richten Sie eine Inline-Richtlinie ein, um dem Benutzer den Datenbankzugriff zu ermöglichen.

Hinweis: Stellen Sie sicher, dass der angegebene Datenbankbenutzername mit einer Ressource in der IAM-Richtlinie für den IAM-Datenbankzugriff übereinstimmt.

Die folgende Beispielrichtlinie erlaubt einem IAM-Benutzer die Verbindung zu einer DB-Instanz mit IAM-Datenbankauthentifizierung.

{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
             "rds-db:connect"
         ],
         "Resource": [
             "arn:aws:rds-db:<strong><<em>region</em>></strong>:<strong><<em>account-id</em>></strong>:dbuser:<strong><r</strong><strong><em>esourceId</em>></strong>/<strong><<em>db-username</em>></strong>"
         ]
      }
   ]
}

Ersetzen Sie die folgenden Angaben entsprechend,

  • <region>: AWS-Region für die DB-Instanz
  • <account-id>: AWS-Kontonummer für die DB-Instanz
  • <resourceId>: Ressourcen-ID der RDS-Instanz. Diese Kennung ist für eine AWS-Region eindeutig, ändert sich nie und beginnt mit "db-"
  • <db-username>: der Name des Datenbankkontos, das mit der IAM-Authentifizierung verknüpft werden soll. In diesem Beispiel ist das Datenbankkonto testu .

Nachdem alles mit der Richtlinie erledigt ist, fügen Sie die Rolle der EC2 zu, auf der die Anwendung ausgeführt wird.

wählen Sie die zuvor erstellte IAM-Rolle und speichern Sie
wählen Sie die zuvor erstellte IAM-Rolle und speichern Sie

Verbinden mit der RDS-Instanz unter Verwendung der IAM-Authentifizierung

Die IAM-Datenbankauthentifizierung verwendet ein Authentifizierungstoken, wenn eine Verbindung zur DB-Instanz hergestellt wird. Ein Authentifizierungs-Token ist eine Zeichenfolge, die anstelle eines Passworts verwendet wird.

Jedes Authentifizierungs-Token muss von einer gültigen Signatur begleitet sein, die AWS-Signatur Version 4 verwendet. AWS SDK, wie z. B. das AWS SDK für Java oder Python oder PHP, kann jedes Token, das Sie erstellen, automatisch signieren und es kann verwendet werden, um ein Authentifizierungs-Token programmatisch zu erstellen und programmatisch zu signieren.

Dieser Artikel zeigt, wie man sich von der Kommandozeile aus mit einer Amazon RDS DB-Instanz mit der AWS CLI und dem mysql Kommandozeilen-Tool verbindet.

Der folgende PHP-Beispielcode zeigt, wie ein Authentifizierungs-Token mit dem AWS SDK generiert und dann zur Verbindung mit einer Instanz mit MariaDB oder MySQL verwendet wird.

<?php$clusterEndpoint =
 "<strong><ENDPOINT-URL></strong>";
$clusterPort = <strong><PORT></strong>;
$clusterRegion="<strong><REGION></strong>";
$dbUsername="<strong><USER-NAME></strong>";
$dbDatabase="USER";
// AWS-PHP-SDK installed via Composerrequire
 '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
 "Error: Failed to make a MySQL connection, here ist why: <br />";
echo "Errno: " . $mysqli->connect_errno . "<br />";
echo "Fehler: " . $mysqli->connect_error . "<br />";
exit;
}/_***** Example code to perform a query and return all tables in the DB /$tableList = array
();
$res = mysqli_query($mysqli, "SHOW TABLES");
while($cRow = mysqli_fetch_array($res))
{$tableList
[] = $cRow[0];
}echo
 '<pre>';
print_r($tableList);
echo '</pre>';

Ersetzen Sie die folgenden Zeilen entsprechend,

  • <ENDPOINT-URL>: RDS-Endpunkt-URL
  • <PORT> : Port des RDS-Endpunkts
  • <REGION>: AWS-Region
  • <USER-NAME>: db-Benutzername. In diesem Beispiel ist das Datenbankkonto testu

SSL ist erforderlich, damit der Client eine Verbindung herstellen und sich über IAM authentifizieren kann. Zur Laufzeit sucht der Code das Zertifikat im gleichen Verzeichnis wie dieses PHP-Codebeispiel, damit der Klassenlader es finden kann. Verwenden Sie diesen Link, um ein Zertifikatspaket zu erhalten, das sowohl die Zwischen- als auch die Stammzertifikate für alle AWS-Regionen enthält.

Wenn der obige Beispielcode in EC2 ausgeführt wird, gibt er alle Tabellennamen in der Datenbank USER wie unten dargestellt zurück.

member & users sind Tabellen in der USER db
member & users sind Tabellen in der USER db

Weitere Lektüre