আমি কীভাবে শেল স্ক্রিপ্টগুলিতে রুট সুবিধাগুলি বাদ দেব?


14

ওপেনভিপিএন-এ "--আপ" বিকল্পটি সাধারণত রাউটিং ইত্যাদির জন্য ব্যবহৃত হয় এবং সুতরাং ওপেনভিপিএন কারও হিসাবে চালানোর জন্য রুট সুবিধাগুলি ছাড়ার আগে এটি প্রক্রিয়া করা হয়। যাইহোক, আমি শেল স্ক্রিপ্টগুলি চালু করছি যা একটি অনিবদ্ধ ব্যবহারকারী হিসাবে চালানো দরকার।

আমি কেমন করে ঐটি করি? আমি ড্রপ প্রসেস প্রিভিলেজস , বিশেষত বহুপদী এবং টাইলারের উত্তরগুলি অধ্যয়ন করেছি , তবে কীভাবে প্রয়োগ করব তা আমি বুঝতে পারি না। আমি সেন্টোস .5.৫ এ কাজ করছি, এবং "chmod u + s" এবং "সেটুইড ()" হিসাবে উভয়ই অবরুদ্ধ রয়েছে।

এখানে একটি ওপেনভিপিএন প্লাগইন রয়েছে ("openvpn-down-root.so") যা "- ডাউন" বিকল্পের দ্বারা অনুরোধিত স্ক্রিপ্টগুলিকে রুট হিসাবে চালাতে সক্ষম করে। "Openvpn-up-user.so" এর মতো একটি সমতুল্য হতে পারে, তবে আমি এটি পাই নি।

Edit0

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

LANG="en_US.UTF-8"; export LANG
GDM_LANG="en_US.UTF-8"; export GDM_LANG
DISPLAY=:0; export DISPLAY
sudo chpst -u user -U user /home/user/unprivileged.sh &

Edit1

0xC0000022L এর মন্তব্যে, আমি দেখতে পেয়েছি যে "sudo -u ব্যবহারকারী" পাশাপাশি "sudo chpst -u ব্যবহারকারী -U ব্যবহারকারী" হিসাবে কাজ করে:

LANG="en_US.UTF-8"; export LANG
GDM_LANG="en_US.UTF-8"; export GDM_LANG
DISPLAY=:0; export DISPLAY
sudo -u user /home/user/unprivileged.sh &

আমি ম্যান সুদোয়ার্স অধ্যয়ন করব এবং / যখন আমি একা কাজ করতে পারি সুডো আপডেট করব।


মন্তব্য @ user66229 দ্বারা বাম: "আমি যে সুপারিশ করতে পারে আপনি সার্ফ sourceforge.net/p/openvpn/mailman এবং আপনি সবচেয়ে উপযুক্ত এটি তালিকা সাবস্ক্রাইব।"
slm

@ ব্যবহারকারী 66229 আপনাকে ধন্যবাদ। তবে আমি বিশ্বাস করি না যে এটি একটি ওপেনভিপিএন-নির্দিষ্ট প্রশ্ন। আপনি কেন বিশ্বাস করেন যে এটি?
মিরিমির

উত্তর:


7

আমি ব্যবহার runit এর chpstভালো কাজের জন্য টুল। উদাহরণস্বরূপ, আপ স্ক্রিপ্ট থেকে আপনার অনিবদ্ধ স্ক্রিপ্ট কল করুন:

chpst -u nobody /path/to/script

শীতল :) আপনাকে ধন্যবাদ। Github.com/imeyer/runit-rpm সেন্টোস .5.৫রানিট হওয়ার সেরা উপায় কি ? এমনকি রেড হ্যাট রেপো সহ, আমি একটি প্যাকেজ খুঁজে পাচ্ছি না।
মিরিমির

@ এমিরিমির, হ্যাঁ, সেন্টোসের জন্য যখন আমাকে রানিট প্যাকেজ তৈরি করতে হবে তখন আমি সেই রেপো ব্যবহার করি।
নিকোলা কোটুর

11

কেবল রানিট এবং সুডো Coverেকে রাখলে অনেক কিছু মিস হয়। রুনিটের মতো টুলসেটের একটি সম্পূর্ণ পরিবার রয়েছে এবং ঠিক এটি করার জন্য সরঞ্জামগুলির একটি বিস্তৃত পছন্দ, তারা যে কাজের জন্য ডিজাইন করেছিল:

  • ড্যানিয়েল জে বার্নস্টেইনের ডেমনটোলস রয়েছে setuidgid:

    setuidgid ব্যবহারকারী / home/user/unprivileged.sh
  • অ্যাডাম স্যাম্পসনের মুক্তি রয়েছে setuidgid:

    setuidgid ব্যবহারকারী / home/user/unprivileged.sh
  • ব্রুস গেন্টারের ডিমনটোলস-এনকোয়ার রয়েছে setuidgid:

    setuidgid ব্যবহারকারী / home/user/unprivileged.sh
  • জেরিট পেপের রানিট হ'ল chpst:

    chpst -u ব্যবহারকারীর / home/user/unprivileged.sh
  • ওয়েইন মার্শালের বিড়ম্বনাটি রয়েছে runuid:

    রানউইড ব্যবহারকারী / home/user/unprivileged.sh
  • লরেন্ট বেরকোট এর এস has তে রয়েছে s6-setuidgid:

    s6-setuidgid ব্যবহারকারী / home/user/unprivileged.sh
  • আমার নশ আছে setuidgid:

    setuidgid ব্যবহারকারী / home/user/unprivileged.sh

