Merhaba MMOZirve Üyeleri
HashiCorp Vault’tan ve HashiCorp Vault’un Docker Compose ile kurulumu anlatacağım. Ayrıca key-value çiftlerinin nasıl oluşturulacağını ele alacağım.
HashiCorp Vault Nedir ?:
HashiCorp Vault, hassas verilerin (şifreler, API anahtarları, sertifikalar vb.) güvenli bir şekilde yönetilmesini sağlayan bir araçtır. Vault, bu tür verilerin merkezi bir depolama yerinde şifrelenmiş olarak saklanmasını ve gerektiğinde güvenli bir şekilde alınmasını sağlar. Vault, kimlik doğrulama, yetkilendirme ve denetim gibi güvenlik işlevlerini de sağlar, böylece hassas verilere sadece yetkilendirilmiş kullanıcılar erişebilir.
HashiCorp Vault’un Docker Compose ile kurulumu:
1 - AWS Ec2 da 80, 22 ve 8200 portlarının açık olduğu ve Linux işletim sistemi olan bir instance oluşturuyorum.

2 - Oluşturduğum sunucuya ssh ile bağlanıp Docker ve Docker-compose yüklüyorum.
Kod:


2 - Hashicorb Vault kurulumu için gerekli olan klasör ve dosya düzenlemelerini yapıyorum . Bulunduğum dizinde vault adında bir klasör oluşturuyorum ve içine giriyorum burada docker-compose dosyamı oluşturuyorum daha sonra bulunduğum dizinde config ve file adında iki klasör oluşturdum. config klasörü, Vault’un yapılandırma dosyalarını içermektedir. file klasörü ise Vault tarafından oluşturulan verileri saklamaktadır. Daha sonra config klasörünün içersine girip touch config.json adında Vault'un yapılandırma ayarlarını içeren JSON dosyası oluşturdum. Bu dosya, Vault’un nasıl yapılandırılacağını ve çalışacağını belirleyen parametreleri içermektedir.
Kod:

3- /home/ec2-user/vault dizininde bulunan docker-compose dosyasını yazalım.

Kod:
Yukarıdaki yml da ek olarak volume de oluşturdum container içersindeki file’ı bağlamak için, o örneğide göstermek istedim.

