بلاگ/راه‌اندازی Harbor: رجیستری خصوصی کانتینر با اسکن امنیتی و RBAC روی سرور اختصاصی و VPS
به‌روز شده

راه‌اندازی Harbor: رجیستری خصوصی کانتینر با اسکن امنیتی و RBAC روی سرور اختصاصی و VPS

1405/07/140 بازدید
راه‌اندازی Harbor: رجیستری خصوصی کانتینر با اسکن امنیتی و RBAC روی سرور اختصاصی و VPS

راه‌اندازی Harbor: رجیستری خصوصی کانتینر با اسکن امنیتی و RBAC روی سرور اختصاصی و VPS

رجیستری خصوصی Harbor روی سرور لینوکسی

هر تیمی که چند پروژه داکری دارد زودتر یا دیرتر به این مشکل می‌رسد: محدودیت نرخ Docker Hub روی pull ایمیج‌ها در CI/CD، نگرانی درباره نگهداری ایمیج‌های خصوصی روی یک سرویس عمومی، یا نیاز به کنترل دقیق‌تر این‌که چه کسی اجازه push و pull دارد. Harbor یک رجیستری کانتینر متن‌باز است که این سه مشکل را با هم حل می‌کند: ذخیره‌سازی خصوصی ایمیج‌ها، اسکن آسیب‌پذیری با Trivy، و مدیریت دسترسی مبتنی بر نقش (RBAC). این راهنما نصب کامل Harbor با Docker Compose روی یک سرور اختصاصی یا VPS را قدم‌به‌قدم توضیح می‌دهد. اگر هدف‌تان صرفاً مدیریت گرافیکی خود کانتینرها (نه رجیستری ایمیج‌ها) است، راه‌اندازی Portainer ابزار مکملی است که می‌توانید کنار Harbor اجرا کنید.

چرا یک رجیستری خصوصی به‌جای Docker Hub؟

حساب رایگان Docker Hub محدودیت نرخ pull دارد که در pipeline‌های CI/CD با اجرای زیاد build به‌سرعت لمس می‌شود. علاوه بر این، نگه‌داشتن ایمیج‌های داخلی روی یک سرویس عمومی برای تیم‌هایی که ملاحظات امنیتی یا compliance دارند مطلوب نیست.

جدول زیر سه گزینه رایج را از نظر قابلیت‌های اصلی مقایسه می‌کند:

ویژگیDocker Hub (رایگان)رجیستری ساده (registry:2)Harbor
محدودیت نرخ pullداردندارد (روی سرور خودتان)ندارد
اسکن آسیب‌پذیریفقط در پلن پولیندارددارد (Trivy داخلی)
کنترل دسترسی مبتنی بر نقشمحدودندارد (فقط auth پایه)کامل (RBAC روی سطح پروژه)
رابط گرافیکی مدیریتداردندارددارد
محل میزبانیابر عمومیسرور شماسرور شما

برای تیم‌های کوچک با چند ایمیج، registry:2 ساده‌تر است؛ اما به‌محض این‌که اسکن امنیتی یا چند سطح دسترسی لازم شود، Harbor انتخاب منطقی‌تری است.

اجزای کلیدی Harbor: اسکن امنیتی ایمیج، کنترل دسترسی RBAC و زیرساخت ذخیره‌سازی روی سرور و فضای ابری

پیش‌نیازها

برای اجرای پایدار Harbor حداقل این موارد لازم است:

  • یک سرور لینوکسی (Ubuntu 22.04 یا مشابه) با حداقل ۲ هسته CPU و ۴ گیگابایت RAM برای تست؛ برای استفاده واقعی در تیم، ۴ هسته و ۸ گیگابایت RAM به بالا پیشنهاد می‌شود.
  • فضای دیسک کافی برای ذخیره لایه‌های ایمیج (به‌مرور رشد می‌کند، پس یک volume جداگانه یا دیسک SSD بزرگ‌تر منطقی‌تر است).
  • Docker Engine و Docker Compose نصب‌شده.
  • یک دامنه یا ساب‌دامنه که به IP سرور اشاره کند (مثلاً harbor.example.com)، چون Harbor روی HTTPS کار می‌کند.
  • پورت‌های ۴۴۳ (یا هر پورت HTTPS دلخواه) باز در فایروال — راهنمای راه‌اندازی فایروال nftables روی سرور لینوکس برای تنظیم قوانین آن کافی است.

نصب Harbor با Docker Compose

دانلود نصب‌کننده

Harbor از یک installer آفلاین استفاده می‌کند که خودش Docker Compose را پشت صحنه صدا می‌زند:

wget https://github.com/goharbor/harbor/releases/download/v2.11.0/harbor-offline-installer-v2.11.0.tgz
tar xzvf harbor-offline-installer-v2.11.0.tgz
cd harbor

تنظیم harbor.yml

فایل harbor.yml.tmpl را کپی و ویرایش کنید:

cp harbor.yml.tmpl harbor.yml

مهم‌ترین مقادیری که باید تغییر دهید:

hostname: harbor.example.com

https:
  port: 443
  certificate: /path/to/fullchain.pem
  private_key: /path/to/privkey.pem

harbor_admin_password: یک-رمز-قوی-اینجا

data_volume: /data/harbor

گواهی TLS را می‌توانید با Certbot از Let's Encrypt بگیرید و مسیر فایل‌های fullchain.pem و privkey.pem را در همین فایل وارد کنید. استفاده از گواهی self-signed هم برای محیط تست ممکن است، اما کلاینت داکر در آن صورت باید با فلگ insecure-registries پیکربندی شود که برای محیط production توصیه نمی‌شود.

اجرای نصب

sudo ./install.sh --with-trivy

