ssh- এজেন্ট ফরোয়ার্ডিং এবং অন্য ব্যবহারকারীকে sudo


152

আমার যদি এমন একটি সার্ভার থাকে যেখানে আমি আমার এসএস কী দিয়ে লগইন করতে পারি এবং আমার মধ্যে "sudo su - otheruser" করার ক্ষমতা আছে, আমি কী ফরোয়ার্ডিং হারাব, কারণ এনভির ভেরিয়েবলগুলি সরানো হয়েছে এবং সকেটটি কেবলমাত্র আমার আসল ব্যবহারকারী দ্বারা পঠনযোগ্য। "Sudo su - otheruser" এর মাধ্যমে কী ফরোয়ারিংটি ব্রিজ করার কোনও উপায় আছে, তাই আমি আমার ফরোয়ার্ড কী (গিট ক্লোন এবং আমার ক্ষেত্রে আরএসসিএনসি) দিয়ে একটি সার্ভার বিতে স্টাফ করতে পারি?

আমি যেভাবে ভাবতে পারি তা হল আমার চাবিটি অন্য ব্যবহারকারীর অনুমোদিত_কি এবং "ssh otheruser @ লোকালহোস্ট" এ যুক্ত করা, তবে আমার যে ব্যবহারকারী এবং সার্ভারের সংমিশ্রণটি তা থাকতে পারে তা আমার পক্ষে জটিল।

সংক্ষেপে:

$ sudo -HE ssh user@host
(success)
$ sudo -HE -u otheruser ssh user@host
Permission denied (publickey). 

উত্তর:


182

যেমনটি আপনি উল্লেখ করেছেন, পরিবেশগত পরিবর্তনগুলি sudoসুরক্ষার কারণে, দ্বারা সরানো হবে ।

তবে সৌভাগ্যক্রমে sudoবেশ কনফিগারযোগ্য: আপনি env_keepকনফিগারেশন বিকল্পের জন্য কোন পরিবেশের ভেরিয়েবলকে ধন্যবাদ রাখতে চান তা আপনি তা সঠিকভাবে বলতে পারবেন /etc/sudoers

এজেন্ট ফরওয়ার্ডিংয়ের জন্য আপনার SSH_AUTH_SOCKপরিবেশকে পরিবর্তনশীল রাখতে হবে । এটি করতে, কেবল আপনার /etc/sudoersকনফিগারেশন ফাইলটি (সর্বদা ব্যবহার করা visudo) সম্পাদনা করুন এবং env_keepউপযুক্ত ব্যবহারকারীদের জন্য বিকল্পটি সেট করুন । আপনি যদি চান যে এই বিকল্পটি সমস্ত ব্যবহারকারীর জন্য সেট করা থাকে তবে Defaultsলাইনটি এভাবে ব্যবহার করুন :

Defaults    env_keep+=SSH_AUTH_SOCK

man sudoers বিস্তারিত জানার জন্য.

