Ana içeriğe atla

Admission Webhook for K8s

1. Casbin K8s-Gatekeeper için Genel Bakış & Belgeler

Casbin K8s-GateKeeper, Casbin'i Erişim Kontrol Aracı Olarak Entegre Eden Bir Kubernetes Kabul Webhook'udur. Casbin K8s-GateKeeper'ı kullanarak, K8s kaynakları üzerindeki herhangi bir işlemi yetkilendirmek veya engellemek için esnek kurallar oluşturabilirsiniz, HERHANGİ BİR KOD YAZMADAN, sadece Casbin modellerinin ve politikalarının birkaç satırlık bildirimsel yapılandırmaları ile, bu da Casbin ACL (Erişim Kontrol Listesi) dilinin bir parçasıdır.

Casbin K8s-GateKeeper, Casbin topluluğu tarafından geliştirilmekte ve sürdürülmektedir. Bu projenin deposu şu adreste mevcuttur: https://github.com/casbin/k8s-gatekeeper

0.1 Basit Bir Örnek

Örneğin, herhangi bir kod yazmanıza gerek yok, ancak bu işlevi gerçekleştirmek için aşağıdaki yapılandırma satırlarını kullanın: "Bazı belirli etiketlere sahip görüntülerin herhangi bir dağıtımda kullanılmasını yasaklamak":

Model:

[request_definition]
r = obj

[policy_definition]
p = obj,eft

[policy_effect]
e = !some(where (p.eft == deny))

[matchers]
m = r.obj.Request.Namespace == "default" && r.obj.Request.Resource.Resource =="deployments" && \
contain(split(accessWithWildcard(${OBJECT}.Spec.Template.Spec.Containers , "*", "Image"),":",1) , p.obj)

And Policy:

p, "1.14.1",deny

Bunlar, sıradan Casbin ACL dilindedir. Eğer bunlarla ilgili bölümleri zaten okuduysanız, anlamak çok kolay olacaktır.

Casbin K8s-GateKeeper aşağıdaki avantajlara sahiptir:

  • Kullanımı kolaydır. ACL'nin birkaç satırını yazmak, birçok kod yazmaktan çok daha iyidir.
  • Yapılandırmaların sıcak güncellemelerine izin verir. Yapılandırmaları değiştirmek için tüm eklentiyi kapatmanıza gerek yoktur.
  • Esnek bir yapıdadır. Herhangi bir K8s kaynağı üzerinde keyfi kurallar oluşturulabilir, bunlar kubectl gatekeeper ile keşfedilebilir.
  • K8s kabul webhook'unun uygulanmasını basitleştirir, ki bu çok karmaşıktır. K8s kabul webhook'unun ne olduğunu veya onun için kod yazmayı bilmenize gerek yoktur. Tek yapmanız gereken, kısıtlamalar koymak istediğiniz kaynağı bilmek ve ardından Casbin ACL yazmaktır. Herkes K8s'nin karmaşık olduğunu biliyor, ancak Casbin K8s-Gatekeeper kullanarak zamanınızı koruyabilirsiniz.
  • Casbin topluluğu tarafından bakımı yapılmaktadır. Eğer bu eklentiyle ilgili herhangi bir şey kafanızı karıştırıyorsa veya bunu deneyimlerken herhangi bir sorunla karşılaşırsanız, lütfen bizimle iletişime geçmekten çekinmeyin.

1.1 Casbin K8s-Gatekeeper Nasıl Çalışır?

K8s-Gatekeeper, K8s için bir kabul webhook'u olup, yöneticinin istemediği herhangi bir K8s işlemi önlemeye yardımcı olmak için Casbin kullanarak kullanıcı tanımlı rastgele erişim kontrol kurallarını uygular.

Casbin, güçlü ve verimli açık kaynaklı bir erişim kontrol kütüphanesidir. Çeşitli erişim kontrol modellerine dayalı yetkilendirmeyi uygulamak için destek sağlar. Casbin hakkında daha fazla ayrıntı için, Genel Bakış bölümüne bakın.

