
مجموعة أدوات 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
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 | تخطي مطالبات تأكيد الإزالة لكل حزمة |
.
├── bin/harden.sh orchestrator: parses args, asks role questions, runs modules in order
├── lib/
│ ├── common.sh logging, backups, idempotent file edits, the run() wrapper
│ ├── packages.sh updates, attack-tool removal
│ ├── ssh.sh SSH install/removal and hardening
│ ├── services.sh samba/ftp/telnet/mail/printing/mysql/http/dns
│ ├── firewall.sh ufw default-deny posture
│ ├── users.sh account review, hidden UID 0 / empty password detection
│ ├── kernel.sh sysctl hardening
│ ├── pam.sh password policy, account lockout
│ ├── filesystem.sh permissions, cron, rc.local, banners, anomaly scan
│ ├── monitoring.sh fail2ban, auditd, rkhunter, chkrootkit, ClamAV
│ └── forensics.sh read-only system baseline snapshot
├── tools/
│ ├── find-port-owner.sh resolve a listening TCP port to a process path
│ └── list-nonstandard-users.sh flag UID >= 1000 accounts not on an expected list
├── docs/
│ ├── security-controls.md every hardening decision, mapped to its source standard
│ └── editor-cheatsheet.md small editor commands worth remembering under pressure
├── examples/config.env.example annotated template for non-interactive runs
└── .github/workflows/shellcheck.yml lint on every push/PR
يُفحص كل نص برمجي بـ ShellCheck عند الدفع عبر GitHub Actions (.github/workflows/shellcheck.yml). للفحص محليًا قبل فتح PR:
shellcheck lib/*.sh bin/*.sh tools/*.sh
bin/harden.sh --dry-run هو أيضًا، بحد ذاته، اختبار: يمارس تدفق التحكم والتسجيل في كل وحدة دون لمس نظام الملفات أو تثبيت أي شيء، وهو أسرع طريقة للتحقق من تغيير على جهاز افتراضي قابل للتخلص منه قبل تشغيله فعليًا. انظر CONTRIBUTING.md للتوقعات الكاملة بشأن الوحدات الجديدة (قابلية التكرار، توجيه الإجراءات المدمّرة عبر run()، والاستشهاد بمصدر لأي خطوة تقوية جديدة).
يستشهد تعليق ترويسة كل وحدة وdocs/security-controls.md بقسم المعيار المحدد وراء كل قرار. المصادر الأساسية المستخدمة في كل مكان:
أدوات الكشف المشار إليها (غير مضمّنة، تُثبّت عبر apt):
fail2ban،
Linux Audit / auditd،
rkhunter،
chkrootkit. يُوصى بـ Lynis
وOpenSCAP كتدقيق لاحق مستقل ولا يُشغّلهما هذا المشروع تلقائيًا.
انظر docs/security-controls.md للمنطق الكامل وراء كل من هذه.
MIT. انظر LICENSE.
| الوحدة | تفعل |
|---|
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 | لقطة للقراءة فقط للمستخدمين والعمليات والمنافذ المستمعة والحزم المثبتة للمقارنة لاحقًا |
| المعيار | المصدر |
|---|
| CIS Ubuntu Linux Benchmark | https://www.cisecurity.org/benchmark/ubuntu_linux |
| NIST SP 800-53 Rev. 5 | https://csrc.nist.gov/pubs/sp/800/53/r5/upd1/final |
| DISA STIG for Ubuntu | https://public.cyber.mil/stigs/downloads/ |
| Mozilla OpenSSH modern configuration guidelines | https://infosec.mozilla.org/guidelines/openssh |
| CyberPatriot National Youth Cyber Defense Competition | https://www.uscyberpatriot.org/ |