Azure Devops'ta Uçtan Uca Devsecops Pipeline'ı Oluşturma

Bu makalede size kapsamlı bir güvenlik pipeline sunacağım. Ürünler ve fikirler farklılık gösterse de, sonuçta benzer bir yapıyı uygulamak kuruluşunuzun altyapısını büyük ölçüde geliştirecektir.

Uygulama güvenliğinde neleri ele almalısınız?

  1. Statik Uygulama Güvenlik Testi (SAST): Bu yöntem, uygulama çalıştırılmadan önce kaynak koddaki veya derlenmiş ikililerdeki güvenlik açıklarının tespit edilmesini içerir.

  2. Dinamik Uygulama Güvenlik Testi (DAST): DAST, canlı bir uygulamayı test etmek ve çalışma zamanı sırasında ortaya çıkan güvenlik sorunlarını belirlemek için kullanılır.

  3. Bağımlılık Kontrolü: Bu süreç, uygulama tarafından kullanılan kütüphaneler ve çerçevelerdeki güvenlik açıklarını tespit etmek için gereklidir.

  4. Konteyner Güvenlik Taraması: Bu işlem, uygulamanın çalıştığı konteynerlerin güvenlik yapılandırmalarını ve açıklarını inceleyerek güvenli bir ortamın sağlanmasına yardımcı olur.

  5. Güvenlik Konfigürasyonu İncelemesi: Bu, hem uygulamanın hem de altta yatan altyapı bileşenlerinin güvenlik ayarlarının değerlendirilmesini içerir.

Kuruluşunuz Ne Kadarını Karşılayabilir?

Birincil endişe maliyet konusunda yatmaktadır. Kuruluşunuzun mali kapasitesi nedir? Yöneticiniz hangi önceliklere odaklanmak isteyecektir? Hangi dağıtım yöntemini benimseyebilirsiniz? Bu soruları kendimize sorabilmemiz ve uygun yanıtlar verebilmemiz çok önemlidir. Örneğin, bağımlılık kontrolü konusunu ele alalım. Açık kaynak kodlu yazılımları yönetmek kolay bir iş değildir. OWASP tarafından yayınlanan Dependency-Check ve Dependency-Track gibi çok sayıda açık kaynak seçeneği mevcuttur. Bununla birlikte, kurumsal ürünlerle karşılaştırıldığında, kalite açısından gözle görülür bir eşitsizlik vardır. Kuruluşunuzun gereksinimlerini dikkatlice değerlendirmek ve açık kaynak çözümlerinin etkili bir şekilde kullanılabileceği alanları belirlemek çok önemlidir. Bir başka olumlu örnek de konteyner güvenliğidir. Aqua Trivy büyük ölçekte ücretsiz konteyner güvenliği sunmaktadır. Bu faktörler ciddi bir şekilde göz önünde bulundurulmalıdır.

Konteynır Teknolojisi Neden Önemlidir?

Konteyner teknolojisi, DevSecOps pipeline içinde uygulama geliştirme süreçlerinin güvenliğinin sağlanmasında çok önemli bir rol oynamaktadır. Konteynerler, uygulamaların izole ortamlarda çalışmasını sağlayarak tutarlı ve tekrarlanabilir bir dağıtım süreci oluşturur. Bu izolasyon, güvenlik açıklarının yayılmasını etkili bir şekilde kısıtlar ve uygulamalar arası etkileşimden kaynaklanan riskleri azaltır. Ayrıca, konteynerlerin hafif yapısı güvenlik yamalarının ve güncellemelerinin hızlı bir şekilde uygulanmasını kolaylaştırarak güvenlik ihlallerine hızlı bir şekilde yanıt verilmesini sağlar.

Konteynerlerin DevSecOps işlem hattına dahil edilmesi, güvenlik taramalarının ve analizlerinin otomasyonuna olanak tanır. Örneğin, konteyner imajlarının sürekli taranması, bilinen güvenlik açıklarına karşı proaktif olarak koruma sağlar. Kubernetes gibi konteyner düzenleme araçları, güvenlik politikalarının merkezi olarak yönetilmesini ve uygulanmasını sağlayarak güvenlik standartlarına ve yönetmeliklerine tutarlı bir şekilde uyulmasını garanti eder.

Ayrıca, konteyner teknolojisi, uygulamaları daha küçük, yönetilebilir ve güvenli bileşenlere ayırmayı içeren mikro hizmet mimarileriyle sorunsuz bir şekilde entegre olur. Bu ayrıntı düzeyi, güvenlik ihlallerinin etkisini en aza indirir ve güvenlik olaylarının hızlı bir şekilde tespit edilip çözülmesine yardımcı olur. Sonuç olarak, DevSecOps işlem hattında konteyner teknolojisinin kullanılması, çağdaş yazılım geliştirme ve dağıtım süreçlerinin önemli bir yönüdür.

CI/CD End To End Pipeline Örneği

Bu bölümde örnek olarak oluşturduğum bir pipeline yapısını sizlerle paylaşacağım. test