K8s'deki kabul webhook'ları, 'kabul taleplerini' alan ve bunlarla bir şeyler yapan HTTP geri çağrılarıdır. Özellikle, K8s-Gatekeeper özel bir tür kabul webhook'udur: 'ValidatingAdmissionWebhook', bu kabul talebinin kabul edilip edilmeyeceğine karar verebilir. Kabul talepleriyle ilgili olarak, bunlar K8s'nin belirli kaynakları üzerinde bir işlemi (örneğin, bir dağıtımın oluşturulması/silinmesi) tanımlayan HTTP istekleridir. Kabul webhook'ları hakkında daha fazla bilgi için, K8s resmi belgelerine bakın.

1.2 Nasıl Çalıştığını Gösteren Bir Örnek

Örneğin, birisi nginx çalıştıran bir pod içeren bir dağıtım oluşturmak istediğinde (kubectl veya K8s istemcileri kullanarak), K8s bir kabul talebi oluşturacaktır, bu (YAML formatına çevrildiğinde) şöyle bir şey olabilir:

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.1
ports:
- containerPort: 80

Bu talep, resimde gösterilen tüm ara yazılımların işleminden geçecektir, K8s-Gatekeeper da dahil. K8s-Gatekeeper, K8s'in etcd'sinde saklanan tüm Casbin zorlayıcılarını tespit edebilir, bu zorlayıcılar kullanıcı tarafından (kubectl veya sağladığımız Go istemcisi aracılığıyla) oluşturulur ve sürdürülür. Her zorlayıcı, bir Casbin modeli ve bir Casbin politikası içerir. Kabul talebi, her zorlayıcı tarafından sırayla işlenecek ve sadece tüm zorlayıcıları geçen bir talebin bu K8s-Gatekeeper tarafından kabul edilmesi mümkün olacaktır.

(Eğer Casbin zorlayıcısı, model veya politikası ne olduğunu anlamıyorsanız, bu belgeye bakın: Başlarken).

Örneğin, bazı nedenlerden dolayı, yönetici 'nginx:1.14.1' görüntüsünün görünmesini yasaklamak ve 'nginx:1.3.1' görüntüsünün görünmesine izin vermek istiyor. Aşağıdaki kuralı ve politikayı içeren bir zorlayıcı oluşturulabilir (Bir zorlayıcının nasıl oluşturulacağını, bu modellerin ve politikaların ne olduğunu ve bunların nasıl yazılacağını sonraki bölümlerde açıklayacağız).

Model:

[request_definition]
r = obj

[policy_definition]
p = obj,eft

[policy_effect]
e = !some(where (p.eft == deny))

[matchers]
m = r.obj.Request.Namespace == "default" && r.obj.Request.Resource.Resource =="deployments" && \
access(r.obj.Request.Object.Object.Spec.Template.Spec.Containers , 0, "Image") == p.obj

Policy:

p, "nginx:1.13.1",allow
p, "nginx:1.14.1",deny

Yukarıdaki model ve politika içeren bir zorlayıcı oluşturarak, önceki kabul talebi bu zorlayıcı tarafından reddedilecektir, yani K8s bu dağıtımı oluşturmayacaktır.

2 K8s-gatekeeper'ı Yükle

K8s-gatekeeper'ı yüklemek için üç yöntem mevcuttur: Dış webhook, İç webhook ve Helm.

not

Not: Bu yöntemler yalnızca kullanıcıların K8s-gatekeeper'ı denemeleri için tasarlanmıştır ve güvenli değildir. Eğer üretim ortamında kullanmak istiyorsanız, lütfen yüklemeden önce Bölüm 5. Gelişmiş Ayarlar bölümünü okuduğunuzdan ve gerekli değişiklikleri yaptığınızdan emin olun. 2.1 İç Webhook

2.1.1 Adım 1: Görüntüyü Oluştur

İç webhook yöntemi için, webhook kendisi Kubernetes içinde bir hizmet olarak uygulanacaktır.

