Kubernetes Basics
Last updated
Last updated
AWS Hacking öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)
Bu sayfanın orijinal yazarı Jorge (orijinal yazısını buradan) okuyun.
Bir veya daha fazla konteynerin bir konteyner motorunda çalışmasına izin verir.
Konteynerlerin görevlerini verimli bir şekilde planlar.
Konteynerleri hayatta tutar.
Konteyner iletişimlerine izin verir.
Dağıtım tekniklerine izin verir.
Bilgi hacimlerini yönetir.
Düğüm: pod veya pod'larla birlikte bir işletim sistemi.
Pod: Bir konteyner veya birden fazla konteynerin etrafında bir sargıdır. Bir pod yalnızca bir uygulama içermelidir (bu nedenle genellikle bir pod yalnızca 1 konteyner çalıştırır). Pod, Kubernetes'in çalışan konteyner teknolojisini soyutlama yoludur.
Hizmet: Her pod'un düğümün iç aralığından 1 iç IP adresi vardır. Ancak, bir hizmet aracılığıyla da açığa çıkarılabilir. Hizmetin de bir IP adresi vardır ve amacı, podlar arasındaki iletişimi sürdürmektir, böylece biri öldüğünde yeni yedek (farklı bir iç IP ile) aynı hizmet IP'sinde erişilebilir olacaktır. İç veya dış olarak yapılandırılabilir. Hizmet, aynı hizmete bağlı 2 pod olduğunda yük dengeleyici olarak da işlev görür.
Bir hizmet oluşturulduğunda, her hizmetin uç noktalarını bulmak için kubectl get endpoints
komutunu çalıştırabilirsiniz.
Kubelet: Ana düğüm ajanı. Düğüm ile kubectl arasındaki iletişimi kuran bileşen ve yalnızca pod'ları çalıştırabilir (API sunucusu aracılığıyla). Kubelet, Kubernetes tarafından oluşturulmamış konteynerleri yönetmez.
Kube-proxy: apiserver ile düğüm arasındaki iletişimlerden (hizmetlerden) sorumlu olan hizmettir. Temel, düğümler için bir IPtables'tır. En deneyimli kullanıcılar, diğer satıcılardan başka kube-proxy'ler kurabilir.
Yan konteyner: Yan konteynerler, pod'daki ana konteynerle birlikte çalışması gereken konteynerlerdir. Bu yan konteyner modeli, mevcut konteynerlerin işlevselliğini değiştirmeden genişletir ve geliştirir. Günümüzde, konteyner teknolojisini uygulamanın çalışması için tüm bağımlılıkları sarmak için kullandığımızı biliyoruz. Bir konteyner yalnızca bir şey yapar ve o şeyi çok iyi yapar.
Ana süreç:
Api Sunucusu: Kullanıcıların ve pod'ların ana süreçle iletişim kurma yoludur. Sadece kimlik doğrulaması yapılmış istekler kabul edilmelidir.
Planlayıcı: Planlama, Pod'ların Düğümlere eşleştirilmesini sağlamayı ifade eder, böylece Kubelet bunları çalıştırabilir. Hangi düğümün daha fazla kullanılabilir kaynağa sahip olduğunu belirlemek için yeterli zekaya sahiptir ve yeni pod'u ona atar. Planlayıcının yeni pod'ları başlatmadığını, yalnızca düğüm içinde çalışan Kubelet süreciyle iletişim kurduğunu unutmayın; bu süreç yeni pod'u başlatacaktır.
Kube Controller yöneticisi: Replica setleri veya dağıtımları gibi kaynakları kontrol eder, örneğin, doğru sayıda pod veya düğümün çalışıp çalışmadığını kontrol eder. Bir pod eksikse, yeni bir tane başlatmak için planlayıcı ile iletişim kuracaktır. API'ye replikasyon, token'lar ve hesap hizmetlerini kontrol eder.
etcd: Veri depolama, kalıcı, tutarlı ve dağıtılmıştır. Kubernetes'in veritabanıdır ve kümelerin tam durumunu sakladığı anahtar-değer depolamasıdır (her değişiklik burada kaydedilir). Planlayıcı veya Kontrol yöneticisi gibi bileşenler, hangi değişikliklerin meydana geldiğini bilmek için bu veriye bağımlıdır (düğümlerin mevcut kaynakları, çalışan pod sayısı...).
Bulut kontrol yöneticisi: AWS veya OpenStack'ta kümeleriniz varsa, akış kontrolleri ve uygulamalar için özel bir kontrolördür.
Birden fazla düğüm (birden fazla pod çalıştıran) olabileceğinden, Api sunucusuna erişimleri yük dengelemesi yapılmış ve etcd'leri senkronize edilmiş birden fazla ana süreç de olabilir.
Hacimler:
Bir pod, kaybolmaması gereken veriler oluşturduğunda, bu verilerin fiziksel bir hacimde saklanması gerekir. Kubernetes, verileri kalıcı hale getirmek için bir pod'a bir hacim eklemeye izin verir. Hacim, yerel makinede veya uzaktan depolama alanında olabilir. Farklı fiziksel düğümlerde pod'lar çalıştırıyorsanız, tüm pod'ların erişebilmesi için uzaktan depolama kullanmalısınız.
Diğer yapılandırmalar:
ConfigMap: Hizmetlere erişim için URL'leri yapılandırabilirsiniz. Pod, diğer hizmetlerle (pod'larla) nasıl iletişim kuracağını bilmek için buradan veri alacaktır. Bu, kimlik bilgilerini saklamak için önerilen yer değildir!
Gizli: Bu, şifreler, API anahtarları gibi gizli verileri saklamak için yerdir... B64 ile kodlanmış. Pod, gerekli kimlik bilgilerini kullanmak için bu verilere erişebilecektir.
Dağıtımlar: Kubernetes tarafından çalıştırılacak bileşenlerin belirtildiği yerdir. Bir kullanıcı genellikle doğrudan pod'larla çalışmaz, pod'lar ReplicaSets (aynı pod'ların sayısı) içinde soyutlanır ve dağıtımlar aracılığıyla çalıştırılır. Dağıtımlar, durumsuz uygulamalar içindir. Bir dağıtım için minimum yapılandırma, çalıştırılacak ad ve görüntüdür.
StatefulSet: Bu bileşen, veritabanları gibi aynı depolama alanına erişmesi gereken uygulamalar için özel olarak tasarlanmıştır.
Ingress: Bu, uygulamayı bir URL ile kamuya açmak için kullanılan yapılandırmadır. Bunun, harici hizmetler kullanılarak da yapılabileceğini unutmayın, ancak bu, uygulamayı açmanın doğru yoludur.
Bir Ingress uyguladığınızda, Ingress Kontrolörleri oluşturmanız gerekecektir. Ingress Kontrolörü, istekleri alacak ve kontrol edecek ve bunları hizmetlere yük dengeleyecek bir pod'dur. Ingress kontrolörü, yapılandırılan ingress kurallarına göre isteği yönlendirecektir. Ingress kurallarının farklı yolları veya hatta farklı iç Kubernetes hizmetlerine alt alanları işaret edebileceğini unutmayın.
Daha iyi bir güvenlik uygulaması, Kubernetes kümesinin herhangi bir kısmını açığa çıkarmamak için bir bulut yük dengeleyici veya bir proxy sunucu kullanmak olacaktır.
Hiçbir ingress kuralına uymayan bir istek alındığında, ingress kontrolörü bunu "Varsayılan arka uç"a yönlendirecektir. Bu parametrenin adresini almak için ingress kontrolörünü describe
edebilirsiniz.
minikube addons enable ingress
CA, küme içindeki tüm sertifikalar için güvenilir kök noktasıdır.
Bileşenlerin birbirini doğrulamasına izin verir.
Tüm küme sertifikaları CA tarafından imzalanmıştır.
ETCd'nin kendi sertifikası vardır.
türler:
apiserver sertifikası.
kubelet sertifikası.
planlayıcı sertifikası.
Minikube, tam bir Kubernetes ortamı dağıtmadan Kubernetes üzerinde bazı hızlı testler gerçekleştirmek için kullanılabilir. Ana ve düğüm süreçlerini tek bir makinede çalıştıracaktır. Minikube, düğümü çalıştırmak için virtualbox kullanacaktır. Buradan nasıl kurulacağını görebilirsiniz.
Kubectl
, kubernetes kümeleri için komut satırı aracıdır. Kubernetes'te eylemler gerçekleştirmek veya veri istemek için ana sürecin Api sunucusuyla iletişim kurar.
Dashboard, minikube'un ne çalıştırdığını daha kolay görmenizi sağlar, buna erişmek için URL'yi şurada bulabilirsiniz:
Her yapılandırma dosyasının 3 kısmı vardır: metadata, specification (başlatılması gereken), status (istenen durum). Dağıtım yapılandırma dosyasının spesifikasyonunun içinde, çalıştırılacak görüntüyü tanımlayan yeni bir yapılandırma yapısıyla tanımlanan şablonu bulabilirsiniz:
Aynı yapılandırma dosyasında bildirilen Dağıtım + Servis örneği (şuradan buraya)
Bir servis genellikle bir dağıtımla ilişkili olduğundan, her ikisini de aynı yapılandırma dosyasında bildirmek mümkündür (bu yapılandırmada bildirilen servis yalnızca dahili olarak erişilebilir):
Dış hizmet yapılandırması örneği
Bu hizmet dışarıdan erişilebilir olacak ( nodePort
ve type: LoadBlancer
niteliklerini kontrol edin):
Bu test için faydalıdır ama üretim için yalnızca iç hizmetler ve uygulamayı açığa çıkarmak için bir Ingress'e sahip olmalısınız.
Ingress yapılandırma dosyası örneği
Bu, uygulamayı http://dashboard.com
adresinde açığa çıkaracaktır.
Gizli yapılandırma dosyası örneği
Parolaların B64 ile kodlandığına dikkat edin (bu güvenli değil!)
ConfigMap Örneği
Bir ConfigMap, pod'lara diğer hizmetleri nasıl bulacakları ve erişecekleri konusunda bilgi veren yapılandırmadır. Bu durumda, her pod mongodb-service
adının iletişim kurabilecekleri bir pod'un adresi olduğunu bilecektir (bu pod bir mongodb çalıştıracaktır):
Sonra, bir deployment config içinde bu adres aşağıdaki şekilde belirtilerek pod'un env'ine yüklenecek şekilde ayarlanabilir:
Örnek hacim yapılandırması
Farklı depolama yapılandırma yaml dosyalarının örneklerini https://gitlab.com/nanuchi/youtube-tutorial-series/-/tree/master/kubernetes-volumes adresinde bulabilirsiniz. Hacimlerin ad alanlarının içinde olmadığını unutmayın
Kubernetes, aynı fiziksel küme tarafından desteklenen birden fazla sanal kümeyi destekler. Bu sanal kümelere ad alanları denir. Bu, birçok kullanıcının birden fazla ekip veya proje arasında dağıldığı ortamlarda kullanılmak üzere tasarlanmıştır. Birkaç ila on kullanıcıya sahip kümeler için, ad alanları oluşturmanız veya düşünmeniz gerekmez. Sadece Kubernetes'te dağıtılan uygulamanın her bir parçasının daha iyi kontrolü ve organizasyonu için ad alanlarını kullanmaya başlamalısınız.
Ad alanları, adlar için bir kapsam sağlar. Kaynakların adları bir ad alanı içinde benzersiz olmalıdır, ancak ad alanları arasında değil. Ad alanları birbirinin içine yerleştirilemez ve her Kubernetes kaynağı yalnızca bir ad alanında bulunabilir.
Varsayılan olarak, minikube kullanıyorsanız 4 ad alanı vardır:
kube-system: Kullanıcılar için tasarlanmamıştır ve buna dokunmamalısınız. Master ve kubectl süreçleri içindir.
kube-public: Kamuya açık verilerdir. Küme bilgilerini içeren bir configmap içerir.
kube-node-lease: Bir düğümün kullanılabilirliğini belirler.
default: Kullanıcının kaynak oluşturmak için kullanacağı ad alanıdır.
Çoğu Kubernetes kaynağının (örneğin, podlar, hizmetler, çoğaltma denetleyicileri ve diğerleri) bazı ad alanlarında olduğunu unutmayın. Ancak, ad alanı kaynakları ve düzensiz kaynaklar, örneğin düğümler ve kalıcı hacimler gibi diğer kaynaklar bir ad alanında değildir. Hangi Kubernetes kaynaklarının bir ad alanında olduğunu ve hangilerinin olmadığını görmek için:
O bağlamda tüm sonraki kubectl komutları için namespace'i kaydedebilirsiniz.
Helm, Kubernetes için paket yöneticisidir. YAML dosyalarını paketlemeye ve bunları kamu ve özel depolarda dağıtmaya olanak tanır. Bu paketlere Helm Charts denir.
Helm, değişkenlerle yapılandırma dosyaları oluşturmayı sağlayan bir şablon motorudur:
Bir Secret, şifre, token veya anahtar gibi hassas verileri içeren bir nesnedir. Bu tür bilgiler, başka bir yerde Pod spesifikasyonunda veya bir görüntüde yer alabilir. Kullanıcılar Secrets oluşturabilir ve sistem de Secrets oluşturur. Bir Secret nesnesinin adı geçerli bir DNS alt alan adı olmalıdır. Buradan resmi belgeleri okuyabilirsiniz.
Secrets şunlar gibi şeyler olabilir:
API, SSH Anahtarları.
OAuth tokenları.
Kimlik bilgileri, Şifreler (düz metin veya b64 + şifreleme).
Bilgiler veya yorumlar.
Veritabanı bağlantı kodu, dizgiler… .
Kubernetes'te farklı türde gizli bilgiler vardır
Opaque
kullanıcı tanımlı rastgele veri (Varsayılan)
kubernetes.io/service-account-token
hizmet hesabı tokenı
kubernetes.io/dockercfg
serileştirilmiş ~/.dockercfg dosyası
kubernetes.io/dockerconfigjson
serileştirilmiş ~/.docker/config.json dosyası
kubernetes.io/basic-auth
temel kimlik doğrulama için kimlik bilgileri
kubernetes.io/ssh-auth
SSH kimlik doğrulama için kimlik bilgileri
kubernetes.io/tls
TLS istemcisi veya sunucusu için veri
bootstrap.kubernetes.io/token
başlangıç tokenı verisi
Opaque türü varsayılan olanıdır, kullanıcılar tarafından tanımlanan tipik anahtar-değer çiftidir.
Gizli bilgilerin çalışma şekli:
Aşağıdaki yapılandırma dosyası, mysecret
adında bir gizli bilgi tanımlar ve username: YWRtaW4=
ve password: MWYyZDFlMmU2N2Rm
olmak üzere 2 anahtar-değer çifti içerir. Ayrıca, mysecret
içinde tanımlanan username
ve password
'u çevre değişkenleri SECRET_USERNAME
__ ve __ SECRET_PASSWOR
olarak açığa çıkaracak secretpod
adında bir pod tanımlar. Ayrıca, mysecret
içindeki username
gizli bilgisini /etc/foo/my-group/my-username
yoluna 0640
izinleriyle monte edecektir.
etcd, tüm küme verileri için Kubernetes arka plan deposu olarak kullanılan tutarlı ve yüksek erişilebilir bir anahtar-değer deposudur. etcd'de saklanan gizliliklere erişelim:
Sertifikaların, anahtarların ve URL'lerin dosya sisteminde nerede bulunduğunu göreceksiniz. Bunu elde ettiğinizde, etcd'ye bağlanabileceksiniz.
Bir kez iletişimi sağladığınızda, sırları elde edebileceksiniz:
ETCD'ye şifreleme ekleme
Varsayılan olarak, tüm gizli bilgiler düz metin olarak etcd içinde saklanır, şifreleme katmanı uygulamadığınız sürece. Aşağıdaki örnek https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/ adresine dayanmaktadır.
Bundan sonra, oluşturulan yapılandırma dosyasının konumunu göstermek için kube-apiserver
üzerinde --encryption-provider-config
bayrağını ayarlamanız gerekir. /etc/kubernetes/manifest/kube-apiserver.yaml
dosyasını değiştirebilir ve aşağıdaki satırları ekleyebilirsiniz:
Aşağı kaydırın volumeMounts:
Aşağı kaydırın ve volumeMounts'ta hostPath:
Verilerin şifrelenip şifrelenmediğini doğrulama
Veriler, etcd'ye yazıldığında şifrelenir. kube-apiserver
'ınızı yeniden başlattıktan sonra, yeni oluşturulan veya güncellenen herhangi bir gizli bilgi depolandığında şifrelenmelidir. Kontrol etmek için, gizli bilginizin içeriğini almak için etcdctl
komut satırı programını kullanabilirsiniz.
default
ad alanında secret1
adında yeni bir gizli bilgi oluşturun:
etcdctl komut satırını kullanarak, o gizli bilgiyi etcd'den okuyun:
ETCDCTL_API=3 etcdctl get /registry/secrets/default/secret1 [...] | hexdump -C
burada [...]
etcd sunucusuna bağlanmak için ek argümanlar olmalıdır. 3. Depolanan gizli bilginin k8s:enc:aescbc:v1:
ile başladığını doğrulayın; bu, aescbc
sağlayıcısının sonuçlanan veriyi şifrelediğini gösterir. 4. API aracılığıyla alındığında gizli bilginin doğru bir şekilde şifresinin çözüldüğünü doğrulayın:
mykey: bXlkYXRh
ile eşleşmelidir, mydata kodlanmıştır, gizli bilgiyi tamamen çözmek için gizli bir bilgiyi çözme kısmını kontrol edin.
Gizli bilgiler yazıldığında şifrelendiğinden, bir gizli bilgi üzerinde güncelleme yapmak o içeriği şifreleyecektir:
Son ipuçları:
FS'de sır tutmamaya çalışın, onları başka yerlerden alın.
Sırlarınıza daha fazla koruma eklemek için https://www.vaultproject.io/ adresine göz atın.
AWS Hacking öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)