Bu docker-compose.yml açıklayalım :
image: hashicorp/vault:latest: Vault konteynerinin kullanacağı imajı belirtir. HashiCorp Vault'un en son sürümünü kullanır.
container_name: vault: Oluşturulacak konteynerin adını belirtir.ports: - "8200:8200": Vault servisinin dış dünyaya açılacak portunu belirtir.entrypoint: vault server -config=/vault/config/config.json: Vault konteyneri başlatıldığında çalıştırılacak komutu belirtir. Bu komut, Vault sunucusunu başlatırken kullanılacak yapılandırma dosyasının yolunu belirtir.environment: VAULT_ADDR: http://127.0.0.1:8200: Vault konteyneri için ortam değişkenleri tanımlar. Vault'un adresini belirtir.cap_add: - IPC_LOCK: Vault konteynerinin yetkilerini belirtir. Bu durumda, IPC_LOCK yetkisi eklenir.volumes: - vault-v1:/vault/file:rw: Vault konteyneri içindeki dosyaları saklamak için bir Docker volume tanımlar. Bu volume, "vault-v1" adıyla tanımlanmış ve Vault içindeki "/vault/file" yoluna bağlanmıştır.- ./vault/file:/vault/file:rw: Vault servisinin kullanacağı dosyaları lokaldeki bir klasöre monte eder. Bu durumda, "vault/file" klasörü "vault" servisi içindeki "/vault/file" yoluna monte edilmiştir.- ./vault/config:/vault/config:rw: Vault servisinin yapılandırma dosyalarını lokaldeki bir klasöre monte eder. Bu durumda, "vault/config" klasörü "vault" servisi içindeki "/vault/config" yoluna monte edilmiştir.networks: - vault_default: Vault servisinin hangi ağda çalışacağını belirtir. Bu durumda, "vault_default" adındaki ağı kullanır.restart: always: Vault servisinin yeniden başlatılmasını belirtir. Her zaman yeniden başlatılmasını sağlar.volumes: vault-v1:: Docker volume tanımıdır. networks: vault_default: external: true: Vault servisinin hangi ağda bulunacağını belirtir. "vault_default" adındaki ağı kullanır ve bu ağın dışarıdan oluşturulduğunu belirtir.
4- vault/vault/config yolundaki config.json dosyasını yazalım. Buradaki api_addr kısmına oluşturduğumuz instance’daki public ip ve 8200 portunu yazacağız.
Kod:
config.json dosyasını açıklayalım :
"backend": Vault'un arka uç (backend) depolama sistemini belirtir. Bu durumda, Vault'un dosya tabanlı backend'i seçilmiştir."file": Arka uç depolama sistemi olarak dosya tabanlı bir depolama kullanıldığını belirtir."path": "vault/file": Dosyaların saklanacağı yolu belirtir. Bu durumda, Vault'un içindeki "/vault/file" dizinine yazılacaktır."listener": Vault'un dinleme yapılandırmasını belirtir. Vault, dış istekleri dinlemek ve işlemek için bir dinleyiciye ihtiyaç duyar."tcp": Vault'un TCP dinleyicisini belirtir. TCP dinleyicisi, Vault'un dış istekleri dinlemek için TCP protokolünü kullanmasını sağlar."address": "0.0.0.0:8200": Vault'un dinleme adresini ve portunu belirtir. Bu durumda, Vault dış istekleri "0.0.0.0" adresi ve 8200 numaralı port üzerinden dinler."tls_disable": 1: Transport Layer Security (TLS) şifreleme protokolünün devre dışı bırakıldığını belirtir. Bu durumda, Vault dış istekleri şifreleme kullanmadan kabul eder."default_lease_ttl": "168h": Varsayılan geçerlilik süresini belirtir. Bu durumda, varsayılan geçerlilik süresi 168 saat (7 gün) olarak belirlenmiştir."max_lease_ttl": "0h": Maksimum geçerlilik süresini belirtir. Bu durumda, maksimum geçerlilik süresi sınırsız olarak belirlenmiştir bir diğer değişle Vault tarafından oluşturulan sırlar ve kimlik doğrulama belgeleri için maksimum geçerlilik süresi yoktur. Bu, öğelerin sonsuza kadar geçerli olacağı anlamına gelir. "ui": true: Vault'un kullanıcı arabiriminin (UI) etkin olduğunu belirtir. Bu durumda, Vault'un UI'si etkinleştirilmiştir."log_level": "Debug": Günlük seviyesini belirtir. Bu durumda, hata ayıklama (debug) seviyesinde günlük tutulur."api_addr": "http://54.83.225.82:8200": Vault'un API adresini belirtir. Bu, Vault'a yönelik API isteklerinin yapıldığı adresi belirtir. Bu durumda, Vault API'si "http://54.83.225.82:8200" adresinden erişilebilir.
5- Docker Compose dosyasında, external: true ifadesi ile vault_default adındaki ağın dışarıdan oluşturulduğu belirtmiştik şimdi bu ağı aluşturalım.
Kod:


Kod:

7- Vault arayzümüze insance public ip ve 8200 portu ile gidelim. http://54.83.225.82:8200" . Vault sunucusunu başlatacağız. Unseal işlemini buradanda yapabiliriz ben terminalden ilerleyeceğim.

8- Aşağıdaki Docker komutu ile, Vault sunucusunu başlatacağız ve bize bir anahtar bir token oluşturacak istersek bunların sayısını arttırabiliriz. Key ve tokenı bir yere not almayı unutmayın. Kod:

9- Vault sunucusunu etkinleştirmek için unseal komutunu kullanacağız (key ile birlikte) ve ardından token komutu ile vault’a login olacağız (hvs ile başlayan token ile).
Kod:

Key-Value Çiftlerinin Oluşturulması:
1- Vaultta bulunan secretleri listeleyelim.
Kod:

2- Vaultta secret olşturalım ve saklayalım.
İlk enable komut ile Vault sunucusunda bir sırrı (secret) saklamak için kullanacağımız bir kv (key-value) yolunu etkinleştirelim. -path=secret: Saklanacak sırların hangi yol altında saklanacağını belirten bir parametredir istediğiniz ismi verebilirsiniz. Ben secret adında bir yol altında sırları saklaak istedim. kv-v2: Bu, saklanacak sırların türünü belirten bir parametredir. Bu durumda, kv-v2 olarak belirlenmiş, sırların key-value (anahtar-değer) çiftleri olarak saklanacağı belirtilmiştir.
Sonrasında put komutu ile yeni bir secreti, etkinleştirdiğimiz kv’ye path belirterek ekleyelim.
Vault sunucusundan oluşturduğumuz sırrı (secret) get komutu ile alalım.
Kod:

Rehber faydalı olduysa yorumlamanızı rica ederim değerli MMOZirve üyeleri teşekkür ederim saygılarımla .
HashiCorp Vault’tan ve HashiCorp Vault’un Docker Compose ile kurulumu anlatacağım. Ayrıca key-value çiftlerinin nasıl oluşturulacağını ele alacağım.
HashiCorp Vault Nedir ?:
HashiCorp Vault, hassas verilerin (şifreler, API anahtarları, sertifikalar vb.) güvenli bir şekilde yönetilmesini sağlayan bir araçtır. Vault, bu tür verilerin merkezi bir depolama yerinde şifrelenmiş olarak saklanmasını ve gerektiğinde güvenli bir şekilde alınmasını sağlar. Vault, kimlik doğrulama, yetkilendirme ve denetim gibi güvenlik işlevlerini de sağlar, böylece hassas verilere sadece yetkilendirilmiş kullanıcılar erişebilir.
HashiCorp Vault’un Docker Compose ile kurulumu:
1 - AWS Ec2 da 80, 22 ve 8200 portlarının açık olduğu ve Linux işletim sistemi olan bir instance oluşturuyorum.

2 - Oluşturduğum sunucuya ssh ile bağlanıp Docker ve Docker-compose yüklüyorum.
Kod:
sudo yum update -y
sudo yum install docker -y
sudo systemctl start docker
sudo systemctl enable docker
sudo systemctl status docker
sudo usermod -a -G docker ec2-user
sudo newgrp docker
docker version
sudo curl -SL https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version


2 - Hashicorb Vault kurulumu için gerekli olan klasör ve dosya düzenlemelerini yapıyorum . Bulunduğum dizinde vault adında bir klasör oluşturuyorum ve içine giriyorum burada docker-compose dosyamı oluşturuyorum daha sonra bulunduğum dizinde config ve file adında iki klasör oluşturdum. config klasörü, Vault’un yapılandırma dosyalarını içermektedir. file klasörü ise Vault tarafından oluşturulan verileri saklamaktadır. Daha sonra config klasörünün içersine girip touch config.json adında Vault'un yapılandırma ayarlarını içeren JSON dosyası oluşturdum. Bu dosya, Vault’un nasıl yapılandırılacağını ve çalışacağını belirleyen parametreleri içermektedir.
Kod:
mkdir vault
cd vault
touch docker-compose.yml
ls -alrth
mkdir vault
cd vault
mkdir config file
ls -lrth
cd config
touch config.json
ls -lrth

3- /home/ec2-user/vault dizininde bulunan docker-compose dosyasını yazalım.

Kod:
version: '3.6'
services:
vault:
image: hashicorp/vault:latest
container_name: vault
ports:
- "8200:8200"
entrypoint: vault server -config=/vault/config/config.json
environment:
VAULT_ADDR: http://127.0.0.1:8200
cap_add:
- IPC_LOCK
volumes:
- vault-v1:/vault/file:rw
- ./vault/file:/vault/file:rw
- ./vault/config:/vault/config:rw
networks:
- vault_default
restart: always
volumes:
vault-v1:
networks:
vault_default:
external: true
Yukarıdaki yml da ek olarak volume de oluşturdum container içersindeki file’ı bağlamak için, o örneğide göstermek istedim.

