রুট-সক্ষম স্ক্রিপ্টগুলিতে কীভাবে নিরাপদে ভেরিয়েবলগুলি পাস করবেন?


13

এই প্রশ্নটি সম্পূর্ণ সাধারণ এবং কেবল আমার পরিস্থিতির জন্যই প্রযোজ্য নয়, তবে ... আমার একটি ছোট ব্যস্তবক্স অ্যাপ্লায়েন্স রয়েছে যেখানে আমি চাই যে কোনও রুটবিহীন ব্যবহারকারী রুট প্রিভিলিজেস সহ একটি নির্দিষ্ট স্ক্রিপ্ট কার্যকর করতে সক্ষম হন। উদাহরণস্বরূপ, ডিএইচসিপি সক্ষম করতে এই ছোট স্ক্রিপ্টের মতো কিছু, যেখানে কেবলমাত্র ভেরিয়েবল ( $1) সেন্টিমিডলাইন (!!) প্রেরণ করার জন্য হোস্টের নামটি প্রেরণ করতে হবে:

#!/bin/bash
udhcpc -b -i eth0 -h $1

এটির মতো udcpc চালানোর জন্য রুট অ্যাক্সেস প্রয়োজন, তাই এটি করার /etc/sudoersজন্য আমি এই লাইনটি সংশোধন করার পরিকল্পনা করছি :

joe ALL = NOPASSWD: /path/to/enable_dhcp.sh

যা "জো" কে সহজেই চালিয়ে রুট সুবিধাগুলি সহ সহজেই সেই স্ক্রিপ্টটি চালাতে সক্ষম করে:

sudo /path/to/enable_dhcp.sh

এবং একটি পাসওয়ার্ড জিজ্ঞাসা করা হচ্ছে না (যা আমি চাই, যেহেতু জো এটির স্ক্রিপ্ট করতে সক্ষম হোক)।

এখন .. আমি জানি (বা কমপক্ষে আমি মনে করি) আমি জানি যে $1কোনও স্ক্রিপ্টে সহজেই রুট সুবিধাগুলি দিয়ে চালানো যেতে পারে এটি একটি হররাইল আইডিয়া যেহেতু আপনি যা চান তাতে ইনজেক্ট করতে পারেন।

সুতরাং ... এটি মোকাবেলার সেরা উপায় কি? আমি কীভাবে জোকে রুট সুবিধাগুলি দিয়ে যা করতে চাই, কীভাবে তাকে ভেরিয়েবলের মধ্যে দিয়ে যেতে পারি (বা কার্যকরভাবে পরিবেশের পরিবর্তনশীলের মতো এটি করতে পারি), যখন ইনজেকশন আক্রমণে সম্পূর্ণ উন্মুক্ত না হয়?

উত্তর:


14

এর অধীনে শেল স্ক্রিপ্টগুলি চালানো sudoনিরাপদ that sudoযা পরিবেশ পুনরায় সেট করতে কনফিগার করা আছে । বিপরীতে, যদি sudoপরিবেশটি পুনরায় সেট না করা হয় তবে শেল স্ক্রিপ্টটি চালানো নিরাপদ নয়, এমনকি যদি আপনার স্ক্রিপ্টটি এর পরামিতি ব্যবহার না করে ( শেল স্ক্রিপ্টগুলিতে সেটুইডের অনুমতি দিন ) see নিশ্চিত হয়ে নিন যে আপনার Defaults env_resetমধ্যে রয়েছে /etc/sudoersবা এই বিকল্পটি সংকলন-সময় ডিফল্ট ( sudo sudo -V | grep envঅন্তর্ভুক্ত হওয়া উচিত Reset the environment to a default set of variables)।

স্ক্রিপ্টের পরামিতিগুলি ব্যবহার করার ক্ষেত্রে কোনও বিশেষ বিপদ নেই। $1একটি স্ট্রিং, আপনাকে যা নিশ্চিত করতে হবে তা হ'ল আপনি এটিকে স্ট্রিং হিসাবে ব্যবহার করছেন। (উদাহরণস্বরূপ, করবেন না eval "$1"।) স্পষ্টতই, এখানে ভ্যারিয়েবলের বিষয়বস্তু সম্পর্কে অনুমান করা এবং সমস্ত পরিবর্তনশীল বিকল্পের (যেমন লিখুন "$1", নয় $1) চারপাশে ডাবল কোট স্থাপন করা বিশেষত গুরুত্বপূর্ণ । নোট করুন যে পরিবর্তনীয় বিকল্পের চারপাশে ডাবল কোট স্থাপন করা বিশেষাধিকারের সাথে চলমান স্ক্রিপ্টগুলির জন্য নির্দিষ্ট নয়, এটি আপনাকে অবশ্যই সর্বদা করতে হবে do

udhcpcহোস্ট নামের মতো দেখতে এমন কিছু না করে কী করে তার উপর নির্ভর করে আপনি আরও প্যারামিটারটি বৈধতা দিতে চাইতে পারেন । উদাহরণস্বরূপ, এটি প্রথম সিনট্যাকটিক চেক সম্পাদন করবে:

#!/bin/sh
case "$1" in
  *[!:-.0-9A-Za-z]*|-*) echo 1>&2 "Badly formed host name!"; exit 3;;
esac
udhcpc -b -i eth0 -h "$1"

অন্যান্য যে বিষয়গুলি বিবেচনা করা হবে সেগুলি সেই আদেশের আচরণের উপর প্রভাব ফেলতে পারে: বর্তমান ওয়ার্কিং ডিরেক্টরি এবং কী স্টিডিন, স্টাডআউট, স্টার্ডার পয়েন্ট, সিগন্যাল হ্যান্ডলার এবং ইউলিমিট। উদাহরণস্বরূপ, কোর ডাম্পগুলিকে অনুমতি দেওয়ার মাধ্যমে (<kbd> Ctrl- \ </kbd>) আপনি ব্যবহারকারীকে লিটার / রান / লক করার অনুমতি দিতে পারেন যা আমার সিস্টেমে খুব সীমিত আকারের একটি tmpfs এবং একটি ডসকে অনুমতি দিতে পারে।
স্টাফেন চেজেলাস

5

আপনার পরিচিত উত্তম প্যাটার্নের সাথে পাস করা ইনপুটটি মেলাতে হবে।

উদাহরণস্বরূপ, দেখে মনে হচ্ছে কোনও আইপি ঠিকানাটি আপনার জন্য বৈধ ইনপুট হতে পারে। সুতরাং আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন:

if [[ "$1" =~ ^[0-9]?[0-9]?[0-9].[0-9]?[0-9]?[0-9].[0-9]?[0-9]?[0-9]$ ]]
then
  udhcpc -b -i eth0 -h "$1"
else
  echo "Don't mess with me pork chop."
fi

দ্রষ্টব্য, এই রেজিপ্স্প পরীক্ষা করা হয়নি, আপনি নিশ্চিত হন যে আপনার রেজএক্সপক্স বিপজ্জনক কিছুকে মঞ্জুরি দেয় না তার জন্য আপনি দায়বদ্ধ।

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