آنچه در این مقاله میخوانید
آموزش مدیریت امنیت با HashiCorp Vault در اوبونتو 24.04
 نرگس سلطانی
نرگس سلطانی۲۷ اردیبهشت ۱۴۰۴
Vault یک ابزار متنباز برای ذخیرهسازی و توزیع امن اطلاعات حساس مانند کلیدهای API، توکنهای دسترسی و گذرواژهها است. ابزارهایی مانند Vault نقش بسیار مهمی در افزایش امنیت برنامههایی دارند که با اطلاعات حساس کار میکنند، به خصوص در زمان استقرار در محیطهای عملیاتی این موضوع اهمیت بیشتری پیدا میکند.
با سرور ابونتو لیارا، بدون دردسر سرور خود را تنها با چند کلیک مدیریت کنید.
✅ منابع کاملاً اختصاصی و پایدار✅ سرعت بالا و ترافیک نامحدود✅ امنیت پیشرفته و پشتیبانی 24/7
خرید و راهاندازی سرور اوبونتو ساعتی لیارا
آنچه در ادامه خواهید خواند:
- الزامات پیش از شروع فرآیند آموزش
- آموزش نصب Vault
- پیکربندی Vault
- راه اندازی اولیه Vault
- ذخیره و بازیابی اطلاعات محرمانه در Vault
- ساخت سیاست دسترسی در Vault
- سوالات متداول
- جمع بندی

