Wallarm Sidecar'ı Özelleştirme¶
Bu makale, bazı yaygın özelleştirme kullanım durumları için örnekler sağlayarak Wallarm Kubernetes Sidecar çözümünün güvenli ve etkili şekilde özelleştirilmesi konusunda rehberlik eder.
Yapılandırma alanı¶
Wallarm Sidecar çözümü standart Kubernetes bileşenlerine dayanır, dolayısıyla çözümün yapılandırması büyük ölçüde Kubernetes yığını yapılandırmasına benzer. Wallarm Sidecar çözümünü küresel ölçekte values.yaml
ile ve uygulama podu bazında annotation'lar ile yapılandırabilirsiniz.
Genel ayarlar¶
Genel yapılandırma seçenekleri Wallarm denetleyicisi tarafından oluşturulan tüm sidecar kaynaklarına uygulanır ve varsayılan Helm chart değerlerinde ayarlanır. helm install
veya helm upgrade
sırasında özel values.yaml
sağlayarak bunları geçersiz kılabilirsiniz.
Mevcut genel yapılandırma seçeneklerinin sayısı sınırsızdır. Çözüm, ortaya çıkan Pod'u tamamen değiştirmeye ve bunun sonucunda çözümün yanlış çalışmasına izin verdiğinden, özelleştirme yapılırken dikkatli olunmalıdır. Genel ayarları değiştirirken lütfen Helm ve Kubernetes dokümantasyonuna güvenin.
Wallarm'a özgü chart değerlerinin listesi burada
Pod bazlı ayarlar¶
Pod bazlı ayarlar, belirli uygulamalar için çözüm davranışının özelleştirilmesine olanak tanır.
Uygulama podu ayarları, uygulama Pod'unun annotation'ları aracılığıyla ayarlanır. Annotation'lar, genel ayarlara göre önceliklidir. Aynı seçenek hem genel hem de annotation ile belirtilirse, annotation'daki değer uygulanır.
Desteklenen annotation seti sınırlıdır ancak nginx-*-include
ve nginx-*-snippet
annotation'ları, çözüm tarafından herhangi bir özel NGINX yapılandırmasının kullanılmasına izin verir.
Desteklenen pod bazlı annotation'ların listesi burada
Yapılandırma kullanım senaryoları¶
Yukarıda belirtildiği gibi, çözümü altyapınıza ve güvenlik çözümüne yönelik gereksinimlerinize uyacak şekilde birçok yolla özelleştirebilirsiniz. En yaygın özelleştirme seçeneklerinin uygulanmasını kolaylaştırmak için bunları ilgili en iyi uygulamaları göz önünde bulundurarak açıkladık.
Kapsayıcıların tekli ve bölünmüş dağıtımı¶
Wallarm, Wallarm kapsayıcılarının bir Pod'a dağıtımı için iki seçenek sunar:
-
Tekli dağıtım (varsayılan)
-
Bölünmüş dağıtım
Kapsayıcı dağıtım seçeneklerini hem genel hem de pod bazında ayarlayabilirsiniz:
-
Genel olarak Helm chart değeri
config.injectionStrategy.schema
yısingle
(varsayılan) veyasplit
olarak ayarlayarak. -
Pod bazında uygun uygulama Pod annotation'ı
sidecar.wallarm.io/sidecar-injection-schema
yı"single"
veya"split"
olarak ayarlayarak.
Postanalytics modülü
Lütfen postanalytics modülü kapsayıcısının ayrı çalıştığını, açıklanan dağıtım seçeneklerinin yalnızca diğer kapsayıcılarla ilgili olduğunu unutmayın.
Tekli dağıtım (varsayılan)¶
Wallarm kapsayıcılarının tekli dağıtımıyla, isteğe bağlı iptables init kapsayıcısı dışında bir Pod'da yalnızca bir kapsayıcı çalışır.
Sonuç olarak iki kapsayıcı çalışır:
-
sidecar-init-iptables
, iptables çalıştıran init kapsayıcıdır. Varsayılan olarak bu kapsayıcı başlatılır ancak devre dışı bırakabilirsiniz. -
sidecar-proxy
, Wallarm modülleri ve bazı yardımcı servislerle NGINX proxy'yi çalıştırır. Bu süreçlerin tümü supervisord tarafından çalıştırılır ve yönetilir.
Bölünmüş dağıtım¶
Wallarm kapsayıcılarının bölünmüş dağıtımıyla, iki init kapsayıcıya ek olarak bir Pod'da iki ek kapsayıcı çalışır.
Bu seçenek, tüm yardımcı servisleri sidecar-proxy
kapsayıcısından çıkarır ve kapsayıcı tarafından yalnızca NGINX servislerinin başlatılmasını sağlar.
Bölünmüş kapsayıcı dağıtımı, NGINX ve yardımcı servislerin tükettiği kaynaklar üzerinde daha ayrıntılı kontrol sağlar. CPU/Memory/Storage ad alanlarının Wallarm ve yardımcı kapsayıcılar arasında bölünmesinin gerekli olduğu yüksek yüklü uygulamalar için önerilen seçenektir.
Sonuç olarak dört kapsayıcı çalışır:
-
sidecar-init-iptables
, iptables çalıştıran init kapsayıcıdır. Varsayılan olarak bu kapsayıcı başlatılır ancak devre dışı bırakabilirsiniz. -
sidecar-init-helper
, Wallarm düğümünü Wallarm Cloud'a bağlamakla görevli yardımcı servisleri içeren init kapsayıcıdır. -
sidecar-proxy
, NGINX servislerini içeren kapsayıcıdır. -
sidecar-helper
, diğer bazı yardımcı servisleri içeren kapsayıcıdır.
Uygulama kapsayıcısı portunun otomatik keşfi¶
Korumalı uygulama portu birçok şekilde yapılandırılabilir. Gelen trafiği doğru şekilde işlemek ve yönlendirmek için Wallarm sidecar'ın uygulama kapsayıcısının gelen istekleri kabul ettiği TCP portunu bilmesi gerekir.
Varsayılan olarak, sidecar denetleyicisi portu aşağıdaki öncelik sırasına göre otomatik olarak keşfeder:
-
Port
sidecar.wallarm.io/application-port
pod annotation'ı ile tanımlanmışsa, Wallarm denetleyicisi bu değeri kullanır. -
name: http
uygulama kapsayıcısı ayarında port tanımlıysa, Wallarm denetleyicisi bu değeri kullanır. -
name: http
ayarı altında port tanımlı değilse, Wallarm denetleyicisi uygulama kapsayıcısı ayarlarında ilk bulunan port değerini kullanır. -
Uygulama kapsayıcısı ayarlarında hiç port tanımlı değilse, Wallarm denetleyicisi Wallarm Helm chart'ındaki
config.nginx.applicationPort
değerini kullanır.
Uygulama kapsayıcısı portu otomatik keşfi beklendiği gibi çalışmıyorsa, portu 1. veya 4. seçeneği kullanarak açıkça belirtin.
Gelen trafiğin yakalanması (port yönlendirme)¶
Varsayılan olarak, Wallarm sidecar denetleyicisi trafiği aşağıdaki gibi yönlendirir:
-
Bağlı Pod'un IP'sine ve uygulama kapsayıcısı portuna gelen trafiği yakalar.
-
Bu trafiği yerleşik iptables özelliklerini kullanarak sidecar kapsayıcısına yönlendirir.
-
Sidecar, kötü amaçlı istekleri engeller ve meşru trafiği uygulama kapsayıcısına iletir.
Gelen trafik yakalama, otomatik port yönlendirme için en iyi uygulama olan iptables çalıştıran init kapsayıcı kullanılarak uygulanmıştır. Bu kapsayıcı ayrıcalıklı olarak, NET_ADMIN
yeteneğiyle çalıştırılır.
Ancak bu yaklaşım, Istio gibi servis mesh'leriyle uyumlu değildir çünkü Istio zaten iptables tabanlı trafik yakalama uygular. Bu durumda iptables'ı devre dışı bırakabilirsiniz ve port yönlendirme aşağıdaki gibi çalışacaktır:
Korunmayan uygulama kapsayıcısı
iptables devre dışı bırakılırsa, dışa açık bir uygulama kapsayıcısı Wallarm tarafından korunmayacaktır. Sonuç olarak, IP adresi ve portu bir saldırgan tarafından biliniyorsa, kötü amaçlı "doğu-batı" trafiği uygulama kapsayıcısına ulaşabilir.
Doğu/batı trafiği, Kubernetes kümesi etrafında akan trafiktir (örn. servisler arası).
Varsayılan davranışı şu şekilde değiştirebilirsiniz:
-
iptables'ı şu yollarla devre dışı bırakın:
- Genel olarak Helm chart değeri
config.injectionStrategy.iptablesEnable
ı"false"
olarak ayarlayarak - Pod bazında Pod annotation'ı
sidecar.wallarm.io/sidecar-injection-iptables-enable
ı"false"
olarak ayarlayarak
- Genel olarak Helm chart değeri
-
Service manifestinizde
spec.ports.targetPort
ayarınıproxy
portunu gösterecek şekilde güncelleyin.iptables tabanlı trafik yakalama devre dışıysa, Wallarm sidecar kapsayıcısı
proxy
adlı bir port yayımlayacaktır. Gelen trafiğin Kubernetes servisindenproxy
portuna gelmesi için, Service manifestinizdekispec.ports.targetPort
ayarı bu portu göstermelidir:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
wallarm-sidecar: enabled
annotations:
sidecar.wallarm.io/sidecar-injection-iptables-enable: "false"
spec:
containers:
- name: application
image: kennethreitz/httpbin
ports:
- name: http
containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
namespace: default
spec:
ports:
- port: 80
targetPort: proxy
protocol: TCP
name: http
selector:
app: myapp
SSL/TLS sonlandırma¶
Varsayılan olarak, Sidecar çözümü yalnızca HTTP trafiğini kabul eder ve düz HTTP trafiğini uygulama pod'larına iletir. SSL/TLS sonlandırmanın sidecar çözümünden önce konumlanan bir altyapı bileşeni (ör. Ingress/Application Gateway) tarafından gerçekleştirildiği varsayılır; bu, sidecar çözümünün düz HTTP'yi işlemesine olanak tanır.
Bununla birlikte, mevcut altyapının SSL/TLS sonlandırmayı desteklemediği durumlar olabilir. Bu gibi durumlarda, SSL/TLS sonlandırmayı Wallarm sidecar düzeyinde etkinleştirebilirsiniz. Bu özellik Helm chart 4.6.1 sürümünden itibaren desteklenir.
Sidecar çözümü ya SSL/TLS ya da düz HTTP trafiğini destekler
Wallarm Sidecar çözümü ya SSL/TLS ya da düz HTTP trafiğini işler. SSL/TLS sonlandırmayı etkinleştirmek, sidecar çözümünün düz HTTP trafiğini işlemeyeceği; SSL/TLS sonlandırmayı devre dışı bırakmak ise yalnızca HTTPS trafiğinin işleneceği anlamına gelir.
SSL/TLS sonlandırmayı etkinleştirmek için:
-
Sidecar'ın SSL/TLS'yi sonlandıracağı sunucuya ait sunucu sertifikasını (genel anahtar) ve özel anahtarı edinin.
-
Uygulama podunun namespace'inde, sunucu sertifikası ve özel anahtarını içeren bir TLS secret oluşturun.
-
Secret'ı mount etmek için
values.yaml
dosyasınaconfig.profiles
bölümünü ekleyin. Aşağıdaki örnek, birden çok sertifika mount etme yapılandırmasını gösterir.İhtiyaçlarınıza uyacak şekilde yorumlara göre kodu özelleştirin. Yalnızca bir sertifikaya ihtiyacınız varsa gereksiz sertifika mount etme yapılandırmalarını kaldırın.
config: wallarm: api: token: "<NODE_TOKEN>" host: "us1.api.wallarm.com" # EU Cloud kullanıyorsanız boş string bırakın # Diğer Wallarm ayarları https://docs.wallarm.com/installation/kubernetes/sidecar-proxy/helm-chart-for-wallarm/ profiles: tls-profile: # Buraya istenen herhangi bir TLS profil adını girin sidecar: volumeMounts: - name: nginx-certs-example-com # example.com anahtarlarını içeren volume adı mountPath: /etc/nginx/certs/example.com # example.com anahtarlarının kapsayıcıya mount edileceği yol readOnly: true - name: nginx-certs-example-io # example.io anahtarlarını içeren volume adı mountPath: /etc/nginx/certs/example.io # example.io anahtarlarının kapsayıcıya mount edileceği yol readOnly: true volumes: - name: nginx-certs-example-com # example.com anahtarlarını içeren volume adı secret: secretName: example-com-certs # example.com backend'i için oluşturulmuş, genel ve özel anahtarları içeren secret adı - name: nginx-certs-example-io # example.io anahtarlarını içeren volume adı secret: secretName: example-io-certs # example.io backend'i için oluşturulmuş, genel ve özel anahtarları içeren secret adı nginx: # TLS/SSL sonlandırma prosedürünüze özgü NGINX SSL modülü yapılandırması. # Bkz. https://nginx.org/en/docs/http/ngx_http_ssl_module.html. # Sidecar'ın trafik sonlandırması yapabilmesi için bu yapılandırma gereklidir. servers: - listen: "ssl http2" include: - "server_name example.com www.example.com" - "ssl_protocols TLSv1.3" - "ssl_certificate /etc/nginx/certs/example.com/tls.crt" - "ssl_certificate_key /etc/nginx/certs/example.com/tls.key" - "ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384" - "ssl_conf_command Ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256" - listen: "ssl" include: - "server_name example.io www.example.io" - "ssl_protocols TLSv1.2 TLSv1.3" - "ssl_certificate /etc/nginx/certs/example.io/tls.crt" - "ssl_certificate_key /etc/nginx/certs/example.io/tls.key"
-
values.yaml
içindeki değişiklikleri aşağıdaki komutla Sidecar çözümüne uygulayın: -
Uygulama poduna
sidecar.wallarm.io/profile: tls-profile
annotation'ını uygulayın. -
Yapılandırma uygulandıktan sonra, buradaki adımları izleyerek, HTTP yerine HTTPS protokolünü kullanıp çözümü test edebilirsiniz.
Sidecar çözümü TLS/SSL trafiğini kabul edecek, sonlandıracak ve düz HTTP trafiğini uygulama poduna iletecektir.
Admission webhook için sertifikalar¶
4.10.7 sürümünden başlayarak, admission webhook için kendi sertifikalarınızı çıkarma ve kullanma seçeneğiniz vardır.
Varsayılan olarak, çözüm admission webhook sertifikalarını certgen
kullanarak otomatik olarak üretir.
Kendi sertifikalarınızı kullanmak için aşağıdaki seçenekler mevcuttur:
-
cert-manager kullanma: Kümenizde
cert-manager
kullanıyorsanız ve admission webhook sertifikasını üretmek için onu tercih ediyorsanız,values.yaml
dosyanızı aşağıdaki gibi güncelleyin.Bu,
certgen
i otomatik olarak devre dışı bırakacaktır. -
Manuel sertifika yükleme: Aşağıdaki yapılandırmayı
values.yaml
dosyasına ekleyerek sertifikaları manuel olarak yükleyebilirsiniz. Bu,certgen
i otomatik olarak devre dışı bırakacaktır.
4.10.6 veya öncesi sürümden yükseltiyorsanız lütfen özel yükseltme talimatlarını izleyin. Bu güncelleme, çözümün yeniden kurulmasını gerektiren kırıcı bir değişiklik içerir.
Ek NGINX modüllerini etkinleştirme¶
Wallarm sidecar'ın Docker imajı, varsayılan olarak devre dışı bırakılmış aşağıdaki ek NGINX modülleri ile dağıtılır:
Ek modülleri yalnızca pod bazında Pod annotation'ı sidecar.wallarm.io/nginx-extra-modules
ayarlanarak etkinleştirebilirsiniz.
Annotation değerinin formatı bir dizidir. Ek modüllerin etkin olduğu örnek:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
wallarm-sidecar: enabled
annotations:
sidecar.wallarm.io/nginx-extra-modules: "['ngx_http_brotli_filter_module.so','ngx_http_brotli_static_module.so', 'ngx_http_opentracing_module.so']"
spec:
containers:
- name: application
image: kennethreitz/httpbin
ports:
- name: http
containerPort: 80
Özel NGINX yapılandırmasının kullanılması¶
Bazı NGINX ayarları için özel pod annotation'ları yoksa, bunları pod bazında snippet ve include aracılığıyla belirtebilirsiniz.
Snippet¶
Snippet'ler, NGINX yapılandırmasına tek satırlık değişiklikler eklemenin uygun bir yoludur. Daha karmaşık değişiklikler için include önerilen seçenektir.
Özel ayarları snippet'lerle belirtmek için aşağıdaki pod bazlı annotation'ları kullanın:
NGINX config bölümü | Annotation |
---|---|
http | sidecar.wallarm.io/nginx-http-snippet |
server | sidecar.wallarm.io/nginx-server-snippet |
location | sidecar.wallarm.io/nginx-location-snippet |
disable_acl
NGINX yönergesi değerini değiştiren annotation örneği:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
wallarm-sidecar: enabled
annotations:
sidecar.wallarm.io/wallarm-mode: block
sidecar.wallarm.io/nginx-location-snippet: "disable_acl on"
spec:
containers:
- name: application
image: kennethreitz/httpbin
ports:
- name: http
containerPort: 80
Birden fazla yönerge belirtmek için ;
sembolünü kullanın, örn.:
İçerme (Include)¶
Ek bir NGINX yapılandırma dosyasını Wallarm sidecar kapsayıcısına mount etmek için bu dosyadan ConfigMap oluşturabilir veya Secret kaynağı oluşturabilir ve kapsayıcıda oluşturulan kaynağı kullanabilirsiniz.
ConfigMap veya Secret kaynağı oluşturulduktan sonra, aşağıdaki pod bazlı annotation'ları kullanarak Volume ve VolumeMounts bileşenleri üzerinden kapsayıcıya mount edebilirsiniz:
Öğe | Annotation | Değer tipi |
---|---|---|
Volumes | sidecar.wallarm.io/proxy-extra-volumes | JSON |
Volume mounts | sidecar.wallarm.io/proxy-extra-volume-mounts | JSON |
Kaynak kapsayıcıya mount edildikten sonra, ilgili annotation'da mount edilen dosyanın yolunu geçerek NGINX bağlamını belirtin:
NGINX config bölümü | Annotation | Değer tipi |
---|---|---|
http | sidecar.wallarm.io/nginx-http-include | Dizi |
server | sidecar.wallarm.io/nginx-server-include | Dizi |
location | sidecar.wallarm.io/nginx-location-include | Dizi |
Aşağıda, NGINX yapılandırmasının http
seviyesine include edilen, mount edilmiş yapılandırma dosyasının bulunduğu bir örnek verilmiştir. Bu örnek, nginx-http-include-cm
ConfigMap'inin önceden oluşturulduğunu ve geçerli NGINX yapılandırma yönergeleri içerdiğini varsayar.
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
wallarm-sidecar: enabled
annotations:
sidecar.wallarm.io/proxy-extra-volumes: '[{"name": "nginx-http-extra-config", "configMap": {"name": "nginx-http-include-cm"}}]'
sidecar.wallarm.io/proxy-extra-volume-mounts: '[{"name": "nginx-http-extra-config", "mountPath": "/nginx_include/http.conf", "subPath": "http.conf"}]'
sidecar.wallarm.io/nginx-http-include: "['/nginx_include/http.conf']"
spec:
containers:
- name: application
image: kennethreitz/httpbin
ports:
- name: http
containerPort: 80
Wallarm özelliklerini yapılandırma¶
Listelenen genel çözüm ayarlarına ek olarak, Wallarm ile saldırı önleme için en iyi uygulamaları da öğrenmenizi öneririz.
Bu yapılandırma annotation'lar ve Wallarm Console UI aracılığıyla gerçekleştirilir.
Annotation'lar ile diğer yapılandırmalar¶
Listelenen yapılandırma kullanım senaryolarına ek olarak, birçok başka annotation kullanarak Wallarm sidecar çözümünü uygulama pod'ları için ince ayar yapabilirsiniz.