
به اشتراک بگذارید

به اشتراک بگذارید
مستندات restic کنار دستور init هشدار میدهد: «اگر رمز را گم کنید، به دادههای ذخیرهشده در مخزن دسترسی نخواهید داشت». هر طرح بکاپ با restic پیش از انتخاب سرویس ذخیرهسازی باید جوابی برای این جمله داشته باشد. برنامه restic داده را پیش از ارسال به S3 رمزنگاری میکند؛ ارائهدهنده محتوا را نمیخواند و کلید همه چیز، رمز مخزن است.
| تهدید | آنچه نجاتتان میدهد | دستور یا تنظیم restic |
|---|---|---|
| گم شدن رمز مخزن | نسخه دوم رمز بیرون از سرور | دستور key add |
| کلید S3 دزدیدهشده | مقصدی که حذف را نمیپذیرد | حالت --append-only در rest-server |
| خرابی خاموش داده | خواندن نمونهای از داده مخزن | گزینه check --read-data-subset |
| سیاست نگهداری اشتباه | پیشنمایش حذف | گزینه forget --dry-run |
💡 جای رمز مخزن و کلیدهای S3
برنامه restic داده را روی خود سرور رمز میکند و بعد میفرستد؛ کدش متنباز است.
✅ نسخهای از رمز مخزن را پیش از نخستین backup بیرون از همان سرور بگذارید.
✅ دستورها را اول روی مخزن محلی بیازمایید.
رمزنگاری پیش از ارسال، مسئله اعتماد به ارائهدهنده را حل میکند و سؤال تازهای میسازد: رمز و کلیدها کجا هستند و چه کسی به آنها میرسد. بحث تفاوت اسنپ شات و بکاپ نشان داده چرا اسنپشات پنل نسخه بیرون از سرور نیست.
📌 تهدیدهای یک مخزن بکاپ
◀️ مخزن رمزنگاریشده روی Object Storage
◀️ رمز مخزن تنها راه بازگشت داده است
◀️ اگر مهاجم کلید S3 را داشته باشد، نسخههای قدیمی چه میشوند؟
◀️ سیاست forget را پیش از اجرا با dry-run بیازمایید

مخزن restic روی Object Storage یک bucket است که restic فقط داده رمزنگاریشده در آن مینویسد. نشانیاش با پیشوند s3: شروع میشود و کلیدها از متغیرهای AWS_ACCESS_KEY_ID و AWS_SECRET_ACCESS_KEY خوانده میشوند؛ این قاعده برای Amazon S3 و سرویسهای سازگار از جمله MinIO یکی است.
خروجیهای این صفحه از بکاپ با restic 0.19.1 روی یک مخزن محلی آزمایشی است؛ دستورهای S3 از مستندات آمدهاند. بسته apt اوبونتو 24.04 نسخه 0.16.4 است؛ باینری رسمی را در /usr/local/bin/restic بگذارید و با restic self-update بهروز نگه دارید.
کلیدی که در خط فرمان تایپ شود، در تاریخچه shell میماند. برای آزمون نخست مهم نیست؛ کار شبانه از فایل محیطی میخواند.
export AWS_ACCESS_KEY_ID=PLACEHOLDER_ACCESS_KEY
export AWS_SECRET_ACCESS_KEY=PLACEHOLDER_SECRET_KEY
restic -r s3:https://s3.example.com/backup-bucket init
طبق صفحه ساخت مخزن در مستندات restic، شکل کلی نشانی s3:https://server:port/bucket_name است. init این هشدار را چاپ کرد:
Please note that knowledge of your password is required to access
the repository. Losing your password means that your data is
irrecoverably lost.
کش و فایل موقت، حجم مخزن را بیدلیل بالا میبرند. گزینه --exclude الگو میگیرد و --exclude-caches محتوای پوشههای دارای CACHEDIR.TAG را کنار میگذارد.
restic backup /var/www /etc --exclude-caches \
--exclude="/var/www/*/cache" --exclude="/var/www/cache"
اسلش اول، الگو را از ریشه حساب میکند و ستاره از روی / رد نمیشود. ما دیر فهمیدیم: در آزمون، الگوی ستارهدار site1/cache را کنار گذاشت ولی خود www/cache را نه؛ الگوی دوم برای همین است.

