الأدلة التقنية

إدارة كلمات المرور في المؤسسة: من ملف Excel إلى خزنة

لماذا لا يصلح ملف Excel لكلمات مرور الشركة، وكيف تنقل الحسابات المشتركة إلى خزنة بصلاحيات وسجل وخطة طوارئ.

إدارة كلمات المرور في المؤسسة: من ملف Excel إلى خزنة

افتح المجلد المشترك لقسم تقنية المعلومات في أغلب الشركات وابحث عن كلمة «password» أو «كلمة المرور»، وسوف تجد غالباً ملف Excel اسمه passwords.xlsx أو «حسابات النظام»، فيه عمود للنظام وعمود لاسم المستخدم وعمود لكلمة المرور، وبجانبه نسخة قديمة من سنة سابقة لم يحذفها أحد، ونسخة ثالثة أرسلها أحدهم بالبريد إلى زميل جديد. وهذا الملف ليس علامة على فريق مهمل، فهو الحل الذي يصل إليه كل فريق عندما تكبر الحسابات المشتركة ولا توجد أداة لها، ولكن المشكلة أنه يبقى بعد أن يكبر الفريق ويغادر من كان يعرف قصته.

المواضيع في السلسلة:

  1. إدارة كلمات المرور في المؤسسة: من ملف Excel إلى خزنة (الموضوع الحالي)
  2. Bitwarden أم Vaultwarden أم Passbolt؟ مدير كلمات مرور لفريقك
  3. Vaultwarden: مدير كلمات مرور للفريق على سيرفرك

وفي هذا المقال سوف نتناول:

  • أين تعيش كلمات المرور في الشركة اليوم، ولماذا لا يصلح ملف Excel حتى لو حميته بكلمة مرور.
  • الأنواع الأربعة من الأسرار، والمكان الصحيح لكل نوع، ولماذا يأتي الدخول الموحد SSO قبل كل ذلك.
  • ما تقوله إرشادات NIST SP 800-63B في مراجعتها الرابعة عن كلمات المرور، وما الذي تغير عن القواعد القديمة.
  • ما يفعله الموظف بكلمات مروره، وما تفعله الشركة بالحسابات المشتركة.
  • العملية كاملة في تسع خطوات، من جرد الملفات إلى المراجعة الدورية.
  • تجربة عملية تبحث في مجلد مشترك عن الملفات التي تحمل كلمات مرور وتفحصها بقواعد NIST، ثم نكسرها لنرى ما لا تراه.

أين تعيش كلمات المرور في شركتك اليوم؟

قبل أن تختار أي أداة يجب أن تعرف أين توجد كلمات المرور الآن، والسبب أن الأداة الجديدة لا تحذف شيئاً من الأماكن القديمة، فإذا لم تعرفها بقيت كما هي بجانب الخزنة الجديدة. والأماكن التي تتكرر في أغلب الشركات هي التالية:

  • ملفات Excel على المجلد المشترك: الأشهر على الإطلاق، وغالباً ورقة لكل قسم، وصف لكل نظام.
  • مستندات Word وملفات نصية: محضر اجتماع فيه كلمة مرور شبكة الضيوف، أو دليل تسليم كتبه موظف قبل أن يغادر.
  • المتصفح الشخصي للموظف: حفظ كلمة مرور حساب الشركة على X في حساب Chrome الشخصي الخاص به، فتنتقل معه إلى بيته وهاتفه.
  • مجموعات المحادثة والبريد: «أرسل لي كلمة مرور لوحة الإعلانات»، فتبقى الرسالة في المحادثة وفي النسخ الاحتياطية للهواتف.
  • الأوراق اللاصقة ولوحة الاستقبال: كلمة مرور الشبكة مكتوبة على لوحة يراها كل زائر.
  • رأس موظف واحد: حساب البنك أو مسجل النطاق لا يعرفه إلا المدير المالي أو مؤسس الشركة، وهذا أخطر من الملف نفسه.

الحل البسيط: ملف Excel بكلمة مرور

وقد يتساءل البعض: لماذا لا نحمي الملف بكلمة مرور ونضعه في مجلد لا يصل إليه إلا فريق تقنية المعلومات؟ والإجابة أن كلمة مرور الملف تحل مشكلة واحدة فقط، وهي أن من يجد الملف دون كلمة المرور لا يقرؤه، أما بقية المشاكل فتبقى كما هي، لأن الملف ينسخ ويرسل ويحفظ في النسخ الاحتياطية، وكل نسخة منه تعيش للأبد ولا تعرف مكانها. الصورة التالية تبين ما يحدث لملف واحد بعد سنة من استخدامه:

ملف passwords.xlsx على مجلد مشترك تخرج منه أربع نسخ: مرفق في بريد، ولابتوب موظف غادر، ومجموعة محادثة، والنسخة الاحتياطية، وبجانبها قائمة بما تفقده: لا تعرف من فتح الملف، ولا تستطيع سحب نسخة، وكل موظف يرى كل الأقسام، وكلمة مرور الملف تفتح كل شيء، ولا تعرف أي صف هو الأحدث، والمغادر يحمل نسخته
كل نسخة من ملف كلمات المرور تبقى بعد أن تغير الأصل، ولا يوجد زر يسحبها

