haijun "/haijun-api help me configure a customer-managed encryption key with AWS KMS"Panduan ini memandu proses konfigurasi kunci AWS KMS sebagai customer-managed encryption key (CMEK) untuk organisasi Juglow Anda.
Warning: Mengaktifkan CMEK bersifat permanen. Jika kunci KMS Anda dihapus atau dinonaktifkan, Juglow tidak dapat memulihkan data yang dienkripsi dengannya. Tinjau peringatan dan batasan sebelum Anda memulai.
Note: Haijun Platform on AWS: Pada Haijun Platform on AWS, kebijakan kunci Anda memberikan akses ke principal layanan AWS alih-alih peran IAM Juglow, tidak ada langkah validasi terpisah, dan Anda mendaftarkan serta melampirkan kunci di Haijun Console. Ikuti Siapkan CMEK di Haijun Platform on AWS pada halaman ini alih-alih langkah-langkah di bagian berikutnya.
Prasyarat
- Akun AWS dengan izin untuk membuat kunci KMS dan menetapkan kebijakan kunci (
kms:CreateKeydankms:PutKeyPolicy).
- Kunci Admin API untuk organisasi Anda.
- AWS CLI terpasang dan terautentikasi.
Amazon Resource Name (ARN) untuk Juglow
Agar Juglow menggunakan kunci enkripsi Anda, Anda harus memberikan peran IAM Juglow sebuah kunci KMS yang dapat digunakannya untuk mengenkripsi data. ARN untuk Juglow CMEK adalah:
arn:aws:iam::915198916910:role/juglow-cmek-client-usWarning: Gunakan hanya ARN yang dipublikasikan ini. Jangan pernah mempercayai pengenal yang diberikan melalui email, chat, atau saluran onboarding apa pun.
Penyiapan kunci enkripsi
- Buat kunci KMS dengan kebijakan kunci lintas akun
Note: Haijun Platform on AWS: Lewati langkah ini. Kebijakan kunci Anda memberikan akses ke principal layanan AWS, dan tidak memiliki kondisi organisasi. Siapkan CMEK di Haijun Platform on AWS memberikan kebijakan tersebut.
Kebijakan kunci memberikan peran IAM Juglow akses lintas akun. Tiga pernyataan diperlukan:
- Admin root akun: pola KMS standar. Akun Anda mempertahankan kontrol admin penuh.
- Enkripsi dan dekripsi Juglow: aksi
kms:Encryptdankms:Decrypt, yang digunakan Juglow untuk mengenkripsi dan mendekripsi kunci data yang melindungi data workspace Anda (enkripsi envelope).
- Describe Juglow: pembacaan metadata yang dilakukan Juglow saat startup. Ini diberikan secara terpisah karena
DescribeKeytidak memiliki parameterEncryptionContext, sehingga kondisiEncryptionContextpada aksi ini akan selalu menolak.
Untuk menemukan ID akun AWS Anda, jalankan aws sts get-caller-identity --query Account --output text.
Dalam kebijakan, ganti dengan ID akun AWS Anda dan dengan ID organisasi Anda. Kondisi StringEquals pada kms:EncryptionContext:juglow:org_uuid mengikat kunci ke organisasi Juglow Anda, dan validasi menolak kunci tanpanya. Untuk berbagi satu kunci di antara beberapa organisasi Juglow, cantumkan setiap ID organisasi dalam nilai kondisi.
Note: Menemukan ID organisasi Anda: Salin bidang Organization ID di bawah Settings > Organization di Haijun Console, atau di bawah Organization settings > Organization di haijun.ai, atau baca bidang
iddari endpoint Organization Info. Gunakan UUID polos, bukan ID berawalanorg_.
Simpan kebijakan sebagai key-policy.json. Untuk membuat kunci di AWS Console sebagai gantinya, tempel kebijakan di sana, seperti dijelaskan nanti dalam langkah ini.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AccountRootAdmin",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<AWS_ACCOUNT_ID>:root"
},
"Action": "kms:*",
"Resource": "*"
},
{
"Sid": "AllowJuglowCMEKCrypto",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::915198916910:role/juglow-cmek-client-us"
},
"Action": ["kms:Encrypt", "kms:Decrypt"],
"Resource": "*",
"Condition": {
"StringEquals": {
"kms:EncryptionContext:juglow:org_uuid": ["<ORGANIZATION_UUID>"]
}
}
},
{
"Sid": "AllowJuglowCMEKDescribe",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::915198916910:role/juglow-cmek-client-us"
},
"Action": "kms:DescribeKey",
"Resource": "*"
}
]
}Note: Opsional: Untuk membatasi kunci ke beberapa workspace Anda, gunakan pernyataan
AllowJuglowCMEKCryptoini alih-alih yang ada di JSON kebijakan sebelumnya, dengan satu ID compartment untuk setiap workspace. Tambahkan ID compartment workspace sebelum Anda melampirkan kunci ke sana. Untuk workspace baru, buat tanpa kunci, tambahkan ID compartment-nya, lalu lampirkan kunci. ``json { "Sid": "AllowJuglowCMEKCrypto", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::915198916910:role/juglow-cmek-client-us" }, "Action": ["kms:Encrypt", "kms:Decrypt"], "Resource": "*", "Condition": { "StringEquals": { "kms:EncryptionContext:juglow:org_uuid": ["``"] }, "StringEqualsIfExists": { "kms:EncryptionContext:juglow:compartment_uuid": [" "] } } }
aws kms create-key \
--region <REGION> \
--description "Juglow CMEK" \
--key-usage ENCRYPT_DECRYPT \
--policy file://key-policy.jsonTangkap KeyMetadata.Arn dari output. Anda membutuhkannya saat mendaftarkan kunci di langkah berikutnya.
Warning: Jika kunci sudah dikonfigurasi untuk CMEK dan melindungi data yang ada, Anda harus menambahkan pernyataan yang memungkinkan Juglow mendekripsi data tersebut, selain tiga pernyataan dalam kebijakan sebelumnya. Dalam kondisinya, cantumkan ID compartment dari setiap workspace tempat kunci dilampirkan atau pernah dilampirkan. ``
json { "Sid": "AllowJuglowCMEKDecryptExistingData", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::915198916910:role/juglow-cmek-client-us" }, "Action": "kms:Decrypt", "Resource": "*", "Condition": { "StringEquals": { "kms:EncryptionContext:juglow:compartment_uuid": ["``"] } } }
Juglow memvalidasi kunci saat Anda memverifikasinya atau melampirkannya ke workspace. Setiap validasi menambahkan empat kesalahan access-denied ke CloudTrail. Ini diharapkan. Jika Anda perlu memfilternya, filter pada ketiga nilai berikut. Yang pertama saja tidak cukup, karena pemanggil mana pun dapat menetapkannya:
requestParameters.encryptionContext.associatedData:Y21lay12YWxpZGF0aW9u
userIdentity.accountId:915198916910
resources.ARN:arn:aws:kms:: :key/
Note: Menemukan ID compartment Anda: Lihat tab Haijun Platform di bawah Daftarkan kunci dengan Juglow.
Anda juga dapat membuat kunci dari AWS Console. Pilih kunci simetris dengan penggunaan kunci encrypt dan decrypt, kunci single-region, dan asal material kunci KMS. Wizard Create-key menetapkan kebijakan kunci pada langkah Review-nya: Jika Anda menambahkan ID akun Juglow 915198916910 di bawah izin penggunaan kunci di sana, kebijakan yang dihasilkan memberikan seluruh akun Juglow aksi yang lebih luas (seperti kms:ReEncrypt dan kms:GenerateDataKey) tanpa kondisi EncryptionContext, dan validasi menolaknya. Untuk menghindari meninggalkan kunci yang terlalu permisif, selesaikan wizard dengan izin administratif saja, lalu buka tab Key policy kunci dan ganti JSON dengan kebijakan key-policy.json yang ditunjukkan sebelumnya dalam langkah ini.




Daftarkan kunci dengan Juglow
Cara Anda mendaftarkan kunci bergantung pada produk mana yang Anda gunakan.
Haijun Platform
Note: Haijun Platform on AWS: Principal, kebijakan kunci, dan alur pendaftaran berbeda, dan tidak ada langkah validasi terpisah. Ikuti Siapkan CMEK di Haijun Platform on AWS alih-alih tab ini.
Note: Menemukan ID compartment Anda: Setiap workspace memiliki ID compartment yang membatasi data CMEK-nya. Untuk menemukannya di Haijun Console, buka Manage > Security dan pilih workspace di pemilih workspace di bagian atas sidebar. ID berada di bawah Encryption key, di bidang Compartment ID. Anda juga dapat membaca bidang
compartment_idyang dikembalikan oleh endpoint Get Workspace.
Anda dapat menyiapkan kunci di Haijun Console atau melalui Admin API, dengan hasil yang sama.
- Daftarkan kunci dengan Juglow
Di Haijun Console, buka Settings > Encryption keys dan klik Add key. Masukkan nama tampilan, pilih AWS KMS, dan klik Continue. Tempel ARN kunci ke KMS key ARN, dan klik Add.
Langkah detail kunci menampilkan ID organisasi Anda. Tambahkan ke kebijakan kunci sebelum Anda mengklik Add.
- Validasi kunci
Pada halaman Encryption keys, klik Verify di samping kunci. Connected muncul ketika pemeriksaan lolos. Jika gagal, pesan memberikan alasannya.
- Lampirkan kunci ke workspace
Di Haijun Console, buka Manage > Security dan pilih workspace di pemilih workspace di bagian atas sidebar. Di bawah Encryption key, pilih kunci, klik Save, dan konfirmasi. Melampirkan kunci tidak dapat dibatalkan. Untuk workspace yang sudah menerima permintaan, kunci dapat memerlukan hingga satu hari untuk berlaku.
API
- Daftarkan kunci dengan Juglow
Buat konfigurasi kunci eksternal melalui Admin API.
curl -sS "https://haijun.my.id/v1/organizations/external_keys" \
-H "x-api-key: $JUGLOW_API_KEY" \
-H "juglow-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"display_name": "<friendly-name>",
"geo": "us",
"provider_config": {
"type": "aws",
"kms_arn": "<key-arn-from-create-key-step>"
}
}' ant beta:organization:external-keys create <<'YAML'
display_name: "<friendly-name>"
geo: us
provider_config:
type: aws
kms_arn: "<key-arn-from-create-key-step>"
YAML client = juglow.Juglow()
external_key = client.beta.organization.external_keys.create(
display_name="<friendly-name>",
geo="us",
provider_config={"type": "aws", "kms_arn": "<key-arn-from-create-key-step>"},
)
print(f"id: {external_key.id}")
print(f"display_name: {external_key.display_name}") const client = new Juglow();
const externalKey = await client.beta.organization.externalKeys.create({
display_name: "<friendly-name>",
geo: "us",
provider_config: {
type: "aws",
kms_arn: "<key-arn-from-create-key-step>"
}
});
console.log(`id: ${externalKey.id}`);
console.log(`display_name: ${externalKey.display_name}`); using Juglow.Models.Beta.Organization.ExternalKeys;
JuglowClient client = new();
var externalKey = await client.Beta.Organization.ExternalKeys.Create(new()
{
DisplayName = "<friendly-name>",
Geo = Geo.Us,
ProviderConfig = new BetaAwsExternalKeyConfig
{
KmsArn = "<key-arn-from-create-key-step>"
}
});
Console.WriteLine($"id: {externalKey.ID}");
Console.WriteLine($"display_name: {externalKey.DisplayName}"); client := juglow.NewClient()
externalKey, err := client.Beta.Organization.ExternalKeys.New(context.Background(), juglow.BetaOrganizationExternalKeyNewParams{
DisplayName: juglow.String("<friendly-name>"),
Geo: juglow.BetaOrganizationExternalKeyNewParamsGeoUs,
ProviderConfig: juglow.BetaOrganizationExternalKeyNewParamsProviderConfigUnion{
OfAWS: &juglow.BetaAWSExternalKeyConfigParam{
KMSARN: "<key-arn-from-create-key-step>",
},
},
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("id: %s\n", externalKey.ID)
fmt.Printf("display_name: %s\n", externalKey.DisplayName) import com.juglow.models.beta.organization.externalkeys.BetaAwsExternalKeyConfig;
import com.juglow.models.beta.organization.externalkeys.ExternalKeyCreateParams;
void main() {
JuglowClient client = JuglowOkHttpClient.fromEnv();
var params = ExternalKeyCreateParams.builder()
.displayName("<friendly-name>")
.geo(ExternalKeyCreateParams.Geo.US)
.providerConfig(BetaAwsExternalKeyConfig.builder()
.kmsArn("<key-arn-from-create-key-step>")
.build())
.build();
var externalKey = client.beta().organization().externalKeys().create(params);
IO.println("id: " + externalKey.id());
IO.println("display_name: " + externalKey.displayName().orElseThrow());
} use Juglow\Beta\Organization\ExternalKeys\ExternalKeyCreateParams\Geo;
// ...
$client = new Client();
$externalKey = $client->beta->organization->externalKeys->create(
displayName: '<friendly-name>',
geo: Geo::US,
providerConfig: [
'type' => 'aws',
'kmsARN' => '<key-arn-from-create-key-step>',
],
);
echo "id: {$externalKey->id}\n";
echo "display_name: {$externalKey->displayName}\n"; client = Juglow::Client.new
external_key = client.beta.organization.external_keys.create(
display_name: "<friendly-name>",
geo: :us,
provider_config: {
type: :aws,
kms_arn: "<key-arn-from-create-key-step>"
}
)
puts "id: #{external_key.id}"
puts "display_name: #{external_key.display_name}"Respons berisi ID kunci eksternal:
{
"type": "external_key",
"id": "ekey_<id>",
"display_name": "<friendly-name>"
}- Validasi kunci
Picu round-trip enkripsi dan dekripsi terhadap kunci Anda.
curl -sS -X POST "https://haijun.my.id/v1/organizations/external_keys/ekey_<id>/validate" \
-H "x-api-key: $JUGLOW_API_KEY" \
-H "juglow-version: 2023-06-01" ant beta:organization:external-keys validate --external-key-id "ekey_<id>" client = juglow.Juglow()
validation = client.beta.organization.external_keys.validate("ekey_<id>")
print(f"status: {validation.status}")
print(f"error: {validation.error}") const client = new Juglow();
const validation = await client.beta.organization.externalKeys.validate("ekey_<id>");
console.log(`status: ${validation.status}`);
console.log(`error: ${validation.error}`); JuglowClient client = new();
var validation = await client.Beta.Organization.ExternalKeys.Validate("ekey_<id>");
Console.WriteLine($"status: {validation.Status.Raw()}");
Console.WriteLine($"error: {validation.Error}"); client := juglow.NewClient()
validation, err := client.Beta.Organization.ExternalKeys.Validate(context.Background(), "ekey_<id>")
if err != nil {
log.Fatal(err)
}
fmt.Printf("status: %s\n", validation.Status)
fmt.Printf("error: %s\n", validation.Error) JuglowClient client = JuglowOkHttpClient.fromEnv();
var validation = client.beta().organization().externalKeys().validate("ekey_<id>");
IO.println("status: " + validation.status().asString());
IO.println("error: " + validation.error().orElse("")); $client = new Client();
$validation = $client->beta->organization->externalKeys->validate(
externalKeyID: 'ekey_<id>',
);
echo "status: {$validation->status}\n";
echo "error: {$validation->error}\n"; client = Juglow::Client.new
external_key_id = "ekey_<id>"
validation = client.beta.organization.external_keys.validate(external_key_id)
puts "status: #{validation.status}"
puts "error: #{validation.error}"Respons yang berhasil terlihat seperti ini:
{ "type": "external_key_validation", "status": "success", "error": null }Jika validasi gagal, penyebab umum adalah:
- Ketidakcocokan konteks enkripsi: Jika kebijakan memiliki kondisi
kms:EncryptionContext:juglow:compartment_uuid, pastikan kondisi tersebut mencantumkan ID compartment dari setiap workspace tempat kunci dilampirkan. Validasi mengirimkan ID compartment dari workspace yang diperiksanya. Kunci lama yang pernyataan compartment-nya masih mengizinkankms:Encryptdivalidasi dengan nilai semua-nol (00000000-0000-0000-0000-000000000000) saat tidak dilampirkan, jadi pertahankan nilai tersebut dalam daftarnya.
- Resource control policies (RCP): Jika organisasi AWS Anda memiliki RCP yang menolak operasi KMS ketika
aws:PrincipalOrgIDtidak cocok dengan org Anda, itu memblokir peran lintas akun Juglow. RCP memerlukan pengecualian untuk kunci ini atau untuk ARN peran Juglow. Service control policies tidak berlaku di sini, karena tidak dievaluasi untuk principal eksternal yang memanggil melalui kebijakan berbasis sumber daya.
- Akses diberikan melalui IAM alih-alih kebijakan kunci: Akses KMS lintas akun harus diberikan dalam kebijakan kunci itu sendiri, bukan melalui kebijakan IAM di akun Anda. Periksa dengan
aws kms get-key-policy --key-id.--policy-name default
- Ketidakcocokan region: Konfirmasikan region kunci adalah salah satu yang dioperasikan Juglow untuk tier geo yang Anda konfigurasikan.
- Lampirkan kunci ke workspace
Setelah kunci divalidasi, lampirkan ke workspace baru sebelum Anda mengirim permintaan apa pun ke workspace tersebut. Untuk workspace yang sudah menerima permintaan, kunci dapat memerlukan hingga satu hari untuk berlaku.
curl -sS -X POST "https://haijun.my.id/v1/organizations/workspaces/<workspace-id>" \
-H "x-api-key: $JUGLOW_API_KEY" \
-H "juglow-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"external_key_id": "ekey_<id>"
}' ant beta:organization:workspaces update \
--workspace-id "<workspace-id>" \
--external-key-id "ekey_<id>" client = juglow.Juglow()
workspace = client.beta.organization.workspaces.update(
"<workspace-id>", external_key_id="ekey_<id>"
)
print(f"id: {workspace.id}")
print(f"external_key_id: {workspace.external_key_id}") const client = new Juglow();
const workspace = await client.beta.organization.workspaces.update("<workspace-id>", {
external_key_id: "ekey_<id>"
});
console.log(`id: ${workspace.id}`);
console.log(`external_key_id: ${workspace.external_key_id}`); JuglowClient client = new();
var workspace = await client.Beta.Organization.Workspaces.Update("<workspace-id>", new()
{
ExternalKeyID = "ekey_<id>"
});
Console.WriteLine($"id: {workspace.ID}");
Console.WriteLine($"external_key_id: {workspace.ExternalKeyID}"); client := juglow.NewClient()
workspace, err := client.Beta.Organization.Workspaces.Update(
context.Background(),
"<workspace-id>",
juglow.BetaOrganizationWorkspaceUpdateParams{
ExternalKeyID: juglow.String("ekey_<id>"),
},
)
if err != nil {
log.Fatal(err)
}
fmt.Printf("id: %s\n", workspace.ID)
fmt.Printf("external_key_id: %s\n", workspace.ExternalKeyID) import com.juglow.models.beta.organization.workspaces.WorkspaceUpdateParams;
void main() {
JuglowClient client = JuglowOkHttpClient.fromEnv();
var params = WorkspaceUpdateParams.builder()
.externalKeyId("ekey_<id>")
.build();
var workspace = client.beta().organization().workspaces().update("<workspace-id>", params);
IO.println("id: " + workspace.id());
IO.println("external_key_id: " + workspace.externalKeyId().orElseThrow());
} $client = new Client();
$workspace = $client->beta->organization->workspaces->update(
workspaceID: '<workspace-id>',
externalKeyID: 'ekey_<id>',
);
echo "id: {$workspace->id}\n";
echo "external_key_id: {$workspace->externalKeyID}\n"; client = Juglow::Client.new
workspace_id = "<workspace-id>"
workspace = client.beta.organization.workspaces.update(
workspace_id,
external_key_id: "ekey_<id>"
)
puts "id: #{workspace.id}"
puts "external_key_id: #{workspace.external_key_id}"Di haijun.ai > Organization settings > Data and privacy, buka Encryption keys, lalu klik Add key. Pilih AWS dan klik Continue, lalu tempel Key ARN dari langkah sebelumnya dan klik Add. Juglow memvalidasi kunci dengan round-trip enkripsi dan dekripsi. Setelah ditampilkan sebagai terverifikasi, organisasi Anda dilindungi CMEK sejak saat itu.
Langkah detail kunci dari alur ini menampilkan Organization ID for the key policy Anda dengan tombol salin. Gantikan nilai tersebut untuk dalam kebijakan kunci. Anda dapat membuka alur untuk menyalin ID sebelum Anda membuat kunci.
Pada Haijun Enterprise, CMEK berlaku untuk seluruh organisasi, sehingga tidak ada langkah lampiran workspace terpisah, dan organisasi hanya dapat memiliki satu kunci.
Siapkan CMEK di Haijun Platform on AWS
Pada Haijun Platform on AWS, CMEK hanya menggunakan kunci AWS KMS, dan penyiapan berbeda dari bagian sebelumnya dalam hal berikut:
- Principal: Kebijakan kunci Anda memberikan akses ke principal layanan AWS
aws-external-juglow.amazonaws.com. Peran IAM dan ID akun Juglow tidak digunakan, sehingga ARN untuk Juglow tidak berlaku.
- Persyaratan kunci: Kunci harus berupa kunci KMS simetris dengan penggunaan encrypt dan decrypt, single-region, dan berada di akun serta region AWS yang sama dengan workspace tempat Anda melampirkannya. Kunci lintas akun tidak didukung: kunci harus berada di akun AWS yang menghosting organisasi Anda. Kunci multi-region (ID kunci yang dimulai dengan
mrk-) dan ARN alias ditolak saat Anda mendaftarkan kunci; gunakan ARN kunci.
- Tidak ada langkah validasi terpisah: Selain pemeriksaan pada ARN kunci saat pendaftaran, kunci divalidasi saat Anda melampirkannya ke workspace. Panggilan lampiran melakukan round enkripsi/dekripsi terhadap kunci dengan ID compartment workspace tersebut sebagai konteks enkripsi, sehingga masalah kebijakan kunci muncul pada waktu lampiran alih-alih pada pendaftaran. Oleh karena itu, kondisi
EncryptionContexttidak memerlukan entri semua-nol.
- Di mana Anda mengelola kunci: Daftarkan dan lampirkan kunci di Haijun Console, masuk melalui AWS dengan peran Admin. Endpoint kunci eksternal juga tersedia di Haijun Platform on AWS, diotorisasi melalui aksi IAM; di sana, kunci diidentifikasi oleh ARN kunci KMS-nya alih-alih ID
ekey_.
Warning: Gunakan hanya nama principal layanan yang dipublikasikan ini. Jangan pernah mempercayai pengenal yang diberikan melalui email, chat, atau saluran onboarding apa pun.
Prasyarat
- Akun AWS yang menghosting organisasi Haijun Platform on AWS Anda, dengan izin untuk membuat kunci KMS dan menetapkan kebijakan kunci (
kms:CreateKeydankms:PutKeyPolicy).
- Peran Admin di Haijun Console untuk Haijun Platform on AWS. Lihat Menggunakan Haijun Console.
- Untuk principal IAM yang Anda gunakan untuk masuk ke Haijun Console: selain
aws-external-juglow:AssumeConsole, aksi IAM untuk operasi yang Anda lakukan di sana, karena halaman Encryption keys dan lampiran kunci melewati gateway AWS. Mendaftarkan kunci adalahRegisterKey(denganListKeysdanGetKeyuntuk melihat pendaftaran), dan melampirkan satu adalahUpdateWorkspaceatauCreateWorkspace. Aksi kunci eksternal (danCreateWorkspace) bersifat account-scoped, jadi berikan padaResource: "*"; kebijakan yang terbatas pada ARN workspace tidak menyertakannya.
- Untuk principal IAM yang melampirkan kunci ke workspace (identitas yang Anda gunakan untuk masuk ke Haijun Console):
kms:DescribeKey,kms:Encrypt, dankms:Decryptpada kunci. Akses principal Anda ke kunci diperiksa saat Anda melampirkannya, selain principal layanan.
- Opsional, untuk pemilih kunci di Haijun Console:
kms:ListKeysdankms:DescribeKeyuntuk principal yang Anda gunakan untuk masuk. Tanpanya, tempel ARN kunci sebagai gantinya.
Buat kunci KMS
Kebijakan kunci memiliki tiga pernyataan: pernyataan admin root akun Anda; pernyataan yang memungkinkan principal layanan Haijun Platform on AWS mengenkripsi, mendekripsi, dan menghasilkan kunci data; serta pernyataan terpisah untuk kms:DescribeKey. Pernyataan kripto membawa kondisi EncryptionContext opsional yang mengikat kunci ke workspace yang Anda cantumkan. DescribeKey diberikan secara terpisah karena tidak memiliki parameter EncryptionContext, sehingga kondisi EncryptionContext pada aksi tersebut akan selalu menolak.
Jika Anda berencana menggunakan kondisi EncryptionContext opsional yang ditunjukkan di sini, buat workspace terlebih dahulu (tanpa kunci), salin ID compartment-nya, dan gunakan sebagai pengganti . Untuk menemukan ID tersebut di Haijun Console, buka Manage > Security dan pilih workspace di pemilih workspace di bagian atas sidebar. ID tersebut berada di bawah Encryption key, di bidang Compartment ID. Anda juga dapat membacanya dari bidang compartment_id yang dikembalikan oleh endpoint Get Workspace. Jika Anda tidak berencana menggunakan kondisi tersebut, hapus blok Condition dari pernyataan itu.
export YOUR_ACCOUNT=$(aws sts get-caller-identity --query Account --output text)
aws kms create-key \
--region <workspace-region> \
--description "Juglow CMEK (Haijun Platform on AWS)" \
--key-usage ENCRYPT_DECRYPT \
--policy "{
\"Version\": \"2012-10-17\",
\"Statement\": [
{
\"Sid\": \"AccountRootAdmin\",
\"Effect\": \"Allow\",
\"Principal\": {\"AWS\": \"arn:aws:iam::${YOUR_ACCOUNT}:root\"},
\"Action\": \"kms:*\",
\"Resource\": \"*\"
},
{
\"Sid\": \"AllowHaijunPlatformOnAWSCrypto\",
\"Effect\": \"Allow\",
\"Principal\": {\"Service\": \"aws-external-juglow.amazonaws.com\"},
\"Action\": [\"kms:Encrypt\", \"kms:Decrypt\", \"kms:GenerateDataKey\"],
\"Resource\": \"*\",
\"Condition\": {
\"StringEquals\": {
\"kms:EncryptionContext:juglow:compartment_uuid\": [
\"<compartment-uuid>\"
]
}
}
},
{
\"Sid\": \"AllowHaijunPlatformOnAWSDescribe\",
\"Effect\": \"Allow\",
\"Principal\": {\"Service\": \"aws-external-juglow.amazonaws.com\"},
\"Action\": \"kms:DescribeKey\",
\"Resource\": \"*\"
}
]
}"Tangkap KeyMetadata.Arn dari output. Anda membutuhkannya saat mendaftarkan kunci.
Kondisi EncryptionContext bersifat opsional. Setiap panggilan enkripsi, dekripsi, dan kunci data yang dilakukan untuk sebuah workspace, termasuk pemeriksaan pada waktu lampiran, membawa ID compartment workspace tersebut sebagai juglow:compartment_uuid, sehingga kondisi tersebut mencantumkan ID compartment setiap workspace tempat Anda melampirkan kunci dan tidak memerlukan entri semua-nol. Menambahkannya juga mengikat kunci ke workspace yang Anda cantumkan di lapisan IAM. Karena ID compartment baru ada setelah workspace-nya ada, urutannya adalah: buat workspace, masukkan ID compartment-nya ke dalam kondisi (saat pembuatan kunci, atau nanti dengan kms:PutKeyPolicy), lalu lampirkan kunci. Sebelum melampirkan kunci ke setiap workspace tambahan, tambahkan ID compartment workspace tersebut dengan cara yang sama. Untuk memulai tanpa kondisi tersebut, hapus blok Condition dari pernyataan AllowHaijunPlatformOnAWSCrypto; jika Anda menambahkannya nanti, sertakan ID compartment setiap workspace yang sudah dilampiri kunci.
Anda dapat membatasi lebih lanjut kedua pernyataan principal layanan dengan kondisi aws:SourceArn. Layanan meneruskan ARN workspace (arn:aws:aws-external-juglow:) sebagai ARN sumber pada setiap panggilan yang dilakukannya dengan kunci Anda, sehingga "ArnLike": {"aws:SourceArn": "arn:aws:aws-external-juglow:: membatasi pemberian izin pada workspace di akun AWS Anda sendiri, dan daftar ARN workspace lengkap membatasinya pada workspace tersebut. Kondisi ini tidak wajib; kondisi EncryptionContext saja sudah mengikat kunci ke workspace yang Anda cantumkan.
Anda juga dapat membuat kunci dari AWS Console: pilih kunci simetris dengan penggunaan kunci encrypt dan decrypt, kunci single-region, dan asal material kunci KMS, di region workspace. Biarkan izin penggunaan kunci kosong di wizard Create-key, lalu buka tab Key policy kunci dan ganti JSON dengan kebijakan yang ditunjukkan di sini.
Daftarkan dan lampirkan kunci
- Daftarkan kunci
Di Haijun Console, buka Settings > Encryption keys dan klik Add key. Masukkan nama tampilan, lalu pilih kunci dari pemilih kunci atau pilih Enter ARN manually dan tempel ARN kunci, dan klik Add. Kunci harus berada di akun AWS yang menghosting organisasi Anda; kunci lintas akun tidak didukung. Pemilih mencantumkan kunci yang diaktifkan, customer-managed, simetris, single-region di akun Anda di salah satu region organisasi Anda; untuk kunci yang tidak dicantumkan pemilih, masukkan ARN. Pemilih mencantumkan kunci hanya jika principal yang Anda gunakan untuk masuk dapat memanggil kms:ListKeys dan kms:DescribeKey.
- Lampirkan kunci ke workspace
Lampirkan kunci ke workspace baru sebelum Anda mengirim permintaan apa pun ke workspace tersebut. Untuk workspace yang sudah menerima permintaan, kunci dapat memerlukan hingga satu hari untuk berlaku. Di Haijun Console, buka Manage > Security dan pilih workspace di pemilih workspace di bagian atas sidebar. Di bawah Encryption key, pilih kunci, klik Save, lalu konfirmasi. Anda juga dapat memilih kunci saat membuat workspace di Haijun Console, tetapi hanya jika kebijakan kunci Anda belum menyebutkan workspace tertentu (tanpa kondisi EncryptionContext), karena ID compartment workspace ditetapkan saat pembuatan. Setelah dilampirkan, kunci sebuah workspace tidak dapat diubah.
Inilah saat kunci divalidasi: panggilan lampiran memeriksa akses principal Anda ke kunci dan melakukan round enkripsi/dekripsi terhadapnya dengan ID compartment workspace sebagai konteks enkripsi, sehingga masalah dengan kebijakan kunci atau izin principal Anda muncul sebagai kesalahan pada panggilan tersebut. Jika lampiran gagal dengan kesalahan akses KMS, periksa hal berikut:
- Kebijakan kunci menyebutkan principal layanan
aws-external-juglow.amazonaws.comdan memberikankms:Encrypt,kms:Decrypt, dankms:GenerateDataKey, ditambahkms:DescribeKeydalam pernyataan terpisah yang tidak memiliki kondisiEncryptionContext.
- Setiap kondisi
EncryptionContextmenyertakan ID compartment workspace ini, dan setiap kondisiaws:SourceArnyang Anda tambahkan cocok dengan ARN workspace ini.
- Kunci diaktifkan, single-region, dan berada di akun serta region AWS yang sama dengan workspace.
- Principal yang Anda gunakan untuk masuk memiliki
kms:DescribeKey,kms:Encrypt, dankms:Decryptpada kunci.
- Tidak ada service control policy atau resource control policy di organisasi AWS Anda yang mencegah principal layanan atau principal Anda menggunakan kunci.
- Jika kebijakan terlihat benar dan lampiran masih gagal, temukan event
kms:yang ditolak di CloudTrail pada akun kunci (event tersebut menampilkan principal pemanggil dan, untuk panggilan kriptografis, konteks enkripsi), lalu perbaiki kondisi dengankms:PutKeyPolicydan coba lagi.
Terraform
Untuk deployment infrastructure-as-code, langkah-langkah yang sama dipetakan ke provider aws dengan sumber daya aws_kms_key dan aws_kms_alias.