برنامه restic داده مخزن را با کلیدهایی رمز میکند که فقط با رمز مخزن باز میشوند. مدل تهدید restic میگوید محتوای فایلها و متادیتا بدون رمز در دسترس نیست؛ پس بعد از گم شدن رمز، نه ارائهدهنده راه میانبری دارد و نه شما.
پاکت مهروموم سؤالات کنکور از دست راننده و انباردار میگذرد و هیچکدام سؤالها را نمیخوانند؛ حساسیت ماجرا روی کسی است که اجازه باز کردنش را دارد. بکاپ با restic آن اجازه را از دیسک ارائهدهنده برمیدارد و در یک فایل کوچک متنی میگذارد.
⚠️ رمزی که فقط روی سرور است، با سرور از دست میرود
اگر تنها نسخه رمز در /etc/restic همان سرور بوده باشد، مخزن سالم روی S3 دیگر باز نمیشود و restic فقط Fatal: wrong password or no key found برمیگرداند.
رمزی که داخل اسکریپت نوشته شود، با هر کپی اسکریپت جابهجا میشود. مستندات برای اجرای خودکار RESTIC_PASSWORD_FILE و RESTIC_REPOSITORY را پیشنهاد میکنند. فایل را از اول با مجوز بسته بسازید و همان رمز init را در آن بنویسید:
install -d -m 700 /etc/restic
install -m 600 /dev/null /etc/restic/password
export RESTIC_REPOSITORY=s3:https://s3.example.com/backup-bucket
export RESTIC_PASSWORD_FILE=/etc/restic/password
در آزمون اول، فایل رمز را از سر عادت کنار پوشه مخزن ساخته بودیم؛ کسی که آن پوشه را بردارد رمز را هم برده است.
با یک رمز، یک اشتباه برای قفل شدن مخزن کافی است. دستور key add رمز دومی به همان مخزن اضافه میکند و جای آن در مدیر رمز یا روی کاغذ، بیرون از سرور است.
restic key add --new-password-file /root/second-pass
restic key list
shred -u /root/second-pass
رمز دوم را پیش از shred -u به مدیر رمز ببرید؛ در key list کلید فعلی ستاره دارد.
🔸 فایل محیطی، پوشه کش و تایمر systemd
خود restic زمانبندی داخلی ندارد. سرویس سیستمی بدون User= متغیر HOME ندارد و restic 0.19.1 بدون پوشه کش متوقف میشود؛ CacheDirectory=restic پوشه /var/cache/restic را میسازد و RESTIC_CACHE_DIR مسیرش را به restic میدهد. درصد داخل فایل واحد به شکل %% نوشته میشود؛ پیشنویس اول ما 5% بود.
# /etc/restic/env (chmod 600)
RESTIC_REPOSITORY=s3:https://s3.example.com/backup-bucket
RESTIC_PASSWORD_FILE=/etc/restic/password
RESTIC_CACHE_DIR=/var/cache/restic
AWS_ACCESS_KEY_ID=PLACEHOLDER_ACCESS_KEY
AWS_SECRET_ACCESS_KEY=PLACEHOLDER_SECRET_KEY
# /etc/systemd/system/restic-backup.service
[Service]
Type=oneshot
EnvironmentFile=/etc/restic/env
CacheDirectory=restic
ExecStart=/usr/local/bin/restic backup /var/www /etc --exclude-caches --exclude=/var/www/*/cache --exclude=/var/www/cache
ExecStart=/usr/local/bin/restic check --read-data-subset=5%%
# /etc/systemd/system/restic-backup.timer
[Timer]
OnCalendar=*-*-* 02:30:00
RandomizedDelaySec=15min
Persistent=true
[Install]
WantedBy=timers.target
محیط آزمون ما systemd نداشت؛ دو دستور سرویس را بدون HOME اجرا کردیم: بدون RESTIC_CACHE_DIR با خطای unable to locate cache directory و کد 1 ماند و با آن کامل شد. فعالسازی با systemctl enable --now restic-backup.timer است و Persistent=true نوبت جامانده در خاموشی را بعداً اجرا میکند. بررسی ۵ درصدی هر شب از S3 دانلود دارد؛ ترافیک خروجی را حساب کنید.
با کلید S3 دارای اجازه حذف، مهاجم همه اشیای مخزن را پاک میکند. مدل تهدید restic صریح است: برنامه برای محافظت در برابر حذف فایل در محل ذخیرهسازی طراحی نشده. نسخههای قدیمی فقط وقتی میمانند که خود مقصد حذف را نپذیرد.
ما هم تا پیش از خواندن این مدل تهدید، رمزنگاری را با امنیت بکاپ یکی میگرفتیم. هر کس root سرور را بگیرد، کلید کامل داخل /etc/restic/env را هم دارد و رمزنگاری بکاپ با restic جلویش را نمیگیرد.
| چه کسی | نام فایلها | محتوای فایلها | توان حذف نسخهها |
|---|---|---|---|
| ارائهدهنده فضا | نه؛ متادیتا رمز شده | نه | بله، دسترسی نوشتن دارد |
| مهاجم با root روی سرور | بله، با فایل رمز سرور | بله | بله؛ در append-only فقط افزودن |
| شما با رمز مخزن | بله | بله | بله، با forget و prune |
⚠️ دستور prune برگشت ندارد
اول forget اسنپشاتها را برمیدارد، بعد prune دادهای را که فقط به آنها تعلق داشت از مخزن پاک میکند. مهاجم با کلید کامل همینها را میزند. مستندات forget در بحث مخزن append-only توصیه میکند کارهای نیازمند دسترسی کامل از کلاینتی جدا و امن انجام شود.
سرور آلوده، بکاپهای خودش را هم پاک میکند. در پاکسازی سرور از باجافزار هم راه برگشت، نسخه سالمی است که به سیستم آلوده وصل نبوده. روی S3 خام، restic جلوی حذف را نمیگیرد؛ مقصد را عوض کنید یا امکانات نگهداری ارائهدهنده را در مستندات خودش ببینید.
💡 مقصدی که فقط افزودن را میپذیرد
طبق مخزن rest-server، حالت --append-only ساخت بکاپ تازه را میپذیرد و جلوی حذف و تغییر بکاپهای موجود را میگیرد. نشانی rest:https://backup.example.com:8000/ است و نام کاربری و رمز سرور به RESTIC_REST_USERNAME و RESTIC_REST_PASSWORD در فایل محیطی میروند. مستندات forget اینجا --keep-within را توصیه میکنند تا اسنپشات جعلی، نسخه واقعی را بیرون نکند.

دستور forget با گزینههای --keep-* تعیین میکند کدام اسنپشات بماند و --dry-run همین تصمیم را بدون حذف چاپ میکند.
سیاستی که روی کاغذ درست است، در عمل تاریخچه را میبرد. --keep-daily n برای n روز آخرِ دارای اسنپشات، از هر روز جدیدترین را نگه میدارد.
restic forget --keep-daily 7 --keep-weekly 5 --keep-monthly 12 --dry-run
روی سه اسنپشات یک روز انتظار داشتیم فقط جدیدترین بماند؛ خروجی، کوتاهشده:
keep 2 snapshots:
4caafce0 13:20:15 oldest daily snapshot
01e0a250 13:20:16 daily snapshot
remove 1 snapshots:
31c1dc12 13:20:16
قاعدهاش در مستندات آمده: وقتی هنوز به اندازه هر بازه --keep-* اسنپشات ندارید، قدیمیترین هم اضافه نگه داشته میشود و برچسب oldest میگیرد. پیش از سپردن نگهداری بکاپ با restic به prune، سیاست را چند شب با dry-run ببینید، بعد از کلاینت جدا اجرا کنید:
restic forget --keep-daily 7 --keep-weekly 5 --keep-monthly 12 --prune
restic check
مخزن در مدت prune قفل است؛ زمانش را از تایمر شبانه جدا کنید.
خرابی خاموش داده تا روز بازیابی دیده نمیشود. بخش بررسی یکپارچگی مستندات توضیح میدهد که check ساده packها را نمیخواند و برای آن --read-data-subset لازم است:
restic check --read-data-subset=10%
read 10.0% of packfiles
no errors were found
restic restore latest --target /tmp/restore-test
دستور restore مسیر کامل فایلها را زیر پوشه مقصد میسازد؛ داده در /tmp/restore-test/tmp/lab2 برگشت.
سرور قبلی دیگر بالا نمیآید، روی ماشین تازه restic نصب شده و فایل رمز از جای امنش برگشته؛ اولین فرمان، restic snapshots است.
نشانی مخزن، دو کلید S3 و رمز. فایل محیطی را بسازید و restic snapshots بزنید؛ کد خروج 10 یعنی مخزن پیدا نشد و 12 رمز اشتباه.
مسیر را با --include محدود کنید یا شکل snapshotID:/path را به restore بدهید؛ --dry-run پیش از نوشتن، فهرست را نشان میدهد.
خیر. در آزمون ما اجرای دوم بدون تغییر 362 B و اجرای سوم با یک فایل تازه 2.854 KiB افزود.
بدون تعیین منطقه، restic از us-east-1 استفاده میکند؛ منطقه ارائهدهنده را در AWS_DEFAULT_REGION بگذارید. شیوه دسترسی را با -o s3.bucket-lookup=path یا dns عوض کنید.
بله، با restic key passwd. راه کمخطرتر: کلید تازه با key add و حذف کلید قدیمی با key remove.
مستندات عددی نمیدهند. --read-data همه packها را دانلود میکند؛ شکل 1/5 تا 5/5 آن را در پنج نوبت پخش میکند.
محتوا و نام فایلها را نه، ولی به گفته مدل تهدید restic، کسی که دسترسی خواندن دارد از زمان ساخت اشیا اندازه بکاپها را حدس میزند.
جمعبندی؛ بکاپ با restic یعنی مراقبت از رمز و کلیدها. رمز را با key add دو جا داشته باشید، کلیدها را در فایل محیطی 600 بگذارید و تایمر را با پوشه کش اجرا کنید. برای حذف نشدن نسخهها به دست مهاجم، مقصد append-only بگیرید و forget را از کلاینت دیگری بزنید. سیاست نگهداری را اول با --dry-run ببینید و restore را هر ماه روی ماشین دیگری تمرین کنید تا روز خرابی، مسیر برگشت آشنا باشد.
🚀 اسنپشات پنل کجای این نقشه مینشیند؟
مخزن restic برای روزی است که خود سرور برنگردد؛ اسنپشات پنل برای برگشت از یک آپدیت خراب است و جای دیگری در این نقشه دارد.
رمز مخزن restic شما الان کجاست: مدیر رمز، کاغذی در کشوی قفلدار، یا سرور دوم؟ خود رمز را هیچجا نفرستید؛ نوع جا کافی است.