در بسیاری از زیرساختهای عملیاتی برای مانیتورینگ و یا خودکار سازی فرآیند ها و CI/CD در داکر، از دسترسی مستقیم به سوکت داکر (Docker socket) استفاده می شود. دسترسی مستقیم به سوکت داکر (Docker socket) میتواند یک ریسک امنیتی جدی به حساب آید. این سوکت بهطور پیشفرض اجازه اجرای تمام دستورات مدیریتی داکر را میدهد و در صورت دسترسی غیرمجاز، ممکن است منجر به تسلط کامل بر سیستم شود.
در این مقاله، روشی امن برای ارائه دسترسی محدود و فقطخواندنی به Docker socket معرفی میکنیم که با استفاده از Docker Socket Proxy پیادهسازی شده است. در این راهکار، دسترسی های اضافی به متدهای HTTP مانند POST کاملاً مسدود شده و تنها متد GET مجاز شناخته شده، همچنین دسترسی محدود فقط به Path های خاصی که برای مانیتورینگ ضروری هستند، اعمال شده است. این روش میتواند در سناریوهایی که پلتفرم مانیتورینگ معین نیاز به خواندن اطلاعات docker دارد، بدون به خطر انداختن امنیت کل سامانه، بسیار مفید واقع شود.
برای ایمن سازی و کاهش ریسک های ناشی از دسترسی کامل به سوکت داکر راه حل های متعددی وجود دارد و میتوان از فایروال و پروکسی های مختلفی استفاده کرد. یکی از راه حل های مناسب و کم هزینه به دلیل open source بودن استفاده از docker socket proxy است که طبق تست های انجام شده به خوبی عمل کرده و محدودیت های دسترسی را به درستی و به صورت کاربردی اعمال می کند. همچنین پیشنهاد می شود علاوه بر استفاده از docker socker proxy در فایروال نیز دسترسی به سورس آیپی و پورت سامانه های مورد نیاز محدود شود.
این روش صرفا یک روش کم هزینه و در عین حال با ایمنی بسیار مناسب است، دقت شود که راه حل های ایمن تر و مناسب با هر محیط عملیاتی ممکن است متفاوت باشد که بررسی های دقیق تر و مناسب با محیط و سیاست های هر سازمان به عهده تیم امنیت است.
در این معماری، بهجای اتصال مستقیم ابزار مانیتورینگ از طریق یک پورت پابلیش شده به سوکت Docker، یک پراکسی محافظ به نام docker socket proxy در میان قرار میگیرد. این پراکسی مانند یک فیلتر عمل میکند و فقط درخواستهای مجاز را از میان عبور میدهد. بهاینترتیب، ابزارهایی که فقط نیاز به مشاهده اطلاعات داکر دارند (مثل وضعیت کانتینرها یا نسخه داکر)، میتوانند به شکلی امن به این دادهها دسترسی پیدا کنند، بدون اینکه خطر اجرای دستورات مخرب مانند ساخت، توقف یا حذف کانتینرها وجود داشته باشد.
در اصل، این پراکسی به صورت یک کانتینر جداگانه اجرا میشود که سوکت Docker را به شکل فقطخواندنی (read-only) به کانتینر Mount میکند و همچنین تنها متدهای GET روی Path یا مسیرهای مشخصی از API داکر را میپذیرد. این مسیرها براساس نیاز نرمافزار مانیتورینگ معین انتخاب میشوند و سایر مسیرها مسدود میشوند.
به این منظور نیاز است که فایل compose زیر را ایجاد و اجرا کنیم
services:
docker-socket-proxy:
image: tecnativa/docker-socket-proxy
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
- CONTAINERS=1
- IMAGES=1
- SERVICES=1
- NODES=1
- TASKS=1
- NETWORKS=1
- VOLUMES=1
- INFO=1
- VERSION=1
- POST=0 # Deny all POST requests
ports:
- "2375:2375"
به این منظور نیاز است که دستور زیر را اجرا کنیم
docker run -d \
--name docker-api-proxy \
--restart=unless-stopped \
-p 127.0.0.1:2375:2375 \
-e CONTAINERS=1 \
-e IMAGES=1 \
-e SERVICES=1 \
-e NODES=1 \
-e TASKS=1 \
-e NETWORKS=1 \
-e VOLUMES=1 \
-e INFO=1 \
-e VERSION=1 \
-e POST=0 \
-e LOG_LEVEL=info \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
tecnativa/docker-socket-proxy
ارائه مستقیم Docker socket به ابزارهای مختلف مانیتورینگ و CI/CD ، هرچند ساده و رایج است، اما ریسکهای امنیتی بالایی دارد و میتواند کل زیرساخت را در معرض خطر قرار دهد. راهکاری که در این مقاله ارائه شد، با استفاده از docker socket proxy دسترسی به Docker API را با محدود کردن متدهای HTTP و همچنین تعریف دقیق مسیرهای مجاز به شکل کاملاً کنترلشده و امن فراهم میکند. این روش اجازه میدهد تا ابزارهای مانیتورینگ بدون توانایی انجام تغییرات یا اجرای دستورات مدیریتی بر روی کانتینرها به اطلاعات مورد نیاز خود دسترسی داشته باشند.
پیادهسازی این مدل بسیار ساده و سریع است اما در عین حال میتواند یک لایه امنیتی بسیار مؤثر به معماری داکر شما اضافه کند.