Configuring Bitbucket with AWS Secrets Manager
AWS Secrets Manager は、ランタイム コールを通じて認証情報を取得するサービスで、ハードコードされた認証情報を完全に削除します。このタイプの暗号化は、データベースの認証情報を安全に保管するオプションが必要な場合に特に便利です。
AWS Secrets Manager は、認証とアクセス制御に AWS ID およびアクセス管理 (IAM) を使用しているため、トークンを作成したり、他のサードパーティとキーを管理したりする必要はありません。
We don’t currently support automated rotating credentials.
To configure Bitbucket to work with AWS Secrets Manager:
AWS Secrets Manager でシークレットを作成する
シークレットを取得する権限を確認する
AWS での認証
シークレットを取得できることを確認する
シークレットをプロパティ ファイルに追加する
次の手順に従って、プロセスを実行します。AWS Secrets Manager に関するその他のヘルプについては、 https://docs.aws.amazon.com/secretsmanager/index.html をご覧ください。
ステップ 1: AWS Secrets Manager でシークレットを作成する
You can create a secret as plaintext or structured text. Creating a plaintext secret is faster and easier than creating a structured secret.
To see how they differ, check the following example, which shows how each option looks in the AWS console and your code.
プレーンテキストのシークレット
名前 mySecretId
の付いたプレーンテキストのシークレットが表示された AWS コンソール:
password
これがコードでは次のように表示されます。
{"region":"ap-southeast-2","secretId":"mySecretId"}
構造化されたシークレット
名前 mySecretId
の付いた、構造化されたシークレットが表示された AWS コンソール。password
の値は secretPointer
です。
{"password": "mySecretPassword"}
これがコードでは次のように表示されます。
{"region":"ap-southeast-2","secretId":"mySecretId", "secretPointer": "/password"}
上の例では、JSON キーには次のものが含まれます。
JSON キー | 説明 |
---|---|
region | シークレット ソースの AWS リージョン ID |
secretID | シークレットの ID |
secretPointer | シークレットの値の JSON ポインター (シークレットの値がキーと値のペア構造の場合は必須) この値の前にスラッシュ (/ ) を付ける必要があることに注意してください。 |
Detailed steps
プレーンテキストのシークレットと構造化されたシークレットのどちらを使用するか決定していることをご確認ください (詳細については、手順の上のコンテンツをご参照ください)。
Follow the instructions provided by AWS to create a secret: https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html
ステップ 2: シークレットを取得する権限を確認する
To retrieve any secrets from AWS Secrets Manager, Bitbucket must have the appropriate AWS permissions, namely:
secretsmanager:GetSecretValue
下記は、(最小権限モデルに基づいて) 適切な権限を提供する Identity and Access Management (IAM) ポリシーの例です。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/MyRole"
},
"Action": "secretsmanager:GetSecretValue",
"Resource": "arn:aws:secretsmanager:us-west-2:123456789012:secret:1a2b3c"
}
]
}
補足情報
権限の設定について詳しくは、AWS の説明書 (リンク付きの例を含む) に従ってください。
シークレット取得の権限に独自の KMS キーを使用している場合は、AWS の説明書 (例を含む) に従ってください。
ステップ3: AWS への認証
Bitbucket uses the AWS SDK for Java 2.x to communicate with AWS Secrets Manager. The SDK will search for credentials in your Bitbucket environment in the predefined sequence below until it can be authenticated.
Amazon EC2 インスタンス プロファイル認証情報は Amazon が推奨しています。このオプションを使用する場合は、インスタンス メタ データ サービスの v2
を使用することもお勧めします。
- 環境変数
Java システムのプロパティ
Java システム プロパティを使用する場合、これらの値はスタートアップ時に製品によって記録される可能性があることに注意してください。
AWS セキュリティ トークン サービスのウェブ ID トークン
共有認証情報と
config
ファイル (~/.aws/credentials
)Amazon ECS コンテナーの認証情報
Amazon EC2 インスタンス プロファイル認証情報 (Amazon が推奨)
お使いの環境での認証情報の設定について、 Amazon には AWS 認証情報の取り扱いに関する開発者ガイドがあります。
Step 4: Confirm that you can retrieve your secret
Now that a secret has been created, the correct permissions are in place and Bitbucket is appropriately authenticated to AWS, let’s confirm the secret can be retrieved.
ホスト環境から次のコマンドを実行します。
aws secretsmanager get-secret-value --secret-id=mySecretId --region=ap-southeast-2
Step 5: Add the secret to bitbucket.properties
Back up the
<home-directory>/shared/bitbucket.properties
file. Move the backup to a safe place outside of your instance.In the
bitbucket.properties
file, add or modify theencrypted-property.cipher.classname
property to contain:com.atlassian.secrets.store.aws.AwsSecretsManagerStore
In the
bitbucket.properties
file, add or modify thejdbc.password
property to contain the coordinates to the secret in AWS Secrets Manager prefixed with{ENC}
:{ENC}{"region":"ap-southeast-2","secretId":"mySecretId", "secretPointer": "/password"}
値は、次の値を持つ JSON オブジェクトとして定義されます。
region
(必須) — AWS シークレットが置かれている AWS リージョンsecretId
(必須) — シークレットの名前secretPointer
(オプション) — キーと値の構造を持つシークレット内のパスワードを含むキー。省略した場合、パスワードはプレーンテキストとして扱われます。
Once updated,
bitbucket.properties
should contain:encrypted-property.cipher.classname=com.atlassian.secrets.store.aws.AwsSecretsManagerStore jdbc.password={ENC}{"region":"ap-southeast-2","secretId":"mySecretId", "secretPointer": "/password"}
Restart Bitbucket.