Blog Personal Inganta

Berbagi pengetahuan untuk memperkaya pemahaman

10 Oct 2020

Pengelola Kredensial Secara Terpusat Menggunakan Chamber dan AWS SSM Parameter Store

Aplikasi membutuhkan akses ke basis data untuk menyimpan data dalam jangka panjang. Untuk mengakses basis data, aplikasi membutuhkan kredensial. Aplikasi yang berjalan di dalam sebuah ekosistem memerlukan interaksi dengan aplikasi lain di dalam ekosistem tersebut. Misalkan aplikasi A akan memanggil layanan yang disediakan oleh aplikasi B. Interaksi antara aplikasi ini membutuhkan kredensial untuk menjamin tingkat keamanan tinggi.

Mengelola kredensial adalah kegiatan fundamental ketika mengelola sebuah layanan Teknologi Informasi (TI). Pengelolaan kredensial yang baik memerlukan media penyimpanan dan mekanisme pendistribusian yang aman dan handal. Hal ini sesuai dengan prinsip keamanan pengelolaan data secara umum yaitu data selalu terenkripsi selama dalam penyimpanan dan proses pengiriman (Data encrypted while in-transit and at-rest). Kredensial tersedia di dalam memory komputer dalam bentuk teks biasa (plaintext) hanya ketika dibutuhkan saja. Selain enkripsi, akses terhadap kredensial perlu dijaga sehingga kredensial hanya diakses oleh pengguna dan aplikasi yang berwenang. Hal ini penting untuk memitigasi kemungkinkan kredensial tercecer secara tidak seharusnya.

Kredensial adalah asset penting bagi sebuah perusahaan TI. Kebocoran kredensial atau kesalahan penanganan sebuah kredensial memiliki dampak krusial baik dari sisi finansial dan citra perusahaan. Maka dari itu pengelolaan kredensial perlu dilihat secara holitis dan terpusat. Pengelolaan kredensial perlu melibatkan berbagai pemangku kepentingan. Perekayasa infrastructure (infrastructure engineer) perlu dilibatkan untuk memastikan sistem pengelolaan kredensial terpusat memiliki tingkat kehandalan tinggi. Perekayasa keamanan (security engineer) perlu dilibatkan untuk memastikan kredensial dikelola dengan tingkat keamanan tinggi dan hanya diakses oleh aplikasi dan pengguna yang berwenang. Perekayasa perangkat lunak (software engineer) sebagai pengembang aplikasi yang memerlukan kredensial mengerti cara mengakses kredensial yang aman dan mudah dilakukan sesuai dengan kebutuhan aplikasi mereka.

Sistem penyimpanan yang handal, aman, dan memilik tingkat ketersediaan tinggi sudah banyak tersedia saat ini. Selain penyimpanan terpusat, hal penting lain yang perlu diperhatikan adalah pengiriman kredensial ke lingkungan dimana aplikasi yang membutuhkan kredensial berjalan. Pendistribusian kredensial ini membutuhkan jalur komunikasi yang terenkripsi dan proses autentikasi yang baik. Autentikasi untuk mengakses kredensial umumnya menggunakan identitas terpercaya yang telah tersedia di lingkungan dimana aplikasi berjalan.

Salah satu sistem pengelola kredensial sumber terbuka yang cukup terkenal adalah Hashicorp Vault. Vault memiliki rekam jejak yang baik sebagai sistem untuk mengelola kredensial dan mengamankan data sensitif. Vault sistem bisa dipasang pada di pusat data yang kita miliki. Vault juga memiliki plugin identitas yang memungkinkan autentikasi dari berbagai sistem seperti sertifikat TLS, AWS IAM, atau JWT/OIDC.

