به گزارش از وبسایت cncf

پروژه Security Profiles Operator (SPO) که از مجموعه پروژه‌های CNCF آمده، اکنون با انتشار نسخه 1.0.0 به بلوغ رسیده است. این اپراتور مدیریت پروفایل‌های امنیتی (seccomp، SELinux و AppArmor) را خودکار می‌کند: پروفایل‌ها را به‌عنوان منابع سفارشی Kubernetes (CRD) معرفی، از بارهای کاری زنده ضبط و به‌صورت اعلامی به پادها متصل می‌کند.

نسخه 1.0.0 همهٔ هشت API مربوط به CRD را به v1 ارتقا داده و این اولین انتشار پایدار پروژه است که با یک ممیزی امنیتی ثالث، یک چرخه کامل سخت‌سازی و مسیر مهاجرت بدون وقفه از نسخه‌های قبلی API پشتیبانی می‌شود.

تاریخچه کوتاه: SPO در آوریل 2020 به‌عنوان یک اپراتور تنها برای seccomp شروع شد و طی سال‌های بعد پشتیبانی از SELinux (اواخر 2020)، AppArmor (اواخر 2021)، ضبط پروفایل از گزارش‌های حسابرسی و eBPF، توزیع مبتنی بر OCI و امکانات دیگر را افزود. بسیاری از APIها سال‌ها در حالت عملیاتی پایدار باقی ماندند و اکنون برای مصرف‌کنندگان یک نسخهٔ پایدار لازم بود.

تیم توسعه از فرصت پنجره قبل از v1 برای پاکسازی و بازطراحی ساختاری استفاده کرد: همهٔ CRDها اکنون یک وضعیت مشترک مبتنی بر شرایط Kubernetes دارند، مشخصات SPOD مرتب و گروه‌بندی شد، انواع پایهٔ مشترک استخراج و تکرار حذف شد، و قراردادهای API Kubernetes بهتر رعایت شدند (مثلاً جایگزینی اعداد صحیح بدون علامت). همچنین Enumها به PascalCase همراستا شدند (برای مثال logs → Logs, RUNNING → Running) و نشانگرهای الزامی/اختیاری و اعتبارسنجی به تمام فیلدها اضافه شد.

یک استثناء عمدی نگه داشته شد: ثابت‌های SCMP_ACT_* و SCMP_CMP_* در seccomp نام‌های بزرگ خود را حفظ می‌کنند تا با مشخصات زمان اجرا OCI و هدرهای هستهٔ لینوکس سازگار بمانند.

قبل از انتشار v1، پروژه تحت یک ممیزی امنیتی قرار گرفت که هیچ آسیب‌پذیری حیاتی نشان نداد. ممیزی تأیید کرد که مسیرهای فایل روی هاست از ابرداده‌های اشیاء مشتق می‌شوند (نه از فیلدهای قابل کنترل توسط کاربر)، دستورات به‌صورت آرایه‌ای ساخته می‌شوند (بنابراین تزریق shell کاهش می‌یابد)، و پیش‌فرض‌های RBAC امتیازات غیرضروری به کاربران غیرسرپرست نمی‌دهند.

برای پرداختن به یافته‌های ممیزی و افزایش سخت‌سازی، تغییرات متعددی اعمال شده است، از جمله:

• امکان غیرفعال کردن کامل RawSelinuxProfile توسط مدیران کلاستر با فیلد جدید enableRawSelinuxProfiles در پیکربندی SPOD؛ وب‌هوک پذیرش اکنون پروفایل‌های خام نامعتبر را رد می‌کند.

• تغییر در SelinuxProfile: مقدار بولی “مجاز” به یک شمارهٔ حالت (اجباری یا مجاز) تبدیل شده تا از فعال شدن تصادفی حالت مجاز جلوگیری شود.

• سخت‌تر شدن ورودی‌های AppArmor: ورودی‌های قالب برای نام پروفایل، مسیر اجرایی و capabilityها اکنون با regexهای دقیق اعتبارسنجی می‌شوند و از بازنویسی پروفایل‌هایی که پیش‌تر در هسته بارگذاری شده‌اند جلوگیری می‌گردد.

• محدودیت اندازهٔ RawSelinuxProfile.spec.policy به حداکثر 500 کیلوبایت تعیین شد تا از رسیدن ورودی‌های بزرگ به کامپایلر SELinux CIL روی گره جلوگیری شود؛ همچنین نشانگرهای اعتبارسنجی در تمام انواع CRD اضافه گردید.

