Ghostunnel یک پروکسی متنباز (Open-source) است که وظیفه مدیریت TLS را برای برنامههایی که خودشان قادر به انجام این کار نیستند، بر عهده میگیرد.
نحوه عملکرد
این ابزار در دو حالت عمل میکند. در حالت سرور (Server mode)، در مقابل یک سرویس بکاند (Backend) قرار میگیرد، اتصالات TLS را میپذیرد، گواهی (Certificate) کلاینت را بررسی میکند و سپس ترافیک را از طریق TCP یا UNIX socket به سرویس پشت سر خود منتقل میکند. در حالت کلاینت (Client mode)، فرآیند برعکس است؛ یعنی به اتصالات محلی ساده (Plaintext) گوش میدهد، آنها را در قالب TLS بستهبندی کرده و یک گواهی کلاینت به سرویس از راه دور ارائه میدهد. با قرار دادن یک نمونه در هر دو طرف، هر دو سمت هویت خود را اثبات میکنند در حالی که اپلیکیشنها همچنان با پروتکل Plaintext به کار خود ادامه میدهند.
اگر یک سرویس داخلی با پروتکل Plaintext کار میکند و نیاز به اضافه کردن Mutual TLS (mTLS) پیدا شود، اما کدنویسی برای این کار وجود نداشته باشد یا وابسته به یک فروشنده (Vendor) خاص باشد، Ghostunnel این وظیفه را از اپلیکیشن گرفته و به یک فرآیند مجزا تبدیل میکند.
امنیت و مدیریت سیاستها
در حالت سرور، پروکسی تا زمانی که مشخص نکنید چه کسی اجازه عبور دارد، شروع به کار نمیکند. شما باید حداقل یکی از موارد زیر را برای بررسی انتخاب کنید: Common Name، واحد سازمانی (OU)، نام DNS یا URI در گواهی، Public Key Pin یا یک سیاست (Policy) مشخص. چندین مورد را میتوان با هم ترکیب کرد. Ghostunnel از SPIFFE IDها پشتیبانی میکند و برای موارد پیچیدهتر، سیاستهای Open Policy Agent (OPA) را ارزیابی میکند که قابلیت بارگذاری مجدد (Reload) در حین اجرای تونل را دارند.
مدیریت گواهیها و استقرار
- کلیدها و گواهیها میتوانند از فایلهای PEM یا PKCS#12، کیچین macOS، Windows Certificate Store، API مربوط به SPIFFE Workload، ماژولهای سختافزاری PKCS#11 (مانند YubiKey) یا از طریق Let’s Encrypt دریافت شوند.
- گواهیها با ارسال سیگنال SIGHUP یا بر اساس یک تایمر بازنشانی (Reload) میشوند که استفاده از اعتبارنامههای کوتاهمدت (Short-lived credentials) را عملیاتی میکند.
- این ابزار یک باینری (Binary) استاتیک و تکفایلی به زبان Go است که هیچ وابستگی زمان اجرایی (Runtime dependency) ندارد و برای سیستمعاملهای Linux، macOS، Windows و BSDها ساخته شده است.
Ghostunnel به طور پیشفرض فقط روی localhost یا UNIX socket گوش میدهد و در لینوکس با استفاده از Landlock خود را در محیط ایزوله (Sandbox) قرار میدهد. همچنین یک پورت وضعیت (Status port) برای نمایش متریکهای JSON و Prometheus در نظر گرفته شده است.