promenadeco/doctrine-aws-auth

使用 IAM 对 Doctrine DBAL/ORM 进行 RDS 认证

1.1.1 2023-03-02 20:34 UTC

This package is not auto-updated.

Last update: 2024-09-27 04:07:20 UTC


README

此库提供使用 IAM 对 Amazon RDS 数据库进行认证的功能,用于 Doctrine DBAL / ORM。

功能

  • 使用短期令牌通过 IAM 进行 RDS 认证
  • 令牌缓存(默认为 10 分钟)
  • 支持 EC2 和 ECS 环境
  • 支持 PDO 和 MySQLi 驱动程序

用法

使用 Composer 安装包

composer require promenadeco/doctrine-aws-auth

使用以下环境变量启用 Doctrine ORM 的明文 IAM 认证

AWS_REGION=us-east-1
RDS_USE_IAM=1
LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN=1

Doctrine ORM

在 Doctrine ORM 中注册 DBAL 驱动程序中间件

use Doctrine\ORM\EntityManager;
use Doctrine\ORM\ORMSetup;
use Promenade\Doctrine\Aws\Auth\Driver\IamMiddleware;
use Promenade\Doctrine\Aws\Auth\Token\RdsToken;

// ...

$ormConfig = ORMSetup::createAnnotationMetadataConfiguration([
    'src/Entity',
]);

$tokenProvider = new RdsToken();
$ormConfig->setMiddlewares([
    new IamMiddleware($tokenProvider),
]);

$entityManager = EntityManager::create(
    [
        'host' => 'example-db.abcdefghijkl.us-east-1.rds.amazonaws.com',
        'port' => 3306,
        'user' => 'iam_user',
        'dbname' => 'test_db',
        'driver' => 'pdo_mysql',
        'driverOptions' => [
            PDO::MYSQL_ATTR_SSL_CA => '/etc/ssl/certs/ca-certificates.crt',
            PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false
        ],
    ],
    $ormConfig
);

加密

连接加密对于以明文形式安全传输凭证是必要的。

不同驱动程序的 SSL 配置不同,例如

[
    // ...
    'driver' => 'mysqli',
    'driverOptions' => [
        'flags' => MYSQLI_CLIENT_SSL,
    ],
]

缓存

激活令牌缓存以保持速率限制并提高性能

use Promenade\Doctrine\Aws\Auth\Token\CachingProxy;

// ...

$tokenProvider = new CachingProxy($tokenProvider, $ormConfig->getMetadataCache());

默认情况下,令牌有效期为 15 分钟,缓存 10 分钟以便提前更新。

Symfony

config/services.yaml 中注册 DBAL 驱动程序中间件

services:
    Promenade\Doctrine\Aws\Auth\Token\TokenProvider:
        class: Promenade\Doctrine\Aws\Auth\Token\RdsToken

    Promenade\Doctrine\Aws\Auth\Driver\IamMiddleware:
        tags: ['doctrine.middleware']

缓存

激活令牌缓存并根据需要调整其生命周期

services:
    Promenade\Doctrine\Aws\Auth\Driver\IamMiddleware:
        arguments:
            $tokenProvider: '@Promenade\Doctrine\Aws\Auth\Token\CachingProxy'

    Promenade\Doctrine\Aws\Auth\Token\RdsToken:
        arguments:
            $lifetime: 15

    Promenade\Doctrine\Aws\Auth\Token\CachingProxy:
        arguments:
            $lifetime: 14

确保令牌在缓存过期后一段时间内仍然有效,以补偿潜在的时钟漂移。

限制

IAM 认证依赖于数据库客户端以明文形式发送凭证而不进行散列。

此实现仅在 MySQL 上进行了测试。其他 RDBMS 可能有自己的独特限制。

资源

包含有用信息的相关资源

贡献

欢迎提交修复和改进的 Pull Requests!

许可证

版权所有 © Promenade Group。保留所有权利。

根据 Apache License, Version 2.0 许可。