NixOS ve gizli değerler
(isabelroses.com)- NixOS'ta gizli değerleri Nix yapılandırmasında, özel Git deposunda veya
git-cryptiçinde düz metin olarak tutarsanız Nix store herkes tarafından okunabildiği için makineye erişimi olan kişiler bu gizli değerleri okuyabilir - sops-nix,
.sops.yamlkuralları vesopsdüzenleme akışıyla gizli değer dosyalarını şifreler; etkinleştirme sırasında ana makinenin SSH anahtarıyla çözüp düz metni/run/secrets/<name>altındaki tmpfs içinde tutar - agenix,
secrets.nixiçinde her gizli değer için alıcı açık anahtarlarını tanımlar ve.agedosyalarını/run/agenix/<name>altındaki tmpfs içinde çözer; yeni ana makine eklerken veya anahtar değiştirirken yeniden anahtarlama gerekir - Gizli değerleri doğrudan dosya sisteminde tutma yöntemi tek sunucu veya dizüstü için mümkün olabilir; ancak
builtins.readFile "/var/lib/myservice/token"gibi değerlendirme anında okursanız değer Nix store içine gireceği için bundan kaçınılmalıdır - Yeni başlıyor ve yalnızca birkaç bağımsız token kullanıyorsanız agenix daha az prosedür gerektirir; posta sunucusu gibi ilişkili çok sayıda gizli değeri olan bir ana makinede ise birçok değeri tek dosyada toplamak için sops-nix daha uygundur
NixOS'ta gizli değerleri yönetirken temel risk
- NixOS'ta gizli değer yönetimi;
sops-nix,agenix/ragenix, dosya sistemini kullanma, özel Git deposu,git-cryptve doğrudan Nix yapılandırmasına yazma yaklaşımlarına ayrılır - Özel Git deposu,
git-cryptve doğrudan Nix yapılandırmasına yazma yöntemleri; makineyi paylaşıyorsanız veya yapılandırmayı yayımlamayı planlıyorsanız kullanılmamalıdır- Nix store herkes tarafından okunabildiği için, makineye erişim yetkisi olan biri gizli değerleri okuyabilir
- Bu risk, CVE-2026-31431(copyfail) ve CVE-2026-43284 ile CVE-2026-43500(dirtyfrag) gibi zafiyetlerin bulunduğu dönemlerde özellikle önemlidir
- Yayımlanmış yapılandırmalarda gizli değerlerin en az iki kez sızdığı görüldü; örnekler 1, 2 bağlantılarında duruyor
sops-nix
- sops-nix, ilk bakışta kurulumu zor görünebilse de belgeleri büyük ölçüde iyileşti; ayrıca
sopsun varsayılan olarak SSH anahtarlarıyla gizli değer şifreleme ve çözmeyi desteklemeye başlaması önemli bir gelişme - Ancak
sops-nix, bu SSH anahtarı desteğinde hâlâ geride ve ilgili çalışmalar sops-nix#779 ile sops-nix#922 içinde sürüyor - Kullanım akışı,
.sops.yamliçinde şifreleme/çözme kuralları oluşturup gizli değer dosyalarınısopskomutuyla düzenlemeye dayanır- Örneğin
secrets/*.yamlyolu içinagealıcısı olarak SSH açık anahtarı tanımlanabilir sops secrets/shush.yamlkomutunu çalıştırdığınızda seçtiğiniz düzenleyici açılır vehello: sopsgibi YAML değerleri yazabilirsiniz- Düzenleyiciden çıktığınızda değerler
ENC[AES256_GCM,...]biçiminde şifrelenir ve aynı komutla yeniden düzenlenebilir
- Örneğin
- NixOS yapılandırmasında işin çoğunu
sops-nixmodülü üstlenirdefaultSopsFile = ./secrets/shush.yaml;ile varsayılan gizli değer dosyası tanımlanırage.sshKeyPaths = [ "/etc/ssh/ssh_host_ed25519_key" ];ile ana makinenin SSH anahtarı belirtilirsecrets."hello"altındaowner,group,modetanımlanarak dosya izinleri ayarlanır
- Etkinleştirme sırasında
sops-nix, ana makinenin SSH anahtarıyla dosyayı çözer ve düz metni/run/secrets/<name>altında tutar- Bu yol tmpfs üzerinde olduğu için gizli değerler diske yazılmaz
- Değere ihtiyaç duyan servisler ilgili yolu okuyabilir
- Şablon özelliği, paylaşılan yapılandırmalarda veya başka kullanıcıların başvurduğu ayarlarda kullanışlıdır
- Bir servis yapılandırma dosyası düz metinle birlikte bazı gizli değerler gerektiriyorsa tüm dosyayı şifrelemeniz gerekmez
- Örneğin
SMTP_USER=isabeldüz metin kalabilirken,SMTP_PASSWORD=${config.sops.placeholder."mailserver/smtp_password"}gibi bir gizli değer yer tutucusu eklenebilir
agenix
- agenix,
sops-nixten farklı olarak gizli değerleri ve erişebilen anahtarlarısecrets.nixiçinde tanımladığı için Nix'e daha yakın bir kullanım hissi verir secrets.nixiçinde kullanıcı ve ana makine SSH açık anahtarları bağlanır ve her.agedosyasına hangi açık anahtarların erişebileceği belirtilir- Örneğin
"secret1.age".publicKeys = [ isabel host1 ];,"secret2.age".publicKeys = [ isabel host2 ];gibi her gizli değer için farklı alıcı listeleri tanımlanabilir
- Örneğin
- Gizli değer dosyaları
agenixCLI ile oluşturulmalıdıragenix -e secret1.agekomutuylasecret1.ageoluşturabilir veya daha sonra yeniden düzenleyebilirsiniz
- Ana makine yapılandırmasına bağlama yöntemi
sops-nixe benzer; ancak her gizli değer ayrı dosya olduğundan görünür yüzeyi daha küçüktürage.secrets.secret1.file = ./secrets/secret1.age;ile dosya belirtilirowner,group,modeile sahiplik ve izinler tanımlanır
- Açılışta ana makinenin SSH anahtarıyla her
.agedosyası çözülür ve/run/agenix/<name>altına yerleştirilir- Bu yol da tmpfs üzerindedir
- En sık takılan nokta yeniden anahtarlama (rekeying) sürecidir
- Yeni bir ana makine eklendiğinde veya anahtar değiştirildiğinde,
secrets.nixiçindepublicKeyslistesi değişen tüm gizli değerlerin yeniden şifrelenmesi gerekir agenix --rekeybunu yapar; ancak mevcut şifreli içeriği okuyabilmek için mevcut alıcılardan birinin özel anahtarı gerekir- Pratikte yeniden anahtarlama, eklenecek yeni ana makinede değil, en çok güvendiğiniz makinede yapılır
- Yeni bir ana makine eklendiğinde veya anahtar değiştirildiğinde,
Yalnızca dosya sistemini kullanma yaklaşımı
- Gizli değerleri doğrudan dosya sisteminde tutmak, yapılandırmanın artık makineyi tamamen tanımlayamaması gibi bir maliyet doğurur
- Yeniden kurulumda tüm dosyaları doğru konum ve sahiplikle tekrar yerleştirmeniz gerekir
- Özellikle sabaha karşı 2'de sunucu kurtarma gibi senaryolarda bu, kurtarma sürecini felakete çevirebilir
- Kaçınılması gereken desen
builtins.readFile "/var/lib/myservice/token"gibi kullanımlardır- Bu yöntem dosyayı değerlendirme anında okur ve içeriği Nix store içine dahil eder
- Nix store herkes tarafından okunabildiğinden, bu durum başta uyarılan başarısız yöntemle tamamen aynıdır
- Bunun yerine servise değerin kendisini değil, yolu vermek gerekir
- Örneğin services.*.environmentFiles gibi seçenekler kullanılabilir
- Tek bir sunucu veya dizüstünde kabul edilebilir olabilir; ancak bir filo yönetiyorsanız ya da yalnızca yapılandırmadan sıfırdan yeniden kurmak istiyorsanız
sops-nixveyaagenixdaha uygundur - Makine başına gerçekten depoya koyulmaması gereken bir veya iki değer varsa işe yarayabilir; ancak bunları ileride tekrar yerleştirme sorumluluğu gelecekteki size kalır
sops-nix ve agenix karşılaştırması
sops-nixi seçmenin başlıca nedeni, mümkün olduğunca çok veriyi tek dosyada toplayabilmesidir- Posta sunucusu gibi ilişkili çok sayıda gizli değer olduğunda,
agenixteki gibi yaklaşık 5 ayrı dosyaya bölmek yerine daha fazla değeri tek dosyada tutabilirsiniz - Güçlü bir araç olarak uzun süre kullanıma uygundur ve posta sunucusu gibi çok sayıda gizli değeri olan ana makinelerde önce düşünülmesi gereken seçenektir
- Posta sunucusu gibi ilişkili çok sayıda gizli değer olduğunda,
agenix, basitlik konusunda öne çıkar- Öğrenmeniz gereken bir YAML şeması yoktur
- Eşzamanlı tutmanız gereken bir
.sops.yamlyoktur secrets.nixdoğrudan Nix olduğu için, ana makine ve kullanıcılar için kullandığınızlet ... inbağlamalarını anahtarlar için de aynen kullanabilirsiniz- Zihinsel model “bir gizli değer, bir dosya, bir alıcı listesi” şeklindedir ve erişim kontrolü yaklaşımıyla iyi örtüşür
- Hareketli parça sayısı en az düzeyde kalırken ana makine bazlı anahtar erişim kontrolü sunduğu için, NixOS makinelerinde gizli değer yönetimine yeni başlayanlara önerilmesi kolay bir seçenektir
- Her iki araç da sorunu çözer; bugün farkların çoğu kullanılabilirlik düzeyindedir
- Yeni başlıyor ve birden fazla servis ilişkili gizli değer kümeleri gerektiriyorsa
sops-nixdaha iyi ölçeklenir - Yeni başlıyor ve çoğunlukla yalnızca birkaç bağımsız token varsa
agenix, amaca daha az prosedürle ulaştırır - İlk gizli değer aracınızı seçiyorsanız, akışa alışmak için
agenixile başlamak ve “her gizli değer için bir dosya” yaklaşımının rahatsızlığını gerçekten hissettiğiniz noktadasops-nixe geçmek daha mantıklıdır
- Yeni başlıyor ve birden fazla servis ilişkili gizli değer kümeleri gerektiriyorsa
- Kuantum dayanımıyla ilgili kısım düzeltilmiştir
1 yorum
Lobste.rs görüşleri
Şifrelenmiş gizli değer ile onun anahtarı ikisi de diskte değil mi? Yoksa bunlardan biri TPM gibi bir yerde mi tutuluyor?
Nix kullanmaya daha yeni başladım ve küçük self-hosting dağıtımlarında basit olduğu için dosya sistemine
scpile atma yöntemini kullanıyorumBiraz bakınınca SSH özel anahtarını TPM ile korumanın mümkün göründüğünü fark ettim; VM'de de olur mu diye merak ediyordum ama vTPM desteği olabileceğini görünce kendi soruma cevap vermiş oldum
Sunucu tarafında NixOps erişimi de var. Colmena'nın bunu nasıl yaptığına bakabilirsin: https://colmena.cli.rs/0.4/features/keys.html
Özünde, gizli değerleri barındıran güvenilir bir makinenin bunları uzak sunucuya itmesi söz konusu. Şu an
scpile yaptığın şeye benziyor ama süreci daha Nix usulü çalıştırıyorSon birkaç gecemi kendi sistem flake'imde agenix türü yapıyı yeniden kurmaya ayırdığım için yalnızca agenix hakkında konuşabilirim. İlgilenenler için agenix-rekey seçtim; çünkü gizli değerler içeren
.ymldosyaları bulundurmak gerekmiyor ve sende zaten olduğu gibi tüm gizli değerleri doğrudan Nix içinde ayarlayabiliyorsunŞifrelenmiş gizli değerler Nix store'da bulunur ve Nix store'daki diğer her şey gibi herkes tarafından okunabilir. Bu gizli değerleri çözen SSH özel anahtarı genelde gerçek SSH sunucusunun özel anahtarıdır; istenirse böyle olmayacak şekilde de ayarlanabilir. Gizli değerler etkinleştirme anında, aşağı yukarı önyükleme sırasında çözülür ve
/run/agenix/<user>içine yerleştirilirsecrix adlı araç bunu daha da ileri götürüp gizli değerleri bir systemd servisine bağlar; sonra da o servisi gizli değerlere ihtiyaç duyan servise bağlar. Böylece gizli değerler yalnızca ilgili servis çalışırken çözülür. Ama pratikte NixOS kullanıcıları servisleri sık sık açıp kapatmadığı için çoğu zaman bu, servislerin sürekli çalıştığı anlamına gelir. Kullanıcı oluşturma gibi sistem etkinleştirmesi için gereken gizli değerlerde işe yarayabilir
agenix-rekey, yeniden anahtarlamayı daha az can sıkıcı hale getirir ve
secrets.nixyerine flake çıktıları koyar. Anahtarın bir yarısı olarak YubiKey bölünmüş kimliği kullanır. Yeniden anahtarlama; o anahtar ve diğer yarıyla kimlik doğrulayıp gizli değerleri çözmek, ardından sunucunun SSH açık anahtarıyla onları yeniden anahtarlamak sürecidir. Açık anahtarlar sistem kurulurken üretilir; ben nixos-anywhere içinde--copy-host-keyskullanarak kurulum closure'ında üretilen anahtarları alıyorum. Şifrelenmiş gizli değerleri depoda tutuyorum ama yalnızca güvenilir builder'ların erişebildiği ayrı bir submodule içindeBu arada vTPM genelde donanım tabanlı değildir ve birçok sağlayıcı TPM sunsa bile çoğu zaman TPM v2 değil TPM v1.2 sunar. Benim sağlayıcım BinaryLane de böyle. Elbette ek bir güvenlik katmanı sağlar ama gerçek bir HSM gibi sihirli değildir; sağlayıcının ya da host düğümünün ele geçirilmesine karşı koruma sağlamaz. Gerçek HSM tabanlı vTPM sunabilmek sağlayıcı açısından muhtemelen çok maliyetlidir; AWS ise bunu AWS fiyatlarıyla sunuyor gibi görünüyor
agenix+agenix-rekey+age-plugin-1pkullanıyorumAna anahtarım 1Password içinde olduğu için dizüstü bilgisayarımın diskinde hiçbir kimlik bilgisi tutmadan herhangi bir sunucunun parolalarını düzenleyebiliyor, görüntüleyebiliyor ve yeniden anahtarlayabiliyorum
Çalışma zamanında anahtarlara erişmesi gereken sunuculara yetki verebilirsin. agenix-rekey'e o sunucunun hangi anahtarları görebileceğini söylersin ve
agenix rekeyçalıştırırsın; sonra ilgili sunucunun çözebileceği şifreli anahtar sürümü Nix store'a yazılır. O sunucunun SSH özel anahtarı yalnızca o sunucuda bulunur ve asla dışarı çıkmaz. agenix-rekey yeniden anahtarlama için yalnızca açık anahtara ihtiyaç duyarDolayısıyla gizli değerlerin ele geçirilmesi ya 1Password hesabımın hacklenmesiyle ya da o gizli değerleri kullanan sunucunun ele geçirilmesiyle olur
/etc/ssh/ssh_host_ed25519_keyile çözüp/run/agenix.düzerine bağlanmış ramfs içine koyarYani evet. Şifreli içerik, şifreleme anahtarı ve çözülmüş içerik dosya sistemi üzerinden erişilebilir durumda olur
https://github.com/oddlama/agenix-rekey
Üstelik uzun ömürlü kimlik bilgileri de giderek azalıyor. Uzun süreli kimlik bilgisi kopyalama modelinden uzaklaşıp donanım tabanlı kimlik bilgilerine geçiyorum; bunları ya doğrudan kullanıyorum ya da kısa ömürlü kimlik bilgileriyle takas ediyorum