مقدمه
امنیت خوب بر لایهها متکی است، و داکر امنیت خود را بر پایه ترکیبی از فناوریهای شناختهشده kernel لینوکس بنا میکند، که هرکدام با تنظیمات پیشفرض معقول از قبل آماده شدهاند. این لایهها شامل kernel namespaces، control groups، capabilities، Mandatory Access Control و seccomp هستند.
Namespaceهای Kernel
Namespaceها فناوری اصلی پشت کانتینرها هستند. برخلاف hypervisorها که سختافزار فیزیکی مانند CPU و دیسک را مجازیسازی میکنند تا ماشینهای مجازی بسازند، namespaceها اجزای سیستمعامل — درختهای فرآیند، فایلسیستمها و رابطهای شبکه — را مجازیسازی میکنند تا چیزی بسازند که مانند یک سیستمعامل معمول و ایزوله رفتار کند.
هر کانتینر نمونه اختصاصی خود را از شش نوع namespace دریافت میکند:
Process ID (pid)— درخت فرآیند ایزولهای به هر کانتینر میدهد، که از PID 1 شروع میشودNetwork (net)— یک پشته شبکه ایزوله، شامل رابطها و آدرسهای IP اختصاصی فراهم میکندMount (mnt)— به هر کانتینر یک فایلسیستم ریشه ایزوله میدهدInter-process Communication (ipc)— دسترسی به حافظه مشترک را ایزوله میکندUser (user)— امکان نگاشت کاربران داخل کانتینر به کاربران متفاوت روی هاست را فراهم میکندUTS (uts)— یک hostname اختصاصی به هر کانتینر میدهد
Namespaceها ایزولهسازی سبکوزنی فراهم میکنند، اما بهتنهایی یک مرز امنیتی قوی محسوب نمیشوند — به همین دلیل داکر فناوریهای اضافی روی آنها لایهبندی میکند.
Control Groups
در حالی که namespaceها ایزولهسازی را مدیریت میکنند، control groups (cgroups) محدودیتهای منابع را مدیریت میکنند. کانتینرهای روی یک هاست مشترک، منابع زیرینی مانند CPU، RAM و I/O دیسک را به اشتراک میگذارند، شبیه اتاقهای یک هتل که آب و برق مشترک دارند. cgroupها از انحصار این منابع مشترک توسط یک کانتینر واحد جلوگیری میکنند که میتواند باعث یک وضعیت denial-of-service برای دیگران روی همان هاست شود.
Capabilities
اجرای کانتینرها با کاربر root لینوکس ریسکآور است، اما کاربران غیر-root اغلب بهاندازهای محدودند که عملاً بیفایده میشوند. Capabilityها این مشکل را با تقسیم مجوزهای root به فهرستی طولانی از قدرتهای قابلاعطای جداگانه حل میکنند — مانند CAP_NET_BIND_SERVICE برای اتصال به پورتهای کمشماره، یا CAP_CHOWN برای تغییر مالکیت فایل.
داکر میتواند یک کانتینر را با کاربر root شروع کند، تمام capabilityها را حذف کند و فقط موارد خاص موردنیاز آن را دوباره اضافه کند — پیادهسازی عملی اصل حداقل امتیاز (Principle of Least Privilege). داکر با capabilityهای پیشفرض معقول عرضه میشود، هرچند محیطهای تولیدی اغلب از سفارشیسازی بیشتر بهره میبرند.
Mandatory Access Control
داکر با سیستمهای اصلی Mandatory Access Control (MAC) لینوکس مانند AppArmor و SELinux یکپارچه میشود و بسته به توزیع هاست، یک پروفایل پیشفرض روی هر کانتینر جدید اعمال میکند. این پیشفرضها به دنبال محافظت متعادل بدون شکستن سازگاری اپلیکیشنها هستند، هرچند برای محیطهای سختگیرانهتر میتوان سیاستهای سفارشی تعریف کرد.
Seccomp
seccomp محدود میکند که یک کانتینر مجاز به فراخوانی کدام syscallها — مکانیزمی که اپلیکیشنها برای درخواست اقدامات از kernel استفاده میکنند — است. از بیش از ۳۰۰ syscall لینوکس، پروفایل پیشفرض داکر حدود ۴۰ تا ۵۰ مورد از خطرناکترین آنها را غیرفعال میکند، که باز هم تعادلی بین امنیت و سازگاری گسترده برقرار میکند. پروفایلهای سفارشی seccomp امکانپذیرند، اما با توجه به اندازه جدول syscall، پیکربندی صحیح آنها میتواند پیچیده باشد.
نتیجهگیری
در کنار هم، namespaceها، cgroupها، capabilityها، سیستمهای MAC و seccomp، یک وضعیت امنیتی چندلایه (defense-in-depth) برای هر کانتینری که داکر اجرا میکند تشکیل میدهند. هیچکدام از این فناوریها بهتنهایی امنیت کامل ارائه نمیدهد، اما ترکیب آنها — که با تنظیمات پیشفرض معقول و آزمودهشده پشتیبانی میشود — یک پایه امنیتی نسبتاً قوی به داکر با کمترین تلاش پیکربندی میدهد.