Bir Python programının kullanması gereken şifreleri ve diğer sırları saklamak için birkaç seçenek vardır, özellikle de kullanıcıdan şifreyi yazmasını isteyemeyeceği arka planda çalışması gereken bir program.
Kaçınılması gereken sorunlar:
- Diğer geliştiricilerin ve hatta halkın görebileceği bir yerde kaynak kontrolünde şifreyi kontrol etmek.
- Bir yapılandırma dosyasından veya kaynak koddan parolayı okuyan aynı sunucudaki diğer kullanıcılar.
- Parolanın, siz düzenlerken başkalarının omzunuzun üzerinden görebileceği bir kaynak dosyada olması.
Seçenek 1: SSH
Bu her zaman bir seçenek değildir, ancak muhtemelen en iyisidir. Özel anahtarınız asla ağ üzerinden iletilmez, SSH sadece doğru anahtara sahip olduğunuzu kanıtlamak için matematiksel hesaplamalar yapar.
Çalışması için şunlara ihtiyacınız var:
- Veritabanına veya eriştiğiniz her şeye SSH tarafından erişilebilir olmalıdır. "SSH" artı erişmekte olduğunuz hizmeti aramayı deneyin. Örneğin, "ssh postgresql" . Bu, veritabanınızda bir özellik değilse, sonraki seçeneğe geçin.
- Veritabanına çağrı yapacak hizmeti çalıştırmak için bir hesap oluşturun ve bir SSH anahtarı oluşturun .
- Genel anahtarı arayacağınız hizmete ekleyin veya o sunucuda yerel bir hesap oluşturun ve genel anahtarı oraya kurun.
Seçenek 2: Ortam Değişkenleri
Bu en basit olanı, bu yüzden başlamak için iyi bir yer olabilir. Twelve Factor Uygulamasında iyi tanımlanmıştır . Temel fikir, kaynak kodunuzun yalnızca parolayı veya diğer sırları ortam değişkenlerinden çekmesi ve ardından programı çalıştırdığınız her sistemde bu ortam değişkenlerini yapılandırmanızdır. Çoğu geliştirici için işe yarayacak varsayılan değerleri kullanırsanız, hoş bir dokunuş da olabilir. Bunu, yazılımınızı "varsayılan olarak güvenli" yapmakla dengelemeniz gerekir.
Ortam değişkenlerinden sunucuyu, kullanıcı adını ve parolayı çeken bir örnek aşağıda verilmiştir.
import os
server = os.getenv('MY_APP_DB_SERVER', 'localhost')
user = os.getenv('MY_APP_DB_USER', 'myapp')
password = os.getenv('MY_APP_DB_PASSWORD', '')
db_connect(server, user, password)
İşletim sisteminizde ortam değişkenlerini nasıl ayarlayacağınıza bakın ve hizmeti kendi hesabı altında çalıştırmayı düşünün. Bu şekilde, kendi hesabınızda programları çalıştırdığınızda ortam değişkenlerinde hassas verileriniz olmaz. Bu ortam değişkenlerini kurduğunuzda, diğer kullanıcıların bunları okuyamamasına özellikle dikkat edin. Örneğin dosya izinlerini kontrol edin. Tabii ki, root iznine sahip herhangi bir kullanıcı bunları okuyabilir, ancak buna yardımcı olunamaz. Systemd kullanıyorsanız, servis birimine bakın ve herhangi bir sır EnvironmentFile
yerine kullanmaya dikkat edin Environment
. Environment
değerleri herhangi bir kullanıcı tarafından görüntülenebilir systemctl show
.
Seçenek 3: Yapılandırma Dosyaları
Bu, ortam değişkenlerine çok benzer, ancak sırları bir metin dosyasından okursunuz. Ortam değişkenlerini, dağıtım araçları ve sürekli entegrasyon sunucuları gibi şeyler için daha esnek buluyorum. Bir yapılandırma dosyası kullanmaya karar verirseniz, Python, standart kitaplıkta JSON , INI , netrc ve XML gibi çeşitli biçimleri destekler . PyYAML ve TOML gibi harici paketleri de bulabilirsiniz . Şahsen, JSON ve YAML'yi kullanımı en basit buluyorum ve YAML yorumlara izin veriyor.
Yapılandırma dosyalarında dikkate alınması gereken üç nokta:
- Dosya nerede? Belki gibi varsayılan bir konum
~/.my_app
ve farklı bir konumu kullanmak için bir komut satırı seçeneği.
- Diğer kullanıcıların dosyayı okuyamadığından emin olun.
- Açıkçası, yapılandırma dosyasını kaynak koduna kaydetmeyin. Kullanıcıların kendi ana dizinlerine kopyalayabilecekleri bir şablon işlemek isteyebilirsiniz.
Seçenek 4: Python Modülü
Bazı projeler sırlarını doğrudan bir Python modülüne koyar.
db_server = 'dbhost1'
db_user = 'my_app'
db_password = 'correcthorsebatterystaple'
Ardından değerleri almak için bu modülü içe aktarın.
from settings import db_server, db_user, db_password
db_connect(db_server, db_user, db_password)
Bu tekniği kullanan bir proje Django'dur . Açıkçası, kullanıcıların kopyalayıp değiştirebileceği settings.py
bir dosyayı işlemek isteyebilirsiniz, ancak kaynak kontrolünü taahhüt etmemelisiniz settings_template.py
.
Bu teknikle ilgili birkaç sorun görüyorum:
- Geliştiriciler dosyayı yanlışlıkla kaynak denetimine verebilir. Eklemek bu
.gitignore
riski azaltır.
- Kodunuzun bir kısmı kaynak kontrolü altında değil. Disiplinliysen ve buraya sadece dizeler ve sayılar koyarsan, bu sorun olmaz. Buraya günlük filtre sınıfları yazmaya başlarsanız, durun!
Projeniz zaten bu tekniği kullanıyorsa, ortam değişkenlerine geçiş yapmak kolaydır. Tüm ayar değerlerini ortam değişkenlerine taşıyın ve Python modülünü bu ortam değişkenlerinden okumak için değiştirin.