কী তৈরি করতে অস্থায়ী ফাইল লাগে না, আর একটি বাদ দেওয়া বেশিরভাগ নির্দেশিকার ইঙ্গিতের চেয়ে কম সমস্যা সারায়। এটি যা সরায় তা হলো একটি ফাইলের জীবনচক্র এবং তার চারপাশের পরিষ্কারের প্রতিযোগিতা। এটি যা অস্পর্শিত রাখে তা হলো পরে গোপনটি ফাঁস করার প্রতিটি সুযোগ। এই স্ক্রিপ্টগুলোর শুদ্ধতার সমস্যা সাধারণত অন্য জায়গায় থাকে, কারণ ডায়াগনস্টিক আর কী উপাদান ভিন্ন স্ট্রিমে ভ্রমণ করে।

ফাইলটি কখনোই আপনার ভাবা সেই প্রকাশ ছিল না

অস্থায়ী ফাইল একটি বাস্তব ঝুঁকি যখন এটি সবার পড়ার যোগ্য, যখন এটি ক্র্যাশ থেকে টিকে থাকে, বা যখন ব্যতিক্রমের পরে পরিষ্কারের ধাপ বাদ পড়ে। এগুলো সত্যি, আর এগুলো ঠিক করা মূল্যবান। এগুলো স্থানীয়, দৃশ্যমান এবং পরীক্ষা করা সহজও। পরিবর্তনটি নিছক সৌন্দর্যের ছিল বলে সিদ্ধান্তে আসার আগে নিজের স্ক্রিপ্টে প্রতিটির নাম দিন।

শান্ত ঝুঁকিগুলো নিচের দিকে বসে: ডিবাগিংয়ের সময় ছাপা কী, পুরো ফলাফল বস্তুটি সিরিয়ালাইজ করা ব্যতিক্রম, কোর ডাম্প লেখা ক্র্যাশ হ্যান্ডলার, আর ফাইলের পথ তারপর বিষয়বস্তু পাওয়া লগ সংগ্রাহক। অস্থায়ী ফাইল এড়ানো এগুলোর কোনোটির জন্যই কিছু করে না, এবং অন্যথায় বিশ্বাস করাই হলো যেভাবে সদিচ্ছার পুনর্লিখন গোপনটিকে আগের চেয়ে বেশি উন্মুক্ত রেখে যায়। পরিবর্তনটিকে ধারাবাহিকতায় একটি উন্নতি হিসেবে দেখুন, সমাধান হিসেবে নয়।

কোনো ফাইলের নাম না দিলে ক্লায়েন্ট কী লেখে

ক্লায়েন্টের বর্তমান সংস্করণগুলো আউটপুট পথ ছাড়া কী কমান্ড দিলে উৎপন্ন কী-টি স্ট্যান্ডার্ড আউটপুটে পাঠায়। এই নথিভুক্ত আচরণই মেমরিভিত্তিক পদ্ধতিকে কার্যকর করে, এবং এটি টুলটিকে একটি ডিভাইস পথে নির্দেশ করার পুরোনো কৌশলের প্রয়োজন সরিয়ে দেয়।

import subprocess
proc = subprocess.run(
    ["openvpn", "--genkey", "tls-crypt"],
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    check=True,
)
key_material = proc.stdout

কমান্ডটি একটি তালিকা হিসেবে দিন। এখানে কোনো শেল সম্প্রসারণ দরকার নেই, আর শেল চালু করলে আর্গুমেন্টের সীমা এমন উদ্ধৃতির ওপর নির্ভর করত যা আপনি নিয়ন্ত্রণ করেন না। স্ক্রিপ্ট যদি আপনার প্রত্যাশার চেয়ে ভিন্ন অনুসন্ধান পথে চলতে পারে, তবে অভীষ্ট নির্বাহযোগ্য ফাইলটি পরম পথে ব্যবহার করুন।

রিটার্ন কোডের পরীক্ষা ব্যর্থ আহ্বানের পরে সফলতার পথকে এগিয়ে যেতে দেয় না। এটি ছাড়া একটি খালি বাইট স্ট্রিং সামনে বইতে পারে এবং কেবল অনেক পরে ব্যর্থ হয়, সেই বিন্দুতে যেখানে কী-টি ব্যবহৃত হয় আর ত্রুটি বার্তায় আর তৈরি উৎপাদনের উল্লেখই থাকে না।

দুই স্ট্রিম, দুই অর্থ

স্ট্যান্ডার্ড আউটপুট কী বহন করে। স্ট্যান্ডার্ড ত্রুটি টুলটি আপনাকে যা বলতে চায় সব বহন করে, কনফিগারেশন, সংস্করণ ও কী-র ধরন নিয়ে সতর্কবার্তা সহ। দুটোকে এক বাফারে পুনর্নির্দেশ করাই সেই ভুল যা বিশ্বাসযোগ্য দেখতে একটি কী উৎপন্ন করে যার মাঝখানে একটি বাক্য সেলাই করা।