Untuk perusahaan TI yang menggunakan layanan komputasi awan AWS, ada alternatif sistem pengelolaan kredensial terpusat yang layak untuk dipertimbangkan. Solusi tersebut adalah AWS Systems Manager Parameter Store (Parameter Store). Parameter Store adalah layanan penyimpanan data yang mendukung enkripsi dengan memanfaat layanan AWS Key Management Service (KMS). AWS SSM Parameter Store memiliki garansi tingkat ketersediaan 99.9% per bulan. Layanan ini terintegrasi dengan baik dengan sistem identitas AWS (AWS IAM) yang bisa digunakan untuk mengontrol akses ke data yang tersimpan pada Parameter Store. Data yang tersimpan juga sudah secara otomatis dijaga versinya sehingga memudahkan proses audit. Hal terakhir yang tak kalah pentingnya dari layanan ini adalah layanan tersedia tanpa biaya tambahan.

AWS SSM Parameter Store bisa diakses melalui konsol web AWS, SDK AWS, atau antarmuka baris perintah AWS. Untuk mempermudah pengelolaan kredensial pada AWS SSM Parameter Store, kita bisa menggunakan antarmuka baris perintah yang bernama Chamber. Chamber tersedia pada https://github.com/segmentio/chamber. Instalasi baris perintah Chamber bisa dilakukan dengan mengikuti petunjuk instalasi yang ada pada https://github.com/segmentio/chamber/wiki/Installation.

Pengaturan awal penggunaan Chamber

Chamber membutuhkan kunci dengan alias parameter_store_key tersedia pada AWS KMS di wilayah (region) yang sama dengan AWS SSM Parameter Store. Kita bisa menggunakan Terraform untuk membuat kunci AWS KMS dan alias yang dibutuhkan oleh Chamber. Berikut contoh konfigurasi Terraform untuk membuat kunci AWS KMS yang diperlukan oleh Chamber di Singapura.

provider "aws" {
    region = "ap-southeast-1"
}

resource "aws_kms_key" "parameter_store" {
  description             = "Parameter store kms master key"
  deletion_window_in_days = 30
  enable_key_rotation     = true
}

resource "aws_kms_alias" "parameter_store_alias" {
  name          = "alias/parameter_store_key"
  target_key_id = "${aws_kms_key.parameter_store.id}"
}

Penyediaan kredensial untuk aplikasi

Kredensial yang digunakan oleh aplikasi harus ditulis ke AWS SSM Parameter menggunakan chamber. Penulisan kredensial bisa dilakukan oleh pihak yang berwenang seperti perekayasa infrastruktur atau perekayasa keamanan. Pengguna yang bertugas menuliskan kredensial bisa melakukan tugas tersebut dengan perintah berikut

chamber write <nama layanan> <kunci> <nilai>
# Contoh menuliskan kunci password-database dengan nilai acak12345 ke layanan yang bernama contoh-layanan-1
chamber write contoh-layanan-1 password-database acak12345

Kita bisa menggunakan perintah chamber exec <nama layanan> -- <perintah menjalankan aplikasi> untuk mengekspor pasangan nilai kunci yang ada di suatu layanan di chamber. Berikut contoh mengekspor informasi pada layanan contoh-layanan-1 di atas yang akan dikonsumsi oleh aplikasi nodejs yang dijalankan menggunakan perintah npm start.

chamber exec contoh-layanan-1 -- npm start

Chamber melakukan normalisasi terhadap setiap kunci dengan aturan sebagai berikut:

  • Mengubah setiap huruf pada kunci menjadi huruf kapital
  • Mengubah setiap karakter - menjadi _

Sebagai contoh, kunci password-database akan diekspor menjadi variabel lingkungan PASSWORD_DATABASE.

Pengelolaan akses terhadap kredensial

Kredensial yang tersimpan pada AWS SSM Parameter Store dapat dibatasi aksesnya menggunakan AWS IAM. Kita bisa membagi akses ke dalam dua kelompok kebijakan yaitu kelompok dengan hak istimewa baca dan hak istimewa baca tulis. Hak istimewa baca tulis digunakan oleh perekayasa infrastruktur atau keamanan untuk menulis kredensial. Sedangkan hak istimewa baca digunakan oleh agen yang akan mengekspor kredensial dalam bentuk variabel lingkungan dan menjalankan aplikasi. Berikut contoh kode Terraform implementasi pengelolaan hak akses kredensial contoh-layanan-1 di atas menggunakan AWS IAM.