فلگ --with-trivy کانتینر اسکنر امنیتی را هم از ابتدا فعال می‌کند. پس از اجرا، چند کانتینر بالا می‌آیند: core، portal (رابط وب)، registry (موتور ذخیره‌سازی ایمیج)، trivy-adapter، redis و postgresql. وضعیت را با docker compose ps بررسی کنید و سپس آدرس https://harbor.example.com را در مرورگر باز کنید؛ کاربر پیش‌فرض admin با رمزی است که در harbor_admin_password تعیین کردید.

اسکن امنیتی ایمیج‌ها با Trivy

Trivy در Harbor به‌صورت یک اسکنر داخلی عمل می‌کند و هر ایمیج push‌شده را از نظر CVE در پکیج‌های سیستمی و وابستگی‌های زبان برنامه‌نویسی (npm، pip، go modules و غیره) بررسی می‌کند. سه قابلیت کاربردی در تنظیمات پروژه فعال می‌شوند:

  • Scan on push — هر ایمیج بلافاصله بعد از push اسکن می‌شود، بدون نیاز به اجرای دستی.
  • Prevent vulnerable images from running — می‌توانید سطح شدت (مثلاً Critical) تعیین کنید که اگر ایمیجی بالاتر از آن داشت، اصلاً اجازه pull پیدا نکند.
  • اسکن زمان‌بندی‌شده — برای ایمیج‌هایی که مدتی است push نشده‌اند اما CVEهای جدید ممکن است کشف شده باشد.

نتیجه اسکن در همان صفحه هر تگ ایمیج، به تفکیک Critical/High/Medium/Low نمایش داده می‌شود؛ برای یک تیم DevOps این یعنی اسکن امنیتی بدون نیاز به ابزار جداگانه در pipeline.

کنترل دسترسی RBAC

واحد اصلی دسترسی در Harbor، «پروژه» است — یک namespace برای گروهی از ایمیج‌ها (مثلاً یک پروژه به ازای هر سرویس یا هر تیم). هر کاربر در هر پروژه یکی از این نقش‌ها را می‌گیرد:

  • Project Admin — مدیریت کامل پروژه، از جمله اعضا و تنظیمات اسکن.
  • Maintainer — push/pull و مدیریت تگ‌ها، بدون دسترسی به تنظیمات پروژه.
  • Developer — push/pull ایمیج، بدون حذف تگ.
  • Guest / Limited Guest — فقط pull، برای مصرف‌کنندگان ایمیج مثل سرورهای deploy.

برای CI/CD به‌جای استفاده از حساب کاربری انسانی، «Robot Account» بسازید — یک توکن محدود به یک یا چند پروژه که می‌توان دسترسی آن را فقط به push یا فقط به pull محدود کرد. اتصال به LDAP یا OIDC هم از همان بخش Administration ممکن است، برای تیم‌هایی که می‌خواهند از SSO موجودشان استفاده کنند. این RBAC فقط دسترسی در سطح پروژه‌های Harbor را کنترل می‌کند؛ امنیت خود سرور — مثل امن‌سازی دسترسی SSH — جداگانه نیاز به پیکربندی دارد.

اتصال داکر و CI/CD به Harbor

بعد از ساخت پروژه در رابط وب، login و push از خط فرمان تفاوتی با Docker Hub ندارد:

docker login harbor.example.com
docker tag myapp:latest harbor.example.com/myteam/myapp:latest
docker push harbor.example.com/myteam/myapp:latest

در تنظیمات runner یا pipeline (GitHub Actions، GitLab CI یا هر ابزار دیگر)، کافی است آدرس رجیستری و اعتبار robot account را به‌جای Docker Hub قرار دهید؛ بقیه دستورات build/push بدون تغییر کار می‌کنند.

نگهداری و پشتیبان‌گیری

دو بخش باید پشتیبان‌گیری شوند: دیتابیس PostgreSQL (متادیتای پروژه‌ها، کاربران، نتایج اسکن) و data_volume که لایه‌های واقعی ایمیج را نگه می‌دارد. یک اسکریپت cron ساده برای dump دیتابیس و rsync پوشه data_volume به یک استوریج دیگر کافی است؛ برای رمزنگاری و خودکارسازی این فرآیند می‌توانید از Restic استفاده کنید. فضای دیسک را هم رصد کنید — سیاست garbage collection در تنظیمات Harbor به حذف لایه‌های یتیم (image که دیگر هیچ تگی به آن اشاره نمی‌کند) کمک می‌کند.

سرور اختصاصی یا VPS برای Harbor؟

برای تیم‌های کوچک با تعداد محدود ایمیج و ترافیک push/pull پایین، یک VPS با مشخصات بالا کافی است و هزینه را پایین نگه می‌دارد.

وقتی تعداد runner‌های CI/CD افزایش می‌یابد یا حجم ایمیج‌ها بزرگ می‌شود، I/O دیسک تبدیل به گلوگاه می‌شود — این‌جا سرور اختصاصی با دیسک NVMe و منابع ایزوله گزینه پایدارتری است. سرورهای اختصاصی آریانت برای همین سناریو مناسب‌اند؛ اگر هنوز در مرحله راه‌اندازی اولیه یا تست هستید، می‌توانید با یک VPS ابری آریانت شروع کنید و بعداً به سرور اختصاصی مهاجرت کنید.

جمع‌بندی

Harbor سه نیاز رایج تیم‌های DevOps را یک‌جا پوشش می‌دهد: رجیستری خصوصی بدون محدودیت نرخ، اسکن خودکار آسیب‌پذیری با Trivy، و کنترل دسترسی دقیق با RBAC و robot account. نصب آن با Docker Compose کمتر از یک ساعت زمان می‌برد و بعد از آن، تنها کاری که لازم است همان login/push/pull معمول داکر است — فقط این بار روی زیرساخت خودتان.