İlk olarak , birkaç kişinin daha önce de söylediği gibi, kimlik bilgilerini senaryodan ayrı tutmak önemlidir. (Artırılmış güvenliğe ek olarak, aynı komut dosyasını farklı kimlik bilgileri olan birkaç sistemde yeniden kullanabileceğiniz anlamına gelir.)
İkincisi , yalnızca kimlik bilgilerinin güvenliğini değil, aynı zamanda bu kimlik bilgilerinin tehlikeye atılması durumunda da etkisini göz önünde bulundurmalısınız. Veritabanına tüm erişim için tek bir şifreniz olmamalı, farklı erişim seviyelerinde farklı kimlik bilgilerine sahip olmalısınız. Örneğin, veritabanında arama yapabilme yeteneğine sahip bir DB kullanıcısına sahip olabilirsiniz - bu kullanıcının salt okunur erişime sahip olması gerekir. Başka bir kullanıcı yeni kayıt ekleme iznine sahip olabilir, ancak silme hakkına sahip olmayabilir. Üçüncüsü, kayıtları silme iznine sahip olabilir.
Her bir hesap için izinleri kısıtlamanın yanı sıra, her bir hesabın kullanılabileceği yerle ilgili bir kısıtlama da olmalıdır. Örneğin, web sunucunuz tarafından kullanılan hesabın, web sunucusundan başka bir IP adresinden bağlanmasına izin verilmemelidir. Veritabanına tam kök izinleri olan bir hesap, nereden bağlanabileceği açısından gerçekten çok kısıtlanmalı ve etkileşimli olarak asla kullanılmamalıdır. Ayrıca, her hesapta yapılabilecekleri tam olarak sınırlamak için veritabanında saklı yordamları kullanmayı düşünün.
Bu kısıtlamaların sistemin DB-sunucu tarafında uygulanması gerekir, böylece müşteri tarafı tehlikeye girse bile kısıtlamalar ondan değiştirilemez. (Ve tabii ki, DB sunucusunun DB konfigürasyonuna ek olarak güvenlik duvarları vb. İle de korunması gerekiyor.)
Yalnızca sınırlı salt okunur erişime izin verilen ve yalnızca belirli bir IP adresinden izin verilen bir DB hesabı söz konusu olduğunda, verilerin hassasiyetine ve betiğin ana bilgisayarının güvenliğine bağlı olarak, bundan daha fazla kimlik bilgilerine ihtiyacınız olmayabilir. kaçıyor. Bir örnek, web sitenizde, yalnızca web sayfasında sunulacak bilgileri ayıklayan saklı bir yordam kullanmasına izin verilen bir kullanıcıyla çalıştırılabilecek bir arama formu olabilir. Bu durumda, bir şifre eklemek gerçekten fazladan bir güvenlik sağlamaz, çünkü bu bilgi zaten herkese açıktır ve kullanıcı daha hassas olabilecek başka verilere erişemez.
Ayrıca, veri tabanı bağlantısının TLS kullanılarak yapıldığından emin olun, aksi takdirde ağı dinleyen herhangi biri kimlik bilgilerinizi alabilir.
Üçüncüsü , ne tür bilgiler kullanacağınızı düşünün. Şifreler sadece bir formdur ve en güvenli değildir. Bunun yerine, bir tür kamu / özel anahtar çifti veya AD / PAM veya benzerini kullanabilirsiniz.
Dördüncüsü , betiğin çalışacağı koşulları göz önünde bulundurun:
Etkileşimli olarak çalıştırılıyorsa, şifreyi veya şifreyi özel anahtarın veya özel anahtarın içine girmeli veya geçerli bir Kerberos bileti ile giriş yapmış olmalısınız, çalıştırdığınızda - başka bir deyişle, komut dosyası Bir dosyadan okumak yerine, siz çalıştırdığınız sırada doğrudan sizden kimlik bilgileri alabilirsiniz.
Bir web sunucusundan çalıştırılıyorsa, web sunucusunu başlattığınız sırada kimlik bilgilerini ayarlamayı düşünün. Buradaki en iyi örnek SSL sertifikaları - genel bir sertifikaya ve özel bir anahtara sahipler ve özel anahtara bir şifre giriyor. Özel anahtarı web sunucusunda saklayabilirsiniz, ancak Apache'yi başlattığınızda şifreyi girmeniz gerekir. Sunucu başlatıldıktan sonra çıkarılabilecek veya kilitlenebilecek bir fiziksel kart veya HSM gibi bir tür donanım hakkında da bilgi sahibi olabilirsiniz. (Tabii ki, bu yöntemin dezavantajı, bir şey olursa sunucunun kendi başına yeniden başlatılamamasıdır. Bunu, sistemimin tehlikeye atması riskine tercih ederim, ancak kilometreniz değişebilir ...)
Senaryo cron'dan çalıştırılıyorsa, zor kısım budur. Sisteminizde herhangi birisinin birisinin onlara erişebileceği herhangi bir yerde yalan söylemesini istemezsiniz - ancak betiğinizin onlara erişebilmesi için etrafta yattığını mı istiyorsunuz? Pekala, doğru değil. Komut dosyasının ne yaptığını tam olarak düşünün. Veritabanında hangi izinlere ihtiyaç duyuyor? Yanlış kişinin bu izinlerle bağlantısı olup olmaması önemli değil, böylece kısıtlanabilir mi? Bunun yerine komut dosyasını doğrudan, başkalarının erişimine sahip olan sunucu yerine, başkalarının erişemediği DB sunucularında çalıştırabilir misiniz? Aklıma olamayacağını nedense, kesinlikle olursa gerekir güvensiz bir sunucuda komut çalışan var ve olmalı tehlikeli / yıkıcı bir şey yapabilmek ... şimdi mimarinizi yeniden düşünmek için iyi bir zaman.
Beşinci olarak , veritabanınızın güvenliğini önemsiyorsanız , bu komut dosyalarını diğer kişilerin erişebildiği sunucularda çalıştırmamanız gerekir. Birisi sisteminizde kaydedilir, sonra onlar olacaktır kimlik bilgilerinizi almak imkanı vardır. Örneğin, bir SSL sertifikasına sahip bir web sunucusu durumunda, en azından birinin kök kazanması ve httpd işleminin bellek alanına erişmesi ve kimlik bilgilerini çıkarması için teorik bir olasılık vardır. Son zamanlarda SSL üzerinden yapılabilecek en az bir istismar oldu, saldırganın giriş yapmasını gerektirmiyordu.
Ayrıca, hangi kullanıcıların ne yapabileceğini sınırlamak için SELinux veya apparmor veya sisteminiz için ne varsa kullanılabilir. Kimlik bilgilerine erişmeyi başarabilseler bile, kullanıcıların veritabanına bağlanmaya bile çalışmalarına izin vermemenizi sağlar.
Eğer bütün bunlar size fazla mazeret gibi geliyorsa ve bunu göze alamazsanız veya yapacak vaktiniz yoksa - o zaman (kibirli ve elitist) görüşüme göre, veritabanınızda önemli veya hassas bir şey saklamamalısınız. Ve önemli veya hassas bir şeyi saklamıyorsanız, kimlik bilgilerinizi sakladığınız yer de önemli değildir - bu durumda neden bir şifre kullanmalısınız?
Son olarak kesinlikle kimlik çeşit depolamak kaçının olamazsa, bunun için (a komut dosyası tarafından bunu istendiğinde betiğinize gerektiğini, çünkü kimlik bilgileri bir derece geçici olarak sahipliğini bağışta bulunabileceğini salt okunur ve kökü ve kök ait olabilir değil olacak kesinlikle gerekli olmadıkça root olarak çalıştırın ve bir veritabanına bağlanmak onu zorunlu kılmaz). Ama yine de iyi bir fikir değil.