সংবেদনশীল ডেটা chpasswd এ পাস করতে ইকো ব্যবহার করা কি নিরাপদ?


17

আমি ব্যবহার করে কয়েকটি ব্যবহারকারীর অ্যাকাউন্ট পাসওয়ার্ড ভর করতে চেষ্টা করছি chpasswd। পাসওয়ার্ডগুলি এলোমেলোভাবে উত্পন্ন করা উচিত এবং এতে মুদ্রণ করা উচিত stdout(আমার এগুলি লিখতে হবে বা একটি পাসওয়ার্ড স্টোরে রাখতে হবে), এবং এতেও প্রবেশ করানো উচিত chpasswd

উদাসীনভাবে, আমি এটি এইভাবে করতে হবে

{
  echo student1:$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo '')
  echo student2:$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo '')
} | tee >(chpasswd)

তবে আমি কমান্ডলাইন আর্গুমেন্ট হিসাবে নতুন পাসওয়ার্ডটি পাস করার বিষয়ে উদ্বিগ্ন echo, কারণ আর্গুমেন্টগুলি সাধারণত অন্যান্য ব্যবহারকারীদের কাছে দৃশ্যমান হয় ps -aux(যদিও আমি কোনও echoলাইন উপস্থিত দেখিনি ps)।

আমার ফিরে আসা পাসওয়ার্ডে কোনও মূল্য প্রেরণ করার এবং তারপরে পাস করার বিকল্প উপায় আছে কি chpasswd?


6
echoঅন্তর্নির্মিত একটি শেল। এটি প্রক্রিয়া সারণিতে সক্রিয় হবে না।
কুসালানন্দ

উত্তর:


15

আপনার কোডটি নিরাপদ হওয়া উচিত echoকারণ এটি শেলটি অন্তর্নির্মিত হওয়ায় প্রক্রিয়া টেবিলটিতে প্রদর্শিত হবে না।

এখানে একটি বিকল্প সমাধান:

#!/bin/bash

n=20
paste -d : <( seq -f 'student%.0f' 1 "$n" ) \
           <( tr -cd 'A-Za-z0-9' </dev/urandom | fold -w 13 | head -n "$n" ) |
tee secret.txt | chpasswd

এটি nকোনও কমান্ডের কোনও কমান্ড লাইনে কোনও পাসওয়ার্ড ছাড়াই আপনার শিক্ষার্থীর নাম এবং পাসওয়ার্ড তৈরি করে ।

pasteউপযোগ আঠা একসঙ্গে কলাম এবং টিপে একটি বিভেদক তাদের মধ্যবর্তী হিসাবে বিভিন্ন ফাইল। এখানে, আমরা :সীমানা হিসাবে ব্যবহার করি এবং এটি দুটি "ফাইল" (প্রক্রিয়া বিকল্প) দেই। প্রথমটির মধ্যে একটি seqকমান্ডের আউটপুট রয়েছে যা 20 টি শিক্ষার্থীর ব্যবহারকারীর নাম তৈরি করে এবং দ্বিতীয়টিতে একটি পাইপলাইনের আউটপুট রয়েছে যা 13 দৈর্ঘ্যের 20 টি এলোমেলো স্ট্রিং তৈরি করে।

আপনার যদি ইতিমধ্যে উত্সযুক্ত ব্যবহারকারীর নাম সহ একটি ফাইল থাকে:

#!/bin/bash

n=$(wc -l <usernames.txt)

paste -d : usernames.txt \
           <( tr -cd 'A-Za-z0-9' </dev/urandom | fold -w 13 | head -n "$n" ) |
tee secret.txt | chpasswd

secret.txtএটি টার্মিনালে উত্পন্ন পাসওয়ার্ডগুলি দেখানোর পরিবর্তে ফাইলটিতে পাসওয়ার্ড এবং ব্যবহারকারীর নাম সংরক্ষণ করবে ।


2
এটি একটি চতুর সমাধানের প্রয়োজন নেই echoবা printf, কোডটি বোঝার জন্য কিছুটা বিশ্রী
নীলস ওয়ার্নার

@ নিলস ওয়ার্নার আরও কিছুটা ব্যাখ্যা যোগ করেছেন। আপনি যদি আমার প্রসারিত করতে চান তবে নির্দিষ্ট কিছু আছে কিনা তা আমাকে জানান।
কুসালানন্দ

1
echoযদিও আপনি শেল বিল্টিন হওয়ার উপর নির্ভর করবেন না । বেশিরভাগ শেলের মধ্যে এটি রয়েছে তবে এটির কোনও প্রয়োজন নেই।
অস্টিন হেমেলগার্ন

1
@Kusalananda শুধু জানতে আগ্রহী, তার মাঝে একটি কার্যকর পার্থক্য নেই tee secret.txt > >(chpasswd)এবং tee secret.txt | chpasswd? দ্বিতীয়টি আরও সাধারণ বলে মনে হচ্ছে, তাই আমি ভাবছি যে আপনি কেন একটি সরল পাইপের পরিবর্তে প্রক্রিয়া বিকল্প ব্যবহার করতে বেছে
নিয়েছেন

1
@ ক্রিসটফারশ্রোবা এই কোডের সাথে ইতিমধ্যে প্রশ্নযুক্ত (এর সাথে একটি প্রক্রিয়া বিকল্প ব্যবহার করে tee) এর মতো অন্য কোনও কারণ নয় । এখন যেহেতু আপনি এটি চিহ্নিত করেছেন, আমি মনে করি আমি আসলে এটি পরিবর্তন করব (এটি আরও ভাল দেখাচ্ছে)। ধন্যবাদ।
কুসালানন্দ