İç webhook yöntemi için, webhook kendisi Kubernetes içinde bir servis olarak uygulanacak. Gerekli hizmet ve dağıtımı oluşturmak için bir K8s-gatekeeper görüntüsü oluşturmanız gerekiyor. Kendi görüntünüzü oluşturmak için aşağıdaki komutu çalıştırabilirsiniz:

docker build --target webhook -t k8s-gatekeeper .

Bu komut, 'k8s-gatekeeper:latest' adında yerel bir görüntü oluşturacaktır.

not

Not: Eğer minikube kullanıyorsanız, 'docker build' komutunu çalıştırmadan önce eval $(minikube -p minikube docker-env) komutunu çalıştırın.

2.1.2 Adım 2: K8s-gatekeeper için hizmetler ve dağıtımları ayarlayın

Aşağıdaki komutları çalıştırın:

kubectl apply -f config/rbac.yaml
kubectl apply -f config/webhook_deployment.yaml
kubectl apply -f config/webhook_internal.yaml

Bu, K8s-gatekeeper'ı çalıştırmaya başlayacak ve bunu kubectl get pods komutunu çalıştırarak onaylayabilirsiniz.

2.1.3 Adım 3: K8s-gatekeeper için CRD Kaynaklarını Yükleyin

Aşağıdaki komutları çalıştırın:

kubectl apply -f config/auth.casbin.org_casbinmodels.yaml 
kubectl apply -f config/auth.casbin.org_casbinpolicies.yaml

2.2 Dış webhook

Harici webhook yöntemi için, K8s-gatekeeper Kubernetes dışında çalışacak ve Kubernetes, K8s-gatekeeper'a normal bir web sitesine erişir gibi erişecektir. Kubernetes, admission webhook'un HTTPS olması zorunluluğunu taşımaktadır. K8s-gatekeeper'ı denemek amacıyla, bir dizi sertifika ve özel anahtar sağladık (bu güvenli değildir). Kendi sertifikanızı kullanmayı tercih ederseniz, sertifika ve özel anahtarı ayarlama talimatları için Bölüm 5. Gelişmiş Ayarlar bölümüne bakın. Sağladığımız sertifika 'webhook.domain.local' için düzenlenmiştir.

Bu nedenle, ana bilgisayarı (ör. /etc/hosts) değiştirin ve 'webhook.domain.local'ı K8s-gatekeeper'ın çalıştığı IP adresine yönlendirin. Ardından aşağıdaki komutu çalıştırın:

2.3 Helm aracılığıyla K8s-gatekeeper'ı yükleme

go mod tidy
go mod vendor
go run cmd/webhook/main.go
kubectl apply -f config/auth.casbin.org_casbinmodels.yaml
kubectl apply -f config/auth.casbin.org_casbinpolicies.yaml
kubectl apply -f config/webhook_external.yaml

2.3.1 Adım 1: Görüntüyü oluşturma

2.3.1 Adım 1: Görüntüyü oluşturun

Lütfen Bölüm 2.1.1 bölümüne bakın.

2.3.2 Helm kurulumu

Komutu çalıştırın: helm install k8sgatekeeper ./k8sgatekeeper.

3. K8s-gatekeeper'i deneyin

3.1 Casbin Model ve Politika Oluşturma

Bir model ve politika oluşturmak için iki yönteminiz var: kubectl aracılığıyla veya sağladığımız go-client aracılığıyla.

3.1.1 Casbin Model ve Politikayı kubectl ile Oluşturma/Güncelleme

K8s-gatekeeper'de, Casbin modeli 'CasbinModel' adında bir CRD kaynağında saklanır. Tanımı config/auth.casbin.org_casbinmodels.yaml dosyasında bulunmaktadır.

