Docker’ın Çalıştığı Host Üzerinde Yapılması Gereken Sıkılaştırmalar

docker container nedir

Docker’ın Çalıştığı Host Üstünde Yapması Lüzumlenen Sıkılaştırmalar ve Docker’ı güncellemek; Docker güncellemelerini aktüel tutarak, Docker yazılımındaki güvenlik açıkları kapatılabilir.
Bir agresif erişim elde etmeye ya da yetki yükseltmeye çalışırken malum güvenlik açıklarından yararlanabilir.

Düzenli Docker güncellemelerini yüklememek sizi korunmasız Docker yazılımı ile çalıştırmanıza yol açabilir.
Yetki yükseltmeye, yetkisiz erişime ya da başka güvenlik ihlallerine neden olabilir.
Yeni versiyonları takip edin ve gerektiğinde güncelleyin.
Önlem: Alttaki komutu çalıştırarak ve Docker sürümünün aktüel olmasından güvenilir olun.
$ docker version
Docker processine yanlızca yetki sahibi kullanıcıların erişmesi
Docker, konteynerlerin erişim haklarını sınırlamada ana bilgisayar(host) ve konteyner arasında endeks paylaşmanıza imkan tanır.
Bu bir konteyneri /(kök) dizine bağlayarak başlatabileceğiniz mananına gelmektedir.
Konteyner ardından ana dosya sisteminizi herhangi bir kısıtlama olmaksızın değiştirebilir.
Basit bir ifadeyle, yanlızca docker grubunun bir azası ayrıcalıklara haklara sahip olabildiği gibi ardından ana makinede(host) üstünde kök dizini bir konteynere bağlayabileceği mananına gelmektedir.
Bu vaziyeti kısıtlamak gereklidir.
Önlem: Docker ana bilgisayarında alttaki komutu çalıştırın ve tekilce güvenilen kullanıcıların docker grubunun azaları olmasından güvenilir olun.
$ getent group docker
Docker içersinde Auditing Konfigurasyonunun Yapılması
Düzenli Linux dosya sisteminizi ve sistem çağrılarınızı denetlemenin(Auditing) yanında Docker daemonunu denetlemek ehemmiyetlidir.
Docker daemon, root ayrıcalıklarıyla çalışır.
Bu nedenle hareketlerini ve tüketimini denetlemek gerekmektedir.
Önlem: Docker daemon içersinde bir Auditing kaidesi olduğunu doğrulayın.
Örneğin, alttaki komutu çalıştırın:
$ auditctl -l | grep /usr/bin/docker
Bu kaide size Docker ile ilgili bir auditing kaidesi olup/olmadığını listeleyecektir.
Docker daemon’u içersinde kaide yoksa; /etc/audit/audit.rules dosyası içerisine:
-w /usr/bin/docker -k docker
Yazdıktan ardından, Auditd servisini yine başlatabilirsiniz.
Auditing epey büyük log dosyaları oluşturur.
Periyodik olarak döndürüp arşivlediğinden güvenilir olun.
Ayrıca, kök dosya sistemini doldurmamak içersinde ayrı bir auditing kısmı oluşturduğunuza ilgi edin.
Docker Içersinde Oluşturulması Lüzumlenen Auditing Kuralları:
-w /usr/bin/docker -k docker
-w /var/lib/docker -k docker
-w /etc/docker -k docker
-w /usr/lib/systemd/system/docker.service -k docker
-w /usr/lib/systemd/system/docker.socket -k docker
-w /etc/default/docker -k docker
-w /etc/docker/daemon.json -k docker
-w /usr/bin/docker-containerd -k docker
-w /usr/bin/docker-runc -k docker
Docker Daemon Sıkılaştırmaları
Konteynerler Arası Lüzumsuz İletişimi Engelleme
Varsayılan olarak, düşünülen şebeke köprüsünde(network bridge) aynı ana bilgisayardaki(host) bütün konteynerler arasında hudutsuz şebeke trafiğini kullanabilmektedir.
Böylelikle, her bir konteyner, aynı ana bilgisayar üzerindeki konteyner şebekesi süresince bütün paketleri okuma potansiyeline sahiptir.
Bu istenmeyen bir malumat ifşasına neden olabilir.
Bu nedenle, konteyner iletişimini network bridge üstünde kısıtlayın.
Önlem: Alttaki komutu çalıştırın ve düşünülen şebeke köprüsünün(network bridge) konteyner içi iletişimi kısıtlayacak şekilde yapılandırıldığını doğrulayın.
$ docker network ls –quiet | xargs docker network inspect –format ‘{{ .Name }}: {{ .Options }}’
“Com.docker.network.bridge.enable_icc:false” şeklinde düşünülen olarak dönüş yapacaktır.
Bu vaziyeti kısıtlamak için:
$ dockerd –icc=false
Kullanabilirsiniz, seçenek olarak Docker dokümanlarını takip edip kalifiye bir şebeke oluşturabilir ve tekilce bu kalifiye ağa etkileşim kurması lüzumlenen konteynerleri birleştirebilirsiniz.
–icc parametresi tekilce düşünülen docker köprüsü içersinde geçerlidir.
Loglama Düzeyinin “Info” Olarak Seçilmesi
Uygun bir log düzeyi ayarlamak, ardından gözden geçirmek isteyeceğiniz hadiseleri kaydetmek içersinde Docker daemonunu yapılandırır.
Bir esas logo düzeyi ve üstü, eksiklikleri ayıklama(debug) logları dışındaki bütün logları yakalayacaktır.
Gerekli imkan kadar, Docker daemon’unu debug düzeyi loglama ile çalıştırmamalısınız.
Önlem: Docker’ı info düzeyi loglama ile çalıştırdığınızdan güvenilir olun.
$ dockerd –log-level=”info”
Docker Servisinin Iptables Kaidelerini Kendiliğinden Düzenlemesi
Iptables, Linux çekirdeğindeki IP paket filtre kurallarının tablolarını meydana getirmek, sürdürmek ve denetlemek içersinde tüketilir.
Docker sunucusu, ihtiyaç duyulan izinleri kendiliğinden konteynerler içersinde (ağ seçeneklerinizi sebep seçeceğinize bağlı olarak) iptables üstünde lüzumlenen farklılıklari yapar.
Konteynerler ve dış dünya arasındaki iletişimi engelleyebilecek şebeke yapılandırmasını önlemek içersinde Docker sunucusunun iptables ayarlarında kendiliğinden farklılık yapmasına destur verilmesi tavsite edilir.
Ek olarak bu ayar Iptables’ı her seferinde güncellemenin zorluklarından da kurtarır.
Önlem: Docker tanımlı olarak dockerd –iptables=true olarak başlamaktadır.
Kontrol olarak alttaki komutu kullanabilmeniz mümkün.
$ ps -ef | grep dockerd
Güvenilmeyen Kayıt defteri (registry) (kayıtların) Dönem Dışı Bırakılması
Docker, kalifiye bir kayıt defterini güvenilir ya da güvensiz olarak kabul etmektedir.
Varsayılan olarak, kayıtlar güvenilir kabul edilir.
Güvenli bir kayıt ünitesi (registry) TLS kullanır.
Kayıt defterinin CA sertifikasının bir kopyası Docket ana bilgisayarında (host) /etc/docker/certs.d// dizininde konur.
Güvenli olmayan bir kayıt defteri(registry) geçerli kayıt sertifikasına sahip olmayan ya da TLS kullanmayan bir kayıt defteridir.
Production ortamında herhangi bir güvensiz kayıt(registry) kullanmamalısınız.
Güvenli olmayan kayıtlar, production sisteminize mümkün bir bağlantı sağlanmasına neden olabilir.
Ayrıca, bir registry (kayıt defteri) güvensiz olarak işaretlendiyse, docker pull, docker push ve docker search komutları bir eksiklikleri iletisine sebep olmaz ve kullanıcıları, potansiyel tehlike ile ilgili herhangi bir bildirim yapılmadan, bu kayıtlarla beraber farketmeden müddetsiz olarak çalışabilir.
Önlem: Docker’ın –insecure-registry parametresi ile başlatılmadığından güvenilir olun.
$ps -ef | grep dockerd
Örneğin, Docker’ı şöyle başlatmamalısınız:
$dockerd –insecure-registry 10.1.0.0/16
Aufs Dosya Düzeneğinin Dönem Dışı Bırakılması
Aufs, dosyalama sistemi en külüstür dosya sistemi sürücüsüdür.
Aufs sürücüsü(driver) de kimi ciddi kernel çökmelerine yol açtığı bilinmektedir.
En ehemmiyetlisi, aufs, son olarak Linux çekirdeğini kullanan çoğu Linux dağıtımında desteklenen bir sürücü değildir.
Önlem:
$docker info | grep -e “^Storage Driver:\s*aufs\s*$”
Örneğin Docker’ın “dockerd –storage-driver aufs” ile başlatılmaması gereklidir.
Docker içersinde TLS Authentication Konfigurasyonunun Yapılması
Docker daemonunu default(tanımlı) Unix socket dışında özel bir IP ve Port’u dinlenmesi sağlanabilmektedir.
Docker serverına IP ve port vasıtasıyla erişimi kısıtlamak içersinde TLS auhtentication (kimlik doğrulamasını) yapılandırılabilmektedir.
Varsayılan olarak, Docker daemon ağa bağlı olmayan bir Unix soketine bağlanır ve kök (root) ayrıcalıklarıyla çalışır.
Varsayılan docker daemon’unu bir TCP portuna veyahut farklı bir Unix soketine bağlarsanız, bu port veyahut sokete erişimi olan herkes Docker daemon’una ve ardından ana sisteme tam erişime sahip olabilir.
Bu nedenle Docker daemonunu farklı bir IP / port ya da Unix soketine bağlamamalısınız.
Docker daemonunu bir şebeke soketi üstünden bağlamanız gerekiyorsa, Docker daemonunu Docker Swarm API’leri (kullanılıyorsa) içersinde TLS kimlik doğrulamasını (auhtentication) yapılandırın.
Bu, Docker daemon’unuzun şebeke üzerindeki bağlantılarını TLS üstünden başarı ile kimlik doğrulaması yapabilecek hudutlu sayıda istemciyle sınırlayacaktır.
$ps -ef | grep dockerd
–tlsverify
–tlscacert
–tlscert
–tlskey
Parametrelerinin aktif olmasından güvenilir olun.
Varsayılan olarak TLS kimlik doğrulaması yapılandırılmamıştır.
Tanımlı Olan Ulimit Değerlerinin Düzenlenmesi
Ulimit, Shell içersinde sahip olunan olan kaynaklar ve onun doğrulusunda başlatılan processler üstünde muayene sağlar.
Sistem kaynak limitlerini ayarlamak sizi fork bomb gibi çoğu felaketten kurtarır.
Bazen, normal kullanıcılar ve malum processler dahi sistem kaynaklarını aşırı kullanabilir ve sistemi kullanılamaz duruma getirebilir.
Docker daemon içersinde düşünülen ulimit ayarı bütün konteyner içersinde tek bir ulimit konfigÜrasyonu kullanır.
Her bir konteyner içersinde ulimit kurmanıza lüzum kalmaz.
Ancak, gerekliyse, düşünülen ulimit konfigÜrasyonu konteyner çalışırken düzenlenebilir.
Bu nedenle, sistem kaynaklarını muayene etmek içersinde, ortamınızda gerektiği gibi düşünülen bir ulimit tanımlayın.
Eğer ulimitler düzgün ayarlanmamışsa, dilenen kaynak muayenesi sağlanamayabilir ve hem de sistemi kullanılamaz duruma getirebilir.
Örneğin alttaki gibi bir tarif yapılabilmektedir:
$ dockerd –default-ulimit nproc=1024:2048 –default-ulimit nofile=100:200
Kullanıcı Namespace’lerini Aktifleştirmek
Docker daemon’daki Linux çekirdeği user namespace dayanağı, Docker ana bilgisayar(host) sistemi içersinde ek güvenlik sağlar.
Bir konteynerin, ana sistem doğrulusunda sarfedilen ananesel kullanıcıları ve küme aralığının dışında olan bir dizi kullanıcıları ve küme kimliğine sahip olmasını sağlar.
Örneğin, kök kullanıcıları konteynerin içersinde beklenilen idare ayrıcalığına sahip olacak, fakat ana bilgisayar sistemindeki imtiyazlı olmayan bir UID ile tesirli bir şekilde eşleştirilebilecektir.
$ ps -p $(docker inspect –format='{{ .State.Pid }}’ ) -o pid,user
Yukarıdaki komut, konteynerin PID’sini bulur ve ardından konteyner işlemiyle temaslı host kullanıcı listeler.
Konteyner kök olarak çalışıyorsa, bu tavsiye ahenkli değildir.
Alternatif olarak, kullanıcıların Güvenlik Seçenekleri (Security Options) altında listelendiğinden güvenilir olmak içersinde docker info çalıştırabilirsiniz:
$docker info –format ‘{{ .SecurityOptions }}’
Tanımlı Cgroup Tüketiminin Onaylanması
Sistem yöneticileri, çoğunlukla, konteynerlerin çalışacağı düşünülen gruplarını tarifler.
Gruplar sistem yöneticileri doğrulusunda açıkça tanımlanmasa dahi, kapsayıcılar düşünülen olarak docker cgroup altında çalışır.
Varsayılan olandan değişik bir cgroup ilave etmek olasıdır.
Bu kullanım izlenmeli ve onaylanmalıdır.
Varsayılan olandan değişik bir c grubu ilave ederek, kaynakları denk olmayan şekilde paylaşarak ana bilgisayar(host) kaynak sorunlarına sebep olabilmektedir.
$ps -ef | grep dockerd
–cgroup-parent parametresinin aktif olmadığı güvenilir olun.
Varsayılan ayar yeteri kadar iyidir ve bulunduğu gibi bırakılabilir.
Özellikle düşünülen olmayan bir küme meydana getirmek dilerseniz, başlatırken docker daemonuna –cgroup-parent parametresi ile çalıştırın.
$ dockerd –cgroup-parent = / foobar
Docker Istemci Komutları Içersinde Yetkilendirme Etkinleştirilmesi
Docker’ın kullanıma hazır yetkilendirme modeli tam anlamıyla kafi olmamaktadır.
Docker daemonuna erişim müsaadeyi olan herhangi bir kullanıcıları herhangi bir Docker istemci komutunu çalıştırabilir.
Aynısı Docker’ın uzak API’sini kullanarak daemon ile iletişime geçmek isteyenler içersinde de geçerlidir.
Daha çok erişim muayenesi gerekiyorsa, yetkilendirme eklentileri oluşturabilir ve Docker server yapılandırmanıza ekleyebilirsiniz.
Bir yetkilendirme eklentisi(plugin) kullanarak, Docker yöneticisi Docker uygulamasına erişimi yönetmek içersinde detaylı erişim ilkeleri düzenleyebilir.
1.
Adım: Bir yetkilendirme eklentisi kurun / oluşturun.
2.
Adım: Yetkilendirme siyasetini isteğinize göre yapılandırın.
3.
Adım: docker daemon uygulamasını alttaki gibi başlatın:
$ dockerd –authorization-plugin =
Her bir docker komutu, kalifiye olarak yetkilendirme eklenti mekanizmasından geçer.
Bu, ufak bir performans düşüşü getirebilir.
Merkezi Ve Uzak Loglama Yapısının Yapılandırılması
Docker şimdi muhtelif loglama sürücülerini desteklemektedir.
Logları depolamanın seçenek edilen bir yolu, merkezi ve uzak oturumları destekleyen bir yöntemdir.
Merkezileştirilmiş ve uzak loglama, bütün ehemmiyetli kayıtların güvenle tutulmasını sağlar.
Docker henüz muhtelif loglama sürücülerini destek veriyor.
Ortamınıza ideal olanı kullanın.
Docker info’yu çalıştırın ve Logging Driverproperty unsurunun makul şekilde ayarlandığından güvenilir olun.
$ docker info –format ‘{{.LoggingDriver}}’
Adım 1: Dokümanları izleyerek dilenen log sürücüsünü kurun.
Adım 2: Docker daemonunu o loglama sürücüsüyle beraber başlatın.
Örneğin,
$ dockerd –log-driver = syslog –log-opt syslog-address = tcp: //192.xxx.xxx.xxx
Live Restore Opsiyonunun Açılması
–live-restore, docker’daki daemonsuz konteynerlere tam takviye karşılamaktadır.
Docker’ın kapatma ya da geri yükleme esnasında konteynerleri durdurmadığından ve yine başlatıldığında konteynerlere yine bağlanmasını karşılamaktadır.
Docker daemonunda bulunan –live-restore parametresi, docker daemon sahip olunan olmadığında konteyner uygulamasının kesintiye uğramamasını sağlar.
Bu bu arada update ya da patch esnasında downtime olmadan yapılabilmesini sağlar.
$docker info –format ‘{{ .LiveRestoreEnabled }}’
Aktifleştirmek için:
$ dockerd –live-restore
Userland Proxy’nin Kapatılması
Docker daemon, bir port her açıldığında (expose) port yönlendirme içersinde bir userland proxy başlatır.
NAT’ın sahip olunan bulunduğu yerlerde, bu servis çoğunlukla ihtiyaçlar içersinde gereksizdir ve dönem dışı bırakılabilir.
$ ps -ef | grep dockerd
Komutu ile –userland-proxy parametresini muayene edebilirsiniz.
Kapatmak içersinde alttaki şekilde başlatın.
$ dockerd –userland-proxy=false
Daemon Çapında Kalifiye Seccomp Profilinin Uygulanması
Gerekirse, kalifiye seccomp profilinizi daemon geneli düzeyinde uygulayabilir ve Docker’ın düşünülen seccomp profili geçersiz kılınabilmektedir.
Çok sayıda sistem çağrısı, her bir userland processine tutunur ve fazlası işlemin bütün ömrü süresince kullanılmaz.
Uygulamaların fazlası, bütün sistem çağrılarına gereksinim duymaz ve bu nedenden dolayı, daha düşük sayıda sahip olunan sistem çağrısına sahip olmakla faydalanır.
Azaltılmış sistem çağrıları seti, programın kullandığını toplam çekirdek yüzeyini azaltmaktadır ve böylelikle program güvenliğini geliştirir.
Docker’ın düşünülen seccomp profili adına kendisi kalifiye seccomp profilinizi uygulayabilirsiniz.
Alternatif olarak, Docker’in düşünülen profili ortamınız içersinde uygunsa, bu teklifi yok saymayı seçebilirsiniz.
Aşağıdaki komutu çalıştırın ve Security Options kısmında listelenen seccomp profilini gözden geçirin.
Varsayılan ise, başka bir deyişle Docker’ın düşünülen seccomp profile yapılır.
$ docker info –format ‘{{.SecurityOptions}}’
Varsayılan olarak, Docker’ın düşünülen seccomp profili yapılır.
Bu, ortamınız içersinde iyi ise, hiçbir prosedür ihtiyaç duyulan değildir.
Alternatif olarak, kendisi seccomp profilinizi seçmeyi seçerseniz, daemon başlangıcında –seccomp-profile parametresini kullanın ya da daemon runtime parametreleri dosyasına koyun.
$ dockerd –seccomp-profile
Yanlış yapılandırılmış bir seccomp profili konteyner ortamınızı bozabilir.
Docker düşünülen engellenen çağrılar dikkatlice incelenmiştir.

Yorumlar

Bu blogdaki popüler yayınlar

En İyi 20 Hacker Duvar Kağıtları