Amankan komunikasi agent dan server Puppet melalui sertifikat SSL, penandatanganan certificate, dan autosign. Pelajari RBAC dan node classifier pada Puppet Enterprise, serta penyimpanan secrets dengan Hiera eyaml.

Di episode 12 kalian sudah belajar bagaimana Code Manager dan r10k mengelola environment dari git sehingga kode Puppet terkontrol dengan baik. Namun kode yang rapi belum berarti infrastruktur aman. Sertifikat yang tidak dikelola, node yang diizinkan masuk tanpa verifikasi, dan secrets yang menempel di manifest adalah resipi bencana.
Puppet menggunakan PKI berbasis X.509 untuk memastikan komunikasi antara agent dan server selalu terenkripsi dan terautentikasi. Di sisi lain, kontrol akses pengguna yang memakai console diatur oleh RBAC (Role-Based Access Control) pada Puppet Enterprise. Dan untuk data sensitif seperti password, kita memakai Hiera dengan enkripsi eyaml.
Pada episode ini kita akan membahas alur sertifikat SSL, perintah puppetserver ca, konsep autosign, komunikasi aman agent dan server, RBAC dan node classifier di PE, hingga menyimpan secrets dengan Hiera eyaml.
Saat Puppet agent pertama kali dijalankan, ia membuat certificate signing request (CSR) dan mengirimkannya ke server. Server tidak langsung mempercayai agent tersebut; certificate authority (CA) internal di server harus menandatangani CSR tersebut terlebih dahulu.
1. Agent : buat key + CSR, kirim ke server
2. Server : CA internal menandatangani CSR
3. Server : kirim sertifikat yang ditandatangani ke agent
4. Agent : komunikasi SSL dimulai dengan amanDi server, kita bisa melihat daftar CSR yang menunggu penandatanganan:
puppetserver ca listSetelah memastikan nama node benar, kita tandatangani:
puppetserver ca sign --certname web01.example.comDi sisi agent, status sertifikat bisa diverifikasi dengan puppet ssl show, dan ketika sertifikat bermasalah kita bisa meminta ulang dengan puppet ssl bootstrap.
Note
Sintaks puppet ssl diperkenalkan pada Puppet 6.4 dan menggantikan perintah lama puppet certificate serta puppet cert. Pada server, semua operasi CA kini dikelompokkan di bawah perintah puppetserver ca.
Signing manual untuk satu-dua node masih wajar, tetapi saat kita membuat banyak instance ephemeral, misalnya untuk autoscaling, signing manual menjadi penghambat. Puppet menyediakan autosign agar CSR ditandatangani otomatis berdasarkan aturan tertentu.
Cara paling sederhana adalah file autosign.conf dengan pola hostname:
*.infra.example.com
loadtest*.example.comWarning
Jangan pernah membuat autosign terlalu longgar. Autosign yang menerima semua nama node membuat siapa pun yang bisa menebak hostname dapat mengirim catalog palsu dan mengambil alih node. Batasi ke pola hostname internal yang benar-benar kalian kendalikan.
Untuk puppetserver berbasis JVM, kita bisa menunjuk ke script eksternal yang memvalidasi token atau metadata cloud sebelum menandatangani:
autosign:
mode: external
script: /usr/local/bin/policy-autosign.shError sertifikat adalah penyebab paling umum agent gagal berbicara dengan server. Dua kasus yang paling sering ditemui:
SSL_connect returned=1 errno=0 peer did not return a certificate.server_list atau server pada puppet.conf di agent.Perbaikan cepat untuk node yang salah: hapus sertifikat di agent lalu minta ulang.
puppet ssl clean
puppet ssl bootstrapPada Puppet Enterprise, akses ke console diatur lewat RBAC. Setiap user masuk ke group dengan permission tertentu, misalnya role Operators hanya boleh melihat node, sedangkan Code Deployers boleh menjalankan deploy code.
| Role | Kemampuan |
|---|---|
| Administrators | Semua akses console dan API |
| Code Deployers | Deploy code environment |
| Operators | Melihat node, status run, dan reports |
| Viewers | Hanya membaca, tanpa aksi |
Di balik layar, console memakai node classifier untuk menentukan kelas mana yang diterapkan ke node mana. Rule berbasis fakta dapat mengelompokkan node, misalnya semua node dengan kernel Linux dan fakta khusus tertentu masuk ke group tertentu.
{
"name": "Web Servers",
"rule": ["and", ["=", ["fact", "kernel"], "Linux"], ["=", ["fact", "is_web"], true]],
"classes": {
"profile::webserver": {}
}
}Node yang masuk ke beberapa group akan menerima kelas dari seluruh group tersebut. Halaman Classification di console menyimpan rule ini sebagai data terstruktur, bukan sebagai manifest yang di-hardcode.
Hiera menyimpan data hierarkis, tetapi menyimpan password dalam plain text di repository adalah pelanggaran serius. Solusinya adalah hiera-eyaml, yang memungkinkan enkripsi nilai secara selektif di dalam file data.
Pertama, pastikan plugin eyaml terpasang di server dan agent:
gem install hiera-eyamlUntuk membuat pasangan key:
eyaml createkeysUntuk mengenkripsi sebuah nilai:
eyaml encrypt -s 's3cr3t-password'Hasil enkripsi ditempatkan di dalam file hieradata:
profile::db::password: >-
ENC[PKCS7,MIIBmQYJKoZIhvcNAQcDoIIBijCC...]Important
Private key eyaml harus dirahasiakan dan di-deploy secara aman ke server Puppet, jangan pernah di-commit ke control repository. Public key boleh dibagikan supaya developer bisa mengenkripsi nilai baru tanpa bisa mendekripsinya. Di Puppet Enterprise, private key berada di /etc/puppetlabs/puppet/eyaml/private_key.pkcs7.pem.
Kehadiran marker ENC[...] membuat review kode tetap bisa berjalan: developer melihat bahwa di sana ada secrets, tetapi isinya tidak terbaca di git.
Pada episode 13 ini kalian sudah memahami bahwa keamanan Puppet berlapis: sertifikat SSL mengamankan komunikasi agent dan server, autosign mempercepat provisioning node baru secara terkendali, RBAC membatasi siapa yang bisa menyentuh console PE, dan Hiera eyaml menjaga secrets tetap terenkripsi di repository.
Inti yang harus dibawa pulang:
puppetserver ca sign.Sampai di sini kita banyak memakai modul yang kita tulis sendiri. Namun di dunia nyata, sebagian besar pekerjaan dilakukan di atas modul publik. Di episode 14 kita akan membahas Belajar Puppet - Modules & Forge: mencari modul berkualitas di Puppet Forge, mengevaluasi maintainernya, hingga mengembangkan module sendiri dengan PDK.