
layerleak ماسح الأسرار لـ Docker Hub
Layerleak هو ماسح أسرار لصور OCI يعمل بوضع القراءة فقط. يقوم بحل مراجع الصور العامة دون الحاجة إلى Docker daemon، ويتحقق من المحتوى الذي تم تنزيله مقابل OCI digests، ويعيد بناء حالة الطبقات، ويفحص العناصر المحذوفة وبيانات الصورة الوصفية، ويعيد نتائج محجوبة غنية بالمصدر.
يدعم Docker Hub وGHCR وQuay وGCR وMCR وAmazon ECR Public وغيرها من السجلات المتوافقة مع OCI. يمكن حفظ النتائج بصيغة JSON وتخزينها في PostgreSQL لواجهة API المرفقة.
توثّق شجرة التطوير هذه خط الإصدار 3.0.0 على مسار الوحدة github.com/brumbelow/layerleak/v3. لا يصبح أمر الإصدار المرشح الموضح أدناه قابلاً للتثبيت إلا بعد نشر هذا الوسم بالتحديد. تم تجميد تسميات 3.0.0 في سجل التغييرات ومستند OpenAPI بشكل مقصود حتى يمكن ترقية إصدار مرشح مقبول من نفس التزام المصدر.
يقوم Layerleak بفحص محتوى صور غير موثوق، لذا فإن إعداداته الافتراضية محدودة بشكل مقصود وتفشل بشكل مغلق:
partial أو failed، وليس أبدًا كفحص نظيف.لا يتحقق Layerleak مما إذا كانت بيانات الاعتماد المكتشفة نشطة. لا يمتلك API نموذج تفويض: فهو مفتوح افتراضيًا، وفحص الرمز المشترك الاختياري LAYERLEAK_API_BEARER_TOKENS هو دفاع في العمق لمسارات /api/، وليس تحكمًا في الوصول. لا تعرضه إلا على شبكة موثوقة أو خلف بوابة مصادقة في كل الأحوال.
يتطلب Layerleak الإصدار 1.27.1 من Go أو أحدث.```bash go install github.com/brumbelow/layerleak/v3@latest layerleak --version layerleak --help
مسار الوحدة `/v3` هو هدف التثبيت الأساسي؛ لا يزال الملف التنفيذي المثبَّت
يحمل اسم `layerleak`. ثبّت إصدارًا مستقرًا أو مرشحًا للإصدار بشكل صريح عندما
تكون قابلية إعادة الإنتاج مهمة:```bash
go install github.com/brumbelow/layerleak/[email protected]
go install github.com/brumbelow/layerleak/[email protected]
يختار @latest على المسار /v3 أعلى إصدار v3 منشور. يستبعد Go الإصدارات الأولية من @latest بمجرد وجود إصدار مستقر، لذا بينما تُنشر الإصدارات المرشحة فقط، يُحلّ @latest إلى أحدث مرشح.
يبقى المسار الجذري github.com/brumbelow/layerleak بدون /v3 عند v1.0.0
إلى الأبد؛ أدرج /v3 دائمًا. تُبلّغ عمليات البناء من Checkout عن إصدار تطويري
مشتق من VCS، بما في ذلك علامة شجرة عمل غير نظيفة، أو dev بدون معلومات VCS.
تُبلّغ الملفات التنفيذية المثبّتة من الإصدار عن إصدار الوحدة المُحلّ عبر
layerleak --version.
يُرفق كل إصدار أيضًا أرشيفات CLI مبنية مسبقًا، فلا حاجة إلى سلسلة أدوات Go:
layerleak_<version>_<os>_<arch>.tar.gz لنظامي linux وdarwin على
amd64 وarm64 (تحتوي على layerleak وLICENSE و
THIRD_PARTY_NOTICES.md) وlayerleak_<version>_windows_amd64.zip
(layerleak.exe). يحمل كل إصدار ملف layerleak_<version>_checksums.txt
موقّعًا بدون مفاتيح بواسطة سير عمل الإصدار
(layerleak_<version>_checksums.txt.sigstore.json) وشهادة إثبات مصدر البناء
لكل أرشيف. تحقق قبل التشغيل:```bash
version=v3.0.0
archive="layerleak_${version}linux_amd64.tar.gz"
checksums="layerleak${version}_checksums.txt"
base="https://github.com/brumbelow/layerleak/releases/download/${version}"
curl --fail --location --proto '=https' --tlsv1.2 --remote-name-all
"${base}/${archive}" "${base}/${checksums}" "${base}/${checksums}.sigstore.json"
sha256sum --check --ignore-missing "${checksums}"
cosign verify-blob
--bundle "${checksums}.sigstore.json"
--certificate-identity 'https://github.com/Brumbelow/layerleak/.github/workflows/container-release.yml@refs/heads/main'
--certificate-oidc-issuer 'https://token.actions.githubusercontent.com'
"${checksums}"
gh attestation verify "${archive}" --repo Brumbelow/layerleak
--signer-workflow Brumbelow/layerleak/.github/workflows/container-release.yml
--source-ref refs/heads/main --deny-self-hosted-runners
tar -xzf "${archive}" layerleak ./layerleak version
يُثبت التوقيع أن ملف checksums جاء من سير عمل الإصدار لهذا المستودع على `main`، ويربط checksum الأرشيف بذلك الملف، ويُثبت الإقرار بشكل مستقل أن الأرشيف مرتبط بتشغيل سير العمل الذي بناه. يسرد `release-manifest.json` في الإصدار كل أرشيف وملخص الباينري بداخله. يُعيد الإصدار المستقر بناء commit الإصدار المرشح المقبول بسلسلة الإصدار المستقرة ويرفض النشر ما لم يُعِد البناء إنتاج باينريات المرشح بايتًا ببايت، لذا يُبلّغ `layerleak version` عن الوسم الذي حمّلته بالضبط.
### GitHub Action
جذر المستودع هو إجراء مركّب يقوم بتنزيل الأرشيف الخاص بالـ runner، والتحقق منه كما هو موضح أعلاه (checksum، وحزمة cosign الخاصة بملف checksums مع إصدار cosign المثبّت في `scripts/release-tools.sh`، وإقرار الأرشيف) وتشغيل `layerleak scan`. ثبّته على وسم إصدار؛ يتم تنزيل الأرشيفات المطابقة من ذلك الإصدار:```yaml
name: Image secrets
on: { push: { branches: [main] } }
permissions: { contents: read, security-events: write }
jobs:
layerleak:
runs-on: ubuntu-24.04
steps:
- id: scan
uses: brumbelow/[email protected]
with: { image: "ghcr.io/${{ github.repository }}:${{ github.sha }}", fail-on: none }
- uses: github/codeql-action/upload-sarif@b96794f015dfd88f77b49b1c93e0fa7110f94c63 # v4.38.0
if: ${{ always() && steps.scan.outputs.sarif-file != '' }}
with: { sarif_file: "${{ steps.scan.outputs.sarif-file }}" }
| الإدخال | الافتراضي | المعنى |
|---|---|---|
image | مطلوب | مرجع الصورة المراد فحصها؛ تستخدم السجلات الخاصة LAYERLEAK_REGISTRY_USERNAME/LAYERLEAK_REGISTRY_PASSWORD في env الخاص بالخطوة. |
version | الوسم في uses: | الإصدار الذي يتم تنزيل أرشيفه؛ اضبطه فقط عندما يحدد uses: فرعًا أو commit. |
format | sarif | summary أو json أو sarif. |
fail-on | low | يُمرَّر إلى --fail-on؛ none يُبلِّغ دون إفشال الخطوة. |
allow-partial | false | يُمرِّر --allow-partial. |
platform | كل بيان linux | يُمرَّر إلى --platform. |
output-file | $RUNNER_TEMP/layerleak/results.<ext> | المكان الذي تُكتب فيه النتيجة المنسَّقة. |
extra-args | فارغ | المزيد من أعلام layerleak scan، تُقسَّم على المسافات البيضاء وتُضاف في النهاية (على سبيل المثال --all-tags --max-repository-tags 50). |
المخرجات: exit-code (رمز خروج CLI، انظر الجدول تحت "Scan images")،
result-file (الملف المكتوب)، sarif-file (نفس المسار عندما يكون format
هو sarif، وإلا فارغ) وversion (الإصدار الذي تم تنزيله
والتحقق منه). تفشل الخطوة بالضبط عندما يخرج CLI برمز
غير صفري، لذا فإن fail-on: none مع if: always() على خطوة الرفع يعطي
فحصًا للإبلاغ فقط. لا يطبع الإجراء النتائج أبدًا؛ فقط صيغة
summary المنقَّحة تُطبع في السجل، ويعمل الفحص مع --no-artifacts.
يحتاج إلى curl وtar (أو unzip/7z على Windows) وGitHub CLI، وكلها
متوفرة على مشغلات GitHub المستضافة لـ Linux وmacOS وWindows.