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.