8

echoখুব সম্ভবত শেলের সাথে অন্তর্নির্মিত, তাই এটি psপৃথক প্রক্রিয়া হিসাবে উপস্থিত হবে না ।

তবে আপনার কমান্ড সাবস্টিটিউশন ব্যবহার করার দরকার নেই, আপনি কেবল পাইপলাইন থেকে সরাসরি আউটপুট নিতে পারেন chpasswd:

{  printf "%s:" "$username";
   head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo ''
} | chpasswd 

আপনি যদি এক রান দিয়ে একাধিক পাসওয়ার্ড পরিবর্তন করতে চান chpasswdতবে প্রয়োজনীয় অংশগুলি পুনরাবৃত্তি করা সহজ হওয়া উচিত। বা এটিকে কোনও ফাংশনে পরিণত করুন:

genpws() {
    for user in "$@"; do
        printf "%s:" "$user";
        head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13
        echo
    done
}
genpws username1 username2... | chpasswd 

একদিকে যেমন: লাইন-ভিত্তিক না head /dev/urandomহওয়ায় urandomএটি কিছুটা অদ্ভুত বোধ করে । এটি এটি থেকে অতিরিক্ত পরিমাণে বাইটগুলি পড়তে পারে, যা কার্নেলের উপলব্ধ এনট্রপির উপলব্ধ ধারণাকে প্রভাবিত করবে, যার ফলস্বরূপ /dev/randomঅবরুদ্ধ হতে পারে । এটি কেবলমাত্র একটি নির্দিষ্ট পরিমাণ ডেটা পড়ার জন্য ক্লিনার হতে পারে base64এবং এলোমেলো বাইটগুলি মুদ্রণযোগ্য অক্ষরগুলিতে রূপান্তর করার মতো কিছু ব্যবহার করতে পারে (আপনি যে বাইটগুলি পেয়েছেন তার প্রায় 3/4 বাদ দিয়ে টস না করে)।

এরকম কিছু আপনাকে প্রায় দেয়। 16 টি অক্ষর এবং সংখ্যা:

head -c 12 /dev/urandom | base64 | tr -dc A-Za-z0-9 

(এটি হ'ল আউটপুটে 16 টি পরিমাণ +এবং /অক্ষরের পরিমাণ কম base64either উভয়র জন্য সম্ভাবনা প্রতি চরিত্রের 1/32 হয়, তাই আমি যদি আমার সংযোজককে সঠিকভাবে পাই তবে এটি কমপক্ষে 14 টি অক্ষর রেখে যাওয়ার 99% সুযোগ দেয়, এবং কমপক্ষে 12. ছাড়ার 99.99% সুযোগ


আপনার printfসমাধানটি আমার মূল কোডটি যা করে তা করে না: একাধিক ব্যবহারকারীর জন্য একাধিক লাইন ফিরিয়ে দিন, তবে আমি আপনার মন্তব্যের প্রশংসা করিhead urandom
নিলস ওয়ার্নার

@ নীলস ওয়ার্নার, ভাল, আমি একাধিক ব্যবহারকারীর কাছে প্রসারিত হওয়া সুস্পষ্ট। তবে কোনও বিষয় নয়, আমরা ব্যবহারকারীর নাম তৈরি করতে একটি ফাংশন করতে পারি: একসাথে একাধিক ব্যবহারকারীর জন্য পাসওয়ার্ড জোড়া। (সম্পাদনা দেখুন)
ilkkachu

3
আপনি চান ইউরেনডম থেকে প্রথম 10 "লাইনের" উপর নির্ভর করতে পারবেন না যা আপনি চান যথেষ্ট পরিমাণে অক্ষর। পরিবর্তে সরাসরি ট্র দ্বারা সরাসরি ইউরানডম চালান।
কুসালানন্দ

@ কুসালানন্দ, আপনি কি আমার head -c 10 | base64পাইপলাইন বলতে চান , বা নীল এর সাথে head | tr? এলোমেলো বাইটের 10 "লাইন" শত শত বাইট হওয়ার সম্ভাবনা খুব বেশি (256-এ কেবল 1 টি নিউলাইন হবে) তবে তাত্ত্বিকভাবে এটি 10 ​​টি বাইট হতে পারে তবে এর প্রতিকূলতা একেবারেই নগণ্য। একইভাবে ব্যবহার করার সময় base64, যদি এলোমেলো বাইটগুলি কেবল বলা হয় \xff, তবে বেস 64 কেবল স্ল্যাশের একটি স্ট্রিং হবে, তবে এটির সম্ভাবনাও খুব কম। আপনি যদি যত্নশীল হন তবে আপনি 10 বাইটের বেশি পড়তে পারেন, এর প্রতিকূলতা হ্রাস করতে পারেন এবং তারপরে ফলাফলের আউটপুটটির দৈর্ঘ্য কমিয়ে দিতে পারেন।
ilkkachu

1
@ilkkachu আমি উভয় কোডের উল্লেখ করছি। আপনি যদি এলোমেলো বাইটস পড়ে থাকেন এবং যা চান না তা ফিল্টার করার পরে নির্দিষ্ট দৈর্ঘ্যের কিছু চান, তবে আপনার প্রয়োজনীয় যা পেয়েছেন তা নিশ্চিত না হওয়া অবধি ডেটা উত্সটি কেটে ফেলবেন না। আপনি যেমনটি বলেছেন, এটি আপনার পক্ষে দশটি নতুন লাইনের একটি স্ট্রিং পাওয়ার সম্ভাবনা খুব কম/dev/urandom তবে ঝুঁকি 0% নয়।
কুসালানন্দ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.