در این مطلبی از لیارا موارد زیر را اعمال خواهیم کرد.
- نصب Vault و پیکربندی آن به عنوان یک سرویس سیستمی
- راهاندازی یک فضای ذخیرهسازی داده رمزگذاریشده روی دیسک
- ذخیره و بازیابی مطمئن یک مقدار حساس از طریق TLS
اوبونتو Ubuntu چیست؟ (معرفی کامل کاربردها + ویژگیها)
اوبونتو Ubuntu
الزامات پیش از شروع فرآیند آموزش
قبل از آنکه آموزش را شروع کنید، به موارد زیر نیاز خواهید داشت.
- یک سرور اوبونتو 24.04 که مطابق با تنظیمات اولیه اوبونتو 24.04 باشد و یک یوزر یا کاربر غیر روت (non-root) با دسترسی های sudo را در اختیار داشته باشید.
- از یک گواهی TLS برای ایمن سازی API های مبتنی بر HTTP در Vault استفاده کنید.
توجه: در زمان نصب اولیه Vault، یک گواهی TLS خود امضا ساخته میشود. اگر هنوز دامنه یا گواهی TLS در اختیار ندارید اما قصد دارید مراحل این آموزش را دنبال کنید، نگران نباشید؛ میتوانید با اضافه کردن گزینه -tls-skip-verify به دستورات یا تعریف متغیر محیطی VAULT_SKIP_VERIFY، اعتبارسنجی TLS را غیرفعال کنید.
این گزینه تنها برای تست و آزمایش مناسب است و نباید در محیط های پروداکشن (Production) استفاده شود.
آموزش نصب Vault
شرکت HashiCorp نرمافزار Vault را به صورت یک پکیج استاندارد Debian/Ubuntu ارائه کرده است. در ادامه مراحل اضافه کردن مخزن رسمی Vault به منابع پکیجهای سرور را شرح خواهیم داد.
ابتدا کلید GPG مربوط به HashiCorp را به مدیر بسته اضافه کنید تا سیستم مخازن آنها را به رسمیت بشناسد. برای اینکار از دستور زیر استفاده کنید.
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -بعد از آن مخزن Vault را به لیست منابع پکیجهای خود اضافه کنید تا بهروز رسانیهای سیستم نیز بررسی شوند.
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
در این قسمت باید Vault را نصب کنید.
sudo apt install vaultدیگر میتوانید از دستور vault استفاده کنید. برای اینکه مطمئن شوید که به درستی نصب شده است از دستور زیر استفاده کنید.
vault --versionخروجی که به شما نشان خواهد داد به صورت زیر خواهد بود.
Vault v1.8.5 (647eccfe0bd5817bdd8628f3c3171402dfc8a8fc)دیگر فایل اجرایی Vault بر روی سیستم نصب شده است. در مرحله بعدی باید Vault را به روشی پیکربندی کنید که به عنوان یک سرویس سیستمی اجرا شود.
آموزش نصب و راهاندازی فایروال UFW در سرور مجازی اوبونتو به زبان ساده
نصب و راهاندازی فایروال UFW در سرور مجازی اوبونتو
پیکربندی Vault
با نصب کردن پکیجهای Vault، به صورت خودکار کاربر سیستمی به نام vault ساخته میشود و یک سرویس سیستمی نیز برای اجرای Vault در پس زمینه تنظیم خواهد شد. در این قسمت باید چند تغییر اساسی را در پیکربندی پیش فرض بسازید تا از گواهیهای HTTPS که توسط Let’s Encrypt تولید شدهاند استفاده شود.
نکته قابل توجه: در این مطلب به صورت پیش فرض، Vault از فایل سیستم برای ذخیره اطلاعات رمزگذاریشده روی دیسک محلی در مسیر /opt/vault استفاده میکند. این روش برای استقرارهای محلی یا تکسرور که به تکرار داده نیاز ندارند مناسب است. 
پیکربندی پیشفرض Vault در فایل /etc/vault.d/vault.hcl قرار دارد.
فایل vault.hcl را با استفاده از ویرایشگر مورد نظر خود باز کنید.
sudo nano /etc/vault.d/vault.hclبخش listener "tcp" را که مربوط به پیکربندی HTTPS است پیدا کنید. اگر از nano استفاده میکنید، با فشار دادن Ctrl+W و جستجوی عبارت listener "tcp" سریعتر به آن قسمت میرسید.
به عنوان مثال:
...
# HTTPS listener
...
listener "tcp" {
  address       = "0.0.0.0:8200"
  tls_cert_file = "/opt/vault/tls/tls.crt"
  tls_key_file  = "/opt/vault/tls/tls.key"
...
}
فایلهای tls_cert_file و tls_key_file را ویرایش کنید تا به گواهی و کلید خصوصی صادر شده توسط Let’s Encrypt اشاره کنند.
اسم دامنه خود را جایگزین your_domain نمایید.
listener "tcp" {
...
  tls_cert_file = "/etc/letsencrypt/live/your_domain/fullchain.pem"
  tls_key_file  = "/etc/letsencrypt/live/your_domain/privkey.pem"
}
نکته قابل توجه: address = "0.0.0.0:8200" را به address = "127.0.0.1:8200" تغییر دهید تا از اتصالهای خارجی جلوگیری کند. آدرس 127.0.0.1 فقط برای localhost قابل دسترسی است.
بعد از انجام تغییرات، فایل را ذخیره کرده و ببندید. اگر از nano استفاده میکنید، کلیدهای Ctrl+X سپس Y و در نهایت Enter را فشار دهید.
دیگر دسترسیهای کاربر Vault به گواهیهای TLS فراهم شده است. به صورت پیش فرض، تنها کاربر روت (root) میتواند به این فایلها دسترسی داشته باشد.
برای این کار ابتدا باید یک گروه با نام pki بسازید.
sudo groupadd pkiدر این بخش تمامی مالکیتهای گروهی دایرکتوریهای مربوط به گواهیها تغییر میکند.
sudo chgrp -R pki /etc/letsencrypt/archive
sudo chgrp -R pki /etc/letsencrypt/liveبعد از آن مجوزهای دسترسی گروهی را برای این دایرکتوریها تنظیم کنید.
sudo chmod -R g+rx /etc/letsencrypt/archive
sudo chmod -R g+rx /etc/letsencrypt/liveباید کاربر Vault را به گروه pki اضافه کنید.
sudo usermod -a -G pki vaultبرای اینکه فرآیند شما با راحت ترین حالت ممکن انجام شود، یک ورودی را در فایل /etc/hosts خود اضافه کنید تا درخواستها به دامنه Vault مستقیماً به localhost هدایت شوند. “نام دامنه واقعی خود را با آن نام جایگزین کنید.”
echo 127.0.0.1 your_domain.com | sudo tee -a /etc/hostsچطور یک برنامهی Node.js را برای محیط تولید روی سرور مجازی اوبونتو Ubuntu راهاندازی کنیم؟
Node.js برای محیط تولید در اوبونتو
راه اندازی اولیه Vault
Vault به صورت پیشفرض غیرفعال است و نمیتوان از آن برای ذخیرهسازی دادهها استفاده کرد. در این مرحله ابتدا باید سرور Vault را راهاندازی کنید و سپس فرآیند مقداردهی اولیه (Initialization) را انجام دهید.
زمانی که Vault برای اولین بار راهاندازی میشود، پایگاه داده آن نیز بدون مقداردهی خواهد بود. بنابراین ابتدا باید سرویس Vault را فعال کنید.
sudo systemctl start vault.serviceبرای اینکه مطمئن شوید اجزای صحیح سرویس اجرا میشوند، وضعیت آن را بررسی کنید.
sudo systemctl status vault.serviceخروجی مشابه زیر را دریافت خواهید کرد.
● vault.service - "HashiCorp Vault - A tool for managing secrets"
     Loaded: loaded (/lib/systemd/system/vault.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2021-11-16 21:55:13 UTC; 22s ago
       Docs: https://www.vaultproject.io/docs/
   Main PID: 104207 (vault)
      Tasks: 7 (limit: 1137)
     Memory: 179.3M
     CGroup: /system.slice/vault.service
             └─104207 /usr/bin/vault server -config=/etc/vault.d/vault.hcl
در این خروجی باید خطی مشابه به خط زیر را مشاهده کنید که نشان دهنده این است که سرویس شما فعال میباشد.
Active: active (running)اگر سرویس شما فعال نشده بود، بررسی لاگ موجود در انتهای خروجی میتواند به تشخیص و رفع مشکل شما کمک کند. در ادامه، باید یک متغیر محیطی را تعریف کنید تا دستور vault بتواند به سرور متصل شود. چون Vault تنها روی اینترفیس (interface) localhost در دسترس است، باید متغیر زیر تنظیم شود.
export VAULT_ADDR=https://your_domain:8200توجه داشته باشید که باید به جای your_domain نام دامنهی خود را وارد کنید. این امر بسیار ضروری است. اکنون میتوانید وضعیت Vault را بررسی کنید.
vault statusخروجی شما باید مانند خروجی زیر باشد.
Key             Value
---             -----
Seal Type       shamir
Initialized     false
Sealed          true
Total Shares    0
Threshold       0
Unseal Progress 0/0
Unseal Nonce    n/a
Version         1.8.5
Storage Type    file
HA Enabled      false
این قسمت دو اطلاعات مهم را به کاربران میدهد، که فقط در زمان مقدار دهی اولیه قابل مشاهده است.
- توکن ریشه اولیه (Initial Root Token): دسترسی کامل به Vault را برای شما فراهم میکند و این قابلیت را به همراه دارد که تمامی سیاستها و اطلاعات را در خود دارد.
- کلیدهای بازگشایی (Unseal Keys): برای بازگشایی Vault در زمان راهاندازی یا راهاندازی مجدد از آن استفاده میشود.
برای مقدار دهی اولیه Vault با سه کلید، دستور زیر اجرا کنید.
vault operator init -key-shares=3 -key-threshold=2بعد از اجرای این دستور، خروجی زیر را مشاهده خواهید کرد.
Unseal Key 1: eZcJeydRrqeSMZ1zTN+VVll9TFT2KvJy7VlnxUgtvuz5
Unseal Key 2: ntmqCKq8rgNnKT1YSLCjVmCCZBAA3NwUeqxIyRpYD4Wm
Unseal Key 3: 3FK1+Hsorh4p8/L9mki3VskaEU2eQhLqGOI/pJkTHMbx
Initial Root Token: s.hY0ieybfDqCadz7JpL88uO3xبه یاد داشته باشید که حتما تمامی کلیدهای بازگشایی و توکن ریشه (Initial Root Token) را به صورت مطمئن ذخیره کنید، به این دلیل که این اطلاعات بعدا قابل بازیابی نخواهند بود.
برای اینکه بتوانید دوباره وضعیت Vault را بررسی کنید از دستور زیر استفاده کنید.
vault statusخروجی شما دیگر تغییر کرده است و باید به صورت زیر باشد.
Initialized     true
Sealed          true
Total Shares    3
Threshold       2
Unseal Progress 0/2در این قسمت مشاهده میکنید که مقدار Initialized برابر true شده است و حالا باید بازیابی را انجام دهید.
برای بازیابی، دستور زیر را اجرا کنید و یکی از کلیدهای بازگشایی را وارد کنید.
vault operator unsealخروجی شما به صورت زیر خواهد بود.
Key (will be hidden):بعد از وارد کردن کلید اول، Vault مشخص خواهد کرد که بازیابی هنوز کامل نشده است.
Seal Type       shamir
Initialized     true
Sealed          true
Total Shares    3
Threshold       2
Unseal Progress 1/2مجددا دستور زیر را اجرا کرده و کلید دوم را وارد کنید.
vault operator unsealبعد از وارد کردن دومین کلید، خروجی به شکل زیر خواهد بود و Vault کاملاً بازگشایی میشود.
Seal Type       shamir
Initialized     true
Sealed          false
Total Shares    3
Threshold       2همین الان، بدون کمترین پیچیدگی، سرور مجازی خودتون رو در کمتر از ۳۰ ثانیه، راهاندازی کنید.
✅ عملکرد پایدار ✅ ترافیک نامحدود ✅ هزینه بهصرفه
خرید سرور مجازی ابری
آموزش راهاندازی اپلیکیشن وب Go با Docker و Nginx در اوبونتو 22.04
راهاندازی اپلیکیشن وب Go با Docker و Nginx در اوبونتو
ذخیره و بازیابی اطلاعات محرمانه در Vault
در Vault چندین موتور ذخیره سازی برای اطلاعت محرمانه (Secrets Backends) وجود دارد. در ادامه از موتور kv استفاده خواهیم کرد. توجه داشته باشید که این موتور به صورت پیش فرض فعال نخواهد بود.
در این مرحله، موتور kv فعال شده است و روش ذخیرهسازی و خواندن دادهها در آن را یاد خواهید گرفت.
برای این کار ابتدا توکن روت (Root Token) که در مراحل قبل تولید شد را در یک متغیر شِل ذخیره کنید تا استفاده از آن سادهتر باشد.
root_token=your_root_token_hereبعد از آن با استفاده از توکن روت (Root Token) موتور kv را فعال کنید.
VAULT_TOKEN=$root_token vault secrets enable kvاگر دستور وارد شده شما موفقیت آمیز بود، خروجی زیر را مشاهده خواهید کرد.
Success! Enabled the kv secrets engine at: kv/برای این که مطمئن شوید موتور شما به درستی فعال شده باشد، لیست موتورهای ذخیرهسازی فعال را بررسی کنید.
VAULT_TOKEN=$root_token vault secrets listخروجی دستور شما باید به صورت زیر باشد.
Path          Type         Accessor              Description
----          ----         --------              -----------
cubbyhole/    cubbyhole    cubbyhole_abc1631b    per-token private secret storage
identity/     identity     identity_631fe262     identity store
kv/           kv           kv_4d5855c8           n/a
sys/          system       system_79b13f2f       system endpoints used for control, policy and debugging
خطی که مسیر kv/ را نشان میدهد، تأیید میکند که این موتور فعال شده و آماده استفاده است. دیگر میتوانید اطلاعات محرمانهای را با استفاده از این موتور ذخیره کنید.
VAULT_TOKEN=$root_token vault write kv/message value=mypasswordدر این دستور، پیشوند kv/ مشخص میکند که داده در مسیر kv ذخیره میشود.
برای مشاهده دادهای که ذخیره کردهاید، از دستور زیر استفاده کنید.
VAULT_TOKEN=$root_token vault read kv/messageبرای اینکه مطمئن شوید روند را درست انجام دادهاید باید خروجی زیر را مشاهده کنید.
Key Value
--- -----
refresh_interval 768h
value mypasswordراهنمای راهاندازی IDE ابری code server بر روی سرور مجازی اوبونتو 22.04
راهاندازی IDE ابری code server بر روی سرور مجازی اوبونتو
ساخت سیاست دسترسی در Vault
در شرایط واقعی، ممکن است Vault اطلاعات حساسی مانند کلیدهای API یا گذرواژههایی را ذخیره کند که ابزارهای خارجی برای عملکرد خود به آنها نیاز دارند. هرچند میتوان با استفاده از توکن روت (Root Token) به این دادهها دسترسی داشت، اما از نظر امنیتی توصیه میشود توکنی با سطح دسترسی محدود و read-only را برای این منظور ایجاد کنید.
برای شروع، فایل زیر را با استفاده از ویرایشگر مورد نظر خود بسازید.
nano policy.hclکد زیر را داخل فایل زیر بنویسید. این سیاست تنها اجازه خواندن را به مسیر مشخص شده میدهد.
path "kv/message" {
     capabilities = ["read"]
}بعد از ذخیره کردن و بستن فایل، باید تمامی این سیاستها را به Vault معرفی کنید. دستور زیر را در فایل policy.hcl را در Vault بارگذاری کرده و سیاستی به نام message-readonly با سطح دسترسی read-only ایجاد کنید.
VAULT_TOKEN=$root_token vault policy write message-readonly policy.hclدر ادامه، یک توکن جدید برای دسترسی فقط خواندنی (read-only) را بسازید.
VAULT_TOKEN=$root_token vault token create -policy="message-readonly"باید خروجی زیر را مشاهده کنید.
Key                  Value
---                  -----
token                your_token_value
token_accessor       your_token_accessor
token_duration       768h0m0s
token_renewable      true
token_policies       ["default" "message-readonly"]
identity_policies    []
policies             ["default" "message-readonly"]مقدار your_token_value که مشخص شده است را به عنوان یک متغییر محیطی به نام app_token ذخیره کنید.
app_token=your_token_value
میتوانید با استفاده از توکن زیر، دادههای ذخیره شده را در مسیر kv/message بخوانید.
VAULT_TOKEN=$app_token vault read kv/messageخروجی شما به صورت زیر خواهد بود.
Key                     Value
---                     -----
refresh_interval        768h0m0s
value                   mypasswordبررسی کنید که این توکن محدود اجازه انجام عملیات دیگر، مانند لیست کردن دادههای موجود در Vault را در اختیار دارد یا خیر.
VAULT_TOKEN=$app_token vault list kv/خروجی که باید مشاهده کنید به صورت زیر خواهد بود.
Error reading kv/: Error making API request.
URL: GET https://your_domain:8200/v1/secret?list=true
Code: 403. Errors:
* 1 error occurred:
    * permission deniedچگونه Strapi را برای محیط تولید روی سرور مجازی اوبونتو 22.04 راهاندازی و نصب کنیم؟
Strapi
سوالات متداول
در ادامه به سوالاتی که امکان دارد در این زمینه برای شما بدون پاسخ بماند، جوابهای کوتاه اما مفیدی دادهایم که با استفاده از آن میتوانید به سوال خود پاسخ صحیحی را بدهید.
چرا نباید از توکن Root برای دسترسی به اطلاعات در Vault استفاده کرد؟
استفاده مداوم از توکن (Root) به دلیل داشتن دسترسی کامل، خطرناک است. در واقعیت باید از توکنهای محدودشده برای افزایش امنیت و کنترل بهتر استفاده کنید.
اگر توکن read-only گم شود چکار کنم؟
باید فوراً توکن را لغو (revoke) کنید تا دسترسی آن غیرفعال شود. از دستور vault token revoke <token> استفاده کنید.
آیا می توان چندین مسیر را در یک فایل policy.hcl تعریف کرد؟
بله. میتوانید چندین بلوک path با سطح دسترسیهای متفاوت را در یک فایل policy بنویسید.
چگونه می توان دسترسی نوشتن (write) یا حذف (delete) را به یک مسیر خاص در Vault داد؟
در فایل policy کافی است بهجای ["read"] از ["read", "create", "update", "delete"] استفاده کنید.
آیا بعد از ساختن توکن جدید با سیاست، نیاز به راه اندازی مجدد Vault است؟
خیر. تغییر سیاستها و ایجاد توکنها همان لحظه اعمال میشوند و نیازی به ریاستارت (Restart) سرویس را نخواهید داشت.
جمع بندی
در این راهنما یاد گرفتید که چگونه در اوبونتو 24.04، با استفاده از Vault، اطلاعات محرمانه را ذخیره و بازیابی کنید. همچنین با ساخت یک policy فقطخواندنی (read-only)، نحوه تعریف سطح دسترسی محدود برای کاربران یا اپلیکیشنها را بررسی کردیم. این روشها امنیت دادهها را افزایش داده و مدیریت دسترسی را سادهتر میکنند.
آموزش نصب پایتون در سرور مجازی اوبونتو
نصب پایتون در سرور مجازی اوبونتو