Güvenlik için Docker portlarına dikkat edin

Yakın bir zamanda projelerden birisinde çok güzel bir arama sonucu sunmamız gerekiyordu. Bunun için kullanacağımız ücretli seçenekler arasında Algolia bulunuyor fakat development sürecinde bile ücret ödememiz gerekiyordu. Ücretlendirme konusunda bu şekilde katı oldukları için bence kendilerini tercih eden geliştirici pek fazla bulunmuyor.

Bunun yerine Elastic Search ile sorunumuzu çözmeye karar verip kendimizi bu konuda geliştirmek için 1 haftalık bir süre ayırdık. Laravel ile birlikte kullanmanın ek bir kolaylığı bir yana Elastic Search, Docker ile elimizde patlamış sayılır. Ağızlardan düşmeyen Elastic Search hakkında bir de güvenlik ile ilgili cümleler duysaydık bu maili almamız pek gerekmezdi.

We have received a security alert from the German Federal Office for Information Security (BSI).

Please see the original report included below for details.

HETZNER

Sunucularımız bir kısmı Almanya’da bulunduğu için otomatik bir tarama sonucunda bu maili aldığımızı biliyoruz fakat hiçbirimiz kendimizi geliştirdiğimiz zaman Elastic Search’ın production aşamalarına odaklanmadık ve herhangibir hack durumu olmadan önce yetkililer tarafından uyarılarak sorunu düzeltmek adına yola koyulduk.

Fakat bir sorunumuz var. Docker ile iptables tam efektif bir sonuç vermiyor. Portları engellediğimizi ve ES sunucusunu dışarıya kapattığımızı düşünürken Docker’ın bizi çırılçıplak sokakta tuttuğunu kaçırmışız.

İlk bakışta, bu herhangi bir sorun gibi görünmüyordu. Benim durumumda UFW olan güvenlik duvarı ile HTTP(S) dışındaki tüm gelen bağlantı noktalarını engellediğimi biliyordum. Sorun, bu yapılandırmayla Docker’ın ana makinedeki 9200 bağlantı noktasını kapsayıcıdaki 9200 bağlantı noktasına bağlamasıdır. Yine, bunun bir sorun olmayacağını düşündüm, çünkü diğer tüm bağlantı noktalarını zaten engelledim. Ancak Docker, iptables yapılandırmasını doğrudan düzenlediği için UFW’ye veya belki başka bir güvenlik duvarına hiç saygı duymaz. Bu şekilde, kullanılan bağlantı noktası için bağlantılar güvenlik duvarını atlar ve doğrudan konteynere ulaşır. Port 9200 artık tüm gelen bağlantılar için açıktı. Ne yazık ki, bu gerçek Docker dökümantasyonunda var , bu yüzden bu davranışın farkında değildim.

Fakat Docker ile port yönlendirmesi yaptığımız zaman çok ufak bir detay sayesinde mikroservislerin çalışma prensiplerine biraz daha hakim olduğumu söyleyebilirim. Sadece port yönlendirmesinin önüne localhost ip adresi yerleştirerek.

version: '2.2'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0
    container_name: es01
    # ...
    # ...
    ports:
      - 9200:9200 # <<<

Bu şekilde ayağa kaldırdığımız container sağlıklı bir şekilde çalışırken public ip adres üzerinden dışarıya da yayın yapıyor.

Fakat aşağıdaki gibi yaptığımız zaman malum porta sadece bilgisayarımızın kendisi ulaşabiliyor ve gelen isteklerin çıktısını kendi içinde hallediyor. Bu durumda dışarıdan hiçbir şekilde ES containerine kimse ulaşamaz oluyor.

version: '2.2'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0
    container_name: es01
    # ...
    # ...
    ports:
      - 127.0.0.1:9200:9200 # <<<

Docker ile Elastic Search’ı tam olarak nasıl ayağa kaldırdığımı merak ediyorsanız eğer aşağıdaki yml dosyasını inceleyebilirsiniz.

  GNU nano 2.3.1                                            File: docker-composer.yml                                                                                               

version: '2.2'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0
    container_name: es01
    environment:
      - node.name=es01
      - cluster.name=es-docker-cluster
      - "discovery.type=single-node"
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data01:/usr/share/elasticsearch/data
    ports:
      - 127.0.0.1:9200:9200
    networks:
      - elastic

volumes:
  data01:
    driver: local

networks:
  elastic:
    driver: bridge

Sonrasında “docker-compose -f docker-composer.yml up” ayağa kalkmanız için yeterli olacaktır. Kibana kurarak sorguları analiz edebilir ve kendinize anlamlı veriler oluşturabilirsiniz. Onu da aynı şekilde farklı bir container üzerinde çalıştırarak Elastic Search ile konuşmasını sağlamanız gerekiyor. Fakat henüz bunu kullanmayı tercih etmiyoruz.

Write a Comment