তারা মিশ্রিত না বিভিন্ন কাজটি যোগ বিশেষাধিকার এবং একটি ইন্টারেক্টিভ মোডে পড়া না।

তোমার tacked অন সমস্যার একটু বেশি আছে চেয়ে আপনার ভুলে sbinসেইসাথে binআপনার PATHউপায় দ্বারা।

আরও পড়া


3

স্ক্রিপ্ট যা সুবিধাগুলি হ্রাস করে এবং অন্যান্য স্ক্রিপ্ট চালায় (তবে এখানে আমি এটি নিজে চালানোর জন্য তৈরি করেছি):

#!/bin/sh

id=`id -u`
safeuser="nobody"

if [ $id = "0" ]
then
         # we're root. dangerous!
        sudo -u $safeuser $0
else
    echo "I'm not root"
    id
fi

উদাহরণ:

root@n3:/tmp/x# id
uid=0(root) gid=0(root) группы=0(root)
root@n3:/tmp/x# ./drop.sh
I'm not root
uid=65534(nobody) gid=65534(nogroup) группы=65534(nogroup)

"Sudo -u ব্যবহারকারী" ব্যবহার করার সময় কিছু কমান্ডের জন্য কাজ করে, এটি আমার উদ্দেশ্যে পর্যাপ্ত ব্যবহারকারীর পরিবেশ সরবরাহ করে না। এবং যখন "su -l ব্যবহারকারী" টার্মিনালে ভাল কাজ করে, এটি স্ক্রিপ্টগুলিতে কিছুই করে না। আমি মনে করি এটি একটি সুরক্ষা বৈশিষ্ট্য। সুতরাং মনে হচ্ছে আমি রানিট ইনস্টল করেই ফেলেছি।
মিরিমির

1
@ আমিরিমির: কেন? এনভায়রনমেন্ট ভেরিয়েবলগুলি এবং এর দ্বারা পরিচালিত প্রোগ্রামগুলিতে কী নির্দিষ্ট করা যায় তা খুব নির্দিষ্ট /etc/sudoersহতে দেয় । । সত্যিই, যে কেউ কেবল ব্যবহারকারী প্রসঙ্গের জন্য বা স্যুইচ করতে ব্যবহার করে তার এই দুর্দান্ত অনুষ্ঠানের পিছনে কী রয়েছে এবং আপনি পৃথক প্রোগ্রাম, ব্যবহারকারী, হোস্ট ইত্যাদির জন্য কীভাবে জিনিসগুলি লক করতে পারেন সে সম্পর্কে কোনও ধারণা নেই ...sudoman sudoerssudosudo su -
0xC0000022L

@ 0xC0000022L ধন্যবাদ আমি আবার তাকালাম সুদোর দিকে। এবং হ্যাঁ, "sudo -u ব্যবহারকারী" প্লাস প্রদর্শন এবং ভাষাও কাজ করে।
মিরিমির

1
বিপজ্জনক কথা বলা - আপনি বিশ্বাস করতে পারবেন না $0; কলকারী কোনও স্ক্রিপ্ট সেট করতে $0পারে আক্ষরিক যে কোনও কিছুতে তারা এটি চায়। এবং আরও উদ্ধৃতি ব্যবহার করুন।
চার্লস ডাফি

2
... আপনার স্ক্রিপ্টের যদি $0হয় /directory/name with spaces/script(এবং মনে রাখবেন, ব্যবহারকারীরা, স্থান তারা নিজের নির্বিচারে symlinks তৈরি করতে পারেন এমনকি যদি তারা না ব্যবহার exec -a somename yourscriptডাকতে yourscriptএকটি সঙ্গে $0এর somename), তারপর আপনি পেতে চাই sudo -u nobody /directory/name with spacesসঙ্গে, withএবং spacesআপনার কমান্ড পৃথক আর্গুমেন্ট হিসাবে পাস ।
চার্লস ডাফি

1

কি সম্পর্কে:

sudo -Eu <user> <command>

আপনি আগের মন্তব্যে পরিবেশ সম্পর্কে অভিযোগ করেছেন, সুতরাং আপনি ফলাফলগুলির মধ্যে পার্থক্যও তুলনা করতে পারেন:

sudo -u <user> printenv
sudo -Eu <user> printenv

1

লিনাক্সে আপনি ব্যবহার করতে পারেন runuserবা setprivযদি পিএএম সেশনের প্রয়োজন না হয় (উভয় থেকে util-linux):

runuser -u USER [--] COMMAND [ARGUMENTS...]

setpriv --reuid=1000 --regid=1000 --init-groups COMMAND [ARGUMENTS...]  # Like su/runuser/sudo
setpriv --reuid=1000 --regid=1000 --clear-groups COMMAND [ARGUMENTS...]  # Like daemontools setuid(8)

থেকে suমানুষ পৃষ্ঠা:

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

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