قرار إصدار واحد يُفرض في كل مسار
تعمل Fendix داخل مسار CI/CD لديك، فتجمع الأدلة الأمنية أو تستوردها، وتتحقق من التغطية التي تشترطها، وتطبّق سياسة الإصدار المحفوظة في مستودعك، وتعيد نتيجة يستطيع المسار فرضها — بالطريقة نفسها في كل مستودع.
ماذا يحدث داخل المسار
سبع خطوات تعمل مع كل طلب دمج أو دمج فعلي. خطوات الفحص تُنتج الأدلة، وخطوات السياسة تحوّلها إلى نتيجة.
- 1
مهمة CI/CD
تشغّل مهمةٌ عند طلب الدمج أو الدمج محرك Fendix من صورة الحاوية أو الملف التنفيذي الموقّعين.
- 2
جمع الأدلة أو استيرادها
تحليل DAST وSAST وSCA والأسرار الخاص بـFendix، إضافةً إلى ملفات SARIF من الأدوات التي تستخدمها عبر fendix import.
- 3
التحقق من التغطية المطلوبة
يسجّل كل محلل ما إذا كان قد عمل. وتُفشل --fail-on-coverage-gap أو --require-analyzers المهمة عندما تغيب أدلة مطلوبة.
- 4
تقييم النتائج وتصنيف المخاطر
بوابة الثقة، والتعامل مع شيفرة الاختبار، وخطوط الأساس، واستثناءات .fendix-ignore بتواريخ انتهاء.
- 5
تطبيق سياسة الإصدار
العتبة وفرض الثقة المحفوظان في .fendix.yaml، ويُراجَعان مثل أي تغيير آخر.
- 6
إعادة نتيجة قابلة للفرض
تصنّف CLI كل نتيجة BLOCK أو WARN أو INFO وتحدد رمز الخروج. وتحوّل مساحة العمل المستضافة الأدلة نفسها إلى قرار واحد: PASS أو WARN أو BLOCK أو INCOMPLETE.
- 7
نشر السجل
SARIF 2.1.0 لفحص الشيفرة، وJSON للأتمتة، وHTML للأشخاص. وتُحفظ القرارات المستضافة مع مبرراتها وإصدار السياسة.
ماذا يعني رمز الخروج
- 0
- لم تبلغ أي نتيجة مستوى BLOCK وفق سياستك.
- 1
- بلغت نتيجة واحدة على الأقل مستوى BLOCK، ويذكر التقرير أيها ولماذا.
- 2
- تعذّر على التشغيل إنتاج نتيجة موثوقة: خطأ، أو فجوة في التغطية المطلوبة عند تفعيل رايات التغطية.
افتراضيًا لا تُفشل الخطورة وحدها المهمة: لا تحظر النتيجة التي تبلغ --fail-on أو تتجاوزه إلا إذا دعمت الثقة الحتمية والأدلة هذا الادعاء، وتذكر كل نتيجة مؤجلة إلى WARN سبب ذلك. ويعيد الخيار --enforce-confidence=false بوابة الخطورة وحدها القديمة، وتُعلَّم النتيجة التي تُحظر بسببه فقط كتجاوز للسياسة.
كيف تحدد السياسة والثقة حظر الإصدارGitHub Actions: إجراء Fendix Security Scan
تكامل GitHub الموصى به: إجراء متاح للعامة على GitHub Marketplace يثبّت إصدار Fendix بعد التحقق من توقيعه، ويجعل نجاح المهمة أو فشلها خاضعًا لسياسة الإصدار لديك.
ثبّت الإجراء على الـcommit الكامل لإصداره v3.7.0، مع تحديد version صراحةً. يثبّت الـcommit شيفرة الإجراء نفسه فلا تتغير دون علمك، أما version فيحدد إصدار المحرك الذي يثبّته الإجراء، وهو هنا v3.7.0. لا تستخدم @main أبدًا، فهو يتغيّر دون مراجعة.
permissions:
contents: read
security-events: write # SARIF upload
actions: read # SARIF upload in a private or internal repository
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0 # diff mode compares against the PR base ref
- uses: Fendix-app/Fendix@90adf6a5082be0661b4156566a3a99609ed4792d # v3.7.0
with:
version: v3.7.0
code: .
fail-on: HIGHالمحللات المطلوبة
في فحص الشيفرة يشترط الإجراء عمل Semgrep. فهو يشغّل Semgrep على قاعدة مضمّنة قبل الفحص، ثم يمرّر هذا الشرط إلى المحرك، فإذا كان Semgrep مفقودًا أو معطوبًا أو توقف عن الاستجابة أخفقت المهمة برمز الخروج 2 بدل أن تنجح من دونه. ويحتاج Semgrep إلى glibc 2.34 أو أحدث، أو musl 1.2 أو أحدث، على معمارية x86_64 أو aarch64، وهو ما تستوفيه مشغّلات GitHub المستضافة والصورة الرسمية. أما على مشغّل ذاتي الاستضافة أقدم من ذلك، فشغّل Fendix من الصورة الرسمية داخل مهمة حاوية (container job)، أو اضبط require-analyzers: none لإجراء الفحص دون Semgrep، وعندها تنبّه البوابة إلى أن التغطية غير مفروضة.
الوسم @v1
منذ 27 أكتوبر 2026 يشير @v1 إلى الـcommit الخاص بإصدار v3.7.0، أي إلى شيفرة الإجراء نفسها المثبّتة أعلاه، وقد اجتاز استخدام @v1 مباشرةً مع version: v3.7.0 سيناريوهات الاختبار الشامل نفسها. ينتقل الوسم عند صدور إصدار لاحق متوافق، لذا ثبّت الـcommit حين يجب ألا يتغيّر المرجع أبدًا.
المستودعات الخاصة
يتطلب رفع SARIF إلى مستودع خاص أو داخلي ميزة GitHub Code Security. وفي غيابها، اضبط upload-sarif: 'false': يستمر الفحص وبوابة الإصدار في العمل.
وصفات المسار
انسخ وصفة، ثم احفظ السياسة في .fendix.yaml لتقرأ كل المسارات البوابة نفسها. الشيفرة غير مترجمة.
GitLab CI
# Generate a native GitLab CI include file (.gitlab-ci.fendix.yml)
fendix init --ci gitlab
# The generated job (or paste manually):
fendix_scan:
image: fendixapp/fendix:3.7.0
script:
- fendix scan
--url "$API_URL"
--format json
--fail-on HIGH
--baseline ./baseline.json
--save-baseline ./baseline.json
--output fendix.json
artifacts:
paths: [fendix.json, baseline.json]CircleCI
# Generate a native CircleCI snippet (.circleci/fendix-config.yml)
fendix init --ci circleci
# The generated orb step (or paste manually):
version: 2.1
jobs:
security-scan:
docker:
- image: fendixapp/fendix:3.7.0
steps:
- checkout
- run:
name: Fendix scan
command: |
fendix scan \
--url "$API_URL" \
--code ./src \
--format sarif \
--fail-on HIGH \
--output fendix.sarif
- store_artifacts:
path: fendix.sarifJenkins
sh '''
fendix scan \
--url $API_URL \
--code ./src \
--format html \
--fail-on HIGH \
--save-baseline ./baseline.json \
--output fendix.html
'''Docker Compose
services:
fendix:
image: fendixapp/fendix:3.7.0
command: >
scan --url http://api:8080
--code /workspace/src
--format json --fail-on HIGH
--save-baseline /workspace/baseline.json
--output /workspace/results.json
volumes:
- .:/workspaceمزامنة مشكلات Jira
# Required Jira configuration
export FENDIX_JIRA_URL=https://your-org.atlassian.net
export FENDIX_JIRA_PROJECT_KEY=SEC
export FENDIX_JIRA_EMAIL=you@example.com
export FENDIX_JIRA_API_TOKEN=<personal-access-token>
# Optional severity floor (default: HIGH)
export FENDIX_JIRA_MIN_SEVERITY=HIGH
# Idempotent: creates once, then skips an existing fendix-id label
fendix jira --findings fendix.jsonتنبيهات Slack وMicrosoft Teams
# Configure either or both incoming webhooks
export FENDIX_SLACK_WEBHOOK_URL="$SLACK_WEBHOOK_URL"
export FENDIX_TEAMS_WEBHOOK_URL="$TEAMS_WEBHOOK_URL"
# Optional severity floor (default: CRITICAL)
export FENDIX_NOTIFY_MIN_SEVERITY=HIGH
fendix notify --findings fendix.jsonمسارات عمل مولّدة وتطبيق GitHub
يكتب fendix init --ci github أو --ci gitlab أو --ci circleci مسار عمل أصليًا يثبّت إصدارًا محددًا من Fendix ويتحقق من توقيعه قبل التشغيل. ويحتفظ مسار عمل GitLab بملف SARIF كملف artifact عادي، لأن SARIF من Fendix ليس صيغة تقرير SAST الخاصة بـ GitLab.
تفضّل امتلاك ملف مسار العمل بنفسك؟ مسار العمل المرجعي المُختبَر بديل للفرق التي تريد ملكية مباشرة لمسار العمل، وبصمة حاوية ثابتة غير قابلة للتغيير، وإجراءات خارجية مثبّتة صراحةً. يشغّل حاوية v3.7.0 الرسمية، ويتضمن خط أساس مخزّنًا مؤقتًا، ورفع SARIF، وتعليقًا ملخصًا على طلب الدمج، وبوابة --fail-on HIGH: examples/github-actions/fendix-scan.yml
تفضّل الاستغناء عن ملف مسار العمل؟ يفحص تطبيق GitHub ذاتي الاستضافة كل طلب دمج وينشر تعليقًا ملخصًا وتعليقات SARIF. الإعداد والنشر موثّقان في docs/github-app.md
مرجع تقني: اشتراط التغطية قبل الإصدار · معنى كل رمز خروج · تصدير SARIF لفحص الشيفرة المصدرية · استيراد SARIF من أدوات فحص أخرى
مساحة العمل المستضافة والأهداف الخاصة
تحتفظ مساحة العمل المستضافة بسجل الفحوصات والنتائج وقرارات الإصدار. ومسارات HTTP الخلفية واجهة خدمة خاصة، لذلك تعتمد الأتمتة المدعومة على واجهة الأوامر وتكاملات CI/CD وتقارير JSON وSARIF الموثقة أعلاه.
المشغّلات ذاتية الاستضافة تصل إلى ما لا تصل إليه السحابة.
ينفذ مشغّل Enterprise تحليل الهدف والشيفرة داخل شبكتك، ثم يعيد التقرير الناتج إلى مساحة العمل المستضافة. توفّر Fendix حزمة التشغيل المدعومة وقيم الاتصال أثناء التهيئة؛ أما بروتوكول الاتصال فليس عقد توسعة عامًا.
إعداد المشغّل الموجّه للعملاء
- أنشئ مساحة عمل Enterprise أو اخترها، واطلب تفعيل المشغّل عبر جهة الاتصال المعتمدة في Fendix.
- سجّل المشغّل من إعدادات مساحة العمل، واحفظ قيم الاتصال التي تظهر مرة واحدة في مخزن الأسرار المعتمد لديك.
- انشر حزمة المشغّل المدعومة داخل الشبكة التي تصل إلى الأهداف المصرح بها، ثم تحقق من سلامة الاتصال عبر مساحة العمل.
- استخدم مسار الدعم واستكشاف الأعطال الموثق عند تعذر الاتصال، ولا تنشئ عميلًا مخصصًا لمسارات الخدمة الخلفية.
نطاق التنفيذ الحالي
- بيئة التشغيل
- لا تتطلب ملفات Go التنفيذية الجاهزة مترجم Go للفحص الأساسي. يتطلب البناء من المصدر Go 1.25+. لمحركات الفحص الاختيارية متطلبات تشغيل خاصة؛ راجع التغطية للتأكد من تنفيذها.
- DAST
- يفحص تحليل الروابط وواجهات API السلوك الظاهر أثناء التشغيل. تتطلب الاختبارات النشطة --enable-active. لا تثبت استجابة HTTP 200 وحدها الوصول إلى بيانات حساسة.
- SAST
- تغطي القواعد الساكنة الأصلية أنماطًا مدعومة في Go وJavaScript وJava والبنية التحتية. يوسّع Semgrep ومحرك Python الذي تحاول فحوصات الشيفرة تشغيله الفحوصات المناسبة عند توفرهما. دعم اللغة لا يعني تغطية جميع الأطر أو المسارات.
- SCA
- يستخدم تحليل Go أداة govulncheck. تستخدم محركات تبعيات Python وnpm ملفات التعريف والتثبيت المدعومة، ومنها poetry.lock وPipfile.lock وpackage-lock.json. قد تنقل استعلامات الثغرات أسماء الحزم وإصداراتها.
- الأدلة والسياسة
- يربط الترابط المشاهدات المتطابقة المدعومة؛ ليست لكل نتيجة مصادر متعددة. قد تكفي أدلة قوية من مصدر واحد. الشدة والثقة وحالة النتيجة وتوصية الإصدار مفاهيم منفصلة.
- التغطية والمراجعة البشرية
- قد يترك فشل محرك أو غياب أدلة مطلوبة الإصدار غير مكتمل. تعني PASS نتيجة وفق السياسة والتغطية المحددتين وليست ضمانًا للأمان أو موافقة بشرية.
الترقية من محرك أقدم
غيّر الإصدار v3.0 طريقة تعريف النتائج، ويطبّق الإصدار v3.6.0 خطوط الأساس وقواعد .fendix-ignore وهوية SARIF على كل وقوع على حدة. بعد الترقية من إصدار أقدم من v3.0، أعد حفظ خطوط الأساس مرة واحدة، وأعد كتابة أي قاعدة .fendix-ignore تثبّت قيمة fingerprint:، وتوقّع إعادة تسجيل تنبيهات فحص الشيفرة في GitHub مرة واحدة تحت معرّفات قواعدها الجديدة.