Liman işçisi üretimde çalışırken göz önünde bulundurulması gereken en iyi ve kapsamlı uygulamalar nelerdir?


42

Son olarak, Docker'a o kadar aşıksınız ki, iş açısından kritik öneme sahip çevrimiçi üretim sistemlerinizi hassas müşteri verileriyle Docker Swarm'a taşımak istiyorsunuz. Bazıları çoktan bile yapmış olabilir. Diğer kuruluş, kök modunda çalışan üretim süreçlerini yasaklayan bir politika ile bunu karşılayamaz.

Docker üretim ortamı için göz önünde bulundurulması gereken yapı taşlarının kontrol listesi ne olabilir? Kişi hepsine ihtiyaç duymaz, ancak hepsinin değerlendirilmesi önemlidir.

Feragatname: "Büyük sonsuz listelerden" kaçınmak için bir SE politikası olduğunu biliyorum, ancak bu kontrol listesinin çok büyük olamayacağını ... ve bitmez tükenmez olacağını düşünüyorum.

Peki, bu binalar blokları nelerdir?

  1. Henüz konuşlandırılmadıysa, gelişmiş güvenlik ayarlarına sahip bir Linux ana sistemi çalıştırmayı düşünün - sertleştirilmiş çekirdek, SELinux vb.
  2. Alp, meşgul kutusu veya çizik gibi küçük bir Docker ana görüntüsü kullanmayı düşünün, örneğin boş bir temel görüntüyle başlayın
  3. Kök dışındaki KULLANICI ayarını kullanın
  4. Konteynere verilen önceden daraltılmış çekirdeği yetenekleri kümesini daha da azaltmak için dikkatlice değerlendirin
  5. Prosesinizi başlatmak için her konteyner için sadece bir çalıştırılabilir ikili dosya bulundurmayı düşünün, ideal olarak statik olarak bağlanmış
  6. Kabuk erişimi almak için sisteminizi kırmak isteyenler, konteynerinizin tüm mermileri devre dışı bıraktığını öğrendiler mi merak edebilirler.
  7. Mümkün olan yerlerde salt okunur hacimleri takın

Soru: Başka ne var?


Bunu çok geniş buluyorum. Fakat aynı zamanda soruyu da sevdim. Yani, toplum bu :) karar edelim
Dawny33

Etiketin devsecopsanlamı nedir?
030


Bunun neden Consider using a tiny Docker base image, like alpine, busybox or even scratch e.g. start with an empty base imagegüvenliği arttırdığını açıklayabilir misiniz ?
030

3
030, ne kadar az yüklediyseniz, bakıma ihtiyaç duyulmayan ve / veya potansiyel olarak yararlanılabilir olan ihtiyaç duyulmayan hizmetlere / yazılıma karşı daha iyi korunabilirsiniz. Her bir kabın tek bir servis için kullanılması gerektiğinden, minimum seviyeye soymak daima daha iyi çalışacaktır.
Leon

Yanıtlar:


23

Kapların çalıştığı ana bilgisayar

Liman güvenlik kaplarını çalıştıran her düğümdeki liman güvenlik bankasını çalıştırın https://github.com/docker/docker-bench-security

Docker kapsayıcılarını çalıştıran bir düğümde aşağıdaki komutu çalıştırmak:

docker run -it --net host --pid host --cap-add audit_control \
    -e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
    -v /var/lib:/var/lib \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /usr/lib/systemd:/usr/lib/systemd \
    -v /etc:/etc --label docker_bench_security \
    docker/docker-bench-security

bir kontrol listesi döndürür:

[INFO] 1 - Host Configuration

[WARN] 1.1  - Ensure a separate partition for containers has been created

[NOTE] 4.2  - Ensure that containers use trusted base images

[PASS] 4.6  - Ensure HEALTHCHECK instructions have been added to the container image

README deposundan alıntı:

Güvenlik için Docker Tezgahı, Docker konteynerlerini üretimde dağıtma konusunda düzinelerce ortak en iyi uygulamayı denetleyen bir komut dosyasıdır. Testlerin tümü otomatiktir ve BDT Docker Topluluk Sürümü Benchmark v1.1.0'dan ilham almıştır .

Güvenlik tezgahı tarafından rapor edilen sorunlardan bazıları resmi liman işçisi güvenlik makalesini okuyarak ve soruda tanımlanan madde işaretleri ile karşılaştırarak çözülebilir: Aşağıdaki şeyler de önemlidir:

  • ssl uygulayarak docker cini soketini koru
  • noter ve DOCKER_CONTENT_TRUSTdeğişken kullanarak içerik güven

7

Docker hala geliştirilme aşamasındadır.

Diğer tüm yazılım içi hatalarda olacağı gibi, güvensiz özellikler de eklenebilir, güvenlik ihlallerine yol açan mimari kusurlar olabilir. Bunu küçümseme! Sisteminiz bugün tamamen güvenli olabilir, ancak önümüzdeki haftaki düzeltme eki ile birileri bir hata bulur, bir istismar yazar ve aniden sisteminiz açık kalır.

Yapmanız gerekmiyorsa, en son sürüme güncelleme yapmayın. Bunun yerine iyi test edilmiş en son sürümü kullanın.

Docker sanallaştırma değil

Biri bir Docker konteynerinden kaçarsa, o saldırgan derhal gerçek makinededir. Sanallaştırmaya benzeyen ikinci bir geçit bulunmaz ve ihlali önler.

