Vault Notlarım

Arif KIZILTEPE
8 min readJul 29, 2022

--

Vault Nedir?

  • Şifre ve özel bilgileri saklamak ve yönetmek için kullanılır.
  • Kişiler, uygulamalar veya makinalar için ortak bir alan olarak çalışır.
  • Saklanan dataların yaşam döngüsünü yönetmek için kullanılır.
  • Saklanan veriler için erişim yetkileri atanmasını sağlar.

Kısaca 3 maddede vault nedir kısmını anlatmaya çalıştım. Hikayesel anlatımı ise şöyle örneğin bizim php ile yazılmış projemiz var environment bilgilerini .env dosyasından alıyoruz. Bu yöntem çok sık kullanılsa da güvenlik yönünden bazı sorunlar çıkartabilir. Vault bize secretların saklanmasını ve api desteği ile bunlara erişilmesini sağlıyor.

Vault Nasıl Çalışır?

Sunucu root şifreleri, uygulama admin bilgilileri, wildcard sertifikamızın key dosyasını, uygulamarımızda kullandığımız token bilgileri gibi yüzlerce bilgileri biz vault üzerine aldık. System ve yazılım ekiplerinin bu bilgilere erişmesi gerekiyor. Burada öncelikle policy tanımları ve grup tanımları yapılarak dataların yetkisiz kişiler tarafından görüntülenmesi engellenir. Kısacası vault ACL tanımları ile data yetkilendirmesi yapmayı sağlar. Aslında burada daha net anlaşılması için vault uygulamasını bir otele benzetirler. Otelde yüzlerce farklı yer(data) ve birden fazla giriş noktası(method) bulunur. Siz otele giriş yaparken rezervasyonunuzu doğrulayarak bir kart alır ve otele giriş yaparsınız. Aslında bu kart sizin nerelere erişebileceğinizi belirler. Kendi odanıza giriş yapabilir, spor salonunu kullanabilir ama spa hizmetini kullanmanıza izin vermeyebilir. Vault da aynı şekilde erişim sağlarken kullandığımız (token,userid,secret vs) yetkilerine göre istediğimiz dataya istediğimiz method ile erişebiliriz.

Dynamic Credential → Vault ile datalara erişim sağlarken static credential yerine dynamic credential kullanabiliriz. Bu özellik bize oluşturduğumuz secret için belirli bir yaşam döngüsü belirlememize sağlar.

Automate x.509 Certificates → Vault ile certifikalarımızı da saklayabileceğimizi söylemiştim. Sadece saklama değil oluşturduğumuz csr dosyasını vault’a göndererek sertifika ve key oluşturabiliriz.

Migrate to Identity-Based Access →

Vault Components

  • Storage Backends
  • Secret Engines
  • Authentication Methods
  • Audit Devices

Vault dataları saklarken Encryption key ile şifrelerek saklar. Bu encryption key ise master key ile şifrelenerek memory içerisinde tutulur.

Vault ilk çalışmaya başladığı zaman sealed state çalışır. Yani datalara erişemezsiniz. Clear-text erişmek için unsealed state durumuna almanız gerekir. Bu işlem aslında yukarıda bahsettiğim master key ile şifrelenmiş encryption key oluşturulup memory’ye yazılmasıdır.

UnSeal Methodları

Unsealing with Key Shards(Default) : Bu yöntem master key ve vault ekosistemini daha güvenli hale getirmek için kullanılır. Unseal işlemi için biz master key’i belirlediğimiz sayıya böler ve minimum gereksinimi belirleyerek unseal yaparken belirlediğimiz minimum key ile işlemi yaparız. Kurulum adımında bu değerleri belirleyeceğiz. Bu şekilde farklı yöneticiler bir araya gelerek bu unseal işlemini yapabilir durumda olur.

Kurulumu yapmadık ama bu işlemi yapmak için aşağıdaki komut çalıştırılır.

vault operator init

Bu bize 5 Shares 3 Threshold bir cluster oluşturacaktır. Yani 5 tane unseal işlemi için gerekli key ve bunlardan en az 3 tanesi ile unseal edilecek bir yapı.

vault operator unseal

Yukarıdaki komut ile unseal işlemi başlatılır. 3 Threshold belirlediğimiz için 3 kere bu komutu çalıştırıp bize verilen 5 key içerisinde 3 farklı key yazılmalıdır.

Vault cluster unseal olduktan sonra login olup dataları kontrol edebiliriz.

vault login ROOTTOKENvault secrets list

Unsealing with Auto Unseal: Bir sebep ile vault cluster restart olduğunda key shards default method olduğu için sistem seal olarak açılacaktır. Bunu önlemek için unseal işlemini otomatik hale getirebiliriz. Bu işlem hem aws kms ile hem de HSM modulu ile yapılabilmektedir.

Unsealing with Transit Auto Unseal : Unseal işlemi için farklı bir vault cluster kullanma yöntemdir.

Install Vault

Kurulum için ben Debian ve Package Manager yöntemini kullanıyorum. Kurulum için aşağıdaki komutlar çalıştırılır.

sudo apt update && sudo apt install gpgwget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg >/dev/nullgpg --no-default-keyring --keyring /usr/share/keyrings/hashicorp-archive-keyring.gpg --fingerprintecho "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.listsudo apt update && sudo apt install vault

Kurulum işlemi tamamlandıktan sonra initialize işlemi yapılır. Burada verilen shared key vs root key bilgilerini mutlaka saklayın.

vault operator init

Vault uygulamasının ayarları /etc/vault.d/vault.hcl altında bulunmaktadır.

# Full configuration options can be found at https://www.vaultproject.io/docs/configurationui = true#mlock = true
#disable_mlock = true
storage "file" {
path = "/var/vault/data"
}
#storage "consul" {
# address = "127.0.0.1:8500"
# path = "vault"
#}
# HTTP listener
#listener "tcp" {
# address = "0.0.0.0:8200"
# tls_disable = 1
#}
# HTTPS listener
listener "tcp" {
address = "0.0.0.0:8200"
tls_cert_file = "/opt/vault/ssl/xxxxx.crt"
tls_key_file = "/opt/vault/ssl/xxxxx.key"
tls_client_ca_file = "/home/arif/xxxxx.ca-bundle"
tls_require_and_verify_client_cert= "false"
}
# Enterprise license_path
# This will be required for enterprise as of v1.8
#license_path = "/etc/vault.d/vault.hclic"
# Example AWS KMS auto unseal
#seal "awskms" {
# region = "us-east-1"
# kms_key_id = "REPLACE-ME"
#}
# Example HSM auto unseal
#seal "pkcs11" {
# lib = "/usr/vault/lib/libCryptoki2_64.so"
# slot = "0"
# pin = "AAAA-BBBB-CCCC-DDDD"
# key_label = "vault-hsm-key"
# hmac_key_label = "vault-hsm-hmac-key"
#}

Yukarıda gördüğünüz gibi ben UI ve HTTPS ayarlarını burada yaptım. Bu dosyadan ayarlarınızı kendi ortamınıza göre değiştirebilirsiniz.

Vault Authentication

Vault için birden fazla erişim yöntemi bulunmaktadır. Bunlardan en sık kullanılanları kısaca incelemek faydalı olacaktır. (Yapılacak işlemler CLI/UI/API ile yapılabilir. Ben CLI ile yapacağım.)

  • Token : Vault için default olan yöntemdir. Vault kurulumunda bize verilen root user token ile login olurken bu yöntemi kullanırız. Vault clusterda hangi erişim yönteminin aktif olduğunu görmek için aşağıdaki komutu çalıştrabiliriz.
vault auth list

Gördüğünüz gibi default olarak gelen token based authentication aktif durumda.

  • Auth : Klasik user/pass yöntemidir. Aktif etmek için şu komutu kullanabiliriz
vault auth enable userpassvault auth enable -path=arif -description"userpass" userpass # path ve desc ekleyerek aktif etmek içinvault auth list

Auth yöntemini açtık fakat biz bunun 6 saat aktif olmasını istiyorsak şu komutu kullanabiliriz.

vault auth tune -default-lease-ttl=24h userpass

Peki user nasıl ekleyeceğim? İşte böyle

vault write auth/userpass/users/arif password="ArifWasHere" policies=default#Kontrol etmek için.
vault list auth/userpass/users
vault readauth/userpass/users

Bir de login olmayı deneyelim.

vault login -method=userpass username=arif

AppRole : Genellikle uygulamalar yada sunucular için yöntemdir.

vault auth enable approle

Kullanıcı oluşturmak için.

vault write auth/approle/role/jenkins policy=root token_ttl=20m

Bu yöntemde login olurken RoleID ve SecretID bilgileri gereklidir. Bunlara erişmek için

vault read auth/approle/role/jenkins/role-idvault write -f auth/approle/role/jenkins/secret-id

Bu yöntem için login

vault write auth/approle/login role_id=$ROLEID secret_id=$SECRETID 

LDAP : Eklenecek….

Vault Policies

Kişilerin, uygulamaların yada makinaların vault üzerindeki datalarınıza erişim yetkilerinin tanımlandığı bölümdür.

vault policy list

Yukarıdaki komutu çalıştırdığınızda 2 tane policy göreceksiniz. Bunlar vault kurulumunda gelen ve silinemeyen policies. Şu komutla policy detaylarını görebilirsiniz.

vault policy read default

Vault içerisindeki tüm objeler path based bir yapıya sahiptir. Bu sebeple policy yazarken hangi path için ne yetkilerine sahip olacağını belirterek yazarım. Aşağıda HCL formatında yazılmış örnek bir policy var. Burada policy secret/teamb için sadece read yetkisine sahipken secret/teama için tüm yetkilere sahip. Eğer varsa secret altındaki diğer pathler için deny olarak yetkilendirilecektir. Policy’de belirtilmeyen tüm pathler deny olarka tanımlanır.

# Permit reading the "teamb" path under any top-level path under secret/
path "secret/teamb" {
capabilities = ["read"]
}
# Permit reading secret/foo/bar/teamb, secret/bar/foo/teamb, etc.
path "secret/+/+/teama" {
capabilities = ["create", "read", "update", "patch", "delete", "list"]
}

Oluşturalım

vault policy write my-policy /tmp/policy.hcl

Policy oluşturuldu ama bu tek başına bir anlam ifade etmez. Bu policy kişi, grup yada bir token’a entegre edilmesi gerekmektedir. Entegre edilen kişi, grup yada token sahip olacağı yetkileri bu şekilde almaktadır.

Vault üzerinde bazı pathler root protected olarak bulunurlar. Bu pathlerde işlem yapabilmek için sudo yetkisi verilmesi gerekir.

Örneğin biz root kullanıcı haricinde bir kullanıcı açtık ve bu kullanıcının manuel seal işlemi yapabilmesini istiyoruz. Bu durumda vault tarafından korunun bir path için sudo yetkisi vermemiz gerekiyor. Örnek bir policy şöyle.

path "sys/seal" {
capabilities = ["sudo"]
}

Vault Token

Biz vault uygulamasına Username/RoleID/TLS ile login olduğumuzda bizim için bir token üretilir. Daha sonrasında yapacağımız write, update, delete gibi işlemlerde bu token ile iletişim kurulur. Örnek olarak.

  • Login olduk bizim için bir token oluştu.
  • Update komutu gönderdik.
  • Vault token Valid/Not Expired / Has Permission detaylarına bakarak bu işlemi gerçekleştirir.

Yukarıdaki işlem haricinde vault authentication kısmında anlattığım gibi token generate ederek de direk işlem yapabiliriz.

Vault sisteminde 2 tip token tipi bulunuyor bunlar

  • Periodic Token : Kullanacağınız token belirli sürede revoked olması problem oluşturacak bir sistemde kullanılıyorsa periodic token yöntemi seçilebilir. Root ve sudo yetkisi ile tanımlanmış tokenlar genellikle bu yöntemi kullanır.
  • Service Token with Use Limits : Vault üzerinde yapacağımız işlemin tek bir işlem olduğunu düşünelim yani 1 data yazacağız ve sonrasında uygulamamız tekrar o token’ı kullanmayacak. Bu durum için use limit değeri verebiliriz. Bu durumda belirlediğimiz use limite ulaşınca token revoked olackatır.
  • Child Token : Oluşturduğumuz tokendan farklı ttl değerleri ve ek policyler ekleyerek bir token oluşturabildiğimiz token tipidir. Oluşturduğumuz token expire olursa child token da expire olur.
  • Orphan Token : Child token gibi benzer özelliklere sahip fakat, oluşturulan token expire olursa orphan token expire olmaz.
  • CIDR-Bound Token : Oluşturduğumuz token belirli bir host veya network içinde çalışmasını istiyorsan, oluşturacağımız token tipi budur.
  • Batch Token :

Token oluşturma

vault token create -ttl=5m -policy=jenkins

Token silme

vault token revoke hvs.aaaaaAOwN4rS56xxxxx

Token hakkında detaylı bilgi

vault token lookup hvs.aaaaaAOwN4rS56xxxxx

Token yetkileri

vault token capabilities hvs.aaaaaAOwN4rS56xxxxx

Token yenileme

vault token renew hvs.aaaaaAOwN4rS56xxxxx

Vault Secret Engines

Vault ekosisteminde Static, Dynamic ve Transit secret engine bulunur.

  • Dataları saklamai yeniden oluşturma ve şifrelem işlemini yapar.
  • Vault ekosisteminde izole path içerisinde çalışır.
  • Birden fazla secret engine aynı anda çalışabilir.
  • User/pass / TLS / CERT / API KEY / Credentials / Data / yada siz ne isterseniz saklayabilir.
  • Versiyonlama işlemi yapar.

Static Secret :

Saklanan secretların asla silinmemesi

Uzun süre saklanan secretların farklı uygulamalarda veya takımlarda kullanılarak paylaşılması

7/24 kullanımda olması

gibi durumlardan dolayı ne kadar gerekli olsada ilerleyen süreçte güvenlik problemi oluşturan bir secret modelidir.

Dynamic Secret :

İhtiyaç duyulduğunda yada belirli periyotlarda secret oluşturulur.

Her secret yaşam süresi vardır.

Dynamic secret static secret’ın eksi yönlerini tamamlayan bir secret modelidir.

Vault yukarıdaki şemadaki secretları saklamamıza olanak sağlar. Birkaç örnek yapacağız ben KV(Key/Value) tipini kullanacağım. Öncelikle kendime bir KV tipinde path açacağım.

vault secret enable -path=arif kv

Çalıştığım ortamda birden fazla database var ben bu database bilgilerini buraya yazacağım. Path içinde bir organizasyon yapısı oluşturmak istiyorum hem ilerleyen zamanda policy yanımlayarak farklı kişi veya ekiplere farklı subpath için yetki verebilirim. arif/database/xxx şeklinde kaydedeğim bilgileri.

vault kv put arif/app/db/local password=ArifWasHere user=root 

Cli’dan bu dataları kontrol etmek için

ovault kv get arif/app/db/local

Şifre değişti ben bunu update etmek istersem yine put ile aynı key adında göndermemiz yeterli olacaktır.

vault kv put arif/app/db/local password=ArifWasHereOld

--

--

No responses yet