আপনি এখন এই ভালো কিছু করতে সক্ষম হওয়া উচিত (প্রদত্ত user1'সর্বজনীন কী গুলি উপস্থিত ~/.ssh/authorized_keysমধ্যে user1@serverAএবং user2@serverBএবং serverAএর /etc/sudoersফাইল হিসাবে উপরে উল্লিখিত সেটআপ):

user1@mymachine> eval `ssh-agent`  # starts ssh-agent
user1@mymachine> ssh-add           # add user1's key to agent (requires pwd)
user1@mymachine> ssh -A serverA    # no pwd required + agent forwarding activated
user1@serverA> sudo su - user2     # sudo keeps agent forwarding active :-)
user2@serverA> ssh serverB         # goto user2@serverB w/o typing pwd again...
user2@serverB>                     # ...because forwarding still works

1
এটি সঠিক উত্তর, চিহ্নিত করা উচিত।
এক্সিলোট

41
এটি কেবল যদি কাজ করে তবে user2উপরের root! অন্যথায়, user2এসএসএইচ_এইউথ_সককে সঠিকভাবে সেট আপ করা হবে, তবে তারা user2যেমন / tmp / ssh-GjglIJ9337 / এ অ্যাক্সেস করতে সক্ষম হবে না। rootযে অ্যাক্সেস আছে। সুতরাং এটি সমস্যার একটি অংশ সমাধান করতে পারে তবে ওপিগুলিতে নয়: " এবং সকেটটি কেবলমাত্র আমার মূল ব্যবহারকারী দ্বারা পঠনযোগ্য"
পিটার ভি।

6
Defaults>root env_keep+=SSH_AUTH_SOCKরুটটিতে sudoing করার সময় এটি কেবল এগিয়ে চলেছে তা নিশ্চিত করা উচিত । সুরক্ষার কারণে আপনি অন্য ব্যবহারকারীদের কাছে এটি করতে চান না। অন্যের জন্য পৃথক ssh-এজেন্ট চালানো ভাল, এবং উপযুক্ত কী যুক্ত করুন।
পল শাইস্কা

1
sudo su -আমার জন্য কাজ করে না, সম্ভবত এটি পরিবেশ সংরক্ষণ করতে পারে না কারণ এটি sudoশেল শুরুর সময় নয়। sudo suকাজ মনে হচ্ছে।
অ্যালেক্স ফরচুনা

3
লোকেরা কেন sudo suযেভাবে ব্যবহার করে তা আমি কখনই বুঝতে পারি নি । আপনার যদি কোনও রুট শেল দরকার হয় তবে এটিই sudo -sবা sudo -iএর জন্য।
ইজ

68
sudo -E -s
  • -আমরা পরিবেশ রক্ষা করব
  • -s কমান্ড চালায়, শেলের সাথে ডিফল্ট হয়

এটি আপনাকে আসল কীগুলি এখনও লোড সহ একটি রুট শেল দেবে।


2
উপরের মন্তব্যের মত, এটি কেবলমাত্র যদি আপনি মূল হয়ে উঠছেন তবে প্রশ্নটিকে সম্বোধন করে, কারণ সেই ক্ষেত্রে রুটটি H এসএসএইচ_এইউটিএসএসকেকে স্বাভাবিক অ্যাক্সেসের অনুমতি পেতে সক্ষম হয়।
দোশিয়ার

35

অনুমতি দিন otheruser অ্যাক্সেস করতে $SSH_AUTH_SOCKফাইল এবং এটি সঠিক ACL এর দ্বারা ডিরেক্টরি আছে, উদাহরণস্বরূপ, তাদের স্যুইচ করার আগে। হোস্ট মেশিনে উদাহরণটি ধরে নেওয়া Defaults:user env_keep += SSH_AUTH_SOCKহয়েছে /etc/sudoers:

$ ssh -A user@host
user@host$ setfacl -m otheruser:x   $(dirname "$SSH_AUTH_SOCK")
user@host$ setfacl -m otheruser:rwx "$SSH_AUTH_SOCK"
user@host$ sudo su - otheruser
otheruser@host$ ssh server
otheruser@server$

আরও সুরক্ষিত এবং অ-মূল ব্যবহারকারীদের জন্যও কাজ করে ;-)


6
এই পদ্ধতিটি ব্যবহার করার সময় মনে রাখবেন, অন্যান্য হিসাবে লগ ইন করা ব্যক্তিরাও otheruserআপনার এসএস প্রমাণীকরণ ব্যবহার করতে পারে।
গীতারিক

এটি আমার জন্য কাজ করে তবে আমাকে "sudo su - otheruser" পরিবর্তন করে "sudo su otheruser" (- - অপসারণ) করতে হবে।
চার্লস ফিনকেল

1
কেন rwxএবং না rw(বা rআদৌ)?
অ্যানাটোলি টেকটোনিক

