رمز المصدر الآمن

1. نظرة عامة

تقنيات أمان الرموز البرمجية هي مجموعة من الممارسات التي يمكن استخدامها لتحسين أمان الرموز البرمجية. يمكن أن تساعد هذه التقنيات في تحديد نقاط الضعف في الرمز المصدر وإصلاحها، ومنع الوصول غير المصرَّح به إلى الرمز المصدر، وحماية الرمز المصدر من التعديل.

تشمل بعض تقنيات رمز المصدر الآمن الشائعة ما يلي:

  • التدقيق النحوي: هو عملية التحقّق من رمز المصدر بحثًا عن الأخطاء والمشاكل المتعلقة بالأسلوب. ويتم ذلك باستخدام أداة lint، وهي برنامج يحلّل رمز المصدر ويحدّد المشاكل المحتملة. يمكن استخدام أدوات Lint للبحث عن مجموعة متنوعة من الأخطاء، بما في ذلك أخطاء البنية الأخطاء النحوية وأخطاء الأسلوب والثغرات الأمنية.
  • اختبار أمان التطبيقات الثابتة (SAST): هو نوع من اختبارات الأمان التي تحلِّل الرمز المصدر أو الرمز الثنائي أو رمز البايت لتحديد الثغرات الأمنية. يمكن استخدام أدوات فحص نقاط الضعف في مرحلة التطوير للعثور على ثغرات أمنية في مجموعة متنوعة من لغات البرمجة، بما في ذلك Go وJava وPython وC++ وC#.
  • فحص التراخيص: فحص التراخيص هو عملية تحديد تراخيص مكوّنات البرامج التابعة لجهات خارجية المستخدَمة في تطبيق معيّن. وهذا مهم لأنّه يساعد في ضمان امتثال التطبيق لبنود التراخيص، ما قد يساعد في تجنُّب المشاكل القانونية.

ويمكن استخدام هذه الأساليب لتحسين أمان رمز المصدر في جميع مراحل دورة حياة تطوير البرامج. يمكن استخدام فحص الأخطاء لتحديد الأخطاء في مرحلة مبكرة من عملية التطوير، ويمكن استخدام فحص أمان الرمز المصدر (SAST) للعثور على الثغرات الأمنية قبل تجميع الرمز أو نشره، ويمكن استخدام فحص الترخيص لضمان امتثال التطبيق لبنود التراخيص.

يمكن أن يساعد استخدام هذه التقنيات في تحسين أمان رمز المصدر والحدّ من خطر عمليات اختراق الأمان.

ما ستتعرّف عليه

سيركز هذا الدرس التطبيقي على الأدوات والأساليب لتأمين رمز المصدر للبرامج.

  • الوبر
  • اختبار أمان التطبيقات الثابت
  • مسح التراخيص

سيتم تنفيذ جميع الأدوات والأوامر المستخدَمة في هذا الدرس التطبيقي في Cloud Shell.

2. الإعداد والمتطلبات

إعداد البيئة حسب وتيرة الطالب واحتياجاته

  1. سجِّل الدخول إلى Google Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها واجهات برمجة تطبيقات Google. ويمكنك تعديله في أي وقت.
  • يكون معرّف المشروع فريدًا في جميع مشاريع Google Cloud وغير قابل للتغيير (لا يمكن تغييره بعد ضبطه). تُنشئ وحدة تحكّم Cloud Console سلسلة فريدة تلقائيًا، ولا يهمّك عادةً معرفة محتواها. في معظم ورشات عمل رموز البرامج، ستحتاج إلى الإشارة إلى معرّف المشروع (يُعرَف عادةً باسم PROJECT_ID). إذا لم يعجبك المعرّف الذي تم إنشاؤه، يمكنك إنشاء معرّف آخر عشوائي. يمكنك بدلاً من ذلك تجربة عنوانك ومعرفة ما إذا كان متاحًا. ولا يمكن تغييره بعد هذه الخطوة وسيظلّ ساريًا طوال مدة المشروع.
  • يُرجى العِلم أنّ هناك قيمة ثالثة، وهي رقم المشروع الذي تستخدمه بعض واجهات برمجة التطبيقات. اطّلِع على مزيد من المعلومات عن كلّ من هذه القيم الثلاث في المستندات.
  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد/واجهات برمجة تطبيقات Cloud. من المفترض ألا تتطلّب المشاركة في هذا الدليل التعليمي البرمجي أي تكلفة، أو تكلفة منخفضة جدًا. لإيقاف الموارد كي لا يتم تحصيل رسوم منك بعد انتهاء هذا الدليل التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع بأكمله. المستخدمون الجدد في Google Cloud مؤهّلون للاستفادة من برنامج الفترة التجريبية المجانية التي تقدّم رصيدًا بقيمة 300 دولار أمريكي.