Bu docker-compose.yml açıklayalım :
image: hashicorp/vault:latest: Vault konteynerinin kullanacağı imajı belirtir. HashiCorp Vault'un en son sürümünü kullanır.
container_name: vault: Oluşturulacak konteynerin adını belirtir.ports: - "8200:8200": Vault servisinin dış dünyaya açılacak portunu belirtir.entrypoint: vault server -config=/vault/config/config.json: Vault konteyneri başlatıldığında çalıştırılacak komutu belirtir. Bu komut, Vault sunucusunu başlatırken kullanılacak yapılandırma dosyasının yolunu belirtir.environment: VAULT_ADDR: http://127.0.0.1:8200: Vault konteyneri için ortam değişkenleri tanımlar. Vault'un adresini belirtir.cap_add: - IPC_LOCK: Vault konteynerinin yetkilerini belirtir. Bu durumda, IPC_LOCK yetkisi eklenir.volumes: - vault-v1:/vault/file:rw: Vault konteyneri içindeki dosyaları saklamak için bir Docker volume tanımlar. Bu volume, "vault-v1" adıyla tanımlanmış ve Vault içindeki "/vault/file" yoluna bağlanmıştır.- ./vault/file:/vault/file:rw: Vault servisinin kullanacağı dosyaları lokaldeki bir klasöre monte eder. Bu durumda, "vault/file" klasörü "vault" servisi içindeki "/vault/file" yoluna monte edilmiştir.- ./vault/config:/vault/config:rw: Vault servisinin yapılandırma dosyalarını lokaldeki bir klasöre monte eder. Bu durumda, "vault/config" klasörü "vault" servisi içindeki "/vault/config" yoluna monte edilmiştir.networks: - vault_default: Vault servisinin hangi ağda çalışacağını belirtir. Bu durumda, "vault_default" adındaki ağı kullanır.restart: always: Vault servisinin yeniden başlatılmasını belirtir. Her zaman yeniden başlatılmasını sağlar.volumes: vault-v1:: Docker volume tanımıdır. networks: vault_default: external: true: Vault servisinin hangi ağda bulunacağını belirtir. "vault_default" adındaki ağı kullanır ve bu ağın dışarıdan oluşturulduğunu belirtir.
4- vault/vault/config yolundaki config.json dosyasını yazalım. Buradaki api_addr kısmına oluşturduğumuz instance’daki public ip ve 8200 portunu yazacağız.
Kod:
{
"backend":{
"file":{
"path":"vault/file"
}
},
"listener":{
"tcp":{
"address":"0.0.0.0:8200",
"tls_disable":1
}
},
"default_lease_ttl":"168h",
"max_lease_ttl":"0h",
"ui":true,
"log_level":"Debug",
"api_addr": "http://54.83.225.82:8200"
}

