..

مدیریت امن secret ها تو محیط توسعه و زیرساخت

قبل از اینکه مقاله رو بنویسم فکر نمیکردم انقدر طولانی و مفصل بشه ولی برای خودمم عجیب شد که چقدر روش ها و رویکرد ها برای مدیریت رمز و رموز توسعه نرم افزار زیاده پس اگه جایی از قلم افتاده یا نیاز به توضیحات بیشتر وجود داره خوشحال میشم که فیدبکتون رو برام بفرستید حالا چه تو شبکه های اجتماعی چه تو کامنت های بلاگ

یکی از چالش هایی که همه دواپس ها و توسعه دهنده ها باهاش رو به رو میشن یه روش امن و صحیح برای ذخیره پسورد ها و credentials و secrets تو محیط های مختلف توسعه است

قبل از اینکه سراغ اینکه چه روش هایی برای مدیریت این secrets های حساس وجود داره بزارین درمورد این صحبت کنیم که چه الگوهای غلطی1 برای مدیریت secret ها تو دنیای نرم افزار وجود داره تا با شناختنشون از اون ها جلوگیری کنیم

الگوهای های غلط مدیریت secret ها

به اشتراک گذاری پسورد ها

همه ما عادت داریم که از ابزارهای مسیجینگ مثل slack برای پیام دادن به همکارهامون استفاده کنیم اما به اشتراک گذاری secret ها چرا تو slack عاقلانه نیست

  • شرکت slack ممکنه هک بشه و اونوقت history مکالمه های ما کف دست هکراست
  • ما همه از ابزارهای integration برای مدیریت راحت تر slack استفاده میکنیم. اگه به هر دلیلی این third-party ها شروع کنن به جمع آوری و پایش history ما این وضعیت دوست داشتنی برای ما نخواهد بود

اما این تنها بدی استفاده از یه پسورد مشترک برای همه چیز نیست تصور کنید یکی از اعضای تیم جدا بشه اونوقت مطمعا باشید اگه از یه پسورد مشترک برای همه نرم افزارهای خودتون استفاده کرده باشید قرار نیست که عوضش کنید و این خودتون و کمپانی رو هم تو ریسک میندازه

اشتراک گذاری secret ها به وسیله ایمیل یا online storage

تصور کنید شرکت شما از یه mail server خصوصی استفاده میکنه این به این معنی نیست که همه مکالمه های شما امنه

  • اگه کاربرای شرکت از web client برای دسترسی به ایمیل های خودشون استفاده میکنن احتمال اینکه یه افزونه غیر مجاز دلش بخواد محتوای ایمیل کاربر رو بخونه وجود داره
  • احتمال این وجود داره که به صورت اتفاقی ایمیل هایی که حاوی محتوای حساس هستن برای آدمایی که نباید فوروارد بشن
  • اگه ایمیل کاربرمون هک بشه خیلی وضعیت بدی میشه
  • مدیریت این همه پسوردی که قراره به وسیله ایمیل به آدم های مختلف فرستاده بشن عملا غیر ممکنه و هیچ منبع قابل اطمینانی وجود نداره که باور داشته باشیم secret ای که فرستاده شده عملا همون چیزی که تو محیط وجود داره.

اوضاع درمورد online storage ها به مراتب بدتره. تصور کنید که قراره یه password رو به وسیله google drive برای یه کاربر دیگه share کنید

  • شما خیلی به گوگل اعتماد دارید که محتوای فایل رمزنگاری نشده شما رو نخونه
  • شما خیلی به کاربر خودتون اعتماد دارید که از پسورد سخت برای اکانت گوگلش استفاده میکنه یا 2FA رو برای اکانتش فعال کرده
  • اگه به هر دلیلی سیستم کاربرتون هک بشه پسورداتون کف دارک وبه

اشتراک گذاری credentials به وسیله مخزن رمزنگاری نشده

خیلی شایعه که برنامه نویس ها برای API از credentials استفاده کنن

  • بدترین سناریو اینه که secret تو کد hardcode شده باشه اینشکلی هرکسی که به source code دسترسی داشته باشه میتونه بره یه چرخ تو محتوا API یا سرویس ما بزنه
  • مدل دوم اینه که secret تو یه فایل .env ذخیره شده باشه اونوقت عملا rollout کردن secret های جدید منوط به redeploy کردن رو پروداکشنه.
  • تو شرایطی که یکی از اعضای تیم کمپانی رو ترک کرده باشه و یهو بزنه به سرش که بزنه پروداکشن رو بترکونه ( دلش پره از دست شرکت ) راه سریعی برای جلوگیری دسترسیش وجود نداره

