WIUNIX ACADEMY
پشتیبانگیری رمزگذاریشده با restic و آزمون بازیابی در محیط جدا
از خروجی ثابت برنامه روی میزبان مستقل پشتیبان بگیرید، شناسهٔ دقیق snapshot را نگه دارید و بازیابی را با مقایسهٔ فایلها و آزمون برنامه بسنجید.
محیطت را انتخاب کنآموزش متناسب با محیط تو
کجا اجرا میکنی؟
سیستمعامل و نسخه را انتخاب کن تا مراحل، دستورها و راهحلها برای همان محیط نمایش داده شوند.
آموزش متناسب با مقادیر تو
تنظیمات این آموزش
مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر میکنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری میشوند و به سرور یا لینک اشتراکگذاری فرستاده نمیشوند. پیش از اجرا، DNS، گواهیها و سیاست شبکهٔ واقعی را بررسی کن.
آیپی، دامنه یا پورت مثالها با محیط تو فرق دارد؟ دکمهٔ زیر را باز کن، مقادیر را تغییر بده و «اعمال در آموزش» را بزن؛ سپس دستورهای بهروزشده را کپی کن.
تنظیم مقادیر برای محیط من7 مقدار قابلتغییر
از اینجا شروع کن
در پایان چه چیزی خواهی داشت؟
برای یک خروجی ثابت و سازگار برنامه، پشتیبان خارج از میزبان بسازید و همان snapshot را در مسیر جدا بازیابی و با فایلهای اصلی مقایسه کنید.
سیستمعاملها و نسخههای پوششدادهشده
فرمانها و تفاوتهای محیطهای منتخب با مستندات رسمی بررسی شدهاند؛ این بررسی به معنای اجرای عملی روی همهٔ سیستمها یا سرویس شما نیست.
قبل از شروع
- نسخهٔ موجود و تأییدشدهٔ restic با امکانات مستند این آموزش، خروجی ثابت برنامه و مسئول مشخص داده.
- میزبان SFTP مستقل با هویت SSH اختصاصی، کلید میزبان تأییدشده و مسیر تازهٔ مورد تأیید برای مخزن.
- فضای کافی بازیابی و محل مستقل و محافظتشده برای رمز مخزن و اطلاعات بازیابی؛ مسیر بازیابی نباید از قبل وجود داشته باشد.
قدم بعدی
ابزار میزبان انتخابشده را آماده کنید
ابزارهای لازم را روی کامپیوتر یا سروری آماده کنید که فرمانهای مدیریتی را از آن اجرا میکنید. پیش از تأیید، فهرست تغییر بستهها را بخوانید؛ داخل کانتینر برنامه ابزار نصب نکنید. کلاستر، سرویس و باینریهای اصلی باید از قبل با نسخهٔ مورد تأیید موجود باشند. پنلهای بعد را در Bash اجرا کنید. نصب بسته روی همین میزبان تغییر ایجاد میکند، اما سرور برنامهٔ تازهای راه نمیاندازد.
این مسیر برای کلاینت موجود و تأییدشدهٔ restic نسخهٔ۰٫۱۹٫۱ یا ساخت سازگاری است که جداگانه بررسی شده باشد. بستهٔ Debian12 نسخهٔ۰٫۱۴ و Debian13 نسخهٔ۰٫۱۸ است؛ صرف نصب بستهٔ توزیع را برآوردهشدن این پیشنیاز ندانید. پنل بستهها عمداً restic را نصب یا ارتقا نمیدهد و EPEL را فعال نمیکند. باینری دیگر فقط پس از تأیید و بررسی انتشار و امضای رسمی وارد شود.
میزبان انتخابشده؛ نصب بسته فقط با مجوز تغییر همین میزبان
sudo dnf install ca-certificates bash coreutils openssh-clients openssl python3 findutils
if ! command -v curl >/dev/null 2>&1; then sudo dnf install curl; fi
cat /etc/os-release
command -v bash curl timeout
restic version
ssh -V
python3 --version
openssl version
command -v sha256sum find sort xargsنسخهٔ سیستم با انتخاب شما یکسان باشد، ابزارها پیدا شوند و نسخهٔ کلاینت و سرویس با شرایط بالا سازگار باشند. اگر باینری موجود نیست یا سازگار نیست، ادامه ندهید.
حفاظت میزبان و مسیرهای نصب موجود را حفظ کنید
SELinux را در حالت enforcing و قواعد firewalld را فعال نگه دارید. ابزار کلاینت به خروجی مجازِ API، TLS یا SFTP نیاز دارد و پورت ورودی تازهای لازم نیست. نتیجهٔ سرویس محدودشدهٔ systemd ممکن است با اجرای تعاملی فرق داشته باشد. خطای AVC، برچسب فایل و مجوز سرویس را با مسئول سیاست بررسی کنید؛ خاموشکردن SELinux یا دیوارهٔ آتش و مجوز گسترده راهحل نیست. خطای زنجیرهٔ اعتماد یا سیاست رمزنگاری به مقصد سازگار نیاز دارد، نه ضعیفکردن حفاظت سیستم. مسیر داده و پیکربندی سفارشی باید برچسب مناسب فعلی را حفظ کند؛ بازبرچسبگذاری بازگشتیِ کورکورانه انجام ندهید.
Python پیشفرض خانوادهٔ۹ نسخهٔ۳٫۹ و خانوادهٔ۱۰ نسخهٔ۳٫۱۲ است. بررسی مسیر و JSON این راهنما فقط از کتابخانهٔ استاندارد سازگار با هر دو استفاده میکند؛ Python سیستم را جایگزین نکنید.
میزبان انتخابشده؛ فقط خواندن وضعیت حفاظت
if command -v getenforce >/dev/null 2>&1; then getenforce; fi
if command -v firewall-cmd >/dev/null 2>&1; then firewall-cmd --state; fiپیش از گرفتن پشتیبان، معیار بازیابی را تعیین کنید
پایان موفق بارگذاری به معنای بازیابی برنامه نیست. منبع، نقطهٔ سازگاری، بیشترین مقدار قابل قبولِ از دسترفتن داده (RPO) و زمان هدف بازیابی (RTO) را مشخص کنید. این راهنما از خروجی فایلِ ثابت برنامه پشتیبان میگیرد و فایلهای پایگاه دادهٔ زنده را از نظر تراکنشی سازگار نمیکند. ابتدا روش بومی پشتیبان یا خروجی پایگاه داده را اجرا کنید و اطلاعات لازم برای بازیابی آن را همراه نگه دارید.
خارج از میزبان یعنی حوزهٔ خرابی مستقل با دسترسی جدا، نه پوشهای دیگر روی همان دیسک. رمزگذاری از محتوای مخزن محافظت میکند، اما دارندهٔ مجوز حذف همچنان میتواند پشتیبان را نابود کند. نگهداری تغییرناپذیر، حالت فقطافزودن و جداسازی اعتبارنامه به طراحی متناسب با مقصد نیاز دارند؛ SFTP بهتنهایی آنها را فراهم نمیکند.
قدم بعدی
نسخه، مقصد و هویت سرور را پیش از نوشتن تأیید کنید
از کلاینت پشتیبانیشدهٔ موجود و هویت SSH اختصاصی پشتیبان استفاده کنید. کلید میزبان مقصد را از راه مستقل و مطمئن تأیید کنید و بررسی آن را خاموش نکنید. مسیر مخزن باید تازه و مورد تأیید باشد و حساب پشتیبان بتواند در والد آن بنویسد. محدودیتهای فعلی SSH را با مسئول سرور بررسی کنید؛ برای عبور از خطا مجوزها را گسترده نکنید.
خط فرمان؛ فقط در محیطی که مجوز بررسی آن را دارید
restic version
ssh -o BatchMode=yes -o StrictHostKeyChecking=yes 'backup@backup.example.com' 'pwd'
ssh -o BatchMode=yes -o StrictHostKeyChecking=yes 'backup@backup.example.com' 'test ! -e /srv/restic/academy-repo'نسخه و هویت مقصد روشن باشند، اتصال با کلید میزبان معتبر برقرار شود و مسیر مخزن هنوز وجود نداشته باشد.
قدم بعدی
رمز مخزن را مستقیم در فایل محافظتشده بسازید
پوشهٔ خصوصی تازه را با دسترسی محدود بسازید و رمز تصادفی را مستقیم در فایل بنویسید. رمز نباید مقدار فرم یا آرگومان فرمان شود. پیش از اتکا به پشتیبان، نسخهٔ بازیابی رمز و دسترسی SSH را در سازوکار محرمانهٔ مستقل نگه دارید. ازدسترفتن همهٔ رمزها و کلیدهای مخزن، بازیابی را ناممکن میکند.
خط فرمان؛ فقط در محیطی که مجوز بررسی آن را دارید
umask 077
mkdir '/home/operator/academy-restic-private' || exit 1
openssl rand -base64 48 > '/home/operator/academy-restic-private/repository-password' || exit 1
chmod 600 '/home/operator/academy-restic-private/repository-password'
stat -c '%a %n' '/home/operator/academy-restic-private' '/home/operator/academy-restic-private/repository-password'فایل رمز فقط برای حساب مجاز قابل خواندن باشد و برنامهٔ نگهداری مستقل اطلاعات بازیابی مشخص شده باشد.
قدم بعدی
جدابودن منبع، محل اطلاعات محرمانه و مقصد بازیابی را کنترل کنید
منبع باید خروجی ثابت و خواندنی باشد و مسیر بازیابی نباید وجود داشته باشد. بررسی مسیرها همپوشانی در هر دو جهت، مسیر بازیابیِ موجود یا پیوندی و انتخاب ریشهٔ فایلسیستم بهعنوان منبع را رد میکند. پوشهٔ اطلاعات محرمانه نیز باید بیرون منبع و مقصد بازیابی باشد. والد مقصد بازیابی باید از قبل وجود داشته و قابل نوشتن باشد. فضای محلی واقعی و ظرفیت مخزن دور را بررسی کنید؛ نسبت deduplication را از پیش فرض نکنید. مقدار معتبر فرم، مالکیت واقعی مسیر را ثابت نمیکند.
خط فرمان؛ فقط در محیطی که مجوز بررسی آن را دارید
python3 - <<'PY'
from pathlib import Path
import os
s=Path('/srv/backup-export').resolve(strict=True)
p=Path('/home/operator/academy-restic-private').resolve(strict=True)
assert p.is_dir(), 'Invalid private directory'
r=Path('/srv/academy-restic-restore')
assert s.is_dir() and s != Path(s.anchor), 'Invalid source'
assert not r.exists() and not r.is_symlink(), 'Restore target already exists'
r=r.resolve()
assert s != r and s not in r.parents and r not in s.parents, 'Overlapping source/restore'
assert p != s and s not in p.parents and p not in s.parents, 'Private directory overlaps source'
assert p != r and p not in r.parents and r not in p.parents, 'Private directory overlaps restore'
parent=r.parent.resolve(strict=True)
assert parent.is_dir() and os.access(parent,os.W_OK|os.X_OK), 'Restore parent is not writable'
print('Source/private/restore paths are non-overlapping; restore parent exists and is writable')
PY
du -xsh -- '/srv/backup-export'
df -h -- '/srv/backup-export' '/home/operator/academy-restic-private' "$(dirname -- '/srv/academy-restic-restore')"سه مسیر پس از حل مسیر واقعی همپوشانی نداشته باشند، والد بازیابی قابل نوشتن باشد و فضای لازم بررسی شده باشد.