Er ya da geç, herhangi bir sistemin işleyişinde güvenlik sorunu ortaya çıkar: kimlik doğrulamanın sağlanması, hakların ayrılması, denetim ve diğer görevler. Zaten Kubernetes için oluşturuldu birçok çözüm, çok zorlu ortamlarda bile standartlara uyum sağlamanıza olanak tanır... Aynı materyal, K8'lerin yerleşik mekanizmaları içinde uygulanan güvenliğin temel yönlerine de ayrılmıştır. Her şeyden önce, güvenlikle ilgili konuları incelemek için bir başlangıç noktası olarak Kubernetes'i tanımaya başlayanlar için faydalı olacaktır.
kimlik doğrulama
Kubernetes'te iki tür kullanıcı vardır:
Keşfedin ve Koruyun — Kubernetes API tarafından yönetilen hesaplar;
Kullanıcılar — Harici, bağımsız hizmetler tarafından yönetilen “normal” kullanıcılar.
Bu türler arasındaki temel fark, Kubernetes API'sinde Hizmet Hesapları için özel nesnelerin bulunmasıdır (bunlara şöyle denir - ServiceAccounts), bir ad alanına ve Gizli türdeki nesnelerde kümede depolanan bir dizi yetkilendirme verisine bağlıdır. Bu tür kullanıcıların (Hizmet Hesapları) öncelikli olarak Kubernetes kümesinde çalışan işlemlerin Kubernetes API'sine erişim haklarını yönetmesi amaçlanır.
Sıradan Kullanıcıların Kubernetes API'sinde girişleri yoktur; bunların harici mekanizmalar tarafından yönetilmesi gerekir. Kümenin dışında yaşayan insanlara veya süreçlere yöneliktirler.
Her API isteği bir Hizmet Hesabıyla veya bir Kullanıcıyla ilişkilendirilir veya anonim olarak kabul edilir.
Kullanıcı Adı — kullanıcı adı (büyük/küçük harfe duyarlı!);
UID - "kullanıcı adından daha tutarlı ve benzersiz" olan, makine tarafından okunabilen bir kullanıcı tanımlama dizisi;
Gruplar — kullanıcının ait olduğu grupların listesi;
ekstra — yetkilendirme mekanizması tarafından kullanılabilecek ek alanlar.
Kubernetes çok sayıda kimlik doğrulama mekanizması kullanabilir: X509 sertifikaları, Taşıyıcı belirteçleri, kimlik doğrulama proxy'si, HTTP Temel Kimlik Doğrulaması. Bu mekanizmaları kullanarak çok sayıda yetkilendirme şeması uygulayabilirsiniz: şifreli statik bir dosyadan OpenID OAuth2'ye kadar.
Ayrıca birden fazla yetkilendirme şemasının aynı anda kullanılması mümkündür. Varsayılan olarak küme şunları kullanır:
hizmet hesabı belirteçleri - Hizmet Hesapları için;
X509 - Kullanıcılar için.
ServiceAccount'ları yönetmeyle ilgili soru bu makalenin kapsamı dışındadır, ancak bu konuyu daha ayrıntılı olarak öğrenmek isteyenler için şu adresle başlamanızı öneririm: resmi dokümantasyon sayfaları. X509 sertifikalarının nasıl çalıştığı konusuna daha yakından bakacağız.
Kullanıcılara yönelik sertifikalar (X.509)
Sertifikalarla çalışmanın klasik yolu şunları içerir:
Kubernetes kümesi CA anahtarlarını kullanarak bir sertifika isteğinin işlenmesi, bir kullanıcı sertifikası alınması (sertifika almak için, varsayılan olarak Kubernetes kümesi CA anahtarına erişimi olan bir hesap kullanmanız gerekir. /etc/kubernetes/pki/ca.key):
Hesaplar ve sunucular arasında yapılandırma aktarımını kolaylaştırmak için aşağıdaki anahtarların değerlerini düzenlemek yararlı olacaktır:
certificate-authority
client-certificate
client-key
Bunu yapmak için, içinde belirtilen dosyaları base64 kullanarak kodlayabilir ve anahtarların adına sonek ekleyerek bunları config'e kaydedebilirsiniz. -datayani almış olmak certificate-authority-data vb
kubeadm içeren sertifikalar
Serbest bırakılmasıyla Kubernet'ler 1.15 desteğinin alfa sürümü sayesinde sertifikalarla çalışmak çok daha kolay hale geldi kubeadm yardımcı programı. Örneğin, kullanıcı anahtarlarıyla bir yapılandırma dosyası oluşturmak artık şu şekilde görünebilir:
kubeadm alpha kubeconfig user --client-name=mynewuser --apiserver-advertise-address 192.168.100.200
NB: Gerekli reklam adresi varsayılan olarak şurada bulunan api-server yapılandırmasında bulunabilir: /etc/kubernetes/manifests/kube-apiserver.yaml.
Ortaya çıkan yapılandırma stdout'a aktarılacaktır. İçinde kaydedilmesi gerekiyor ~/.kube/config kullanıcı hesabına veya ortam değişkeninde belirtilen bir dosyaya KUBECONFIG.
Daha derin kaz
Anlatılan konuları daha detaylı anlamak isteyenler için:
ayrı makale resmi Kubernetes belgelerindeki sertifikalarla çalışma;
Varsayılan yetkili hesabın kümede çalışma hakları yoktur. İzin vermek için Kubernetes bir yetkilendirme mekanizması uygular.
Sürüm 1.6'dan önce Kubernetes, adı verilen bir yetkilendirme türü kullanıyordu. ABAK (Öznitelik tabanlı erişim kontrolü). Bununla ilgili ayrıntılar şurada bulunabilir: resmi belgeler. Bu yaklaşımın şu anda eski olduğu kabul ediliyor ancak yine de diğer kimlik doğrulama türleriyle birlikte kullanabilirsiniz.
Erişim haklarını bir kümeye bölmenin mevcut (ve daha esnek) yöntemine denir RBAC (Rol tabanlı erişim kontrolü). Sürümden bu yana kararlı olduğu bildirildi Kubernet'ler 1.8. RBAC, açıkça izin verilmeyen her şeyin yasaklandığı bir haklar modeli uygulamaktadır. RBAC'yi etkinleştirmek içinKubernetes api-server parametresini kullanarak başlatmanız gerekir. --authorization-mode=RBAC. Parametreler manifest dosyasında, varsayılan olarak yol boyunca yer alan api sunucusu yapılandırmasıyla ayarlanır. /etc/kubernetes/manifests/kube-apiserver.yaml, kısımda command. Ancak, RBAC varsayılan olarak zaten etkindir, bu nedenle büyük olasılıkla bu konuda endişelenmenize gerek yoktur: bunu değere göre doğrulayabilirsiniz. authorization-mode (daha önce bahsedilen kube-apiserver.yaml). Bu arada, anlamları arasında başka yetkilendirme türleri de olabilir (node, webhook, always allow), ancak bunların değerlendirilmesini materyalin kapsamı dışında bırakacağız.
Bu arada, zaten yayınladık Makale RBAC ile çalışmanın ilkeleri ve özelliklerinin oldukça ayrıntılı bir açıklamasıyla, bu nedenle kendimi temellerin ve örneklerin kısa bir listesiyle sınırlayacağım.
Aşağıdaki API varlıkları, Kubernetes'te RBAC aracılığıyla erişimi kontrol etmek için kullanılır:
Role и ClusterRole — erişim haklarını açıklamaya yarayan roller:
Role bir ad alanı içindeki hakları tanımlamanıza olanak tanır;
ClusterRole - düğümler, kaynak olmayan URL'ler (yani Kubernetes kaynaklarıyla ilgili olmayan - örneğin,) gibi kümeye özgü nesneler dahil olmak üzere küme içinde /version, /logs, /api*);
RoleBinding и ClusterRoleBinding - ciltlemek için kullanılır Role и ClusterRole bir kullanıcıya, kullanıcı grubuna veya ServiceAccount'a.
Rol ve RoleBinding varlıkları ad alanıyla sınırlıdır; aynı ad alanında olmalıdır. Ancak bir RoleBinding, bir dizi genel izin oluşturmanıza ve bunları kullanarak erişimi denetlemenize olanak tanıyan bir ClusterRole'a başvuruda bulunabilir.
Roller, aşağıdakileri içeren kural dizilerini kullanarak hakları tanımlar:
API grupları - bkz. resmi belgeler apiGroups ve çıktıya göre kubectl api-resources;
kaynaklar (kaynaklar: pod, namespace, deployment ve benzeri.);
Fiiller (fiiller: set, update vb.)
kaynak isimleri (resourceNames) - bu türdeki tüm kaynaklara değil, belirli bir kaynağa erişim sağlamanız gerektiğinde.
Kubernetes'te yetkilendirmenin daha ayrıntılı bir analizini sayfada bulabilirsiniz resmi belgeler. Bunun yerine (veya daha doğrusu buna ek olarak) onun çalışmalarını gösteren örnekler vereceğim.
RBAC varlıklarına örnekler
basit Role, bölmelerin listesini ve durumunu almanızı ve bunları ad alanında izlemenizi sağlar target-namespace:
Örnek ClusterRole, bölmelerin listesini ve durumunu almanıza ve bunları küme genelinde izlemenize olanak tanır:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
# секции "namespace" нет, так как ClusterRole задействует весь кластер
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list"]
Örnek RoleBindingkullanıcıya izin veren mynewuser Ad alanındaki bölmeleri "oku" my-namespace:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: target-namespace
subjects:
- kind: User
name: mynewuser # имя пользователя зависимо от регистра!
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role # здесь должно быть “Role” или “ClusterRole”
name: pod-reader # имя Role, что находится в том же namespace,
# или имя ClusterRole, использование которой
# хотим разрешить пользователю
apiGroup: rbac.authorization.k8s.io
Etkinlik denetimi
Kubernetes mimarisi şematik olarak şu şekilde temsil edilebilir:
İsteklerin işlenmesinden sorumlu temel Kubernetes bileşeni API sunucusu. Kümedeki tüm işlemler bunun üzerinden geçer. Bu iç mekanizmalar hakkında daha fazla bilgiyi “makalede okuyabilirsiniz”Kubectl run'u çalıştırdığınızda Kubernetes'te ne olur?'.
Sistem denetimi, Kubernetes'te varsayılan olarak devre dışı bırakılan ilginç bir özelliktir. Kubernetes API'sine yapılan tüm çağrıları kaydetmenize olanak tanır. Tahmin edebileceğiniz gibi Cluster'ın izlenmesi ve durumunun değiştirilmesi ile ilgili tüm işlemler bu API üzerinden gerçekleştirilmektedir. Yeteneklerinin iyi bir açıklaması (her zamanki gibi) şurada bulunabilir: resmi belgeler K8'ler. Daha sonra konuyu daha basit bir dille sunmaya çalışacağım.
Bu durumda, denetimi etkinleştirmek içinapi-server'daki konteynere aşağıda daha ayrıntılı olarak açıklanan üç gerekli parametreyi aktarmamız gerekiyor:
Bu üç gerekli parametreye ek olarak, denetimle ilgili birçok ek ayar vardır: günlük döndürmeden web kancası açıklamalarına kadar. Günlük döndürme parametrelerine örnek:
--audit-log-maxbackup=10
--audit-log-maxsize=100
--audit-log-maxage=7
Ancak bunların üzerinde daha ayrıntılı durmayacağız - tüm ayrıntıları şurada bulabilirsiniz: kube-apserver belgeleri.
Daha önce de belirtildiği gibi, tüm parametreler manifest dosyasında api sunucusu yapılandırmasıyla ayarlanır (varsayılan olarak /etc/kubernetes/manifests/kube-apiserver.yaml), bölümde command. Gerekli 3 parametreye dönelim ve bunları analiz edelim:
audit-policy-file — denetim politikasını açıklayan YAML dosyasının yolu. İçeriğine daha sonra döneceğiz ancak şimdilik dosyanın api-server işlemi tarafından okunabilir olması gerektiğini belirteceğim. Bu nedenle, aşağıdaki kodu yapılandırmanın uygun bölümlerine ekleyebileceğiniz kabın içine monte etmek gerekir:
audit-log-path — günlük dosyasının yolu. Yolun api-sunucusu süreci tarafından da erişilebilir olması gerekir, dolayısıyla montajını da aynı şekilde açıklıyoruz:
audit-log-format — denetim günlüğü formatı. Varsayılan: json, ancak eski metin biçimi de mevcuttur (legacy).
Denetim Politikası
Şimdi günlüğe kaydetme politikasını açıklayan söz konusu dosya hakkında. Denetim politikasının ilk kavramı level, kayıt düzeyi. Bunlar aşağıdaki gibidir:
None - oturum açmayın;
Metadata — günlük isteği meta verileri: kullanıcı, istek zamanı, hedef kaynak (bölme, ad alanı vb.), eylem türü (fiil), vb.;
Request — meta verileri ve istek gövdesini günlüğe kaydedin;
RequestResponse — günlük meta verileri, istek gövdesi ve yanıt gövdesi.
Son iki seviye (Request и RequestResponse) kaynaklara erişmeyen istekleri günlüğe kaydetmeyin (kaynak olmayan URL'lere erişim).
Ayrıca tüm istekler yerine getirilir pek çok aşama:
RequestReceived - Talebin işlemci tarafından alındığı ve işlemci zinciri boyunca henüz iletilmediği aşama;
ResponseStarted — yanıt başlıkları gönderilir, ancak yanıt gövdesi gönderilmeden önce. Uzun süren sorgular için oluşturulur (örneğin, watch);
ResponseComplete — yanıt birimi gönderildi, başka bilgi gönderilmeyecek;
Panic — Anormal bir durum tespit edildiğinde olaylar üretilir.
Kullanabileceğiniz herhangi bir adımı atlamak için omitStages.
Bir politika dosyasında, farklı günlük kaydı düzeylerine sahip çeşitli bölümleri tanımlayabiliriz. Politika açıklamasında bulunan ilk eşleştirme kuralı uygulanacaktır.
Kubelet arka plan programı, api-server yapılandırmasıyla manifestteki değişiklikleri izler ve herhangi bir değişiklik tespit edilirse api-server ile konteyneri yeniden başlatır. Ancak önemli bir detay var: Politika dosyasındaki değişiklikler onun tarafından göz ardı edilecek. Politika dosyasında değişiklik yaptıktan sonra api sunucusunu manuel olarak yeniden başlatmanız gerekecektir. API-sunucusu olarak başlatıldığından beri statik bölme, takım kubectl delete yeniden başlatılmasına neden olmaz. Bunu manuel olarak yapmanız gerekecek docker stop denetim politikasının değiştirildiği kube-masters'da:
Denetimi etkinleştirirken şunu unutmamak önemlidir: kube-apiserver üzerindeki yük artıyor. Özellikle istek içeriğini depolamak için bellek tüketimi artar. Günlüğe kaydetme yalnızca yanıt başlığı gönderildikten sonra başlar. Yük aynı zamanda denetim ilkesi yapılandırmasına da bağlıdır.
Politika örnekleri
Örnekleri kullanarak politika dosyalarının yapısına bakalım.
İşte basit bir dosya policyseviyedeki her şeyi günlüğe kaydetmek için Metadata:
Politikada bir kullanıcı listesi belirleyebilirsiniz (Users и ServiceAccounts) ve kullanıcı grupları. Örneğin, sistem kullanıcılarını bu şekilde görmezden geleceğiz, ancak diğer her şeyi aynı seviyede günlüğe kaydedeceğiz. Request:
Denetim olaylarına hızlı bir şekilde yanıt vermek mümkündür. webhook'u tanımla. Bu konu kapsamındadır resmi belgeler, onu bu makalenin kapsamı dışında bırakacağım.
sonuçlar
Makale, kişiselleştirilmiş kullanıcı hesapları oluşturmanıza, haklarını ayırmanıza ve eylemlerini kaydetmenize olanak tanıyan Kubernetes kümelerindeki temel güvenlik mekanizmalarına genel bir bakış sunmaktadır. Teoride veya pratikte bu tür sorunlarla karşılaşanlara faydalı olmasını dilerim. Ayrıca Kubernetes'te güvenlik konusuyla ilgili "PS" de verilen diğer materyallerin listesini de okumanızı tavsiye ederim - belki bunların arasında sizi ilgilendiren sorunlarla ilgili gerekli ayrıntıları bulacaksınız.