ব্যাশে> 1 টি প্রোগ্রামের জন্য পাসওয়ার্ড পাস করার নিরাপদ উপায়


21

আমি একটি bashস্ক্রিপ্ট লিখছি , এবং তার পাসওয়ার্ডের জন্য ব্যবহারকারীকে জিজ্ঞাসা করতে এবং এটি পাস করার প্রয়োজন openssl। যদিও opensslপাসওয়ার্ডটি নিজেই পড়তে পারে, প্রোগ্রামের আমার দুটি রান দরকার এবং দুবার ব্যবহারকারীর কাছে জানতে চাই না। লিপিটি এখানে:

cp file{,.old}
read -sp 'Enter password. ' PASS; echo
export PASS

# decode | edit | encode
openssl enc -d -aes-256-cbc -k "$PASS" -in file.old | \
  sed ... | openssl enc -e -aes-256-cbc -k "$PASS" -out file

unset PASS

কমান্ড লাইনটি দেখে পাসওয়ার্ড সহজেই পাওয়া যায় বলে এটি নিরাপদ নয়; psউদাহরণস্বরূপ, কেউ এটি ব্যবহার করে পড়তে পারেন ।

opensslএনভায়রনমেন্ট ভেরিয়েবল থেকে একটি পাসওয়ার্ড পড়তে পারে, তাই আমি এটির -k "$PASS"সাথে প্রতিস্থাপন করতে পারি -pass env:PASS, তবে এটি এখনও নিরাপদ নয়; যে কোনও প্রক্রিয়ার পরিবেশগত ভেরিয়েবলগুলি অবাধে পড়তে পারে (আবার psএটি করতে পারে)।

সুতরাং, আমি কীভাবে নিরাপদভাবে দুটি opensslদৃষ্টান্তে পাসওয়ার্ডটি পাস করতে পারি ?


GnuPG এবং PinEntry এর সংমিশ্রণ এখানে ব্যবহার করা যেতে পারে gnupg.org/related_software/penterry/index.en.html
নিখিল

"যে কোনও প্রক্রিয়ার পরিবেশগত ভেরিয়েবলগুলি অবাধে পড়া যায়" - এটি সম্পূর্ণ সঠিক নয়। psপ্রক্রিয়াটির পরিবেশটি থেকে পড়তে পারে /proc/<pid>/environতবে এই ফাইলটির 0600অনুমতি রয়েছে, সুতরাং কেবল রুট এবং প্রক্রিয়াটি চালিত ব্যবহারকারী প্রক্রিয়াটির পরিবেশটি পড়তে পারবেন। আমি বলতে পারি যে এটি বেশ নিরাপদ।
মার্টিন ভন উইট্টিচ

উত্তর:


16

ইনপুট থেকে আলাদা ফাইল বর্ণনাকারীর পাসওয়ার্ডটি পাস করুন (দুবার, একবার এনক্রিপশনের জন্য এবং একবার ডিক্রিপশন করার জন্য)। PASSপরিবেশে রফতানি করবেন না ।

read -sp 'Enter password. ' PASS
printf '%s\n' "$PASS" |
openssl enc -d -aes-256-cbc -kfile /dev/stdin -in file.old |
sed ... | {
  printf '%s\n' "$PASS" |
  openssl enc -e -aes-256-cbc -kfile /dev/stdin -in /dev/fd/3 -out file;
} 3<&0

আপনার সিস্টেমে না থাকে /dev/fd, আপনি ব্যবহার করতে পারেন -passযুক্তি বলতে opensslএকটি খোলা ফাইল বর্ণনাকারী থেকে পাসফ্রেজ পড়তে।

printf '%s\n' "$PASS" | {
  printf '%s\n' "$PASS" |
  openssl enc -d -aes-256-cbc -pass fd:0 -in file.old |
  tr a-z A-Z | tee /dev/tty | {
  openssl enc -e -aes-256-cbc -pass fd:3 -out file; }
} 3<&0

আমি আপনার উত্তর থেকে অন্য হিসাবে বুঝতে পারি , bashসহ সংস্করণটিও env:PASSনিরাপদ।

printf '%s\n' "$PASS"নিরাপদ নয় psউদাহরণস্বরূপ কেউ কমান্ড লাইনটি পড়তে পারেন ।

