Kubernetes kümesini güvence altına almak, modern uygulama geliştirme ve dağıtım süreçlerinde kritik bir adımdır. Bu blog yazısı, Kubernetes kümenizi güvence altına almak için gerekli en iyi uygulamaları ve adımları içeren bir yazıdır.
Bu blog yazısı aşağıdaki kategorilerden oluşur.
-
Giriş: Kubernetes Nedir?
-
Kubernetes Ana Bilgisayarlarını Güvenceye Alma
-
Kubernetes Bileşenlerini Güvenceye Alma
1. Giriş: Kubernetes Nedir?
Kubernetes, uygulamaların dağıtımını, ölçeklendirilmesini ve yönetimini otomatikleştiren açık kaynaklı bir kapsayıcı orkestrasyon motorudur.Google tarafından 2014 yılında geliştirilmiştir ve şu anda, Cloud Native Computing Foundation (CNCF) tarafından yönetilmektedir.
Kubernetes’i dağıttığınızda, bir küme(cluster) elde edersiniz. Bir Kubernetes kümesi, kapsayıcı uygulamaları çalıştıran nodelar olarak adlandırılan bir dizi işçi makineden oluşur. Control Plane , kümedeki işçi Node’ları ve Pod’ları yönetir.
Control Plane Bileşenleri
Control Plane bileşenleri, küme hakkında küresel kararlar alır ve küme olaylarını algılayıp yanıt verir. Kube-apiserver, etcd, kube-scheduler, kube-controller-manager ve cloud-controller-manager gibi bileşenlerden oluşur.
Bileşen: kube-apiserver
Kubernetes API’sini sağlar.
API İsteklerini Yönetme: Kubernetes API’sine gelen tüm REST isteklerini kabul eder ve işler.
Veri Doğrulama ve Yapılandırma: API sunucusu, gelen verileri doğrular ve yapılandırır. Bu, Kubernetes kümesinin tutarlı ve güvenli bir şekilde çalışmasını sağlar.
Cluster’ın Paylaşılan Durumu: Diğer tüm Kubernetes bileşenleri, kümenin paylaşılan durumu ile etkileşimde bulunmak için API sunucusunu kullanır. Bu, bileşenlerin birbirleriyle uyumlu çalışmasını sağlar.
Bileşen: etcd
Key-value deposu olarak işlev görür.
**Veri Depolama : **Kubernetes kümesinin tüm yapılandırma ve durum bilgilerini saklar. Bu, kümenin durumu hakkında merkezi bir bilgi kaynağı sağlar.
Koordinasyon ve Senkronizasyon: Kubernetes bileşenleri arasında koordinasyon ve senkronizasyon sağlar. Bu, kümenin tutarlı ve güvenilir bir şekilde çalışmasını sağlar.
Yüksek Erişilebilirlik: Verilerin yüksek erişilebilirliğini ve dayanıklılığını sağlamak için dağıtılmış bir yapı kullanır. Bu, kümenin herhangi bir bileşeninin arızalanması durumunda bile çalışmaya devam etmesini sağlar.
Bileşen: kube-scheduler
Pod’ları uygun nodelara atamakla görevlidir.
Pod Atama: Pod’ların hangi nodelara yerleştirileceğini belirler. Bu, pod’ların çalışması için uygun nodeları seçmek anlamına gelir.
Kaynak Yönetimi: Nodeların mevcut kaynaklarını (CPU, bellek vb.) göz önünde bulundurarak pod’ları yerleştirir. Bu, kaynakların verimli kullanılmasını sağlar.
Kısıtlamalar ve Politikalar: Pod’ların yerleştirilmesi sırasında belirli kısıtlamaları ve politikaları dikkate alır. Örneğin, belirli bir node da çalışması gereken pod’lar veya belirli kaynak gereksinimleri olan pod’lar gibi.
Bileşen: kube-controller-manager
Çeşitli kontrol döngülerini (control loops) içerir.
Kontrol Döngülerini Yönetme: Replication controller, endpoints controller, namespace controller ve service accounts controller gibi çeşitli kontrol döngülerini çalıştırır. Bu döngüler, kümenin durumunu izler ve istenen duruma getirmek için gerekli değişiklikleri yapar.
Durum Yönetimi: Kubernetes kümesinin paylaşılan durumunu izler ve bu durumu istenen duruma getirmek için gerekli adımları atar. Örneğin, bir pod’un belirli bir sayıda çalışmasını sağlamak için replication controller’ı kullanır.
Kaynak Atama ve Yönetimi: Kaynakların (örneğin, IP adresleri, namespace’ler) atanması ve yönetilmesi gibi görevleri yerine getirir.
Bileşen: cloud-controller-manager
Bulut sağlayıcılarına özgü kontrol mantığını içerir.
Bulut Sağlayıcı Entegrasyonu: Kubernetes kümesini bulut sağlayıcınızın API’sine bağlar. Bu, Kubernetes’in bulut altyapısıyla etkileşimde bulunmasını sağlar.
Bileşen Ayrımı: Bulut platformuyla etkileşimde bulunan bileşenleri, yalnızca küme ile etkileşimde bulunan bileşenlerden ayırır. Bu, bulut sağlayıcılarının Kubernetes’ten bağımsız olarak özellikler geliştirmesine olanak tanır.
Özelleştirilebilirlik: Bulut sağlayıcıları, kendi kontrol mantıklarını cloud-controller-manager’a ekleyebilirler. Bu, bulut sağlayıcılarının kendi özel ihtiyaçlarına göre Kubernetes’i uyarlamalarını sağlar.
Node Bileşenleri
Node bileşenleri her node daçalışır, çalışan pod’ları korur ve Kubernetes çalışma ortamını sağlar. Kubelet, kube-proxy ve container-runtime gibi bileşenlerden oluşur.
Bileşen: kubelet
Kubernetes’in her nodeunda çalışan bir ajan olarak işlev görür ve pod’ların düzgün çalışmasını sağlar.
Pod Yönetimi: Her nodedaki pod’ların durumunu izler ve Kubernetes API sunucusundan aldığı talimatlara göre pod’ları başlatır veya durdurur.
Sağlık Kontrolleri: Pod’ların ve konteynerlerin sağlık durumunu izler. Eğer bir pod veya konteyner başarısız olursa, kubelet bu durumu bildirir ve gerektiğinde yeniden başlatır.
Kaynak İzleme: Nodedaki kaynakların (CPU, bellek vb.) kullanımını izler ve bu bilgileri Kubernetes API sunucusuna raporlar.
Bileşen: kube-proxy
Kubernetes’in her düğümünde çalışan bir ağ proxy’sidir ve Kubernetes hizmetlerinin (services) ağ trafiğini yönlendirmek için kullanılır. İşte başlıca işlevleri12:
Ağ Yönlendirme: kube-proxy, Kubernetes hizmetlerinin IP adreslerini ve portlarını yönetir ve gelen trafiği uygun pod’lara yönlendirir.
Yük Dengeleme: kube-proxy, hizmetler arasında yük dengeleme yaparak trafiği birden fazla pod’a dağıtır. Bu, hizmetlerin daha verimli ve kesintisiz çalışmasını sağlar.
Ağ Kuralları Uygulama: kube-proxy, iptables veya IPVS kullanarak ağ kurallarını uygular ve trafiği yönlendirir. Bu, ağ trafiğinin güvenli ve doğru bir şekilde yönlendirilmesini sağlar.
Container: runtime
Container runtime, konteynerlerin çalıştırılmasını ve yönetilmesini sağlayan bir yazılımdır.
Konteyner Çalıştırma: Container runtime, konteyner imajlarını çalıştırır ve yönetir.
Kaynak İzolasyonu: Konteynerlerin birbirinden izole edilmesini sağlar. Bu, her konteynerin kendi dosya sistemi, ağ ve işlem alanına sahip olmasını sağlar.
Konteyner Yönetimi: Konteynerlerin başlatılması, durdurulması ve yeniden başlatılması gibi işlemleri yönetir. Ayrıca, konteynerlerin durumunu izler ve gerektiğinde müdahale eder.
2.Kubernetes Ana Bilgisayarlarını Güvence Altına Alma
Kubernetes, bare metal, on premise ve public cloud gibi farklı ortamlarda dağıtılabilir. Bu esneklik, Kubernetes Clusterlar’ını güvence altına almayı zorlaştırabilir. Mühendisler, tüm potansiyel saldırı vektörlerini ve güvenlik açıklarını bilmelidir.
Kubernetes Clustarlar’ını Güçlendirme
-
İşletim sistemlerini güncelleyin ve güçlendirin.
-
Yama ve yapılandırma yönetim sistemlerini uygulayın.
-
Gerekli güvenlik duvarı kurallarını oluşturun.
Kubernetes’i Güncelleme
-
Her zaman Kubernetes’in en son kararlı sürümünü kullanın.
-
Çalışan konteynerlerde güvenlik açığı bulunursa, kaynak görüntüyü güncelleyin ve konteynerleri yeniden dağıtın.
-
Kademeli güncellemelerle konteynerleri kolayca yükseltebilirsiniz.
Sürüm Takvimi
Kubernetes, en son üç küçük sürüm için düzenli olarak yama sürümleri yayınlar. Her zaman en son kararlı sürüme yükseltmek önerilir.
3.Kubernetes Bileşenlerini Güvenceye Alma
Bu bölüm, Kubernetes bileşenlerini güvence altına almayı ele alır. Aşağıdaki konuları kapsar:
-
Kubernetes Dashboard’ını Güvence Altına Alma
-
etcd’ye Erişimi Kısıtlama
-
Hassas Portlara Ağ Erişimini Kontrol Etme
-
Kubernetes API’sine Erişimi Kontrol Etme
-
Kubernetes’te Rol Tabanlı Erişim Kontrolünü Uygulama
-
Kubelet’lere Erişimi Sınırlama
Kubernetes Dashboard’ını Güvence Altına Alma
Kubernetes dashboard, Cluster’ı yönetmek için kullanılan bir web uygulamasıdır ve kurulumu cluster sahipleri tarafından yapılır. Ancak, çoğu kurulum rehberi yüksek ayrıcalıklara sahip hizmet hesapları oluşturur, bu da güvenlik riskleri yaratır. Örneğin, Tesla bu şekilde hacklenmiştir (https://arstechnica.com/information-technology/2018/02/tesla-cloud-resources-are-hacked-to-run-cryptocurrency-mining-malware/).
Saldırıları önlemek için şu ipuçlarını takip edin:
-
Dashboard’u ek kimlik doğrulama internetten erişime açmayın.
-
Rol Tabanlı Erişim Kontrolünü etkinleştirin.
-
Dashboard’un hizmet hesabına yüksek ayrıcalıklar vermeyin.
-
Kullanıcı başına izinler verin.
-
Ağ politikaları kullanarak dahili pod’lardan gelen istekleri engelleyebilirsiniz.
-
Dashboard’u, çok faktörlü kimlik doğrulama ile birlikte kullanın.
etcd’ye Erişimi Kısıtlama
etcd, Kubernetes’in kritik bir bileşenidir ve durum bilgileri ve secret gibi bilgileri depolar. Bu nedenle, kümenizin geri kalanından farklı bir şekilde korunmalıdır. API sunucusunun etcd’sine yazma erişimi, tüm kümeye root erişimi kazanmakla eşdeğerdir ve okuma erişimi bile ayrıcalıkları kolayca yükseltmek için kullanılabilir.
Kubernetes scheduler, node sahip olmayan pod tanımlarını bulmak için etcd’yi arar. Bulduğu pod’ları planlama için uygun bir kubelet’e gönderir. Gönderilen pod’ların doğrulaması, API sunucusu tarafından etcd’ye yazılmadan önce yapılır, bu nedenle kötü niyetli kullanıcılar doğrudan etcd’ye yazarak birçok güvenlik mekanizmasını atlayabilirler — örneğin PodSecurityPolicies.
Yöneticiler, API sunucularından etcd sunucularına güçlü kimlik bilgileri kullanmalıdır, örneğin TLS istemci sertifikaları aracılığıyla karşılıklı kimlik doğrulama. Ayrıca, etcd sunucularını yalnızca API sunucularının erişebileceği bir güvenlik duvarının arkasında izole etmek genellikle önerilir.
Birincil etcd Örneğine Erişimi Sınırlama
Küme içindeki diğer bileşenlerin birincil etcd örneğine tam anahtar alanına okuma veya yazma erişimi ile erişmesine izin vermek, cluster-admin erişimi vermekle eşdeğerdir. Diğer bileşenler için ayrı etcd örnekleri kullanmak veya etcd ACL’lerini kullanarak okuma ve yazma erişimini anahtar alanının bir alt kümesine sınırlamak şiddetle tavsiye edilir.
Hassas Portlara Ağ Erişimini Kontrol Etme
Cluster ve cluster nodelarında kimlik doğrulama ve yetkilendirme yapılandırmanız şiddetle tavsiye edilir. Kubernetes kümeleri genellikle iyi tanımlanmış ve belirgin port aralıklarında dinlediğinden, saldırganların kümeleri tanımlaması ve saldırması daha kolaydır.
Aşağıda Kubernetes’te kullanılan varsayılan portların bir özeti verilmiştir. Ağınızın bu portlara erişimi engellediğinden emin olun ve Kubernetes API sunucusuna erişimi güvenilir ağlarla sınırlamayı ciddi olarak düşünmelisiniz.
Control Plane Node
Protocol | Port Range | Purpose |
---|---|---|
TCP | 6443- | Kubernetes API Server |
TCP | 2379-2380 | etcd server client API |
TCP | 10250 | Kubelet API |
TCP | 10251 | kube-scheduler |
TCP | 10252 | kube-controller-manager |
TCP | 10255 | Read-Only Kubelet API |
Worker Node
Protocol | Port Range | Purpose |
---|---|---|
TCP | 10250 | Kubelet API |
TCP | 10255 | Read-Only Kubelet API |
TCP | 30000-32767 | NodePort Services |
Kubernetes API’ye Erişimi Kontrol Etme
Kubernetes’in saldırganlara karşı ilk savunma hattı, API isteklerine erişimi sınırlamak ve güvence altına almaktır, çünkü bu istekler Kubernetes platformunu kontrol etmek için kullanılır.
Bu bölüm aşağıdaki konuları içermektedir:
-
Kubernetes’in API yetkilendirmesini nasıl ele aldığı
-
Kubernetes için Harici API Kimlik Doğrulaması (önerilir)
-
Kubernetes Dahili API Kimlik Doğrulaması (önerilmez)
-
Kubernetes’te rol tabanlı erişim uygulama
-
Kubelet’lere erişimi sınırlama
Kubernetes’in API Yetkilendirmesini Nasıl Ele Aldığı
Kubernetes’te, isteğiniz yetkilendirilebilmeden (erişim izni verilmeden) önce kimlik doğrulaması (giriş yapma) yapmanız gerekir ve Kubernetes, REST API isteklerine ortak olan öznitelikleri bekler. Bu, diğer API’leri ele alabilecek mevcut organizasyon çapında veya bulut sağlayıcı çapında erişim kontrol sistemlerinin Kubernetes yetkilendirmesi ile çalışabileceği anlamına gelir.
Kubernetes, API isteklerini API sunucusunu kullanarak yetkilendirdiğinde, izinler varsayılan olarak reddedilir. Tüm istek özniteliklerini tüm politikalarla karşılaştırır ve isteği kabul eder veya reddeder. Bir API isteğinin tüm parçalarının ilerleyebilmesi için bazı politikalar tarafından izin verilmesi gerekir.
Kubernetes için Harici API Kimlik Doğrulaması (ÖNERİLİR)
Kubernetes’in API’leri kimlik doğrulama mekanizmalarının zayıflığı nedeniyle, daha büyük veya üretim kümelerinin harici API kimlik doğrulama yöntemlerinden birini kullanmasını şiddetle önerilir.
-
OpenID Connect (OIDC), kimlik doğrulamayı dışsallaştırmanıza, kısa ömürlü belirteçler kullanmanıza ve yetkilendirme için merkezi gruplardan yararlanmanıza olanak tanır.
-
GKE, EKS ve AKS gibi yönetilen Kubernetes dağıtımları, kendi IAM sağlayıcılarından alınan kimlik bilgilerini kullanarak kimlik doğrulamasını destekler.
-
Kubernetes Taklit (Impersonation), hem yönetilen bulut kümeleri hem de yerinde (on-prem) kümelerle kullanılabilir ve API sunucusu yapılandırma parametrelerine erişim gerektirmeden kimlik doğrulamayı dışsallaştırmanıza olanak tanır.
-
Uygun kimlik doğrulama sistemini seçmenin yanı sıra, API erişimi ayrıcalıklı olarak kabul edilmeli ve tüm kullanıcı erişimi için Çok Faktörlü Kimlik Doğrulama (MFA) kullanılmalıdır.
Kubernetes Dahili API Kimlik Doğrulama Seçenekleri (ÖNERİLMEZ)
Kubernetes, API sunucusu kimlik doğrulaması için bir dizi dahili mekanizma sağlar, ancak bunlar genellikle yalnızca üretim dışı veya küçük kümeler için uygundur.
-
Statik Belirteç Dosyası: Kimlik doğrulama, API sunucusu düğüm(ler)inde bir CSV dosyasında saklanan düz metin belirteçlerini kullanır.
-
X509 İstemci Sertifikaları mevcuttur ancak üretim kullanımı için uygun değildir, çünkü Kubernetes sertifika iptalini desteklemez. Sonuç olarak, bu kullanıcı kimlik bilgileri kök sertifika otoritesi anahtarı döndürülmeden ve tüm küme sertifikaları yeniden düzenlenmeden değiştirilemez veya iptal edilemez.
-
Hizmet Hesapları Belirteçleri de kimlik doğrulama için kullanılabilir. Bunların birincil amacı, kümede çalışan iş yüklerinin API sunucusuna kimlik doğrulaması yapmasına izin vermektir, ancak kullanıcı kimlik doğrulaması için de kullanılabilirler.
Kubernetes’te Rol Tabanlı Erişim Kontrolü (RBAC) Uygulama
Rol tabanlı erişim kontrolü (RBAC), organizasyonunuzdaki bireysel kullanıcıların rollerine dayalı olarak bilgisayar veya ağ kaynaklarına erişimi düzenleme yöntemidir. Neyse ki, Kubernetes, istemcinin gerçekleştirmek isteyebileceği eylemlere bağlı olarak kullanıcı sorumluluklarını tanımlamanıza olanak tanıyan varsayılan rollerle entegre bir Rol Tabanlı Erişim Kontrolü (RBAC) bileşeni ile birlikte gelir. Node ve RBAC yetkilendiricilerini NodeRestriction kabul eklentisi ile birlikte kullanmalısınız.
RBAC bileşeni, gelen bir kullanıcı veya grubu, rollere bağlı izinler kümesiyle eşleştirir. Bu izinler, fiilleri (getir, oluştur, sil) kaynaklarla (podlar, hizmetler, düğümler) birleştirir ve ad alanı veya küme kapsamlı olabilir. RBAC yetkilendirmesi, yetkilendirme kararlarını yönlendirmek için rbac.authorization.k8s.io API grubunu kullanır ve Kubernetes API aracılığıyla politikaları dinamik olarak yapılandırmanıza olanak tanır.
RBAC’yi etkinleştirmek için, API sunucusunu — authorization-mode bayrağı RBAC’yi içeren virgülle ayrılmış bir liste olarak ayarlanmış şekilde başlatın; örneğin:
kube-apiserver --authorization-mode=Example,RBAC --other-options --more-options
Kubelet’lere erişimi sınırlama
Kubelet’ler, düğüm ve konteynerler üzerinde güçlü kontrol sağlayan HTTPS uç noktalarını açığa çıkarır. Varsayılan olarak, Kubelet’ler bu API’ye kimlik doğrulaması yapılmadan erişime izin verir. Üretim kümeleri, Kubelet kimlik doğrulaması ve yetkilendirmesini etkinleştirmelidir.