بدء "محرر Cloud Shell"

تم تصميم هذا البرنامج التدريبي واختباره للاستخدام مع محرِّر Google Cloud Shell. للوصول إلى المحرِّر، اتّبِع الخطوات التالية:

  1. يمكنك الوصول إلى مشروعك على Google على الرابط https://console.cloud.google.com.
  2. في أعلى يسار الصفحة، انقر على رمز محرِّر Cloud Shell.

8560cc8d45e8c112.png

  1. ستفتح لوحة جديدة في أسفل نافذتك.
  2. انقر على الزر Open Editor (فتح المحرِّر).

9e504cb98a6a8005.png

  1. سيتم فتح المحرِّر مع متصفّح على يسار الصفحة والمحرِّر في المنطقة المركزية.
  2. من المفترض أن تتوفّر أيضًا لوحة وحدة طرفية في أسفل الشاشة.
  3. إذا لم تكن المحطة الطرفية مفتوحة، استخدِم مجموعة المفاتيح `ctrl+`` لفتح نافذة وحدة طرفية جديدة.

إعداد البيئة

اضبط GOPATH على دليل واحد لتبسيط الأوامر المستخدَمة في هذا الدرس العملي.

export GOPATH=$HOME/gopath

إنشاء دليل لتخزين أعمالنا

mkdir -p workspace
cd workspace

استنساخ مستودع رمز المصدر

git clone https://gitlab.com/gcp-solutions-public/shift-left-security-workshop/source-code-lab.git
cd source-code-lab
export WORKDIR=$(pwd)

3- الوبر

تُستخدَم ميزة "التدقيق النحوي" للتحقّق من الأخطاء الشائعة المستندة إلى الأسلوب أو العيوب المرتبطة بالبنية. تساعد ميزة "التدقيق النحوي" في تحسين الأمان من خلال توفير نمط نحوي شائع في فِرق متعدّدة، ما يؤدي إلى مراجعة الرموز البرمجية بشكل أسرع ومشاركة المعرفة ووضوح الرموز البرمجية.

بالإضافة إلى ذلك، ترصد أداة Linting أخطاء البنية الشائعة التي يمكن أن تؤدي إلى نقاط ضعف شائعة، مثل الاستخدام غير الصحيح أو الأقل فعالية للمكتبات أو واجهات برمجة التطبيقات الأساسية.

تثبيت أداة ربط staticcheck

 go get honnef.co/go/tools/cmd/staticcheck@latest

تشغيل Go Linter (staticcheck) في الدليل الجذري للمشروع

 staticcheck

مراجعة النتيجة

main.go:42:29: unnecessary use of fmt.Sprintf (S1039)

يظهر لك الخطأ لأنّ http.ListenAndServe() يقبل سلسلة، ويستخدم الرمز البرمجي الحالي Sprintf بدون تمرير متغيّرات إلى السلسلة.

راجِع حالة إنهاء الأمر.

echo $?

في هذه الحالة، بما أنّ الأمر أدّى إلى حدوث خطأ، ستكون حالة الخروج 1 أو أكثر. هذه إحدى الطرق التي يمكن استخدامها في مسار التكامل المستمر/النشر الدائم لتحديد نجاح الأداة أو تعذّر استخدامها.

عدِّل ملف main.go وأصلِح الرمز البرمجي:

  • أضِف تعليقًا على السطر أدناه LINTING - Step 1 داخل الطريقة main()، وذلك عن طريق إضافة الشرطة المائلة(//) في بداية السطر.
  • أزِل التعليقات من السطرَين أسفل LINTING - Step 2 مباشرةً داخل طريقة main()، وذلك عن طريق إزالة الشُرطَين المائلة اللذَين يسبقانهما.

إعادة تشغيل staticcheck في الدليل الجذري للمشروع

staticcheck

يجب ألا يعرض الأمر أي نتائج (أي سطر فارغ).

راجِع حالة الخروج من الأمر.

  echo $?

في هذه الحالة، بما أنّ الأمر لم يؤدّ إلى حدوث خطأ، ستكون حالة الخروج هي صفر.

4. اختبار أمان التطبيقات الثابت

اختبار الأمان الثابت (AST) - يقدّم تحليلاً للرمز الثابت بحثًا عن نقاط الضعف والتعرّض الشائعة (CWEs)

تثبيت أداة AST (gosec)

    export GOSEC_VERSION="2.15.0"
    curl -sfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | \
          sh -s -- -b $(go env GOPATH)/bin v${GOSEC_VERSION}

تشغيل gosec مع ملف السياسة على رمز المصدر

gosec -conf policies/gosec-policy.json -fmt=json ./...

من المفترض أن تكون النتيجة مشابهة لما يلي:

{
    "Golang errors": {},
    "Issues": [
        {
            "severity": "HIGH",
            "confidence": "LOW",
            "cwe": {
                "ID": "798",
                "URL": "https://cwe.mitre.org/data/definitions/798.html"
            },
            "rule_id": "G101",
            "details": "Potential hardcoded credentials",
            "file": "/home/random-user-here/shift-left-security-workshop/labs/source-code-lab/main.go",
            "code": "31: \t// STEP 2: Change this and the reference below to something different (ie, not \"pawsword\" or \"password\")\n32: \tvar pawsword = \"im-a-cute-puppy\"\n33: \tfmt.Println(\"Something a puppy would use: \", username, pawsword)\n",
            "line": "32",
            "column": "6"
        }
    ],
    "Stats": {
        "files": 1,
        "lines": 89,
        "nosec": 0,
        "found": 1
    }
}

رصدت الأداة مشكلة محتملة: Potential hardcoded credentials

5- مسح التراخيص

تُعدّ التراخيص مهمة للحفاظ على الأمان لأنّها يمكن أن تطلب منك قانونيًا عرض الرمز المصدر الذي قد لا تريد عرضه. يُعرف هذا المفهوم باسم تراخيص copyleft التي تتطلّب منك عرض الرمز المصدر في حال استخدام التبعيات مع هذه التراخيص.

تثبيت تطبيق "golicense"

mkdir -p /tmp/golicense
wget -O /tmp/golicense/golicense.tar.gz https://github.com/mitchellh/golicense/releases/download/v0.2.0/golicense_0.2.0_linux_x86_64.tar.gz
pushd /tmp/golicense
tar -xzf golicense.tar.gz
chmod +x golicense
mv golicense $(go env GOPATH)/bin/golicense
popd

إنشاء الملف الثنائي

go build

تنفيذ عملية التحقّق من الترخيص باستخدام ملف السياسة الحالي الذي لا يسمح بترخيصات "BSD-3-Clause"

golicense policies/license-policy.hcl hello-world

ملاحظة: من المفترض أن يتعذّر تنفيذ هذا الإجراء مع ظهور نتيجة مشابهة:

 🚫 rsc.io/sampler    BSD 3-Clause "New" or "Revised" License
 🚫 rsc.io/quote      BSD 3-Clause "New" or "Revised" License
 🚫 golang.org/x/text BSD 3-Clause "New" or "Revised" License

عدِّل ملف السياسة policies/license-policy.hcl لنقل "BSD-3-Clause" من قائمة deny إلى قائمة allow.

إعادة تشغيل عملية التحقّق من الترخيص

golicense policies/license-policy.hcl hello-world

ملاحظة: من المفترض أن تنجح هذه العملية مع ظهور نتيجة مشابهة:

    ✅ rsc.io/quote      BSD 3-Clause "New" or "Revised" License
    ✅ rsc.io/sampler    BSD 3-Clause "New" or "Revised" License
    ✅ golang.org/x/text BSD 3-Clause "New" or "Revised" License

6- تهانينا

تهانينا، لقد أكملت دورة codelab.

ما تعلمته

  • الأدوات والأساليب لتأمين الرموز المصدرية

تاريخ آخر تعديل: 23‏/03‏/23