صرف نظر کردن از env به وسیله gitignore

یکی از متولودوژی های مرسوم توسعه نرم افزار The twelve-factor app هستش. سومین فاکتور این متودولوژی به صراحت میگه که secret باید تو env ذخیره و استفاده بشن. این به خودی خودش بد نیست که ما env ها رو از هم تفکیک کنیم و به وسیله .gitignore از اینکه یهو به مخزن ما راه پیدا کنن جلوگیری کنیم

ولی اینکار بدون ابزار مناسب و صرفا به همین سادگی باعث میشه که فرایند دیباگ کردن نرم افزار مخصوصا وقتی تیم ها بزرگ هستن تبدیل به فاجعه بشه

بزارید یه مثال بزنم تصور کنید ما یه app ساده nodejs داریم که قراره تو سه محیط

.env.dev
.env.stg
.env.prod 

دیپلوی بشه. از اونجایی که این مقادیر فقط روی سرور های ما و سیستم دولوپرمون وجود دارن دواپس یا باید دسترسی تیم توسعه رو به هر سه محیط باز کنه که به خودی خودش اصلا روش خوبی نیست یا اینکه تیم به روش های بالا که گفتیم ناامن هستن credentials رو بین خودشون به اشتراک بزارن

اما چه روش های امنی برای به اشتراک گذاری و استفاده از secrets وجود داره ؟

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

اینجا میخوام درمورد چند روش خیلی شایع برای رمزنگاری و به اشتراک گذاری credentials ها صحبت کنم

ابتدا بریم سراغ password ها برای انسان ها و بعد به سراغ credentials برای ماشین ها

مدیریت پسورد ها

همین چند ماه قبل بود که last-pass برای چندمین بار هک شد و اطلاعات دیتابیس شرکت به کلی leak شد البته که اگه از یه master-password سفت و سخت استفاده میکنین به این راحتی ها امکان crack شدن دیتابیس رمز هاتون نمیره ولی به هر صورت این نشون میده که برای مدیریت پسورد ها باید به سراغ سرویس ها یا نرم افزارهایی رفت که آزمون خودشون رو پس داده باشن

نرم افزارهای انلاین مدیریت پسورد

مزیتی که این نرم افزارها مثل 1password دارن اینه که کار رو خیلی راحت میکنن شما یه vault شخصی خواهی داشت و shared vaults که به راحتی میشه بینشون پسورد ها رو به اشتراک گذاشت. هم رابط کاربری خوب و هم پشتیبانی خوب از cli و api از مزیت های دیگه cloud password manager مثل 1password هستش که باعث میشن اون anti-pattern هایی که بالا گفتیم درمورد این ابزار صادق نباشه.

اما از بدی ها میشه گفت که شما چقدر به این شرکت ها اطمینان دارید؟

نرم افزار های آفلاین مدیریت پسورد

keepass

آشنایی من با keepass برمیگرده به شرکت فناپ و مدیر خوب و فهیمم ناصر خلقی که منو با این ابزار آشنا کرد.

این ابزار از یک کلید متفارن برای رمزنگاری دیتابیس خودش استفاده میکنه و اگه به دیتبایس منیجر های انلاین اعتماد ندارید گزینه خیلی خوبیه. کافیه که فایل دیتابیس رو از طریق git یا file storage بین اعضای تیم به اشتراک بذارید

pass

یکی از ابزارهای افلاین امن و پرطرفدار بین اهالی gnu/linux نرم افزار pass هستش که از کلید نامتقارن gpg برای رمزنگاری استفاده میکنه از مزیت هایی که این ابزار رو به keepass برتری میده اینه که میشه key-id اعضای مختلف تیم رو به صورت مجزا sign کرد به این صورت بدون به اشتراک گذاشتن یه کلید متقارن بین اعضای تیم میشه از مزیت اینکه هرکسی با gpg key خودش مشارکت کنه استفاده کرد.

مدیریت credentials

تفاوت credentials و secrets

نرم افزار های مدیریت انلاین credentials

azure kv
aws secret manager
hashicorp vault

نرم افزار های افلاین مدیریت credentials

git-crypt
sops
  1. Anti-pattern