পাইথন প্রোগ্রামটি ব্যবহার করার জন্য পাসওয়ার্ড এবং অন্যান্য গোপনীয়তা সংরক্ষণের জন্য কয়েকটি বিকল্প রয়েছে, বিশেষত এমন একটি প্রোগ্রাম যা ব্যাকগ্রাউন্ডে চালানো দরকার যেখানে এটি কেবল ব্যবহারকারীকে পাসওয়ার্ড টাইপ করতে বলতে পারে না।
সমস্যাগুলি এড়াতে:
- উত্স নিয়ন্ত্রণে পাসওয়ার্ডটি পরীক্ষা করা হচ্ছে যেখানে অন্যান্য বিকাশকারীরা এমনকি জনসাধারণ এটি দেখতে পারে।
- একই সার্ভারে থাকা অন্য ব্যবহারকারীরা একটি কনফিগারেশন ফাইল বা উত্স কোড থেকে পাসওয়ার্ড পড়ছেন।
- এমন একটি উত্স ফাইলে পাসওয়ার্ড থাকা যেখানে আপনি সম্পাদনা করার সময় অন্যরা এটি আপনার কাঁধের উপরে দেখতে পারে।
বিকল্প 1: এসএসএইচ
এটি সর্বদা একটি বিকল্প নয়, তবে এটি সম্ভবত সেরা। আপনার ব্যক্তিগত কী কখনই নেটওয়ার্কের মাধ্যমে প্রেরণ করা হয় না, এসএসএইচ আপনার কাছে সঠিক কী আছে তা প্রমাণ করার জন্য গাণিতিক গণনা চালায়।
এটি কার্যকর করার জন্য আপনার নিম্নলিখিতগুলির প্রয়োজন:
- আপনি যে ডেটাবেসটি অ্যাক্সেস করছেন তা এসএসএইচ দ্বারা অ্যাক্সেসযোগ্য হওয়া দরকার। "এসএসএইচ" এর সাথে আপনি যে কোনও পরিষেবা অ্যাক্সেস করছেন তা অনুসন্ধান করার চেষ্টা করুন। উদাহরণস্বরূপ, "ssh postgresql" । এটি যদি আপনার ডাটাবেসে কোনও বৈশিষ্ট্য না থাকে তবে পরবর্তী বিকল্পে যান।
- পরিষেবাটি চালানোর জন্য একটি অ্যাকাউন্ট তৈরি করুন যা ডেটাবেসে কল করবে এবং একটি এসএসএইচ কী তৈরি করবে ।
- হয় আপনি যে পরিষেবাটিতে কল করতে চলেছেন তাতে সর্বজনীন কী যুক্ত করুন, বা সেই সার্ভারে একটি স্থানীয় অ্যাকাউন্ট তৈরি করুন এবং সেখানে সর্বজনীন কী ইনস্টল করুন।
বিকল্প 2: পরিবেশ পরিবর্তনশীল
এটি সাধারণতম, তাই এটি শুরু করার জন্য ভাল জায়গা হতে পারে। এটি দ্বাদশ ফ্যাক্টর অ্যাপে ভালভাবে বর্ণনা করা হয়েছে । মূল ধারণাটি হ'ল আপনার উত্স কোডটি পরিবেশের ভেরিয়েবলগুলি থেকে কেবল পাসওয়ার্ড বা অন্যান্য গোপনীয়তা টানতে পারে এবং তারপরে আপনি প্রোগ্রামটি চালাবেন এমন প্রতিটি সিস্টেমে সেই পরিবেশের ভেরিয়েবলগুলি কনফিগার করেন। আপনি যদি ডিফল্ট মানগুলি ব্যবহার করেন যা বেশিরভাগ বিকাশকারীদের জন্য কাজ করে তবে এটি একটি দুর্দান্ত স্পর্শও হতে পারে। আপনার সফ্টওয়্যারটিকে "ডিফল্টরূপে সুরক্ষিত" করার বিরুদ্ধে আপনার এটি ভারসাম্য বজায় রাখতে হবে।
এখানে একটি উদাহরণ যা পরিবেশ ভেরিয়েবলগুলি থেকে সার্ভার, ব্যবহারকারীর নাম এবং পাসওয়ার্ড টান।
import os
server = os.getenv('MY_APP_DB_SERVER', 'localhost')
user = os.getenv('MY_APP_DB_USER', 'myapp')
password = os.getenv('MY_APP_DB_PASSWORD', '')
db_connect(server, user, password)
কীভাবে আপনার অপারেটিং সিস্টেমে পরিবেশের ভেরিয়েবল সেট করবেন এবং তার নিজের অ্যাকাউন্টের অধীনে পরিষেবাটি চালানো বিবেচনা করুন। আপনি যখন নিজের অ্যাকাউন্টে প্রোগ্রাম পরিচালনা করেন তখন পরিবেশের ভেরিয়েবলগুলিতে আপনার সংবেদনশীল ডেটা থাকে না। আপনি যখন এই পরিবেশের ভেরিয়েবলগুলি সেট আপ করেন, তখন অন্যান্য ব্যবহারকারীরা সেগুলি পড়তে না পারে সে জন্য অতিরিক্ত যত্ন নিন। উদাহরণস্বরূপ ফাইল অনুমতি পরীক্ষা করুন। অবশ্যই রুট অনুমতি সহ যে কোনও ব্যবহারকারী সেগুলি পড়তে সক্ষম হবে, তবে এটি সাহায্য করা যায় না। আপনি যদি সিস্টেমড ব্যবহার করছেন তবে পরিষেবা ইউনিটটি দেখুন , এবং কোনও গোপনীয়তার EnvironmentFile
পরিবর্তে ব্যবহার করতে সতর্ক হন Environment
। Environment
মানগুলি যে কোনও ব্যবহারকারীর দ্বারা দেখা যেতে পারে systemctl show
।
বিকল্প 3: কনফিগারেশন ফাইল
এটি পরিবেশের ভেরিয়েবলের সাথে খুব মিল, তবে আপনি কোনও পাঠ্য ফাইল থেকে গোপনীয়তা পড়েন। আমি এখনও ডিভাইসমেন্ট সরঞ্জাম এবং ক্রমাগত ইন্টিগ্রেশন সার্ভারের মতো জিনিসগুলির জন্য পরিবেশের ভেরিয়েবলগুলি আরও নমনীয় পাই। আপনি যদি একটি কনফিগারেশন ফাইল ব্যবহার করতে সিদ্ধান্ত নেন, পাইথন মান লাইব্রেরিতে বিভিন্ন ফরম্যাটের মত সমর্থন তাদেরকে JSON , INI এ , netrc এবং এক্সএমএল । আপনি পাইওয়ামএল এবং টোমেলের মতো বাহ্যিক প্যাকেজগুলিও খুঁজে পেতে পারেন । ব্যক্তিগতভাবে, আমি JSON এবং YAML ব্যবহার করার সহজতম সন্ধান করি এবং YAML মন্তব্যগুলির অনুমতি দেয়।
কনফিগারেশন ফাইলগুলির সাথে বিবেচনা করার জন্য তিনটি বিষয়:
- ফাইলটি কোথায়? হতে পারে একটি ডিফল্ট অবস্থানের মতো
~/.my_app
, এবং একটি পৃথক অবস্থান ব্যবহার করার জন্য একটি কমান্ড-লাইন বিকল্প।
- অন্যান্য ব্যবহারকারীরা ফাইলটি পড়তে পারবেন না তা নিশ্চিত করুন।
- স্পষ্টতই, কনফিগারেশন ফাইলটিকে উত্স কোডে প্রতিশ্রুতিবদ্ধ করবেন না। ব্যবহারকারীরা তাদের হোম ডিরেক্টরিতে অনুলিপি করতে পারেন এমন কোনও টেম্পলেট প্রতিশ্রুতিবদ্ধ করতে পারেন।
বিকল্প 4: পাইথন মডিউল
কিছু প্রকল্প কেবল পাইথন মডিউলে তাদের গোপনীয়তা রাখে।
db_server = 'dbhost1'
db_user = 'my_app'
db_password = 'correcthorsebatterystaple'
তারপরে মানগুলি পেতে সেই মডিউলটি আমদানি করুন।
from settings import db_server, db_user, db_password
db_connect(db_server, db_user, db_password)
এই কৌশলটি ব্যবহার করে এমন একটি প্রকল্প জ্যাঙ্গো । স্পষ্টতই, আপনার settings.py
উত্স নিয়ন্ত্রণের প্রতিশ্রুতি দেওয়া উচিত নয় , যদিও আপনি এমন কোনও ফাইল প্রতিশ্রুতি দিতে চান settings_template.py
যা ব্যবহারকারীরা অনুলিপি এবং সংশোধন করতে পারে।
আমি এই কৌশলটি নিয়ে কয়েকটি সমস্যা দেখছি:
- বিকাশকারীরা দুর্ঘটনাক্রমে ফাইলটি উত্স নিয়ন্ত্রণে প্রতিশ্রুতিবদ্ধ হতে পারে। এটি যুক্ত করা
.gitignore
সেই ঝুঁকি হ্রাস করে।
- আপনার কিছু কোড উত্স নিয়ন্ত্রণে নেই। আপনি যদি শৃঙ্খলাবদ্ধ হন এবং কেবল এখানে স্ট্রিং এবং নম্বর রাখেন তবে সমস্যা হবে না। আপনি যদি এখানে লগিং ফিল্টার ক্লাস লিখতে শুরু করেন, থামুন!
যদি আপনার প্রকল্পটি ইতিমধ্যে এই কৌশলটি ব্যবহার করে, পরিবেশের ভেরিয়েবলগুলিতে স্থানান্তর করা সহজ। সমস্ত সেটিং মানগুলিকে কেবল পরিবেশের ভেরিয়েবলগুলিতে সরিয়ে দিন এবং সেই পরিবেশের ভেরিয়েবলগুলি থেকে পড়ার জন্য পাইথন মডিউলটি পরিবর্তন করুন।