Docker (Konteyner) Nedir? Docker Güvenliği Nasıl Sağlanır?

Konteyner kaynak

Docker yani Konteyner Nedir? Docker Güvenliği Nasıl Sağlanır? Docker, konteyner teknolojisi kullanarak uygulama oluşturma, dağıtma ve çalıştırma işlemlerini kolaylaştırmak için tasarlanmış bir araçtır. Konteynerler, bir geliştiricinin bir uygulamayı, kütüphaneler ve diğer bağımlılıklar gibi ihtiyaç duyduğu tüm parçalarla paketlemesini ve tek bir paket olarak göndermesini sağlar. Bu sayede uygulama içerisinde kod yazma ve test etmek için kullanılan makineden farklı olabilecek herhangi bir özelleştirilmiş ayardan bağımsız olarak, uygulamanın başka bir Linux makinesinde (konteynerde) çalışmasını sağlamaktadır.

Docker bir sanal makine gibidir ancak sanal bir makineden farklı olarak, bütün bir sanal işletim sistemi oluşturmak yerine, Docker uygulamaların aynı Linux çekirdeğini kullandıkları sistem olarak kullanmasına izin verir. Bu önemli bir performans artışı sağlar ve uygulamanın boyutunu azaltır.

https://docs.docker.com/get-started/#containers-and-virtual-machines

docker konteyner docker konteyner vm

Docker açık kaynak bir projedir. Bu da Herkesin Docker’a katkıda bulunabileceği ve kutunun dışında mevcut olmayan ek özelliklere ihtiyaç duyması halinde kendi ihtiyaçlarını karşılamak için genişletebileceği anlamına gelir.

Docker (Konteyner) Nedir?

Bir konteyner imajı, çalıştırmak için gereken her şeyi içeren bir yazılım parçasının hafif, bağımsız, yürütülebilir bir paketidir. Kod, çalışma zamanı, sistem araçları, sistem kütüphaneleri, konfigurasyonlar bulundurur. Hem Linux hem de Windows tabanlı uygulamalar için mevcut olan konteynerli yazılımlar, çevreye bakılmaksızın her zaman aynı şekilde çalışır.

docker container nedir

https://docs.docker.com/get-started/#containers-and-virtual-machines

Konteynerler, çevresiyle ilgili yazılımı izole eder, örneğin geliştirme ve aşamalandırma ortamları arasındaki farklılıklar ve aynı altyapı üzerinde farklı yazılımlar kullanan ekipler arasındaki sorunları azaltmaya yardımcı olur.

Temel Docker (Konteyner) Güvenliği

Siber Güvenlik, bugünün veri merkezlerinde ve iyi bir nedenden ötürü en önemli konumdadır. Oldukça küçük ölçekli bir ihlal bile çok büyük hasarlara yol açabilir. Bu nedenle, kuruluşların özellikle güvenlik bulgularına ve yeni güvenlik açıklarına karşı duyarlı olmaları gerekmektedir. Sanallaştırma ana akım haline geldiğinde, VM güvenliği ortak bir konuydu. BT Güvenlik uzmanları, sanallaştırılmış bir ortamın potansiyel zayıflıklarını uzun bir süredir tartışmaktadır.

Belki de en kötü senaryo “VM kaçışı (VM Escape)” dır. Bu terim, bir saldırganın bir guest sanal makinesini tehlikeye attığı ve sanal makinenin içerisinden “kaçılabildiği” ve hipervizör üzerindeki diğer ana işlemlere erişebileceği bir durumu tanımlamak için kullanılır.

Sanallaştırma liderleri, bu tür güvenlik sorunlarının ele alındığından emin olmak için büyük çaba sarf ettiler ve VM kaçışını gerçek bir tehdit olarak yüksek sesle reddettiler. Ve biz hepimiz onlara inanmaya başladığımızda, CrowdStrike’daki araştırmacılar, CEN-2015-3456 olarak adlandırdığımız ve “VENOM” olarak adlandırılan zafiyeti gösterdi ve QEMU’nun sanal disket sürücüsündeki bazı savunmasız kodları kötüye kullanarak, saldırganlar potansiyel olarak kazanma potansiyeline sahip oldular ve ana sistemde ve ana bilgisayarda çalışan diğer sanal makinelere erişim sağlayabildiler. Bu sebeple Docker bir sanallaştırma servisi olmasa da konteyner güvenliğini sağlama konusunda bu yazımızda yardımcı olmaya çalışacağız.