وفي الصورة أعلاه لاحظ التالي:

  • لا يوجد سجل: لا تعرف من فتح الملف ومتى، ولا من نسخ صف حساب البنك، بينما يسجل مدير كلمات المرور Password Manager كل عرض لكلمة مرور مشتركة.
  • لا يوجد سحب للوصول: عندما يغادر موظف لا تستطيع أن تأخذ منه نسخته، والطريق الوحيد هو تغيير كل كلمة مرور كانت في الملف.
  • لا توجد صلاحيات: من يفتح الملف يرى كل الأوراق، فموظف التسويق الذي يحتاج حساب X يرى أيضاً حساب البنك.
  • كلمة مرور واحدة تفتح كل شيء: وغالباً هي كلمة مرور يعرفها الفريق كله ولم تتغير منذ سنوات.
  • لا توجد نسخة صحيحة واحدة: صفان لنفس النظام بكلمتي مرور مختلفتين، ولا تعرف أيهما يعمل إلا بالتجربة على النظام الحقيقي.
📌
في يونيو 2024 نشرت Mandiant تحقيقها في سرقة بيانات عملاء Snowflake، وذكرت أنها مع Snowflake أبلغتا نحو 165 مؤسسة يحتمل أنها تعرضت للاختراق، وأن المهاجم دخل بأسماء مستخدمين وكلمات مرور سرقتها برامج سرقة المعلومات Infostealer من أجهزة لا تتبع Snowflake، وأقدم إصابة رصدوها لبيانات دخول استخدمها المهاجم تعود إلى نوفمبر 2020، وأن 79.7% على الأقل من الحسابات المستخدمة كانت بياناتها مكشوفة من قبل. والأسباب الثلاثة التي ذكرها التقرير: الحسابات لم يكن عليها تحقق متعدد العوامل MFA، وكلمات المرور المسروقة بقيت صالحة لسنوات لأنها لم تتغير، ولم تكن هناك قائمة بالشبكات المسموح لها بالاتصال. والدرس هنا مباشر: كلمة المرور التي خرجت مرة لا تعود سرية، والحل ليس أن تخفيها أفضل وإنما أن تغيرها وأن تضع فوقها عاملاً ثانياً.

أربعة أنواع من الأسرار، ولكل نوع مكانه

الخطأ الشائع في أي مشروع لإدارة كلمات المرور هو أن تضع كل الأسرار في أداة واحدة، فتجد مفتاح API لخدمة الدفع بجانب كلمة مرور حساب الشركة على X، وكلمة مرور root على السيرفرات في المجموعة نفسها. والأسرار في الشركة أربعة أنواع، لكل نوع منها طريقة استخدام مختلفة ومكان مختلف، والصورة التالية تبين ذلك:

أربع بطاقات: حسابات الموظف الشخصية Personal Accounts مكانها الخزنة الشخصية في مدير كلمات المرور، والحسابات المشتركة للفريق Shared Accounts مكانها مجموعة Collection في خزنة الشركة، وأسرار الأنظمة Machine Secrets مكانها مدير الأسرار Secrets Manager، وحسابات المديرين Privileged Accounts مكانها أداة PAM مع وصول مؤقت وتسجيل للجلسات، وتحتها شريط يقول إن التطبيق الذي يدعم الدخول الموحد SSO لا يحتاج حساباً مشتركاً
كل نوع من الأسرار له مستخدم مختلف، ولذلك له مكان مختلف

والجدول التالي يفصل الأنواع الأربعة:

النوعمن يستخدمهمثالالمكان الصحيح
حسابات الموظف الشخصية Personal Accountsالموظف وحدهبريده، وحسابه في نظام الإجازات، وحسابه في بوابة التدريبالخزنة الشخصية Personal Vault في مدير كلمات المرور Password Manager، والأفضل أن تدخل هذه الأنظمة عبر SSO فلا توجد كلمة مرور أصلاً
الحسابات المشتركة Shared Accountsفريق كامل بحساب واحدحساب الشركة على X، وبوابة المورد، ولوحة مسجل النطاق، وكلمة مرور شبكة الضيوفمجموعة Collection في خزنة الشركة، لكل فريق مجموعته، مع سجل لمن عرض كل كلمة مرور
أسرار الأنظمة Machine Secretsتطبيق أو خط CI/CD، وليس إنساناًمفتاح API، وكلمة مرور قاعدة البيانات، وتوكن النشرمدير الأسرار Secrets Manager مثل OpenBao، ولا تنسخ إلى مدير كلمات المرور Password Manager ولا إلى الكود، وراجع اكتشاف الأسرار المسربة في الكود
حسابات المديرين Privileged Accountsمدير الأنظمة عند الحاجةroot على السيرفرات، وAdministrator في الدليل، وحساب الطوارئأداة الوصول المميز PAM مع صلاحية مؤقتة وتسجيل للجلسات، كما شرحنا في مقال IAM وPAM

