Docker Container Güvenliği

Merhabalar,

Docker Container Güvenliği ile ilgili ipuçlarını ele aldığımız bir yazıyla yeniden birlikteyiz. Docker, sanallaştırma dünyasının yeni versiyonu (2.0 versionu) olarak tanımlayabileceğimiz yeni nesil sanallaştırma teknolojisidir.

Öncelikle, sanallaştırmanın ne olduğundan başlayalım. Teknolojinin yeni gelişmeye başladığı dönemlerde kullanılan sunucular fiziksel olarak yapılandırılıyorlardı. Her iş için ayrı bir fiziksel sunucu ve bunların çalışması için ayrı ayrı donanımlar gerekiyordu. Tabi bu yanında büyük bir maliyetide getiriyordu. Her bir donanıma, ram’ine, işlemcisine, sabit diskine yüklü miktarda maddi anlamda ödeme yapılıyordu.

Sonrasında sanallaştırma teknolojisinin gelişmesiyle birlikte fiziki sunucular içerisinde bulunan donanımlar yazılımsal olarak paylaştırılabilir, bölünebilir hale geldi ve VM (virtual machine, sanal makine)’ler sıklıkla kullanılır hale geldi.  Artık tek bir fiziksel sunucunun kaynakları kullanılarak onlarca sanal makine kurulabiliyordu ve bu da hem maddi anlamda hemde taşınabilirlik açısından oldukça uygundu.

Gel zaman git zaman, bu ortamlarda çalıştırılan uygulamaların taşınabilirlik, izolasyon, dağıtım gibi sorunlarına çözüm olarak Container (artık konteyner diyeceğim) teknolojisine ihtiyaç duyuldu. Konteynerlere ihtiyaç duyulmasının bazı nedenleri vardı.  

Konteynerler “bir kez yaz, her yerde çalıştır” ilkesine dayalı çalışıyorlar. Bir uygulama geliştirdiğinizi düşünün ve bu uygulama geliştirilirken arka planda bu uygulamanın çalışabilmesi için gerekli olan, ihtiyaç duyulan paketler ve bağımlılıklar var. Bu uygulamayı her farklı platformda çalıştırmak istediğinizde tüm bağımlılıkları yeniden ve tek tek ele almak zorundasınız. Konteyner teknolojisini basit olarak anlatmak gerekirse, bir kutu düşünün (yada gemilerde taşınan konteyner 🙂 ) bu kutu sizin ürününüzün ihtiyaç duyduğu tüm bağımlılıkları ve kurulumları içerisinde barındırıyor ve bunu kolaylıkla her yere tak çalıştır mantığıyla taşıyor ve çalıştırıyorsunuz. İşte konteyner teknolojisi bunu sağlıyor.

Burada ki yatan fikir aslında DevSecOps ve Güvenli Yazılım Geliştirme Yaşam Döngüsü (SSDLC) gibi yaklaşımların her alana yayılması diyebiliriz.  Yazılım geliştirme süreçleri eskiden şu modelde ilerliyordu (hala da bu modeli kullananlar var):

Güvenliğin her alanda yaygınlaşması fikri yazılım geliştirme yaşam döngüsünün zamanla güvenli yazılım geliştirme yaşam döngüsü fikrine dönüşmesini sağladı ve artık bu model DevSecOps adıyla günümüzde her alanda kendini duyurmaktadır.

Konteyner teknolojisinin gelişmesinde ve ortaya çıkmasında taşınabilirlik, izolasyon, verimli kaynak kullanımı, taşınabilirlik ve güvenlik gibi nedenler olduğunu söyledik. Peki gerçekten Docker Konteyner güvenli mi?

Her uygulama ve platform gibi konteynerlarda da çeşitli güvenlik ihlalleriyle karşılaşılabiliniyor. Bu güvenlik ihlallerinin ve sorunlarının bazılarına bakalım.

  1. Root Yetkisinin minimize edilmesi

Örneğin root yetkisinde çalışan bir konteyner üzerinde çalıştırıldığı ana host sistem üzerine root yetkisiyle erişim sağlayabilir ve bu durum oldukça tehlikeli olabilir. Ayrıca, root yetkisiyle çalışan bir konteyner ana host sistemin dosya sistemine erişip zararlı aktiviteler gerçekleştirebilir. Konteyner üzerinde çalışan bir uygulama üzerinde veya konteyner engine (docker) üzerinde var olan bir güvenlik açığı, durumu daha da kritik hale getirebilir. Bunu önlemek için root yetkisiyle çalışan süreçlerin minimumda tutulması gerekir.