Zararlı İmajlardan Korunma Amaçlı Önlemler

İmzalanmamış İmajların Kullanılmaması; Docker ile, açık depolardan konteyner imajları indirebilirsiniz. Bu, konteynerleri kimin oluşturduğuna güvenmeniz anlamına gelmektedir. Konteynerin güvenli bir şekilde oluşturulduğunu nereden biliyorsunuz? Daha da kötüsü, konteynerin zararlı veya bozuk dosyaları içermediğini nereden biliyorsunuz? Bilmiyorsunuz. Bu nedenle Docker Hub ücretli planını kullanmayı düşünebilirsiniz. Bu ücretli hizmet, kullandığınız depoların tarandığından emin olmanın bir yoludur. Buna alternatif olarak indirdiğiniz konteynerlerin neleri yüklediği, üzerinde hangi servislerin çalıştığını kontrol etmek gerekmektedir.

Örneğin, bir Redmine imajı indirmek istediğimizi varsayalım, Docker hub içerisinde bulunan imajları aşağıdaki gibi aradığımızda birçok seçeneğin bizi beklediği görülmektedir. Fakat bunlar kullanıcılar tarafından oluşturulmuş imajlardır. Bu imajlara ilk etapta güvenmemek gerekmektedir.

Zararlı İmajlar

Docker 1.8’den itibaren “Docker Content Trust” adı verilen yeni bir güvenlik özelliği getirildi. Bu özellik “Docker Hub” deposunda bulunan tüm Docker imajlarının orijinalliğini, bütünlüğünü ve yayınlanma tarihini doğrulamanıza olanak tanımaktadır Bu içerik güvencesi varsayılan olarak etkin değildir. Etkinleştirildiğinde Docker, imzalanmamış imajların hiçbirini indirememektedir.

Bu özelliği etkinleştirmek için, sudo export DOCKER_CONTENT_TRUST = 1 komutunu çalıştırabilirsiniz. Artık imzalı olmayan bir imajı indirmeye çalıştığınızda Docker sizi bilgilendirecektir.

DOS (Denial of Service) Saldırılarından Korunma Amaçlı Önlemler

Konteynerler İçin Kaynak Sınırlaması:

Konteyner kaynak

https://www.docker.com/resources/what-container

Varsayılan olarak, bir konteynerde kaynak kısıtlaması yoktur ve ana bilgisayar izin verdiği ölçüde belirli bir kaynağın çoğunu kullanabilir. Docker, konteyner çalıştırma komutu konteynerin kullanabileceği bellek, CPU veya blok miktarını kontrol etmenin yollarını sunar. Bir konteyner çalışmasında sorun oluştuğunda ve tüm hostun kaynaklarını tüketmeye başladığı bir senaryo üzerinde kötü sonuçlar doğması muhtemeldir. Konteynerleriniz için kaynak limitlerini “docker run” komutundan ayarlanabilmektedir.

Memory ve CPU

Örneğin, bir konteyneri 1 GB bellek ile limitlemek istiyorsanız çalıştırma komutuna —memory = “1000M” seçeneğini ekleyebilirsiniz. Ayrıca CPU sayısını —cpus = X (X’in konteyner için kullanabileceğiniz CPU sayısıdır) ekleyerek sınırlayabilirsiniz.

CPU Cycle

Varsayılan olarak, tüm konteynerler eşit oranda CPU (cyle)döngüsü elde etmektedir. Bu oran değiştirilebilir. Konteynerin CPU paylaşım ağırlığı, diğer tüm çalışanların ağırlığına göre ayarlanabilmektedir.

Konteynerler varsayılan olarak 1024 gibi bir değerde tanımlanır. -c parametresi bu amaçla kullanılmaktadır.