data "aws_iam_policy_document" "hak_istimewa_baca" {
    statement {
        actions = [
            "ssm:GetParametersByPath",
            "ssm:GetParameters",
            "ssm:GetParameterHistory",
            "ssm:GetParameter"
        ]
        resources = [
            "arn:aws:ssm:*:*:parameter/contoh-layanan-1/*"
        ]
    }
    
    statement {
        actions = ["ssm:DescribeParameters"]
        resources = ["*"]
    }

    statement {
        actions = ["kms:Decrypt"]
        resources = ["${aws_kms_key.parameter_store.id}"]
    }
}

resource "aws_iam_policy" "hak_istimewa_baca" {
    name = "hak-istimewa-baca-kredensial"
    policy = data.aws_iam_policy_document.hak_istimewa_baca.json
}

data "aws_iam_policy_document" "hak_istimewa_tulis" {
    statement {
        actions = [
            "ssm:PutParameter",
            "ssm:LabelParameterVersion",
            "ssm:DeleteParameter"
        ]
        resources = [
            "arn:aws:ssm:*:*:parameter/contoh-layanan-1/*"
        ]
    }

    statement {
        actions = ["kms:Encrypt"]
        resources = ["${aws_kms_key.parameter_store.id}"]
    }
}

resource "aws_iam_policy" "hak_istimewa_tulis" {
    name = "hak-istimewa-tulis-kredensial"
    policy = data.aws_iam_policy_document.hak_istimewa_tulis.json
}

IAM policy di atas bisa diberikan ke IAM User, IAM Group, atau IAM Role sesuai dengan kebutuhannya.

Integrasi kredensial dengan Terraform

Kredensial yang tersimpan pada Parameter Store bisa dibaca menggunakan kode Terraform. Contoh kasus penggunaan dimana kita membutuhkan kredensial adalah saat pembuatan kluster basis data menggunakan AWS RDS. Saat pembuatan kluster RDS, kita perlu menyediakan kata kunci utama (master password) untuk kluster tersebut. Tentunya kita tidak ingin kata kunci utama ini tersimpan dalam teks biasa. Berikut contoh penggunaan kredensial yang tersimpan pada Parameter Store dengan nama kunci master-password pada layanan rds-postgres melalui Terraform.

data "aws_ssm_parameter" "password" {
    name = "/rds-postgres/master-password"
}

resource "aws_rds_cluster" "postgresql" {
  cluster_identifier      = "aurora-cluster-demo"
  engine                  = "aurora-postgresql"
  availability_zones      = ["us-west-2a", "us-west-2b", "us-west-2c"]
  master_username         = "postgres"
  master_password         = data.aws_ssm_parameter.password.value
  backup_retention_period = 7
  preferred_backup_window = "07:00-09:00"
}

Untuk bisa berjalan dengan sukses, kode Terraform di atas membutuhkan hak istimewa baca terhadap direktori /rds-postgres/master-password pada Parameter Store.

Integrasi kredensial dengan Ansible

Kredensial yang tersimpan pada Parameter Store dapat dibaca oleh Ansible menggunakan pengaya pencarian (lookup plugin) aws_ssm. Berikut contoh Ansible tasks untuk membuat basis data dan pengguna baru dengan memanfaat master password yang tersimpan di direktori /rds-postgres/master-password pada Parameter Store.

---
- name: Buat pengguna database dengan nama contoh-layanan-1
  postgresql_user:
    login_db: postgres
    login_host: aurora-cluster-demo..cluster-cnv7vpw69goe.us-west-2.rds.amazonaws.com
    login_user: postgres
    login_password: "{{ lookup('aws_ssm', '/rds-postgres/master-password') }}"
    name: contoh-layanan-1
    password: "{{ lookup('aws_ssm', '/contoh-layanan-1/password-database') }}"