Docker image’ınızı çalıştırırken ayrıcalıklı olmayan bir kullanıcı ile çalıştırmanız önerilir bunun içinde aşağıdaki komut örnek olarak gösterilebilir.

docker run –u 1000 docker_image

Bu komutda ki –u parametresi user id değeri alır. Linux da 0-499 arası kullanıcı idleri çeşitli hizmetler için ayrılmıştır. 0 id’si root kullanıcısına aittir. 1-99 arası idleri sistem kullanıcıları ve rezerv kullanıcılar için ayrılmıştır. Bu kullanıcılar belirli sistem hizmetleri ve deamonlar tarafından kullanılır. 100-499 arası idler sistem ve uygulama kullanıcıları ve deamonları tarafından kullanılan hesaplar için ayrılmıştır. Bu kullanıcılar genellikle belirli uygulama ve hizmetler için oluşturulmuş özel kullanıcı hesaplarıdır.

User ID’si 500 ve üzeri olan kullanıcılar, normal, varsayılan olarak ayrıcalıksız kullanıcılardır. Sistem üzerinde oluşturduğunuz ilk normal kullanıcılar (bazı linux dağıtımlarında) 500 den başlar. Bazı dağıtımlar içinde bu id değeri 1000’dir.

  • Docker Trusted Registry kullanın.

Docker Trusted Registry erişim kontrolü ve izole ortam desteğinin yanı sıra sizlere denetim izinlerini düzenlemenizde yardımcı olur. Özelleştirilmiş politikalar ile güvenlik, erişim ve dağıtım politikalarını iş gereksinimlerinize göre özelleştirebilirsiniz. Entegrasyon açısından, DTR (docker trusted registry) mevcut CI/CD araçlarınız ve diğer altyapı bileşenlerinizle daha sorunsuz entegre olabilir.

  • Güvenilir API’lar kullanın.

Yetkisiz erişimleri önleyin, veri bütünlüğünü ve gizliliğini koruyun. Rate limit saldırılarını önleyin.

Rate limiting kullanıcı ve hizmet başına izin verilen işlem sayısını sınırlayan bir güvenlik tedbiridir. Rate limiting kullanıcıların yapacakları istekleri sınırlar (ör: sms servisinde 1 dk içerisinde maximum 5 sms otp alınabilmesi gibi.) ve sunucunun gereksiz yere meşgul edilmesini engeller.

Yetkisiz erişimleri önlemek, IDOR tarzı zafiyetlere karşı savunma mekanizmaları geliştirmek ve güvenli kodlama yapısını benimsemek elzem ve gereklidir. Kullanıcılar yetkileri dışında herhangi bir endpoint veya sayfaya erişememeli, farklı kullanıcılar adına işlem gerçekleştirememelidir. Bu sebeple endpointler üzerinden gelen her istekte oturum ve yetki bazlı kontroller yapılmalıdır.

Dosya yükleme gibi kritik fonksiyonlara sahip yapılar ayrıntılı kontrol edilmeli ve saldırganlar tarafından sistem üzerine herhangi bir zararlı (kabul edilmemesi gereken) uzantıda dosya yüklenememelidir. Örneğin yalnıca pdf dokümanı veya resim yükleme işlemi için geliştirilen bir endpoint üzerinde dosya uzantısı ve content-type kontrolleri yapılmalıdır.

  • Ana hostunuzu, Docker sürüm, imaj ve kütüphaneleri güncelleyin.

Docker yazılımı, projede kullanılan kütüphaneler, işletim sistemi gibi yazılım ve bağımlılıklar devamlı güncel tutulmalıdır. Güncel olmayan ürün, yazılım ve bağımlılıklar üzerinde daha önceden saldırganlar veya güvenlik araştırmacıları tarafından keşfedilmiş güvenlik açıklıkları olabilir. Bu sebepten, vendor firma tarafından yayınlanan güvenlik yamaları devamlı kontrol edilmeli ve tercih edilmelidir.

Kaynaklar:

https://aws.amazon.com/tr/compare/the-difference-between-kubernetes-and-docker

https://serhanwbahar.medium.com/docker-container-g%C3%BCvenli%C4%9Fi-part-1-376637bdd2f8

https://www.oracle.com/tr/cloud/cloud-native/container-engine-kubernetes/what-is-kubernetes/kubernetes-vs-docker