আপনি যেহেতু শেল স্ক্রিপ্টে এটি করতে চান, তাই লিনাক্সের সাথে পাসওয়ার্ড কীভাবে চেক করবেন তাতে বেশ কয়েকটি অবদান রয়েছে ? ( ইউনিক্স.এসে , এবি দ্বারা প্রস্তাবিত ) বিশেষভাবে প্রাসঙ্গিক:
স্ট্রিংটি সত্যই কোনও ব্যবহারকারীর পাসওয়ার্ড কিনা তা ম্যানুয়ালি পরীক্ষা করতে আপনাকে ব্যবহারকারীর ছায়া প্রবেশের মতো লবণের সাথে ব্যবহারকারীর ছায়া প্রবেশের মতো একই হ্যাশ অ্যালগরিদম দিয়ে হ্যাশ করতে হবে । তারপরে এটি সেখানে সঞ্চিত পাসওয়ার্ড হ্যাশের সাথে তুলনা করা যেতে পারে।
কীভাবে এটি করা যায় তা প্রদর্শন করে আমি একটি সম্পূর্ণ, কার্যকারী স্ক্রিপ্ট লিখেছি।
- যদি আপনি এটির নাম দেন
chkpass, আপনি চালনা করতে পারেন এবং এটি স্ট্যান্ডার্ড ইনপুট থেকে একটি লাইন পড়বে এবং এটির পাসওয়ার্ড কিনা তা পরীক্ষা করবে ।chkpass useruser
- এই স্ক্রিপ্ট নির্ভর করে এমন ইউটিলিটিটি অর্জনের জন্য whois
প্যাকেজটি ইনস্টল করুন mkpasswd।
- সফল হওয়ার জন্য এই স্ক্রিপ্টটি অবশ্যই রুট হিসাবে চালানো উচিত।
- প্রকৃত কাজটি করার জন্য এই স্ক্রিপ্ট বা এর কোনও অংশ ব্যবহার করার আগে দয়া করে নীচে সুরক্ষা নোট দেখুন।
#!/usr/bin/env bash
xcorrect=0 xwrong=1 enouser=2 enodata=3 esyntax=4 ehash=5 IFS=$
die() {
printf '%s: %s\n' "$0" "$2" >&2
exit $1
}
report() {
if (($1 == xcorrect))
then echo 'Correct password.'
else echo 'Wrong password.'
fi
exit $1
}
(($# == 1)) || die $esyntax "Usage: $(basename "$0") <username>"
case "$(getent passwd "$1" | awk -F: '{print $2}')" in
x) ;;
'') die $enouser "error: user '$1' not found";;
*) die $enodata "error: $1's password appears unshadowed!";;
esac
if [ -t 0 ]; then
IFS= read -rsp "[$(basename "$0")] password for $1: " pass
printf '\n'
else
IFS= read -r pass
fi
set -f; ent=($(getent shadow "$1" | awk -F: '{print $2}')); set +f
case "${ent[1]}" in
1) hashtype=md5;; 5) hashtype=sha-256;; 6) hashtype=sha-512;;
'') case "${ent[0]}" in
\*|!) report $xwrong;;
'') die $enodata "error: no shadow entry (are you root?)";;
*) die $enodata 'error: failure parsing shadow entry';;
esac;;
*) die $ehash "error: password hash type is unsupported";;
esac
if [[ "${ent[*]}" = "$(mkpasswd -sm $hashtype -S "${ent[2]}" <<<"$pass")" ]]
then report $xcorrect
else report $xwrong
fi
সুরক্ষা নোট
এটি সঠিক পদ্ধতির নাও হতে পারে।
এর মতো কোনও পদ্ধতির সুরক্ষিত এবং অন্যথায় উপযুক্ত হিসাবে বিবেচনা করা উচিত কিনা তা আপনি ব্যবহারের ক্ষেত্রে যে বিবরণ প্রদান করেন নি তার উপর নির্ভর করে (এই লেখার হিসাবে)।
এটির নিরীক্ষা করা হয়নি।
যদিও আমি এই স্ক্রিপ্টটি লেখার সময় যত্ন নিয়ে ব্যায়াম করার চেষ্টা করেছি, তবে সুরক্ষা দুর্বলতার জন্য এটি সঠিকভাবে নিরীক্ষণ করা হয়নি । এটি একটি বিক্ষোভ হিসাবে উদ্দিষ্ট, এবং কোনও প্রকল্পের অংশ হিসাবে প্রকাশিত হলে "আলফা" সফ্টওয়্যার হবে। উপরন্তু ...
আর একজন ব্যবহারকারী যিনি "দেখছেন" ব্যবহারকারীর লবণের সন্ধান করতে পারবেন ।
mkpasswdলবণের ডেটা কীভাবে গ্রহণ করে তার সীমাবদ্ধতার কারণে , এই স্ক্রিপ্টটিতে একটি ज्ञात সুরক্ষা ত্রুটি রয়েছে , যা আপনি ব্যবহারের ক্ষেত্রে নির্ভর করে গ্রহণযোগ্য বলে বিবেচনা করতে পারেন বা নাও করতে পারেন। ডিফল্টরূপে, উবুন্টু এবং বেশিরভাগ অন্যান্য জিএনইউ / লিনাক্স সিস্টেমের ব্যবহারকারীরা তাদের ব্যবহারকারী-কমান্ড-লাইন আর্গুমেন্ট সহ (রুট সহ) চালিত প্রক্রিয়াগুলির তথ্য দেখতে পারেন can ব্যবহারকারীর ইনপুট বা সঞ্চিত পাসওয়ার্ড হ্যাশ কোনও বাহ্যিক ইউটিলিটিতে কমান্ড-লাইন আর্গুমেন্ট হিসাবে পাস করা হয় না। কিন্তু লবণ , থেকে নিষ্কাশিত shadowডাটাবেস, হয় একটি কম্যান্ড-লাইন আর্গুমেন্ট হিসাবে প্রদত্ত mkpasswdযেহেতু এই একমাত্র উপায় যে ইউটিলিটি ইনপুট হিসাবে একটি লবণ গ্রহণ করে।
যদি
- সিস্টেমের অন্য ব্যবহারকারী, বা
- যে কেউ যেকোনও ব্যবহারকারী অ্যাকাউন্ট তৈরি করার ক্ষমতা রাখে (যেমন,
www-data) তাদের কোড চালায়, বা
- যে কেউ অন্যথায় চলমান প্রক্রিয়াগুলি সম্পর্কে তথ্য দেখতে পারেন (ম্যানুয়ালি এন্ট্রিগুলি পরিদর্শন করে
/proc)
mkpasswdএই স্ক্রিপ্ট দ্বারা চালিত হিসাবে এটি কমান্ড-লাইন আর্গুমেন্টগুলি পরীক্ষা করতে সক্ষম হয় , তারপরে তারা shadowডাটাবেস থেকে ব্যবহারকারীর লবণের একটি অনুলিপি পেতে পারে । তারা পারে অনুমান করতে সমর্থ হতে হবে যখন যে কমান্ডটি প্রয়োগ করা হয়, কিন্তু যে কখনও কখনও সাধনযোগ্য।
আপনার লবণের সাথে আক্রমণকারী আপনার লবণ এবং হ্যাশের আক্রমণকারী হিসাবে খারাপ নয় , তবে এটি আদর্শ নয়। আপনার পাসওয়ার্ড আবিষ্কার করার জন্য কারও পক্ষে লবণ পর্যাপ্ত তথ্য সরবরাহ করে না। তবে এটি যে কারওর জন্য সেই সিস্টেমটিতে ব্যবহারকারীর জন্য নির্দিষ্ট রেইনবো টেবিল বা প্রাক-গণিত অভিধান হ্যাশগুলি তৈরি করতে দেয় । এটি প্রাথমিকভাবে মূল্যহীন, তবে যদি আপনার সুরক্ষা পরবর্তী তারিখে আপস করা হয় এবং পুরো হ্যাশ পাওয়া যায়, তবে এটির পরিবর্তনের সুযোগ পাওয়ার আগে ব্যবহারকারীর পাসওয়ার্ড পেতে এটি আরও দ্রুত ফাটল যেতে পারে ।
সুতরাং এই সুরক্ষা ত্রুটিটি সম্পূর্ণরূপে কাজে লাগানো দুর্বলতার চেয়ে আরও জটিল আক্রমণ দৃশ্যের এক উদ্বেগজনক কারণ। এবং আপনি উপরের পরিস্থিতি সুদূর বিবেচনা করতে পারেন। তবে আমি সাধারণ, বাস্তব-বিশ্বের ব্যবহারের জন্য এমন কোনও পদ্ধতির সুপারিশ করতে নারাজ যা কোনও অ-রুট ব্যবহারকারী থেকে কোনও অ-পাবলিক ডেটা ফাঁস করে দেয় /etc/shadow।
আপনি এই সমস্যাটি সম্পূর্ণরূপে এড়াতে পারবেন:
- পার্ল বা করতে দেয় যদি অন্য কোন ভাষায় আপনার স্ক্রিপ্টের অংশ লেখা হিসাবে আপনি, সি ফাংশান কল গিলেজ এর উত্তর দেখানো থেকে এর সাথে সম্পর্কিত Unix.SE প্রশ্ন , বা
- বাশ ব্যবহার না করে আপনার সম্পূর্ণ স্ক্রিপ্ট / প্রোগ্রামটি এ জাতীয় ভাষায় লেখা। (আপনি যেভাবে প্রশ্নটি ট্যাগ করেছেন তার উপর ভিত্তি করে, এটি প্রদর্শিত হয় আপনি ব্যাশ ব্যবহার করতে পছন্দ করেন))
আপনি কীভাবে এই স্ক্রিপ্টটি কল করবেন তা যত্নবান হন।
যদি আপনি কোনও অবিশ্বস্ত ব্যবহারকারীকে এই স্ক্রিপ্টটিকে মূল হিসাবে চালিত করতে বা কোনও স্ক্রিপ্টকে রুট হিসাবে চালিত করার অনুমতি দেয় তবে সতর্কতা অবলম্বন করুন । অথবা - পরিবেশ পরিবর্তন করে, তারা এই স্ক্রিপ্ট করতে পারেন কোনো স্ক্রিপ্ট যে রুট হিসাবে রান - না কিছু । যদি না আপনি এটিকে আটকাতে না পারেন তবে আপনাকে অবশ্যই শেল স্ক্রিপ্টগুলি চালানোর জন্য ব্যবহারকারীদের উন্নত সুবিধাগুলি মঞ্জুর করতে হবে না।
10.4 দেখুন । এই বিষয়ে আরও তথ্যের জন্য ডেভিড এ। হুইলারের সিকিউর প্রোগ্রামিং ফর লিনাক্স এবং ইউনিক্স হাওটো- তে শেল স্ক্রিপ্টিং ল্যাঙ্গুয়েজগুলি (sh এবং csh ডেরিভেটিভস) । যদিও তার উপস্থাপনাটি সেটুয়েড স্ক্রিপ্টগুলিতে ফোকাস করে, অন্য প্রক্রিয়াগুলি যদি পরিবেশকে সঠিকভাবে স্যানিটাইজ না করে তবে কিছু একই সমস্যার শিকার হতে পারে।
অন্যান্য নোট
এটি shadowকেবল ডাটাবেস থেকে হ্যাশ পড়ার সমর্থন করে।
এই স্ক্রিপ্টটি কাজ করার জন্য পাসওয়ার্ড ছায়াযুক্ত করা উচিত (অর্থাত, তাদের হ্যাশগুলি একটি পৃথক /etc/shadowফাইলে থাকা উচিত যা কেবলমাত্র রুটটিই পড়তে পারে, না /etc/passwd)
উবুন্টুতে সর্বদা এটি হওয়া উচিত। যাই হোক, প্রয়োজনে স্ক্রিপ্ট জাভাস্ক্রিপ্টে গার্বেজ থেকে পাসওয়ার্ড হ্যাশ পড়তে বাড়ানো যেতে পারে passwdসেইসাথে shadow।
IFSএই স্ক্রিপ্টটি সংশোধন করার সময় মনে রাখবেন ।
আমি IFS=$শুরুতে সেট করেছি , যেহেতু ছায়া প্রবেশের হ্যাশ ক্ষেত্রে তিনটি ডেটা পৃথক করা হয়েছে $।
- তারা একটি নেতৃস্থানীয় আছে
$যে কারণে হ্যাশ ধরন এবং লবন, "${ent[1]}"এবং "${ent[2]}"বদলে "${ent[0]}"এবং "${ent[1]}"যথাক্রমে।
এই স্ক্রিপ্টের একমাত্র জায়গায় যেখানে $IFSনির্ধারণ করে কিভাবে শেল টুকরা বা সম্মিলন শব্দ
যখন এই ডেটাগুলিকে বিন্যস্ত $( )কমান্ড প্রতিস্থাপন থেকে এটি শুরু করে একটি অ্যারেতে বিভক্ত করা হয়:
set -f; ent=($(getent shadow "$1" | awk -F: '{print $2}')); set +f
যখন অ্যারের পূর্ণ ক্ষেত্রের সাথে তুলনা করতে একটি স্ট্রিংয়ে পুনর্গঠন করা হয় shadow, তখন "${ent[*]}"প্রকাশটি:
if [[ "${ent[*]}" = "$(mkpasswd -sm $hashtype -S "${ent[2]}" <<<"$pass")" ]]
আপনি যদি স্ক্রিপ্টটি পরিবর্তন করেন এবং এটি অন্যান্য পরিস্থিতিতে শব্দ বিভাজন (বা শব্দ যোগদান) সম্পাদন করে থাকেন তবে আপনাকে IFSবিভিন্ন কমান্ড বা স্ক্রিপ্টের বিভিন্ন অংশের জন্য বিভিন্ন মান সেট করতে হবে।
আপনি যদি এটিকে মনে না রাখেন এবং ধরে $IFSনিলেন যে স্বাভাবিক হোয়াইট স্পেস ( $' \t\n') এ সেট করা থাকে তবে আপনি আপনার স্ক্রিপ্টটি বেশ সুন্দর কিছু অদ্ভুত বলে মনে হচ্ছে making