ব্যর্থতার পথটিও আলাদা রাখুন। আহ্বান ব্যর্থ হলে, ব্যর্থ হওয়া কমান্ডটি ও প্রস্থান অবস্থা জানান, তারপর সচেতনভাবে ঠিক করুন স্ট্যান্ডার্ড ত্রুটির কোনো অংশ দেখানো নিরাপদ কি না। পুরো ফলাফল বস্তুটি লগে ফেলে দেওয়াই সাধারণ শর্টকাট, আর তা কী-টিকে সঙ্গে নিয়ে যেতে পারে।

পরে উপাদানটি হ্যাশ বা তুলনা করলে বাইনারি-নিরাপদ পাঠ গুরুত্বপূর্ণ। অপ্রত্যাশিত এনকোডিংসহ টেক্সট মোড এমন বাইট বদলে দিতে পারে যা কখনো টেক্সট হওয়ার কথা ছিল না, আর বদলে যাওয়া কী হ্যান্ডশেক ব্যর্থ হওয়ার আগে পর্যন্ত ভুল কী থেকে আলাদা করা যায় না।

যদি সত্যিই সংরক্ষণ করেন, সচেতনভাবে করুন

বেশিরভাগ স্থাপনা শেষ পর্যন্ত কী-টি ডিস্কে, গেটওয়েতে বা গোপন ভাণ্ডারে দরকার করে। এটি একবার লিখুন, সৃষ্টির সময় থেকেই সীমিত অনুমতি দিয়ে, পরবর্তী chmod দিয়ে নয়, আর লেখাটি পরমাণু করুন যাতে আংশিক ফাইল কখনো সেই ফাইল না হয় যা কোনো সেবা চালুর সময় পড়ে। একই ডিরেক্টরির পথ থেকে পুনর্নামকরণ সাধারণত এটির জন্য যথেষ্ট। ব্যর্থতার শাখায় স্টেজিং পথ সরান, কারণ ব্যর্থ লেখাটিই ঠিক সেই অনুলিপি যা মানুষ ভুলে যায়।

ফাইল তৈরির সময় তার মোড দিন, আর ডিরেক্টরির মোডও সীমিত রাখুন। এমন স্থানের নিচের কোনো পথ এড়িয়ে চলুন যা ব্যাকআপ কাজ চিন্তা না করেই ঝেঁটিয়ে নেয়, কারণ রাতের ব্যাকআপে থাকা গোপন সেই ব্যাকআপের প্রতিটি অনুলিপিতে গোপন। একই যুক্তি এমন একটি ভাগ করা ভলিউমেও খাটে যা অন্য সেবা পড়তে পারে।

ভাগ করা কী কোনো পরিচয় নয়

এই উপাদান উৎপন্ন করা কোনো সার্টিফিকেট দেয় না, ক্লায়েন্ট নথিভুক্ত করে না এবং কে সংযোগ করছে তা প্রতিষ্ঠা করে না। ভাগ করা কী এমন পক্ষগুলোর মধ্যে চ্যানেল রক্ষা করে যারা ইতিমধ্যে একে অপরকে বিশ্বাস করে; পরিচয় এখনো আসে সার্টিফিকেট থেকে এবং তার সামনে থাকা যে কোনো প্রমাণীকরণ থেকে।

কী-র ধরনগুলোও বিনিময়যোগ্য নয়। এক বৈশিষ্ট্যের জন্য প্রতিসম কী অন্য একটির জন্য প্রস্তুত বিকল্প নয়, আর নতুন সংস্করণগুলো প্রতিটি প্রান্তে ভিন্ন ফাইল নিয়ে নিজস্ব প্রকরণ যোগ করে। আপনার কনফিগারেশন সত্যিই যে ধরনের নাম বলে সেটিই উৎপন্ন করুন, তারপর সেটি সেই ভূমিকায় ব্যবহার করুন যা ওই ধরন নির্ধারণ করে।

ফাইলের আকার দেখে নয়, বাস্তব সংযোগ দিয়ে ফলাফল পরীক্ষা করুন। হ্যান্ডশেক সম্পূর্ণ হলে এবং লগে কোনো কী সতর্কবার্তা না থাকলে, উৎপাদনের পথ সঠিক; কী যদি মিলিত স্ট্রিমে কেটে যেত, তবে সংযোগটি এমনভাবে ব্যর্থ হতো যা স্ক্রিপ্টের নয়, প্রতিপক্ষের দিকে ইশারা করে।

সম্পর্কিত নিবন্ধ