tencent cloud

TDSQL-C for MySQL

アカウントのCAM認証設定

Download
フォーカスモード
フォントサイズ
最終更新日: 2026-04-29 18:04:59
本稿では、コンソールを使用したアカウントのCAM検証に関する設定の説明と操作についてご紹介します。
説明:
CAM 検証を有効にする必要がある場合は、チケットを提出して利用申請を行ってください。

サポート地域

この機能は現在、以下のリージョンをサポートしています:北京、上海、広州。

背景

クラウドデータベースを使用するシナリオでは、通常、データベース用に独立したアカウントとパスワードを作成し、対応するユーザーにアクセスと操作の権限を付与する必要があります。この方法によるアカウント管理は比較的複雑で、アカウントとパスワードの漏洩などのセキュリティ問題が発生しやすい傾向があります。このような背景を踏まえ、TDSQL-C for MySQLではアカウントのCAM検証機能の有効化をサポートしています。Tencent Cloudプラットフォームのサブアカウントとデータベースアカウントの関係を統合し、CAMクレデンシャルによる認証を追加することで、アカウント権限管理の複雑さを簡素化し、データベースのセキュリティとアカウント管理効率を向上させます。

操作シナリオ

セキュリティに対する要件が高い場合、この機能を使用してCAMとデータベースアカウントの検証をバインドできます。ユーザーはリクエスト時に対応するダイナミックパスワードを取得してデータベースにアクセスし、データベースのセキュリティを向上させることができます。以下の2つのシナリオでCAM検証を有効にすることを推奨します。
CAM検証を一時的かつ個人によるデータベースアクセスのメカニズムとして使用する場合となります。
再試行が容易なワークロードに対してのみCAM検証を使用してください。

注意事項

できるだけ持続的接続を使用してデータベースにアクセスしてください。
CAM検証を有効にする前に、関連するCAM権限ルールを事前に設定しておく必要があります。
CAM検証を有効にした後、パスワードの変更はサポートされていません。
rootアカウントでもCAM検証の有効化がサポートされています。
CAM検証を無効にした後は、CAMを介してアクセス認証情報を取得できなくなります。したがって、CAM検証を無効にする際には、新しいパスワードを入力する必要があります。

機能の制限

Serverlessクラスターでは現在、この機能はサポートされていません。
CAM検証を有効にした後、このアカウントのパスワードリセット操作はサポートされていません。
単一のホストアドレスを持つアカウントのみ、CAM検証機能の有効化をサポートしています。
インスタンスで先にCAM検証を有効にした場合、カスタムパスワード強度機能を有効にすることはサポートされていません。
インスタンスでカスタムパスワード強度機能を有効にしている場合、CAM検証を有効にした後、パスワード強度ルールの調整はサポートされません。
カスタムパスワード強度のパスワードチェック強度レベルがSTRONGの場合、この機能を有効にすることは許可されません。

前提条件

インスタンスはプリセットリソースである必要があります。Serverlessでは現在、この機能はサポートされていません。
すでにチケットを提出し、この機能の利用申請を行いました。
インスタンスの状態は稼働中です。

手順1:CAM権限ルールの設定

アカウントのCAM検証機能を使用する前に、ユーザーは関連するCAM権限ルールを設定する必要があります。

ポリシー内容

{
"version": "2.0",
"statement": [
{
"effect": "allow",
"action": [
"cam:BuildDataFlowAuthToken"
],
"resource": [
"qcs::cam::uin/<ユーザー uin>:resourceUser/<インスタンスID>/<アカウント名>"
]
}
]
}
<ユーザー uin>:実際のアカウントIDに置き換えてください。
<インスタンスID>:実際に権限付与が必要なインスタンスIDに置き換えてください。
<アカウント名>:実際に権限付与が必要なアカウント名に置き換えてください。

操作ガイド

1. 管理者アカウントを使用してCAMコンソールにログインし、ポリシーページで、ポリシージェネレーターに従ってカスタムポリシーを作成します(ポリシージェネレーターによるカスタムポリシーの作成を参照してください)。

効果:許可されます。
サービス:CAM(cam)。
操作:その他操作 - BuildDataFlowAuthToken。
リソース:特定のリソース - リソース六段式の追加。
リソースの入力:<インスタンスID>/<アカウント名>。
2. 次へをクリックします、ポリシー名をカスタムし、対象のサブアカウントにポリシーを付与します。
3. 完了をクリックして、権限付与を完了します。