$ docker run -d -c 512 myimage

CPU, Memory ve Realtime Scheduler konfigurasyonlarını detayları için bakınız

Yetki Yükseltme ve Kernel Exploiting’e Karşı Önlemler

Konteynerler Arası Gereksiz İletişimi Engelleme

Eğer uygulama konteynerleri dış dünyayla veya diğer konteynerlerle konuşmaya ihtiyaç duymuyorsa, bunları nispeten güvenli ve izole bir ortamda çalıştırmak önemlidir. Bir konteyner saldırıya uğramış veya ele geçirilmiş ise izole edilmiş bir sistemde diğer konteynerlere veya uygulamaları etkileyemez veya soruna neden olmaz.

$ docker -d –icc=false –iptables

Komutu ile bu önlem alınabilmektedir. Daha fazla bilgi için https://docs.docker.com/v17.09/engine/userguide/ networking/default_network/container-communication/ #communication-between-containers 

Root Kullanıcısını Kullanmamak ve Konteynere Kullanıcı Eklemek

Bir konteynerde çalışan bir işlemin, Linux’ta çalışan diğer işlemlerden farklı olmadığı unutulmamalıdır; iki sistem arasında farklı olarak konteyner sistem olduğunu bildiren küçük bir meta veri parçası vardır. Bu nedenle, bir konteynerde çalışan herhangi bir şey “host” sunucu üzerinde çalışan herhangi bir şeyle aynı şekilde ele alınmalıdır.

Sunucunuzda root olarak hiçbir şeyi çalıştırmamanız (ya da çalıştırmamalısınız) gibi, sunucunuzdaki bir konteynerde de “root” olarak hiçbir şey çalıştırmamalısınız. Başka bir yerde oluşturulan binary dosyaları çalıştırmak güven gerektirir ve bu konteynerdeki dosyalar için de geçerlidir. “Root” kullanıcı ile işlem yapmak yerine, Dockerfile’ınızda bilinen bir “UID” ve “GID” ile bir kullanıcı oluşturmak önemlidir ve işlemlerin bu kullanıcı ile yapılması önerilmektedir. Bu şekilde oluşturulan imajların, kaynaklara erişimi sınırlandırarak güvenli bir şekilde çalışması daha güvenlidir.

Örnek bir kullanıcı oluşturmak için:

FROM debian:stretch

RUN groupadd -g 999 testgroup && \

useradd -r -u 999 -g testgroup testuser

USER testuser

CMD [“cat”, “/tmp/gizli_dosya.txt”]

Linux Kabiliyetlerini Limitlemek

Docker run – cap-drop seçeneğini kullanarak, konteyner içinde sınırlı erişime sahip olması için bazı Linux kabiliyetlerini düşürerek konteyneri kendi içerisine kilitleyebilirsiniz.

Linux kabiliyetleri nelerdir?

Kabiliyetler (capabilities) man sayfasına göre bağımsız olarak etkinleştirilebilen veya devre dışı bırakılabilen farklı ayrıcalık birimleridir.

Bir docker kapsayıcısında ayrıcalıklı süreçlerin kullanabileceği varsayılan kabiliyetler listesi:

chown, dac_override, fowner, fsetid, kill, setgid, setuid, setpcap, net_bind_service, net_raw, sys_chroot, mknod, audit_write, setfcap gibi birimlerdir. İhtiyacınız olmayan yetenekleri kaldırmak yerine, ihtiyaç duyduğunuz yetenekleri ekleme yaklaşımını daha önemli olmaktadır. Bu kabiliyetler hakkında daha detaylı bilgi için: (http://man7.org/linux/man-pages/man7/capabilities.7.html)

Bu yetenekleri docker kullanarak nasıl düşürebiliriz? Öncelikle, bir process’in sahip olduğu kabiliyetleri görelim. Linux’ta, Fedora üzerinde “libcap-ng-utils” paketinde bulunan bir process’in pscap olarak adlandırdığı kabiliyetleri görmenmize yardımcı olabilecek harika bir araç bulunmaktadır.

pscap kullanarak örnek çıktı:

pscap | head -10

ppid  pid   name        command         capabilities
1   1082  root      systemd-journal   chown, dac_override, dac_read_search, fowner, setgid, setuid, sys_ptrace, sys_admin, audit_control, mac_override, syslog, audit_read
1   1116  root      systemd-udevd   full
1   1760  root      auditd          full
1760  1778  root        audispd         full
1   1812  root      mcelog          full
1   1815  root      bluetoothd      net_bind_service, net_admin
1   1816  root      ModemManager    full
1   1817  root      systemd-logind  chown, dac_override, dac_read_search, fowner, kill, sys_admin, sys_tty_config, audit_control, mac_admin
1   1818  root      rngd            full

Bir Docker Konteyner process’inin sahip olduğu kabiliyetleri aşağıdaki gibi görebilmekteyiz,

$docker run -d fedora sleep 5 >/dev/null; pscap | grep sleep

Çıktı sonucu:

26358 26375 root sleep chown, dac_override, fowner, fsetid, kill, setgid, setuid, setpcap, net_bind_service, net_raw, sys_chroot, mknod, audit_write, setfcap

Eğer biz  setfcap, audit_write, and mknod kabiliyetlerini düşürmek istersek konteyneri başlatırken –cap-drop=setfcap –cap-drop=audit_write –cap-drop=mknod parametrelerini kullanmalıyız.

$docker run -d –cap-drop=setfcap –cap-drop=audit_write –cap-drop=mknod fedora sleep 5 > /dev/null; pscap | grep sleep

Çıktı Sonucu:

26555 26571 root sleep chown, dac_override, fowner, fsetid, kill, setgid, setuid, setpcap, net_bind_service, net_raw, sys_chroot

Bu kabiliyetlerin düşürülmüş olduğunu görüyoruz.

SELinux Kullanımı ve Önemi

Bilgi; https://rhelblog.redhat.com/2017/01/13/selinux-mitigates-container-vulnerability/

Dosya Sistemini “Read-only (Salt-Okunur)” Moda Getirmek:

Kapsayıcınızdaki dosyaları değiştirmeniz gerekmedikçe, dosya sistemini salt okunur hale getirebilirsiniz. Saldırıya uğrayan bir uygulama konteynerine sahip olduğunuzu düşünün. Saldırganın yapmak istediği ilk şey, istismar kodunun uygulamaya yazılmasıdır, böylece uygulama bir sonraki başlatılışında, istismar ile yerinde başlar. Eğer konteyner imajı salt okunursa, bir hacker, bir arka kapıyı yerinde bırakmaktan kaçınacak ve döngüyü en baştan başlatmak zorunda kalacaktır.

Docker, bunu bir süre önce “docker run -d –read only image” ile halletmek için bir özellik ekledi. Ancak kullanımı zor çünkü uygulamaların “/run” veya “/tmp” gibi geçici dizinlere yazılması gerektiğinde, bunlar salt okunur olduğunda uygulamalar başarısız olmaktadır. Buna çözüm olarak bu dizinleri tmpfs olarak bağlamak uygulamalarınızı çalıştırmanızı sağlayacaktır. Docker 1.10’dan itibaren şu şekilde bir açıklama ile sürülmüştür.

“Geçici dosya sistemleri: Artık –tmpfs parametresi kullanılıarak docker konteynerlerinde geçici dosya sistemleri oluşturmak gerçekten çok kolay. Bu, özellikle konteyner içindeki yazılım parçasının, bir salt okunur dosya sistemi ile çalışmasını beklerken yararlıdır. “

$docker run -d –read-only –tmpfs /run –tmpfs /tmp IMAGE

Bir sonraki bölümde Docker’ın Çalıştığı Host Sunucu Üzerinde Yapılması Gereken Sıkılaştırmalar konusu ile devam ediyor olacağız. 

Yorum Yaz

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*
*

Mail listemize üye olarak eğitim fırsatlarını kaçırmayın!
Eğitim ve ücretsiz etkinliklerizden haberdar olmak için e-posta listesimize üye olun!.