Bir süredir kişisel ve iş hesaplarım için 1Password kullanıyordum. Ancak yıllık abonelik ücretinin sürekli artması ve verilerimin bir üçüncü tarafın sunucularında durması fikri beni rahatsız etmeye başlamıştı. Özellikle son zammın ardından, 1Password’a ayda ödediğim 5 doların aslında kendi kontrolümde olabilecek bir servise gitmesi yerine, kendim barındırabileceğim bir çözüme yönelmem gerektiğini düşündüm. Kendi VPS’imde zaten birçok servisimi barındırdığım için, şifre yöneticisi de bu listeye eklemeye karar verdim ve sonunda Vaultwarden’da karar kıldım.
Bu kararı vermemdeki en büyük etken, yıllık yaklaşık 60 dolarlık bir maliyetten kurtulup, şifrelerimin tam kontrolünü ele almaktı. Kendi sunucumda çalıştırdığım bir sistemin yedeklemesi, güvenliği ve erişimi tamamen benim sorumluluğumda oluyor. Böylece, hem bütçemden tasarruf ettim hem de hassas verilerimin nerede depolandığı konusunda içim rahat etti.
Vaultwarden Nedir ve Neden Kendi Çözümümü Kurdum?
Vaultwarden, açık kaynak kodlu Bitwarden şifre yöneticisinin Rust ile yazılmış hafif bir alternatifidir. Bitwarden API’si ile tamamen uyumlu çalışır, yani Bitwarden’ın resmi istemcilerini (web, masaüstü, mobil, tarayıcı eklentileri) kendi Vaultwarden sunucunuzla kullanabilirsiniz. Bu, benim için çok önemli bir avantajdı; yeni bir arayüze alışmak zorunda kalmayacaktım.
Kendi şifre kasamı kurmamın temel sebepleri arasında maliyet tasarrufu ve veri egemenliği vardı. Yıllık 60 dolarlık bir abonelik ücreti, özellikle birden fazla servisi kendi kendime barındırdığımda, önemli bir kalem haline geliyor. Ayrıca, kurumsal yazılım geliştirme tarafında yıllardır edindiğim tecrübelerle, verinin nerede ve kimin kontrolünde olduğunun ne kadar kritik olduğunu biliyorum. Bir üretim ERP’sinde bile, tedarik zinciri verilerinin güvenliği için katı politikalar uygularken, kişisel şifrelerimin başkasına emanet edilmesi bana pek mantıklı gelmiyordu. Kendi sunucumda Vaultwarden çalıştırarak, şifrelerimin şifreli bir şekilde sadece benim belirlediğim bir konumda durmasını sağladım.
Kurulum Öncesi Hazırlıklar: Temel Adımlar ve Bileşenler
Vaultwarden kurulumuna başlamadan önce birkaç temel bileşene ihtiyacım vardı. İlk olarak, bir adet Sanal Özel Sunucu (VPS) edindim. Bu VPS’in Ubuntu 22.04 LTS işletim sistemine sahip olması ve en az 1 CPU, 1 GB RAM ve 20 GB disk alanı sunması yeterliydi. Kendi kullandığım VPS sağlayıcımda bu konfigürasyon, aylık ortalama 5 dolar civarında bir maliyetle sunuluyor.
İkinci olarak, Vaultwarden’a internet üzerinden güvenli bir şekilde erişebilmek için bir adet alan adı (domain) ve bu alan adı için geçerli bir SSL sertifikası gerekiyordu. Kendi yan ürünlerimde kullandığım bir domain’in alt alan adını vault.alanadim.com olarak yapılandırmaya karar verdim. SSL sertifikası için Let’s Encrypt kullanacaktım, bu da ek bir maliyet getirmeyecekti. Son olarak, Docker ve Docker Compose kurulumu şarttı, çünkü Vaultwarden’ı container’lar içinde izole bir şekilde çalıştırmak hem dağıtım hem de bakım açısından büyük kolaylık sağlıyor.
Kurulum öncesi yaptığım son bir hazırlık da, sunucunun güvenlik duvarını (firewall) yapılandırmaktı. Sadece SSH (port 22), HTTP (port 80) ve HTTPS (port 443) portlarının dışarıdan erişime açık olmasını sağladım. Geri kalan tüm portları kapattım. Bu, sunucumun yüzey saldırı alanını minimuma indirgemek için kritik bir adımdı.
# İlk olarak sunucuyu güncelledim
sudo apt update && sudo apt upgrade -y
# Docker ve Docker Compose kurulumu
sudo apt install docker.io docker-compose -y
# Kullanıcıyı docker grubuna ekledim
sudo usermod -aG docker $USER
# Çıkış yapıp tekrar giriş yaparak değişikliğin etkili olmasını sağladım
# UFW (Uncomplicated Firewall) kurulumu ve yapılandırması
sudo apt install ufw -y
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw enable
Bu adımları tamamladıktan sonra, Vaultwarden’ın asıl kurulumuna geçmeye hazırdım. Bu ön hazırlıklar, benim gibi sistem yönetimi konusunda deneyimli biri için yaklaşık 10-15 dakikamı aldı, ancak yeni başlayanlar için biraz daha zaman alabilir.
Vaultwarden Kurulumu: Docker Compose ile Adım Adım
Vaultwarden’ı Docker Compose ile kurmak oldukça basit. Ana dizinimde vaultwarden adında bir klasör oluşturdum ve içine docker-compose.yml dosyamı yerleştirdim. Bu dosya, Vaultwarden servisini ve PostgreSQL veritabanını tanımlıyordu. SQLite de kullanabilirdim, ancak daha büyük ölçekli ve yönetilebilir çözümler için PostgreSQL’i tercih ettim. Kendi üretim ERP’sinde PostgreSQL 14+ kullandığım için, bu veritabanı ile daha rahatım.
docker-compose.yml içeriği şu şekildeydi:
version: '3'
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: always
environment:
# SMTP ayarları (e-posta bildirimleri ve şifre sıfırlama için)
# Eğer e-posta desteği istemiyorsanız bu satırları silebilirsiniz
# RAG ve prompt engineering kullandığım AI servislerimde bile e-posta bildirimleri kritik.
SIGNUPS_ALLOWED: "true" # İlk kurulumda kullanıcı kaydını açtım, sonra kapatacağım
WEBSOCKET_ENABLED: "true" # Bitwarden istemcileri için gerekli
DOMAIN: "https://vault.alanadim.com" # Kendi domain'imi buraya yazdım
ROCKET_TLS: "true" # Nginx proxy arkasında SSL kullandığım için
# DATABASE_URL: "postgresql://vaultwarden:secretpassword@db:5432/vaultwarden" # PostgreSQL kullanıyorsanız
DATABASE_URL: "data/vaultwarden.sqlite3" # Varsayılan olarak SQLite kullanmak için
LOG_LEVEL: "warn"
TZ: "Europe/Istanbul" # Zaman dilimini ayarladım
volumes:
- ./vw-data:/data # Vaultwarden verilerini kalıcı olarak saklamak için
ports:
- "127.0.0.1:8000:80" # Sadece localhost'a açık, Nginx proxyleyecek
# PostgreSQL veritabanı (isteğe bağlı, SQLite ile başlıyorum)
# db:
# image: postgres:14-alpine
# container_name: vaultwarden_db
# restart: always
# environment:
# POSTGRES_DB: vaultwarden
# POSTGRES_USER: vaultwarden
# POSTGRES_PASSWORD: secretpassword # Lütfen güçlü bir şifre kullanın!
# volumes:
# - ./db-data:/var/lib/postgresql/data
Bu dosyayı kaydettikten sonra, terminalde docker-compose up -d komutunu çalıştırarak servisleri başlattım. İlk kez çalıştırdığımda, Docker imajları indirildi ve servisler ayağa kalktı. Yaklaşık 30 saniye sürdü.
Nginx Reverse Proxy ve SSL Yapılandırması
Vaultwarden servisi 127.0.0.1:8000 portunda çalışıyordu. Dışarıdan erişim için Nginx’i reverse proxy olarak yapılandırmam gerekti. Bu sayede SSL sertifikamı Nginx yönetecek ve şifreli trafiği Vaultwarden’a iletecekti.
Nginx yapılandırma dosyam /etc/nginx/sites-available/vault.alanadim.com şöyleydi:
server {
listen 80;
listen [::]:80;
server_name vault.alanadim.com;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name vault.alanadim.com;
ssl_certificate /etc/letsencrypt/live/vault.alanadim.com/fullchain.pem; # Certbot ile oluşturulacak
ssl_certificate_key /etc/letsencrypt/live/vault.alanadim.com/privkey.pem; # Certbot ile oluşturulacak
ssl_trusted_certificate /etc/letsencrypt/live/vault.alanadim.com/chain.pem; # Certbot ile oluşturulacak
# SSL Ayarları
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";
ssl_prefer_server_ciphers on;
# HSTS (HTTP Strict Transport Security)
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# Güvenlik başlıkları
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Frame-Options DENY;
client_max_body_size 128M; # Büyük ekler için
location / {
proxy_pass http://127.0.0.1:8000;
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;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_redirect off;
}
# Websocket desteği için
location /notifications/hub {
proxy_pass http://127.0.0.1:8000;
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;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_redirect off;
}
}
Bu yapılandırmayı etkinleştirmek için sembolik bir bağ oluşturdum ve Nginx’i yeniden başlattım:
sudo ln -s /etc/nginx/sites-available/vault.alanadim.com /etc/nginx/sites-enabled/
sudo nginx -t # Yapılandırma hatası kontrolü
sudo systemctl reload nginx
Son olarak, Let’s Encrypt ile SSL sertifikasını aldım:
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d vault.alanadim.com
Certbot, Nginx yapılandırmamı otomatik olarak güncelleyerek SSL sertifikalarını ekledi ve listen 80 bloğunu return 301 https://$host$request_uri; ile yönlendirdi. Bu adımdan sonra, https://vault.alanadim.com adresinden Vaultwarden arayüzüne güvenli bir şekilde erişebiliyordum. İlk kurulum ve Nginx/SSL yapılandırması toplamda yaklaşık 45 dakika sürdü.
Güvenlik ve Bakım: Kendi Şifre Kasamı Nasıl Koruyorum?
Kendi şifre kasamı kurmakla birlikte, güvenlik ve bakım sorumluluğu tamamen bana geçti. Bu, benim için bir risk değil, aksine daha fazla kontrol anlamına geliyordu. Güvenlik tarafında aldığım başlıca önlemler şunlardı:
-
Güçlü Ana Şifre ve 2FA: Vaultwarden hesabıma erişim için çok güçlü, uzun ve karmaşık bir ana şifre belirledim. Ayrıca, mobil uygulamamdaki bir OTP uygulaması (Authy) ile iki faktörlü kimlik doğrulamayı (2FA) etkinleştirdim. Bu, şifre kasamın giriş güvenliğini önemli ölçüde artırdı.
-
Kullanıcı Kaydını Kapatma: İlk kurulumda
SIGNUPS_ALLOWED: "true"olarak ayarlamıştım. Kendi hesabımı oluşturduktan hemen sonra,docker-compose.ymldosyasınıSIGNUPS_ALLOWED: "false"olarak güncelledim vedocker-compose up -dile servisi yeniden başlattım. Bu, sunucuma yeni kullanıcıların kaydolmasını engelledi ve yetkisiz erişim riskini azalttı. -
Düzenli Yedeklemeler: Veri kaybı, şifre yöneticisi gibi kritik bir servis için kabul edilemez. Bu yüzden,
vw-dataklasörünün düzenli yedeklerini alıyorum.tarkomutunu kullanarak her gece otomatik olarak bircrongörevi ile bu klasörü sıkıştırıp başka bir sunucudaki güvenli bir depolama alanına gönderiyorum.# Crontab'a eklenecek komut (örnek) # 0 3 * * * /usr/bin/tar -czf /path/to/backup/vaultwarden_backup_$(date +\%Y\%m\%d).tar.gz /path/to/vaultwarden/vw-dataBu, aynı zamanda
PostgreSQL WAL bloatgibi sorunlarla uğraştığım ERP sunucularındaki yedekleme stratejilerime benziyor. -
Güncel Tutma: Docker imajlarını düzenli olarak güncel tutmak, bilinen güvenlik açıklarının kapatılması için kritik. Ayda bir kez
docker-compose pullve ardındandocker-compose up -dkomutlarını çalıştırıyorum. -
Fail2ban ve SSH Güvenliği: Sunucumda SSH brute-force saldırılarını engellemek için
fail2bankullanıyorum. Ayrıca, SSH portunu varsayılan 22’den farklı bir porta taşıdım ve sadece anahtar tabanlı kimlik doğrulamaya izin veriyorum. Bir yan ürünümün backend’inde VPS açtığımda 7 dakika içinde SSH’a brute-force saldırılarının başladığını gördüğümden beri bu önlemleri her zaman alıyorum. -
Sistem Kayıtlarının İzlenmesi:
journalctlile Docker container log’larını ve Nginx erişim log’larını düzenli olarak kontrol ediyorum. Anormal aktivite veya hata mesajları için tetikteyim.cgroup memory.highgibi yumuşak limitlerin aşılıp aşılmadığını da kontrol etmek içinsystemd-cgtopkullanıyorum.
Bu güvenlik ve bakım rutinleri, toplamda haftalık yaklaşık 15-20 dakikamı alıyor. Ancak bu süre, şifrelerimin güvenliği ve kendi kontrolümde olması karşılığında küçük bir bedel.
1Password’dan Vaultwarden’a Veri Taşıma Süreci
1Password’dan Vaultwarden’a geçiş süreci oldukça sorunsuzdu. Bitwarden istemcileri, çeşitli formatlardaki şifre dosyalarını içe aktarmayı desteklediği için, bu işlem kolayca yapılabildi.
İlk adım olarak, 1Password masaüstü uygulamasından şifrelerimi dışa aktardım. 1Password’un dışa aktarma seçenekleri arasında .csv ve .json formatları bulunuyor. Ben, daha fazla veri bütünlüğü sağladığı için .json formatını tercih ettim. Dışa aktarma işlemi sırasında, 1Password tüm kasalarımı tek bir şifreli .json dosyasına kaydetti. Bu dosyanın içeriğini kontrol ettim ve hassas verilerin doğru bir şekilde dışa aktarıldığından emin oldum.
Ardından, bilgisayarıma Bitwarden masaüstü uygulamasını indirdim. Henüz kendi Vaultwarden sunucuma bağlamamıştım, çünkü önce verileri yerel olarak içe aktarmak daha kolaydı. Bitwarden uygulamasını açtıktan sonra, “File” menüsünden “Import Data” seçeneğini buldum. Burada, “1Password (JSON)” veya “1Password (CSV)” gibi seçenekler listeleniyordu. Ben daha önce dışa aktardığım JSON dosyasını seçtim ve içe aktarma işlemini başlattım.
İçe aktarma işlemi genellikle birkaç saniye sürer. Tüm şifrelerim, notlarım, kredi kartı bilgilerim ve kimliklerim Bitwarden uygulamasında görünmeye başladı. Bu aşamada, içe aktarılan tüm öğeleri tek tek kontrol ettim. Özellikle URL’lerin, kullanıcı adlarının ve şifrelerin doğru eşleştiğinden emin oldum. Bazı özel alanlar veya ekler, içe aktarma sırasında tam olarak aktarılmayabilir, ancak benim durumumda büyük bir sorunla karşılaşmadım.
Son olarak, Bitwarden masaüstü uygulamasını kendi Vaultwarden sunucuma bağladım. Bunun için, uygulama ayarlarından “Self-hosted environment” seçeneğini seçtim ve sunucumun URL’sini (https://vault.alanadim.com) girdim. Ardından, Vaultwarden sunucumda oluşturduğum kullanıcı adı ve ana şifre ile giriş yaptım. Bu işlemden sonra, yerel olarak içe aktardığım tüm veriler otomatik olarak kendi Vaultwarden sunucuma senkronize edildi.
Bu geçiş süreci, yaklaşık 20 dakikamı aldı. Bu, yeni bir şifre yöneticisine geçiş için oldukça hızlı ve ağrısız bir süreçti.
Deneyimlerim ve Çıkardığım Dersler: Neden Buna Değdi?
Vaultwarden ile kendi şifre kasamı kurduktan sonra birkaç ay geçti ve bu kararımın doğruluğunu her geçen gün daha iyi anlıyorum. En belirgin kazanımım, elbette maliyet tasarrufu oldu. Yıllık 60 dolarlık 1Password aboneliği yerine, şu an sadece VPS’in çok küçük bir kısmını Vaultwarden için kullanıyorum. Bu, benim gibi birden fazla yan ürün geliştiren ve kendi altyapısını yöneten biri için önemli bir fark yaratıyor. Kendi özel finansal hesaplayıcılarımın backend’ini barındırdığım aynı VPS üzerinde Vaultwarden çalıştırmak, kaynakların verimli kullanımını sağlıyor.
İkinci büyük avantaj, veri kontrolü. Şifrelerimin ve diğer hassas bilgilerimin benim belirlediğim, benim yönettiğim bir sunucuda durması, bana büyük bir iç huzuru veriyor. Üçüncü taraf bir şirketin olası bir veri ihlalinden veya hizmet kesintisinden doğrudan etkilenme riskim azalıyor. Bu, özellikle kurumsal yazılım mimarisinde veri egemenliğinin ne kadar kritik olduğunu bilen biri için paha biçilemez.
Elbette, her madalyonun iki yüzü var. Kendi sunucumu yönetmek, düzenli bakım ve güvenlik güncellemeleri yapma sorumluluğunu da beraberinde getiriyor. İlk kurulum ve yapılandırma yaklaşık 2 saatimi aldı. Ancak bu, benim zaten sistem yönetimi ve network güvenliği alanında 20 yıla yakın tecrübem olduğu için bana ek bir yük getirmedi. Hatta, systemd unit’leri ile Vaultwarden’ın durumunu izlemek, journalctl ile logları kontrol etmek gibi rutin görevler benim için keyifli bile oldu. Bir ara Redis OOM eviction policy seçimleri üzerine çalışırken yaşadığım performans sorunlarının aksine, Vaultwarden’da bu tür ciddi performans sorunlarıyla karşılaşmadım.
graph TD;
A["Yüksek Şifre Yöneticisi Maliyeti"] --> B{"Kendi Kontrolümde Çözüm İsteği?"};
B -- Evet --> C["Kendi VPS'imde Vaultwarden Kurulumu"];
B -- Hayır --> D["Mevcut Ticari Çözüme Devam"];
C --> E["Maliyet Tasarrufu (Yıllık ~60$)"];
C --> F["Tam Veri Kontrolü"];
C --> G["Bakım ve Güvenlik Sorumluluğu"];
C --> H["Initial Setup Eforu (~2 saat)"];
E --> I["Uzun Vadeli Finansal Kazanç"];
F --> J["İç Huzuru ve Güven"];
G --> K["Sürekli Öğrenme ve Tecrübe Kazanma"];
H --> L["Zaman ve Teknik Bilgi Yatırımı"];
I & J & K & L --> M["Karardan Memnuniyet"];
D --> N["Kolay Kullanım"];
D --> O["Bakım Yükü Yok"];
D --> P["Yüksek Maliyet"];
N & O & P --> Q["Farklı Öncelikler"];
Bu geçişle birlikte, sadece şifre yönetimimi değiştirmekle kalmadım, aynı zamanda kendi altyapımı daha da güçlendirdim ve güvenlik pratiklerimi bir kez daha gözden geçirme fırsatı buldum. Bu deneyim, bana bir kez daha gösterdi ki, doğru araçlarla ve biraz teknik bilgiyle, büyük şirketlerin sunduğu pahalı servislerin birçoğunun uygun maliyetli ve güvenli alternatiflerini kendimiz de kurabiliriz.
Sonuç: Kendi Kasanızın Sahibi Olmak
1Password’dan Vaultwarden’a geçiş kararım, benim için hem finansal hem de teknik açıdan oldukça verimli oldu. Aylık 5 dolarlık bir maliyetten kurtulup, şifrelerimin tam kontrolünü ele almak, kendi dijital egemenliğimi pekiştiren önemli bir adımdı. Kurulum sürecindeki teknik detaylar ve ardından gelen düzenli bakım sorumluluğu, benim gibi sistem yönetimi kökenli biri için bir yükten ziyade, keyifli bir meydan okuma oldu.
Eğer siz de benzer maliyet endişeleri taşıyor veya verilerinizin kontrolünü tamamen elinizde tutmak istiyorsanız, Vaultwarden gibi açık kaynaklı ve self-hosted çözümleri mutlaka değerlendirmelisiniz. Başlangıçta biraz zaman ve teknik bilgi gerektirse de, uzun vadede sağladığı faydalar buna kesinlikle değer. Unutmayın, dijital dünyada kendi verilerinizin gerçek sahibi olmak, giderek daha kritik hale geliyor. Sonraki adımda, perhaps kendi DNS sunucumu kurma deneyimimi anlatabilirim, orada da ilginç negative caching senaryoları yaşamıştım.