ステップ2:CAM検証を有効にします。

CAM検証の有効化は2つのケースに分けられます:アカウント作成時にCAM検証を有効化する場合と、既存のアカウントに対してCAM検証を有効化する場合です。以下の手順に従ってそれぞれ操作できます。
ケース1:アカウント作成時にCAM検証を有効化
ケース2:既存のアカウントに対するCAM検証の有効化。
1. TDSQL-C for MySQLコンソールにログインします。
2. 左側のクラスターリストで対象のクラスタをクリックし、クラスタ管理ページに移動します。
3. クラスタ管理ページで、アカウント管理アカウント作成を選択し、ポップアップダイアログに必要な情報を入力して、確認後に確定をクリックします。
説明:
アカウント作成の操作手順についてはアカウント作成を参照してください。ここではCAM(Cloud Access Management)検証の有効化に関連する手順のみを説明します。
CAM検証の有効化:「CAM検証を有効にする」のスイッチをオンにし、ポップアップで重要事項を確認した後、確定をクリックします。

4. CAM検証の有効化に成功したアカウントには「CAM検証有効化済み」と表示されます。
1. TDSQL-C for MySQLコンソールにログインします。
2. 左側のクラスターリストで対象のクラスタをクリックし、クラスタ管理ページに移動します。
3. クラスタ管理ページで、アカウント管理を選択します。
4. アカウント管理ページで対象のアカウントを探し、その操作列にあるCAM検証を有効にするをクリックします。
5. ポップアップで重要事項を確認した後、確定をクリックします。

6. CAM検証の有効化に成功したアカウントには「CAM検証有効化済み」と表示されます。

手順3:アプリケーションがコードでパスワードを取得するためにコールします。

アカウントが関連するCAM権限ルールを備え、かつCAM検証を有効にした後、ユーザーはアプリケーションでJavaコードを呼び出してパスワードを取得し、データベースインスタンスに接続できます。Pythonを使用してデータベースインスタンスに接続することもできます。具体的な方法については、付録1:Pythonによるデータベース接続を参照してください。また、goを使用してデータベースインスタンスに接続することもできます。具体的な方法については、付録2:goによるデータベース接続を参照してください。
1. Tencent Cloudコンソールのアカウント情報ページで、アカウントのAPPIDをクエリできます。

2. CAMコンソール > APIキー管理でSecretIDとSecretKeyを取得します。
3. アプリケーションで以下のコードを使用します。
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-dbauth-sdk-java</artifactId>
<version>1.0.4</version>
</dependency>
間接依存関係:tencentcloud-sdk-java バージョン3.1.1039以降。
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java</artifactId>
<version>3.1.1039</version>
</dependency>
コードを呼び出してパスワードを取得する例。
package com.tencentcloud.dbauth;
import com.tencentcloudapi.common.Credential;
import com.tencentcloud.dbauth.model.GenerateAuthenticationTokenRequest;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;

public class GenerateDBAuthentication {

public static void main(String[] args) {
// 認証トークンのパラメータを定義します。
String region = "<インスタンスが配置されているリージョン>";
String instanceId = "<インスタンスID>";
String userName = "<アカウント名>";
// 環境変数から認証情報を取得します。
Credential credential = new Credential(System.getenv("<TENCENTCLOUD_SECRET_ID>"), System.getenv("<TENCENTCLOUD_SECRET_KEY>"));

System.out.println(getAuthToken(region, instanceId, userName, credential));
}

public static String getAuthToken(String region, String instanceId, String userName, Credential credential) {
try {
// httpオプションをインスタンス化します。オプションであり、特殊な要件がない場合はスキップできます。
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("cam.tencentcloudapi.com");
// clientオプションをインスタンス化します。オプションであり、特殊な要件がない場合はスキップできます。
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);

// GenerateAuthenticationTokenRequestをビルドします。
GenerateAuthenticationTokenRequest tokenRequest = GenerateAuthenticationTokenRequest.builder()
.region(region)
.credential(credential)
.userName(userName)
.instanceId(instanceId)
.clientProfile(clientProfile) // clientProfileはオプションです。
.build();

return DBAuthentication.generateAuthenticationToken(tokenRequest);

} catch (TencentCloudSDKException e) {
e.printStackTrace();
}
return "";
}
}
<インスタンスが配置されているリージョン>:アクセスが必要なインスタンスが配置されているリージョンに置き換えてください。例:ap-guangzhou。
<インスタンスID>:アクセスするインスタンスIDに置き換えてください。
<アカウント名>:実際にログインするアカウント名に置き換えてください。
<TENCENTCLOUD_SECRET_ID>:CAMコンソールから取得したSecretIDに置き換えてください。
<TENCENTCLOUD_SECRET_KEY>:CAMコンソールから取得したSecretKeyに置き換えてください。

