Hai!

Selamat malam teman-teman. Pada jurnal ini saya ingin berbagi mengenai SSE-KMS (Server-Side Encryption – Key Management Service). Di AWS, KMS memiliki peran untuk mengelola kunci enkripsi yang digunakan untuk mengenkripsi resources.

Disini kita akan membahas SSE. Server-Side Encryption maksudnya data akan dienkripsi at-rest. Misal data yang berada di environment AWS. AWS menawarkan enkripsi secara aman dan memiliki ketersediaan tinggi (highly available) bagi aplikasi ataupun hardware yang menggunakannya.

Mari kita coba.

Dari AWS Management Console > Security, Identify & Compliance > Key Management Service

Di bawah ini merupakan dashboard dari KMS. Terlihat ada tiga tipe dari KMS yang disediakan oleh AWS berada di sisi kiri. Kita klik Customer managed keys

Lalu klik Create key untuk membuat key baru

Pada langkah pertama pembuatan key, pilih tipe key dan atur regionality nya. Saya coba pilih Symmetric dimana tipe ini biasa digunakan untuk enkripsi data aplikasi dimana kunci enkripsi dan dekripsi nya adalah sama.

Lalu Next

Isikan nama Alias dari key, deskripsi dan tag, lalu klik Next

Pilih key administrative permissions untuk menentukan siapa yang berhak mengelola dan mengatur siapa yang bisa menggunakan key. Lalu klik Next

Atur key usage permissions (bisa menggunakan akun AWS atau yang lain) untuk menetukan siapa yang berhak menggunakan key, lalu klik Next

Lalu di langkah terakhir bisa kita review apakah pengaturannya sudah sesuai atau belum

Lalu klik Finish

Tunggu sampai key berhasil dibuat seperti di bawah ini dan key siap digunakan

Sebagai implementasi, saya akan coba menggunakan key untuk mengenkripsi objek di Amazon S3.

Saya sudah menyiapkan sebuah bucket dan saya akan coba mengupload sebuah objek dengan menggunakan key tadi sebagai enkripsinya. Klik Upload

Untuk menggunakan key sebagai enkripsi di objek yang kita upload, bagian Server-side encryption settings, klik Specify an enryption key > AWS Key Management Service key (SSE-KMS) > Choose from your AWS KMS Keys, drop down dan pilih key yang kita buat. Lalu klik Upload.

Dan yup. Objek sudah terenkripsi dengan aman.

Lalu, apakah kita bisa mengatur agar objek yang diupload harus menggunakan enkripsi AWS KMS? Jadi, objek yang tidak menggunakan enkripsi, objek akan gagal diupload.

Jawabannya adalah bisa. Kita bisa mengaturnya pada pengaturan Bucket Policy dengan menambahkan policy berikut:

{
    "Version": "2012-10-17",
    "Id": "RequireSSEKMS",
    "Statement": [
        {
            "Sid": "DenyUploadIfNotSSEKMSEncrypted",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::<Your_Bucket_Name>/*",
            "Condition": {
                "StringNotEquals": {
                    "s3:x-amz-server-side-encryption": "aws:kms"
                }
            }
        }
    ]
}

Note: Ubah Your_Bucket_Name sesuai nama bucket.

Lalu klik Save.

Maka, ketika ada yang mengunggah objek/folder tanpa menggunakan enkripsi, hasilnya akan Failed seperti berikut ini

Lalu, apakah kita bisa mengatur agar bucket harus menggunakan key secara spesifik? Misal harus menggunakan enkripsi dan enkripsinya adalah your-name-encryption.

Jawabannya adalah bisa. Gunakan policy berikut ini.

{
    "Version": "2012-10-17",
    "Id": "RequireSSEKMSWithSpecificCMK",
    "Statement": [
        {
            "Sid": "DenyIfNotSpecificCMK",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::<Your_Bucket_Name>/*",
            "Condition": {
                "StringNotEquals": {
                    "s3:x-amz-server-side-encryption-aws-kms-key-id": "arn:aws:kms:us-west-2:<Lab_Account_ID>:key/<cmk-name>"
                }
            }
        }
    ]
}

Referensi

  1. https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html

Sekian!