3
@ এনাটোলিটিচটোনিক থেকে man 7 unix- লিনাক্সে সকেটে সংযুক্ত হওয়ার জন্য সেই সকেটে পড়ার এবং লেখার অনুমতি প্রয়োজন। এছাড়াও আপনি সকেট তৈরি করেন এমন ডিরেক্টরিতে অনুসন্ধান (চালানো) এবং লেখার অনুমতি প্রয়োজন হয় বা আপনি যখন এই সকেটের সাথে সংযুক্ত হন তখন কেবল অনুসন্ধান (চালানো) অনুমতি প্রয়োজন। সুতরাং উপরের উত্তরে সকেটের উপর নির্বাহের অনুমতিটি নিরর্থক।
18:21

পরিবর্তে আপনি / etc / sudoers সম্পাদনা করতে পারেনsudo -u otheruser --preserve-env=HOME -s
সেক

14

আমি খুঁজে পেয়েছি যে এটি কাজ করে।

sudo su -l -c "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK; bash"

অন্যরা যেমন উল্লেখ করেছে, আপনি যে ব্যবহারকারীর স্যুইচ করছেন সেটি যদি $ এসএসএইচ_এইউথ_সক (যেটি মূলের পাশাপাশি কোনও ব্যবহারকারী) পড়ার অনুমতি না থাকে তবে এটি কাজ করবে না। আপনি around SSH_AUTH_SOCK এবং এটির ডিরেক্টরিতে অনুমতি রয়েছে সেই ডিরেক্টরিটি 777 সেট করে আপনি এটিকে পেতে পারেন।

chmod 777 -R `dirname $SSH_AUTH_SOCK`
sudo su otheruser -l -c "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK; bash"

যদিও এটি বেশ ঝুঁকিপূর্ণ। আপনি মূলত আপনার এসএসএইচ এজেন্টকে (আপনি লগ আউট না করা পর্যন্ত) সিস্টেমের অনুমতিপ্রাপ্ত অন্য প্রতিটি ব্যবহারকারীকে দিচ্ছেন। আপনি গোষ্ঠীটি সেট করতে এবং অনুমতিগুলি 770 এ পরিবর্তন করতে সক্ষম হতে পারেন যা আরও সুরক্ষিত হতে পারে। তবে, আমি যখন গ্রুপটি পরিবর্তন করার চেষ্টা করেছি তখন আমি "অপারেশন অনুমোদিত নয়" পেয়েছি।


6
এটি অত্যন্ত ঝুঁকিপূর্ণ। আপনার এসএসএইচ এজেন্ট ব্যবহারের জন্য অন্য প্রত্যেক ব্যবহারকারীর অনুমতি দেওয়া তাদেরকে আপনার সমস্ত শংসাপত্র দেওয়ার সমতুল্য (এবং যদি আপনি কখনও সুডো বা স্যু ব্যবহার করেন, তাদের সিস্টেমে অন্য সমস্ত ব্যবহারকারীর উপর রুট শক্তি প্রদান করার পাশাপাশি আপনি যে সমস্ত সিস্টেমে চালিত হন!) । এটি কখনই করা উচিত নয়!
মাতিজা নালিস

4
"এটি কখনই করা উচিত নয়!" এই বক্তব্যের সাথে আমি একমত নই! অনেকগুলি ক্ষেত্রেই এই ঝুঁকিটি গ্রহণযোগ্য। উদাহরণস্বরূপ, একটি ছোট দল যেখানে প্রত্যেকের জন্য একই অনুমতি রয়েছে এবং আপনি অন্য সমস্ত ব্যবহারকারীর উপর বিশ্বাস রাখেন। এর সাথে জড়িত ঝুঁকিগুলি বোঝার আগে এটি করা উচিত নয়। তবে একবার এই ঝুঁকিগুলি বোঝা গেলে, এমন ঝুঁকিগুলি গ্রহণযোগ্য।
phylae

6

আপনি যদি অনুমোদিত হন sudo su - $USERতবে আপনার সম্ভবত ssh -AY $USER@localhostvalid USER এর হোম ডিরেক্টরিতে আপনার বৈধ পাবলিক কী সহ পরিবর্তে অনুমতি দেওয়ার পক্ষে একটি ভাল যুক্তি থাকতে পারে । তারপরে আপনার প্রমাণীকরণের ফরওয়ার্ডিং আপনার সাথে চালিত হবে।


