
مجموعة أدوات Bash معيارية تُحصّن أنظمة Debian/Ubuntu لمسابقات CyberPatriot، مع أتمتة تحصين الحسابات وجدار الحماية وSSH وPAM والخدمات مع التسجيل والنسخ الاحتياطي.
مجموعة أدوات Bash معيارية لتقوية أنظمة عائلة Debian/Ubuntu تحت ضغط الوقت في المسابقات. بُنيت وصُقلت عبر عدة مواسم من مسابقة CyberPatriot الوطنية للدفاع السيبراني للشباب، وحققت مؤخرًا المستوى البلاتيني في قسم Linux في الجولة نصف النهائية لعام 2025.
هذا ليس إطار عمل عامًا للامتثال. إنه أداة أتمتة لقائمة تحقق لتمرين مؤقت مدته ست ساعات: ينفذ الأغلبية القابلة للبرمجة النصية من عملية تقوية Linux بشكل صحيح وسريع وقابل للتكرار، ويسجل كل ما لمسه، ويترك القرارات التقديرية للشخص الذي يشغله.
تُقيّم جولات Linux في CyberPatriot صورة حية وفق معيار يكافئ مجموعة متوقعة إلى حد كبير من خطوات التقوية -- نظافة الحسابات، سياسة كلمات المرور، إعداد جدار الحماية، تعرض الخدمات، أذونات الملفات، مستوى التحديثات -- ضمن حد زمني صارم، عادةً دون إشعار مسبق بالثغرات المزروعة بالضبط. تنفيذ قائمة التحقق هذه يدويًا وبشكل صحيح تحت العد التنازلي هو حيث تخسر الفرق نقاطًا سهلة بسبب الأخطاء المطبعية والخطوات المنسية، لا بسبب مواد غير معروفة.
بدأت مجموعة الأدوات هذه كنص برمجي واحد متكامل كُتب تحت هذا الضغط بالضبط. هذا المستودع هو إعادة كتابة لذلك النص: نفس تغطية قائمة التحقق، معاد هيكلتها إلى وحدات صغيرة أحادية الغرض يسهل قراءتها واختبارها والتفكير فيها بشكل مستقل، مع ربط كل قرار غير بديهي بقسم محدد من معيار CIS Benchmark أو ضابط من NIST SP 800-53 (انظر ضوابط الأمان والمراجع).
flowchart TD
A[bin/harden.sh] --> B[lib/common.sh<br/>logging, backups, run wrapper]
A --> C[Service-role prompts<br/>or --config file]
A --> D[lib/packages.sh<br/>updates, attack-tool removal]
A --> E[lib/firewall.sh<br/>default-deny + ufw]
A --> F[lib/ssh.sh]
A --> G[lib/services.sh<br/>samba/ftp/mail/http/mysql/dns]
A --> H[lib/users.sh<br/>account review, hidden UID 0]
A --> I[lib/kernel.sh<br/>sysctl hardening]
A --> J[lib/pam.sh<br/>password policy, lockout]
A --> K[lib/filesystem.sh<br/>permissions, cron, banners]
A --> L[lib/monitoring.sh<br/>fail2ban, auditd, rkhunter]
A --> M[lib/forensics.sh<br/>baseline snapshot]
D & E & F & G & H & I & J & K & L & M --> N[(~/hardening-run/<br/>log + backups + baseline)]
يتم استدعاء كل وحدة بواسطة bin/harden.sh، الذي يتولى تحليل الوسائط، واستبيان دور الخدمة، وترتيب التنفيذ. لا تستدعي الوحدات بعضها البعض مباشرة، وكل أمر يغيّر الحالة في كل وحدة يمر عبر غلاف run() في lib/common.sh، مما يمنح المشروع بأكمله مكانًا واحدًا لتنفيذ دعم التشغيل التجريبي، وتسجيل متسق، ومعالجة أخطاء غير قاتلة.
git clone <this-repo>
cd cyberpatriot-linux-hardening
sudo ./bin/harden.sh
سيُطرح عليك سلسلة قصيرة من أسئلة نعم/لا حول دور الجهاز (هل يحتاج Samba، FTP، SSH، خادم ويب، وهكذا)، ثم يعمل دون تدخل عبر الوحدات المذكورة أعلاه. يُكتب سجل، ومجموعة كاملة من النسخ الاحتياطية للإعدادات بطوابع زمنية، ولقطة أساسية للنظام إلى ~/hardening-run/.
في جولة فعلية، تجاوز مطالبات التأكيد لكل حزمة وأجب على أسئلة الدور من ملف إجابات مُعد مسبقًا بدلًا من كتابتها مباشرة:
cp examples/config.env.example my-machine.env
# edit my-machine.env for this box's actual role
sudo ./bin/harden.sh --config my-machine.env --auto-approve
تريد رؤية ما سيفعله بالضبط قبل أن يلمس أي شيء؟
sudo ./bin/harden.sh --dry-run --config my-machine.env
| الوحدة | تفعل |
|---|---|
lib/packages.sh | تحديث كامل للنظام؛ يزيل كاسرات كلمات المرور وأدوات الاستغلال تلقائيًا؛ يراجع الأدوات مزدوجة الاستخدام (nmap، Wireshark، netcat) والخدمات القديمة (VNC، NFS، telnet) قبل إزالتها |
lib/firewall.sh | رفض افتراضي للوارد / سماح افتراضي للصادر عبر ufw، بالإضافة إلى حظر صريح لمنفذ باب خلفي شائع معروف |
lib/ssh.sh | تشفيرات/KEX/MACs حديثة، لا تسجيل دخول للجذر، حدود الاتصال والجلسة -- أو إزالة SSH بالكامل إذا لم يكن الدور بحاجة إليه |
lib/services.sh | Samba، FTP، البريد، الطباعة، MySQL، HTTP، DNS: كل منها يُثبّت ويُقوّى بأدنى حد إذا كان الدور بحاجة إليه، أو يُزال ويُحظر بجدار الحماية إذا لم يكن كذلك |
lib/users.sh | مراجعة تفاعلية للحسابات الموجودة (حقوق المسؤول، الحذف، إعادة تعيين كلمة المرور)، واكتشاف حسابات UID-0 المخفية وكلمات المرور الفارغة |
lib/kernel.sh | إعدادات sysctl لحزمة الشبكة والحماية الذاتية للنواة (توجيه المصدر، إعادة توجيه ICMP، ASLR، نطاق ptrace، تقييد dmesg/kptr) |
lib/pam.sh | تعقيد كلمة المرور وسجلها عبر pam_pwquality/pam_pwhistory، وقفل الحساب عبر pam_faillock، وتقادم كلمة المرور في login.defs |
lib/filesystem.sh | أذونات الملفات الأساسية، تقييد cron/at، rc.local بأدنى حد، لافتات دخول قانونية، فحص للقراءة فقط لـ SUID/الملفات القابلة للكتابة من الجميع/الملفات بلا مالك |
lib/monitoring.sh | fail2ban وauditd افتراضيًا؛ ClamAV ومسح كامل بـ rkhunter/chkrootkit اختياريان (انظر ملاحظات السلامة في المسابقات) |
lib/forensics.sh | لقطة للقراءة فقط للمستخدمين والعمليات والمنافذ المستمعة والحزم المثبتة للمقارنة لاحقًا |
tools/find-port-owner.sh وtools/list-nonstandard-users.sh أدوات مساعدة صغيرة مستقلة لنفس نوع عمل الفرز، قابلة للاستخدام بشكل مستقل عن النص الرئيسي -- انظر ترويستهما للاستخدام.
نص برمجي للتقوية يعطّل الجهاز الذي يُفترض أن يحميه أسوأ من عديم الفائدة في جولة مؤقتة. تعكس بعض الإعدادات الافتراضية ذلك، ويستحق فهمها قبل تشغيل هذا دون تدخل:
SSH_PASSWORD_AUTH=no)، لكن الافتراضي هنا يفضّل عدم إغلاق الفريق خارج جهازه عندما لم يقم أحد بتوفير المفاتيح بعد.INSTALL_CLAMAV، RUN_BASELINE_SCAN)، لأنهما أبطأ شيئين يمكن لهذا النص فعله ولا يغيّر أي منهما حالة النظام بمفرده. شغّلهما إذا كانت قائمة التحقق لديك تتطلبهما أو لديك وقت فائض.~/hardening-run/baseline/listening_ports.txt من تشغيل سابق إذا لم تكن متأكدًا مما يستمع فعليًا قبل تقوية جهاز لأول مرة.docs/security-controls.md للإجراء اليدوي.سيسأل bin/harden.sh تفاعليًا عن دور خدمة الجهاز إذا لم تجب مسبقًا. لتخطي المطالبات، انسخ examples/config.env.example، واملأ الدور الفعلي، ومرّره عبر --config. أي متغير تتركه خارج الملف يعود إلى مطالبة تفاعلية، لذا ملف إعدادات مملوء جزئيًا لا بأس به.
sudo ./bin/harden.sh --config my-machine.env
الوسائط:
| الوسيط | التأثير |
|---|---|
--config FILE | تحميل إجابات الدور/السياسة من ملف env |
--dry-run | تسجيل كل إجراء سيُتخذ؛ دون تغيير أي شيء |
--auto-approve | تخطي مطالبات تأكيد الإزالة لكل حزمة |