وفي الجدول أعلاه لاحظ أن مدير كلمات المرور Password Manager هو المكان الصحيح لنوعين فقط، وهما ما يستخدمه إنسان: الحسابات الشخصية والحسابات المشتركة، وهذه السلسلة كلها عنهما. أما أسرار الأنظمة فيقرؤها التطبيق وقت التشغيل، ولذلك تحتاج أداة يسأل فيها التطبيق عن السر بهويته، وتغير السر تلقائياً، وهذا عمل مدير الأسرار وليس مدير كلمات المرور. وأما حسابات المديرين فقد تحفظ كلمة مرورها في الخزنة كنسخة أخيرة للطوارئ Break-glass، ولكن الاستخدام اليومي يجب أن يكون بصلاحية مؤقتة مسجلة، ويجدر الإشارة هنا إلى أن طريقة تخزين كلمات المرور داخل تطبيقك أنت (الهاش وArgon2id) موضوع آخر شرحناه في التشفير للمطورين.

قبل كل ذلك: هل يحتاج هذا الحساب كلمة مرور مشتركة أصلاً؟

أفضل كلمة مرور مشتركة هي التي لا توجد، فإذا كان التطبيق يدعم الدخول الموحد SSO عبر OIDC أو SAML فلا تنشئ فيه حساباً مشتركاً، وإنما يدخل كل موظف بحسابه، وتأخذ صلاحيته من مجموعته في مزود الهوية، وعندما يغادر تغلق حسابه في مكان واحد فيخرج من كل التطبيقات، كما في دليل تثبيت authentik ودليل إدارة الأدوار عبر التطبيقات. والحسابات المشتركة التي تبقى بعد ذلك هي التي لا تملك فيها خياراً، وأشهرها ما يلي:

  • حسابات المنصات الخارجية: حساب الشركة على منصات التواصل، وبوابات الموردين، والبوابات الحكومية التي تعطيك حساباً واحداً للمنشأة.
  • الأجهزة: الجدار الناري والسويتش والطابعة وكاميرات المراقبة، وكثير منها لا يدعم SSO أو يدعمه في الإصدارات المدفوعة فقط.
  • الحسابات المحلية للطوارئ: حساب المدير المحلي الذي تحتاجه عندما يتعطل مزود الهوية نفسه.
  • الأسرار التي ليست كلمات مرور: رموز الاسترداد Recovery Codes، ومفتاح Wi-Fi، ورمز PIN لجهاز.

ماذا تقول NIST اليوم عن كلمات المرور؟

أغلب سياسات كلمات المرور في الشركات ما زالت تطلب حرفاً كبيراً ورقماً ورمزاً، وتغييراً كل 90 يوماً، وهذه القواعد كانت في الإرشادات قبل سنوات ثم حذفت، والسبب أنها جعلت الناس يكتبون Password1! ثم Password2!. والمرجع الذي تعتمد عليه أغلب السياسات اليوم هو NIST SP 800-63B-4، وهي المراجعة الرابعة من إرشادات المصادقة، ونشرت في صيغتها النهائية في يوليو 2025 وحلت محل المراجعة السابقة. والجدول التالي يلخص ما تطلبه في القسم 3.1.1.2 من الأنظمة التي تتحقق من كلمات المرور، مع درجة كل قاعدة: SHALL تعني إلزامي، وSHOULD تعني موصى به:

البندالقاعدة القديمة الشائعةما تطلبه المراجعة الرابعة
الطول الأدنى8 أحرف15 حرفاً على الأقل لكلمة المرور التي تستخدم وحدها، و8 على الأقل إذا كانت جزءاً من تحقق متعدد العوامل (SHALL)
الطول الأقصى16 أو 20 حرفاًأن يسمح بـ 64 حرفاً على الأقل (SHOULD)، وأن تقبل المسافة وكل حروف ASCII المطبوعة وحروف Unicode
قواعد التركيب Composition Rulesحرف كبير ورقم ورمزلا تفرض أي قواعد تركيب (SHALL NOT)
التغيير الدوريكل 90 يوماًلا تطلب التغيير الدوري (SHALL NOT)، ولكن أجبر على التغيير عند وجود دليل على أن كلمة المرور كشفت (SHALL)
القائمة المحظورة Blocklistلا توجدقارن كلمة المرور الجديدة بقائمة كلمات المرور الشائعة والمتوقعة والمسربة (SHALL)
التلميح وأسئلة الأمان«اسم أول مدرسة؟»لا تحفظ تلميحاً يراه غير المسجل، ولا تطلب أسئلة أمان Security Questions (SHALL NOT)
مدير كلمات المرور Password Manager واللصقمنع اللصق في حقل كلمة المروراسمح بمديري كلمات المرور والتعبئة التلقائية Autofill (SHALL)، واسمح باللصق (SHOULD)
المحاولات الفاشلةقفل الحساب بعد 3 محاولاتحدد عدد المحاولات الفاشلة بآلية Rate Limiting (SHALL)
القطع Truncationيقارن أول 8 أحرف فقط في بعض الأنظمة القديمةتحقق من كلمة المرور كاملة دون قطع (SHALL)

