如何使用IAM DB身份验证和Python在MySQL RDS中进行身份验证
我有一个运行MySQL 5.6.39的AWS RDS DB,启用了IAM DB身份验证 首先,我取得了成功,这是我下一步的起点 我想使用IAM凭据登录,因此,在以下内容和教程中,我做到了:如何使用IAM DB身份验证和Python在MySQL RDS中进行身份验证,python,mysql,amazon-web-services,aws-lambda,amazon-rds,Python,Mysql,Amazon Web Services,Aws Lambda,Amazon Rds,我有一个运行MySQL 5.6.39的AWS RDS DB,启用了IAM DB身份验证 首先,我取得了成功,这是我下一步的起点 我想使用IAM凭据登录,因此,在以下内容和教程中,我做到了: 创建RDS MySQL实例时,我选择了启用IAM数据库身份验证 创建了名为lambda的用户: CREATE USER 'lambda' IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS'; GRANT ALL PRIVILEGES ON test_db.* TO
启用IAM数据库身份验证
lambda
的用户:
CREATE USER 'lambda' IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS';
GRANT ALL PRIVILEGES ON test_db.* TO 'lambda'@'%';
FLUSH PRIVILEGES;
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"rds-db:connect"
],
"Resource": [
"<DB-ARN>/lambda"
]
}
]
}
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):
...
{
“版本”:“2012-10-17”,
“声明”:[
{
“效果”:“允许”,
“行动”:[
“rds数据库:连接”
],
“资源”:[
“/lambda”
]
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"rds-db:connect"
],
"Resource": [
"<DB-ARN>/lambda"
]
}
]
}
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):
...
导入系统
进口boto3
导入日志记录
导入pymysql
#rds设置
rds_host=“”
username=“lambda”
db\u name=“test\u db”
logger=logging.getLogger()
logger.setLevel(logging.INFO)
客户机=boto3.客户机('rds',地区名称='eu-west-2')
令牌=客户端。生成\u db\u auth\u令牌(rds\u主机,3306,名称)
ssl={'ca':'rds组合ca bundle.pem'}
logger.info(“令牌:”+令牌)
conn=pymysql.connect(rds_主机,用户=用户名,密码=令牌,db=db_名称,连接超时=5,ssl=ssl)
logger.info(“成功:连接到RDS mysql实例成功”)
def处理程序(事件、上下文):
...
error: (1045, "Access denied for user 'lambda'@'<LAMBDA_IP>' (using password: YES)")
错误:(1045,“用户'lambda'@'的访问被拒绝(使用密码:YES)”)
aws rds generate-db-auth-token --hostname <RDS-ENDPOINT> --port 3306 --username lambda
aws rds生成db身份验证令牌--主机名--端口3306--用户名lambda
mysql -h <RDS-ENDPOINT> -u lambda --enable-cleartext-plugin --password='<TOKEN>'
mysql-h-u lambda——启用明文插件——密码=“”
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)
mysql:[警告]在命令行界面上使用密码可能不安全。
错误1045(28000):拒绝用户“lambda@”的访问(使用密码:是)
政策不对
资源
不是DB ARN,而是“ARN:aws:rds DB:”
AWS\u帐户\u ID-从中获取
AWS\u DB\u RESOURCE\u ID-在DB页面的Details\Configuration\RESOURCE ID
中找到它,它以DB-
开头
DB_USERNAME-是lambda
,因为它是在步骤2中创建的
顺便说一句,正如本文所指出的,令牌的生成是本地的,因此获取它不应被解释为获取正确的密码。请注意,生成令牌时不会发生身份验证。令牌与预签名的URL完全相同-它们是在本地生成的,不与任何API进行任何交互,并且在您尝试使用它们之前未实际检查。您的意思是,问题可能在于我如何获取令牌?我最严重的怀疑是在策略中,因为AWS管理控制台向我提供了此信息IAM无法识别此服务。该服务可能包括键入错误,或者可能是预览或自定义服务。
在策略中,您的ARN的资源部分(在帐号和以下:
之后)需要包括文本字符串dbuser:
+数据库标识符(以db-
开头)+/
+用户名。IAM控制台不理解这些策略,因此发出警告是正常的。此外,不,我不想建议您获取令牌的方式存在问题,而是检查以确保您理解,能够获取令牌并不能以任何方式证明您的身份配置。任何用户都可以获得令牌,即使具有无效或虚构的凭据。它在登录时不起作用,但仍会生成。根据您所说的更改了资源
。它再次失败,但我将等待一段时间,以确保更改已传播到Dnbajanca,@Michael-sqlbot-我将获得相同的exact错误,无法找出问题所在。已经花了将近半天的时间,仍然没有到达任何地方。我的IAM策略与您提到的完全相同。在AWS CLI中的第2步中,是否要求您输入密码?如果是,您为“lambda”输入了什么密码?无论我输入了什么,都会向我询问密码我得到了错误。你为什么不在你的mysql
命令中指定“-ssl ca=”呢?我几分钟前就发布了一个问题:。