مدیریت Secret ها در داکر
مدیریت Secret ها در Docker یک نگرانی امنیتی حیاتی برای هر کسب و کاری است. هنگام استفاده از کانتینرهای Docker، حفظ امنیت داده های حساس مانند رمزهای عبور، کلیدهای API و سایر اطلاعات کاربری ضروری است.
در این پست برخی از بهترین شیوه ها برای مدیریت 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 است تا از حملات گوناگون جلوگیری شود.