Daha Güvenli Container Workloadları: “Distroless Images”

Sevi Karaköse
Intertech
Published in
2 min readNov 2, 2020
Photo by sergio souza on Unsplash

Containerlar çok hızlı bir şekilde ve tam bir devrim yaratarak hayatımızı değiştirdiler. Bu devrim sırasında hem uygulamalarımıza hem de tükettiğimiz kaynaklara bambaşka bir açıyla bakmamız gerekti, halen de gerekiyor. Vaat ise gerçekten çok büyük ve buna değer; her ortamda çalışabilen, optimum kaynak tüketen ve istediğimiz zaman ölçeklenebilen uygulamalar.

Containerlar için orkestrasyon araçlarından network çözümlerine kadar büyük resim genişlerken, tabii ki güvenlik kısmı da sorgulanmaya başlandı. İlk dönemlerinde yoğun açıklarıyla takipçi kaybeden Docker, bu sorunları giderme yönünde bayağı bir adım attı. CNCF’te Güvenlik kategorisindeki uygulamalara bir göz atarsak, pek çok farklı açıdan image ve container güvenliği konusuna yaklaşıldığını görebiliriz.

Güvenlik dediğimizde olay dönüp dolaşıp, sorunun kökenine inmeyi yani image’larımıza bir göz atmayı gerektiriyor: İçerisinde apt komutunun çalışabildiği ve bu şekilde istediğiniz paketi indirebileceğiniz bir Docker container’ı sizce ne kadar güvenli olabilir? Ya da hepimizin yoğun şekilde kullandığı nginx image’ının, en kritik açıklara sahip image’lardan birisi olduğunu biliyor muydunuz?

Konuya uzun zamandır containerlar ile çalışan ve bu konuda nirvanaya ulaşmış gibi görünen Google bir el atmış ve “Distroless image” denen, özetle Linux’un standart bir dağıtımında bulunmasını beklediğimiz paket yöneticisi, shell ve diğer bileşenleri içermeyen Docker image’lar hazırlamış. Bize faydası ise saldırı yüzeyini azaltması, taramalarda çıkan zaafiyet adedini düşürmesi ve içerisinde ihtiyaç duymadığımız distro bileşenleri de olmadığı için image boyutunu ufaltması. Henüz image çeşidi az, ama sayısı artacak gibi görünüyor. Aşağıdaki repodan gelişmeleri takip edebilir ve “distroless image” tiplerini, nasıl kullanılacağını inceleyebilirsiniz.

https://github.com/GoogleContainerTools/distroless

Bir örnekle de yazıyı kapatalım… Basit bir Node.js uygulamasını dockerize edelim. Aşağıdaki Dockerfile ile standart bir image build ederken..

FROM node:10
WORKDIR /app
COPY . .
RUN npm install
CMD ["index.js"]

Sonraki örnekte multi-stage build gerçekleştiriyoruz. İlk adımda uygulamamızı build ettikten sonra; ikinci adımda sadece ihtiyacımız olan bağımlılıkları alıp, uygulama image’ımızı Google’ın gcr.io üzerinde yayınladığı “distroless image”ı kullanarak oluşturuyoruz. Bu kullanıma aslında yabancı değiliz, inceltilmiş image’ları yine bu şekilde kullanıyorduk.

FROM node:10 as build
WORKDIR /app
COPY . .
RUN npm install
FROM gcr.io/distroless/nodejs:10
COPY --from=build /app /app
WORKDIR /app
CMD ["index.js"]

Bu arada eğer ihtiyacınız varsa, kendi “distroless image”ınızı oluşturmak o kadar da zor değil. Google yine örnek base image’lar hazırlamış bu iş için.

Container güvenliği konusu daha çok su kaldıracak bir konu, gelişmeleri hep beraber takip ederiz 🙂

--

--