Kritik parolaları sunucu ortamı değişkenlerinde saklamak güvenli midir?


23

Her biri hassas, kritik görev sistemleri (mesaj kuyrukları, veri depoları ve diğer hizmetler) için düz metin şifreler içeren yapılandırma dosyalarına sahip bir sunucu kümem var.

Bazı insanlar kritik şifreleri konfigürasyon dosyalarından sunucu altında çalışan kullanıcı hesaplarının ortam değişkenine taşır. Bu şekilde, konfigürasyon dosyaları sürüm kontrolüne adanabilir ve sistem yöneticisinin yalnızca sunucu sistemi kurulduğunda uygun bir ortam değişkeni yaratması gerekir. Doğal olarak, bu hizmetleri çalıştıran hesaplara erişim çok kısıtlıdır.

Bu, düz metin yapılandırma dosyalarındaki parolalardan kaçınmanın en iyi yolu mu, yoksa daha iyi bir yolu var mı?


3
Bir değişken olarak saklarsanız, hem dururken hem de bir kullanıcı sorguladığında düz metin halindedir. Bu, sunucu katmanının kontrolünü biraz kaybederseniz, saldırgana bir şifre verdiğiniz anlamına gelir. Muhtemelen kripto kullanır ve gerektiğinde şifre bilgisinin şifresini çözerdim.
Frank Thomas

Güzel düşünceler Frank. Eğer kripto kullanıyor olsaydın, ne tür bir sistem kullanırdın? RSA / SSH anahtarına, anahtarlık aracına veya başka bir şeye dayalı bir şey mi? Şu anda CentOS ve Amazon gibi Linux> 2.6 sistemlerini kullanıyoruz.
Steve HHH,

Yanıtlar:


11

Bir Linux sistemindeyseniz, / proc / * / environ dosyasına bakın ve ortam değişkenlerinin hassas bilgileri depolamak için iyi bir yer olup olmadığına karar verin. / proc / self mevcut işlemdir:

$ tr '\0' '\n' < /proc/self/environ
USER=me
LOGNAME=me
HOME=/home/me
PATH=/usr/bin:/bin:/usr/sbin:/sbin
MAIL=/var/mail/me
SHELL=/usr/bin/sh
SSH_CLIENT=1.2.3.4 58195 22
SSH_CONNECTION=1.2.3.4 58195 7.8.9.0 22
SSH_TTY=/dev/pts/1
TERM=xterm

Çevre değişkenini ayarlayan şeyin bir yerde bir dosyayı okuduğunu unutmayın.

Hatırlanması gereken şey, bir şifre kullanmanın şifre için programın uygun olduğu anlamına gelir. Bu şifre, bir programın her istediği zaman yazdığı bir kullanıcı tarafından sağlanmamışsa, bu programa yalnızca programın erişimine dayalı olarak erişilebilir olmalıdır. Parolayı yerel olarak şifreleyebilir ve programın bir anahtar kullanarak şifresini çözmesini sağlayabilirsiniz, ancak bunların tümü yanlışlıkla ifşa edilmesine karşı şifreyi gizlemektir; programla aynı erişime sahip olan bir kişi, şifreleme anahtarının okunmasını da içeren, programın yapabileceği şeyleri yapabilir.

