المستوى المطلوب: متوسط — يفترض إنك تعرف Python أساسي، GitHub Actions، وعندك فكرة عامة عن DNS records (A, MX, NS, CNAME).
أتمتة DNS Drift Detection بـ Python + GitHub Actions
لو حد عدّل A record لدومين شركتك الساعة 3 الصبح وأشار الـ IP لسيرفر مش بتاعك، الموقع ممكن يفضل بيخدم نسخة مزوّرة 6 ساعات قبل ما حد يلاحظ. السكربت اللي هتشوفه هنا بيكشف أي تغيير في DNS records خلال 5 دقايق من حصوله، وبيتكلف صفر دولار شهرياً على GitHub Actions free tier.
المشكلة باختصار
DNS Drift معناه إن records الدومين بتاعك اتغيّرت بدون علم الفريق، ولا حد لاحظ. ده ممكن يحصل من 3 مصادر شائعة:
- زميل غيّر record في Cloudflare panel وما اتذكرش يبلّغ الفريق على Slack.
- سكربت Terraform قديم اشتغل بالغلط ورجّع الـ DNS لحالة قديمة (drift من الـ source of truth).
- هاكر دخل على حساب الـ DNS provider واستولى على نطاق فرعي عبر Subdomain Takeover (راجع مصدر OWASP في الأسفل).
التأثير الفعلي بيتراوح بين انقطاع جزئي للموقع، لحد سرقة كاملة لاتصالات الإيميل لو الـ MX records اتغيّرت. الكارثة الأكبر إن غياب الأتمتة هنا معناه الاكتشاف من شكوى عميل، مش من نظامك.
المفهوم الأساسي: ليه DNS Drift صعب يتلاحظ بدون أتمتة
تعالى نشرحه بمثال بسيط الأول. تخيّل إن DNS زي دفتر تليفونات في عمارة. لو الواحد بيسأل البواب "شقة 7B رقمها كام؟"، البواب بيقول 5550100 ويفضل القاطنين في العمارة عارفين الرقم. لو فيه حد دخل وعدّل الدفتر لـ 5559999، الناس اللي عندهم الرقم القديم محفوظ في موبايلهم هيفضلوا يتصلوا بالقديم لحد ما يعدّلوا. الناس الجداد بس هيشوفوا الجديد. ده بالظبط اللي بيحصل في DNS resolver caching.
دلوقتي بشكل علمي ودقيق: لما طلب يوصل لدومين زي api.example.com، الـ DNS resolver المحلي (عند الـ ISP بتاعك أو 8.8.8.8) بيسأل root nameservers، بعدين TLD nameservers (.com)، وأخيرًا الـ authoritative nameserver للدومين نفسه. النتيجة بتتخزّن في cache لمدة TTL (Time To Live)، وبتتراوح بين 60 ثانية لـ 24 ساعة. لو الـ authoritative records اتغيّرت في النص، الـ resolvers اللي عندهم cache قديم مش هيعرفوا إلا بعد انتهاء الـ TTL — وده بالظبط النافذة اللي المهاجم بيستغلها.
المشكلة باختصار: لو ما عندكش snapshot معتمد للحالة الصحيحة للـ records، مفيش طريقة عملية تكتشف بيها التغيير غير إنك تنتظر شكوى. الحل: تعمل snapshot تلقائي وتقارنه كل 5 دقايق.
الحل في 3 خطوات: snapshot ثم مقارنة ثم تنبيه
الفكرة بسيطة، لكن فيها تفصيلة مهمة. بدل ما تسأل الـ resolver المحلي (اللي بيرجّعلك نتيجة الـ cache)، هتسأل الـ authoritative nameserver مباشرة. كده بتتجنب false negatives سببها cache قديم.
- اعمل query للـ authoritative DNS records للدومينات بتاعتك مباشرة، تجاوزًا للـ resolver cache.
- قارن النتيجة بـ snapshot محفوظ سابقًا في ملف JSON داخل Git.
- لو في فرق، ابعت تنبيه Slack، وحدّث الـ snapshot يدوياً بعد مراجعة بشرية بس.