NixOS dan rahasia
(isabelroses.com)- Jika rahasia di NixOS disimpan dalam konfigurasi Nix, repositori Git privat, atau
git-cryptdalam bentuk plaintext, Nix store dapat dibaca oleh siapa pun sehingga siapa pun yang memiliki akses ke mesin bisa membaca rahasia tersebut - sops-nix mengenkripsi file rahasia dengan aturan
.sops.yamldan alur editsops, lalu saat aktivasi mendekripsinya dengan kunci SSH host dan menaruh plaintext di tmpfs pada/run/secrets/<name> - agenix menetapkan kunci publik penerima untuk tiap rahasia di
secrets.nix, mendekripsi file.ageke tmpfs pada/run/agenix/<name>, dan memerlukan rekeying saat menambah host baru atau mengganti kunci - Pendekatan menaruh rahasia langsung di filesystem bisa dipakai untuk satu server atau laptop, tetapi jika dibaca pada waktu evaluasi seperti
builtins.readFile "/var/lib/myservice/token", nilainya akan masuk ke Nix store sehingga harus dihindari - Jika baru memulai dan hanya punya beberapa token yang independen, agenix butuh prosedur yang lebih sedikit; jika host seperti mail server punya banyak rahasia yang saling terkait, sops-nix yang menggabungkan banyak nilai dalam satu file lebih cocok
Risiko dasar saat menangani rahasia di NixOS
- Pengelolaan rahasia di NixOS umumnya terbagi ke
sops-nix,agenix/ragenix, pemanfaatan filesystem, repositori Git privat,git-crypt, dan menuliskannya langsung ke konfigurasi Nix - Metode repositori Git privat,
git-crypt, dan menulis langsung ke konfigurasi Nix tidak boleh dipakai jika mesin dibagi pakai atau jika Anda berencana memublikasikan konfigurasi- Nix store dapat dibaca siapa pun, sehingga orang yang punya akses ke mesin dapat membaca rahasia
- Risiko ini terutama penting saat ada kerentanan seperti CVE-2026-31431(copyfail) dan CVE-2026-43284 serta CVE-2026-43500(dirtyfrag)
- Rahasia setidaknya pernah bocor dua kali dari konfigurasi yang dipublikasikan, dan contohnya masih ada di 1, 2
sops-nix
- sops-nix bisa terasa sulit dikonfigurasi saat pertama kali ditemui, tetapi dokumentasinya sudah jauh membaik dan peningkatan besar lainnya adalah
sopskini mendukung enkripsi/dekripsi rahasia dengan kunci SSH secara bawaan - Namun
sops-nixmasih tertinggal dalam dukungan kunci SSH ini, dan pekerjaan terkait sedang berlangsung di sops-nix#779, sops-nix#922 - Alur penggunaannya adalah membuat aturan enkripsi/dekripsi di
.sops.yaml, lalu mengedit file rahasia dengan perintahsops- Contohnya, untuk path
secrets/*.yaml, kunci publik SSH ditetapkan sebagai penerimaage - Menjalankan
sops secrets/shush.yamlakan membuka editor pilihan Anda, dan Anda bisa menulis nilai YAML sepertihello: sops - Saat editor ditutup, nilainya akan dienkripsi dalam bentuk
ENC[AES256_GCM,...], dan bisa diedit lagi dengan perintah yang sama
- Contohnya, untuk path
- Dalam konfigurasi NixOS, modul
sops-nixmenangani sebagian besar pekerjaandefaultSopsFile = ./secrets/shush.yaml;menetapkan file rahasia defaultage.sshKeyPaths = [ "/etc/ssh/ssh_host_ed25519_key" ];menetapkan kunci SSH host- Di
secrets."hello",owner,group, danmodedapat ditetapkan untuk mengatur izin file
- Pada saat aktivasi,
sops-nixmendekripsi file dengan kunci SSH host dan menaruh plaintext di/run/secrets/<name>- Path ini berada di tmpfs, jadi rahasia tidak menyentuh disk
- Layanan yang membutuhkan nilainya cukup membaca path tersebut
- Fitur template berguna dalam konfigurasi bersama atau konfigurasi yang dirujuk pengguna lain
- Jika file konfigurasi layanan membutuhkan plaintext dan sebagian nilai rahasia sekaligus, Anda tidak perlu mengenkripsi seluruh file
- Misalnya,
SMTP_USER=isabelbisa dibiarkan sebagai plaintext, lalu placeholder rahasia ditaruh sepertiSMTP_PASSWORD=${config.sops.placeholder."mailserver/smtp_password"}
agenix
- agenix, tidak seperti
sops-nix, mengatur rahasia dan kunci yang boleh mengaksesnya disecrets.nix, sehingga terasa lebih dekat dengan gaya Nix secrets.nixmengikat kunci publik pengguna dan host, lalu menetapkan kunci publik mana yang boleh mengakses tiap file.age- Misalnya,
"secret1.age".publicKeys = [ isabel host1 ];,"secret2.age".publicKeys = [ isabel host2 ];memungkinkan daftar penerima yang berbeda untuk tiap rahasia
- Misalnya,
- File rahasia harus dibuat dengan CLI
agenix- Perintah
agenix -e secret1.agedapat digunakan untuk membuatsecret1.ageatau mengeditnya lagi nanti
- Perintah
- Cara menghubungkannya ke konfigurasi host mirip dengan
sops-nix, tetapi karena tiap rahasia adalah file terpisah, permukaannya lebih kecilage.secrets.secret1.file = ./secrets/secret1.age;menetapkan fileowner,group, danmodemenetapkan kepemilikan dan izin
- Saat boot, tiap file
.agedidekripsi dengan kunci SSH host dan ditaruh di/run/agenix/<name>- Path ini juga berada di atas tmpfs
- Bagian yang paling sering menjadi hambatan adalah rekeying
- Jika host baru ditambahkan atau kunci diganti, semua rahasia yang daftar
publicKeys-nya berubah disecrets.nixharus dienkripsi ulang agenix --rekeymenangani ini, tetapi membutuhkan kunci privat dari salah satu penerima saat ini untuk membaca ciphertext yang ada- Dalam praktiknya, rekeying dilakukan pada mesin yang paling dipercaya, bukan pada host baru yang akan dinaikkan
- Jika host baru ditambahkan atau kunci diganti, semua rahasia yang daftar
Pendekatan yang hanya memakai filesystem
- Menaruh rahasia langsung di filesystem punya biaya bahwa konfigurasi tidak lagi sepenuhnya menjelaskan mesin
- Saat reinstall, semua file harus dikembalikan lagi ke lokasi dan kepemilikan yang benar
- Dalam pekerjaan pemulihan, seperti saat memulihkan server pada pukul 2 pagi, ini bisa menjadi bencana besar
- Pola yang harus dihindari adalah bentuk seperti
builtins.readFile "/var/lib/myservice/token"- Cara ini membaca file pada waktu evaluasi dan memasukkan isinya ke Nix store
- Karena Nix store dapat dibaca siapa pun, hasilnya persis sama dengan pola kegagalan yang diperingatkan di awal
- Sebagai gantinya, yang diberikan ke layanan bukan nilainya langsung melainkan path-nya
- Misalnya, Anda bisa memakai opsi seperti services.*.environmentFiles
- Untuk satu server atau laptop ini mungkin cukup baik, tetapi jika Anda mengelola armada mesin atau ingin dapat membangun ulang dari nol hanya dari konfigurasi,
sops-nixatauagenixlebih cocok - Jika tiap mesin hanya punya satu-dua nilai yang benar-benar tidak boleh masuk repositori, pendekatan ini masih bisa diterima, tetapi tanggung jawab untuk menaruhnya kembali nanti akan diwariskan kepada diri Anda di masa depan
Perbandingan sops-nix dan agenix
- Alasan utama memilih
sops-nixadalah kemampuannya menggabungkan sebanyak mungkin data ke dalam satu file- Untuk kasus seperti mail server yang memiliki banyak rahasia terkait, lebih banyak rahasia bisa diletakkan dalam satu file alih-alih dipecah menjadi sekitar lima file seperti pada
agenix - Ini cocok untuk terus dipakai sebagai alat yang kuat, dan layak menjadi pilihan pertama pada host seperti mail server yang punya sangat banyak rahasia
- Untuk kasus seperti mail server yang memiliki banyak rahasia terkait, lebih banyak rahasia bisa diletakkan dalam satu file alih-alih dipecah menjadi sekitar lima file seperti pada
agenixunggul dalam kesederhanaan- Tidak ada skema YAML yang perlu dipelajari
- Tidak ada
.sops.yamlyang harus disinkronkan - Karena
secrets.nixhanyalah Nix biasa, bindinglet ... inyang Anda pakai untuk host dan pengguna bisa diterapkan apa adanya juga pada kunci - Model mentalnya adalah “satu rahasia, satu file, satu daftar penerima”, dan ini selaras dengan cara kerja kontrol akses
- Karena jumlah komponen bergeraknya paling sedikit sambil tetap menyediakan kontrol akses berbasis kunci per host, ini adalah pilihan yang mudah direkomendasikan kepada orang yang baru pertama kali bertanya tentang pengelolaan rahasia di mesin NixOS
- Kedua alat menyelesaikan masalah yang sama, dan perbedaannya saat ini kebanyakan terkait usability
- Jika baru memulai dan beberapa layanan membutuhkan sekumpulan rahasia yang saling terkait,
sops-nixlebih mudah diskalakan - Jika baru memulai dan sebagian besar hanya punya beberapa token independen,
agenixmencapai tujuan dengan prosedur yang lebih sedikit - Jika memilih alat rahasia pertama, ada baiknya mulai dengan
agenixuntuk membiasakan diri dengan alurnya, lalu berpindah kesops-nixketika Anda benar-benar merasakan ketidaknyamanan model “satu file per rahasia”
- Jika baru memulai dan beberapa layanan membutuhkan sekumpulan rahasia yang saling terkait,
- Bagian terkait ketahanan kuantum telah dikoreksi
1 komentar
Komentar Lobste.rs
Bukankah secret terenkripsi dan kuncinya sama-sama ada di disk? Atau salah satunya disimpan di tempat seperti TPM?
Saya baru mulai memakai Nix, dan untuk deployment self-hosting kecil saya memakai cara sederhana dengan menaruhnya ke filesystem via
scpSetelah sedikit mencari, sepertinya SSH private key bisa dilindungi dengan TPM, dan saya juga penasaran apakah itu bisa dilakukan di VM, tetapi ternyata mungkin ada dukungan vTPM, jadi saya seperti sudah menjawab pertanyaan saya sendiri
Saya juga punya akses NixOps di sisi server. Lihat saja cara yang dilakukan Colmena: https://colmena.cli.rs/0.4/features/keys.html
Intinya adalah mesin tepercaya yang memegang secret mendorongnya ke server jarak jauh. Mirip dengan yang Anda lakukan sekarang memakai
scp, hanya saja prosesnya dijalankan dengan cara yang lebih ala NixKarena saya baru menghabiskan beberapa malam terakhir untuk menyiapkan ulang rangkaian agenix di flake sistem saya, saya hanya bisa berbicara tentang agenix. Untuk yang tertarik, saya memilih agenix-rekey, karena saya tidak perlu menyimpan file
.ymlyang berisi secret, dan bisa mengatur semua secret langsung di dalam Nix seperti yang sudah saya lakukanSecret terenkripsi ada di Nix store, dan seperti hal lain di Nix store, dapat dibaca secara global. SSH private key untuk membuka secret itu biasanya adalah private key milik server SSH yang sebenarnya, meskipun secara opsional bisa juga tidak demikian. Secret didekripsi saat aktivasi, kira-kira pada waktu boot, lalu ditempatkan di
/run/agenix/<user>Alat bernama secrix melangkah lebih jauh dengan mengikat secret ke service systemd, lalu mengikat service itu kembali ke service yang membutuhkan secret tersebut. Jadi secret hanya didekripsi saat service itu berjalan. Namun dalam praktiknya, pengguna NixOS jarang menyalakan dan mematikan service sesering itu, jadi biasanya artinya service tersebut tetap berjalan terus. Ini mungkin cocok untuk secret aktivasi sistem seperti pembuatan pengguna
agenix-rekey membuat rekeying tidak terlalu merepotkan, dan menggantikan
secrets.nixdengan output flake. Ia memakai ID split YubiKey untuk satu setengah bagian dari kunci. Rekeying adalah proses mengautentikasi dengan kunci itu dan separuh lainnya untuk mendekripsi secret, lalu mengenkripsi ulangnya dengan SSH public key milik server. Public key itu dibuat saat instalasi sistem, dan saya mengambil kunci yang dibuat dari closure instalasi memakai--copy-host-keysdi nixos-anywhere. Secret terenkripsi saya simpan di dalam repositori, tetapi di submodule terpisah yang hanya bisa diakses builder tepercayaSebagai catatan, vTPM biasanya tidak berbasis hardware, dan banyak penyedia, bahkan ketika menyediakan TPM, kebanyakan hanya menyediakan TPM v1.2 alih-alih TPM v2. Penyedia saya, BinaryLane, juga begitu. Memang ini menambah satu lapis keamanan, tetapi ini bukan HSM ajaib seperti TPM sungguhan, dan tidak akan melindungi Anda dari kompromi penyedia atau node host. Untuk memungkinkan vTPM berbasis HSM sungguhan, dari sisi penyedia tampaknya biayanya akan sangat besar, dan AWS tampaknya menawarkannya dengan harga khas AWS
agenix+agenix-rekey+age-plugin-1pMaster key saya ada di 1Password, jadi saya bisa mengedit, melihat, dan me-rekey password server mana pun tanpa menyimpan kredensial apa pun di disk laptop
Saya bisa memberi akses ke server yang memerlukan akses kunci saat runtime. Saya memberi tahu agenix-rekey kunci mana yang boleh dilihat server itu dan menjalankan
agenix rekey, lalu versi kunci terenkripsi yang bisa didekripsi server tersebut dicatat ke Nix store. SSH private key milik server itu hanya ada di server tersebut dan tidak pernah keluar. agenix-rekey hanya memerlukan public key untuk rekeyingJadi, secret akan bocor jika akun 1Password saya dibobol, atau jika server yang memakai secret itu dibobol
/etc/ssh/ssh_host_ed25519_key, lalu diletakkan di ramfs yang dimount di/run/agenix.dJadi benar. Konten terenkripsi, kunci enkripsi, dan konten yang sudah didekripsi semuanya bisa diakses dari filesystem
https://github.com/oddlama/agenix-rekey
Selain itu, kredensial yang bertahan lama juga makin sedikit. Saya sedang menjauh dari menyalin kredensial jangka panjang menuju kredensial berbasis hardware, lalu memakainya secara langsung atau menukarnya dengan kredensial berumur pendek