بلاگ/پشتیبان‌گیری خودکار و رمزنگاری‌شده از سرور لینوکس با Restic
به‌روز شده

پشتیبان‌گیری خودکار و رمزنگاری‌شده از سرور لینوکس با Restic

1405/06/050 بازدید
پشتیبان‌گیری خودکار و رمزنگاری‌شده از سرور لینوکس با Restic

پشتیبان‌گیری خودکار و رمزنگاری‌شده از سرور لینوکس با Restic

از دست رفتن اطلاعات همیشه نتیجه خرابی دیسک نیست. اجرای یک دستور اشتباه، حذف ناخواسته فایل‌ها، باج‌افزار، اشکال در به‌روزرسانی نرم‌افزار یا خرابی پایگاه داده نیز می‌تواند یک سرویس سالم را از دسترس خارج کند. داشتن نسخه پشتیبان زمانی مفید است که بکاپ به‌صورت منظم اجرا شود، خارج از سرور اصلی نگه‌داری شود و بتوان آن را واقعاً بازگرداند. Restic ابزاری متن‌باز برای ساخت بکاپ‌های رمزنگاری‌شده، افزایشی و قابل بررسی است. این ابزار از مقصدهایی مانند سرور دوم از طریق SFTP، سرویس‌های سازگار با S3 و فضای ذخیره‌سازی محلی پشتیبانی می‌کند. در این آموزش، پشتیبان‌گیری از سرور لینوکس با Restic را از نصب تا زمان‌بندی، حذف snapshotهای قدیمی، مانیتورینگ و آزمایش بازیابی پیش می‌بریم. نمای کلی پشتیبان‌گیری رمزنگاری‌شده از سرور لینوکس با Restic

Restic چگونه کار می‌کند؟

Restic فایل‌ها را به قطعه‌های کوچک تقسیم می‌کند، داده‌های تکراری را کنار می‌گذارد و محتوای جدید را پیش از ارسال به مخزن رمزنگاری می‌کند. هر بار اجرای بکاپ یک snapshot می‌سازد که وضعیت فایل‌ها در همان زمان را نشان می‌دهد. اگر یک فایل بزرگ فقط کمی تغییر کند، Restic معمولاً لازم نیست کل فایل را دوباره منتقل کند؛ تنها قطعه‌های جدید در مخزن ذخیره می‌شوند. به همین دلیل بکاپ اول ممکن است زمان‌بر باشد، اما اجراهای بعدی معمولاً سریع‌تر و کم‌حجم‌تر هستند. رمزنگاری در سمت سرور مبدأ انجام می‌شود. بنابراین مقصد S3 یا سرور دوم، داده خام فایل‌ها را دریافت نمی‌کند. بااین‌حال، امنیت مخزن به نگه‌داری درست رمز عبور و کلیدهای دسترسی نیز وابسته است. مسیر داده از سرور لینوکس، عبور از لایه رمزنگاری Restic و ذخیره‌شدن به شکل رمزنگاری‌شده در مخزن بکاپ

انتخاب مقصد بکاپ

برای این آموزش دو مقصد متداول را در نظر می‌گیریم: - سرور دوم با اتصال SFTP - فضای ذخیره‌سازی سازگار با S3 هر دو گزینه می‌توانند خارج از سرور اصلی قرار بگیرند. مقصد محلی روی همان دیسک، در برابر خرابی دیسک یا حذف کامل ماشین از داده محافظت نمی‌کند و نباید تنها نسخه پشتیبان باشد.

مقصدمزیتمحدودیتمناسب برای
سرور دوم با SFTPراه‌اندازی ساده و کنترل مستقیمنیازمند مدیریت SSH، ظرفیت و امنیت سرور مقصدتیم‌هایی که زیرساخت دوم در اختیار دارند
فضای ذخیره‌سازی S3مقیاس‌پذیری و جداسازی بهتر از سرور اصلیهزینه ذخیره‌سازی و ترافیک، نیاز به مدیریت کلید دسترسیبکاپ خارج از سایت و نگه‌داری بلندمدت
دیسک محلیسرعت بازیابی بالاآسیب‌پذیر در برابر خرابی یا حذف سرورنسخه مکمل، نه بکاپ اصلی

قاعده ۳-۲-۱ نقطه شروع مناسبی است: سه نسخه از داده، روی دو نوع رسانه و دست‌کم یک نسخه خارج از محل اصلی. لازم نیست از روز اول معماری پیچیده‌ای بسازید؛ مهم این است که خرابی یک سرور، نسخه اصلی و بکاپ را هم‌زمان از بین نبرد.

نصب Restic روی لینوکس

در Debian و Ubuntu می‌توان Restic را از مخزن توزیع نصب کرد:

sudo apt update
sudo apt install restic
restic version

در Fedora:

sudo dnf install restic
restic version

نسخه موجود در مخزن بعضی توزیع‌ها ممکن است قدیمی باشد. برای محیط عملیاتی، نسخه نصب‌شده را با نسخه موردنیاز خود بررسی کنید و به‌روزرسانی Restic را در فرایند نگه‌داری سرور قرار دهید. یک حساب سیستمی جداگانه برای بکاپ، سطح دسترسی محدودتر و گزارش‌گیری شفاف‌تری ایجاد می‌کند. بااین‌حال، اگر باید از مسیرهایی مانند /etc یا داده سرویس‌ها بکاپ بگیرید، این حساب به مجوز خواندن آن مسیرها نیاز دارد.

