Python Programming

Python Paketleme Güvenliği: pyproject.toml ve CI/CD Süreçlerinde Tedarik Zinciri Saldırılarının Azaltılması

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.

Share: