← شروع آموزش

WIUNIX ACADEMY

راه‌اندازی Vaultwarden با HTTPS، مدیریت محدود و بکاپ هماهنگ

صفحهٔ 3 از 5؛ مراحل قبلی و پیش‌نیازها را پیش از ادامه مرور کن.

آموزش متناسب با محیط تو

کجا اجرا می‌کنی؟

سیستم‌عامل و نسخه را انتخاب کن تا مراحل، دستورها و راه‌حل‌ها برای همان محیط نمایش داده شوند.

Ubuntu26.04 LTSبررسی‌شده با مستندات رسمی ·

آموزش متناسب با مقادیر تو

تنظیمات این آموزش

مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر می‌کنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری می‌شوند و به سرور یا لینک اشتراک‌گذاری فرستاده نمی‌شوند. پیش از اجرا، DNS، گواهی‌ها و سیاست شبکهٔ واقعی را بررسی کن.

آی‌پی، دامنه یا پورت مثال‌ها با محیط تو فرق دارد؟ دکمهٔ زیر را باز کن، مقادیر را تغییر بده و «اعمال در آموزش» را بزن؛ سپس دستورهای به‌روز‌شده را کپی کن.

تنظیم مقادیر برای محیط من7 مقدار قابل‌تغییر
07

قدم بعدی

کنترل گواهی معتبرِ از پیش آماده‌شده

گواهی و زنجیره را با نام fullchain.pem و کلید را با نام privkey.pem، از طریق روند محرمانهٔ موجود در پوشهٔ TLS تازه قرار دهید؛ هر دو root و 0600 باشند. محتوای کلید را در مقاله یا آرگومان فرمان نگذارید. دستور بعد گواهی صادر نمی‌کند.

تطابق کلید عمومی، SAN و دست‌کم هفت روز اعتبار باقی‌مانده کنترل می‌شود؛ اعتماد عمومی زنجیره، مسیر DNS و تمدید آینده آزموده نمی‌شوند. برای CA خصوصی، اعتماد را پیشاپیش روی کلاینت‌ها نصب کنید و TLS را دور نزنید.

bash

ماشین اختصاصی Vaultwarden

set -eu
sudo test -s '/srv/academy-vaultwarden/tls/fullchain.pem'
sudo test -s '/srv/academy-vaultwarden/tls/privkey.pem'
sudo openssl x509 -in '/srv/academy-vaultwarden/tls/fullchain.pem' -noout -checkhost 'vault.example.com'
sudo openssl x509 -in '/srv/academy-vaultwarden/tls/fullchain.pem' -noout -checkend 604800
sudo python3 - <<'PY'
import subprocess,stat
from pathlib import Path
r=Path('/srv/academy-vaultwarden/tls')
for name in ('fullchain.pem','privkey.pem'):
    p=r/name;assert stat.S_ISREG(p.lstat().st_mode) and p.stat().st_uid==0 and not p.stat().st_mode & 0o077
cert=subprocess.check_output(['openssl','x509','-in',str(r/'fullchain.pem'),'-pubkey','-noout'])
certkey=subprocess.check_output(['openssl','pkey','-pubin','-outform','DER'],input=cert)
key=subprocess.check_output(['openssl','pkey','-in',str(r/'privkey.pem'),'-pubout','-outform','DER'])
assert certkey==key, 'Certificate/key mismatch'
print('SAN, expiry window, private modes and matching key: OK')
PY
از کجا بدانم درست انجام شد؟

SAN، تطابق کلید، بازهٔ اعتبار و مجوز خصوصی درست‌اند.

08

قدم بعدی

ویرایش تنظیمات اختصاصی Nginx

فایل آماده را باز کنید و پنل بعد را کامل کپی کنید. فایل در context از نوع http بارگذاری می‌شود و نام map ثابت است؛ academy_vaultwarden نام فایل تنظیمات و کانتینر را تعیین می‌کند. مدیریت فقط از 203.0.113.10/32 بر اساس مبدأ واقعی اتصال مجاز است؛ اضافه‌کردن CDN، اعتماد عمومی به real_ip یا allow همگانی جای این طراحی نیست.

bash

ماشین اختصاصی Vaultwarden

sudo env HOME=/root nano --ignorercfiles --restricted --noread -- '/srv/academy-vaultwarden/config/nginx.conf'
از کجا بدانم درست انجام شد؟

کل فایل پراکسی با شبکهٔ محدود مدیریت ذخیره شده است.

پراکسی HTTPS و محدودکردن مسیر مدیریت

هدرهای هویت و scheme از نو ساخته می‌شوند و WebSocket روی همان پورت بک‌اند عبور می‌کند. سقف 32 مگابایت برای بدنهٔ HTTP است، نه سهمیهٔ فضای هر vault. Host دیگر 421 می‌گیرد. access log برای نگه‌نداشتن مسیرهای مرتبط با vault غیرفعال است؛ error log محرمانه را بی‌حساب صادر نکنید.

nginx · /srv/academy-vaultwarden/config/nginx.conf
map $http_upgrade $academy_vaultwarden_upgrade {
    default upgrade;
    '' "";
}
server {
    listen 443 ssl;
    server_name vault.example.com;
    if ($host != vault.example.com) { return 421; }
    ssl_certificate /srv/academy-vaultwarden/tls/fullchain.pem;
    ssl_certificate_key /srv/academy-vaultwarden/tls/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    client_max_body_size 32m;
    access_log off;
    error_log /var/log/nginx/academy_vaultwarden-error.log error;
    proxy_http_version 1.1;
    proxy_set_header Host vault.example.com;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Forwarded-Host vault.example.com;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Forwarded "";
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $academy_vaultwarden_upgrade;
    proxy_connect_timeout 5s;
    proxy_read_timeout 300s;
    proxy_send_timeout 300s;
    proxy_next_upstream off;
    location ~* ^/admin(?:/|$) {
        allow 203.0.113.10/32;
        deny all;
        proxy_pass http://127.0.0.1:8159;
    }
    location / {
        proxy_pass http://127.0.0.1:8159;
    }
}
09

