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?
-
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.
-
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.
-
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.
-
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.
-
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.
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.