আমাদের আগের আর্টিকেলে, The Rubyist's Guide To Environment Variables-এ, আমরা দেখিয়েছিলাম এনভায়রনমেন্ট ভেরিয়েবল সিস্টেম কীভাবে কাজ করে এবং কিছু সাধারণ ভ্রান্ত ধারণা ভাঙলাম। কিন্তু একজন সহায়ক পাঠক দেখিয়েছিলেন, আমরা সিকিউরিটি সম্পর্কে কিছুই বলিনি।
যেহেতু এনভি ভেরিয়েবলে সিক্রেট API কি এবং অন্যান্য মূল্যবান ইনফরমেশন স্টোর করা এখন সাধারণ ব্যাপার, তাই সিকিউরিটি ইমপ্লিকেশন বোঝা গুরুত্বপূর্ণ। দেখি:
সর্বোচ্চ খারাপ পরিস্থিতি
কল্পনা করুন একজন হ্যাকার আপনার সার্ভারে রুট অ্যাক্সেস পেয়েছে, অথবা আপনার ওয়েব অ্যাপ্লিকেশন মালিক ইউজার হিসেবে। সেক্ষেত্রে, আপনার এনভায়রনমেন্ট ভেরিয়েবল কম্প্রোমাইজড হবে, সেই সাথে অন্য সব কিছু যা হাইই এনক্রিপ্টেড নয়।
সমাধানটি হলো লোকেদের আপনার সার্ভারে রুট অ্যাক্সেস পাওয়া থেকে বাধা দেওয়া। :)
দ্য ট্রোজান হর্স
ডকে পাশের গলিতে একজন লোক আপনাকে একটি স্পেশাল সুপ-আপ ভার্সন ImageMagick দিয়েছে। সে দাবি করছে এটা স্টক ImageMagick-এর চেয়ে দ্বিগুণ দ্রুত চলবে।
...তাই আপনি वही করেছেন যা কেউই করত। প্রোডাকশনে ইনস্টল করলেন। একমাত্র সমস্যা হলো এটি আপনার এনভায়রনমেন্ট ভেরিয়েবল চুরি করার জন্য ডিজাইন করা।
এখানে, আমি আমাদের "ম্যালিশাস" mogrify কমান্ড রান করছি রুবি থেকে, ব্যাক-টিক্স সিন্ট্যাক্স ব্যবহার করে। Mogrify তারপর আমার এনভায়রনমেন্ট ভেরিয়েবল চুরি করে এবং একটি চ্যালেঞ্জিং মেসেজ প্রিন্ট করে।
এনভায়রনমেন্ট ভেরিয়েবল প্যারেন্ট প্রসেস (irb) থেকে চাইল্ড প্রসেসে (mogrify) কপি হয়
এটি আসলে কোনো "হ্যাক" নয়। এটিই হলো এনভায়রনমেন্ট ভেরিয়েবল কীভাবে কাজ করে। সেগুলো প্যারেন্ট প্রসেস থেকে চাইল্ড প্রসেসে কপি হয়। আপনি যদি ম্যালওয়্যার চালান, তবে সেটিও অন্য যেকোনো অ্যাপের মতো এনভি ভেরিয়েবল ইনহেরিট করবে।
এটি দুভাবে হতে পারে:
কারো আপনাকে আপনার টুলচেইনে একটি ম্যালিশাস সফ্টওয়্যার ইনস্টল করার জন্য убедить করল
আপনার টুলচেইনের একটি "বেনাইন" পিসে একটি ভালনरेবিলিটি আছে এবং এক্সপ্লয়েট হয়ে আপনার এনভায়রনমেন্ট ভেরিয়েবল উজাগর করল।
আসল সমাধান হলো এই দুটোই হয় না তা নিশ্চিত করার জন্য প্রোएक্টিভ থাকা। কিন্তু একটি প্রিকশনারি স্টেপ নেওয়া যাবে যাতে কোনো ENV চুরি করার বান্দিত আপনার টুলচেইনে घুসলেও ক্ষতি সীমিত থাকে।
এনভায়রনমেন্ট স্যানিটাইজ করা
যখনই আপনি রুবি থেকে শেল আউট করে ImageMagick বা অন্য কোনো প্রোগ্রাম চালান, সেটি আপনার অ্যাপের ENV-র একটি কপি ইনহেরিট করে। আপনার ENV-এ কোনো সিক্রেট থাকলে, সেটিও পাবে। না হলে আপনি সেগুলো রিমুভ করুন।
আপনি নতুন প্রসেস তৈরি করার সময় নির্দিষ্ট এনভায়রনমেন্ট ভেরিয়েবল ওভাররাইড করতে পারেন, `system` মেথডে একটি হ্যাশ পাস করে:
রুবির `system` মেথডে কাস্টম এনভায়রনমেন্ট ভেরিয়েবল পাস করার উপায়
যদি আপনি শেল কমান্ড রান করার সময় কোনো এনভায়রনমেন্ট ভেরিয়েবল পাঠাতে না চান, তবে নিচের মত কিছু করতে পারেন। এখানে আমরা একটি হ্যাশ বানাচ্ছি যা ENV-কে মিরর করে, সिवায় এর সব ভ্যালু `nil` সেট করা আছে। এটি সুন্দর না হলেও, শেল কমান্ড এক্সিকিউট করার সময় সব এনভি ভেরিয়েবল রিমুভ করার একমাত্র উপায় যা আমি খুঁজে পেলাম।
রুবি থেকে শেল কমান্ড রান করার সময় কোনো এনভায়রনমেন্ট ভেরিয়েবল না পাঠানো
বাথওয়াটারের সাথে বাচ্চাও ফেলবেন না
ইনহেরিটেন্স ENV ভেরিয়েবলের সবচেয়ে উপকারী ফিচারগুলোর একটি।
ধরুন আপনাকে একটি কমান্ড চালাতে হবে যা S3-এ রাইট করে। এনভায়রনমেন্ট ভেরিয়েবল ইনহেরিটেন্স মানে কমান্ডটি আপনার রুবি অ্যাপ থেকে API কি শেয়ার করতে পারে সিমলেসলি। আপনি যদি কখনো ইনহেরিটেন্স আলাউ না করেন তবে সেই ক্ষমতা হারিয়ে যাবেন।
পার্সিস্টেন্স
প্রতিটি প্রসেসের নিজস্ব এনভায়রনমেন্ট ভেরিয়েবল সেট থাকে যা প্রসেস মরলে মরে যায়। আপনি আপনার রুবি অ্যাপে এনভায়রনমেন্ট ভেরিয়েবল সেট করতে পারেন, কিন্তু অ্যাপ কয়িট করলেই সেগুলো গায়েব হয়ে যাবে।
আপনি যদি রিবুটের পরেও এনভায়রনমেন্ট ভেরিয়েবল রাখতে চান, তবে সেটি কোথাও স্টোর করতে হবে। সেটি সাধারণত ফাইলসিস্টেমে থাকে।
আপনার অ্যাপের গিট রিপো ব্যবহার করবেন না
আমি নিশ্চিত GitHub-এর ফোকসরা আমাদের মতোই ইমানদার, কিন্তু কি আপনি চান যে আপনার সোর্স কোডে অ্যাক্সেস আছে সেটা সবাই আপনার API কি পেয়ে $১০,০০০ AWS বিল করুক?
.bashrc বা .bash-profile সিক্রেটের জন্য ব্যবহার করবেন না
যখন আপনি .bashrc-তে সিক্রেট স্টোর করেন, সেগুলো সেই ইউজার হিসেবে রান করা যেকোনো প্রোগ্রামে এনভায়রনমেন্ট ভেরিয়েবল হিসেবে পাঠানো হয়। অধিকাংশ প্রোগ্রাম আপনার সিক্রেট জানার প্রয়োজন নেই। তাই কেন দেবেন?
শুধু প্রয়োজনীয় প্রসেসের সাথে সিক্রেট শেয়ার করুন
আপনার রেইলস অ্যাপ যদি একমাত্র প্রসেস হয় যাকে `HONEYBADGER_API_KEY` জানার প্রয়োজন, তবে সেটি শুধু সেই প্রসেসে উপলব্ধ করানো ভালো আইডিয়া।
কई জেম আছে যা আপনাকে একটি ফাইলে এনভায়রনমেন্ট ভেরিয়েবল যোগ করতে দেয় যা রেইলস স্টার্ট হলে লোড হয়। এই এনভি ভেরিয়েবলগুলো শুধু আপনার রেইলস প্রসেস এবং এর চাইল্ড প্রসেসগুলোর জন্য উপলব্ধ। Figaro এবং Dotenv জেমের বিষয়ে The Rubyist's Guide To Environment Variables-এর নিচে একটি সেকশন আছে।
কনফিগারেশন ফাইল সিকিউর করুন
আপনি যদি কনফিগারেশন ফাইল থেকে এনভায়রনমেন্ট লোড করেন, তবে নিশ্চিত করুন এর পারমিশন সেট করা আছে যাতে শুধু আপনার ওয়েব অ্যাপ চালানোর ইউজারই পড়তে পারে।
এখানে, আমি আমার কনফিগ ফাইলকে শুধু পড়তে ও লিখতে দিচ্ছি যে ইউজারটি এটি তৈরি করেছে। এই কেসে, সেটি আমার রেইলস অ্যাপ্লিকেশন মালিক ইউজারের সাথে একই:
কনফিগারেশন ফাইল শুধু প্রয়োজনীয় ইউজার পড়তে পারবে এমনভাবে করুন
যেহেতু আপনি এটি গিটহাবে চেক-ইন করছেন না, তাই আপনাকে সার্ভারে SSH করে ম্যানুয়ালি এডিট করতে হবে অথবা Chef-এর মতো টুল ব্যবহার করে ম্যানেজ করতে হবে।
যেখানে সম্ভব "ফায়ারওয়াল" বানান
AWS-এর খুব ভালো একটা জিনিস হলো এটি সুপার গ্রানুলার এক্সেস কন্ট্রোল পলিসি বানাতে দেয়। অনেক সার্ভিস প্রোভাইডারের এটার মত ফিচার থাকে।
এটার মানে কী? মানে আপনি একটি সেট API কি রাখতে পারেন যা শুধু একটি সিঙ্গেল S3 বাকেটে আপলোড করার অনুমতি দেবে। আপনি আলাদা আলাদা এক্টিভিটির জন্য আলাদা কিপেয়ার বানান। একটি ইমেজ আপলোডের জন্য। অন্যটি ডেটাবেস ব্যাকআপের জন্য। ইত্যাদি।
এভাবে অপারেট করলে আপনি যেকোনো একটি সিকিউরিটি ব্রিচের ক্ষতি সীমিত রাখতে পারেন।