example/allowed_repo/model.yaml içinde örnekler bulunmaktadır. Aşağıdaki alanlara dikkat edin:

  • metadata.name: modelin adı. Bu ad, bu modele ilişkin CasbinPolicy nesnesinin adıyla aynı olmalıdır, böylece K8s-gatekeeper onları eşleştirebilir ve bir uygulayıcı oluşturabilir.
  • spec.enable: bu alan "false" olarak ayarlanırsa, bu model (ve bu modele ilişkin CasbinPolicy nesnesi) göz ardı edilecektir.
  • spec.modelText: bir Casbin modelinin model metnini içeren bir dizedir.

Casbin Politikası, tanımı config/auth.casbin.org_casbinpolicies.yaml dosyasında bulunan 'CasbinPolicy' adlı başka bir CRD kaynağında saklanır.

example/allowed_repo/policy.yaml içinde örnekler bulunmaktadır. Aşağıdaki alanlara dikkat edin:

  • metadata.name: politika adı. Bu isim, bu politikayla ilişkili olan CasbinModel nesnesinin adıyla aynı olmalıdır, böylece K8s-gatekeeper onları eşleştirebilir ve bir uygulayıcı oluşturabilir.
  • spec.policyItem: Bir Casbin modelinin politikalı metnini içeren bir dizedir.

Kendi CasbinModel ve CasbinPolicy dosyalarınızı oluşturduktan sonra, onları uygulamak için aşağıdaki komutu kullanın:

kubectl apply -f <filename>

Bir CasbinModel ve CasbinPolicy çifti oluşturulduktan sonra, K8s-gatekeeper bunu 5 saniye içinde tespit edebilir.

3.1.2 Casbin Model ve Politikasını sağladığımız go-client üzerinden Oluşturma/Güncelleme

Şirketiniz için otomatik bir bulut platformu oluştururken olduğu gibi, K8s kümesinin bir düğümünde doğrudan komutları çalıştırmak için kabuğu kullanmanın uygun olmayabileceği durumlar olabileceğini anlıyoruz. Bu nedenle, CasbinModel ve CasbinPolicy'yi oluşturmak ve sürdürmek için bir go-client geliştirdik.

go-client kütüphanesi pkg/client dizininde bulunmaktadır.

client.go dosyasında, bir istemci oluşturmak için bir fonksiyon sağlıyoruz.

func NewK8sGateKeeperClient(externalClient bool) (*K8sGateKeeperClient, error) 

externalClient parametresi, K8s-gatekeeper'ın K8s kümesi içinde çalışıp çalışmadığını belirler.

model.go dosyasında, CasbinModel'i oluşturmak, silmek ve değiştirmek için çeşitli fonksiyonlar sunuyoruz. Bu arayüzlerin nasıl kullanılacağını model_test.go dosyasında öğrenebilirsiniz.

policy.go dosyasında, CasbiPolicy'i oluşturmak, silmek ve değiştirmek için çeşitli fonksiyonlar sunuyoruz. Bu arayüzlerin nasıl kullanılacağını policy_test.go dosyasında öğrenebilirsiniz.

3.1.2 K8s-gatekeeper'ın Çalışıp Çalışmadığını Deneyin

Varsayalım ki example/allowed_repo içinde tam olarak model ve politikayı oluşturdunuz. Şimdi, aşağıdaki komutu deneyin:

kubectl apply -f example/allowed_repo/testcase/reject_1.yaml

K8s'nin bu isteği reddedeceğini ve bu isteğin reddedilme nedeni olarak webhook'u belirteceğini göreceksiniz. Ancak, example/allowed_repo/testcase/approve_2.yaml uygulamayı denerseniz, kabul edilecektir.

4. K8s-gatekeeper ile Model ve Politika Nasıl Yazılır

Öncelikle, Casbin Modelleri ve Politikalarının temel grameriyle ilgili bilginiz olduğundan emin olun. Eğer değilseniz, lütfen önce Başlarken bölümünü okuyun. Bu bölümde, Casbin Modelleri ve Politikalarının ne olduğunu zaten anladığınızı varsayıyoruz.

4.1 Modelin İstek Tanımı