وفي الجدول أعلاه لاحظ التالي:

  • هذه القواعد موجهة إلى النظام الذي يتحقق من كلمة المرور Verifier، أي إلى الأنظمة التي تبنيها أو تضبطها أنت، وليست نصيحة للمستخدم، ولكنها تحدد ما يجب أن تكتبه في سياستك وما يجب أن تضبطه في الدليل ومزود الهوية.
  • الطول هو العامل الأهم، ولذلك أصبح 15 حرفاً لكلمة المرور وحدها، وهذا مقبول للموظف فقط إذا استخدم عبارة مرور Passphrase من عدة كلمات أو ترك المدير يولد كلمة المرور.
  • بند مدير كلمات المرور Password Manager أصبح إلزامياً، فالنظام الذي يمنع التعبئة التلقائية يدفع الموظف إلى كلمة مرور قصيرة يحفظها، وهذا عكس المطلوب.
  • القائمة المحظورة هي التي تمنع كلمات مثل password1 وqwerty123، وسوف نستخدم قائمة من هذا النوع في التجربة العملية أدناه.

ماذا يفعل الموظف بكلمات مروره؟

من جهة الموظف القاعدة بسيطة: كلمة مرور واحدة قوية يحفظها في رأسه، وهي كلمة المرور الرئيسية Master Password لمدير كلمات المرور، وكل ما عداها يولده المدير ويحفظه. وقد شرحنا في برنامج التوعية بالأمن السيبراني كيف تعلم الموظفين ذلك وتقيس أثره، والقائمة التالية هي ما تطلبه منهم عملياً:

  • عبارة مرور طويلة للخزنة Vault: أربع أو خمس كلمات عشوائية لا تجمعها جملة معروفة، ولا تستخدمها في أي مكان آخر، لأنها المفتاح الذي يفك كل ما في الخزنة، ولا يستطيع أحد استعادتها إذا نسيها.
  • المولد لكل حساب: كلمة مرور مختلفة لكل نظام يولدها المدير، فإذا تسربت واحدة لا تفتح الباقي.
  • التحقق الثنائي على الخزنة أولاً: ثم على البريد والحسابات المهمة، ومفاتيح المرور Passkeys حيث تتوفر، كما في مقال Passkeys.
  • لا يرسل كلمة مرور في محادثة: الحساب المشترك يصل إليه من مجموعة فريقه في الخزنة Vault، وإذا احتاج زميل وصولاً فيطلبه من مدير المجموعة.
  • حسابات العمل في خزنة العمل: وليس في المتصفح الشخصي ولا في الخزنة العائلية، والسبب أن الشركة لا تستطيع أن تسحبها من هناك عندما يغادر.
  • يبلغ ولا يخفي: إذا كتب كلمة مرور في صفحة مشبوهة أو أرسلها بالخطأ، فيبلغ فوراً حتى تتغير، والتغيير بعد البلاغ أرخص بكثير من التحقيق بعد الاختراق.

العملية: من ملف Excel إلى خزنة في تسع خطوات

شراء الأداة أو تثبيتها هو الجزء الأسهل، والجزء الأصعب هو نقل ما في الملفات القديمة وإغلاقها. والصورة التالية تبين الخطوات التسع بالترتيب:

تسع بطاقات مرقمة: الجرد Inventory، والتصنيف Classify، واختيار الأداة، والترحيل Import، والتغيير Rotate، والصلاحيات Collections، والطوارئ Break-glass، والمغادرة Offboarding، والمراجعة Audit، ثم العودة إلى الجرد كل ربع سنة
الخطوة الخامسة، تغيير كل كلمة مرور كانت في الملف، هي التي يتخطاها أغلب الفرق
  1. الجرد Inventory: ابحث في المجلدات المشتركة والبريد ومواقع الملفات عن كل ملف فيه كلمات مرور، واسأل كل قسم مباشرة «ما الحسابات التي يعرف كلمة مرورها شخص واحد فقط؟»، وسوف نبني أداة صغيرة لهذه الخطوة في التجربة العملية.
  2. التصنيف Classify: ضع كل صف في واحد من الأنواع الأربعة أعلاه، فأسرار الأنظمة تذهب إلى مدير الأسرار، وحسابات المديرين إلى خطة PAM، وما يدعم SSO تنقله إلى SSO وتحذف حسابه المشترك.
  3. اختيار الأداة: مدير كلمات مرور Password Manager يدعم المجموعات والصلاحيات وسجل الأحداث والوصول الطارئ، وقد قارنا الخيارات في Bitwarden أم Vaultwarden أم Passbolt.
  4. الترحيل Import: حول الملف إلى صيغة CSV التي تفهمها الأداة واستورده، ثم احذف الملف الأصلي ونسخه من المجلد المشترك ومن البريد، وقد طبقنا ذلك على ملف Excel حقيقي الشكل في دليل Vaultwarden.
  5. التغيير Rotate: كل كلمة مرور كانت في ملف يجب أن تتغير بعد الترحيل، والسبب أن الملف القديم ما زال في النسخ الاحتياطية وعلى لابتوب من غادر، فالترحيل وحده ينقل الأسرار المكشوفة إلى مكان جديد ولا يجعلها سرية، وابدأ بالحسابات الأخطر: البنك والنطاق والبريد والجدار الناري.
  6. الصلاحيات: مجموعة Collection لكل فريق، ومجموعة مستخدمين Group لكل فريق، وأقل صلاحية تكفي، فمن يحتاج أن يستخدم كلمة المرور لا يحتاج أن يعدلها أو يحذفها.
  7. الطوارئ Break-glass: مالكان للخزنة Vault على الأقل حتى لا تضيع إذا غاب أحدهما، ووصول طارئ Emergency Access للحسابات الحرجة، وحساب طوارئ محلي لكل نظام مهم محفوظ في الخزنة ومراقب، وتجربة فعلية للوصول الطارئ قبل أن تحتاجه.
  8. المغادرة Offboarding: عندما يغادر موظف تسحب وصوله إلى الخزنة Vault، ثم تغير كلمات مرور الحسابات المشتركة التي كان يراها، والخزنة تعطيك قائمتها من مجموعاته، وهذه الخطوة جزء من دورة حياة الحساب في مقال JML.
  9. المراجعة Audit: كل ربع سنة راجع أعضاء كل مجموعة، وسجل الأحداث، وتقرير كلمات المرور الضعيفة والمكررة، ثم عد إلى الجرد، لأن ملفات Excel جديدة سوف تظهر.

