docker-secret

این محتوا تنها در زمانی که از داکر به صورت swarm mode استفاده شود کاربرد دارد. آن هم برای زمانی که بخواهیم دیتای حساسی رو در شبکه منتقل کنیم که از جمله‌ی آنها می‌‌توان به موارد زیر اشاره کرد:

  • Usernames and passwords
  • TLS certificates and keys
  • SSH keys
  • Generic strings or binary content (up to 500 kb in size)
  • Other important data such as the name of a database or internal server

به صورت کلی به جای اینکه دیتای مهم و حساس رو در داخل ایمیج یا سورس کد به صورت غیر رمزنگاری شده نگهداری کنند از secret استفاده می‌کنند تا امنیت لازم روی دیتا رعایت شود.

گاهی هم برای احراض هویت از docker secret استفاده می‌شود که بتوان با استفاده از آن محیط‌های Deployment را مدیریت و کنترل کرد.

البته می‌توان با استفاده از docker secret موارد دیگه همانند کانفیگ‌ها را نیز مدیریت کرد.

چطوری کار می‌کند؟

به این صورت عمل می‌کند که در تمامی نودهای Swarm سرویس داکر Secret خود را در بستر کاملا TLS به سمت نود Swarm Manager ارسال می‌کند و این Secretها به صورت غیر رمزنگاری شده در تمامی Managerهای Swarm قرار دارند و همواره این اطلاعات بین آنها sync می‌باشد. بعد از اجرای کانتینر درون آن Secret به صورت decrypted شده در مسیر زیر Mount می‌شود.

Linux Container: /run/secrets/<secret_name>

Windows Container: C:ProgramDataDockersecrets

نودها تنها دسترسی به encrypted secrets ها دارند در صورتی که Manager نود باشد یا اون سرویس را اجرا کرده باشد به خود Secret دسترسی دارد. زمانی که یک کانتینر در حال کار متوقف می‌شود مجدد Secret رمزنگاری شده و مواردی که در رم سرور Mount شده بود پاک می‌شود.

به زبان ساده‌تر تنها در زمانی secretها به صورت غیر رمزنگاری در دسترس هستند که توسط خود swarm سرویس‌ آنها راه‌اندازی شده باشد. در صورتی که کانتینر متوقف شود تمام سکرت‌ها مجدد رمزگذاری خواهند شد.

دستور docker secret:

با استفاده از دستور docker secret می‌توان secretها را مدیریت کرد.

docker secret --help
docker secret –help


همانطور که مشاهده می‌کنید با استفاده از این دستور و آپشن‌های آن می‌توانید secret ایجاد و یا اینکه آن‌ها را پاک کنید.

در ادامه با توضیح یک مثال نحوه‌ی استفاده از secret و دستور docker secret توضیح داده می‌شود.

با استفاده از دستور زیر می‌توانید یک secret با نام my_secret_data ایجاد کنید.

printf "This is a secret" | docker secret create my_secret_data -

با استفاده از دستور زیر یک سرویس با نام redis ایجاد می‌کنیم که از این secret استفاده می‌کند.

docker service  create --name redis --secret my_secret_data redis:alpine

بعد از راه‌اندازی کانتینر redis حتما اطمینان پیدا کنید که بدون مشکل راه‌اندازی شده باشد.

دقت کنید secret ایجاد شده که در کانتینر redis در مسیر /run/secrets قرار دارد. با استفاده از دستورات زیر می‌توانید نام secret و سپس محتوای آن را مشاهده کنید.

docker ps --filter name=redis -q
5cb1c2348a59
docker container exec $(docker ps --filter name=redis -q) ls -l /run/secrets
-r--r--r--    1 root     root            17 Dec 13 22:48 my_secret_data
docker container exec $(docker ps --filter name=redis -q) cat /run/secrets/my_secret_data
This is a secret

در صورتی که الان از این کانتینر یک ایمیج تهیه کنید و آن را commit کنید و از ایمیج جدید هم یک کانتینر ایجاد کنید داخل کانتینر جدید دیگر secret وجود ندارد و secret داخل ایمیج نیست. این نکته‌ بسیار اهمیت دارد.

تا زمانی که سرویس redis برقرار باشد امکان اینکه این secret را پاک کنید میسر نمی‌باشد. می‌توانید با دستور زیر secret مربوط به هر سرویس‌ در حال کار را پاک کنید.

1docker service update --secret-rm my_secret_data redis

حال اگر بعد از این دستور داخل دایرکتوری مد نظر را بگردید دیگه secret قبلی رو مشاهده نخواهید کرد.

docker container exec -it $(docker ps --filter name=redis -q) cat /run/secrets/my_secret_data
cat: can't open '/run/secrets/my_secret_data': No such file or directory

با استفاده از دستور زیر نیز می‌توانید secret ایجاد شده را پاک کنید.

1docker secret rm my_secret_data

طی یک مثال ساده نحوه‌ی استفاده از secret رو بررسی کردیم. بعدا در زمان توضیح swarm و استفاده از آن بیشتر با موضوع secret آشنا خواهیم شد.

منبع