Sözel olarak görseli anlatmamız gerekirse sürecimiz şu aşamalardan oluşuyor:

1- Geliştirici kodu GitHub’a push eder (örnekler çoğaltılabilir).

2- Azure DevOps ortamındaki kod Sonatype IQ Server ile bağımlılık taramasından geçer.

3- Bağımlılık kontrolünü başarıyla geçerse, güvenlik nedeniyle boru hatlarının kırılıp kırılmaması gerektiği sorusu ortaya çıkar. Bu soru başka bir makalede ele alınacaktır. Birçok kuruluş operasyonel süreçleri aksatmamak için buna izin vermezken, profesyonel açıdan gereklidir. Eğer geçerse bir sonraki aşamaya geçilir.

4- Bu adımda Fortify kullanarak statik kaynak kodunu analiz ediyoruz. Fortify’ın derleme özelliği, ilgili projenin veri akışı analizini yapmamıza olanak tanıyor ki bu da gerçek pozitif göstergeleri tespit etmede oldukça faydalı.

5- Fortify ile dockerfile taraması yapabilsek de bu aşamada ben Trivy ile çift kontrol yapmayı tercih ediyorum. Trivy ile bu kontrolleri geliştiriyorum.

6- Bu aşamaya geldiysek dinamik kontroller için projemi kurmam gerekiyor. Bu aşamada Docker kullanılıyor, konteynerlerin gerekliliği ve önemi vurgulanıyor.

7- Trivy’yi tekrar sürece dahil ediyorum, bu sefer konteyner imajını tarıyorum. Herhangi bir bulgu tespit edilmediğini varsayarak boru hattına devam ediyorum. Bu noktaya kadar hiçbir aşamada boru hattını bozmadım. Bunun amacı, uçtan uca sorunsuz bir şekilde akan bir proje göstermektir.

8- Son aşamada docker ile kurduğum projeyi Invicti kullanarak tarıyorum.

9- İlgili kullanıcı veya grupları Slack bildirimleri ile pipeline’ın build durumu hakkında bilgilendiriyorum.

Esasen bu aşamaları kapsayan pipeline’ımız konfigürasyon ve kurulum süreçleri açısından çeşitli zorluklar sunabiliyor. Bu örnek için herhangi bir sorunla karşılaşmadım. Ancak bir başka yazımda bu araçlardaki “exit 1” komutunun gücünü göstereceğim. Bu herkes için faydalı olacaktır.

Devsecops Uçtan Uca Pipeline YAML Örneği

trigger:
- master

stages:
- stage: sonatype
  pool: centos

  jobs:
    - job: sonatype
      steps:
      - task: NexusIqPipelineTask@1
        inputs:
          nexusIqService: 'sonatype'
          applicationId: 'webgoat'
          stage: 'release'
          scanTargets: '**/*.*'

- stage: fortify
  pool: batuhan-local
  
  jobs:
    - job: fortify
      steps: 
      
      - task: FortifySCA@7
        inputs:
           applicationType: 'java'
           buildSourceVersion: '11'
           fortifyBuildId: 'webgoatjava'
           fortifyScanType: 'LocalScan'
           runFortifyUpload: true
           fortifyServerName: 'ssc test'
           fortifyApplicationName: 'webgoatjava'
           fortifyApplicationVersion: 'webgoatjava'

- stage: trivy_file_scan
  pool: centos

  jobs: 
    - job: trivy 
      steps:
        
      - task: Bash@3
        inputs:
          targetType: 'inline'
          script: 'trivy repo https://github.com/nullx3d/WebGoat'

- stage: docker_up
  pool: centos

  jobs: 
    - job: docker
      steps:

      - task: CmdLine@2
        inputs:
         script: 'docker-compose up -d'
         workingDirectory: '/home/sancak/Downloads/WebGoat'

- stage: trivy_image_scan
  pool: centos

  jobs:
     - job: 
       steps:
         - task: Bash@3
           inputs:
            targetType: 'inline'
            script: 'trivy image webgoat/webgoat-8.0'

- stage: invicti
  
  jobs: 
    - job: invicti
      steps:

        - task: netsparker-cloud@1
          inputs:
           apiConnection: 'invicti'
           scanTypes: '0'
           scanWebSites: 'e15b8874-5cff-4dd7-02a7-ae43025f6459'
           scanWebSitesProfile: '5d21265b-4372-49fc-c209-b0ff051e9f2f'
           hasReport: true
           reportType: 'ScanDetail'

Şemada gösterdiğimiz ve sözlü olarak anlattığımız adımları bu pipeline yaml ile gerçekleştiriyoruz. Ek adımlar eklenebilir mi? Kesinlikle eklenebilir. Grafana, prometheus, elk ile ilgili sunucuların değerleri izlenebilir. Daha farklı adımlar da eklenebilir. Bir zafiyet yönetim aracı ile izleme gibi örnekler çeşitlendirilebilir. Fakat orta seviye bir yapı için bu kadarı yeterli olacaktır.

Okuduğunuz için teşekkür ederiz. Güvende kalın.

Written by

Batuhan Sancak