قدم بعدی

فعال‌سازی HTTPS پس از اعتبارسنجی

کپی انحصاری فایل موجود Nginx را بازنویسی نمی‌کند. reload فقط پس از موفقیت nginx -t انجام می‌شود. اگر اعتبارسنجی شکست خورد، سرویس با تنظیمات قبلی می‌ماند؛ فقط فایل تازه را اصلاح کنید و اعتبارسنجی TLS را خاموش نکنید.

bash

ماشین اختصاصی Vaultwarden

set -eu
sudo python3 - <<'PY'
import os,stat
from pathlib import Path
p=Path('/srv/academy-vaultwarden/config/nginx.conf')
assert stat.S_ISREG(p.lstat().st_mode) and p.stat().st_uid==0
fd=os.open('/etc/nginx/conf.d/academy_vaultwarden.conf',os.O_WRONLY|os.O_CREAT|os.O_EXCL|os.O_NOFOLLOW,0o644)
with os.fdopen(fd,'wb') as f: f.write(p.read_bytes())
os.chmod('/etc/nginx/conf.d/academy_vaultwarden.conf',0o644)
PY
sudo nginx -t
sudo systemctl reload nginx
curl --fail --silent --show-error 'https://vault.example.com/alive'
از کجا بدانم درست انجام شد؟

پیکربندی Nginx معتبر است و /alive با HTTPS مورداعتماد پاسخ 200 می‌دهد.

10

قدم بعدی

بررسی مرز عمومی و مدیریت

از کلاینتی خارج از 203.0.113.10/32، مسیر /admin/ باید 403 بدهد. از مبدأ مجاز ممکن است فرم ورود با 200 نمایش داده شود؛ محتوای مدیریتی همچنان رمز جدا می‌خواهد. رمز را در آرگومان curl، فرم مقاله یا تنظیمات مرورگرِ این مقاله وارد نکنید.

روی سرور، نگاشت لوپ‌بک و نبود config.json را کنترل کنید. پاسخ config عمومی است و دادهٔ vault را نشان نمی‌دهد. سلامت HTTP به معنی پذیرش ورود، sync یا بازیابی نیست.

version در config عمومی مقدار سازگاری API است و شمارهٔ انتشار باینری نیست. فرمان نسخهٔ باینری در پنل زیر، Vaultwarden1.37.4 و Web-Vault2026.7.0 را برای ایمیج بررسی‌شده نشان می‌دهد. لوپ‌بک و مدیریت Docker بر اعتماد به مدیران میزبان تکیه دارند؛ برای حساب محلی نامطمئن، جداسازی را جدا طراحی کنید.

bash

ماشین اختصاصی Vaultwarden

set -eu
curl --fail --silent --show-error 'https://vault.example.com/api/config' | python3 -c 'import json,sys; d=json.load(sys.stdin); print({k:d.get(k) for k in ("version","environment","server")})'
curl --silent --show-error --output /dev/null --write-out '%{http_code}
' 'https://vault.example.com/admin/'
sudo docker exec 'academy_vaultwarden' sh -c 'test -r /run/secrets/admin.phc && test -w /data && test ! -e /data/config.json'
sudo docker exec 'academy_vaultwarden' /vaultwarden --version
sudo docker port 'academy_vaultwarden'
از کجا بدانم درست انجام شد؟

مدیریت برای مبدأ غیرمجاز 403 است؛ بک‌اند عمومی نیست و config override وجود ندارد.

ثبت‌نام کنترل‌شده و پذیرش کلاینت

SIGNUPS_ALLOWED=false را نگه دارید. مدیر سرور می‌تواند مستقل از دعوت عادی، دعوت مشخص صادر کند؛ SMTP در این راهنما تنظیم نشده است. پیش از افزودن تیم، مسیر رسمی دعوت را با ایمیل کنترل‌شده و SMTP آزموده دنبال کنید. برای راحتی، ثبت‌نام عمومی را موقتاً باز نکنید.

پذیرش دستی را با حساب دورریختنی و دادهٔ ساختگی انجام دهید: HTTPS معتبر و secure context، ورود تازه، ساخت و ویرایش یک رکورد، sync روی کلاینت دوم و ورود مجدد. نسخهٔ دقیق کلاینت‌ها را ثبت کنید. پیش از دادهٔ واقعی، MFA کاربر و کد بازیابی مستقل لازم است؛ PHC مدیر، MFA نیست. ایمیل، دعوت، MFA، SSO، passkey و اپ‌ها در این مطلب کار پذیرش مستندند، نه ادعای آزمون اجرایی.

ذخیرهٔ تنظیمات در /admin می‌تواند config.json بسازد و مقدارهای محیطی را کنار بزند. یک مرجع روشن برای تنظیمات داشته باشید و فایل حاصل را محرمانه بکاپ بگیرید. دسترسی سازمانی و نقش‌ها را پیش از افزودن دیگران جداگانه آزمایش کنید.

همهٔ آموزش‌های آکادمی ↗