Bunu yapmanın doğru yolu, uygulamanın sınırlı bir hesap olarak çalışmasını sağlamak ve şifreyi dosya sistemi düzeyinde izinlerle korunan bir dosyada saklamaktır. Umarım bir şifreyi sürüm kontrol sisteminden uzak tutmak için bir dosyayı veya benzerini "dahil edebilirsiniz" (VCS'nin güvenlik kontrolleri olmadığını varsayarak). İstemeden ifşa edilmeye karşı korunmak için, istediğiniz şekilde şifreyi gizleyin - base64 şifreleyin, şifrelemek için pgp kullanın, sunucu programınızın seçenek kümesinde ne mantıklı olursa olsun. Bunu yapmak için bir program yazıyorsanız, yapabileceğiniz en iyi şey, bir kullanıcıdan yalnızca gerektiğinde şifreyi sorması ve ardından bu şifreyi kullanıldığı anda bellekten temizlemektir.



3
Evet, programı çalıştıran kullanıcının sahip olduğu 0600 kipine sahip bir dosyaya, program ortamına erişebilen aynı kişi tarafından erişilebilir. Ancak, daha önce de belirttiğim gibi, ortam muhtemelen bir dosyayı okuyarak yapılandırılmıştır, dolayısıyla verileri ortama kopyalamak, verilerin bulunduğu yerlerin sayısını artırmaktadır. Ve çevre, varsayılan olarak alt işlemlere kopyalanır. Bazı programlarda, hatalardan veya kasıtlı tasarım kararlarından dolayı ortam değişkenlerini sorgulamak için dış araçlar vardır (think phpinfo ()). Bir dosya her iki şekilde de dahil edilecekse neden saldırı yüzeyini arttırın?
dannysauer

1
Verdiğin tr komutu benim için işe yaramadı - bu yaptı:cat /proc/self/environ | tr '\0' '\n'
robocat

Telefonumdayım, bu yüzden söylemesi zor ... Sıfır olmalı; "o" harfini yazdın mı?
dannysauer

8

Eğer ihtiyacı olan herhangi bir veri varsa Sonuçta, okumak sıra sıra yazılı , siz (veya eğer bir şifre ile bir şeyler korumak sonuna kadar gidiyoruz gerçekten fiziksel bir donanım akıllı kart ve PIN ile, paranoyak), hayır kaç tane şifreleme katmanınız olduğu önemli değil.

Bu, sistem güvenliği ve rahatlık gibi temel sorulara yol açar. Kötü niyetli bir aktörün, "mallara" ulaşmak için ihlal etmesi gereken çok sayıda ve çok sayıda güvenlik kontrolü katmanı ekleyerek "derinlemesine savunma" ekleyebilirsiniz, ancak meşru bir aktör bazı verileri okumak veya değiştirmek istediğinde, bir sürü çemberin içinden geçmek zorundalar. Alternatif, metin dosyalarındaki düz metin parolalarıdır.

Kritik bir sistemde bazı bilgileri gerçekten korumak isteseydim ne yapardım:

  1. Tam Disk Şifrelemesi'ni kullanın, böylece kalıcı depolama alanının tamamı şifrelenir.

  2. Makinelere fiziksel erişimi kısıtlayın. Makinenin kasasını güvenli bir kilitleme mekanizmasıyla kilitleyin ve tuşlara fiziksel erişimi kontrol edin. Erişim için kapı bekçileri olmak için kasları (silahlı muhafızlar) kiralayın.

  3. Cihazın işletim sisteminde ince taneli Zorunlu Erişim Kontrolü'nü (MAC) uygulayın. GNU / Linux'ta SELinux gibi bir şeyle başlayabilir ve Enforcing olarak ayarlayabilir ve ardından politikayı üretim yazılımının tam ihtiyaçlarına göre düzenleyerek bu hesaplara ihtiyaç duydukları izinleri tam olarak (ve sadece) almasını sağlar.

  4. Yapılandırma dosyaları için sisteme özel şifrelere ve sürüm kontrolüne sahip olacaksanız, yanlışlıkla bir sürüm şifresine bağlı bir düz metin şifresine sahip olma olasılığını önlemek istersiniz; VCS'nin önbelleği. Çevre değişkenleri bunun için geçerli seçeneklerden biridir. Diğeri, program başladığında bir şifre istemidir, ancak makineyi yeniden başlatmak ve işletim durumunu geri yüklemek manuel bir çabadır ve özerk bir şekilde yapılamaz, bu yüzden güvenlik ve tekrar güvenlik var.

  5. Güvenlik duvarı izinlerine dikkat etmek için, ağ üzerinden yapılan bir saldırıya maruz kalmanızı en aza indirgemek için elinizde ağ uzmanlarının bulunduğundan emin olun. Denetim (sızma testi ve beyaz kutu testi kodu) harici sistemler, özellikle de halka açık İnternet ile bağlantılı yazılımlar. "Arayüzler" sadece doğrudan ağ bağlantılarını değil, aynı zamanda "güvenilmeyen" verileri (baytları güvenli sunucunun RAM / disk / CPU dışından gelen veriler) okuma veya yazmayı da içerir.

Bu tam bir liste değildir, ancak özellikle 4. nokta muhtemelen sizin için önemlidir, ancak en az 1 ile 3 arasındaki adımları uygulamıyorsanız, 4. ve 5. noktaların dikkate alınması size çok yardımcı olmayacaktır, çünkü sistem oldukça temel düzeyde güvenli değil.


# 1 atlardım. Sistem çalışıyorsa, dosya sistemi monte edilir ve şifrelenmez. Çalışmıyorsa, fiziksel erişim kontrolünüz yeterli olmalıdır. Yeniden başlatılması gerekirse, her önyükleme işleminde (rahatsız edici olan) şifre çözme anahtarını sağlayacak birine ihtiyacınız vardır veya makinenin bunu sağlamasını sağlamanız gerekir - bu durumda kimlik bilgileri genellikle sabit sürücüye erişimi olan herkes tarafından kullanılabilir . Çoğu "sunucu" makinesi, bu takas maliyeti nedeniyle genellikle disk şifrelemesi kullanmaz. :)
dannysauer

"Bu benim yorumumda eşit şekilde geçerli olan - cevabımdan alıntı - Bu, sistem güvenliği ve kolaylık temel sorusuna indirgeniyor". Aynı zamanda güvenlik ve rahatlığı en üst düzeye çıkaramazsınız .
allquixotic

1
# 1, ramın bir kısmının diske (takma) çarpması veya daha sonra "kötü" olan ve işletim sisteminden uzaklaşan ancak hala bu ram parçasını tutan bir ssd sektörüne çarpması durumunda önemlidir. Diskin kilidi açılmış olsa bile, bu veri yığını plakalara karıştırılmış halde kalır.
akira

3

Bir ortam değişkeninde bir parola geçirmek, programın bir dosyadan okuması kadar güvenlidir. Yalnızca aynı kullanıcı olarak çalışan işlemler bir işlemin ortamını okuyabilir ve bu işlemlerin aynı dosyaları yine de okumasına izin verilir.

Bunun komut satırında bir parola geçirmekten farklı olduğunu unutmayın. Komut satırı argümanları, sadece aynı kullanıcı olarak çalışan işlemler değil aynı makine üzerinde çalışan tüm işlemler tarafından okunabilir (sertleştirme önlemleri).

Bir değişkeni ortamdan geçirirseniz, programın başka programlar başlattığına dikkat edin. Bu diğer programlar ebeveynlerinin çevresini devralacak. Bu nedenle, diğer programların yanlışlıkla ortamlarının içeriğini sızdırabileceğinden korkuyorsanız bunu yapmayın.

Senaryonuzdaki kusur “sunucu sistemi kurulduğunda uygun bir ortam değişkeni yaratma” dır. Bir ortam değişkeni bir işlemin dinamik bir özelliğidir. Bir sistemi kurarken yaratamazsınız, kurarsanız yeniden başlatmadan kurtulacak bir şey demek istemezseniz. Ne demek. Bu belli bir kullanıcı günlükleri (tipik bir yapılandırma dosyası üzerinden yapıldığında bu değişken için düzenlenmiş yönetici ortamda mevcut olması yani tahminen olan ~/.pam_environmentya ~/.profileveya bir dosya okuma ~/.profile). Dolayısıyla bu çözüm aslında şifreyi konfigürasyon dosyalarından çıkarmaz.

Parolaları kullanıcının oturum açma ortamında olacak şekilde ayarlamak, iyi bir fikir değildir. Bu, o kullanıcı olarak çalışan her sürecin sırrına sahip olacağı anlamına gelir, bu nedenle herhangi bir yerde bir sızıntıya karşı savunmasızdır.

Parola, sürüm kontrolü altındaki yapılandırma dosyalarından ve normal dağıtım mekanizmalarından ayrı bir dosyaya konulmalıdır. Eğer uygunsa şifreyi ortama bir noktaya koymak tamam, ancak mümkün olduğu kadar küçük bir program grubu için yapılmalıdır.

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.