- name: Buat database dengan nama contoh-layanan-1
  postgresql_db:
    maintenance_db: postgres
    login_host: aurora-cluster-demo..cluster-cnv7vpw69goe.us-west-2.rds.amazonaws.com
    login_user: postgres
    login_password: "{{ lookup('aws_ssm', '/rds-postgres/master-password') }}"
    name: contoh-layanan-1
    owner: contoh-layanan-1

Untuk berjalan dengan sukses, konfigurasi Ansible di atas membutuhkan hak istimewa baca terhadap direktori /rds-postgres/master-password dan /contoh-layanan-1/password-database pada Parameter Store.

Audit akses kredensial

Layanan AWS Parameter Store dan AWS KMS terintegrasi dengan layanan AWS CloudTrail. AWS CloudTrail adalah layanan yang dapat merekam aksi yang dilakukan pengguna, IAM role, ataupun layanan AWS lainnya terhadap Parameter Store dan KMS. Aksi yang dilakukan terekam sebagai catatan kejadian (event) pada CloudTrail. Catatan kejadian tersebut tersimpan secara permanent pada layanan AWS S3 sehingga cocok digunakan untuk keperluan audit.

Estimasi biaya operasional

Sistem pengelolaan kredensial terpusat dalam artikel ini melibat 2 komponen utama yang berdampak pada biaya operasional. Mereka adalah biaya operasional untuk AWS Parameter Store dan AWS KMS. Sistem pada artikel ini membutuhkan minimal 1 buah kunci AWS KMS dengan harga 1$ per bulan. Proses enkripsi dan dekripsi diberikan secara cuma-cuma untuk 20.000 operasi per bulan. Jika dalam satu bulan terdapat lebih dari 20.000 operasi, maka kelebihan operasi dikenakan biaya sebesar $0,03 per 10.000 operasi. AWS Parameter Store bisa digunakan secara gratis dengan batas 10.000 jumlah parameter per wilayah per akun AWS. Setiap parameter dibatasi ukurannya sebesar 4 KB.

Berikut simulasi biaya yang diperlukan untuk menyimpan kredensial 10 aplikasi dimana masing-masing aplikasi membutuhkan 3 buah kredensial dengan panjang kredensial 64 karakter. Setiap aplikasi di jalankan ulang setiap hari.

  • Biaya kunci AWS KMS: $1 per bulan
  • Biaya operasi enkripsi: 3 buah kredensial x 10 aplikasi = 30 operasi enkripsi
  • Biaya operasi dekripsi: 3 buah kredensial x 10 aplikasi x 30 hari per bulan = 9000 operasi dekripsi
  • Biaya Parameter Store: 3 buah kredensial x 10 aplikasi = 30 kredensial. Setiap kredensial memiliki panjang 64 karakter yang setara dengan 64 bytes.

Total biaya operasional adalah $1 per bulan. Dengan rincian perhitungan biaya kunci KMS + biaya operasi enkripsi dan dekripsi + biaya parameter store = $1 + $0 (9030 operasi. Masih dalam batas cuma-cuma 20.000 operasi per bulan) + $0 (masih dalam batas gratis 10.000 jumlah parameter dan ukuran 4 KB per parameter).

Kesimpulan

AWS Parameter Store adalah solusi yang patut dipertimbangkan oleh perusahaan TI dalam membangun sistem pengelolaan kredensial secara terpusat. Layanan ini memiliki kualitas sebagai berikut:

  • tingkat ketersediaan tinggi (99.9% ketersedian per bulan)
  • mendukung perekaman data yang terenkripsi dan perubahan versi
  • memiliki biaya operasional dan pemeliharaan yang rendah
  • mendukung pembatasan akses dan proes audit melalui AWS IAM dan AWS CloudTrail
  • terintegrasi baik dengan layanan lain seperti Chamber sebagai antarmuka baris perintah, Terraform, dan Ansible