আমি ssh-এজেন্টে যুক্ত ssh কীগুলি ফরোয়ার্ডিং সক্ষম করতে ssh কনফিগারেশন ফাইলটি ব্যবহার করতে পারি। জিপিজি কী দিয়ে আমি কীভাবে এটি করতে পারি?
আমি ssh-এজেন্টে যুক্ত ssh কীগুলি ফরোয়ার্ডিং সক্ষম করতে ssh কনফিগারেশন ফাইলটি ব্যবহার করতে পারি। জিপিজি কী দিয়ে আমি কীভাবে এটি করতে পারি?
উত্তর:
সম্পাদনা: এই উত্তরটি এখন অপ্রচলিত যে ওপেনএসএসএইচে যথাযথ সমর্থন কার্যকর করা হয়েছে, ব্রায়ান মিন্টনের উত্তর দেখুন।
এসএসএইচ কেবল টানেলের মধ্যে টিসিপি সংযোগগুলি ফরোয়ার্ড করতে সক্ষম।
তবে, socat
আপনি টিসিপির মাধ্যমে ইউনিক্স সকেটটি রিলে করার মতো একটি প্রোগ্রাম ব্যবহার করতে পারেন, এর মতো কিছু (আপনার ক্লায়েন্ট এবং সার্ভার হোস্ট উভয় ক্ষেত্রেই স্য্যাট প্রয়োজন হবে):
# Get the path of gpg-agent socket:
GPG_SOCK=$(echo "$GPG_AGENT_INFO" | cut -d: -f1)
# Forward some local tcp socket to the agent
(while true; do
socat TCP-LISTEN:12345,bind=127.0.0.1 UNIX-CONNECT:$GPG_SOCK;
done) &
# Connect to the remote host via ssh, forwarding the TCP port
ssh -R12345:localhost:12345 host.example.com
# (On the remote host)
(while true; do
socat UNIX-LISTEN:$HOME/.gnupg/S.gpg-agent,unlink-close,unlink-early TCP4:localhost:12345;
done) &
এটি কার্যকর হয় কিনা পরীক্ষা করুন gpg-connect-agent
। নিশ্চিত করুন যে জিপিজি_এজিআইআইএনএফও দূরবর্তী হোস্টে অপরিবর্তিত রয়েছে, যাতে এটি $HOME/.gnupg/S.gpg-agent
সকেটে পড়ে যায় ।
এখন আশা করি আপনার যা যা প্রয়োজন তা হ'ল এই সমস্ত স্বয়ংক্রিয়ভাবে চালনার উপায়!
localhost
এখনই আবদ্ধ ।
gpg-connect-agent
: can't connect to server: ec=31.16383 gpg-connect-agent: error sending RESET command: Invalid value passed to IPC
। রিমোটটি socat
তখন মারা যায়। স্থানীয় socat
মারা যায় এবং উচ্চারিত হয় socat[24692] E connect(3, AF=1 "", 2): Invalid argument
। এই পৃষ্ঠাটি আমাকে বিশ্বাস করতে পরিচালিত করে যে এটি কখনই কাজ করবে না, কারণ এজেন্ট কীটি (কেবল পাসফ্রেজ) সংরক্ষণ করে না। এটি কি কারও দ্বারা কাজ করার বিষয়টি নিশ্চিত হয়েছে?
ওপেনএসএইচ-এর নতুন ইউনিক্স ডোমেন সকেট ফরোয়ার্ডিং এটি সরাসরি 6.7 সংস্করণ দিয়ে শুরু করতে পারে।
আপনার মতো কিছু করতে সক্ষম হওয়া উচিত:
ssh -R /home/bminton/.gnupg/S.gpg-agent:/home/bminton/.gnupg/S-gpg-agent -o "StreamLocalBindUnlink=yes" -l bminton 192.168.1.9
GnuPG বা লিনাক্স বিতরণের নতুন সংস্করণে সকেটের পাথগুলি পরিবর্তন হতে পারে। এগুলির মাধ্যমে খুঁজে পাওয়া যাবে
$ gpgconf --list-dirs agent-extra-socket
এবং
$ gpgconf --list-dirs agent-socket
তারপরে আপনার এসএসএইচ কনফিগারেশনে এই পাথগুলি যুক্ত করুন:
Host remote
RemoteForward <remote socket> <local socket>
সর্বজনীন কীগুলি অনুলিপি করার জন্য দ্রুত সমাধান:
scp .gnupg/pubring.kbx remote:~/.gnupg/
রিমোট মেশিনে, জিপিজি এজেন্টটি সক্রিয় করুন:
echo use-agent >> ~/.gnupg/gpg.conf
রিমোট মেশিনে, এসএসএইচ সার্ভার কনফিগারেশনটিও পরিবর্তন করুন এবং এই প্যারামিটারটি যুক্ত করুন (/ etc / ssh / sshd_config):
StreamLocalBindUnlink yes
এসএসএইচ সার্ভারটি পুনরায় চালু করুন, রিমোট মেশিনে পুনরায় সংযোগ করুন - তারপরে এটি কাজ করা উচিত।
systemctl --global mask --now gpg-agent.service gpg-agent.socket gpg-agent-ssh.socket gpg-agent-extra.socket gpg-agent-browser.socket
হয় এটি রিমোট জিপিজি-এজেন্ট চুরি করে সকেট চালানো থেকে সিস্টেমডকে আটকাতে প্রয়োজন। বাগস.ডেবিয়ান.আর / 850982 অনুসারে এটি হ'ল উদ্দেশ্যমূলক আচরণ।
আমাকে একই কাজটি করতে হয়েছিল এবং আমার স্ক্রিপ্টটি বি-এফএফ দ্বারা সমাধানের উপর ভিত্তি করে কয়েকটি ছোট ছোট পরিবর্তন করে: এটি প্রস্থান করে এবং ব্যাকগ্রাউন্ড প্রক্রিয়াগুলিকে মেরে ফেলে এবং এটি "কাঁটাচামচ" এবং "পুনরায় ব্যবহারযোগ্য" বিকল্পগুলি সকেটে ব্যবহার করে, যা আপনাকে সংরক্ষণ করে লুপ (এবং ব্যাকগ্রাউন্ড সস্যাট পরিষ্কারভাবে হত্যা-সক্ষম করে তোলে)।
পুরো জিনিসটি একসাথে সমস্ত ফরোয়ার্ড সেট আপ করে, তাই এটি সম্ভবত একটি স্বয়ংক্রিয় সেটআপের কাছাকাছি আসে।
মনে রাখবেন যে দূরবর্তী হোস্টে আপনার প্রয়োজন হবে:
GPG_AGENT_INFO
ভেরিয়েবল। আমি আমার সাথে প্রিফিল করি ~/.gnupg/S.gpg-agent:1:1
- প্রথম 1 হ'ল জিপিজি এজেন্টের জন্য একটি পিআইডি (আমি এটি "init" এর হিসাবে নকল করি, যা সর্বদা চলমান), দ্বিতীয়টি এজেন্ট প্রোটোকল সংস্করণ নম্বর। এটি আপনার স্থানীয় মেশিনে চলমান সাথে মেলে।
#!/bin/bash -e
FORWARD_PORT=${1:-12345}
trap '[ -z "$LOCAL_SOCAT" ] || kill -TERM $LOCAL_SOCAT' EXIT
GPG_SOCK=$(echo "$GPG_AGENT_INFO" | cut -d: -f1)
if [ -z "$GPG_SOCK" ] ; then
echo "No GPG agent configured - this won't work out." >&2
exit 1
fi
socat TCP-LISTEN:$FORWARD_PORT,bind=127.0.0.1,reuseaddr,fork UNIX-CONNECT:$GPG_SOCK &
LOCAL_SOCAT=$!
ssh -R $FORWARD_PORT:127.0.0.1:$FORWARD_PORT socat 'UNIX-LISTEN:$HOME/.gnupg/S.gpg-agent,unlink-close,unlink-early,fork,reuseaddr TCP4:localhost:$FORWARD_PORT'
আমি বিশ্বাস করি এর একটি সমাধানও রয়েছে যার মধ্যে একটি মাত্র এসএসএইচ কমান্ডের আহ্বান (রিমোট হোস্ট থেকে স্থানীয় সাথে ফিরে সংযোগ স্থাপন) জড়িত রয়েছে -o LocalCommand
, তবে কীভাবে প্রস্থান করার পরে কীভাবে সুবিধাজনকভাবে এটি হত্যা করা যায় তা আমি যথেষ্ট বুঝতে পারি না।
GnuPG উইকির মতে আপনাকে দূরবর্তী সকেটটি S.gpg-agent.extra
স্থানীয় সকেটে ফরোয়ার্ড করতে হবে S.gpg-agent
। StreamLocalBindUnlink
তবুও আপনাকে সার্ভারে সক্ষম করতে হবে ।
মনে রাখবেন যে আপনার দূরবর্তী GnuPG- এ আপনার কীগুলির সর্বজনীন অংশও উপলব্ধ রয়েছে ।
আসল পাথ পেতে gpgconf --list-dir agent-socket
যথাক্রমে gpgconf --list-dir agent-extra-socket
রিমোটে ব্যবহার করুন ।
রিমোটে সংযুক্ত কনফিগারেশন /etc/sshd_config
:
StreamLocalBindUnlink yes
রিমোটে আপনার সর্বজনীন কী আমদানি করুন:
gpg --export <your-key> >/tmp/public
scp /tmp/public <remote-host>:/tmp/public
ssh <remote-host> gpg --import /tmp/public
জিপিজি-এজেন্ট ফরওয়ার্ডিং সক্ষম করে এসএসএইচ দিয়ে সংযোগ করার কমান্ড: (আমার ডেবিয়ানের জন্য পথ)
ssh -R /run/user/1000/gnupg/S.gpg-agent:/run/user/1000/gnupg/S.gpg-agent.extra <remote-host>
এর /etc/ssh/sshd_config
সাথে সংশোধন করার বিকল্প হিসাবে StreamLocalBindUnlink yes
, আপনি পরিবর্তে সকেট ফাইলগুলির তৈরি প্রতিরোধ করতে পারেন:
systemctl --global mask --now \
gpg-agent.service \
gpg-agent.socket \
gpg-agent-ssh.socket \
gpg-agent-extra.socket \
gpg-agent-browser.socket
নোট করুন যে এটি হোস্টের সমস্ত ব্যবহারকারীকে প্রভাবিত করে।
বোনাস: জিপিজি এজেন্ট ফরওয়ার্ডিং কীভাবে পরীক্ষা করবেন তা কাজ করছে:
ssh -v -o RemoteForward=${remote_sock}:${local_sock} ${REMOTE}
${remote_sock}
Ssh থেকে ভার্বোজ আউটপুটে প্রদর্শিত হবে তা পরীক্ষা করে দেখুনls -l ${remote_sock}
gpg --list-secret-keys
debug1
আপনার প্রেরিত ট্র্যাফিক দেখিয়ে ssh এর প্রচুর বার্তা দেখতে হবেযদি এটি কাজ না করে (যেমনটি আমার পক্ষে হয়নি) আপনি জিপিজি কোন সকেট অ্যাক্সেস করছে তা সনাক্ত করতে পারেন:
strace -econnect gpg --list-secret-keys
নমুনা আউটপুট:
connect(5, {sa_family=AF_UNIX, sun_path="/run/user/14781/gnupg/S.gpg-agent"}, 35) = 0
আমার ক্ষেত্রে পথটি অ্যাক্সেসের সাথে নিখুঁতভাবে মিলেছে ${remote_sock}
, তবে সেই সকেটটি sshd
আমি যুক্ত করেও লগ ইন করার পরে তৈরি StreamLocalBindUnlink yes
করা হয়নি /etc/ssh/sshd_config
। আমি লগইন করার পরে সিস্টেমড দ্বারা তৈরি করা হয়েছিল।
(দ্রষ্টব্য আমি sshd পুনরায় আরম্ভ করতে খুব কাপুরুষোচিত ছিলাম , যেহেতু এখনই হোস্টের কাছে আমার কোনও শারীরিক অ্যাক্সেস নেই service reload sshd
clearly স্পষ্টতই যথেষ্ট ছিল না ...)
উবুন্টু 16.04 এ পরীক্ষিত