تجربة عملية: جرد الملفات التي تحمل كلمات مرور

الآن سوف نطبق الخطوة الأولى على مجلد مشترك صغير صنعناه للتجربة، فيه ملفات Excel وCSV وملف نصي، بعضها فيه كلمات مرور وبعضها لا، وملف Excel محمي بكلمة مرور. وكل الأسماء والعناوين وكلمات المرور فيه مصطنعة. والسكربت يبحث في كل ملف عن عمود عنوانه يشبه «Password» أو «كلمة المرور»، أو عن سطر مثل password: … في الملفات النصية، ثم يفحص كل كلمة مرور يجدها بقاعدتين من NIST: الطول الأدنى 15 لكلمة المرور التي تستخدم وحدها، والقائمة المحظورة. والقائمة المحظورة هنا قائمة أشهر 10,000 كلمة مرور من مشروع SecLists بترخيص MIT، وثبتنا الملف على commit محدد حتى تتكرر النتيجة.

الملف التالي هو السكربت الذي يصنع المجلد:

lab/make_share.py: يصنع مجلداً مشتركاً مصطنعاً من سبعة ملفات
# Builds a made-up department share under ./share: the kind of files a password inventory finds.
# Every name, host and password here is invented for the lab.
import csv, io, os, shutil
import msoffcrypto
from openpyxl import Workbook

shutil.rmtree("share", ignore_errors=True)
for d in ["IT/old", "Finance", "Marketing", "HR"]:
    os.makedirs(f"share/{d}", exist_ok=True)

def xlsx(path, title, rows, header):
    wb = Workbook(); ws = wb.active; ws.title = title
    ws.append(header)
    for r in rows: ws.append(r)
    wb.save(path)

xlsx("share/IT/servers.xlsx", "Servers",
     [["Proxmox", "https://pve.lab.test:8006", "root@pam", "Pve-Lab-77"],
      ["TrueNAS", "https://nas.lab.test", "admin", "admin123"]],
     ["System", "URL", "User", "Password"])
xlsx("share/IT/old/servers-2022.xlsx", "Servers",
     [["TrueNAS", "https://nas.lab.test", "admin", "password1"]],
     ["System", "URL", "User", "Password"])
xlsx("share/Finance/bank.xlsx", "حسابات",
     [["البنك", "LABCO001", "Bank-Lab#5521"], ["نظام الرواتب", "[email protected]", "Payroll2025"]],
     ["النظام", "اسم المستخدم", "كلمة المرور"])
xlsx("share/HR/staff.xlsx", "Staff",
     [["Nora", "Finance"], ["Omar", "Marketing"]],
     ["Name", "Department"])
with open("share/Marketing/social.csv", "w", newline="", encoding="utf-8") as f:
    csv.writer(f).writerows([["Account", "Username", "Password"],
                             ["X", "@labco", "Labco-Social-1"], ["Ads", "[email protected]", "qwerty123"]])
with open("share/IT/meeting-notes.txt", "w", encoding="utf-8") as f:
    f.write("اجتماع الاثنين\n- تجديد عقد الصيانة\n- wifi password: Welcome2024\n")

# The same finance sheet, protected with an Excel "open" password
plain = io.BytesIO(open("share/Finance/bank.xlsx", "rb").read())
office = msoffcrypto.OfficeFile(plain)
with open("share/Finance/bank-protected.xlsx", "wb") as out:
    office.encrypt("Finance2024", out)
print("share/ created:", sum(len(f) for _, _, f in os.walk("share")), "files")

والملف التالي هو سكربت الجرد نفسه:

# Inventory step: finds files in a share that hold passwords, and checks each password against
# the NIST SP 800-63B-4 rules a verifier applies (length and a blocklist of common passwords).
import csv, os, re, sys
import msoffcrypto
from openpyxl import load_workbook