Bir Docker konteynerine başka bir program gibi davranın. Mümkün olan en düşük kullanıcı haklarıyla çalıştırın, gerekli olmayan tüm ağ trafiğini engelleyin, performans izin veriyorsa tüm Docker ana makinesini sanallaştırın.

Docker korumalı değil

Docker kapsayıcılarının içinde hangi kod çalıştırılırsa çalıştırılsın mı Docker'dan soru sormadan. Herhangi bir saldırgan, yazılımını kabın içine kolayca yükleyebilir ve Docker da bunu diğer kodlar gibi çalıştırabilir.

Soruda bahsettiğiniz şeylerin yanı sıra, Docker görüntülerinden herhangi biri garip şeyler yapıyorsa, bildirim almak için ölçümleri ve uyarıları kullanmayı düşünün. Ani, devam eden bir CPU yükselişi var mı? Program aniden ağ bağlantı noktalarını mı tarıyor? Şüpheli disk erişimi var mı? Bunlardan herhangi biri olursa bir bildirim almalısınız. Bunları ölçmek için birçok araç var, bunları kullanmalısınız.


7

Docker görüntüleri

Ek bir seçenek Clair kullanmaktır .

Clair, uygulama konteynerlerindeki (şu anda appc ve docker dahil) statik açıklık analizi için açık kaynaklı bir projedir.

Düzenli aralıklarla, Clair güvenlik açığı meta verilerini yapılandırılmış bir kaynak kümesinden alır ve veritabanında depolar.

Müşteriler, konteyner görüntülerini dizine eklemek için Clair API'sini kullanır; bu, görüntüde bulunan özelliklerin bir listesini oluşturur ve bunları veritabanında saklar.

İstemciler, veritabanını belirli bir görüntünün zayıf noktalarına karşı sorgulamak için Clair API'sini kullanır; Resimlerin yeniden taranması gereğini ortadan kaldırarak, her istek için güvenlik açıkları ve özellikler arasında ilişki kurulabilir.

Güvenlik açığı meta verilerine yönelik güncellemeler gerçekleştiğinde, bir değişiklik meydana geldiği konusunda uyarıcı sistemler için bir bildirim gönderilebilir.

Amacımız, konteyner bazlı altyapının güvenliğinin daha şeffaf bir şekilde görülmesini sağlamaktır. Bu nedenle, proje açık, parlak, saydamlık anlamına gelen Fransızca terimden sonra Clair olarak adlandırılmıştır.


5

Bu konudaki noktalara ek olarak; Aşağıdaki benim tavsiyem olur:

  • Salak init ile Docker PID1'in kontrolünü elinize alın
  • Liman işçisi üretimde konteyner düzenleme sistemi olmadan çalıştırmayın
    • Seçiminizi Kubernetes, Mesos, Swarm vb.
  • Liman işçisi görüntüsünde kullanıcı kontrolü için gosu kullanın
  • Konteynırlarda durum bilgisi olan uygulamalar kullanıyorsanız, 12 faktörlü uygulama paradigmasını uygulayın, değiştirin.
    • Kapsayıcı olarak durum bilgisi olan uygulamaları (mysql, zookeeper, elasticsearch ) çalıştırmanız gerekiyorsa, Kubernetes Statefulsets gibi orkestratör paradigmalarından yararlanın
  • Hashicorp tonoz / consul gibi araçlarla sağlam bir sır / yapılandırma yönetimi yapın
  • Hazırlama, entegrasyon testleri ile tamamlanan bir CI boru hattı aracılığıyla geliştirmek için devs tarafından inşa edilen aynı konteyneri gönderin.
  • CVE'ler ve yamalar etrafında bildirimler oluşturun, yama bildirimlerinde yapıları tetikleyin
  • Çalışan konteynıra ilişkin ayrıntılı bilgi almak için kapsamlı bir günlük kaydına sahip olun, devs SSH’ya ana makineye veya konteynere erişim izni vermek istemezsiniz
    • öneri: akıcı
  • Hem container hem de host metrics var
    • öneri: prometheus + düğüm ihracatçısı

2

Liman işçisi giriş noktanızı sedkomutlarla dolduruyorsanız , şu uygulamayı göz önünde bulundurun:

  • Liman işçisi görüntü yapılandırma dosyalarınızı yönetmek ve güncel tutmak için confd gibi bir araç kullanın

Confd , desteklenen birçok anahtar / değer deposundaki verileri okuyacak ve yapılandırma şablonlarını dinamik olarak oluşturacaktır.


0

Biri, bazı şeyleri göz önünde bulundurarak, örneğin kök olmayan, izinler, uygulamanın konumu gibi bir uygulamayı bir docker görüntüsüne oluşturmak için A2D'yi kullanabilir :

docker run -v $PWD:/projectName utrecht/a2d:1.0.0 \
       -projectName someProjectName -dockerfile /projectName/Dockerfile

döner:

FROM golang:1.12.4-alpine as builder
COPY . ./someProjectName/
WORKDIR someProjectName
RUN adduser -D -g '' someProjectName && \
    apk add git && \
    CGO_ENABLED=0 go build && \
    cp someProjectName /someProjectName && \
    chmod 100 /someProjectName

FROM scratch
COPY --from=builder /etc/group /etc/group
COPY --from=builder /etc/passwd /etc/passwd
COPY --from=builder --chown=someProjectName:someProjectName /someProjectName /usr/local/someProjectName
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
USER someProjectName
ENTRYPOINT ["/usr/local/someProjectName"]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.