مدیریت Secret ها در داکر

مدیریت Secret ها در Docker یک نگرانی امنیتی حیاتی برای هر کسب و کاری است. هنگام استفاده از کانتینرهای Docker، حفظ امنیت داده های حساس مانند رمزهای عبور، کلیدهای API و سایر اطلاعات کاربری ضروری است.

مدیریت Secret ها در داکر

در این پست برخی از بهترین شیوه ها برای مدیریت Secret در داکر از جمله نحوه ذخیره ایمن آنها و به حداقل رساندن افشای آنها بحث می شود. اینجا چندین راه حل را بررسی خواهیم کرد:

  • Docker Swarm
  • Docker Compose
  • Sidecar ( Hashicorp Vault )
  • Mozilla SOPS

هر گزینه ای را که برای پروژه شما مناسب تر است انتخاب کنید. اما مهمتر از همه این است که به یاد داشته باشید هرگز Secret های داکر خود را به صورت متن ساده در Dockerfile خود قرار ندهید!

پیروی از این دستورالعمل‌ها تضمین می‌کند که اطلاعات حساس سازمان شما حتی در هنگام اجرای سرویس‌های کانتینری ایمن باقی می‌ماند.

Docker Swarm

Docker Secrets و Docker Swarm دو ابزار رسمی و رایگان هستند که امکان مدیریت ایمن Secret ها هنگام اجرای سرویس‌های کانتینری را فراهم می‌کنند.

Docker Secrets یک سازوکار امن برای ذخیره و بازیابی Secret ها از سیستم بدون افشای آنها در متن و کد ارائه می دهد. این ابزار به کاربران امکانی را می دهد تا با رمزگذاری داده ها با یک کلید منحصر به فرد قبل از ارسال آن به سیستم، داده خود را ایمن نگه دارند.

Docker Swarm یک ابزار قدرتمند جهت مدیریت کلاستر برای برنامه های کاربردی توزیع شده است. این ابزار مؤثر برای استقرار برنامه‌های شما در مقیاس بالا استفاده می‌شود. با استفاده از این ابزار می توانید به راحتی چندین Node را در یک کلاستر مدیریت کنید و به طور خودکار وظایف کاری را بین آنها توزیع کنید. این ابزار به شما کمک می‌کند تا اطمینان حاصل کنید که برنامه شما همیشه منابع کافی در دسترس دارد، حتی در زمان اوج مصرف یا افزایش غیرمنتظره ترافیک.

این دو ابزار در کنار هم، راهی موثر برای اطمینان از اینکه اطلاعات حساس سازمان شما ایمن باقی می‌مانند، فراهم می‌کنند. بیایید ببینیم چگونه یک Secret نمونه ایجاد و مدیریت کنیم.

ایجاد Secret

برای ایجاد یک Secret ابتدا باید Docker Swarm را راه اندازی کنیم. با استفاده از دستور زیر می توانید این کار را انجام دهید:

docker swarm init

هنگامی که سرویس راه اندازی شد، می توانیم از دستور زیر برای ایجاد Secret استفاده کنیم. برای مثال یک کلید SSH خواهیم ساخت:

ssh-keygen -t rsa -b 4096 -N "" -f mykey
docker secret create my_key mykey
rm mykey

در اینجا یک کلید SSH ساخته و آن را به عنوان یک Secret تعریف میکنیم. سپس فایل اصلی را پاک کرده تا فقط به صورت Secret در داکر ذخیره شود.

جهت اطمینان از ساخته شدن Secret، می توانید از دستور زیر استفاده کنید:

docker secret ls

حالا می توانیم از این Secret در کانتینر خود استفاده کنیم. یکی از راه های آن تعریف کردن Secret با استفاده از –-secret است:

docker service create --name test --secret my_key image:latest

همچنین می توانیم در فایل docker-compose.yml از Secret استفاده کنیم:

version: "3.9"

services:
  myapp:
    image: image:latest
    secrets:
      - my_key
    volumes:
      - type: bind
        source: my_secret_key
        target: /run/secrets/my_key
        read_only: true

secrets:
  my_key:
    external: true

توجه داشته باشید که Secret ها به صورت پیشفرض در مسیر /run/secrets در داخل کانتینر قرار می گیرند.

به مثال دیگه ای توجه کنید:

version: "3.9"

services:
   db:
     image: image:latest
     environment:
       PASSWORD_FILE: /run/secrets/db_password
     secrets:
       - db_password

secrets:
  db_password:
    external: true

Docker Compose

Docker Compose یک راه حل موثر برای مدیریت Secret ها برای سازمان هایی که داده های حساسی مانند رمز عبور یا کلیدهای API را مدیریت می کنند ارائه می دهد. شما می توانید Secret های خود را از یک فایل خارجی ( مانند یک فایل TXT ) بخوانید. اما مواظب باشید این فایل را با کد خودتون Commit نکنید!

version: "3.9"

services:
  myapp:
    image: image:latest
    secrets:
      - my_secret

secrets:
  my_secret:
    file: ./my_secret.txt