ROOT, BLOCKLIST = sys.argv[1], sys.argv[2]
blocked = {l.strip().lower() for l in open(BLOCKLIST, encoding="utf-8", errors="ignore") if l.strip()}
HEAD = re.compile(r"pass(word)?|pwd|كلمة\s*(المرور|السر)|الباسورد", re.I)
INLINE = re.compile(r"(?:pass(?:word)?|pwd|كلمة المرور)\s*[:=]\s*(\S+)", re.I)

def table_passwords(rows):
    rows = [r for r in rows if r and any(c is not None for c in r)]
    if not rows: return None
    cols = [i for i, c in enumerate(rows[0]) if c and HEAD.search(str(c))]
    if not cols: return None
    return [str(r[i]) for r in rows[1:] for i in cols if i < len(r) and r[i] not in (None, "")]

def verdict(pw):
    notes = []
    if len(pw) < 15: notes.append(f"{len(pw)} chars (< 15 for a password used alone)")
    if pw.lower() in blocked: notes.append("in blocklist")
    return "; ".join(notes) or "ok by length and blocklist"

found = 0
for dirpath, _, files in os.walk(ROOT):
    for name in sorted(files):
        path = os.path.join(dirpath, name); rel = os.path.relpath(path, ROOT)
        pws = None
        try:
            if name.endswith(".xlsx"):
                if msoffcrypto.OfficeFile(open(path, "rb")).is_encrypted():
                    print(f"[LOCKED]  {rel}: encrypted workbook, cannot read it, ask its owner"); found += 1; continue
                wb = load_workbook(path, read_only=True, data_only=True)
                pws = [p for ws in wb.worksheets for p in (table_passwords(list(ws.iter_rows(values_only=True))) or [])] or None
            elif name.endswith(".csv"):
                pws = table_passwords(list(csv.reader(open(path, encoding="utf-8"))))
            elif name.endswith(".txt"):
                pws = INLINE.findall(open(path, encoding="utf-8").read()) or None
        except Exception as e:
            print(f"[ERROR]   {rel}: {type(e).__name__}"); continue
        if pws:
            found += 1
            print(f"[SECRETS] {rel}: {len(pws)} password(s)")
            for p in pws:
                print(f"            {p[:2]}{'*' * (len(p) - 2)}  {verdict(p)}")
print(f"{found} file(s) to migrate and delete")

وفي السكربت أعلاه لاحظ التالي:

  • السكربت لا يطبع أي كلمة مرور كاملة، وإنما أول حرفين ثم نجوم، لأن تقرير الجرد نفسه سوف يرسل إلى رؤساء الأقسام، ولا تريد أن يصبح نسخة جديدة من الملف.
  • الملف المحمي بكلمة مرور لا يستطيع السكربت قراءته، ولذلك يضعه في قائمة مستقلة بدلاً من أن يتجاهله.
  • القاعدة «أقل من 15» تخص كلمة المرور التي تستخدم وحدها، والحسابات المشتركة في هذه الملفات غالباً كذلك، لأن أغلبها بلا تحقق ثنائي.

نشغل السكربتين في Container من Python، ونثبت المكتبتين داخله، وننزل القائمة المحظورة من commit محدد:

docker run --rm --name lab-pw-scan -v "$(pwd)/lab:/lab" -w /tmp python:3.13.16-slim sh -c "
  pip install --quiet --root-user-action=ignore --disable-pip-version-check openpyxl==3.1.5 msoffcrypto-tool==6.0.0 &&
  python -c 'import urllib.request;urllib.request.urlretrieve(\"https://raw.githubusercontent.com/danielmiessler/SecLists/913b327317496d062bcc7cace524aaad8a693be2/Passwords/Common-Credentials/10k-most-common.txt\",\"/tmp/blocklist.txt\")' &&
  wc -l /tmp/blocklist.txt &&
  python /lab/make_share.py &&
  python /lab/scan_share.py share /tmp/blocklist.txt"

والمخرج سوف يكون كما يلي:

10001 /tmp/blocklist.txt
share/ created: 7 files
[SECRETS] Marketing/social.csv: 2 password(s)
            La************  14 chars (< 15 for a password used alone)
            qw*******  9 chars (< 15 for a password used alone); in blocklist
[LOCKED]  Finance/bank-protected.xlsx: encrypted workbook, cannot read it, ask its owner
[SECRETS] Finance/bank.xlsx: 2 password(s)
            Ba***********  13 chars (< 15 for a password used alone)
            Pa*********  11 chars (< 15 for a password used alone)
[SECRETS] IT/meeting-notes.txt: 1 password(s)
            We*********  11 chars (< 15 for a password used alone)
[SECRETS] IT/servers.xlsx: 2 password(s)
            Pv********  10 chars (< 15 for a password used alone)
            ad******  8 chars (< 15 for a password used alone)
[SECRETS] IT/old/servers-2022.xlsx: 1 password(s)
            pa*******  9 chars (< 15 for a password used alone); in blocklist
6 file(s) to migrate and delete

