تکنولوژی
KeyMeld: کلید مشترک برای آیفون و اندروید و معماری Zero Vault برای پروژه
KeyMeld به خودی خود Zero Vault نیست. این سرویس SaaS جداگانهای است که به توسعهدهنده کمک میکند تا کلید عمومی و معماری Zero Vault را برای پروژه خود پیادهسازی کند، مشتریان iOS و Android را یکپارچه سازد و ساختار امنیتی مشترک ایجاد کند.
اپلیکیشنهای چندپلتفرمی با مشکلی مواجه هستند که معمولاً کاربر متوجه آن نمیشود. در صفحه نمایش، او یک حساب کاربری میبیند و انتظار دارد که در هر دستگاه، عملکرد یکسانی داشته باشد. اما در داخل، iPhone و Android از مکانیزمهای متفاوت حفاظتی استفاده میکنند و به گونهای متفاوت با کلیدهای محلی کار میکنند.
برای آیفون، اپلیکیشن میتواند کلید محلی دستگاه را با استفاده از Apple Keychain محافظت کند. در اندروید، این کار توسط Android Keystore انجام میشود. این فناوریها برای نگهداری ایمن کلیدهای حساس در محیط امن دستگاه طراحی شدهاند، اما جایگزین یکدیگر نیستند.
برای کاربر، این تفاوت اهمیت ندارد. او فقط میخواهد اپلیکیشن را روی آیفون باز کند، سپس روی اندروید نصب کند و با همان دادههای محافظتشده کار کند.
برای توسعهدهنده، این سوال معماری به وجود میآید که چگونه دسترسی مشترک در دو پلتفرم را بدون انتقال کلیدهای محلی دستگاه و بدون کپیکردن آنها در پایگاه داده سرور توسعه دهد.
در بررسی KeyMeld، دیدم که این سرویس برای این منظور کلید عمومی جداگانهای پیشنهاد میدهد بدون اینکه درون محافظت داخلی iOS و Android دخالت کند.
کلید عمومی برای پلتفرمهای مختلف
کلید محلی دستگاه به دستگاه خاص مربوط است و با استفاده از امکانات سیستمعامل مربوطه محافظت میشود. این کلید در محیط امن دستگاه باقی میماند و برای انتقال آزاد بین دستگاهها طراحی نشده است.
کلید عمومی جهانی KeyMeld—بنیاد دیگری است. این کلید برای پروژه خاص، حساب کاربری و فضای محافظتشده ایجاد میشود و برای مشتریان مجاز بر روی پلتفرمهای مختلف، مشترک است.
این سرویس کلید را از آیفون نمیگیرد، به اندروید نمیبرد و تلاش نمیکند دو کلید مجزا را به یکی تبدیل کند. حفاظت پلتفرمی مستقل باقی میماند و اپلیکیشن سطح مشترکی از دسترسی را برای پروژه خود دریافت میکند.
این است نقش معماری KeyMeld. او آیاواس و اندروید را یکسان نمیکند و مکانیزمهای داخلی آنها را جایگزین نمیسازد. بلکه، یک سطح مشترک کار با کلید عمومی را اضافه میکند، که از این طریق، توسعهدهنده دیگر نیاز ندارد خودش مدیریت توزیع پلتفرمی این کلید را انجام دهد.
برای محصولات و حسابهای مختلف، مسیرهای کلید جداگانهای تعریف میشود. بنابراین، هر پروژه حوزه دسترسی خاص خود را دارد و چند حساب کاربری روی یک دستگاه، جدا باقی میمانند.
Zero Vault متعلق به پروژه است
در همان ابتدا، باید توضیح داد که Zero Vault نام خود KeyMeld نیست. این یک مدل معماری است که محصول متصل میتواند آن را پیادهسازی کند.
KeyMeld به عنوان سرویس SaaS جداگانه عمل میکند. آن در درون backend برنامه نصب نمیشود و کنار پایگاه داده پروژه قرار نمیگیرد، بلکه در یک کانتینر SaaS جداگانه مدیریت میشود. کلید عمومی توسط یک کانتینر SaaS جدا به نام KeyMeld نگهداری میشود، خارج از حوزه backend خود محصول.
برای حفظ این مدل، مرزهای اعتماد میان پروژه و KeyMeld باید مستقل باقی بمانند. اعتبارسنجی آنها با دادههای جداگانه، مجوزها و مکانیزمهای مدیریت جدا انجام میشود.
این نتیجه در معماری پروژه، «مدل Zero Vault» نامیده میشود: بانک اطلاعات سرور کلید از مخزن محافظتشده مشتری، نگهداری نمیکند.
Zero Vault به این معنا نیست که backend برنامه هرگز کلید عمومی را ذخیره نمیکند. حساب کاربری، تنظیمات، دادههای تجاری و تمام موارد لازم برای عملکرد برنامه بر روی سرور باقی میماند، اما کلید عمومی در کنار آنها نیست.
در صورت نفوذ به بانک اطلاعات سرور، کلید جهانی فاش نمیشود، چون کنار حسابها و دادههای دیگر سرور، ذخیره نشده است. اما این مدل تضمین نمیکند که هر گونه خطای احتمالی در زیرساخت، به طور خودکار بیضرر است. مسئله اصلی حذف کلید عمومی از مخزن محافظتشده مشتری است.
سناریوی زنده: یک حساب کاربری در آیفون و اندروید
فرض کنیم برنامهای با دادههای محافظتشده محلی داریم. این ممکن است یک ابزار احراز هویت، برنامه شرکتی یا هر سرویس دیگری باشد که نیاز دارد اطلاعات رمزگذاری شده را مستقیماً بر روی دستگاه کار کند.
در آیفون، اپلیکیشن کلید محلی را با امکانات iOS محافظت میکند. در اندروید، مکانیزم محافظت اختصاصی Android مورد استفاده قرار میگیرد. کلیدهای داخلی دستگاهها متفاوت است و این طبیعی است.
بدون لایه مشترک جدا، توسعهدهنده باید راهی برای سازماندهی دسترسی به همان دادههای محافظتشده در هر دو پلتفرم پیدا میکرد. نگهداری پلتفرمی، همچنان، جدا باقی میماند، و محصول نیاز داشت که این دو پیادهسازی را بهطور مستقل مدیریت کند.
میشد برای iOS و Android طرحهای جدا گانه ایجاد کرد، کلیدهای محلی را دستی منتقل یا کپی در سرور نگه داشت.
اما KeyMeld امکان حذف انتقال کلیدهای محلی و نگهداری نسخههای سروری آنها را فراهم میکند، و در عوض کلید عمومی مشترک را معرفی میکند.
کلاینت آیفون و کلاینت اندروید، به یک کلید عمومی مشترک در قالب پروژه و حساب کاربری مجاز دسترسی دارند. در عین حال، هر تلفن همچنان از مکانیزمهای حفاظت خود استفاده میکند.
برای کاربر، این ظاهر همان است که یک حساب کاربری در دستگاههای مختلف باشد. نیازی نیست بداند چه مکانیزمی در داخل آیفون کار میکند و چه در Android.
در هنگام تغییر گوشی، نیاز نیست کلید محلی از دستگاه قدیمی صادر شود یا یک نسخه محافظتشده جدید برای پلتفرم جدید ساخته شود. کلاینت جدید به همان پروژه متصل میشود و به همان کلید عمومی دسترسی پیدا میکند.
backend درخواست مجوز را مدیریت میکند، اما کلید عمومی تنها برای کلاینت مجاز است و در بانک اطلاعات محصول ذخیره نمیشود.
خود KeyMeld، پایگاه داده برنامه را منتقل نمیکند و جایگزین همآهنگی ثبتهای کاربر نمیشود. وظیفهاش تنها فراهمکردن کلید برای کاربر است جهت کار با دادههای محافظتشده، و ذخیرهسازی و بهروزرسانی مخزن بر عهده محصول است.
سه نوع کلید و راز مختلف
برای جلوگیری از اشتباه، سه مفهوم را باید متمایز کرد:
کلید محلی دستگاه مختص یک تلفن است و با ابزارهای iOS یا Android محافظت میشود.
کلید عمومی برای کاربران مجاز در یک پروژه و حساب کاربری خاص استفاده میشود. این کلید است که سطوح پلتفرمهای مختلف را در سطح خود محصول به هم مرتبط میسازد.
راز سرویس برای ارتباط امن backend با KeyMeld است. این راز به برنامه موبایل یا مرورگر منتقل نمیشود.
راز سرویس و کلید عمومی وظایف متفاوتی دارند. در معماری Zero Vault، کلید عمومی در بانک اطلاعات محصول نگهداری نمیشود، بجز دادههای مربوط به backend.
برای کار کردن با KeyMeld، نام کاربری، رمز عبور، اطلاعات ذخیرهساز TOTP یا محتوای ثبتها مهم نیستند. تنها مهم است که پروژه، حساب کاربری و حقوق دسترسی برای دریافت کلید عمومی برقرار باشد.
دسترسی به کلید همچنان قابل مدیریت است
دریافت کلید عمومی، حق طبیعی هر کاربر نیست.
اگر دستگاه دیگر اعتمادپذیر نباشد، وضعیت حساب تغییر کند یا دسترسی به پروژه لغو شود، KeyMeld میتواند ادامه صدور کلید عمومی را به آن کاربر متوقف کند.
در اینجا، نباید نتیجهگیریهای بیش از حد داشت. این بدان معنا نیست که کلید محلی موجود، فورا حذف میشود. بلکه، کنترل بر ادامه دریافت کلید و افزودن کاربران جدید اعمال میشود.
برای کاربر، این به معنای وارد کردن دستگاههای جدید و مدیریت دسترسی آنها به توزیع کلید است، که در قالب یک سیستم واحد قرار میگیرد.
برای توسعهدهنده، یعنی نیاز نیست این منطق را جداگانه برای iOS و Android پیادهسازی کند. مدل نهایی Zero Vault همچنان به ذخیره کلید عمومی پروژه و جدا بودن میان زیرساخت خودش و کانتینر SaaS خارجی KeyMeld بستگی دارد.
ملاحظات مربوط به KeyMeld
KeyMeld مدیر رمز عبور نیست و رکوردهای TOTP کاربر را نگهداری نمیکند. او نمیشود پایگاه داده ابری برنامه و جایگزین همگامسازی محتوا شود.
این جایگزین Apple Keychain یا Android Keystore نیست. سرویس، مکانیزمهای محلی پلتفرمها را در جای خود باقی میگذارد و فقط یک لایه عمومی برای محصول اضافه میکند.
این سرویس همچنین الزاماً، سیستم شناسایی کاربر نیست. برای احراز هویت و مجوز، میتواند سرویس مجزایی مانند MeldID باشد، در حالی که KeyMeld وظیفه دیگری دارد—ارائه کلید عمومی واحد به کلاینت مجاز، بدون قرار دادن آن در backend محصول.
در نهایت، KeyMeld، Zero Vault را به صورت خودکار نمیسازد. او یک کانتور خارجی از کلید عمومی پروژه فراهم میکند. برای حفظ این معماری، توسعهدهنده نباید کلید عمومی را در پایگاه داده سرور خود نگهدارد و نباید حوزههای اعتماد مستقل را با هم مخلوط کند.
چه کسی ممکن است به این نیاز داشته باشد
این رویکرد برای برنامههایی که همزمان بر چند پلتفرم کار میکنند و از دادههای محلی محافظتشده استفاده میکنند، مناسب است.
مانند ابزارهای احراز هویت، برنامههای شرکتی، محصولات SaaS، سرویسهایی با چندین دستگاه، و هر پروژهای که یک حساب کاربری باید در آیفون و Android با همان سازوکار عمل کند.
برای توسعهدهنده، ارزش بیشتر در کاهش منطق پلتفرم است. اهمیت اصلی، تقسیم مسئولیت است. backend محصول دادههای خودش را نگهداری میکند، در حالی که KeyMeld، به عنوان سرویس SaaS خارجی، کلید عمومی را فراهم و مدیریت میکند.
پس از بررسی پروژه، من KeyMeld را نه به عنوان یک Zero Vault آماده، بلکه به عنوان ابزاری دیدم که توسعهدهنده با کمک آن میتواند چنین مدلی را برای محصول خود بسازد.
آیاواس و اندروید، هنوز هم از مکانیزمهای حفاظت مخصوص خود استفاده میکنند. کلاینتها، به یک کلید عمومی مشترک دسترسی دارند. و backend برنامه، اگر این کلید را نگه نمیدارد و ارتباط میان زیرساخت خودش و کانتینر SaaS خارجی KeyMeld را جدا میکند، دیگر امنترین مکان برای نگهداری کلیدهای مخفی از مخزن محافظتشده مشتری نیست.
برای کاربر، این یعنی دسترسی واحد در چند پلتفرم. برای توسعهدهنده، امکان انتقال کلید عمومی خارج از backend خودش. و برای کل پروژه، معماری Zero Vault که سرور برنامه کلید محافظتشده مشتری را نگهداری نمیکند.
بیشتر درباره پروژه: KeyMeld