Python ekosistemi geniş, güçlü ve kullanışlıdır ancak bu kolaylık önemli güvenlik riskleri de beraberinde getirir. Saldırganların güvenilir üçüncü taraf kütüphaneleri veya derleme ortamlarını ele geçirip kötü amaçlı kod enjekte ettiği tedarik zinciri saldırıları giderek yaygınlaşmaktadır. Python geliştiricileri olarak pyproject.toml dosyasını ve CI/CD süreçlerimizi genellikle basit yapılandırma dosyaları olarak görürüz, ancak aslında kritik saldırı yüzeyleridir. Bu yazıda, yazılım tedarik zincirinizi korumak için bu alanların nasıl sıkılaştırılacağını inceleyeceğiz.
Modern Derleme Sistemlerinin Kırılganlığı
Basit setup.py betiklerinin günleri geride kaldı. Modern Python paketleme, Poetry, PDM ve Hatch gibi derleme arka uçlarına (build backends) büyük ölçüde güvenmektedir. Bu araçlar bağımlılık çözümlemesini, ortam oluşturma işlemlerini ve paket derlemesini otomatikleştirir. Bu durum geliştirmeyi kolaylaştırsa da sürecin büyük bir kısmını soyutlayarak denetlemeyi zorlaştırır. Eğer bir saldırgan popüler bir derleme arka ucunu ele geçirirse veya kötü amaçlı bir eklenti enjekte ederse, derleme aşamasında keyfi kod çalıştırabilir; bu da gizli bilgileri çalmasına veya paket dizini (PyPI gibi) iletilmeden önce nihai ürünü değiştirmesine neden olabilir.
pyproject.toml dosyası bu araçlar için doğruluk kaynağıdır. Hangi bağımlılıkların kurulacağını ve projenin nasıl derleneceğini belirler. Kompromise uğramış bir pyproject.toml dosyası şu sorunlara yol açabilir:
- Bağımlılık Karışıklığı (Dependency Confusion): Saldırganlar, iç özel paketlerle aynı ada sahip kötü amaçlı paketleri kaydeder.
- Kötü Amaçlı Kanca (Hooks): Kurulum sırasında veri sızdıran özel derleme betikleri.
- Typosquatting (Yazım Hatası Kötüye Kullanımı): Kullanıcıların yanlışlıkla yüklediği popüler kütüphanelerin kasıtlı olarak yanlış yazılmış halleri.
pyproject.toml Dosyasının Sıkılaştırılması
Bu riskleri azaltmak için pyproject.toml dosyasına üretim koduyla aynı titizlikle yaklaşmalısınız. En etkili uygulamalardan biri sıkı bağımlılık çözümlemesini etkinleştirmektir. Birçok modern araç, bağımlılıkları sabitlemenize (pin) veya kilit dosyaları kullanmanıza olanak tanır. Tekrarlanabilir derlemeler sağlamak için kilit dosyanızı (örneğin poetry.lock veya pdm.lock) sürüm kontrol sistemine her zaman commit edin.
Ayrıca, sürüm gereksinimleri için * kullanmaktan kaçının. Bunun yerine, mümkün olduğunca sıkı semantik sürümleme kısıtlamaları kullanın. Örneğin, requests>=2.0 yerine, ana sürümün kararlılığından eminseniz requests>=2.28.0, <3.0.0 kullanmayı düşünün.
CI/CD Süreçlerinin Güvence Altına Alınması
CI/CD süreçleri, paketlerinizi derleyen ve dağıtan motorlardır. Kötü amaçlı yazılımı yayınlanan ürünlere enjekte etmek isteyen saldırganlar için birincil hedeflerdir. Sürecinizi güvence altına almak için temel stratejiler şunlardır:
1. İzinleri Kısıtlayın ve En Aza İndirilmiş Ayrıcalık Kullanın
CI çalıştırıcılarınızın (runners), projeyi derlemek için gereken minimum izinlere sahip olması gerekir. Mutlaka gerekli olmadıkça root erişimi kullanmayın. GitHub Actions kullanıyorsanız, gizli bilgilerin (secrets) asla günlüklerde (logs) görünmediğinden ve korunan dallardaki değişiklikler için iş akışının onay gerektirdiğinden emin olun.
2. Özel Kayıt Defterlerine Kimlik Doğrulaması Yapın
Kuruluşunuz özel paket dizinleri kullanıyorsa, kimlik doğrulama belirteçlerinin düzenli olarak yenilendiğinden ve CI/CD gizli bilgileri olarak güvenli bir şekilde saklandığından emin olun. Kimlik bilgilerini pyproject.toml dosyanıza veya betiklerinize asla sabit kodlamayın (hardcode etmeyin).
İşte Poetry gibi bir araç için GitHub Actions iş akışında ortam değişkenlerini güvenli bir şekilde referans gösterme örneği:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install Poetry
run: curl -sSL https://install.python-poetry.org | python3 -
- name: Configure private registry credentials
run: |
poetry config http-basic.internal https "${{ secrets.PYPI_USERNAME }}" "${{ secrets.PYPI_PASSWORD }}"
- name: Install dependencies
run: poetry install --no-interaction
3. Yayınlamadan Önce Paketleri Doğrulayın
PyPI'ye yüklemeden önce paketinizi doğrulayın. twine check dist/* gibi araçlar, meta verilerle ilgili potansiyel sorunları belirleyebilir. Ayrıca, bağımlılıklardaki bilinen güvenlik açıklarını kontrol eden, iş akışınızda otomatik güvenlik tarama araçları kullanmayı düşünün. safety veya pip-audit gibi araçlar CI iş akışınıza doğrudan entegre edilebilir.
steps:
- name: Audit dependencies
run: pip-audit -r requirements.txt
Sonuç
Python paketleme güvenliği tek seferlik bir kurulum değildir; süreklilik arz eden bir süreçtir. pyproject.toml dosyanızı sıkılaştırarak, sıkı bağımlılık yönetimini uygulayarak ve CI/CD süreçlerinizi güvence altına alarak tedarik zinciri saldırısı riskini önemli ölçüde azaltabilirsiniz. Güvenliğin ortak bir sorumluluk olduğunu unutmayın. Araçlarınızı güncel tutun, bağımlılık uyarılarını izleyin ve ekibinizi açık kaynak yazılım ile ilişkili riskler konusunda eğitin. Tedarik zinciri saldırılarının yaygın olduğu bir çağda proaktif savunma en iyi kalkanınızdır.