وفي المخرج أعلاه لاحظ التالي:

  • ستة ملفات من سبعة تحمل أسراراً، والملف الوحيد الذي لا يظهر هو HR/staff.xlsx لأنه بلا عمود كلمات مرور، وهذا ما نتوقعه.
  • الملف القديم IT/old/servers-2022.xlsx ما زال موجوداً بكلمة مرور من القائمة المحظورة، وهذا هو الملف الذي ينساه الجميع لأن أحداً لا يفتحه، ولكن أي شخص يصل إلى المجلد يقرؤه.
  • كلمة المرور admin123 في IT/servers.xlsx لم تظهر في القائمة المحظورة، مع أنها من أضعف كلمات المرور، لأن القائمة التي استخدمناها هي أشهر 10,000 فقط، ولذلك القائمة المحظورة طبقة واحدة وليست الحكم النهائي، والطول وحده أسقطها هنا.
  • كل كلمات المرور التي وجدها السكربت أقصر من 15 حرفاً، وهذا طبيعي في ملفات كتبها الناس بأيديهم، وهو سبب إضافي للخطوة الخامسة: بعد الترحيل يولد المدير كلمة مرور جديدة طويلة لكل حساب.
  • كلمة المرور في محضر الاجتماع ظهرت لأنها مكتوبة بصيغة password: …، ولو كتبها الموظف بصيغة أخرى لما وجدها السكربت، كما سوف نرى الآن.

كسر التجربة: ما لا يراه السكربت

داخل Container التجربة نفسه، نضيف إلى قسم التسويق ملفاً جديداً فيه كلمة مرور حقيقية الشكل، ولكن عنوان العمود «رمز الدخول» بدلاً من «كلمة المرور»، ثم نشغل الجرد مرة أخرى ونعد كم مرة يظهر اسم الملف الجديد في المخرج:

python - <<'PY'
from openpyxl import Workbook
wb = Workbook(); ws = wb.active
ws.append(['الحساب', 'المستخدم', 'رمز الدخول'])
ws.append(['لوحة الإعلانات', '[email protected]', 'Ads!2025-lab'])
wb.save('share/Marketing/accounts.xlsx')
PY
python /lab/scan_share.py share /tmp/blocklist.txt | grep -c accounts.xlsx
python /lab/scan_share.py share /tmp/blocklist.txt | tail -1

والمخرج سوف يكون كما يلي:

0
6 file(s) to migrate and delete

الملف الجديد لم يظهر، والعدد بقي ستة، مع أن فيه كلمة مرور. والسبب أن السكربت يبحث عن كلمات محددة في عنوان العمود، والناس تكتب «رمز الدخول» و«الرقم السري» و«PIN» و«Secret» وأسماء لا تتوقعها، وتضع كلمات المرور في صور للشاشة ورسائل محادثة لا يقرؤها أي سكربت. ولذلك لا تعتمد على البحث الآلي وحده في الجرد، وإنما استخدمه لتجد أكبر عدد من الملفات بسرعة، ثم اسأل كل قسم سؤالاً مباشراً، واطلب من رئيس القسم أن يوقع أن قسمه لم يعد يملك ملفات كلمات مرور خارج الخزنة Vault.

⚠️
لا تشغل سكربت جرد على مجلدات الشركة دون إذن مكتوب من صاحب الصلاحية، فالسكربت يقرأ ملفات الأقسام كلها، وتقريره نفسه يحمل أسماء الأنظمة الحساسة، فاحفظه في مكان محمي واحذفه بعد انتهاء الترحيل.

سياسة كلمات المرور في صفحة واحدة

السياسة الطويلة لا يقرؤها أحد، والجدول التالي مثال لسياسة قصيرة تبني على ما سبق، عدل أرقامه بما يناسب شركتك:

البندالقاعدة
الأداةكل كلمة مرور لحساب عمل تحفظ في مدير كلمات المرور Password Manager المعتمد، ولا تحفظ في ملفات أو متصفح شخصي أو محادثات
الدخول الموحدكل تطبيق يدعم SSO يدخل إليه الموظفون عبر SSO، ولا تنشأ فيه حسابات مشتركة
كلمة المرور الرئيسيةعبارة مرور من 15 حرفاً على الأقل لا تستخدم في أي مكان آخر، مع تحقق ثنائي على الخزنة Vault
كلمات المرور الأخرىيولدها المدير، ولا توجد قواعد تركيب، ولا تغيير دوري إلا عند الاشتباه في تسريبها
الحسابات المشتركةفي مجموعة الفريق فقط، ولكل مجموعة مسؤول، وتغير كلمة المرور عند مغادرة أي عضو كان يراها
الطوارئمالكان للخزنة Vault على الأقل، ووصول طارئ مختبر مرة في السنة
المراجعةمراجعة أعضاء المجموعات وسجل الأحداث كل ربع سنة
البلاغأي اشتباه في كشف كلمة مرور يبلغ عنه فوراً، دون عقوبة على البلاغ

