AWS RDS: java.sql.SQLException: пользователю отказано в доступе

#mysql #amazon-web-services #amazon-rds #amazon-iam

#mysql #amazon-веб-сервисы #amazon-rds #amazon-iam

Вопрос:

Я знаю, что этот вопрос поднимался пару раз, но предложенные предложения не работают для меня. Итак, вот немного контекста того, что я пытаюсь сделать.

У меня есть база данных MySQL RDS, к которой я пытаюсь получить программный доступ, используя роль IAM из кластера EMR. Я могу войти в базу данных как пользователь root без каких-либо проблем, после чего я сделал следующее

  1. Вошел в БД как администратор, а затем создал пользователя

    create user my_user identified with AWSAuthenticationPlugin as 'RDS' .

  2. grant usage on db_name.* to 'my_user'@'%'require ssl;

  3. Роль IAM, прикрепленная к экземпляру EMR, имеет следующие свойства,

  • Имеет управляемую AWS политику «AmazonRDSDataFullAccess»

  • Встроенная политика

      {
     "Version": "2012-10-17",
     "Statement": [
         {
             "Effect": "Allow",
             "Action": [
                 "rds-db:connect"
             ],
             "Resource": [
                 "arn:aws:rds-db:<region>:<account_id>:dbuser:<db_resource_id>/my_user"
             ]
         }
     ]
      

    }

  1. Группа безопасности, подключенная к БД, разрешает доступ к MySQL / Aurora из группы безопасности кластера EMR

Я обращаюсь к БД программно аналогично тому, как указано в разделе «Подключение к БД» .

Трассировка стека, которую я получаю,:

 User class threw exception: java.sql.SQLException: Access denied for user 'my_user'@'host' (using password: YES)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:963)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3966)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3902)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:875)
    at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1712)
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1228)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2253)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2284)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2083)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:806)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:410)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:328)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:208)
  

Я много пытался отладить, что может быть возможной причиной ошибки, но я не могу найти какую-либо причину, признателен, если кто-нибудь может мне помочь в этом. Я более чем готов подробно остановиться на любом шаге здесь (будучи моим первым сообщением, я, возможно, написал его неправильно). Заранее спасибо

UPD 1: я также попытался получить доступ к пользователю с помощью командной строки mysql с помощью следующей команды.

 TOKEN="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 3306 --region us-east-1 --username my_user)" 
mysql --host=$RDSHOST --port=3306 --ssl-ca=rds-ca-2019-root.pem --user=my_user --password=$TOKEN
  

Это также выдает аналогичное сообщение ERROR 1045 (28000): Access denied for user 'my_user'@'localhost' (using password: YES)

UPD 2: я подозреваю, что может быть ошибка в том, как я создаю пользователя в БД, поскольку ошибка все еще сохраняется даже после изменения ресурса на * . Может ли кто-нибудь взглянуть на это поближе.

Комментарии:

1. Является ли база данных безсерверной базой данных Aurora или просто обычной базой данных RDS MySQL или Aurora? Вы включили проверку подлинности IAM для подключений к БД в настройках сервера RDS?

2. Это база данных MySQL, и я включил аутентификацию IAM в настройках сервера RDS

Ответ №1:

AmazonRDSDataFullAccess Политика предназначена для взаимодействия с бессерверным API данных RDS. Он не предоставляет соответствующих разрешений для выполнения стандартного подключения к БД с проверкой подлинности IAM. Вам необходимо следовать приведенному здесь руководству, чтобы создать соответствующую политику. В частности, вам необходимо предоставить разрешение профилю экземпляра EC2 rds-db:connect .

Комментарии:

1. У меня была такая же политика, привязанная к роли. Вы заметили какие-либо другие вещи, которые выглядят неправильно. Заранее спасибо.

2. Что произойдет, если вы измените ресурс во встроенной политике на just * ? Этот тест устранит все возможные ошибки, которые у вас есть в ARN ресурса.

3. Та же ошибка по-прежнему сохраняется « { «Версия»: «2012-10-17», «Заявление»: [ { «Эффект»: «Разрешить», «Действие»: [ «rds-db: подключение» ], «Ресурс»: «*» } ] } « Это политика, которую я использовал

Ответ №2:

Вы можете попробовать следующее:

  1. Попробуйте воссоздать пользователя БД и снова предоставить ему гранты
  2. Вместо встроенной политики попробуйте использовать политику, управляемую клиентом, пока проблема с подключением не будет решена
  3. Во встроенной политике после ARN ресурса стоит запятая, удалите и ее.

Комментарии:

1. 1. Я попытался воссоздать базу данных, но увидел ту же ошибку. 2. Я изменил это, но ошибка все еще сохраняется. 3. Это была ошибка, допущенная при вставке ее сюда, я отредактировал вопрос.

2. Вы получаете что-нибудь от => TOKEN="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 3306 --region us-east-1 --username my_user)" ?

3. Да, токен генерируется

4. Попробуйте это: добавить --enable-cleartext-plugin before --user при подключении к mysql из CLI

5. Я попробовал это, и я получил сообщение об ошибке mysql: unknown option '--enable-cleartext-plugin'

Ответ №3:

Я прикреплял политики к роли EMR, мне пришлось прикрепить ее к профилю экземпляра EC2 кластера EMR