S3: الأمان والتشفير
كيف تشفّر بياناتك في S3 ومن يمسك المفاتيح، وتفرض HTTPS، وتشارك ملف خاص برابط موقّع، وتفهم CORS، وتحمي بياناتك من الحذف بـ MFA Delete وObject Lock، مع تجربة عملية.
- الفكرة الأساسية
- تعريف
- متى يُستخدم
- تنبيه
في هذا المقال
في الجزء الخامس عشر عرفنا إن كل شي خاص افتراضياً، وإن Block Public Access يحميك من الفتح بالغلط. هذا الجزء يكمل الطبقات الباقية: التشفير، ومشاركة الملفات بأمان، وحماية البيانات حتى من مسؤولي الحساب نفسهم.
التشفير المخزّن
عندك سؤالين: وين يصير التشفير؟ ومين يمسك المفتاح؟
| النوع | مين يمسك المفتاح | متى تختاره |
|---|---|---|
| SSE-S3 | S3 بالكامل | الافتراضي لكل كائن جديد، ويكفي لأغلب الحالات |
| SSE-KMS | KMS، وتتحكم أنت في صلاحياته | تبي سجل بكل استخدام للمفتاح، وتحكم أدق |
| DSSE-KMS | KMS، بطبقتين تشفير | متطلبات تنظيمية تفرض طبقتين |
| SSE-C | أنت، وترسله مع كل طلب | مقفل افتراضياً في الحاويات الجديدة منذ أبريل 2026 |
| عند العميل | أنت بالكامل | ما تبي AWS تشوف البيانات أبداً |
انتبه مع SSE-KMS
كل قراءة أو كتابة تنادي KMS، وKMS له حد لعدد الطلبات في الثانية حسب الـ Region. فلو عندك ضغط عالي، فعّل S3 Bucket Keys: مفتاح وسيط على مستوى الحاوية يقلل طلبات KMS بنسبة كبيرة، ومعها التكلفة.
ولازم من يقرأ الكائن يكون عنده صلاحية على S3 وعلى مفتاح KMS معاً. وهذا سبب مشهور لخطأ AccessDenied رغم إن سياسة S3 صحيحة.
التشفير أثناء النقل
S3 تقبل HTTP وHTTPS. وعشان تفرض HTTPS، ارفض أي طلب غير مشفّر عبر الشرط aws:SecureTransport:
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
],
"Condition": { "Bool": { "aws:SecureTransport": "false" } }
}]
}
وبنفس الطريقة تقدر تفرض نوع تشفير معين على كل رفع. والسياسة تُقيَّم قبل التشفير الافتراضي، فلو رفضت الطلب ما يوصل له أصلاً.
مشاركة ملف خاص: الروابط الموقّعة
تبي عميل يحمّل فاتورته، بدون ما تفتح الحاوية ولا تعطيه حساب؟ Pre-signed URL رابط فيه توقيع وله مدة صلاحية:
- يحمل صلاحيات اللي وقّعه، فلو هو ما يقدر يقرأ الملف، الرابط ما يشتغل.
- ينفع للتحميل والرفع، مثل رفع صورة من المتصفح مباشرة لـ S3 بدون المرور بسيرفرك.
- مدته محدودة، ولو وقّعته بدور مؤقت ينتهي مع انتهاء الجلسة.
CORS: لما يمنعك المتصفح
CORS حماية في المتصفح، مو في S3. الأصل (Origin) هو البروتوكول والنطاق والمنفذ. فلو صفحة على https://app.example.com طلبت ملف من https://my-bucket.s3.amazonaws.com، فالمتصفح يعتبرهم أصلين مختلفين، ويسأل الحاوية: تسمحين؟
لو طلع عندك خطأ CORS في المتصفح، أضف الإعدادات للحاوية:
[{
"AllowedOrigins": ["https://app.example.com"],
"AllowedMethods": ["GET", "PUT"],
"AllowedHeaders": ["*"],
"MaxAgeSeconds": 3000
}]
الحماية من الحذف
حتى الصلاحيات الصحيحة ما تحميك من خطأ، أو حساب مخترق، أو برامج الفدية. عندك ثلاث طبقات:
| الأداة | وش تسوي | ملاحظات |
|---|---|---|
| MFA Delete | تطلب رمز MFA لحذف إصدار نهائياً أو إيقاف الإصدارات | يفعّله المستخدم الجذر فقط، عبر الأوامر |
| Object Lock | يمنع حذف أو تعديل الإصدار لمدة | لازم الإصدارات مفعّلة |
| Glacier Vault Lock | يقفل سياسة مخزن Glacier القديم للأبد | للمخازن القديمة، وObject Lock أفضل لأي شي جديد |
أوضاع Object Lock
| الوضع | مين يقدر يحذف قبل نهاية المدة |
|---|---|
| Governance | مستخدمين عندهم صلاحية خاصة فقط |
| Compliance | ما أحد، ولا حتى المستخدم الجذر |
وفيه كمان Legal Hold: قفل بدون مدة محددة، يبقى لين تشيله، ومفيد للقضايا القانونية.
السجلات والمراقبة
- Access Logs: تسجّل كل طلب في حاوية ثانية. لا تخليها نفس الحاوية، لأن كل سجل يولّد سجل جديد، فتكبر بلا نهاية وتكبر الفاتورة.
- CloudTrail: يسجّل عمليات الإدارة، وعمليات البيانات لو فعّلتها، وبنشرحه في الجزء الخامس والعشرين.
Access Points: لكل فريق بوابته
لو عندك حاوية كبيرة يستخدمها فرق كثيرة، Bucket Policy تصير طويلة وخطرة. Access Points تعطي كل فريق بوابة باسمها وسياستها:
- بوابة
financeتسمح لفريق المالية علىfinance/*فقط. - بوابة
salesتسمح لفريق المبيعات علىsales/*فقط. - وتقدر تخلي بوابة تقبل من داخل VPC واحدة فقط.
عملي: تشفير ورابط موقّع وفرض HTTPS
بنكمل بنفس الحاوية في BUCKET. ارفع ملف وشوف تشفيره الافتراضي، ثم ارفع واحد بـ KMS:
echo "secret invoice" > invoice.txt
aws s3 cp invoice.txt s3://$BUCKET/invoice.txt
aws s3api head-object --bucket $BUCKET --key invoice.txt \
--query ServerSideEncryption
aws s3 cp invoice.txt s3://$BUCKET/invoice-kms.txt --sse aws:kms
aws s3api head-object --bucket $BUCKET --key invoice-kms.txt \
--query "[ServerSideEncryption,SSEKMSKeyId]"
الأول AES256 يعني SSE-S3، والثاني aws:kms مع معرّف المفتاح.
الحين سوّ رابط موقّع مدته 60 ثانية، وجرّبه:
URL=$(aws s3 presign s3://$BUCKET/invoice.txt --expires-in 60)
curl -s "$URL"
يطبع محتوى الملف، مع إن الحاوية خاصة. انتظر دقيقة وأعد نفس أمر curl، وبيرجع AccessDenied مع رسالة إن الطلب منتهي.
والآن افرض HTTPS على الحاوية:
aws s3api put-bucket-policy --bucket $BUCKET --policy '{
"Version": "2012-10-17",
"Statement": [{
"Sid": "DenyHttp",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": ["arn:aws:s3:::'$BUCKET'", "arn:aws:s3:::'$BUCKET'/*"],
"Condition": {"Bool": {"aws:SecureTransport": "false"}}
}]
}'
URL=$(aws s3 presign s3://$BUCKET/invoice.txt --expires-in 300)
curl -s -o /dev/null -w "https: %{http_code}\n" "$URL"
curl -s -o /dev/null -w "http: %{http_code}\n" "${URL/https:/http:}"
نفس الرابط يرجع 200 مع HTTPS و403 مع HTTP.
الخلاصة
- كل كائن جديد مشفّر بـ SSE-S3 تلقائياً، واختر SSE-KMS لو تبي تحكم وسجل، مع Bucket Keys.
- افرض HTTPS بشرط
aws:SecureTransport. - الروابط الموقّعة تشارك ملف خاص مؤقتاً بدون فتح الحاوية.
- CORS من المتصفح، وتحله بإعدادات الحاوية.
- Object Lock يحميك من الحذف، حتى من الجذر في وضع Compliance.
اختبر نفسك
قبل ما تكمل، جرّب هذي الأسئلة عشان تتأكد إنك فهمت الجزء. كل سؤال موقف عملي، وبعد ما تجاوب يطلع لك الشرح.
السؤال 1 من 5
دور عنده صلاحية s3:GetObject على حاوية. ويقدر يقرأ الكائنات المشفرة بـ SSE-S3، بس يطلع له AccessDenied مع المشفرة بـ SSE-KMS ومفتاح Customer managed. وش الناقص؟
اعرض الجواب
الجواب الصحيح: B
قراءة كائن SSE-KMS تحتاج صلاحية على S3 وعلى مفتاح KMS معاً، وعشان كذا يطلع هذا الخطأ حتى لو سياسة S3 صحيحة.
- A: هذي تقلل طلبات KMS والتكلفة، وما تعطي أي صلاحية.
- C: CORS قاعدة في المتصفح، وما لها علاقة بصلاحيات دور.
- D: هذا يفرض HTTPS، وهو يمنع مو يسمح.
للمراجعة: انتبه مع SSE-KMS في هذا الجزء، وUsing server-side encryption with AWS KMS keys في وثائق AWS.
السؤال 2 من 5
متجر إلكتروني يبي كل عميل يحمّل فاتورته من حاوية خاصة، برابط يوقف بعد 15 دقيقة. والعملاء ما عندهم حسابات AWS. وش يناسب؟
اعرض الجواب
الجواب الصحيح: D
الـ Pre-signed URL فيه توقيع ومدة صلاحية، ويشتغل بصلاحيات اللي وقّعه، فتبقى الحاوية خاصة.
- A: بهذي الطريقة أي أحد يقدر يقرأ أي فاتورة، في أي وقت.
- B: إنشاء مستخدمين للعملاء وإدارتهم شغل ثقيل، وما له داعي.
- C: هذا إذن في المتصفح بين المواقع، وما يفتح الملفات الخاصة لأحد.
للمراجعة: مشاركة ملف خاص: الروابط الموقّعة في هذا الجزء، وDownload and upload objects with presigned URLs في وثائق AWS.
السؤال 3 من 5
صفحة على https://app.example.com تحمّل JSON من حاوية عبر JavaScript. والمتصفح يعرض خطأ CORS، بينما نفس الطلب من curl ينجح. وش يسوي الفريق؟
اعرض الجواب
الجواب الصحيح: A
CORS حماية في المتصفح. المتصفح يسأل الحاوية هل هذا الأصل مسموح، وcurl ما يسأل، وعشان كذا المتصفح وحده اللي اعترض.
- B: الطلب ينجح من
curl، فالوصول مو هو المشكلة. - C: التشفير ما له علاقة بالأصول اللي يقبلها المتصفح.
- D: هذا يحتفظ بالإصدارات القديمة، وما يغير شي يفحصه المتصفح.
للمراجعة: CORS: لما يمنعك المتصفح في هذا الجزء، وUsing cross-origin resource sharing (CORS) في وثائق AWS.
السؤال 4 من 5
بنك لازم يحتفظ بسجلاته سبع سنين، بطريقة ما يقدر أحد يحذفها خلالها، ولا حتى المستخدم الجذر. وش يناسب؟
اعرض الجواب
الجواب الصحيح: C
في وضع Compliance، ما أحد يقدر يحذف إصدار مقفل أو يكتب فوقه لين تنتهي مدته، ولا حتى المستخدم الجذر، والمدة ما تنقص.
- A: هذا يطلب رمز MFA بس، فالمستخدم الجذر اللي معه الجهاز يقدر يحذف.
- B: المستخدمين اللي عندهم صلاحية خاصة يقدرون يحذفون في هذا الوضع.
- D: اللي عنده صلاحيات كافية يقدر يغير السياسة ببساطة.
للمراجعة: أوضاع Object Lock في هذا الجزء، وLocking objects with Object Lock في وثائق AWS.
السؤال 5 من 5
تدقيق يطلب شرطين على حاوية: ما تقبل الطلبات إلا عبر HTTPS، ويكون فيه سجل بكل استخدام لمفتاح التشفير. أي تغييرين يحققون هذا؟ (اختر اثنين.)
اعرض الجواب
الجواب الصحيح: C + E
السياسة ترفض أي طلب غير مشفر، ومع SSE-KMS تقدر تدقق استخدام المفتاح في CloudTrail.
- A: هذا يمنع الوصول العام، وما ينظر إلى HTTP أو HTTPS.
- B: هنا S3 تمسك المفتاح بالكامل، فما يطلع لك سجل بكل استخدام.
- D: هذا يحمي من الحذف، وما يحقق أي شرط منهم.
للمراجعة: التشفير المخزّن والتشفير أثناء النقل في هذا الجزء، وSecurity best practices for Amazon S3 وUsing server-side encryption with AWS KMS keys في وثائق AWS.
S3 مو الخيار الوحيد. لو عندك نظام Windows، أو مكتب يبي يوصل لتخزين السحابة، أو ملايين الملفات تبي تنقلها؟ في الجزء الثامن عشر نغطي خدمات التخزين والنقل الباقية.