তিনি তাঁর প্রশ্নের নীচে এটি উল্লেখ করেছেন এবং বলেছেন এটি করা কঠিন হবে।
ফাহাদ সদাহ

এটি সম্ভবত সেরা সমাধান তবে এটি লোমশ হয়ে ওঠে যদি $ ব্যবহারকারী সত্যিকারের ব্যক্তি (টিএম) হয় - তারা অনুমোদিত_কিগুলি থেকে এসএ-এর চাবি মুছে ফেলতে পারে বা তাদের পাসওয়ার্ড পরিবর্তন করতে পারে ...
voretaq7

আপনি অনুমোদিত_কিগুলিতে তাদের লেখার অ্যাক্সেস সরিয়ে ফেলতে পারেন (যদিও তারা সত্যই ফ্লোরিয়ার অ্যাক্সেস অস্বীকার করার বিষয়ে সেট করা থাকে তবে তারা এটি মুছে ফেলা এবং পুনরায় তৈরি করতে পারে, এটি তাদের নিজস্ব ডিরেক্টরিতে রয়েছে)
ফাহাদ সদাহ

4

আপনি sudo ব্যবহারের পরিবর্তে এজেন্ট ফরোয়ার্ডিং সহ সর্বদা লোকালহোস্টে এসএসএস করতে পারেন:

ssh -A otheruser@localhost

অসুবিধাটি হ'ল আপনাকে আবার লগ ইন করতে হবে, তবে আপনি যদি এটি কোনও স্ক্রিন / টিএমউक्स ট্যাবে ব্যবহার করেন তবে এটি কেবল একবারের প্রচেষ্টা, তবে আপনি যদি সার্ভার থেকে সংযোগ বিচ্ছিন্ন করেন তবে সকেটটি আবার অবশ্যই ভেঙে যাবে । সুতরাং আপনি যদি আপনার স্ক্রিন / টিএমএক্স সেশনটি সর্বদা খোলা রাখতে না পারেন তবে এটি আদর্শ নয় (তবে SSH_AUTH_SOCKআপনি শীতল হলে আপনি নিজের এনভিটি ভার ম্যানুয়ালি আপডেট করতে পারবেন)।

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


এই আপনি শুধুমাত্র এক্সেস আছে কাজ করে না otheruserমাধ্যমে sudoপরিবর্তে SSH- র মাধ্যমে (যেমন আপনি SCP- র কাপড় চাই www-data)
গার্টি ভ্যান ডেন বার্গ

3

ব্যবহার না sudo su - USER, বরং sudo -i -u USER। আমার জন্য কাজ কর!


আপনার কি sudo সংস্করণ আছে? খনি (1.6.7p5, CentOS 4.8) এর ম্যান পৃষ্ঠাতে -i নেই।
ডেভিড ম্যাকিনটোস

Sudo version 1.6.9p17দেবিয়ান লেনির উপর চলছে। চেষ্টা করবেন sudo -s?
ফাহাদ সদঃ

6
আমার জন্য কাজ করে না।

উবুন্টু তারিখে, Sudo 1.8.9p5 ব্যবহার করে, তন্ন তন্ন sudo -sনা sudo -iআমার জন্য কাজ ...
জন এল

2

অন্যান্য উত্তরগুলির সাথে তথ্যের সংমিশ্রণটি আমি এর সাথে এলাম:

user=app
setfacl -m $user:x $(dirname "$SSH_AUTH_SOCK")
setfacl -m $user:rwx "$SSH_AUTH_SOCK"
sudo SSH_AUTH_SOCK="$SSH_AUTH_SOCK" -u $user -i

আমি এটি পছন্দ করি কারণ আমার sudoersফাইল সম্পাদনা করার দরকার নেই ।

