Как пройти аутентификацию в MySQL RDS с использованием аутентификации IAM DB и Python - PullRequest
0 голосов
/ 13 мая 2018

У меня есть AWS RDS DB с MySQL 5.6.39, с включенной аутентификацией IAM DB.

Прежде всего, я успешно завершил учебное пособие : настройка лямбда-функции для доступа к Amazon RDS вAmazon VPC , и это было моей отправной точкой для следующих шагов.

Я хочу войти в систему с учетными данными IAM и так, следуя this и this учебники я сделал:

  1. Когда я создал экземпляр RDS MySQL, я выбрал Enabling IAM database authentication.

  2. Создал пользователя с именем lambda:

    CREATE USER 'lambda' IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS';
    GRANT ALL PRIVILEGES ON test_db.* TO 'lambda'@'%';
    FLUSH PRIVILEGES;
    
  3. Создал политику IAM и прикрепил ее к роли, которую я использовал в качестве роли «Выполнение» для своей лямбда-функции:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "rds-db:connect"
          ],
          "Resource": [
            "<DB-ARN>/lambda"
          ]
        }
      ]
    }
    
  4. Создана лямбда-функция:

    import sys
    import boto3
    import logging
    import pymysql
    
    #rds settings
    rds_host  = "<RDS-ENDPOINT>"
    username = "lambda"
    db_name = "test_db"
    
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    
    client = boto3.client('rds',region_name='eu-west-2')
    token = client.generate_db_auth_token(rds_host,3306, name)
    ssl = {'ca': 'rds-combined-ca-bundle.pem'} 
    logger.info("token: "+ token)
    
    conn = pymysql.connect(rds_host, user=username, passwd=token, db=db_name, connect_timeout=5, ssl=ssl)
    
    logger.info("SUCCESS: Connection to RDS mysql instance succeeded")
    def handler(event, context):
      ...
    
  5. Я получил следующую ошибку:

    error: (1045, "Access denied for user 'lambda'@'<LAMBDA_IP>' (using password: YES)")
    

В попытке найтиЕсли это была ошибка Python, я использовал AWS CLI из экземпляра EC2 с прикрепленной политикой.

  1. Получить токен:

    aws rds generate-db-auth-token --hostname <RDS-ENDPOINT> --port 3306 --username lambda
    
  2. Подключитесь к БД, используя токен, полученный на последнем шаге:

    mysql -h <RDS-ENDPOINT> -u lambda --enable-cleartext-plugin --password='<TOKEN>'
    
  3. Я получил ту же ошибку:

    mysql: [Warning] Using a password on the command line interface can be insecure.
    ERROR 1045 (28000): Access denied for user 'lambda'@'<EC2_IP>' (using password: YES)
    

1 Ответ

0 голосов
/ 13 мая 2018

Политика неверна!

Resource - это не ARN DB, а "arn:aws:rds-db:<AWS_REGION>:<AWS_ACCOUNT_ID>:dbuser:<AWS_DB_RESOURCE_ID>/<DB_USERNAME>"

Чтобы получить эту информацию из консоли управления, вы можете перейти по адресу:

  • AWS_REGION - Код региона, например eu-west-2 или любой другой из здесь .
  • AWS_ACCOUNT_ID - получить его из Настройки учетной записи .
  • AWS_DB_RESOURCE_ID - Найдите его в Details\Configuration\Resource ID на странице БД, и он начинается с db-.
  • DB_USERNAME - lambda, поскольку он был создан на шаге 2.

Кстати, и как Майкл - sqlbot указал здесь и в этом ответе , генерация токена является локальной, поэтому получение его не должно интерпретироваться как получение правильного пароль.

...