6
@ ব্যবহারকারী14284 না, এবং না। env:PASSনিরাপদ নয় কারণ পাসওয়ার্ডটি opensslপ্রক্রিয়াটির পরিবেশে উপস্থিত হবে (এটি প্রক্রিয়াটির পরিবেশে উপস্থিত হবে না bashতবে এটি যথেষ্ট নয়)। ব্যবহার printfকরা নিরাপদ কারণ এটি একটি অন্তর্নির্মিত বাশ।
গিলস 'অশুভ হওয়া বন্ধ করুন'

প্রতিধ্বনি একটি বাশ অন্তর্নির্মিত, তাই একটি সহজ প্রতিধ্বনি কমান্ড নিরাপদ না? echo $PASS | openssl ...। এটি PS তালিকাতে উপস্থিত হবে না। আপনি যে পাস করতে পারবেন তার একমাত্র জায়গা হ'ল বাশ প্রক্রিয়া মেমরি। আমি মনে করি ?
গাইতে

1
হ্যাঁ, echoএকই কারণেই printfনিরাপদ printfহবে নিরাপদ (এবং এটি কোনও শেল যেখানে এটি নির্মিত না সেখানে নিরাপদ হবে না)। আমি যে কারণটি ব্যবহার করি printfএবং না echoএটি হ'ল echoব্যাকস্ল্যাশগুলিকে ম্যাঙ্গেল করতে পারে (ব্যাশের বিকল্পগুলির উপর নির্ভর করে)।
গিলস

8

বাশ ব্যবহার printf '%s\n' "$PASS"করে এটি বাশ বিল্টিন execকমান্ড ব্যবহার করে ফাইল বর্ণনাকারীর সাথে তথাকথিত স্ট্রিং যুক্ত করে ব্যবহার করা যায় ।

আরও তথ্যের জন্য দেখুন: কমান্ড-লাইন পরামিতিগুলির শেল স্ক্রিপ্ট পাসওয়ার্ড সুরক্ষা

(

# sample code to edit password-protected file with openssl
# user should have to enter password only once
# password should not become visible using the ps command

echo hello > tmp.file

#env -i bash --norc   # clean up environment
set +o history
unset PASS || exit 1

read -sp 'Enter password. ' PASS; echo

# encrypt file and protect it by given password
exec 3<<<"$PASS"
openssl enc -e -aes-256-cbc -pass fd:3  -in tmp.file -out file

cp file{,.old}

# decode | edit | encode
exec 3<<<"$PASS" 4<<<"$PASS"
openssl enc -d -aes-256-cbc -pass fd:3 -in file.old | 
   sed 's/l/L/g' | 
   openssl enc -e -aes-256-cbc -pass fd:4 -out file

exec 3<<<"$PASS"
openssl enc -d -aes-256-cbc -pass fd:3 -in file

rm -P tmp.file file.old
unset PASS

)

1

দুঃখিত, আমার পূর্ববর্তী উত্তরটি ওপেনসেল ম্যান থেকে ছিল, ওপেনসেল এনকো ডকস থেকে নয়।

এই সমাধানটি পাইপলাইন নয়, তবে আমি বিশ্বাস করি যে এই সমাধানটি পাসওয়ার্ডকে PS তে দৃশ্যমান হতে বাধা দেয়।

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

# cp file{,.old}  don't need this anymore since intermediate becomes same
read -sp 'Enter password. ' PASS; echo
#no need to export, env's are readable, as mentioned

# decode into intermediate file
openssl <<HERE 2>&1 >/dev/null
enc -d -aes-256-cbc -k "$PASS" -in file -out intermediate
HERE

# edit intermediate

# encode intermediate back into file
openssl <<HERE 2>&1 >/dev/null
enc -e -aes-256-cbc -k "$PASS" -in intermediate -out file 
HERE
unset PASS
rm -f intermediate

এটি কীভাবে স্যুইচটি ব্যবহার করতে হবে তা যদি ব্যাখ্যা করা হয় তবে এটি আরও ভাল উত্তর হবে। এটি ভুল নয় ( encকম্যান্ডের -knবর্তমান সংস্করণগুলিতে কম্যান্ডের কোনও স্যুইচ নেই, এটি বাদে -pass) তবে খুব তথ্যবহুল নয়। (Downvote আমার নয়।)
গিলেজ 'SO- স্টপ হচ্ছে মন্দ'

ধন্যবাদ @ গিলিস, দস্তাবেজগুলিতে তাকিয়ে আমার ভুলত্রুটি, ভিন্ন পদ্ধতির সাথে আপডেট হওয়া উত্তরটি দেখেছেন।
বিএসডি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.