উবুন্টু 14.04 এ পরীক্ষিত ( aclপ্যাকেজ ইনস্টল করতে হয়েছিল )।


1

আমি মনে করি আপনার কমান্ডের -পরে (ড্যাশ) বিকল্পে কোনও সমস্যা আছে su:

sudo su - otheruser

আপনি যদি su এর ম্যান পৃষ্ঠাটি পড়েন , আপনি দেখতে পাবেন যে বিকল্পটি -, -l, --loginলগইন শেল হিসাবে শেল পরিবেশ শুরু করে starts otheruserআপনি যেখানে চালান সেই এনভির ভেরিয়েবল নির্বিশেষে এটি পরিবেশ করবে su

সহজ কথায় বলতে গেলে ড্যাশগুলি আপনার কাছ থেকে পাস করা যেকোনো কিছুকে হ্রাস করবে sudo

পরিবর্তে, আপনার এই আদেশটি চেষ্টা করা উচিত:

sudo -E su otheruser

@ জোয়াও-কস্তা হিসাবে উল্লেখ করা হয়েছে, -Eআপনি যে পরিবেশে গিয়েছিলেন সেখানে সমস্ত পরিবর্তনশীল সংরক্ষণ করবে sudo। তারপরে ড্যাশ ছাড়াই suসরাসরি সেই পরিবেশটি ব্যবহার করবে।


0

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

"Ssh -Ay {{USER} @ লোকালহোস্ট" পদ্ধতিটি কিছুটা জটিল (এবং ডেভিডের উত্তর ভাঙ্গার প্রবণতায় আমার মন্তব্যে উল্লিখিত হিসাবে) তবে এটি সম্ভবত আপনি সবচেয়ে ভাল করতে পারেন।


1
হুম, তবে আমি যদি এসএসএস দিয়ে এটি করি তবে আমার এজেন্ট যেভাবেই ব্যবহারকারীর দ্বারা অ্যাক্সেসযোগ্য, বা আমি ভুল করছি?

আপনি যদি এজেন্ট ফরওয়ার্ডিং সহ টার্গেট ব্যবহারকারীর মধ্যে এসএসএইচ করে থাকেন তবে আপনার এজেন্টের অনুরোধগুলি "আসল" এজেন্ট যেখানেই রয়েছে সেখানে চেইনটি আছড়ে দেবে। আপনি যখন মূল ব্যবহারকারী থেকে স্যু বা স্যুডো দূরে সরে যাবেন তখন আপনার এসএসএইচ এজেন্ট সকেট অ্যাক্সেসযোগ্য হবে না (বা হওয়া উচিত নয়) - এটি যে ডিরেক্টরিতে থাকে সেটি মোড 700 এবং মূল ব্যবহারকারীর মালিকানাধীন। (স্পষ্টত ক্যাভেট: আপনি যদি এসএসএইচ_এইউথ_এসকি পরিবেশটি রুট করে রিসেট করতে চান তবে এটি কাজ করতে পারে তবে আমি তার উপর নির্ভর করব না)
ভোরেটাক 7

1
আমার সার্ভারে (উবুন্টু 12.04, এসএসএস সংস্করণ ওপেনএসএসএইচ_5.9 পি 1 দেবিয়ান -5 বুন্টু 1.1, ওপেনএসএসএল 1.0.1 14 মার্চ 2012), এসএসএস রয়েছে -aএবং -Aযুক্তি রয়েছে। -aকী উদ্দেশ্যে করা হয়েছে তার ঠিক বিপরীত কাজ করে, এটি এজেন্ট ফরওয়ার্ডিংকে অক্ষম করে! সুতরাং, উবুন্টুর সাম্প্রতিক (এবং সম্ভবত সমস্ত) সংস্করণে -Aএজেন্ট ফরওয়ার্ডিং সক্ষম করতে ব্যবহার করুন ।
নাইট

@knite আপনি সঠিক - আমার উত্তরে এটি একটি (3 বছর বয়সী!) টাইপ এখনই স্থির করা হয়েছে :-)
ভোরেটাক 7
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.