Vault Notlarım
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 = truestorage "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