Sidecar Container

یک استراتژی معمول برای حفظ و ذخیره اسرار در محیط داکر، استفاده از کانتینر های Sidecar است. Secret ها را می توان از طریق sidecar container به کانتینر برنامه اصلی ارسال کرد، این مورد می‌تواند یک مدیریت کننده Secret یا هر سرویس دیگری باشد.

در این مقاله از سرویس Hashicorp Vault برای کانتینر MongoDB استفاده خواهیم کرد:

  • ابتدا یک فایل docker-compose.yml با دو سرویس mongo و secrets ایجاد کنید.
  • در سرویس secrets، از Image استفاده کنید که حاوی ابزار مدیریت انتخابی شما است، مانند vault.
  • سپس Volume را از کانتینر secrets به کانتینر mongo متصل کنید تا کانتینر mongo بتواند به داده های ذخیره شده در کانتینر secrets دسترسی داشته باشد.
  • در سرویس mongo، از متغیرهای Environment برای تنظیم داده های پایگاه داده MongoDB و ارجاع به Secret های ذخیره شده در Volume متصل شده استفاده کنید.

به این فایل نمونه دقت کنید :

version: "3.9"

services:
  mongo:
    image: mongo:latest
    volumes:
      - secrets:/run/secrets
    environment:
      MONGO_INITDB_ROOT_USERNAME_FILE: /run/secrets/mongo-root-username
      MONGO_INITDB_ROOT_PASSWORD_FILE: /run/secrets/mongo-root-password
  
  secrets:
    image: vault:latest
    volumes:
      - ./secrets:/secrets
    command: ["vault", "server", "-dev", "-dev-root-token-id=myroot"]
    ports:
      - "8200:8200"

volumes:
  secrets:

جهت مشاهده توضیحات و تنظیمات بیشتر به مستندات Hashicorp Vault مراجعه کنید.

Mozilla SOPS

Mozilla SOPS (Secrets Ops) یک پلتفرم منبع باز است که روشی امن و خودکار را برای مدیریت Secret های رمزگذاری شده در فایل ها در اختیار سازمان ها قرار می دهد.

این ابزار طیف وسیعی از ویژگی‌ها را ارائه می‌دهد که برای کمک به تیم‌ها برای به اشتراک گذاشتن Secret ها در کد به روشی ایمن و عملی طراحی شده‌اند. فرض می کنیم که شما قبلاً با SOPS آشنا هستید، اگر اینطور نیست، از اینجا شروع کنید.

به یک نمونه استفاده از SOPS در docker-compose.yml دقت کنید:

version: "3.9"

services:
  myapp:
    image: image:latest
    environment:
      API_KEY: ${API_KEY}
    secrets:
      - mysecret

  sops:
    image: mozilla/sops:latest
    command: ["sops", "--config", "/secrets/sops.yaml", "--decrypt", "/secrets/mysecrets.enc.yaml"]
    volumes:
      - ./secrets:/secrets
    environment:
      SOPS_PGP_PRIVATE_KEY: /secrets/myprivatekey.asc

secrets:
  mysecret:
    external: true

در مثال فوق، سرویس myapp کلیدی به نام API_KEY نیاز دارد. بخش secrets از یک secret به نام mysecrets استفاده می کند که انتظار می رود در یک سرویس مدیریت کلید خارجی مانند Docker Swarm Secrets یا HashiCorp Vault ذخیره شود.

سرویس sops از Image رسمی SOPS برای رمزگشایی فایل mysecrets.enc.yaml استفاده می کند که در دایرکتوری محلی ./secrets ذخیره می شود. Secret های رمزگشایی شده به عنوان متغیرهای Environment در سرویس myapp متصل می شوند.

مطمئن شوید که دایرکتوری Secrets را ایجاد کرده و فایل رمزگذاری شده mysecrets.enc.yaml و فایل پیکربندی sops.yaml ( با پیکربندی SOPS ) را در آن دایرکتوری اضافه کنید.

نتیجه گیری

به طور خلاصه، مدیریت اسرار در Docker بخش مهمی از حفظ امنیت برنامه های کانتینری شما است. Docker شامل چندین ابزار داخلی برای حفظ اسرار است، مانند فایل‌های Docker Secrets و Docker Compose.

علاوه بر این، سازمان ها می توانند از راه حل های شخص ثالث مانند HashiCorp Vault و Mozilla SOPS برای مدیریت اسرار در Docker استفاده کنند. این فناوری‌ها قابلیت‌های اضافی مانند کنترل دسترسی، رمزگذاری، و غیره را برای تقویت امنیت مدیریت مخفی شما ارائه می‌دهند.

در نهایت، یافتن و محدود کردن افشای ناخواسته اطلاعات حساس برای مدیریت اسرار در Docker بسیار مهم است. همچنین یکی از بهترین راه‌ها استفاده از ابزارهای اسکن مانند GitGuardian برای Image های داکر ساخته شده توسط CI/CD است تا از حملات گوناگون جلوگیری شود.