أحدثت البنى التحتية الخالية من الخوادم (Serverless) ثورة في طريقة بناء التطبيقات ونشرها، مما يوفر قابلية للتوسع ويقلل من العبء التشغيلي. ومع ذلك، قد يخلق لقب "خالي من الخوادم" أحياناً شعوراً زائفاً بالأمان. مجرد أنك لا تدير البنية التحتية لا يعني أنك لست مسؤولاً عن تأمين منطق تطبيقك. في الواقع، الطبيعة المؤقتة لوظائف السيرفرليس تقدم نقاط هجوم فريدة تتطلب تحولاً في استراتيجية الأمان.
يقف ركيزتان في طليعة أمن السيرفرليس: التحقق الصارم من صحة المدخلات وسياسات إدارة الهوية والوصول (IAM) الصارمة. يستكشف هذا المنشور سبب أهمية هذين العنصرين ويقدم أمثلة برمجية قابلة للتطبيق لتأمين نشر تطبيقاتك.
وهم الثقة: لماذا يعد التحقق من صحة المدخلات أمراً لا غنى عنه
عند الانتقال إلى نموذج السيرفرليس، غالباً ما تكون وظائفك مكشوفة مباشرة عبر بوابات API أو يتم تشغيلها بواسطة مصادر أحداث مثل دلاء S3 أو تدفقات DynamoDB. سيحاول المهاجمون حتماً إرسال حمولات مشوهة أو ضخمة أو ضارة إلى هذه النقاط النهائية. بدون التحقق من الصحة، يكون كودك عرضة لحقن NoSQL، وتجاوز المخزن المؤقت، وأخطاء وقت التشغيل غير المتوقعة التي قد تؤدي إلى حجب الخدمة (DoS).
افترض دائماً أن جميع المدخلات عدائية. سواء كانت البيانات تأتي من رأس HTTP، أو جسم JSON، أو سلسلة استعلام، يجب تنظيفها والتحقق من صحتها قبل أن تلامس منطق عملك. ينطبق هذا ليس فقط على البيانات المقدمة من قبل المستخدم، ولكن أيضاً على الأحداث التي تولدها النظام.
تنفيذ التحقق في Node.js
بالنسبة لوظائف Lambda المستندة إلى Node.js، توفر مكتبات مثل Zod أو Joi قدرة قوية على التحقق من صحة المخططات. فيما يلي مثال باستخدام Zod للتحقق من صحة حمولات JSON الواردة. يضمن ذلك أن هيكل البيانات يتوقع التوقعات وأن الأنواع صحيحة قبل المعالجة.
const { z } = require('zod');
// Define the schema for a user profile
const UserSchema = z.object({
email: z.string().email("Invalid email format"),
age: z.number().int().min(0).max(150, "Age must be realistic"),
username: z.string().min(3).max(30).regex(/^[a-zA-Z0-9_]+$/, "Username must be alphanumeric")
});
exports.handler = async (event) => {
try {
// Parse and validate the incoming event body
const validatedData = UserSchema.parse(event.body);
// Proceed with business logic using validatedData
console.log("Validated user:", validatedData);
return {
statusCode: 200,
body: JSON.stringify({ message: "Success" })
};
} catch (error) {
// Handle validation errors gracefully
return {
statusCode: 400,
body: JSON.stringify({ error: error.errors })
};
}
};
من خلال رفض البيانات غير الصالحة عند نقطة الدخول، تمنع التلوث اللاحق وتقلل من سطح الهجوم. كما يعمل هذا النهج كشكل من أشكال توثيق الكود الذاتي، محدداً بوضوح ما تتوقعه وظيفتك.
أقل امتياز: إتقان IAM للسيرفرليس
بينما يحمي التحقق من صحة المدخلات كودك من البيانات السيئة، تحمي سياسات IAM بياناتك من الكود الضار أو المخترق. في بيئات الخوادم التقليدية، غالباً ما يمنح المطورون أذونات واسعة للراحة. في السيرفرليس، هذا خطأ كارثي.
ينص مبدأ أقل امتياز على أن كل وظيفة يجب أن يكون لها الحد الأدنى من الأذونات اللازمة لأداء مهمتها المحددة. إذا كانت وظيفة Lambda تحتاج فقط إلى القراءة من جدول DynamoDB معين، فيجب ألا يكون لديها أبداً أذونات لحذف العناصر، أو القراءة من جداول أخرى، أو الوصول إلى دلاء S3.
تحديد الأذونات الدقيقة
فكر في وظيفة تقوم بتحديث ملف تعريف المستخدم في DynamoDB. قد يمنح المبتدئ للوظيفة AdministratorAccess أو أذونات DynamoDB واسعة. بدلاً من ذلك، يجب علينا بناء سياسة IAM محددة.
إليك مستند سياسة IAM نموذجي يحد من وظيفة Lambda لأداء عمليات UpdateItem فقط على معرف مورد (ARN) محدد:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"dynamodb:UpdateItem"
],
"Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/UserProfiles/index/*"
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
}
]
}
لاحظ أمرين هنا. أولاً، تم تقييد الإجراء على UpdateItem؛ لا يمكن للوظيفة القراءة أو الحذف. ثانياً، يتم منح أذونات السجل بشكل منفصل، مما يضمن أنه إذا تم اختراق الوظيفة، فلن يتمكن المهاجم من إخفاء آثاره بسهولة عن طريق تعطيل التسجيل، على الرغم من أنه لن يزال لديه وصول إلى موارد حرجة أخرى.
الخاتمة
يتطلب تأمين وظائف السيرفرليس عقلية استباقية. لا يمكنك الاعتماد على دفاعات المحيط وحدها؛ يجب أن تؤمن الكود نفسه من خلال التحقق الصارم من صحة المدخلات وتحد من حجم الانفجار لأي اختراق محتمل من خلال سياسات IAM دقيقة. من خلال تنفيذ هذه الممارسات، تضمن أن تظل تطبيقات السيرفرليس الخاصة بك مرنة وموثوقة وآمنة ضد التهديدات الحديثة. تذكر، في السيرفرليس، الأمان ليس إضافة؛ إنه مكون أساسي من بنية نظامك.