K8s-gatekeeper bir isteği yetkilendirirken, girdi her zaman bir nesnedir: Kabul İsteğinin Go nesnesi. Bu, zorlayıcının her zaman şu şekilde kullanılacağı anlamına gelir:

ok, err := enforcer.Enforce(admission)

burada admission, K8s'nin resmi go api'si "k8s.io/api/admission/v1" tarafından tanımlanan bir AdmissionReview nesnesidir. Bu yapının tanımını bu depoda bulabilirsiniz: https://github.com/kubernetes/api/blob/master/admission/v1/types.go. Daha fazla bilgi için, https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/#webhook-request-and-response adresine de başvurabilirsiniz.

Bu nedenle, K8s-gatekeeper tarafından kullanılan herhangi bir model için request_definition tanımı her zaman şu şekilde olmalıdır:

    [request_definition]
r = obj

'obj' adı zorunlu değildir, adın [matchers] bölümünde kullanılan adla tutarlı olması yeterlidir.

4.2 Modelin Eşleştiricileri

Kurallarınızı yazmak için Casbin'in ABAC özelliğini kullanmalısınız. Ancak, Casbin'de entegre edilmiş ifade değerlendirici, haritalardaki veya dizilerdeki (dilimlerdeki) indekslemeyi veya dizilerin genişlemesini desteklememektedir. Bu nedenle, K8s-gatekeeper bu özellikleri uygulamak için çeşitli 'Casbin fonksiyonları'nı uzantılar olarak sağlar. Eğer hâlâ bu uzantılarla talebinizi karşılayamadığınızı düşünüyorsanız, bir konu başlatmaya da çekinmeyin, ya da bir çekme isteği oluşturun.

Casbin fonksiyonlarına aşina değilseniz, daha fazla bilgi için Function sayfasına başvurabilirsiniz.

İşte uzantı fonksiyonları:

4.2.1 Uzantı Fonksiyonları

4.2.1.1 erişim

Erişim, Casbin'in haritalarda veya dizilerde indekslemeyi desteklemediği sorunu çözmek için kullanılır. example/allowed_repo/model.yaml örneği, bu fonksiyonun kullanımını gösterir:

[matchers]
m = r.obj.Request.Namespace == "default" && r.obj.Request.Resource.Resource =="deployments" && \
access(r.obj.Request.Object.Object.Spec.Template.Spec.Containers , 0, "Image") == p.obj

Bu eşleştiricide, access(r.obj.Request.Object.Object.Spec.Template.Spec.Containers , 0, "Image") ifadesi, r.obj.Request.Object.Object.Spec.Template.Spec.Containers[0].Image ile eşdeğerdir, burada r.obj.Request.Object.Object.Spec.Template.Spec.Containers bir dilimdir.

Erişim ayrıca parametreleri olmayan ve tek bir değer döndüren basit fonksiyonları çağırabilir. example/container_resource_limit/model.yaml örneği bunu gösterir:

[matchers]
m = r.obj.Request.Namespace == "default" && r.obj.Request.Resource.Resource =="deployments" && \
parseFloat(access(r.obj.Request.Object.Object.Spec.Template.Spec.Containers , 0, "Resources","Limits","cpu","Value")) >= parseFloat(p.cpu) && \
parseFloat(access(r.obj.Request.Object.Object.Spec.Template.Spec.Containers , 0, "Resources","Limits","memory","Value")) >= parseFloat(p.memory)

Bu eşleştiricide, access(r.obj.Request.Object.Object.Spec.Template.Spec.Containers , 0, "Resources","Limits","cpu","Value") ifadesi, r.obj.Request.Object.Object.Spec.Template.Spec.Containers[0].Resources.Limits["cpu"].Value() ile eşdeğerdir, burada r.obj.Request.Object.Object.Spec.Template.Spec.Containers[0].Resources.Limits bir haritadır ve Value() parametresi olmayan ve tek bir değer döndüren basit bir fonksiyondur.

4.2.1.2 accessWithWildcard

