সিক্রেটস স্প্রল: কীভাবে আমরা ৪১২টি লিক হওয়া টোকেন ঠিক করেছি
৩ মার্চ রাত ২:১৩ মিনিটে একটি CI পাইপলাইন ব্যর্থ হয়। আমরা ৩৭টি রিপোজিটরিতে ৪১২টি লিক হওয়া API টোকেন খুঁজে পাই। এই ত্রুটির কারণে সম্ভাব্য ১.২ মিলিয়ন ডলারের নিরাপত্তা লঙ্ঘনের ঝুঁকি তৈরি হয়েছিল।
বেশিরভাগ টিম মনে করে একটি Vault সব সমস্যার সমাধান করে দেয়। বাস্তবে, ল্যাটেন্সির (latency) ক্ষেত্রে একটি Vault একক ব্যর্থতার কারণ (single point of failure) হয়ে উঠতে পারে। যখন টোকেনগুলো Vault-এর বাইরে থাকে, তখন সেগুলো হার্ড-কোডেড ভ্যালু বা এনভায়রনমেন্ট ভেরিয়েবল হিসেবে ব্যবহৃত হয়। এই বিকল্প পদ্ধতিগুলো অডিট লগ-এ দেখা যায় না।
আমাদের মেট্রিক্স এই স্প্রলের খরচ দেখিয়েছে:
- সাধারণ সিক্রেট রিট্রিভাল: প্রতি রিকোয়েস্টে ৪৮ ms।
- লিকের সময়: প্রতি রিকোয়েস্টে ১৮৭ ms।
বিল্ড এজেন্টগুলো একটি দূরবর্তী Vault ক্লাস্টার থেকে প্রতি জবে ১২টি টোকেন সংগ্রহ করছিল। এর ফলে টাইমআউট হচ্ছিল এবং ডেভেলপারদের ম্যানুয়ালি পরিবর্তনগুলো রোলব্যাক করতে হচ্ছিল। ল্যাটেন্সি মানে কেবল একটি ধীর প্রক্রিয়া নয়; এটি একটি কস্ট সেন্টার যা ক্লাউড বিল বাড়িয়ে দেয় এবং ডেভেলপারদের কাজের গতি কমিয়ে দেয়।
একটি স্টেজিং রিপোজিটরিতে লিক হওয়া একটি AWS কী যদি কোনো আক্রমণকারী ব্যবহার করে, তবে তার খরচ হতে পারে প্রতি ঘণ্টায় ১২০ ডলার। মাত্র এক ঘণ্টার অপব্যবহার একটি ত্রৈমাসিক সিকিউরিটি অডিটের চেয়েও বেশি খরচ করতে পারে।
স্ট্যাটিক স্ক্যানারগুলো আমাদের ব্যর্থ করেছে। তারা আমাদের টোকেনগুলোর ৭৮% মিস করেছে। কেন? কারণ সেই টোকেনগুলো তাৎক্ষণিকভাবে (on the fly) তৈরি করা হয়েছিল এবং সেগুলো সোর্স কোডে নয়, বরং বিল্ড আর্টিফ্যাক্টে ছিল। একটি GitHub Actions স্টেপ একটি টোকেনকে Docker লেয়ারে লিখে ফেলেছিল। স্ক্যানার কিছুই দেখতে পায়নি, কিন্তু টোকেনটি আমাদের রেজিস্ট্রিতে কয়েক সপ্তাহ ধরে পড়ে ছিল।
আপনার কেবল স্ট্যাটিক ইন্সপেকশন নয়, বরং রানটাইম ভিজিবিলিটি প্রয়োজন।
এটি ঠিক করতে আমরা একটি Lambda ইঞ্জিন তৈরি করেছি। এটি নতুন সিক্রেটের জন্য CloudTrail পর্যবেক্ষণ করে এবং সেগুলোকে আমাদের Vault-এর সাথে তুলনা করে। নতুন ওয়ার্কফ্লোটি হলো:
- একটি ওয়েবহুকের (webhook) মাধ্যমে সিক্রেট শনাক্ত করা।
- মেটাডেটার জন্য Vault-এ কুয়েরি করা।
- প্রোভাইডার API-এর মাধ্যমে টোকেনটি ইনভ্যালিডেট করা।
- ফাইল থেকে সিক্রেটটি সরানোর জন্য একটি PR ওপেন করা।
- CI পাস করলে স্বয়ংক্রিয়ভাবে PR মার্জ করা।
এই ইঞ্জিনটি মাত্র ২৭ মিনিটে ৯৯.৯৭% সাফল্যের হার নিয়ে ৪১২টি টোকেন রোটেট করেছে।
আমরা এখন সিক্রেটের বয়স (age) ট্র্যাক করি। যদি কোনো টোকেন ৩০ দিনের বেশি পুরনো হয়, তবে বিল্ড ফেইল করে। এই সহজ নিয়মটি এক ত্রৈমাসিকে নতুন লিক ৬২% কমিয়ে দিয়েছে। আমরা অস্বাভাবিক ব্যবহারের প্যাটার্ন শনাক্ত করতে একটি isolation-forest মডেলও ব্যবহার করি। যদি কোনো টোকেন নতুন কোনো IP থেকে আসে, সিস্টেমটি তাৎক্ষণিকভাবে সেটি রোটেট করে দেয়।
টোকেনগুলোকে ফাইলের মতো দেখা বন্ধ করুন। সিক্রেটের বয়স এবং রিট্রিভাল ল্যাটেন্সিকে মূল মেট্রিক হিসেবে বিবেচনা করুন। আপনি যদি এটি করেন, তবে স্প্রল কমে আসবে।
ঐচ্ছিক লার্নিং কমিউনিটি: https://t.me/GyaanSetuAi