ステップ4:認証トークンを使用してTDSQL-C for MySQLに接続します

ステップ3で認証トークン(AuthToken)を取得した後、認証トークンを使用してデータベースに接続できます。
mysql --host=<IPアドレス> --port=<ポート番号> --user=<アカウント名> --password=<パスワード>;
<IPアドレス>:インスタンスのIPアドレスに置き換えてください。
<ポート番号>:インスタンスのポート番号に置き換えてください。ポート番号を変更していない場合は、デフォルトで3306となります。
<アカウント名>:実際にログインするアカウント名に置き換えてください。
<パスワード>:ステップ3で取得したAuthTokenに置き換えてください。

Javaコードによるデータベース接続の例

package com.tencentcloud.examples;

import com.tencentcloud.dbauth.DBAuthentication;
import com.tencentcloud.dbauth.model.GenerateAuthenticationTokenRequest;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class CAMDatabaseAuthenticationTester {
public static void main(String[] args) throws Exception {
接続に必要な変数を定義します。
String region = "ap-guangzhou";
String instanceId = "cynosdb-123456";
String userName = "test";
String host = "192.*.*.11";
int port = 3306;
String dbName = "mysql";
String secretId = System.getenv("TENCENTCLOUD_SECRET_ID");
String secretKey = System.getenv("TENCENTCLOUD_SECRET_KEY");

// 接続を取得します
Connection connection = getDBConnectionUsingCAM(secretId, secretKey, region,
instanceId, userName, host, port, dbName);

// 接続が成功したかどうかを検証します。
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT 'Success!';");
while (rs.next()) {
String id = rs.getString(1);
System.out.println(id); // "Success!"が出力されるはずです
}

// 接続を閉じます
stmt.close();
connection.close();
}

/**
* CAMデータベース認証を使用したデータベース接続の取得
*
* @param secretId シークレットキーのID
* @param secretKey シークレットキー
* @param region リージョン
* @param instanceId インスタンスID
* @param userName ユーザー名
* @param host ホスト
* @param port ポート
* @param dbName データベース名
* @return Connection オブジェクト
* @throws Exception 異常
*/
private static Connection getDBConnectionUsingCAM(
String secretId, String secretKey, String region, String instanceId, String userName,
String host, int port, String dbName) throws Exception {

// secretId と secretKey から認証情報を取得します。
Credential credential = new Credential(secretId, secretKey);

// 最大リトライ回数を定義します。
int maxAttempts = 3;
Exception lastException = null;
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
try {
// 認証情報を使用してアクセストークンを取得します。
String authToken = getAuthToken(region, instanceId, userName, credential);

String connectionUrl = String.format("jdbc:mysql://%s:%d/%s", host, port, dbName);
return DriverManager.getConnection(connectionUrl, userName, authToken);
} catch (Exception e) {
lastException = e;
System.out.println("Attempt " + attempt + " failed.");
Thread.sleep(5000);
}
}
System.out.println("All attempts failed. error: " + lastException.getMessage());
throw lastException;
}

/**
* アクセストークンを取得します。
*
* @param region リージョン
* @param instanceId インスタンスID
* @param userName ユーザー名
* @param credential 認証情報
* @return アクセストークン
*/
private static String getAuthToken(String region, String instanceId, String userName, Credential credential) throws TencentCloudSDKException {
// httpオプションをインスタンス化します。オプションであり、特殊な要件がない場合はスキップできます。
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("cam.tencentcloudapi.com");
// clientオプションをインスタンス化します。オプションであり、特殊な要件がない場合はスキップできます。
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);

// GenerateAuthenticationTokenRequestをビルドします。
GenerateAuthenticationTokenRequest tokenRequest = GenerateAuthenticationTokenRequest.builder()
.region(region)
.credential(credential)
.userName(userName)
.instanceId(instanceId)
.clientProfile(clientProfile) // clientProfileはオプションです。
.build();

return DBAuthentication.generateAuthenticationToken(tokenRequest);
}
}

パスワードローテーション周期

当アカウントでCAM検証機能を有効にした場合、そのパスワードのローテーション周期はデフォルトで24時間で、変更できません