Bazen şöyle bir talepte bulunabilirsiniz: bir dizideki tüm öğelerin "aaa" öneki olmalı. Ancak, Casbin for döngülerini desteklememektedir. accessWithWildcard ve "map/slice genişletme" özelliği ile, böyle bir talebi kolayca uygulayabilirsiniz.

Örneğin, a.b.c dizisi [aaa, bbb, ccc, ddd, eee] olsun, o zaman accessWithWildcard(a, "b", "c", "*") sonucu bir dilim [aaa, bbb, ccc, ddd, eee] olacaktır. Joker karakter * kullanarak, dilim genişletilir.

Benzer şekilde, joker karakter birden fazla kez kullanılabilir. Örneğin, accessWithWildcard(a, "b", "c", "*", "*") sonucu [a.b.c[0][0], a.b.c[0][1], ..., a.b.c[1][0], a.b.c[1][1], ...] olacaktır.

4.2.1.3 Değişken Uzunluklu Argümanları Destekleyen Fonksiyonlar

Casbin'in ifade değerlendirici içinde, bir parametre bir dizi olduğunda, otomatik olarak değişken uzunluklu bir argüman olarak genişletilir. Bu özelliği kullanarak dizi/dilim/map genişletmeyi desteklemek için, ayrıca bir dizi/dilim parametresi kabul eden birkaç fonksiyon entegre ettik:

  • contain(): birden fazla parametre kabul eder ve son parametre hariç herhangi bir parametrenin son parametreye eşit olup olmadığını döndürür.
  • split(a, b, c..., sep, index): [splits(a, sep)[index], splits(b, sep)[index], splits(a, sep)[index], ...] içeren bir dilim döndürür.
  • len(): değişken uzunluklu argümanın uzunluğunu döndürür.
  • matchRegex(a,b,c...,regex): verilen tüm parametrelerin (a, b, c, ...) verilen regex ile eşleşip eşleşmediğini döndürür.

İşte example/disallowed_tag/model.yaml içinde bir örnek:

    [matchers]
m = r.obj.Request.Namespace == "default" && r.obj.Request.Resource.Resource =="deployments" && \
contain(split(accessWithWildcard(r.obj.Request.Object.Object.Spec.Template.Spec.Containers , "*", "Image"),":",1) , p.obj)

accessWithWildcard(r.obj.Request.Object.Object.Spec.Template.Spec.Containers , "*", "Image") ["a:b", "c:d", "e:f", "g:h"] döndürdüğü varsayılarak, çünkü splits değişken uzunluklu argümanları destekler ve her öğede splits işlemi gerçekleştirir, indeks 1'deki öğe seçilir ve döndürülür. Bu nedenle, split(accessWithWildcard(r.obj.Request.Object.Object.Spec.Template.Spec.Containers , "*", "Image"),":",1) ["b","d","f","h"] döndürür. Ve contain(split(accessWithWildcard(r.obj.Request.Object.Object.Spec.Template.Spec.Containers , "*", "Image"),":",1) , p.obj) p.obj'nin ["b","d","f","h"] içinde bulunup bulunmadığını döndürür.

4.2.1.2 Tür Dönüştürme Fonksiyonları

  • ParseFloat(): Bir tamsayıyı float'a çevirir (bu, karşılaştırmada kullanılan herhangi bir sayının float'a dönüştürülmesi gerektiği için gereklidir).
  • ToString(): Bir nesneyi string'e dönüştürür. Bu nesnenin temel bir string türü olmalıdır (örneğin, type XXX string ifadesi olduğunda XXX türünde bir nesne).
  • IsNil(): Parametrenin nil olup olmadığını döndürür.

5. Gelişmiş Ayarlar

5.1 Sertifikalar Hakkında

Kubernetes (k8s) içinde, bir webhook'un HTTPS kullanması zorunludur. Bunu gerçekleştirmek için iki yaklaşım vardır:

  • Kendinden imzalı sertifikalar kullanın (bu depodaki örnekler bu yöntemi kullanmaktadır)
  • Normal bir sertifika kullanın

5.1.1 Kendinden imzalı sertifikalar

