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
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.
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,
Nachdem alles mit der Richtlinie erledigt ist, fügen Sie die Rolle der EC2 zu, auf der die Anwendung ausgeführt wird.
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,
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.
Weitere Lektüre