
در دنیای مدرن فناوری اطلاعات، امنیت دادهها یکی از مهمترین دغدغههای سازمانها و توسعهدهندگان است. با رشد روزافزون حملات سایبری و نیاز به مدیریت دسترسیهای حساس، ابزارهای مدیریت اسرار (Secrets Management) نقش حیاتی در ایمنسازی اطلاعات بازی میکنند. HashiCorp Vault یکی از قدرتمندترین راهکارهای موجود برای مدیریت و محافظت از دادههای حساس، مانند کلیدهای API، رمزهای عبور، گواهینامههای SSL و سایر اطلاعات امنیتی است.
در گذشته، بسیاری از سازمانها اطلاعات محرمانه خود را بهصورت سختکد شده در کدهای برنامهنویسی یا فایلهای پیکربندی نگهداری میکردند. این روش نهتنها ناامن است، بلکه در صورت درز اطلاعات، میتواند آسیبهای جبرانناپذیری ایجاد کند. Vault این مشکل را با ارائه یک راهکار امن، متمرکز و خودکار برای مدیریت و ذخیرهسازی اطلاعات حساس برطرف کرده است. این ابزار امکان رمزگذاری دادهها، کنترل دقیق دسترسیها و ثبت تمامی رویدادهای مرتبط با دادههای محرمانه را فراهم میکند.
یکی از ویژگیهای کلیدی HashiCorp Vault قابلیت دسترسی پویا به دادهها است. برخلاف روشهای سنتی که اطلاعات ثابت را ذخیره و بازیابی میکردند، Vault امکان ایجاد دسترسیهای موقت و دینامیک را فراهم میکند. بهعنوانمثال، اگر یک کاربر یا سرویس نیاز به یک رمز عبور برای پایگاه داده داشته باشد، Vault میتواند یک رمز عبور یکبارمصرف ایجاد کند که پس از مدت مشخصی منقضی میشود. این قابلیت خطر افشای اطلاعات را بهشدت کاهش داده و امنیت را به سطح بالاتری میبرد.
علاوه بر این، Vault از روشهای احراز هویت متنوعی مانند LDAP، AWS IAM، Kubernetes و GitHub پشتیبانی میکند، که این امکان را فراهم میسازد تا سازمانها بتوانند بدون تغییرات اساسی در زیرساختهای موجود، این ابزار را بهکار بگیرند. همچنین، این سیستم از رمزگذاری پیشرفته بهره میبرد تا دادههای ذخیرهشده و در حال انتقال در برابر حملات محافظت شوند.
در محصول HashiCorp Vault، کلمه “Vault” در زبان فارسی به معنی “گنجینه”، “مخزن”، یا “صندوق امن” است. این نام به ویژگی اصلی این نرمافزار اشاره دارد که برای ذخیرهسازی و مدیریت امن اسرار (Secrets) مانند رمزهای عبور، کلیدهای API، گواهینامههای امنیتی و سایر اطلاعات حساس استفاده میشود. به طور کلی، در زمینه امنیت اطلاعات، Vault به سیستمی گفته میشود که اطلاعات حساس را در یک محیط ایزوله و محافظتشده نگهداری میکند.
در این مقاله، به بررسی عمیق ویژگیها، نحوه عملکرد، روشهای پیادهسازی و بهترین شیوههای استفاده از HashiCorp Vault خواهیم پرداخت تا دید کاملی نسبت به این ابزار ارزشمند داشته باشید.
فهرست مطالب
تاریخچه HashiCorp Vault
HashiCorp Vault یکی از ابزارهای کلیدی شرکت HashiCorp است که برای مدیریت اسرار (Secrets Management) و محافظت از دادههای حساس طراحی شده است. این ابزار در سال ۲۰۱۵ معرفی شد و از آن زمان به یکی از محبوبترین راهکارهای امنیتی برای سازمانهای بزرگ و کوچک تبدیل شده است.
تولد HashiCorp و نیاز به Vault
شرکت HashiCorp در سال ۲۰۱۲ توسط Mitchell Hashimoto و Armon Dadgar تأسیس شد. هدف اصلی این شرکت، ایجاد ابزارهایی برای مدیریت زیرساختها بهصورت Infrastructure as Code (IaC) بود. پیش از Vault، این شرکت ابزارهایی مانند Vagrant، Terraform، Consul و Nomad را ارائه داده بود که در حوزه مدیریت زیرساخت و هماهنگسازی سرویسها بسیار محبوب شدند.
با رشد سریع زیرساختهای ابری (Cloud Infrastructure) و افزایش وابستگی سازمانها به خدمات توزیعشده، نیاز به یک راهکار امن برای مدیریت و محافظت از اطلاعات حساس بهشدت احساس شد. بسیاری از سازمانها کلیدهای API، رمزهای عبور، گواهیهای SSL و اطلاعات احراز هویت را بهصورت Hardcoded در کدهای برنامهنویسی یا فایلهای پیکربندی نگهداری میکردند که امنیت دادهها را به خطر میانداخت. این مشکل، انگیزهای شد تا HashiCorp در سال ۲۰۱۵ نسخه اولیه Vault را معرفی کند.
انتشار و تکامل Vault
- ۲۰۱۵: اولین نسخه HashiCorp Vault منتشر شد. این نسخه امکانات پایهای مانند ذخیرهسازی امن اسرار، احراز هویت اولیه و رمزگذاری دادهها را ارائه میداد.
- ۲۰۱۶: نسخه ۰.۵ منتشر شد که قابلیت دسترسی پویا به پایگاه داده (Dynamic Database Credentials) را معرفی کرد. این ویژگی باعث شد Vault بتواند دسترسیهای موقتی و امن برای پایگاه داده ایجاد کند.
- ۲۰۱۷: نسخه ۰.۷ ارائه شد که پشتیبانی از سیستم احراز هویت AWS و Kubernetes را اضافه کرد. این ویژگیها باعث شد Vault در محیطهای ابری کاربرد بیشتری پیدا کند.
- ۲۰۱۸: با انتشار نسخه ۱.۰، Vault به یک محصول پایدار و قابلاعتماد برای محیطهای تولیدی (Production Environments) تبدیل شد.
- ۲۰۱۹–۲۰۲۱: ویژگیهایی مانند HSM Integration (یکپارچهسازی با ماژولهای امنیت سختافزاری)، Namespaces (فضای نامها برای مدیریت چندین تیم)، و Auto-Unseal (رمزگشایی خودکار) معرفی شدند که باعث افزایش امنیت و مقیاسپذیری Vault شدند.
- ۲۰۲۲ و بعد از آن: Vault Enterprise با ویژگیهای پیشرفتهتری مانند Replication (تکثیر داده)، Disaster Recovery (بازیابی فاجعه) و Advanced Access Control (کنترل دسترسی پیشرفته) به محبوبیت بالایی در سازمانهای بزرگ دست یافت.
ساختار HashiCorp Vault
در HashiCorp Vault، سه بخش اصلی وجود دارد که برای عملکرد و مدیریت دادههای امن، کلیدها و دسترسیها طراحی شدهاند: API، Core و Storage Backend. این سه بخش هرکدام نقش خاص خود را در فرآیندهای مختلف Vault ایفا میکنند.
۱. API (رابط برنامهنویسی کاربردی):
API در Vault یک واسط است که به سیستمهای خارجی و کاربران اجازه میدهد تا با Vault تعامل کنند. Vault API درخواستها را از سمت کاربر (یا سیستمهای دیگر) دریافت کرده و پاسخهای مناسب را ارائه میدهد.
وظایف API:
- دریافت و ارسال دادهها: API به کاربران اجازه میدهد تا اطلاعاتی مانند secrets (اطلاعات حساس) را از Vault ذخیره کنند یا بازیابی نمایند.
- مدیریت تنظیمات و سیاستها: API به شما این امکان را میدهد که دسترسیها، سیاستها (policies)، نقشها و سایر تنظیمات Vault را از طریق درخواستهای HTTP تنظیم و مدیریت کنید.
- برقراری ارتباط با سرویسها: اکثر تعاملات با Vault از طریق API صورت میگیرد، مانند درخواست برای ذخیرهسازی کلیدها، گرفتن دادهها، انجام عملیات رمزنگاری، و بسیاری موارد دیگر.
نکات:
- Vault API از RESTful است، به این معنی که درخواستها از طریق HTTP (GET، POST، PUT، DELETE) انجام میشود.
- شما میتوانید از این API برای انجام عملیات بهصورت خودکار یا برنامهنویسی استفاده کنید.
- برای مثال، استفاده از دستور vault write یا vault read در خط فرمان، در واقع در پسزمینه با استفاده از API انجام میشود.
مثال: برای ذخیرهسازی دادهها در Vault از API، میتوانید یک درخواست HTTP POST به /v1/secret/mysecret بفرستید.
۲. Core (هسته):
هسته (Core) Vault به عنوان مغز عملیات و منطق در Vault عمل میکند. این بخش مسئولیت پردازش درخواستها، اجرای سیاستها، مدیریت دسترسیها، و امنیت کلی Vault را بر عهده دارد.
وظایف Core:
- مدیریت وضعیت Vault: هسته Vault مسئولیت مدیریت وضعیت Vault (sealed و unsealed) را دارد. زمانی که Vault sealed است، درخواستها به جز درخواستهای خاص (مانند unseal) پردازش نمیشوند.
- اجرای سیاستها و دسترسیها: Core تصمیم میگیرد که کدام کاربران یا سیستمها میتوانند به دادههای ذخیره شده در Vault دسترسی داشته باشند، براساس سیاستهای تعیین شده.
- دستکاری دادهها: Core برای انجام عملیات روی دادهها مانند ذخیرهسازی، رمزنگاری، و بازیابی اطلاعات از Vault، مستقیماً با Storage Backend تعامل دارد.
- مدیریت فرآیندها: به طور کلی، Core مسئول پیادهسازی و اجرای منطق تمامی فرآیندهای Vault است. این شامل عملیات مربوط به secrets engines، authentication methods، و غیره میشود.
معماری Core:
- Authentication: هسته یا Core با استفاده از روشهای مختلف احراز هویت مانند AppRole، LDAP، JWT و دیگر موارد، کاربران و سیستمها را احراز هویت میکند.
- Policies: سیاستها (policies) در Core تعریف میشوند و دسترسی کاربران را محدود میکنند. این سیاستها میتوانند بهصورت دقیق مشخص کنند که چه کسانی میتوانند به چه دادههایی دسترسی داشته باشند.
۳. Storage Backend (مخزن ذخیرهسازی):
مخزن ذخیرهسازی (Storage Backend) مسئول ذخیره دادهها، secrets و کلیدهای رمزنگاری است. این بخش دادهها را بهصورت امن در یک پایگاه داده یا سیستم ذخیرهسازی خارجی نگهداری میکند.
وظایف Storage Backend:
- ذخیرهسازی دادهها: تمامی secrets و دادههای دیگر مانند اطلاعات کلیدها و تنظیمات Vault در Storage Backend ذخیره میشوند.
- امنیت: دادهها قبل از ذخیرهسازی در مخزن، بهطور خودکار رمزنگاری میشوند تا از امنیت آنها محافظت شود. برای مثال، اگر شما یک secret را ذخیره کنید، این secret قبل از ذخیره شدن بهطور کامل رمزنگاری میشود.
- مدیریت پایداری: Storage Backend اطمینان حاصل میکند که دادهها بهصورت پایدار و مقاوم در برابر خطا ذخیره شوند.
- پشتیبانی از دادههای مقیاسپذیر: برخی از Storage Backendها مانند Consul، AWS S3 یا Azure Storage میتوانند از مقیاسپذیری خودکار پشتیبانی کنند و Vault میتواند بهطور افقی گسترش یابد.
انواع Storage Backends:
- File System: سیستم Vault میتواند از سیستم فایل به عنوان مخزن ذخیرهسازی استفاده کند. این گزینه برای محیطهای کوچک یا تست مناسب است.
- Consul: Consul یک سیستم ذخیرهسازی مقیاسپذیر است که برای محیطهای بزرگتر و نیازمند مقیاسپذیری طراحی شده است.
- AWS S3: سیستم Vault میتواند دادهها را در S3 ذخیره کند. این برای کاربرانی که در AWS کار میکنند مناسب است.
- Google Cloud Storage: مشابه AWS، سیستم Vault میتواند از Google Cloud Storage برای ذخیره دادهها استفاده کند.
لایه رمزنگاری Vault که به عنوان “مانع” (barrier) شناخته میشود، مسئول رمزنگاری و رمزگشایی دادههای Vault است. زمانی که سرور Vault شروع به کار میکند، دادهها را در مخزن ذخیرهسازی (Storage Backend) خود مینویسد. از آنجا که مخزن ذخیرهسازی خارج از مرزهای لایه رمزنگاری قرار دارد، این مخزن به عنوان مکان غیرمطمئن شناخته میشود، بنابراین Vault دادهها را قبل از ارسال به مخزن ذخیرهسازی رمزنگاری میکند. این مکانیزم تضمین میکند که اگر یک حملهکننده مخرب سعی کند به مخزن ذخیرهسازی دسترسی پیدا کند، دادهها نمیتوانند به خطر بیافتند، زیرا تا زمانی که Vault آنها را رمزگشایی نکند، همچنان رمزنگاری شده باقی خواهند ماند. مخزن ذخیرهسازی یک لایه پایدار برای حفظ دادهها ارائه میدهد که دادهها در آن امن هستند و پس از راهاندازی مجدد سرور در دسترس باقی میمانند.
زمانی که سرور Vault شروع به کار میکند، ابتدا در حالت sealed قرار دارد. قبل از اینکه هر عملیاتی روی Vault انجام شود، باید از حالت sealed خارج شود. این کار با ارائه کلیدهای unseal انجام میشود. در طی فرایند راهاندازی Vault، یک کلید رمزنگاری تولید میشود که برای محافظت از تمام دادههای Vault استفاده میشود. این کلید توسط یک کلید ریشه (root key) محافظت میشود که همراه با سایر دادههای Vault ذخیره میشود، اما با یک مکانیزم دیگر یعنی unseal key رمزنگاری میشود.
به طور پیشفرض، Vault از Shamir’s Secret Sharing برای تقسیم کلید unseal به تعداد مشخصی از بخشها (shards) استفاده میکند. تعداد دقیق بخشها برای بازسازی کلید unseal لازم است که سپس برای رمزگشایی کلید ریشه Vault استفاده میشود.
تعداد بخشها (shares) و حداقل تعداد بخشهای مورد نیاز (shards) قابل تعیین هستند. تکنیک Shamir’s Secret Sharing میتواند غیرفعال شود و کلید ریشه (root key) میتواند به طور مستقیم برای unsealing استفاده شود. پس از اینکه Vault کلید رمزنگاری را دریافت میکند، دادهها را در مخزن ذخیرهسازی رمزگشایی کرده و وارد حالت unsealed میشود. پس از باز شدن (unsealed)، Vault دستگاههای نظارت (audit devices)، روشهای احراز هویت (auth methods) و موتورهای secrets پیکربندی شده را بارگذاری میکند.
توجه: پیکربندی پیشفرض Vault از seal شامییر (Shamir) استفاده میکند؛ اما Vault میتواند بهطور خودکار از طریق یک سیستم مدیریت کلید ابری مورد اعتماد (KMS) یا ماژول امنیتی سختافزاری (HSM) برای افزایش امنیت باز شود (auto unsealed).
پیکربندی دستگاههای نظارت، روشهای احراز هویت و موتورهای secrets حساس به امنیت هستند و در Vault ذخیره میشوند. کاربران با مجوزهای مناسب میتوانند آنها را تغییر دهند و نمیتوانند خارج از لایه امنیتی (barrier) مشخص شوند. با ذخیرهسازی آنها در Vault، تغییرات توسط سیستم ACL محافظت شده و در لاگهای نظارتی (audit logs) پیگیری میشوند.
پس از اینکه Vault باز شد (unsealed)، درخواستها از طریق API HTTP در هسته (core) پردازش میشوند. هسته مدیریت جریان درخواستها در سیستم را بر عهده دارد، ACLها را اعمال کرده و اطمینان مییابد که لاگبرداری نظارتی به درستی انجام شود.
زمانی که یک مشتری برای اولین بار به Vault متصل میشود، باید احراز هویت کند. Vault روشهای احراز هویت قابل پیکربندی ارائه میدهد و انعطافپذیری در مکانیزم احراز هویت استفاده شده دارد. مکانیزمهایی مانند نام کاربری/کلمه عبور یا GitHub میتوانند برای اپراتورها استفاده شوند، در حالی که برنامهها میتوانند از کلیدهای عمومی/خصوصی یا توکنها برای احراز هویت استفاده کنند. یک درخواست احراز هویت که از طریق هسته به یک روش احراز هویت میرود، تعیین میکند که آیا درخواست معتبر است یا خیر و فهرستی از سیاستهای مرتبط را باز میگرداند.
سیاستها تنها یک قانون ACL با نام هستند. برای مثال، سیاست “root” داخلی است و دسترسی به تمام منابع را مجاز میکند. شما میتوانید هر تعداد سیاست با نام دلخواه ایجاد کنید و کنترل دقیقتری روی مسیرها داشته باشید. Vault در حالت دسترسی مجاز عمل میکند، به این معنی که عمل خاصی تنها زمانی مجاز است که از طریق یک سیاست به طور صریح دسترسی به آن داده شده باشد. از آنجا که یک کاربر ممکن است چندین سیاست مرتبط داشته باشد، اعمالی زمانی مجاز هستند که سیاست اجازه دهد. سیاستها در یک ذخیرهگاه داخلی ذخیره و مدیریت میشوند. این ذخیرهگاه داخلی از طریق مخزن سیستم (system backend) که همیشه در مسیر sys/ مونت شده است، تأثیر میپذیرد.
پس از اینکه احراز هویت انجام شد و یک روش احراز هویت مجموعهای از سیاستهای قابل اعمال را ارائه داد، یک توکن جدید برای مشتری ایجاد میشود که توسط ذخیرهگاه توکن (token store) مدیریت میشود. این توکن مشتری برای انجام درخواستهای بعدی استفاده میشود. این روش توکن مشابه به کوکی است که توسط یک وبسایت زمانی که کاربر وارد میشود ارسال میشود. بسته به پیکربندی روش احراز هویت، توکن مشتری ممکن است یک مهلت (lease) مرتبط با خود داشته باشد و نیاز به تمدید دورهای برای جلوگیری از غیرمعتبر شدن داشته باشد.
پس از احراز هویت، درخواستها با ارائه توکن مشتری انجام میشوند. توکن مشتری برای تایید هویت مشتری استفاده میشود و اطمینان مییابد که مشتری مجاز است، در حالی که سیاستهای مربوطه بارگذاری میشوند. سپس، سیاستها برای مجاز کردن درخواست مشتری استفاده میشوند. درخواست به موتور secrets هدایت میشود که بسته به نوع آن پردازش میشود. زمانی که موتور secrets داده محرمانه را باز میگرداند، هسته آن را در مدیر انقضا (expiration manager) ثبت کرده و یک شناسه مهلت (lease ID) به آن متصل میکند. مشتریان از شناسه مهلت برای تمدید یا لغو داده محرمانه خود استفاده میکنند. مدیر انقضا بهطور خودکار داده محرمانه را لغو میکند اگر مشتری اجازه دهد که مهلت آن منقضی شود.
هسته درخواستها و پاسخها را در بروکر نظارتی (audit broker) ثبت کرده و درخواستها را به تمام دستگاههای نظارتی پیکربندی شده توزیع میکند. خارج از جریان درخواستها، هسته فعالیتهای خاصی را در پسزمینه انجام میدهد. مدیریت مهلتها بسیار حیاتی است، بهطوری که توکنها یا دادههای محرمانه منقضی شده بهطور خودکار لغو میشوند. علاوه بر این، Vault موارد خاص شکست جزئی را با استفاده از نوشتن پیشرو (write-ahead logging) و مدیر بازگشت (rollback manager) مدیریت میکند. این فرایند بهطور شفاف در هسته مدیریت میشود و برای کاربران قابل مشاهده نیست.
نحوه راه اندازی HashiCorp Vault در اوبونتو
در این راهنما، HashiCorp Vault را روی Ubuntu 24.04 نصب و پیکربندی میکنیم. Vault یکی از ابزارهای کلیدی برای مدیریت امن اطلاعات حساس مانند رمزهای عبور، کلیدهای API و دادههای رمزگذاریشده است.
۱. پیشنیازها
قبل از نصب، اطمینان حاصل کنید که:
- شما به دسترسی ریشه (root) یا sudo نیاز دارید.
- Ubuntu Server/Desktop نصب شده باشد.
- ابزارهای پایهای مانند
curlوwgetدر سیستم شما موجود باشند.
بروزرسانی سیستم
ابتدا سیستم را بروزرسانی کنید:
sudo apt update && sudo apt upgrade -y
۲. نصب HashiCorp Vault
روش ۱: نصب از مخزن رسمی HashiCorp
HashiCorp یک مخزن رسمی برای Ubuntu دارد که میتوان از آن برای نصب Vault استفاده کرد.
۱. افزودن کلید GPG و مخزن HashiCorp
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
۲. نصب Vault
sudo apt update
sudo apt install vault -y
۳. بررسی نصب
برای تأیید اینکه Vault بهدرستی نصب شده است، دستور زیر را اجرا کنید:
vault --version
خروجی چیزی شبیه به این خواهد بود:
Vault v1.18.3
۳. پیکربندی اولیه Vault
Vault به دو روش اجرا میشود:
- Development Mode (برای تست و توسعه)
- Production Mode (در محیط عملیاتی)
حالت توسعه (Development Mode)
این روش برای آزمایش Vault استفاده میشود. در این حالت دادهها در حافظه RAM ذخیره میشوند و با ریاستارت شدن سیستم، پاک خواهند شد.
برای اجرای Vault در حالت توسعه:
vault server -dev
پس از اجرا، مقدار Root Token نمایش داده میشود که برای دسترسی به Vault لازم است. این مقدار را ذخیره کنید.
برای استفاده از Vault، در یک ترمینال جدید این متغیر را تنظیم کنید:
export VAULT_ADDR='http://127.0.0.1:8200'
export VAULT_TOKEN='<Root Token نمایش دادهشده>'
بعد از هر restart باید دوباره کامند export VAULT_ADDR=’http://127.0.0.1:8200′ را بزنید (البته اگر بخواهید از CLI استفاده کنید). اما با گذاشتن آن در فایل bashrc. یوزر root میتوانید این کار را اتوماتیک کنید.
حالت عملیاتی (Production Mode)
در محیط عملیاتی، Vault نیاز به یک فایل پیکربندی دارد.
۱. ایجاد فایل پیکربندی
یک فایل جدید ایجاد کنید:
sudo mkdir -p /etc/vault
sudo vim /etc/vault/config.hcl
و محتوای زیر را در آن قرار دهید:
storage "file" {
path = "/var/lib/vault/data"
}
listener "tcp" {
address = "0.0.0.0:8200"
tls_disable = 1
}
disable_mlock = true
ui = true
۲. تنظیم دسترسیها
sudo mkdir -p /var/lib/vault/data
sudo chown -R vault:vault /var/lib/vault
sudo chmod 700 /var/lib/vault/data
۳. ایجاد سرویس systemd
یک فایل جدید برای سرویس systemd ایجاد کنید:
sudo vim /etc/systemd/system/vault.service
و متن زیر را در آن قرار دهید:
[Unit]
Description=HashiCorp Vault - A tool for managing secrets
Documentation=https://www.vaultproject.io/docs/
After=network.target
[Service]
User=vault
Group=vault
ExecStart=/usr/bin/vault server -config=/etc/vault/config.hcl
ExecReload=/bin/kill --signal HUP $MAINPID
KillMode=process
Restart=on-failure
LimitMEMLOCK=infinity
[Install]
WantedBy=multi-user.target
۴. فعالسازی و اجرای سرویس
sudo systemctl daemon-reload
sudo systemctl enable vault
sudo systemctl start vault
برای اطمینان از اجرای صحیح سرویس:
sudo systemctl status vault
۴. مقداردهی اولیه و آنلاک کردن Vault
Vault برای اولین بار باید مقداردهی اولیه شود.
۱. تنظیم آدرس Vault
export VAULT_ADDR='http://127.0.0.1:8200'
۲. مقداردهی اولیه
vault operator init
این دستور ۵ کلید (Unseal Keys) و یک Root Token تولید میکند.
مهم: این اطلاعات را در جایی امن ذخیره کنید، زیرا بدون این کلیدها، Vault را نمیتوان آنلاک کرد.
۳. باز کردن Vault (Unsealing)
برای باز کردن Vault، باید حداقل ۳ تا از ۵ کلید Unseal Key را وارد کنید:
vault operator unseal <Unseal Key 1>
vault operator unseal <Unseal Key 2>
vault operator unseal <Unseal Key 3>
۴. ورود به Vault
vault login <Root Token>
۵. فعالسازی رابط کاربری (UI)
رابط گرافیکی Vault بهصورت پیشفرض در پورت ۸۲۰۰ اجرا میشود. میتوانید از طریق مرورگر به آن دسترسی پیدا کنید:
http://127.0.0.1:8200
ورود با Root Token امکانپذیر است.
۶. ذخیره و بازیابی داده در Vault
۱. ذخیره داده
vault kv put secret/mydata password="mypassword"
۲. دریافت داده
vault kv get secret/mydata
۳. حذف داده
vault kv delete secret/mydata
۷. متوقف کردن و حذف Vault
اگر نیاز به متوقف کردن Vault دارید:
sudo systemctl stop vault
برای حذف Vault:
sudo apt remove --purge vault -y
sudo rm -rf /etc/vault /var/lib/vault
۸. فعال کردن Audit logging
برای فعال کردن Audit Logging در HashiCorp Vault، شما باید یک یا چند audit device را پیکربندی کنید. این دستگاهها (devices) میتوانند به شما کمک کنند تا تمامی عملیاتهای انجامشده در Vault، مانند درخواستها، پاسخها و سایر جزئیات مرتبط با امنیت، ثبت و ذخیره شوند.
فعالسازی Audit Device: Vault پشتیبانی از انواع مختلف audit device را دارد، مانند file, syslog, socket, و auditd. در ادامه نحوه فعالسازی audit device از نوع file آورده شده است:
برای ذخیره لاگها در یک فایل، دستور زیر را وارد کنید:
vault audit enable file file_path=/var/lib/vault/data/vault_audit.log
مشاهده وضعیت Audit Devices: پس از فعالسازی audit device، میتوانید بررسی کنید که آیا بهدرستی فعال شده است یا خیر:
vault audit list
از دستور زیر برای دیدن live لاگها استفاده نمایید:
#tail -f /var/lib/vault/data/vault_audit.log
لاگهای خروجی دستور بالا ممکن است برای شما نامفهوم باشد. برای همین از دستور زیر نیز میتوانید استفاده کنید:
#tail -f /var/lib/vault/data/vault_audit.log | jq
jq یک ابزار خط فرمان برای پردازش و فرمتبندی دادههای JSON است. با این کار، خروجی که از دستور tail -f دریافت میشود (که لاگها بهصورت JSON هستند) به jq ارسال میشود و jq آن را پردازش میکند.
فرآیند Unseal برای باز کردن و فعال کردن Vault
در HashiCorp Vault، فرآیند “Unseal” برای باز کردن و فعال کردن Vault پس از راهاندازی مجدد یا ریستارت شدن استفاده میشود. وقتی Vault شروع به کار میکند، به دلیل مسائل امنیتی، دادههای ذخیرهشده در آن به طور پیشفرض رمزگذاری شدهاند و برای دسترسی به آنها باید Vault را “unseal” یا باز کنید.
برای انجام این کار، به مجموعهای از کلیدها به نام Unseal Keys نیاز دارید. در نسخههای معمولی Vault، ۵ کلید Unseal تولید میشود که به طور مشترک برای باز کردن Vault استفاده میشوند.
کاربرد کلیدهای Unseal:
- باز کردن (Unseal) Vault: وقتی Vault راهاندازی میشود، به طور پیشفرض قفل است و برای دسترسی به دادهها باید ابتدا باز شود. این کار با استفاده از این ۵ کلید انجام میشود.
- تقسیم مسئولیت: هر یک از این ۵ کلید به یک نفر یا یک سیستم خاص داده میشود. بنابراین هیچکسی نمیتواند به تنهایی Vault را باز کند، و این باعث افزایش امنیت میشود. به عبارت دیگر، برای باز کردن Vault به تعداد مشخصی از افراد یا سیستمها نیاز است.
- مدیریت دسترسی: این کلیدها به صورت عمومی در دسترس نیستند و فقط افرادی که مجوز دارند میتوانند از آنها برای باز کردن Vault استفاده کنند. این فرآیند به کنترل دسترسی کمک میکند.
در نهایت، از کلیدهای Unseal برای این استفاده میشود که بتوانید Vault را باز کرده و به اطلاعات داخل آن دسترسی پیدا کنید. اما چون امنیت بسیار مهم است، نیاز است که این ۵ کلید به صورت مشترک استفاده شوند و برای حفظ امنیت Vault به هیچ عنوان نباید در دسترس افراد غیرمجاز قرار گیرند.
در رابطه با تقسیم مسئولیت و نحوه استفاده از کلیدهای Unseal برای باز کردن Vault، هدف اصلی این است که هیچکسی به تنهایی نتواند به Vault دسترسی پیدا کند، و این کار به افزایش امنیت کمک میکند. به عبارت دیگر، برای باز کردن Vault باید تعداد مشخصی از افراد یا سیستمها با هم همکاری کنند.
نحوه انجام این کار:
- تولید کلیدها (Key Generation):
- در هنگام راهاندازی Vault، وقتی که Vault به صورت اولیه پیکربندی میشود، ۵ کلید Unseal تولید میشود. این کلیدها به صورت تصادفی و امن ایجاد میشوند.
- به طور پیشفرض، Vault به شما میگوید که این ۵ کلید را ذخیره و محافظت کنید، چرا که برای دسترسی به Vault بعد از هر بار ریستارت یا راهاندازی مجدد به این کلیدها نیاز خواهید داشت.
- تقسیم این کلیدها بین افراد یا سیستمها:
- این ۵ کلید میتوانند بین ۵ نفر یا سیستم مختلف تقسیم شوند.
- تقسیم مسئولیت به این معناست که هر فرد یا سیستم تنها یک یا چند کلید را دارد و بدون داشتن کلیدهای دیگر نمیتواند Vault را باز کند.
- برای مثال:
- کلید ۱ به مدیر سیستم ۱
- کلید ۲ به مدیر سیستم ۲
- کلید ۳ به مدیر سیستم ۳
- کلید ۴ به مدیر سیستم ۴
- کلید ۵ به مدیر سیستم ۵
- فرآیند Unseal Vault:
- برای باز کردن Vault پس از راهاندازی مجدد، نیاز است که حداقل تعداد مشخصی از کلیدها وارد شوند. این مقدار به تنظیمات پیکربندی Vault بستگی دارد. به طور پیشفرض این مقدار ۳ است (یعنی ۳ کلید از ۵ کلید باید وارد شوند تا Vault باز شود).
- فرض کنید تنظیمات بهگونهای است که نیاز به حداقل ۳ کلید دارید:
- مدیر ۱ کلید ۱ را وارد میکند.
- مدیر ۲ کلید ۲ را وارد میکند.
- مدیر ۳ کلید ۳ را وارد میکند.
- در این حالت، پس از وارد کردن این ۳ کلید، Vault باز میشود و دسترسی به دادهها امکانپذیر خواهد بود.
- مفهوم Shamir’s Secret Sharing:
- HashiCorp Vault از الگوریتم Shamir’s Secret Sharing برای تقسیم کلیدهای Unseal استفاده میکند. این الگوریتم به شما این امکان را میدهد که کلید را به بخشهای مختلف تقسیم کنید، به طوری که برای بازسازی کلید اصلی، حداقل تعداد مشخصی از بخشها لازم باشد.
- به عبارت سادهتر، شما میتوانید بگویید که برای باز کردن Vault به حداقل ۳ کلید از ۵ کلید نیاز است (این مقدار قابل تنظیم است).
- این کار باعث میشود که اگر یکی از افراد دسترسی به Vault را نداشته باشد (به دلیل غیبت، تغییر شغل یا هر دلیل دیگر)، Vault هنوز قابل باز شدن باشد، ولی به شرطی که تعداد معینی از افراد کلیدهای خود را وارد کنند.
-
مزایای امنیتی:
- پیشگیری از اشتباهات و سوء استفادهها: با تقسیم کلیدها بین افراد مختلف، هیچکسی نمیتواند به تنهایی Vault را باز کند. اینکار باعث میشود که در صورت دسترسی یکی از افراد به Vault، بقیه افراد بتوانند به راحتی متوجه شوند که به طور ناخواسته Vault باز شده است.
- قابلیت کنترل دسترسی: به کمک تقسیم کلیدها، شما میتوانید برای هر فرد سطح دسترسی خاصی تعیین کنید و امنیت بیشتری را فراهم کنید.
- پایداری و تابآوری: اگر یکی از کلیدها گم یا خراب شود، هنوز هم میتوانید از باقیمانده کلیدها برای باز کردن Vault استفاده کنید، زیرا Vault به تعداد مشخصی از کلیدها نیاز دارد، نه به تمامی کلیدها.
کاربرد Root Token در HashiCorp Vault
در هشی کورپ والت، Root Token یک توکن ویژه و قدرتمند است که دسترسی کامل و بیقید و شرط به تمام عملیات و منابع موجود در Vault را فراهم میکند. این توکن مشابه با “حساب ابرکاربر” در سایر سیستمها است. به عبارت دیگر، Root Token اجازه میدهد تا تمام تنظیمات و دادههای Vault بدون هیچ محدودیتی مشاهده یا تغییر داده شوند.
ویژگیها و کاربردهای Root Token:
- دسترسی کامل به همه منابع:
- Root Token به کاربر یا سیستمی که آن را دارد، اجازه میدهد به تمامی دادهها، پیکربندیها، و تنظیمات Vault دسترسی داشته باشد.
- با استفاده از این توکن میتوان به راحتی پیکربندیهای Vault را تغییر داد، دادهها را ذخیره یا حذف کرد، سیاستهای دسترسی (Policies) را تنظیم کرد و کاربران جدید را اضافه یا حذف نمود.
- اجرای عملیات مدیریتی:
- به عنوان مثال، اگر بخواهید Vault را باز (unseal) کنید یا توکنهای دسترسی جدید (Access Tokens) تولید کنید، به دسترسی مدیریتی نیاز دارید که معمولاً از طریق Root Token انجام میشود.
- همچنین Root Token برای ایجاد policyهای جدید یا تنظیمات امنیتی خاص نیز استفاده میشود.
- تولید و صدور Root Token:
- در هنگام نصب و راهاندازی والت، Root Token برای اولین بار ایجاد میشود. این توکن معمولاً فقط یکبار در زمان راهاندازی Vault قابل مشاهده است و باید با دقت زیادی نگهداری شود.
- از آنجا که این توکن قدرت زیادی دارد، باید آن را در یک مکان امن ذخیره کرد و دسترسی آن را محدود نمود.
- خطرات استفاده از Root Token:
- به دلیل اینکه Root Token دسترسی کامل به Vault را فراهم میکند، استفاده از آن باید به حداقل برسد. برای جلوگیری از اشتباهات یا سوء استفاده، توصیه میشود که این توکن فقط در زمانهای ضروری استفاده شود.
- نکته امنیتی: اگر یک نفر یا سیستم به طور غیرمجاز به Root Token دسترسی پیدا کند، میتواند به تمامی اطلاعات Vault دسترسی پیدا کند و به راحتی آسیبهای جدی وارد کند.
- رفع نیاز به Root Token (پس از استفاده اولیه):
- در بهترین شرایط، پس از استفاده از Root Token برای راهاندازی و پیکربندی اولیه Vault، بهتر است که به سرعت یک توکن با سطح دسترسی محدودتر برای استفاده روزمره ایجاد کنید.
- از طریق Access Control Policies میتوانید توکنهایی با سطح دسترسی خاص ایجاد کنید که برای هر کاربر و برنامه فقط دسترسی محدود به منابع مشخصی داشته باشند.
به عبارت دیگر، Root Token به عنوان یک ابزار مدیریتی در ابتدا برای پیکربندی و تنظیم Vault استفاده میشود، ولی پس از آن بهتر است که توکنهای دسترسی محدودتر ایجاد و استفاده شوند تا از خطرات احتمالی ناشی از دسترسی بیرویه جلوگیری شود.
آیا میتوان Root Token را تغییر داد؟
بله، در HashiCorp Vault میتوان Root Token را غیرفعال (revoked) کرد، اما به طور مستقیم تغییر آن امکانپذیر نیست. در واقع، Vault اجازه نمیدهد که Root Token را مستقیماً تغییر دهید، زیرا این توکن یک توکن ویژه است که دسترسی کامل به سیستم دارد. اما، برای امنیت بیشتر، میتوان اقدامات زیر را انجام داد:
۱. غیرفعال کردن Root Token (Revocation):
- شما میتوانید Root Token را غیرفعال کنید (revoked)، به این معنی که بعد از غیرفعالسازی، دیگر نمیتوان از آن برای دسترسی به Vault استفاده کرد.
- این کار معمولاً بعد از ایجاد یک یا چند Access Token جدید با دسترسی محدودتر انجام میشود. به این صورت، دسترسی کامل به Vault فقط از طریق توکنهای جدید و مدیریتشده خواهد بود.
برای غیرفعال کردن Root Token، باید دستور زیر را اجرا کنید:
vault token revoke <root_token>
این دستور Root Token را غیرفعال میکند و پس از آن دیگر قابل استفاده نخواهد بود.
۲. ایجاد یک توکن جدید با دسترسی کامل:
- به جای تغییر Root Token، شما میتوانید یک توکن جدید با دسترسی مشابه یا بیشتر (دسترسی کامل) ایجاد کنید. این کار معمولاً از طریق ایجاد یک Access Token جدید با سطح دسترسی مدیریتی انجام میشود.
- برای این کار میتوانید از دستور زیر استفاده کنید تا یک توکن جدید با دسترسی کامل (با سیاستهای مورد نظر) ایجاد کنید:
vault token create -policy="root-policy" -orphan
توجه کنید که در اینجا باید سیاستهایی را ایجاد کنید که سطح دسترسی مشابه Root Token را فراهم کند.
بررسی kv secret engine در Vault
در هشی کورپ والت، KV Secret Engine (که مخفف “Key-Value Secret Engine” است) یکی از مهمترین و رایجترین پلاگینها یا موتورها برای ذخیرهسازی و مدیریت دادههای حساس است. این موتور به شما این امکان را میدهد که اطلاعات مختلف مانند پسوردها، توکنها، کلیدهای رمزنگاری، یا هر نوع داده حساس دیگری را بهصورت امن ذخیره و مدیریت کنید.
ویژگیهای اصلی KV Secret Engine در Vault:
- ساختار ذخیرهسازی دادهها بهصورت کلید-مقدار (Key-Value):
- در این مدل، اطلاعات بهصورت جفتهای کلید-مقدار ذخیره میشوند. به عبارت سادهتر، شما یک کلید (مثلاً نام یک سرویس یا کاربر) دارید که به آن مقدار (مانند پسورد، توکن یا دادههای حساس دیگر) نسبت داده میشود.
- بهعنوان مثال، ممکن است یک سرویس داشته باشید که پسوردی خاص دارد:
secret/myapp/password = "mySecretPassword123"
- دسترسی بر اساس سیاستها (Policies):
- Vault از سیستم پالیسی استفاده میکند که دسترسی به دادههای ذخیرهشده را کنترل میکند. شما میتوانید برای هر کاربر، سرویس، یا اپلیکیشن، سطح دسترسی خاصی برای خواندن، نوشتن یا حذف دادهها تعیین کنید.
- بهطور مثال، شما میتوانید تعیین کنید که فقط برخی کاربران یا سرویسها حق دسترسی به کلید خاصی را دارند.
-
نسخهبندی دادهها:
- یکی از ویژگیهای برجسته KV v2، قابلیت نسخهبندی است. در این حالت، هر بار که دادهای تغییر میکند، یک نسخه جدید از آن در Vault ذخیره میشود و میتوان به نسخههای قبلی دسترسی پیدا کرد.
- این ویژگی برای حفظ تاریخچه تغییرات دادهها یا بازیابی دادهها در صورت نیاز به یک نسخه قبلی بسیار مفید است.
-
دادههای حساس با رمزنگاری خودکار:
- همه دادهها که در Vault ذخیره میشوند بهصورت خودکار رمزنگاری میشوند. Vault از الگوریتمهای رمزنگاری قوی برای حفاظت از دادهها استفاده میکند و تضمین میکند که دادهها فقط توسط افرادی که مجوز دارند قابل دسترسی هستند.
- این فرآیند رمزنگاری و رمزگشایی بهصورت شفاف و بدون نیاز به دخالت کاربر انجام میشود.
-
مکانیزمهای تایید اعتبار:
- Vault از مکانیزمهای تایید هویت (Authentication) مختلفی مانند AWS IAM, AppRole, LDAP, JWT و بسیاری دیگر پشتیبانی میکند تا فقط کاربران و سرویسهای معتبر بتوانند به دادهها دسترسی پیدا کنند.
- پشتیبانی از چندین روش ذخیرهسازی:
- علاوه بر مدل کلید-مقدار ساده، شما میتوانید از Vault برای ذخیرهسازی دیگر دادههای حساس نیز استفاده کنید، مانند مخفی کردن دادهها با استفاده از یک رمز عبور ثابت یا دادههای حساس بهصورت رمزنگاری شده.
ورژنهای KV:
- KV v1: مدل ابتدایی که صرفاً امکان ذخیرهسازی جفتهای کلید-مقدار را بهصورت ساده فراهم میکند.
- KV v2: ورژن جدیدتر که علاوه بر ذخیرهسازی جفتهای کلید-مقدار، امکانات پیشرفتهتری مانند نسخهبندی و کنترل دقیقتر روی دادهها را فراهم میکند.
مثال استفاده از KV Secret Engine:
فرض کنید شما میخواهید پسورد یک دیتابیس را در Vault ذخیره کنید:
- برای فعالسازی KV Secret Engine، ابتدا باید آن را فعال کنید (در صورتی که فعال نشده باشد):
vault secrets enable -path=secret kv - سپس میتوانید دادهها را ذخیره کنید:
vault kv put secret/db-password password="supersecretpassword" - برای دریافت دادهها:
vault kv get secret/db-password
انواع استوریج
دو نوع رایج استوریج در این نرم افزار عبارتند از Raft و File. مفهوم Raft Storage در HashiCorp Vault و تفاوت آن با File Storage به نحوه ذخیرهسازی و پایداری دادهها مربوط میشود.
۱. Raft Storage:
Raft یک الگوریتم اجماع توزیعشده است که برای اطمینان از همگامسازی و هماهنگی دادهها بین چندین نود در یک خوشه (cluster) استفاده میشود. در Vault، اگر از Raft بهعنوان سیستم ذخیرهسازی استفاده کنید، دادهها به صورت توزیعشده و در میان چندین نود (که معمولاً در یک خوشه Vault قرار دارند) ذخیره میشوند.
- مقیاسپذیری: Raft به شما امکان میدهد که چندین نود داشته باشید و دادهها را بهصورت همزمان در همه نودها همگامسازی کنید.
- در دسترس بودن بالا: اگر یکی از نودها از دست برود، بقیه نودها میتوانند به کار خود ادامه دهند و دادهها بهخوبی پایداری دارند.
- انتقال خودکار: Raft به Vault کمک میکند تا دادهها به طور خودکار در میان نودها توزیع شوند و از مشکلاتی مانند از دست رفتن دادهها جلوگیری کند.
۲. File Storage:
در حالت File Storage، دادهها در یک فایل سیستمی (مانند فایلهای محلی روی دیسک) ذخیره میشوند. این روش معمولاً در محیطهای تکنودی یا زمانی که مقیاسپذیری زیاد نیاز نیست، کاربرد دارد.
- سادگی: این نوع ذخیرهسازی ساده است و نیاز به تنظیمات پیچیده ندارد.
- محدودیت مقیاسپذیری: چون دادهها فقط روی یک نود ذخیره میشوند، اگر آن نود از دست برود، دادهها بهطور کامل از دست خواهند رفت.
- در دسترس بودن پایینتر: در صورتی که سرور Vault با مشکل مواجه شود، سرویس Vault از دسترس خارج میشود و دادهها غیرقابل دسترس میشوند.
تفاوتها:
-
مقیاسپذیری و توزیع:
- Raft: از مقیاسپذیری بهصورت توزیعشده پشتیبانی میکند و میتواند چندین نود را برای همگامسازی دادهها استفاده کند.
- File: معمولاً روی یک سیستم محلی ذخیرهسازی است و تنها در یک نود ذخیره میشود.
- در دسترس بودن:
- Raft: در صورت از دست رفتن یک نود، Vault میتواند ادامه دهد و دادهها همچنان در دسترس هستند.
- File: در صورت از دست رفتن نود، دادهها از دست میروند و Vault از دسترس خارج میشود.
- استفاده در محیطهای بزرگ:
- Raft: برای محیطهای با تعداد زیاد نود و نیاز به دسترسی بالا طراحی شده است.
- File: بیشتر برای محیطهای کوچک یا تکنودی استفاده میشود.
در نهایت، انتخاب بین Raft و File بستگی به نیازهای مقیاسپذیری، پایداری و عملکرد شما دارد. اگر به یک خوشه Vault با مقیاس بزرگ نیاز دارید و میخواهید از دادههای خود در برابر خرابیها محافظت کنید، Raft انتخاب بهتری خواهد بود. اگر تنها یک نود Vault دارید و به سادگی نیاز دارید، File گزینه مناسبی است.
بررسی دستورات HashiCorp Vault
دستور vault write و vault read
دستورات vault write و vault read در HashiCorp Vault برای تعامل با دادهها و اطلاعات ذخیرهشده استفاده میشوند. این دستورات به شما اجازه میدهند تا دادهها را ذخیره (write) یا بازیابی (read) کنید. در اینجا هر یک از این دستورات را به همراه مثالهای کاربردی توضیح میدهیم.
۱. دستور vault write:
دستور vault write برای نوشتن (ذخیرهسازی) دادهها در Vault استفاده میشود. معمولاً این دستور برای ذخیرهسازی مقادیر در موتورهای مختلف مانند KV Secret Engine، PKI, Transit و غیره بهکار میرود.
ساختار کلی:
vault write <path> <data>
- <path>: مسیر یا مسیرهای موردنظر برای ذخیرهسازی دادهها (مانند secret/mysecret).
- <data>: دادههایی که میخواهید ذخیره کنید (مانند جفتهای کلید-مقدار).
مثال:
فرض کنید شما میخواهید پسورد یک دیتابیس را در Vault ذخیره کنید.
فعالسازی KV Secret Engine (اگر قبلاً فعال نشده باشد):
-
vault secrets enable -path=secret kv - نوشتن دادهها (مثلاً پسورد دیتابیس):
vault write secret/db-password password="supersecretpassword"
در اینجا:
- secret/db-password: مسیر ذخیرهسازی داده در Vault است.
- password=”supersecretpassword”: دادهای است که میخواهیم ذخیره کنیم (در اینجا، پسورد دیتابیس).
توضیحات:
- پس از اجرای این دستور، Vault دادههای مربوط به پسورد را در مسیر secret/db-password ذخیره میکند.
- Vault بهطور خودکار دادهها را رمزنگاری کرده و ذخیره میکند.
۲. دستور vault read:
دستور vault read برای خواندن دادهها از Vault استفاده میشود. با استفاده از این دستور میتوانید مقادیر ذخیرهشده در یک مسیر خاص را بازیابی کنید.
ساختار کلی:
vault read <path>
- <path>: مسیری که میخواهید دادهها را از آن بخوانید.
مثال: حالا فرض کنید میخواهید پسوردی را که قبلاً ذخیره کردهاید، بخوانید:
vault read secret/db-password
این دستور دادههای ذخیرهشده در مسیر secret/db-password را بازیابی میکند.
خروجی:
اگر دادهها به درستی ذخیره شده باشند، خروجی چیزی مشابه به این خواهد بود:
Key Value
--- -----
password supersecretpassword
در اینجا:
- password: کلیدی است که شما برای ذخیرهسازی پسورد استفاده کردهاید.
- supersecretpassword: مقداری است که هنگام نوشتن دادهها وارد کردهاید.
استفاده از vault write و vault read برای مدیریت دادههای حساس:
یکی از رایجترین کاربردهای این دستورات، مدیریت پسوردها یا کلیدهای API است که باید در سیستمهای مختلف امن و با دسترسی کنترلشده ذخیره شوند.
مثال پیشرفته (استفاده از نسخهبندی در KV v2):
اگر شما از KV Secret Engine v2 استفاده میکنید، میتوانید دادهها را با نسخهبندی ذخیره کنید.
-
ذخیره نسخه اول:
vault write secret/v2/db-password password="firstPassword" - بازیابی نسخه اول:
vault read secret/v2/db-password - ذخیره نسخه جدید:
vault write secret/v2/db-password password="secondPassword" - بازیابی نسخه خاص (مثلاً نسخه اول):
vault read secret/v2/db-password?version=1
این ویژگی به شما امکان میدهد که تاریخچه دادهها را نگهداری کرده و در صورت نیاز به دادههای قبلی، آنها را بازیابی کنید.