config.json dosyasını açıklayalım :
"backend": Vault'un arka uç (backend) depolama sistemini belirtir. Bu durumda, Vault'un dosya tabanlı backend'i seçilmiştir."file": Arka uç depolama sistemi olarak dosya tabanlı bir depolama kullanıldığını belirtir."path": "vault/file": Dosyaların saklanacağı yolu belirtir. Bu durumda, Vault'un içindeki "/vault/file" dizinine yazılacaktır."listener": Vault'un dinleme yapılandırmasını belirtir. Vault, dış istekleri dinlemek ve işlemek için bir dinleyiciye ihtiyaç duyar."tcp": Vault'un TCP dinleyicisini belirtir. TCP dinleyicisi, Vault'un dış istekleri dinlemek için TCP protokolünü kullanmasını sağlar."address": "0.0.0.0:8200": Vault'un dinleme adresini ve portunu belirtir. Bu durumda, Vault dış istekleri "0.0.0.0" adresi ve 8200 numaralı port üzerinden dinler."tls_disable": 1: Transport Layer Security (TLS) şifreleme protokolünün devre dışı bırakıldığını belirtir. Bu durumda, Vault dış istekleri şifreleme kullanmadan kabul eder."default_lease_ttl": "168h": Varsayılan geçerlilik süresini belirtir. Bu durumda, varsayılan geçerlilik süresi 168 saat (7 gün) olarak belirlenmiştir."max_lease_ttl": "0h": Maksimum geçerlilik süresini belirtir. Bu durumda, maksimum geçerlilik süresi sınırsız olarak belirlenmiştir bir diğer değişle Vault tarafından oluşturulan sırlar ve kimlik doğrulama belgeleri için maksimum geçerlilik süresi yoktur. Bu, öğelerin sonsuza kadar geçerli olacağı anlamına gelir. "ui": true: Vault'un kullanıcı arabiriminin (UI) etkin olduğunu belirtir. Bu durumda, Vault'un UI'si etkinleştirilmiştir."log_level": "Debug": Günlük seviyesini belirtir. Bu durumda, hata ayıklama (debug) seviyesinde günlük tutulur."api_addr": "http://54.83.225.82:8200": Vault'un API adresini belirtir. Bu, Vault'a yönelik API isteklerinin yapıldığı adresi belirtir. Bu durumda, Vault API'si "http://54.83.225.82:8200" adresinden erişilebilir.
5- Docker Compose dosyasında, external: true ifadesi ile vault_default adındaki ağın dışarıdan oluşturulduğu belirtmiştik şimdi bu ağı aluşturalım.
Kod:
docker network create --driver=bridge --subnet=172.12.0.0/16 --gateway=172.12.0.1 vault_default
docker network ls
docker network inspect vault_default


Kod:
6- docker-compose.yml dosyasının bulunduğu dizine gelerek docker-compose.yml ı çalıştıralım.
docker-compose up --build –d
docker volume ls
docker ps

7- Vault arayzümüze insance public ip ve 8200 portu ile gidelim. http://54.83.225.82:8200" . Vault sunucusunu başlatacağız. Unseal işlemini buradanda yapabiliriz ben terminalden ilerleyeceğim.

8- Aşağıdaki Docker komutu ile, Vault sunucusunu başlatacağız ve bize bir anahtar bir token oluşturacak istersek bunların sayısını arttırabiliriz. Key ve tokenı bir yere not almayı unutmayın. Kod:
docker exec -it vault vault operator init -n 1 -t 1

9- Vault sunucusunu etkinleştirmek için unseal komutunu kullanacağız (key ile birlikte) ve ardından token komutu ile vault’a login olacağız (hvs ile başlayan token ile).
Kod:
docker exec -it vault vault operator unseal xxqgrmmB2PkI9nA+cvpcYD+FjK5iQFkXAwWZgL5CcZk=
docker exec -it vault vault login hvs.lK6JjW6N2loQGuz3CO3xk7ZD

Key-Value Çiftlerinin Oluşturulması:
1- Vaultta bulunan secretleri listeleyelim.
Kod:
docker exec -it vault vault secrets list

2- Vaultta secret olşturalım ve saklayalım.
İlk enable komut ile Vault sunucusunda bir sırrı (secret) saklamak için kullanacağımız bir kv (key-value) yolunu etkinleştirelim. -path=secret: Saklanacak sırların hangi yol altında saklanacağını belirten bir parametredir istediğiniz ismi verebilirsiniz. Ben secret adında bir yol altında sırları saklaak istedim. kv-v2: Bu, saklanacak sırların türünü belirten bir parametredir. Bu durumda, kv-v2 olarak belirlenmiş, sırların key-value (anahtar-değer) çiftleri olarak saklanacağı belirtilmiştir.
Sonrasında put komutu ile yeni bir secreti, etkinleştirdiğimiz kv’ye path belirterek ekleyelim.
Vault sunucusundan oluşturduğumuz sırrı (secret) get komutu ile alalım.
Kod:
docker exec -it vault vault secrets enable -path=secret kv-v2
docker exec -it vault vault kv put secret/database/config username="db-readonly-username" password="db-secret-password"
docker exec -it vault vault kv get secret/database/config

Rehber faydalı olduysa yorumlamanızı rica ederim değerli MMOZirve üyeleri teşekkür ederim saygılarımla .


