Bu doküman, Flowfish'in uzak cluster'lara güvenli bağlantı kurma mekanizmalarını açıklar.
Remote cluster'lara bağlantı için read-only ServiceAccount kullanılır:
# Minimum Required Permissions
rules:
- apiGroups: [""]
resources: ["pods", "nodes", "namespaces", "services", "events"]
verbs: ["get", "list", "watch"] # SADECE OKUMA
- apiGroups: ["apps"]
resources: ["deployments", "daemonsets", "replicasets", "statefulsets"]
verbs: ["get", "list", "watch"] # SADECE OKUMA
- apiGroups: ["gadget.kinvolk.io"]
resources: ["traces"]
verbs: ["get", "list", "watch"] # SADECE OKUMA- ✅ Tokenlar Fernet (AES-128-CBC) ile şifrelenerek PostgreSQL'de saklanır
- ✅ Şifreleme anahtarı environment variable olarak geçirilir
- ❌ Token'ı kaynak kodda veya config dosyalarında saklamayın
- ❌ Token'ı log'lara yazdırmayın
# 1 yıllık token oluştur (production için daha kısa önerilir)
oc create token flowfish-remote-reader -n flowfish --duration=8760hRemote cluster bağlantısında mutlaka TLS doğrulama yapılmalıdır:
┌──────────────────┐ TLS ┌──────────────────┐
│ Flowfish │ ◄──────────────────── │ Remote │
│ (Internal) │ CA Cert Verified │ Cluster │
└──────────────────┘ └──────────────────┘
| Seçenek | Açıklama | Güvenlik |
|---|---|---|
| CA Certificate | Remote cluster'ın CA sertifikası | ✅ Önerilen |
| Skip TLS Verify | TLS doğrulamayı atla |
# OpenShift/Kubernetes'ten CA sertifikasını al
oc get secret flowfish-reader-token -n flowfish -o jsonpath='{.data.ca\.crt}' | base64 -d┌──────────────────┐ ┌──────────────────┐
│ Flowfish │ gRPC:16060 │ Remote │
│ Ingestion │ ──────────────────────►│ Inspector │
│ Service │ (LoadBalancer) │ Gadget │
└──────────────────┘ └──────────────────┘
# Remote cluster'da Inspector Gadget için NetworkPolicy
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-flowfish-ingress
namespace: flowfish
spec:
podSelector:
matchLabels:
app: inspektor-gadget
ingress:
- from:
- ipBlock:
cidr: 10.0.0.0/8 # Flowfish internal cluster IP range
ports:
- protocol: TCP
port: 16060# Yeni Fernet key oluştur
python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"apiVersion: v1
kind: Secret
metadata:
name: flowfish-encryption-key
namespace: flowfish
type: Opaque
stringData:
FLOWFISH_ENCRYPTION_KEY: "your-generated-fernet-key-here"env:
- name: FLOWFISH_ENCRYPTION_KEY
valueFrom:
secretKeyRef:
name: flowfish-encryption-key
key: FLOWFISH_ENCRYPTION_KEY| Prensip | Uygulama |
|---|---|
| Least Privilege | Sadece gerekli minimum yetkiler |
| Read-Only | GET, LIST, WATCH - CREATE/UPDATE/DELETE yok |
| Namespace Scoped | Mümkünse ClusterRole yerine Role kullan |
| Audit Trail | Tüm erişimler loglanır |
| Kaynak | get | list | watch | create | update | delete |
|---|---|---|---|---|---|---|
| pods | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
| nodes | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
| namespaces | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
| deployments | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
| traces | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
-
FLOWFISH_ENCRYPTION_KEYenvironment variable ayarlandı - Remote cluster için read-only ServiceAccount oluşturuldu
- CA sertifikası yapılandırıldı (skip_tls_verify = false)
- NetworkPolicy'ler uygulandı
- Token süresi uygun (önerilen: 90 gün, max: 1 yıl)
- Audit logging aktif
| Görev | Sıklık |
|---|---|
| Token rotasyonu | Her 90 gün |
| RBAC audit | Aylık |
| CA sertifikası yenileme | Sertifika süresine göre |
| Güvenlik log incelemesi | Haftalık |
SSL: CERTIFICATE_VERIFY_FAILED
Çözüm: CA sertifikasını kontrol edin veya yeniden indirin.
403 Forbidden - User cannot list resource
Çözüm: ClusterRoleBinding'in doğru namespace ve ServiceAccount'a bağlı olduğunu kontrol edin.
401 Unauthorized - Token expired
Çözüm: Yeni token oluşturun:
oc create token flowfish-remote-reader -n flowfish --duration=2160hGüvenlik açıkları için: security@flowfish.io