Gizli bilgilerin güvenli bir şekilde yönetilmesi, modern Kubernetes tabanlı altyapılarda büyük bir gerekliliktir. HashiCorp Vault, bu bilgileri korumanıza, erişim kontrolü sağlamanıza ve hassas verileri güvenli bir şekilde paylaşmanıza yardımcı olan güçlü bir araçtır. Bu yazıda Vault’un Docker Compose üzerinde kurulumu, Nginx ile ters proxy yapılandırması ve Kubernetes ile entegrasyonu detaylı bir şekilde ele alınacaktır.
1. Kullanılacak Değişkenler
Vault ve Kubernetes entegrasyonu sırasında kullanılacak değişkenler şu şekilde tanımlanmalıdır:
# Vault politikası ve rol isimleri
export VAULT_POLICY_NAME="secure-policy"
export VAULT_ROLE_NAME="secure-role"
# Vault Kubernetes kimlik doğrulama path’i
export VAULT_KUBERNETES_AUTH_PATH="kube-auth-path"
# Kubernetes API Server adresi
export KUBE_HOST="https://$(kubectl get endpoints kubernetes -o jsonpath='{.subsets[0].addresses[0].ip}'):6443"
# Vault için kullanılacak Kubernetes Service Account ve Namespace
export VAULT_AUTH_KUBE_SERVICE_ACCOUNT="vault-service-account"
export VAULT_AUTH_KUBE_NAMESPACE="vault-namespace"
2. Vault Kurulumu
Vault’u Docker üzerinde çalıştırarak sisteminizi hızlı bir şekilde kurabilirsiniz.
2.1 Vault Dizini Hazırlama
Vault için gerekli dizinleri oluşturup gerekli izinleri ayarlayın:
mkdir -p /opt/vault/config /opt/vault/data
sudo chown -R 1000:1000 /opt/vault
sudo chmod 755 /opt/vault
2.2 Docker Compose Dosyası
Vault’u çalıştırmak için aşağıdaki docker-compose.yaml
dosyasını oluşturun:
version: '3.8'
services:
vault:
image: hashicorp/vault:1.18.1
container_name: vault
restart: always
ports:
- "127.0.0.1:8200:8200"
environment:
VAULT_ADDR: http://0.0.0.0:8200
VAULT_API_ADDR: http://127.0.0.1:8200
volumes:
- /opt/vault/config:/vault/config
- /opt/vault/data:/vault/data
command: vault server -config=/vault/config/vault.hcl
cap_add:
- IPC_LOCK
networks:
vault-net:
driver: bridge
2.3 Vault Konfigürasyonu
Vault’un ayarlarını /opt/vault/config/vault.hcl
dosyasına ekleyin:
storage "raft" {
path = "/vault/data"
node_id = "node1"
}
listener "tcp" {
address = "0.0.0.0:8200"
tls_disable = 1
}
api_addr = "http://127.0.0.1:8200"
cluster_addr = "http://127.0.0.1:8201"
ui = true
2.4 Vault’u Başlatma
Vault’u Docker Compose ile çalıştırın:
docker compose -f /opt/vault/docker-compose.yaml up -d
Vault konteynerine bağlanarak Vault’u başlatın:
docker exec -it vault sh
vault operator init
vault operator unseal
3. Nginx ile Ters Proxy Yapılandırması
Vault’u dış erişime açmak için Nginx yapılandırması gereklidir.
3.1 Nginx Konfigürasyonu
Vault için bir Nginx yapılandırması oluşturun:
nano /etc/nginx/sites-available/vault.conf
İçeriği şu şekilde yapılandırın:
server {
listen 443 ssl;
server_name vault.example.com;
location / {
proxy_pass http://127.0.0.1:8200;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
access_log /var/log/nginx/vault-access.log;
error_log /var/log/nginx/vault-error.log;
}
server {
listen 80;
server_name vault.example.com;
return 301 https://$host$request_uri;
}
Konfigürasyonu etkinleştirin ve Nginx servisini yeniden başlatın:
ln -s /etc/nginx/sites-available/vault.conf /etc/nginx/sites-enabled/
systemctl restart nginx
4. Vault Client ve Kubernetes Entegrasyonu
4.1 Vault Client Kurulumu
Vault client’ını Kubernetes master node üzerine kurun:
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update
sudo apt install -y vault=1.18.1-1
Vault adresini tanımlayın:
echo "127.0.0.1 vault.example.com" >> /etc/hosts
export VAULT_ADDR="https://vault.example.com"
vault login
4.2 Kubernetes Auth Yöntemini Etkinleştirme
Vault üzerinde Kubernetes kimlik doğrulama yöntemini etkinleştirin:
vault auth enable --path="$VAULT_KUBERNETES_AUTH_PATH" kubernetes
vault secrets enable -path=secret kv-v2
vault kv put secret/dev/app-config API_KEY="secure-api-key"
4.3 Kubernetes ile Vault Entegrasyonu
Namespace ve Service Account oluşturun:
kubectl create namespace $VAULT_AUTH_KUBE_NAMESPACE
kubectl create serviceaccount $VAULT_AUTH_KUBE_SERVICE_ACCOUNT -n $VAULT_AUTH_KUBE_NAMESPACE
RBAC yapılandırması ve token ayarlarını yapılandırın:
kubectl apply -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: role-tokenreview-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:auth-delegator
subjects:
- kind: ServiceAccount
name: $VAULT_AUTH_KUBE_SERVICE_ACCOUNT
namespace: $VAULT_AUTH_KUBE_NAMESPACE
EOF
Token bilgilerini alın ve Vault ile entegrasyonu tamamlayın:
TOKEN_REVIEW_JWT=$(kubectl get secret $(kubectl get secrets -n $VAULT_AUTH_KUBE_NAMESPACE | grep $VAULT_AUTH_KUBE_SERVICE_ACCOUNT | awk '{print $1}') -n $VAULT_AUTH_KUBE_NAMESPACE -o jsonpath="{.data.token}" | base64 --decode)
KUBE_CA_CERT=$(kubectl get secret $(kubectl get secrets -n kube-system | grep kubernetes | awk '{print $1}') -n kube-system -o jsonpath="{.data['ca\.crt']}")
vault write auth/$VAULT_KUBERNETES_AUTH_PATH/config \
token_reviewer_jwt="$TOKEN_REVIEW_JWT" \
kubernetes_host="$KUBE_HOST" \
kubernetes_ca_cert="$KUBE_CA_CERT"
5. Vault Policy ve Role Ayarları
Vault’ta politika ve rol oluşturun:
vault policy write $VAULT_POLICY_NAME - <<EOF
path "secret/data/dev/*" {
capabilities = ["read"]
}
EOF
vault write auth/$VAULT_KUBERNETES_AUTH_PATH/role/$VAULT_ROLE_NAME \
bound_service_account_names=$VAULT_AUTH_KUBE_SERVICE_ACCOUNT \
bound_service_account_namespaces=$VAULT_AUTH_KUBE_NAMESPACE \
policies=$VAULT_POLICY_NAME \
ttl=24h
6. Test ve Doğrulama
Pod üzerinden gizli bilgilere erişimi test edin:
apiVersion: v1
kind: Pod
metadata:
name: example-pod
namespace: vault-namespace
annotations:
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/role: "$VAULT_ROLE_NAME"
vault.hashicorp.com/agent-inject-secret-.env: "secret/data/dev/app-config"
spec:
serviceAccountName: vault-service-account
containers:
- name: example-container
image: nginx
Pod’u oluşturup gizli bilgileri doğrulayın:
kubectl exec -it example-pod -n $VAULT_AUTH_KUBE_NAMESPACE -- cat /vault/secrets/.env
Bu rehber, HashiCorp Vault’un Docker üzerinde kurulumu, Nginx ile ters proxy yapılandırması ve Kubernetes ile entegrasyonunu kapsamaktadır. Adımları dikkatle takip ederek sisteminizde güvenli bir şekilde gizli bilgileri yönetebilirsiniz. Vault’un sunduğu bu güçlü entegrasyonlar, altyapınızın güvenliğini ve esnekliğini artırır.