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

1. نظرة عامة

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

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

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

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

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

ما سوف تتعلمه

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

  • باستخدام أداة Lint
  • اختبار أمان التطبيقات الثابت
  • فحص التراخيص

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

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

إعداد بيئة ذاتية

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

بدء محرِّر Cloud Shell

تم تصميم هذا الدرس التطبيقي واختباره للاستخدام مع Google Cloud Shell Editor. للوصول إلى المحرر،

  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- باستخدام أداة Lint

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

بالإضافة إلى ذلك، تحدد أداة 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- تهانينا

تهانينا، لقد أنهيت الدرس التطبيقي حول الترميز.

ما تعلمته

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

تاريخ التعديل الأخير: 23/3/23