علاوه بر موارد گزارش‌شده در ممیزی، مجموعه‌ای از سخت‌سازی‌های اضافی پیاده‌سازی شد: جایگزینی regexهای پرخاشگر برای جلوگیری از backtracking، محدود کردن مسیرهای HostProcVolumePath و Seccomp ListenerPath، تعیین محدودیت‌های منابع برای ضبط‌کنندهٔ مبتنی بر eBPF، بهبود دقت کش فرآیند بر اساس PID و زمان شروع، مدیریت صریح حاشیه‌نویسی ضبط و کاهش کاردینالیتهٔ متریک‌های Prometheus.

یکی از نکات کلیدی این انتشار، امکان مهاجرت بدون توقف است: ارتقاء به نسخه 1.0.0 نیاز به مرحلهٔ انتقال دستی ندارد. وب‌هوک‌های تبدیل به‌طور شفاف بین نسخه‌های قدیمی API و v1 ترجمه می‌کنند؛ مانیفست‌های قدیمی همچنان کار می‌کنند و گزینهٔ بازگشتی (کار با نسخه‌های قدیمی API و دریافت خروجی به سبک قدیمی) نیز حفظ شده است. لایهٔ تبدیل مقادیر enum را دوطرفه نگاشت می‌کند (مثلاً logs ↔ Logs).

[p]در اینجا یک مثال ProfileRecording قبل و بعد نشان داده شده است:[/p]

# قبل از (v1alpha1)
apiVersion: security-profiles-operator.x-k8s.io/v1alpha1
kind: ProfileRecording
metadata:
  name: my-recording
spec:
  type: SeccompProfile
  recorder: logs
  mergeStrategy: none

# بعد از (v1)
apiVersion: security-profiles-operator.x-k8s.io/v1
kind: ProfileRecording
metadata:
  name: my-recording
spec:
  type: SeccompProfile
  recorder: Logs
  mergeStrategy: None
  podSelector:
    matchLabels:
      app: my-app

برای CRDهایی که enum آنها تغییر نکرده است، راهنمای کامل مهاجرت شامل به‌روزرسانی‌های Go API، ثابت‌های enum و ثبت schema ارائه شده است. نسخه‌های قدیمی API برای مدت زمانی به‌منظور سازگاری نگه داشته می‌شوند و بعدها حذف خواهند شد.

SPO همواره در لایهٔ بالادستی Kubernetes ادغام بوده است: پروژه از GA API سطح seccomp (Kubernetes 1.19) استفاده می‌کند و از پیشگامان توزیع پروفایل مبتنی بر OCI بوده است. KEP 6061 که تابعِ توزیع پروفایل مبتنی بر OCI را به kubelet اضافه می‌کند در مسیر پیشنهاد و یکپارچه‌سازی قرار دارد؛ این KEP مدل اعتماد محلی را حفظ می‌کند و قابلیت pull از رجیستری‌های OCI را برای runtimes فراهم می‌آورد.

در عین حال، SPO به ارائهٔ قابلیت‌های سطح بالا ادامه می‌دهد که kubelet به‌تنهایی پوشش نمی‌دهد: ضبط پروفایل از بارهای کاری زنده، نگارش ساختاریافتهٔ سیاست SELinux، اتصال پروفایل به تصاویر کانتینر و غنی‌سازی گزارش‌های حسابرسی.

پس از انتشار v1، اولویت‌های پروژه شامل حذف نسخه‌های قدیمی API پس از دورهٔ انتشار حداقلی، سخت‌سازی مستمر (از جمله محدودتر کردن دامنهٔ RBAC و عملیات مسیر ایمن‌تر) و ادغام KEP 6061 برای هماهنگ‌سازی توزیع OCI با پشتیبانی بومی kubelet است.

نسخه 1.0.0 را امتحان کنید، راهنمای مهاجرت را مطالعه نمایید و در کانال #security-profiles-operator در Kubernetes Slack در گفتگو شرکت کنید. 🙏🔒

SPO حاصل تلاش بیش از 70 مشارکت‌کننده از سازمان‌های مختلف است — از همهٔ کسانی که کد نوشته، مشکلات را گزارش کرده، نسخه‌های اولیه را آزمایش کرده و در ممیزی شرکت کردند صمیمانه سپاسگزاریم. ✅