ساخت فایل رمز عبور

رمز مخزن نباید داخل اسکریپت یا واحد systemd نوشته شود. یک رمز طولانی و تصادفی بسازید و آن را در فایلی با دسترسی محدود قرار دهید:

sudo install -d -m 700 /etc/restic
openssl rand -base64 48 | sudo tee /etc/restic/repository-password >/dev/null
sudo chmod 600 /etc/restic/repository-password
sudo chown root:root /etc/restic/repository-password

نسخه‌ای امن از این رمز را خارج از سرور نگه دارید؛ برای مثال در مدیر رمز عبور سازمانی. اگر فایل رمز همراه سرور از بین برود و نسخه دیگری نداشته باشید، بازیابی مخزن ممکن نیست.

راه‌اندازی مخزن روی سرور دوم با SFTP

ابتدا روی سرور مقصد یک کاربر محدود و مسیر مخصوص بکاپ بسازید. سپس کلید SSH سرور مبدأ را برای همان کاربر تعریف کنید. اتصال را پیش از ساخت مخزن آزمایش کنید:

sudo ssh backup@backup.example.com

آدرس مخزن Restic به این شکل است:

sftp:backup@backup.example.com:/srv/backups/web-01

متغیرهای اصلی را در /etc/restic/restic.env قرار دهید:

RESTIC_REPOSITORY=sftp:backup@backup.example.com:/srv/backups/web-01
RESTIC_PASSWORD_FILE=/etc/restic/repository-password

دسترسی فایل را محدود کنید:

sudo chmod 600 /etc/restic/restic.env
sudo chown root:root /etc/restic/restic.env

اکنون مخزن را مقداردهی اولیه کنید:

sudo sh -c 'set -a; . /etc/restic/restic.env; set +a; restic init'

دستور init را فقط یک بار برای هر مخزن اجرا کنید.

استفاده از فضای ذخیره‌سازی سازگار با S3

برای یک مقصد S3، فایل محیط می‌تواند چنین ساختاری داشته باشد:

RESTIC_REPOSITORY=s3:https://s3.example.com/backup-bucket/web-01
RESTIC_PASSWORD_FILE=/etc/restic/repository-password
AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY
AWS_SECRET_ACCESS_KEY=YOUR_SECRET_KEY

به‌جای قرار دادن مقادیر نمونه، کلیدهایی با حداقل دسترسی لازم بسازید. حساب بکاپ نباید به bucketهای نامرتبط دسترسی داشته باشد. فایل محیط را با مجوز 600 نگه دارید و آن را در Git یا فایل‌های قابل دانلود قرار ندهید. پس از تنظیم اطلاعات واقعی، مخزن را بسازید:

sudo sh -c 'set -a; . /etc/restic/restic.env; set +a; restic init'

اگر سرویس مقصد از قفل اشیا یا versioning پشتیبانی می‌کند، فعال‌کردن آن می‌تواند مخزن را بهتر در برابر حذف عمدی یا اشتباه محافظت کند. تنظیم دقیق این قابلیت به سرویس S3 بستگی دارد.

نوشتن اسکریپت بکاپ

مسیرهای موردنیاز را مشخص کنید. برای یک وب‌سرور ممکن است /etc، فایل‌های برنامه و خروجی سازگار پایگاه داده لازم باشند. کپی مستقیم فایل‌های فعال پایگاه داده همیشه بکاپ سازگاری تولید نمی‌کند؛ بهتر است ابتدا با ابزار رسمی دیتابیس dump بگیرید. برای نمونه، اسکریپت /usr/local/sbin/restic-backup می‌تواند این محتوا را داشته باشد:

#!/usr/bin/env bash
set -Eeuo pipefail
set -a
source /etc/restic/restic.env
set +a
install -d -m 700 /var/backups/database
pg_dump --format=custom --file=/var/backups/database/app.dump app_database
restic backup \
  /etc \
  /srv/www \
  /var/backups/database \
  --exclude-caches \
  --one-file-system \
  --tag automatic \
  --hostname web-01
restic forget \
  --keep-daily 7 \
  --keep-weekly 4 \
  --keep-monthly 12 \
  --prune

سپس مجوز اجرا بدهید:

sudo chmod 700 /usr/local/sbin/restic-backup
sudo chown root:root /usr/local/sbin/restic-backup

نام دیتابیس، مسیرها و hostname را متناسب با سرور تغییر دهید. اگر داده سرویس شما در mount جداگانه‌ای قرار دارد، گزینه --one-file-system ممکن است آن را کنار بگذارد. پیش از استفاده، خروجی mount و مسیرهای انتخاب‌شده را بررسی کنید. گزینه forget snapshotهای خارج از سیاست نگه‌داری را انتخاب می‌کند و --prune داده‌های بدون استفاده را از مخزن حذف می‌کند. اجرای prune می‌تواند زمان و پهنای باند بیشتری مصرف کند. در مخازن بزرگ می‌توان آن را با برنامه‌ای جداگانه و دفعات کمتر اجرا کرد.

زمان‌بندی بکاپ با systemd timer

یک سرویس systemd در /etc/systemd/system/restic-backup.service تعریف کنید: ```ini