.Tf ve .tfstate’deki sırları nasıl yönetebilirim?


46

MySQL kullanıcılarının ve bağışların bir listesini tutmak için Terraform MySQL Sağlayıcısını kullanmak istiyorum . .tfVe .tfstatedosyalar hem düz metin olarak MySQL şifreleri saklamak istiyor gibi görünüyor.

.Tf ile ilgili olarak:

Anladığım kadarıyla, .tfdosyalar revizyon kontrolünde yaşıyor ve bir ekip tarafından tutuluyor. Sırlar içindeyken bu uygulama nasıl farklılık gösterir .tf? Bu değerleri hiç şifrelemek mümkün mü?

.Tfstate ile ilgili olarak:

.tfstateTerraform uygulamasının çalıştırılmasından sonra güvenli bir yerde saklayabilirim , ancak bu kullanım durumunda saklamaması tercih edilir mi?

Yanıtlar:


22

Terraform , arama sırasında değişkenlerle ek bir dosya eklemeyi destekler .

belgeler: https://www.terraform.io/intro/getting-started/variables.html#from-a-file

Bu özelliği secrets.tfvarsTerraform'un her çağrısında bir dosya sağlamak için kullanıyoruz . Ayrıca, komutu çağırmak için tutarlı olması için komut dosyası sarmak için bir komut dosyası kullanırız ve tüm ekip üyeleri aynı hataları yapmaktan kaçınırlar. Sarıcı .tfstate, bir yürütmeden önce S3 ile senkronize olur .tfstateve sonunda S3'e geri döner. Ayrıca, Konsolos'ta saklanan devletle aynı şeyi yapan insanların, hatta Terraform'a aynı anda başlamasını önlemek için konsolosluğa bir tür semafor ekleyen insanlar duyuyorum.

Bir variables.tfdosyada varsayılan bir değer ayarlamaktan kaçındığınızda , kullanıcıyı değeri girmeye zorlar. Manuel olarak girilebilir veya -var-fileyukarıda açıklandığı gibi komut seçeneğini kullanarak girilebilir . Sırlarınızda bir varsayılan ayar yapmamak, sırlarda değişiklik gerektiren değişiklikleri uygulamak için iyi bir yoldur.

secrets.tfvarsDosya sürümü kontrolü saklanmaz sırları ile dosyaların birine sembolik bağlantıdır. Böylece gibi çevre başına birkaç tane var secrets-prod.tfvars, secrets-dev.tfvars, secrets-stg.tfvars, vb ...

Daha iyi bir uygulama, Vault'daki verilere veya sırları paylaşmanın başka bir yoluna dayanan sarmalayıcı komut dosyası sırasında bu sır dosyalarının üretilmesi olacaktır . Şu anda sırların formatı değiştiğinde ya da sırlarını gizlediğinde, onu sürüm kontrol kanalı dışındaki takıma iletmemiz gerekiyor - bu dürüst olmak gerekirse, her zaman iyi sonuç vermiyor. Ancak sırlar nadiren değişir.



8

Terraform'un sırlarımızı ele almasından kaçınırız. Yukarıda belirtildiği gibi "secrtes.tfvars" var dosyasıyla sırları enjekte etmeyi başarsanız bile, bu sırlar terraform (uzak) durumunda saklanır.

Uzak durumdaki dosyaları örneğin S3 yetkilendirmesi kullanarak koruyabilirsiniz veya yerel durum dosyalarından uzaklaşabilirsiniz ancak bu tür bir korumaya güvenmemeye karar verdik.


2
Ayrıca , tfstate sızdıran sırlar konusunu takip ettikleri yer olan github.com/hashicorp/terraform/issues/516 adresini de kontrol edin
jottr

6

Eğer AWS'deyseniz , AWS Blog'daki Segment.io tarafından "Sırları Yönetmenin Doğru Yolu" na bakın . Sırlarımızı chamberyönetmek için tüm müşterilerimize kullanmayı savunuyoruz . AWS Sistem Yöneticisi Parametre Deposunu (SSM) KMS tuşları ile birlikte kullanarak kaldırarak çalışır. Bu, sırların istirahatte (ve transit olarak) şifrelenmesini, IAM ile güvence altına alınmasını, CloudTrails ile denetlenebilmesini ve yalnızca çalışma zamanında ortam değişkenleri olarak ortaya çıkmasını sağlar.

Bölmeyi yapılandırdıktan ve KMS anahtarını ayarladıktan sonra , sırları parametre deposuna yazarız.

chamber write db TF_VAR_DB_USER foobar
chamber write db TF_VAR_DB_PASS secret

Terraform deyince bu sırları kullanın.

chamber exec db -- terraform plan

Bu , HCL kodunuzda DB_USERve adında bir değişken tanımladığınızı varsayar DB_PASS.

Örneğin, bunu variables.tf

variable "DB_USER" { }
variable "DB_PASS" { }

NOT: chamber her zaman çevre değişkenlerini büyük harf olarak verir

terraform-aws-kms-keyKMS anahtarının sağlanmasını kolaylaştırmak için adlandırılan bir terraform modül sunuyoruz . Sırları yönetmek içinchamber birden fazla ad alanıyla nasıl kullanılacağına ve aynı zamanda odaların terraform ile nasıl kullanılacağına dair örnekler içeren ayrıntılı belgelere göz atın . Hazne bağımlılıkları sağlama için referans örneğimize bakın .

Gelince .tfstate, sen devlet dosyasında düz metin sırlarının varlığı hakkında gerçekten iyi bir noktaya getirmek. Bunun için gerçekten bir yol yok. Terraform'un bir plan oluşturmak için değişiklikleri hesaplayabilmesi için "önce" ve "sonra" durumunu bilmesi gerekir. Bu nedenle, zorunlu versiyonlamaya sahip şifreli bir S3 kovası kullanmanızı öneririz. terraform-aws-tfstate-backendEn iyi uygulamalara göre bir kova ve DynamoDB kilitleme masası sağlamak için modülü kullanın .


Bu, sorunun söz etmediği ve öncül altyapılar veya başka herhangi bir bulut için gerçekten bir cevap olmadığı kılan AWS hizmetlerine oldukça bağlıdır.
Tensibai

@tensibai, haklısın. Orijinal soru, en iyi tavsiyeyi yapmak için işletim platformunu belirlemek için yeterli bilgi sağlamaz. Platform yeteneklerine bağlı olarak her platform farklı olacaktır. Kurum içi veya baremetal kullanıcılar Vault ve Terraform Enterprise kombinasyonunu kullanmayı düşünebilirler. Uygulamanın kapsamı çok daha büyük olacak. :)
Erik Osterman

Zaten AWS Secrets Manager'ı kullanıyorum ve odayı ve Parametre Deposunu kullanmak istemiyorum. Aynı şeyi Secrets Manager ile de yapmak mümkün mü?
red888


2

Birkaç farklı yoldan baktım ama özellikle Vault gibi daha büyük bir şey uygulamadan önce yapışan bir şey için git-crypt'i beğendim.


2
Kimin oy verdiğini görmek için lütfen nedenini açıkla
jottr
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.