أخطاء شائعة

  • الترحيل دون تغيير: تنقل الملف إلى الخزنة وتعتبر المهمة منتهية، والملف القديم ما زال في النسخ الاحتياطية وعلى أجهزة من غادر.
  • مالك واحد للخزنة Vault: إذا غاب أو غادر أو نسي كلمة مروره الرئيسية تضيع حسابات الشركة كلها معه.
  • مجموعة واحدة للجميع: تنقل مشكلة ملف Excel كما هي إلى الأداة الجديدة، فكل موظف يرى كل شيء.
  • مفاتيح API في مدير كلمات المرور Password Manager: التطبيق يحتاجها وقت التشغيل، فينسخها أحدهم من الخزنة Vault إلى ملف إعداد أو إلى الكود، وهذا عمل مدير الأسرار.
  • إجبار التغيير كل 90 يوماً: يخالف NIST ويجعل الناس تضيف رقماً في آخر كلمة المرور نفسها.
  • منع اللصق في نماذج الدخول: يكسر مدير كلمات المرور Password Manager ويدفع الموظف إلى كلمة مرور قصيرة يكتبها بيده.
  • تجاهل الحسابات التي في رأس شخص واحد: البنك والنطاق ومنصات التواصل التي أنشأها المؤسس قبل سنوات، وهي أخطر ما في الجرد.

الخلاصة

وصلنا لنهاية الموضوع، وأهم ما فيه:

  • ملف Excel لا يصلح لكلمات المرور حتى لو حميته، لأن نسخه لا تسحب، ولا يوجد سجل لمن فتحه، ولا صلاحيات داخله.
  • الأسرار أربعة أنواع: مدير كلمات المرور Password Manager للحسابات الشخصية والمشتركة، ومدير الأسرار لأسرار الأنظمة، وPAM لحسابات المديرين، وقبل كل ذلك SSO حيث يمكن.
  • المراجعة الرابعة من NIST SP 800-63B تطلب 15 حرفاً لكلمة المرور التي تستخدم وحدها، وقائمة محظورة، والسماح بمديري كلمات المرور، وتمنع قواعد التركيب والتغيير الدوري.
  • العملية تسع خطوات، وأهمها الجرد في البداية وتغيير كل ما كان في الملفات بعد الترحيل.
  • البحث الآلي يجد أغلب الملفات بسرعة ولكنه لا يجدها كلها، فاجمعه مع سؤال مباشر لكل قسم.

وفي المقال القادم بإذن الله نقارن الأدوات التي تحمل هذه الخطوات: Bitwarden وVaultwarden وPassbolt وKeePassXC والخدمات السحابية، ثم نثبت Vaultwarden ونرحل إليه ملف Excel كاملاً.

دليلBitwarden أم Vaultwarden أم Passbolt؟ مدير كلمات مرور لفريقكمقارنة بين مديري كلمات المرور للفرق في طريقة المشاركة والترخيص والسعر والمزايا، ودليل يساعدك على اختيار الأنسب لشركتك.دليلVaultwarden: مدير كلمات مرور للفريق على سيرفرككيف تثبت Vaultwarden بأمان وتنقل إليه كلمات مرور فريقك من ملف Excel، ثم تتأكد أن نسخته الاحتياطية تستعاد فعلاً.دليلإدارة الهوية والوصول IAM والوصول المميز PAMمن يملك صلاحية root على سيرفراتك ومنذ متى، وكيف تضبط حسابات المديرين بصلاحيات مؤقتة وجلسات مسجلة.دليلالدخول دون كلمة مرور: شرح Passkeys وWebAuthnلماذا لا تحميك رموز SMS وTOTP من التصيد الحديث، وكيف تحل Passkeys المشكلة بمفتاح خاص لا يغادر جهازك.دليلدورة حياة حساب الموظف JML من أول يوم إلى آخر يومكيف تجعل الموارد البشرية مصدر كل حساب، فيجد الموظف ما يحتاجه في يومه الأول وتغلق كل أبوابه في يوم مغادرته.دليلبرنامج التوعية بالأمن السيبراني بأدوات مفتوحة المصدرالمحاضرة السنوية لا تغير ما يفعله الموظف أمام الرسالة المشبوهة، لذلك تبني هنا برنامج توعية مستمراً وتقيس أثره بأدوات مفتوحة المصدر.

سجل التحديثات

  • أكتوبر 2026: كتابة المقال، وقراءة قواعد كلمات المرور من NIST SP 800-63B-4 (النسخة النهائية) وتقرير Mandiant عن حملة UNC5537 كما كانت في 14 أكتوبر 2026، وتشغيل تجربة الجرد في 15 أكتوبر 2026 على Docker Engine 29.8.0 مع Python 3.13.16 وopenpyxl 3.1.5 وmsoffcrypto-tool 6.0.0، وقائمة SecLists من commit 913b327.
نشرة عرب رووت | ArabRoot

معرفة تستحق مكاناً في بريدك.

مقالات مختارة وأدوات مفيدة وأفكار لمشروعك القادم، في رسالة واحدة كل أسبوع.

يمكنك إلغاء الاشتراك متى شئت. الخصوصية

تم استلام طلبك. افتح بريدك واضغط رابط التأكيد لإتمام الاشتراك.