nullamix
nullamix
خواندن ۳ دقیقه·۱ ماه پیش

پسورد docker رو encode کن !

سلام. تو این نوشته میخوام درباره‌ی حل یک مشکل، در زمانی که از docker برای deploy پروژه استفاده میکنید بنویسم.


به طور جزئی‌تر بخوام توضیح بدم، وقتی در یک سرور، پروژه رو با docker اورده باشید بالا، احتمالا قبلش از دستور docker login استفاده کردید. در نتیجه‌ username و password مربوط به container registry مد نظرتون در مسیر زیر ذخیره شده:

~/.docker/config.json

اگر فایل بالا رو باز کنیم با محتوایی شبیه به کانفیگ زیر روبرو میشیم:

~/.docker/config.json
~/.docker/config.json

تو کانفیگ فایل بالا در قسمت auth، داکر username و password شما رو برای لاگین شدن به container registry به شکل base64 ذخیره کرده تا بتونه از اون رجیستری docker imageها رو pull کنه (یا push کنه)،‌ در نهایت نتیجه این هست که خیلی راحت میشه به username و password رسید. حالا تصور کنید که در محیطی که کار میکنید، authentication به وسیله‌ی یک ldap انجام میشه پس با اون password میشه به همه‌‌ی سرویس‌های پشت ldap لاگین کرد :(

خب حالا راه‌حل چیه؟


داکر استفاده از Credential store رو پیشنهاد داده. و Credential store مناسب برای سرورهای لینوکسی، pass نام داره. pass یک password manager برای محیط‌های unixای به شمار میره و با گرفتن یک کلید از gpg پسوردهای شما رو encode میکنه.

در قدم اول نیاز هستش که خود pass نصب بشه. پکیج pass تا جایی که بنده دیدم تو repositoryی اکثر توزیع‌های مجبوب وجود داره، مثلا در debian-basedها با کامند زیر میشه pass رو نصب کرد:

sudo apt update sudo apt install pass

بعد از نصب password manager باید docker-credential-pass که یک واسط بین سرویس داکر و pass به شمار میره رو با توجه به سیستم‌عامل و معماری مدنظرتون از این صفحه پیدا و دانلود کنید:

wget https://github.com/docker/docker-credential-helpers/releases/download/v0.8.2/docker-credential-pass-v0.8.2.linux-amd64
در اینجا نسخه‌ی ذکر شده 0.8.2 هست. شما خودتون آخرین ورژن release شده یا هر ورژن دیگه‌ای که میخوایید رو میتونید دانلود کنید.

نکته‌ای که در اینجا وجود داره این هست که اسم فایل دانلود شده حتما باید فاقد شماره‌ی ورژن و توضیحات اضافی باشه، یعنی دقیقا اسم فایل باید docker-credential-pass باشه پس فایل رو تغییر نام میدیم:

sudo mv ./docker-credential-pass-v0.8.2.linux-amd64 /usr/bin/docker-credential-pass

فایل دانلود شده در هر مسیری برای docker قابل استفادس، به شرطی که اون مسیر داخل PATH باشه (برای همین موضوع با کامند بالا فایل docker-credential-pass رو علاوه بر تغییر نام، به مسیر /usr/bin هم منتقل کردم)

در اخر هم باید به فایل قابلیت اجرا شدن بدیم (فایل رو executable کنیم):

sudo chmod +x /usr/bin/docker-credential-pass

در قدم بعدی لازم هست که یک کلید با gpg بسازیم:

gpg --full-generate-key

خروجی دستور بالا شامل یک public key هست. کلید رو کپی می‌کنیم تا در دستور زیر ازش استفاده کنیم:

pass init <public-key>

با دستور بالا یک پسورد استور initialize، و درنتیجه مسیر زیر ساخته میشه:

~/.password-store/

و همه‌ی پسوردهای مربوط به داکر در مسیر زیر قابل مشاهده هستن:

~/.password-store/docker-credential-helpers/

حالا همه‌چیز آمادس تا docker از pass استفاده کنه.


برای اینکه از docker بخواییم تا از pass استفاده کنه باید در قدم اول از container registryها logout کنیم، و بعد در مسیر

~/.docker/config.json

خط زیر رو به فایل کانفیگ docker اضافه کنیم:

حالا با login کردن به container registry (مثلا docker hub) می‌بینیم که دیگه خبری از username و password نیست، وdocker مشخصات container registry رو در فایل کانفیگ بالا، اینطوری مینویسه:


در فایل‌سیستم هم ساختار password store فعلی به شکل زیر میشه:

ساختار password store
ساختار password store

در ساختار بالا، برای آدرس هر container registry به شکل base64 یک دایرکتوری ساخته میشه و هر کدوم از این مسیرها شامل فایل‌هایی هستن که اسم فایل‌ها username کاربرهای login کرده، و محتوای هر فایل هم پسورد encode شده‌ی متناسب با اون username هستش.


امیدوارم این مطلب براتون مفید بوده باشه. اگر قلم یا توضیحاتم، واضح یا کافی نبود به بزرگی خودتون ببخشین و برای بهتر شدنش پیشنهادتون رو کامنت کنید.

ممنون که وقت گذاشتید و خوندید.

dockerpassداکرdocker credential helpersdocker login
AmirHossein Sa
شاید از این پست‌ها خوشتان بیاید