مشاريع DevSecOps

Infrastructure as Code

منصة k3s على Azure

منصة Kubernetes صغيرة بمستوى الإنتاج على Azure، مبنية بالكود فقط: Terraform يُنشئ أجزاء السحابة، وAnsible يقوّي الخوادم ويثبّت k3s، وpipeline تطبّق كل تغيير بعد المراجعة، بلا أسرار مخزّنة.

  • Terraform
  • Azure
  • Ansible
  • k3s
  • Helm
  • Prometheus
  • Grafana
  • Loki
  • Fluent Bit
  • cert-manager
  • Key Vault
  • GitHub Actions
  • OIDC

نظرة سريعة

3
أجهزة افتراضية بأمر واحد
0
أسرار في الـ pipeline (OIDC)
2
مراجعتان قبل أي تغيير: الخطة والموافقة
1
أمر واحد لحذف كل شيء

الهدف

الخوادم المبنية يدويًا تختلف مع الوقت، ولا أحد يعرف من غيّر ماذا، وإعادة بناء جهاز مفقود تأخذ يومًا. الهدف: منصة تكون فيها البيئة كلها كودًا، ويُراجَع كل تغيير كخطة قبل تنفيذه، وتُقوّى الخوادم بالطريقة نفسها كل مرة، وتبقى التكلفة تحت السيطرة.

ماذا يُظهر المشروع

البنية ككود
Terraform (azurerm 4) بوحدتين (الشبكة والعقدة) وحالة بعيدة في Azure Storage بتسجيل دخول Entra ID.
الشبكة
VNet وNSG ترفض كل شيء افتراضيًا، وبوابة NAT للخروج، وStandard Load Balancer للمنفذين 80/443، والدخول الإداري من عنوانك فقط.
الهوية والأسرار
GitHub OIDC (بلا client secret)، وهويات مُدارة على الأجهزة، ورمز انضمام k3s داخل Key Vault.
التقوية
SSH وsysctl وauditd وfail2ban والتحديثات التلقائية؛ وتشفير أسرار k3s وPod Security وسجل التدقيق وشبكة pods مشفّرة.
المراقبة
Prometheus وAlertmanager وGrafana وLoki وFluent Bit مع قواعد تنبيه خاصة، وAzure Monitor لسجلات النظام.
التحكم في التكلفة
ميزانية مع تنبيه توقّع، وأحجام أجهزة صغيرة، وحد للسجلات، وأمر واحد لحذف كل شيء.

البنية

بيئة Azure. موازن الحمل وحده مفتوح للمواقع؛ وSSH وواجهة Kubernetes لا تجيبان إلا عنوان المدير.

The Azure k3s platform: network, nodes, cluster, Key Vault, monitoring and the pipelineAzure — resource group (Terraform)VNet 10.40.0.0/16 · NSG: deny by defaultAdmin laptopadmin_cidrs onlyGitHub ActionsOIDC loginno stored secretUserswebsitesInternetupdates, imagesk3s servercontrol plane · tainted10.40.1.10 · public IPk3s agent 110.40.1.20no public IPk3s agent 210.40.1.21no public IPIn the cluster· Traefik ingress· cert-manager· Prometheus· Alertmanager· Grafana· Loki + Fluent Bit· WireGuard pod network· your appsKey Vaultk3s join token (RBAC)Log Analyticssyslog via Azure Monitor AgentStandard Load Balancer80 / 443 → agentsNAT gatewayall outbound trafficBudget alertforecast at 80 %Storage account: Terraform stateEntra ID login · versioningSSH 22 · API 644380/443ingressoutidentitylogsplan / apply

خطوة بخطوة

  1. Pull request

    terraform fmt وvalidate وtflint وفحص IaC بـ Trivy. ثم تسجّل الـ pipeline الدخول إلى Azure بـ OIDC وتكتب الخطة كتعليق في الـ pull request.

  2. المراجعة

    يقرأ شخص الخطة: ما الذي سيُنشأ أو يتغيّر أو يُحذف. لم يتغيّر شيء في Azure بعد.

  3. التطبيق

    بعد الدمج ينتظر التطبيق موافقة على البيئة production. ثم يبني Terraform الخطة المُراجَعة بالضبط.

  4. الإعداد

    يقوّي Ansible خوادم Ubuntu الثلاثة، ويثبّت k3s مع التشفير وسجل التدقيق، ويضيف مكوّنات المنصة.

  5. كل ليلة

    فحص انحراف يشغّل terraform plan. إذا اختلف Azure عن الكود، يفتح issue.

دليل من تشغيل حقيقي

تشغيل على الفرع main بتاريخ 2026-10-27، من GitHub Actions. مدة كل مهمة:

  • fmt, validate, tflint, Trivy 23s
  • ansible-lint (production profile) 22s

افتح هذا التشغيل (opens in a new tab)

ضوابط الأمان

الضابطماذا يمنع
NSG ترفض افتراضيًا + admin_cidrsفتح SSH وواجهة Kubernetes للإنترنت.
لا عنوان عامًا على العقد العاملةالهجوم المباشر على العقد العاملة.
GitHub OIDCسر سحابي طويل العمر قد يتسرّب من CI.
Key Vault + هوية مُدارةرمز انضمام العنقود في ملفات أو في Git.
مراجعة الخطة + الموافقةحذف مفاجئ في الإنتاج.
tflint + فحص IaC بـ Trivyإعدادات خاطئة أو غير آمنة قبل وصولها إلى Azure.
فحص الانحراف الليليتغييرات يدوية لا يعرف عنها أحد.
تنبيه الميزانيةمعمل منسي يكلّف مالًا كل يوم.

جرّبه بنفسك

az login && make bootstrap      # once: state storage + GitHub OIDC app
cp terraform/terraform.tfvars.example terraform/terraform.tfvars   # your IP and SSH key
make init plan apply            # VNet, NSG, NAT, load balancer, 3 VMs, Key Vault, monitoring
make configure                  # Ansible: hardening, k3s, platform charts
make kubeconfig && KUBECONFIG=./kubeconfig kubectl get nodes
make destroy                    # after the demo: everything is gone

ماذا تعلّمت

  • الخطة الواضحة في الـ pull request هي أفضل أداة مراجعة: يقرأ الناس ما سيتغيّر، لا الكود.
  • الإعدادات الآمنة مكانها الكود: منافذ الويب تبقى مغلقة حتى تفتحها عن قصد.
  • المنصة التي يمكن حذفها وإعادة بنائها في دقائق أرخص وأأمن من منصة تخاف أن تلمسها.
دراسة الحالة التالية Pipeline تسليم آمنة