パスワードをリフレッシュ

当アカウントでCAM検証機能を有効にした場合、パスワードを更新する操作でパスワードを更新できます。例えば、パスワードのローテーション周期がデフォルトで24時間ごとに変更される場合、ローテーション周期に達する前に、パスワードを更新する操作で直ちにパスワードを更新できます。
注:
注:パスワードを更新した後、現在のログイン認証情報は無効になりますので、ビジネスアクセスのデータベース状態が期待通りかどうかを確認する必要があります。
1. TDSQL-C for MySQLコンソールにログインします。
2. 左側のクラスターリストで対象クラスタをクリックすると、クラスタ管理ページに移動します。
3. クラスタ管理ページで、アカウント管理を選択します。
4. アカウント管理ページで、対象アカウントを見つけ、その操作列のその他 > パスワード更新をクリックします。
5. ポップアップでリスクに関する注意事項を確認した後、確定をクリックします。

CAM検証の無効化。

注:
CAM検証を無効にした後は、CAMを介してアクセス認証情報を取得できません。パスワードを更新してください。
1. TDSQL-C for MySQLコンソールにログインします。
2. 左側のクラスターリストで対象クラスタをクリックすると、クラスタ管理ページに移動します。
3. クラスタ管理ページで、アカウント管理を選択します。
4. アカウント管理ページで対象のアカウントを探し、その操作列にあるその他 > CAM検証を無効にするをクリックします。
5. ポップアップで新しいパスワードを入力し、パスワードを確認した後、確定をクリックします。

付録1:Pythonによるデータベース接続

1. Tencent Cloudコンソールのアカウント情報ページで、アカウントのAPPIDを照会します。

2. CAMコンソール > APIキー管理でSecretIDとSecretKeyを取得します。
3. pipインストール方法でTencent CloudデータベースCAM Python SDKをプロジェクトにインストールします。コマンドラインで以下のコマンドを実行してください:
pip install git+https://github.com/TencentCloud/dbauth-sdk-python.git
python2とpython3の環境が同時に存在する場合、python3環境ではpip3コマンドを使用してインストールする必要があることにご注意ください。
間接依存関係:tencentcloud-sdk-python バージョン3.0.1224以降。

Pythonによるデータベース接続のサンプル

import logging
import os
import time

import pymysql
from dbauth.db_authentication import DBAuthentication
from dbauth.model.generate_authentication_token_request import GenerateAuthenticationTokenRequest
from tencentcloud.common import credential
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile

# ルートロガーの設定
logging.basicConfig(
level=logging.INFO,
format='[%(asctime)s] - [%(threadName)s] - {%(module)s:%(funcName)s:%(lineno)d} %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
log = logging.getLogger(__name__)


def main():
region = "ap-guangzhou"
instance_id = "cynosdb-123456"
user_name = "camtest"
host = "192.*.*.11"
port = 3306
db_name = "test"
secret_id = os.environ['AK']
secret_key = os.environ['SK']

connection = None
try:
# 接続を取得します
connection = get_db_connection_using_cam(secret_id, secret_key, region,
instance_id, user_name, host, port, db_name)

# 接続が成功したかどうかを検証します
with connection.cursor() as cursor:
cursor.execute("SELECT 'Success!';")
result = cursor.fetchone()
log.info(result[0]) # "Success!"が出力されるはずです。
except Exception as e:
log.error(f"An error occurred: {e}")
finally:
if connection and connection.open:
connection.close()


def get_db_connection_using_cam(secret_id, secret_key, region, instance_id, user_name, host, port, db_name):
cred = credential.Credential(secret_id, secret_key)

max_attempts = 3
last_exception = None
for attempt in range(1, max_attempts + 1):
try:
auth_token = get_auth_token(region, instance_id, user_name, cred)

connection = pymysql.connect(
host=host,
port=port,
user=user_name,
password=auth_token,
database=db_name
)
return connection
except Exception as e:
last_exception = e
log.info(f"Attempt {attempt} failed.")
time.sleep(5)

log.error(f"All attempts failed. error: {last_exception}")
raise last_exception


def get_auth_token(region, instance_id, user_name, cred):
try:
# httpオプションをインスタンス化します。オプションであり、特殊な要件がない場合はスキップできます
http_profile = HttpProfile()
http_profile.endpoint = "cam.tencentcloudapi.com"

# clientオプションをインスタンス化します。オプションであり、特殊な要件がない場合はスキップできます。
client_profile = ClientProfile()
client_profile.httpProfile = http_profile

request = GenerateAuthenticationTokenRequest(
region=region,
instance_id=instance_id,
user_name=user_name,
credential=cred,
client_profile=client_profile, # オプションです。
)
return DBAuthentication.generate_authentication_token(request)
except TencentCloudSDKException as err:
log.error(err)
raise


if __name__ == "__main__":
main()


付録2:goによるデータベース接続

依存環境:goバージョン1.17以上。
間接依存関係:tencentcloud-sdk-go v1.0.1015バージョン以上。
1. Tencent Cloudコンソールで、アカウント情報ページにて、アカウントのAPPIDを照会します。

2. CAMコンソール > APIキー管理でSecretIDとSecretKeyを取得します。
3. コマンドラインで以下のコマンドを実行してください:
go get -v -u github.com/tencentcloud/dbauth-sdk-go

goでデータベースに接続する方法

package main

import (
"database/sql"
"fmt"
"os"
"time"

_ "github.com/go-sql-driver/mysql"
"github.com/sirupsen/logrus"
"github.com/tencentcloud/dbauth-sdk-go/dbauth"
"github.com/tencentcloud/dbauth-sdk-go/dbauth/model"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile"
)

func init() {
logrus.SetOutput(os.Stdout)
logrus.SetFormatter(&logrus.TextFormatter{FullTimestamp: true})
logrus.SetLevel(logrus.InfoLevel)
}

func main() {
// データベース接続パラメータを定義します
region := "ap-guangzhou"
instanceId := "cynosdb-123456"
userName := "camtest"
host := "192.*.*.11"
port := 3306
dbName := "test"
ak := os.Getenv("TENCENTCLOUD_SECRET_ID")
sk := os.Getenv("TENCENTCLOUD_SECRET_KEY")

// 接続を取得します
connection, err := getDBConnectionUsingCam(ak, sk, region, instanceId, userName, host, port, dbName)
if err != nil {
logrus.Error("Failed to get connection:", err)
return
}

// 接続が成功したかどうかを検証します。
stmt, err := connection.Query("SELECT 'Success!';")
if err != nil {
logrus.Error("Failed to execute query:", err)
return
}
for stmt.Next() {
var result string
stmt.Scan(&result)
logrus.Info(result) // Success!
}

// 接続を閉じます
if err := stmt.Close(); err != nil {
logrus.Error("Failed to close statement:", err)
}
if err := connection.Close(); err != nil {
logrus.Error("Failed to close connection:", err)
}
}

// CAMを使用してデータベース接続を取得します
func getDBConnectionUsingCam(secretId, secretKey, region, instanceId, userName, host string, port int, dbName string) (*sql.DB, error) {
credential := common.NewCredential(secretId, secretKey)
maxAttempts := 3
var lastErr error

for attempt := 1; attempt <= maxAttempts; attempt++ {
// 認証トークンを取得します。
authToken, err := getAuthToken(region, instanceId, userName, credential)
if err != nil {
return nil, err
}

connectionUrl := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", userName, authToken, host, port, dbName)
db, err := sql.Open("mysql", connectionUrl)
if err != nil {
lastErr = err
logrus.Warnf("Open connection failed. Attempt %d failed.", attempt)
time.Sleep(5 * time.Second)
continue
}
if err = db.Ping(); err != nil {
lastErr = err
logrus.Warnf("Ping failed. Attempt %d failed.", attempt)
time.Sleep(5 * time.Second)
continue
}
return db, nil
}

logrus.Error("All attempts failed. error:", lastErr)
return nil, lastErr
}

// 認証トークンを取得します
func getAuthToken(region, instanceId, userName string, credential *common.Credential) (string, error) {
// clientオプションをインスタンス化します。任意の操作であり、特別な要件がない場合はスキップできます。
cpf := profile.NewClientProfile()
cpf.HttpProfile.Endpoint = "cam.tencentcloudapi.com"
// GenerateAuthenticationTokenRequestオブジェクトを作成します。ClientProfileは任意のオプションです。
tokenRequest, err := model.NewGenerateAuthenticationTokenRequest(region, instanceId, userName, credential, cpf)
if err != nil {
logrus.Errorf("Failed to create GenerateAuthenticationTokenRequest: %v", err)
return "", err
}

return dbauth.GenerateAuthenticationToken(tokenRequest)
}


ヘルプとサポート

この記事はお役に立ちましたか?

フィードバック