阿里云RDS数据库账户密码依托阿里云KMS凭据实现托管
从安全层面来讲,进行这项服务时,最为合适的做法是创建一个RAM用户来开展操作。
接下来会从三个部分进行操作说明。
一、RDS实例
- 进入阿里云控制台创建RDS实例,选好需要的配置,记住所选择的VPC、交换机以及创建的地域。
- 在RDS实例列表界面点击实例的管理操作。
- 在账户管理界面选择创建账户,自行设定账户名称和密码。
- 完成RDS账户的创建。
二、KMS
- 在与RDS相同的地域里,创建KMS实例。
- 点击密钥管理,创建密钥,选择刚刚创建的KMS实例,自定义密钥名称,选择密钥规格,可以选择是否自动轮转以及轮转周期。
- 在资源下的凭据管理界面选择创建数据库凭据。
- 点击凭据管理,点击数据库凭据,创建凭据,选择KMS实例,数据库类型选择RDS,自定义凭据名称,再选择需要的RDS实例,可以选择双账户托管或者单账户托管,可以新建账户,也可以选择已有账户直接导入。
- 完成凭据的创建。
三、程序验证
- 在验证之前需点击账户的权限与安全下的AccessKey来创建AccessKey。
- 创建Accesskey,记录AccessKey ID和Accesskey Secret,并确认Accesskey可以正常使用。
- 在刚刚创建AccessKey的界面下点击RAM访问控制,点击用户,找到创建AccessKey所在的RAM账户,点击权限管理,给RAM用户添加AliyunKMSFullAccess(或最小化AliyunKMSSecretUserAccess)权限。
- 程序验证是否可以通过KMS获取RDS账户和密码。首先要确定环境下是否装好阿里云Python SDK,如果已装过,会提示Requirement already satisfied,无需重复安装。
pip install alibabacloud_kms20160120 pymysql
在输入过程中,把脚本里【需要填写】的地方改成纯字符串,不要带尖括号或其他转义字符。验证程序需要的数据有AccessKey ID、AccessKey Secret、Region(如cn-hangzhou)、KMS创建的RDS凭据名称,从而进行下一步操作程序验证。
#!/usr/bin/env python3
import os, json
from alibabacloud_tea_openapi.models import Config
from alibabacloud_kms20160120.client import Client as KmsClient
from alibabacloud_kms20160120.models import GetSecretValueRequest
# 需要手工填写的只有下面 4 行
ACCESS_KEY_ID = os.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID") or "<你的AccessKeyId>"
ACCESS_KEY_SECRET = os.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") or "<你的AccessKeySecret>"
REGION_ID = "<你的Region,如 cn-hangzhou>"
SECRET_NAME = "<你在KMS中创建的RDS凭据名称>"
cfg = Config(
access_key_id=ACCESS_KEY_ID,
access_key_secret=ACCESS_KEY_SECRET,
region_id=REGION,
endpoint=f'kms.{REGION}.aliyuncs.com'
)
client = KmsClient(cfg)
req = GetSecretValueRequest(secret_name=SECRET_NAME)
resp = client.get_secret_value(req)
secret_data = json.loads(resp.body.secret_data)
print('RDS 账号:', secret_data['AccountName'])
print('RDS 密码:', secret_data['AccountPassword'])
如果验证成功,会显示RDS账户和密码。
5. 验证获取的RDS账户和密码是否可以连接上数据库。测试前需要确认:RDS申请外网地址(控制台→实例→数据库连接→申请);RDS白名单加IP:把你的公网IP加入RDS白名单(或临时0.0.0.0/0)。
环境是否安装依赖
pip install pymysql
该程序需要的数据有RDS外网地址和从上一个程序获取的RDS账户和密码。
#!/usr/bin/env python3
# test_rds_connect.py
import pymysql
# ======【需要填写】======
RDS_HOST = "rm-xxxxxxxx.mysql.rds.aliyuncs.com(需求填写)"
RDS_PORT = 3306(默认3306)
RDS_USER = "刚才KMS里打印的AccountName(需要填写)"
RDS_PASSWORD = "刚才KMS里打印的密码(需要填写)"
RDS_DATABASE = "mysql"
try:
conn = pymysql.connect(
host = RDS_HOST,
port = RDS_PORT,
user = RDS_USER,
password = RDS_PASSWORD,
database = RDS_DATABASE,
charset = "utf8mb4",
connect_timeout = 5
)
with conn.cursor() as cur:
cur.execute("SELECT 1")
result = cur.fetchone()
print("连接成功,SELECT 1 结果:", result)
except Exception as e:
print("连接失败:", e)
finally:
try:
conn.close()
except:
pass
显示连接成功则测试成功,上一步通过KMS获取的RDS账户密码正确。
相关文章
暂无评论...