الحاوية التي تحفظ النسخ الاحتياطية تحتاج إلى أكثر من مكان لوضع الملفات. فهناك ثلاث ميزات في S3 تحدد قدرتك على التعافي من حذف عرضي أو مزامنة خاطئة أو هجوم فدية: الإصدارات (Versioning)، وقواعد دورة الحياة (Lifecycle)، وقفل الكائنات (Object Lock). يشرح هذا الدليل كل ميزة استناداً إلى توثيق Amazon S3 الذي يعرّف الواجهة البرمجية، ويعرض أوامر AWS CLI لضبطها، ويبيّن ما ينبغي التحقق منه حين تكون الحاوية لدى خدمة متوافقة مع S3 لا لدى AWS.
أولاً: ماذا تعني «متوافقة مع S3»
خدمات كثيرة لتخزين الكائنات تتحدث بواجهة S3، لكن كل خدمة تطبّق جزءاً منها. فبوابة الكائنات في Ceph، التي يبني عليها عدد من المزوّدين، تنشر جدولاً للميزات يذكر أن الإصدارات ودورة الحياة مدعومة، ويصف ميزات أخرى بأن دعمها جزئي، وتنشر منصات أخرى جداول مشابهة. لذا اقرأ توثيق مزوّدك واختبر كل ميزة على حاوية تجريبية قبل أن تبني عليها. وتعمل أداة AWS CLI مع أغلب هذه الخدمات إذا مرّرت عنوان نقطة الاتصال الخاصة بالمزوّد:
aws s3api get-bucket-versioning --bucket my-backups \
--endpoint-url https://s3.example.comالأمثلة التالية تحذف --endpoint-url تسهيلاً للقراءة، فأضفه إلى كل أمر إن لم تكن تستخدم AWS.
الإصدارات: احتفظ بكل نسخة وتعافَ من الحذف
عند تفعيل الإصدارات تحتفظ الحاوية بعدة نسخ من الكائن نفسه؛ فالكتابة فوق كائن تنشئ إصداراً جديداً، والحذف البسيط (الذي لا يحدد رقم إصدار) لا يزيل البيانات أصلاً، بل يضيف علامة حذف تصبح الإصدار الحالي فيبدو الكائن محذوفاً. وللحاوية ثلاث حالات: بلا إصدارات (الافتراضية)، أو مفعّلة الإصدارات، أو معلّقة الإصدارات. وبعد التفعيل يمكنك التعليق، لكن الحاوية لا تعود أبداً إلى حالة «بلا إصدارات».
aws s3api put-bucket-versioning --bucket my-backups \
--versioning-configuration Status=Enabled
aws s3api list-object-versions --bucket my-backups --prefix reports/ولاسترجاع كائن محذوف احذف علامة الحذف نفسها بتحديد رقم إصدارها، فيعود الإصدار السابق ليكون الحالي:
aws s3api delete-object --bucket my-backups --key reports/q3.pdf \
--version-id MARKER_VERSION_IDوانتبه إلى أن كل إصدار كائن كامل وليس فرقاً عن سابقه، فثلاثة إصدارات من ملف تشغل ثلاثة أضعاف مساحته. ومن دون قاعدة تنظيف، لا يتوقف حجم الحاوية ذات الإصدارات عن النمو.
قواعد دورة الحياة: قرّر مصير البيانات القديمة
إعداد دورة الحياة مجموعة قواعد تطبّقها خدمة التخزين على الكائنات نيابة عنك، وفيه نوعان من الإجراءات: النقل إلى فئة تخزين أخرى، والانتهاء أي الحذف. وتسري القواعد على الكائنات الموجودة والجديدة معاً، وتُنفَّذ بشكل غير متزامن، فتوقّع بعض التأخير بين استحقاق الكائن وتنفيذ الإجراء. ولحاويات النسخ الاحتياطي ثلاثة إجراءات مفيدة خصوصاً:
NoncurrentVersionExpirationيحذف الإصدارات القديمة نهائياً بعد عدد من الأيام من خروجها عن كونها الإصدار الحالي، ومعNewerNoncurrentVersionsتحتفظ بحد أدنى من الإصدارات الحديثة، ولا يُحذف الإصدار إلا إذا تجاوز الشرطين معاً.AbortIncompleteMultipartUploadينظّف أجزاء عمليات الرفع التي لم تكتمل، والتي تظل تشغل مساحة لولا ذلك.ExpiredObjectDeleteMarkerيزيل علامات الحذف التي لم يعد وراءها أي إصدار.
{
"Rules": [
{
"ID": "old-versions-and-stale-uploads",
"Filter": { "Prefix": "" },
"Status": "Enabled",
"NoncurrentVersionExpiration": { "NoncurrentDays": 30, "NewerNoncurrentVersions": 5 },
"AbortIncompleteMultipartUpload": { "DaysAfterInitiation": 7 }
},
{
"ID": "expired-delete-markers",
"Filter": { "Prefix": "" },
"Status": "Enabled",
"Expiration": { "ExpiredObjectDeleteMarker": true }
}
]
}aws s3api put-bucket-lifecycle-configuration --bucket my-backups \
--lifecycle-configuration file://lifecycle.json
aws s3api get-bucket-lifecycle-configuration --bucket my-backupsوفي توثيق AWS نقطة يسهل إغفالها: في الحاويات العامة لا تستطيع سياسة الحاوية منع عمليات الحذف التي تنفذها قاعدة دورة الحياة. فتعامل مع هذه القواعد بحذر تعاملك مع سكربت حذف، واختر عدد أيام الإصدارات القديمة بحيث يزيد على المدة التي قد تحتاجها لاكتشاف المشكلة.
قفل الكائنات: كتابة مرة وقراءة مرات
يحمي Object Lock إصدارات الكائنات من الكتابة فوقها أو حذفها لمدة محددة وفق نموذج «الكتابة مرة والقراءة مرات» (WORM). ولا يعمل إلا على حاوية مفعّلة الإصدارات، وبعد تفعيله على حاوية لا يمكن تعطيله ولا تعليق الإصدارات فيها. وللحماية شكلان:
- فترة احتفاظ لها تاريخ تنتهي عنده، وتُضبط لكل إصدار على حدة أو كقيمة افتراضية للحاوية.
- تجميد قانوني (Legal hold) بلا تاريخ انتهاء، يبقى حتى يزيله صاحب صلاحية.
ولفترة الاحتفاظ وضعان:
| الوضع | من يستطيع الحذف أو تقصير المدة قبل انتهائها |
|---|---|
| Governance (الحوكمة) | المستخدمون الذين يملكون صلاحية التجاوز الخاصة ويطلبون التجاوز صراحة فقط |
| Compliance (الامتثال) | لا أحد، ولا حتى المستخدم الجذر للحساب؛ ولا يمكن تغيير الوضع ولا تقصير المدة |
في AWS لا سبيل لإزالة كائن في وضع الامتثال قبل تاريخه إلا بحذف الحساب بأكمله، لذا ابدأ بوضع الحوكمة الذي تقترحه AWS لاختبار إعدادات الاحتفاظ، ولا تنتقل إلى وضع الامتثال إلا حين تتيقن من المدة. وهذا مثال لقاعدة احتفاظ افتراضية:
aws s3api put-object-lock-configuration --bucket my-backups \
--object-lock-configuration '{ "ObjectLockEnabled": "Enabled", "Rule": { "DefaultRetention": { "Mode": "GOVERNANCE", "Days": 30 }}}'القفل لا يمنع إنشاء إصدارات جديدة أو علامات حذف؛ فالحذف البسيط ينجح ويضيف علامة حذف، أما الحذف الذي يحدد إصداراً مقفلاً فيُرفض بخطأ «رفض الوصول». وبهذا تبقى البيانات المقفلة قابلة للاسترجاع حتى لو حذف مهاجم يملك مفاتيحك كل ما يراه.
الجمع بين الميزات الثلاث للنسخ الاحتياطي
- فعّل الإصدارات ليصبح الحذف والكتابة فوق الملفات قابلين للتراجع.
- أضف قاعدة دورة حياة تحذف الإصدارات القديمة بعد مدة أطول من نافذة الاستعادة لديك، وتنظّف عمليات الرفع المتعددة العالقة.
- أضف احتفاظ Object Lock إن كنت تحتاج حماية من شخص يملك مفاتيح الوصول. وراجع توثيق أداة النسخ لديك أولاً، فالأدوات التي تحذف البيانات أو تعيد كتابتها أثناء التنظيف ستصطدم بالإصدارات المقفلة، وسيتبع استهلاك المساحة مدة الاحتفاظ لا سياسة الأداة.
ما الذي ينبغي فعله
- تأكد من توثيق مزوّدك أيّ هذه الميزات الثلاث مدعوم، واختبر كلاً منها على حاوية تجريبية.
- فعّل الإصدارات على كل حاوية تحفظ نسخاً احتياطية أو ملفات مهمة، وتدرّب على استرجاع ملف محذوف مرة واحدة على الأقل.
- أضف قواعد دورة حياة للإصدارات القديمة وعلامات الحذف وعمليات الرفع غير المكتملة، وراجعها كما تراجع الشيفرة.
- إن اعتمدت Object Lock فابدأ بوضع الحوكمة ومدة افتراضية قصيرة، ولا تقرر وضع الامتثال إلا بعد فترة تجربة.
- افصل مفاتيح الوصول الخاصة بحاويات النسخ الاحتياطي عن المفاتيح التي تستخدمها التطبيقات.
المصادر
- docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html
- docs.aws.amazon.com/AmazonS3/latest/userguide/DeleteMarker.html
- docs.aws.amazon.com/AmazonS3/latest/userguide/ManagingDelMarkers.html
- docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html
- docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-configuration-examples.html
- docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock.html
- docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock-configure.html
- docs.aws.amazon.com/cli/latest/reference/s3api/put-bucket-versioning.html
- docs.aws.amazon.com/cli/latest/reference/s3api/put-bucket-lifecycle-configuration.html
- docs.aws.amazon.com/cli/latest/reference/s3api/put-object-lock-configuration.html
- docs.aws.amazon.com/cli/latest/userguide/cli-configure-endpoints.html
- docs.ceph.com/en/latest/radosgw/s3
Comments
0 total · 0 threads