Kendinden imzalı bir sertifika kullanmak, sertifikayı düzenleyen Sertifika Yetkilisi'nin (CA) iyi bilinen CA'lardan biri olmadığı anlamına gelir. Bu nedenle, k8s'ye bu CA'yı bildirmeniz gerekir.

Şu anda, bu depodaki örnek, özel anahtarı ve sertifikası sırasıyla config/certificate/ca.crt ve config/certificate/ca.key içinde saklanan kendi yapımı bir CA kullanmaktadır. Webhook için sertifika config/certificate/server.crt şeklindedir ve bu, kendi yapımı CA tarafından düzenlenmiştir. Bu sertifikanın alanları "webhook.domain.local" (harici webhook için) ve "casbin-webhook-svc.default.svc" (dahili webhook için) şeklindedir.

CA hakkındaki bilgiler, webhook yapılandırma dosyaları aracılığıyla k8s'ye iletilir. Hem config/webhook_external.yaml hem de config/webhook_internal.yaml dosyalarında "CABundle" adında bir alan bulunmaktadır ve bu alan, CA'nın sertifikasının base64 ile kodlanmış dizesini içerir.

Eğer sertifika/alanı değiştirmeniz gerekiyorsa (örneğin, bu webhook'u k8s'nin başka bir namespace'ine yerleştirmek istiyorsanız ve dahili webhook kullanıyorsanız veya alanı değiştirmek istiyorsanız ve harici webhook kullanıyorsanız), aşağıdaki prosedürler takip edilmelidir:

  1. Yeni bir CA oluşturun:

    • Sahte CA için özel anahtar oluşturun:

      openssl genrsa -des3 -out ca.key 2048
    • Özel anahtarın şifre korumasını kaldırın:

      openssl rsa -in ca.key -out ca.key
  2. Webhook sunucusu için bir özel anahtar oluşturun:

    openssl genrsa -des3 -out server.key 2048
    openssl rsa -in server.key -out server.key
  3. Kendinden oluşturulan CA'yı kullanarak webhook için sertifikayı imzalayın:

    • Sisteminizin openssl yapılandırma dosyasını geçici kullanım için kopyalayın. Yapılandırma dosyasının konumunu openssl version -a komutunu çalıştırarak öğrenebilirsiniz, genellikle openssl.cnf olarak adlandırılır.

    • Yapılandırma dosyasında:

      • [req] paragrafını bulun ve şu satırı ekleyin: req_extensions = v3_req

      • [v3_req] paragrafını bulun ve şu satırı ekleyin: subjectAltName = @alt_names

      • Dosyanın sonuna aşağıdaki satırları ekleyin:

        [alt_names]
        DNS.2=<The domain you want>

        Not: Eğer hizmet adını değiştirmeye karar verirseniz, 'casbin-webhook-svc.default.svc' yerine kendi hizmetinizin gerçek hizmet adını kullanın.

    • Değiştirilmiş yapılandırma dosyasını kullanarak bir sertifika isteği dosyası oluşturun:

      openssl req -new -nodes -keyout server.key -out server.csr -config openssl.cnf
    • Kendiniz yapılan CA'yı kullanarak isteğe yanıt verin ve sertifikayı imzalayın:

      openssl x509 -req -days 3650 -in server.csr -out server.crt -CA ca.crt -CAkey ca.key -CAcreateserial -extensions v3_req -extensions SAN -extfile openssl.cnf
  4. 'CABundle' alanını değiştirin: Bu alanı yeni sertifika ile güncelleyin.

  5. Helm kullanıyorsanız, benzer değişikliklerin helm grafiklerine de uygulanması gerekir.

5.1.2 Yasal sertifikalar

Yasal sertifikalar kullanıyorsanız, tüm bu prosedürleri uygulamanıza gerek yoktur. config/webhook_external.yaml ve config/webhook_internal.yaml dosyalarındaki "CABundle" alanını kaldırın ve bu dosyalardaki alanı sahip olduğunuz alanla değiştirin.