
جسر SSH حصين بنموذج الثقة المعدومة (Zero-trust) مع إدارة مفاتيح مدعومة من Vault، وفرض سياسات RBAC، وتسجيل كامل للجلسات، وواجهة TUI إدارية للوصول القابل للتدقيق إلى البنية التحتية للإنتاج.
مضيف حصن SSH ذاتي الاستضافة ومُحصّن مع إدارة مفاتيح مدعومة بـ Vault، وفرض سياسات RBAC، وتسجيل كامل للجلسات، وواجهة إدارة تفاعلية TUI — مصمم للفرق التي تحتاج وصولاً قابلاً للتدقيق وقائماً على مبدأ الثقة الصفرية إلى البنية التحتية للإنتاج.
تحتاج فرق الهندسة الحديثة إلى طريقة تمنح المطورين الحد الأدنى من الوصول المطلوب لأداء مهامهم — لا أكثر ولا أقل. توزيع مفاتيح SSH التقليدي عرضة للأخطاء: تتم مشاركة المفاتيح، وتُنسى على أجهزة الكمبيوتر المحمولة، ويتم إبطالها بعد فوات الأوان.
يحل ZTTP هذه المشكلة من خلال العمل كـالباب الوحيد إلى بنيتك التحتية:
Developer Laptop
│
│ zttp
│ (Under the hood: SSH over port 2224)
▼
┌─────────────────────────────────────────────────────────┐
│ ZTTP Proxy │
│ │
│ ① Auth Gate — bcrypt/Argon2id login TUI │
│ ② RBAC Engine — environment-aware policy check │
│ ③ Vault Fetch — ephemeral SSH key retrieval │
│ ④ Bridge — transparent TCP tunnel │
│ ⑤ Audit Writer — ttyrec frame recorder │
└──────────┬──────────────────────────────────────────────┘
│ ssh (private IP, ephemeral key)
▼
Target Server
خدمات البنية التحتية (Docker Compose):
.ttyrec مع إطارات زمنيةالخادم (مضيف الوكيل):
2224make (اختياري، لكن موصى به)المطور (العميل):
ssh)git clone https://gitlab.com/Nihal799/zttp.git
cd zttp
cp .env.example .env
قم بتحرير .env واضبط على الأقل:
PROXY_NODE_IP=<your-server-public-ip>
POSTGRES_PASSWORD=<a-strong-password>
VAULT_TOKEN=<a-strong-vault-token>
⚠️ لا تقم أبداً بتضمين ملف
.envالخاص بك في الالتزامات. إنه مدرج في.gitignore.
make docker-up
# أو مباشرة:
docker compose -f deploy/docker-compose.yml up -d --build
make docker-ps
curl http://localhost:8080/healthz
make release PROXY_ADDR=<your-server-ip>:2224
يقوم هذا بتجميع العملاء لجميع المنصات وتحديث dist/install.sh و dist/install.ps1 تلقائياً بعنوان الخادم الصحيح. تقدم حاوية Nginx هذه الملفات على http://<your-server-ip>:8555/.
curl -fsSL http://<proxy-ip>:8555/install.sh | bash
irm http://<proxy-ip>:8555/install.ps1 | iex
بمجرد التثبيت، اتصل ببوابة ZTTP:
zttp
# أو مباشرة:
ssh -p 2224 <your-username>@<proxy-ip>
ستظهر لك شاشة تسجيل دخول طرفية. بعد المصادقة، سترى قائمة بالخوادم المصرح لك بالوصول إليها.
جميع الإعدادات عبر متغيرات البيئة (أو ملف .env). راجع .env.example للمرجع الكامل.
يستخدم ZTTP نموذجاً قائماً على الأدوار. يتم تعيين دور لكل مستخدم؛ ولكل دور سياسة تحدد بيئات الخوادم التي يمكنه الوصول إليها.
تتم إدارة الأدوار وتعيينات الخوادم من خلال وحدة التحكم الإدارية (انظر أدناه). يقوم محرك RBAC بجميع الفحوصات في استعلام PostgreSQL واحد — ولا يكشف أبداً لماذا تم رفض الوصول للعميل (حماية من التعداد).
اتصل بخادم zttp-admin من قائمة البوابة، أو سجل الدخول بحساب لديه دور security-admin.
توفر وحدة التحكم الإدارية:
يتم تسجيل جميع الإجراءات الإدارية في
admin-actions.logداخل حجم التدقيق.
يتم تخزين جميع الجلسات في حجم Docker zttp-audit-logs (/var/log/zttp/audit/ داخل الحاوية).
security-adminCtrl+C للرجوع# قائمة التسجيلات
sudo ls /var/lib/docker/volumes/zttp-audit-logs/_data/
# تشغيل تسجيل باستخدام ttyplay
sudo ttyplay /var/lib/docker/volumes/zttp-audit-logs/_data/<session-id>.ttyrec
# قراءة سجل الإجراءات الإدارية
sudo cat /var/lib/docker/volumes/zttp-audit-logs/_data/admin-actions.log
المتطلبات: Go 1.25+، Docker (للترجمة المتقاطعة)
# بناء الوكيل + CLI للمنصة الحالية
make build
# ترجمة متقاطعة لـ CLI لجميع المنصات (Linux، macOS، Windows)
make release PROXY_ADDR=<proxy-ip>:2224
# تشغيل الاختبارات
make test
# تشغيل الوكيل محلياً (يتطلب تشغيل Postgres و Vault مسبقاً)
make run-proxy
zttp/
├── cmd/
│ ├── proxy/ # Proxy server entrypoint
│ └── zttp/ # CLI client entrypoint
├── db/
│ └── migrations/ # PostgreSQL schema migrations
├── deploy/
│ ├── docker-compose.yml
│ ├── Dockerfile.proxy
│ └── vault-seed.sh # Seeds test SSH keys into Vault
├── dist/
│ ├── install.sh # Linux/macOS installer script
│ └── install.ps1 # Windows installer script
├── internal/
│ ├── audit/ # Admin action logging
│ ├── auth/ # User authentication (bcrypt, lockout)
│ ├── cli/ # CLI client TUI and connect logic
│ ├── config/ # Environment-based configuration
│ ├── killswitch/ # gRPC kill-switch service
│ ├── proxy/ # SSH proxy, gateway TUI, admin TUI, bridge
│ ├── rbac/ # Role-based access control engine
│ ├── ratelimit/ # Per-IP rate limiting
│ ├── session/ # Session tracking and DB store
│ └── vault/ # HashiCorp Vault SSH key client
├── proto/ # gRPC protocol definitions
├── tools/
│ └── hashpw/ # CLI tool: generate bcrypt password hash
├── .env.example # Configuration template
├── go.mod
└── Makefile
git checkout -b feat/your-featuremake testيرجى عدم تضمين:
.env أو أي ملف يحتوي على أسرارzttp الثنائي في الجذر مدرج في .gitignore)هذا المشروع ملكية خاصة. جميع الحقوق محفوظة.
بُني باستخدام Go و PostgreSQL و HashiCorp Vault و Docker.
| المشكلة | حل ZTTP |
|---|
| مفاتيح SSH مشتركة على أجهزة الكمبيوتر المحمولة | المفاتيح موجودة فقط في HashiCorp Vault — ولا تُخزن على القرص أبداً |
| لا توجد رؤية لمن فعل ماذا | يتم تسجيل كل ضغطة مفتاح بصيغة .ttyrec |
| وصول شامل للإنتاج | محرك سياسات قائم على الأدوار يفرض قواعد لكل بيئة |
| لا توجد طريقة لإيقاف جلسة نشطة | نقطة نهاية gRPC للإيقاف الفوري تنهي أي جلسة حية |
| وصول غير واضح للمدققين | واجهة إدارية TUI مع إعادة تشغيل الجلسات وسجلات نصية وسجلات إجراءات إدارية |
| الخدمة | الغرض |
|---|
zttp-proxy | مضيف الحصن SSH (ملف Go الثنائي) |
zttp-postgres | قاعدة بيانات مستوى التحكم (المستخدمون، الخوادم، سياسات RBAC) |
zttp-vault | HashiCorp Vault — يخزن مفاتيح SSH الخاصة |
zttp-nginx | يقدم مثبتات CLI في /release/ |
zttp-init-audit | حاوية لمرة واحدة تصلح أذونات الحجم |
| المتغير | الافتراضي | الوصف |
|---|
PROXY_LISTEN_ADDR | 0.0.0.0:2222 | عنوان ربط وكيل SSH |
HTTP_LISTEN_ADDR | 0.0.0.0:8080 | عنوان HTTP لفحص الصحة |
GRPC_LISTEN_ADDR | 0.0.0.0:9090 | عنوان gRPC لمفتاح الإيقاف |
PROXY_NODE_IP | 127.0.0.1 | عنوان IP الخارجي المدمج في ملفات CLI الثنائية |
DATABASE_URL | postgres://zttp:... | سلسلة اتصال PostgreSQL |
VAULT_ADDR | http://localhost:8201 | عنوان خادم Vault |
VAULT_TOKEN | dev-root-token-zttp | رمز Vault الجذر (للتطوير فقط — استخدم AppRole في الإنتاج) |
MAX_FAILED_ATTEMPTS | 5 | حد القفل |
LOCKOUT_DURATION | 15m | مدة قفل الحساب |
RATE_LIMIT_PER_MIN | 10 | الحد الأقصى لمحاولات تسجيل الدخول في الدقيقة لكل عنوان IP |
AUDIT_LOG_DIR | /var/log/zttp/audit | مسار دليل تسجيل الجلسات |
SOC_WEBHOOK_URL | (فارغ) | Webhook اختياري لتنبيهات SOC |
| الدور | الوصول |
|---|
security-admin | وصول كامل لجميع البيئات + وحدة التحكم الإدارية |
sre-tier1 | جميع البيئات بما في ذلك الإنتاج |
sre-tier2 | بيئات التدريج والتطوير فقط |
dev | بيئة التطوير فقط |
readonly | بيئة التطوير، مجموعة أوامر مقيدة |
| خيار القائمة | الوصف |
|---|
| إضافة مستخدم | إنشاء مستخدم جديد مع تعيين دور |
| إضافة خادم | تسجيل خادم هدف (اسم المضيف، عنوان IP، البيئة، مستخدم SSH) |
| إدارة وصول الخادم | منح أو إلغاء وصول المستخدم إلى خوادم محددة |
| عرض المستخدمين | قائمة بجميع المستخدمين وأدوارهم |
| عرض الخوادم | قائمة بجميع الخوادم المسجلة |
| عرض سجلات التدقيق | تصفح الجلسات، إعادة تشغيل التسجيلات، قراءة السجلات النصية |
| [ رجوع ] | العودة إلى بوابة الخادم |
| الأمر | الوصف |
|---|
make build | بناء الوكيل و CLI للمنصة الحالية |
make release | ترجمة متقاطعة لملفات CLI الثنائية لجميع المنصات |
make release-docker | ترجمة متقاطعة داخل حاوية Docker (تجنب مشاكل snap/WSL) |
make docker-up | تشغيل جميع خدمات Docker Compose |
make docker-down | إيقاف جميع الخدمات وحذف الأحجام |
make docker-logs | تتبع سجلات الوكيل |
make docker-ps | عرض حالة الحاويات |
make test | تشغيل جميع اختبارات Go |
make migrate | تطبيق ترحيلات قاعدة البيانات |
make seed | بذر بيانات التطوير |
make hashpw PW=mypassword | توليد تجزئة bcrypt للبذر اليدوي لقاعدة البيانات |
make clean | إزالة الملفات الثنائية المترجمة وذاكرة التخزين المؤقت للبناء |
| الطبقة | الآلية |
|---|
| النقل | جميع اتصالات العملاء عبر SSH (مشفرة أثناء النقل) |
| المصادقة | bcrypt (التكلفة 12) / Argon2id — النص الصريح محظور هيكلياً في المخطط |
| الحماية من القوة الغاشمة | قفل الحساب (5 محاولات / 15 دقيقة) + محدد معدل لكل عنوان IP |
| التفويض | استعلام RBAC بـ JOIN واحد — الرفض دائماً عام ("Permission denied") |
| إدارة الأسرار | مفاتيح SSH الخاصة مخزنة حصرياً في HashiCorp Vault، ويتم جلبها مؤقتاً |
| مسار التدقيق | تسجيل كامل لضغطات المفاتيح بصيغة .ttyrec، سجل إداري غير قابل للتعديل للإلحاق فقط |
| عزل العمليات | يعمل الوكيل كمستخدم غير جذر (UID 65532) داخل حاوية distroless |
| مفتاح الإيقاف | يمكن إنهاء أي جلسة حية عبر gRPC دون إعادة تشغيل الوكيل |