আমি কীভাবে একটি এসপি-এজেন্টের মাধ্যমে একটি জিপিজি কী ফরোয়ার্ড করতে পারি?


29

আমি ssh-এজেন্টে যুক্ত ssh কীগুলি ফরোয়ার্ডিং সক্ষম করতে ssh কনফিগারেশন ফাইলটি ব্যবহার করতে পারি। জিপিজি কী দিয়ে আমি কীভাবে এটি করতে পারি?


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

ওপেনশ্যা +.7+ সমাধানের অন্য উপস্থাপনার জন্য, 2015.rmll.info/IMG/pdf/an-advanced-intr پيداوار- to
phs

এটি আমার পক্ষে কার্যকর ছিল।
phs

উত্তর:


16

সম্পাদনা: এই উত্তরটি এখন অপ্রচলিত যে ওপেনএসএসএইচে যথাযথ সমর্থন কার্যকর করা হয়েছে, ব্রায়ান মিন্টনের উত্তর দেখুন।

এসএসএইচ কেবল টানেলের মধ্যে টিসিপি সংযোগগুলি ফরোয়ার্ড করতে সক্ষম।

তবে, 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সকেটে পড়ে যায় ।

এখন আশা করি আপনার যা যা প্রয়োজন তা হ'ল এই সমস্ত স্বয়ংক্রিয়ভাবে চালনার উপায়!


ঠিক আছে কনফিগারেশন ফাইলে ফরওয়ার্ডিং সেট করার পরে ssh এজেন্ট কীগুলি স্বয়ংক্রিয়ভাবে ফরোয়ার্ড হয়। আমি এই চেষ্টা হবে।
txwikinger

আপনি ঠিক বলেছেন, ssh- এজেন্ট একটি ইউনিক্স সকেটও ব্যবহার করে, তবে এর জন্য বিশেষ সমর্থন রয়েছে (এখানে কিছুটা ক্লান্ত :) তবে, সমাধানটি এখনও কাজ করা উচিত।
b0fh

1
এই সমাধানের জন্য, আমার জিপিজি-এজেন্ট 12345 পোর্টের মাধ্যমে সর্বজনীনভাবে অ্যাক্সেসযোগ্য হবে যদি আমি ফায়ারওয়াল / NAT এর পিছনে না থাকি। দয়া করে উত্তরে এটি উল্লেখ করা উচিত।
জোনাস শোফার

আমি অনুমান করছি যে আপনার শেষ সম্পাদনাটি সমস্যার সমাধান করেছে, জোনাস? এটি localhostএখনই আবদ্ধ ।
jmtd

এই দূরবর্তী হোস্টের থেকে নিম্নোক্ত যুক্তি দিয়ে আমাকে ব্যর্থ 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এই পৃষ্ঠাটি আমাকে বিশ্বাস করতে পরিচালিত করে যে এটি কখনই কাজ করবে না, কারণ এজেন্ট কীটি (কেবল পাসফ্রেজ) সংরক্ষণ করে না। এটি কি কারও দ্বারা কাজ করার বিষয়টি নিশ্চিত হয়েছে?
jmtd

17

ওপেনএসএইচ-এর নতুন ইউনিক্স ডোমেন সকেট ফরোয়ার্ডিং এটি সরাসরি 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

@DrewR। এটা শুনে আনন্দিত হলাম.
ব্রায়ান মিন্টন

2
আমি একটি প্রয়োজনীয় সমালোচনা বিশদ পেয়েছি: রিমোট (ব্যক্তিগত কী-কম) মেশিনে, স্বাক্ষরকারী পরিচয়ের পাবলিক কী অবশ্যই উপস্থিত থাকতে হবে। স্থানীয় জিপিজি সংস্করণ 2.1.15 ওএস এক্স, রিমোট 2.1.11 লিনাক্স।
পিএইচএস

4

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

এসএসএইচ সার্ভারটি পুনরায় চালু করুন, রিমোট মেশিনে পুনরায় সংযোগ করুন - তারপরে এটি কাজ করা উচিত।


কিছু সমস্যা সমাধানের একটি আরও বিশদ বিশদ টিউটোরিয়াল এখানে পাওয়া যাবে: mlohr.com/gpg-agent-forwarding
MaLo

1
যদি রিমোট হোস্টটি ডেবিয়ানের বর্তমান সংস্করণটি চালায় তবে মনে systemctl --global mask --now gpg-agent.service gpg-agent.socket gpg-agent-ssh.socket gpg-agent-extra.socket gpg-agent-browser.socketহয় এটি রিমোট জিপিজি-এজেন্ট চুরি করে সকেট চালানো থেকে সিস্টেমডকে আটকাতে প্রয়োজন। বাগস.ডেবিয়ান.আর / 850982 অনুসারে এটি হ'ল উদ্দেশ্যমূলক আচরণ।
সাম্পি

3

আমাকে একই কাজটি করতে হয়েছিল এবং আমার স্ক্রিপ্টটি বি-এফএফ দ্বারা সমাধানের উপর ভিত্তি করে কয়েকটি ছোট ছোট পরিবর্তন করে: এটি প্রস্থান করে এবং ব্যাকগ্রাউন্ড প্রক্রিয়াগুলিকে মেরে ফেলে এবং এটি "কাঁটাচামচ" এবং "পুনরায় ব্যবহারযোগ্য" বিকল্পগুলি সকেটে ব্যবহার করে, যা আপনাকে সংরক্ষণ করে লুপ (এবং ব্যাকগ্রাউন্ড সস্যাট পরিষ্কারভাবে হত্যা-সক্ষম করে তোলে)।

পুরো জিনিসটি একসাথে সমস্ত ফরোয়ার্ড সেট আপ করে, তাই এটি সম্ভবত একটি স্বয়ংক্রিয় সেটআপের কাছাকাছি আসে।

মনে রাখবেন যে দূরবর্তী হোস্টে আপনার প্রয়োজন হবে:

  1. কীরিংগুলি আপনি সাইন / এন / ডিক্রিপ্ট স্টাফ ব্যবহার করতে চান।
  2. রিমোটে জিপিজির সংস্করণ অনুসারে, একটি নকল 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, তবে কীভাবে প্রস্থান করার পরে কীভাবে সুবিধাজনকভাবে এটি হত্যা করা যায় তা আমি যথেষ্ট বুঝতে পারি না।


আপনি শেষ কমান্ডে সকেটের আগে কিছু 'ব্যবহারকারীর @ হোস্ট' যুক্তিটি মিস করছেন না? যাইহোক, এটি ঠিক করার পরেও, এটি আমার জন্য "সাকট [E 67৮৮] ই কানেক্ট (3, এএফ = 2 127.0.0.1:0, 16) এর সাথে ব্যর্থ হয়: জিপিজি-কানেক্ট-এজেন্টকে দূরবর্তীভাবে চেষ্টা করার সময় সংযোগটি" স্থানীয়ভাবে পপ আপ করতে অস্বীকার করেছিল।
ডেভিড ফিউর

1

GnuPG উইকির মতে আপনাকে দূরবর্তী সকেটটি S.gpg-agent.extraস্থানীয় সকেটে ফরোয়ার্ড করতে হবে S.gpg-agentStreamLocalBindUnlinkতবুও আপনাকে সার্ভারে সক্ষম করতে হবে ।
মনে রাখবেন যে আপনার দূরবর্তী GnuPG- এ আপনার কীগুলির সর্বজনীন অংশও উপলব্ধ রয়েছে ।

আসল পাথ পেতে gpgconf --list-dir agent-socketযথাক্রমে gpgconf --list-dir agent-extra-socketরিমোটে ব্যবহার করুন ।


সারাংশ

  1. রিমোটে সংযুক্ত কনফিগারেশন /etc/sshd_config:

    StreamLocalBindUnlink yes
    
  2. রিমোটে আপনার সর্বজনীন কী আমদানি করুন:

    gpg --export <your-key> >/tmp/public
    scp /tmp/public <remote-host>:/tmp/public
    ssh <remote-host> gpg --import /tmp/public
    
  3. জিপিজি-এজেন্ট ফরওয়ার্ডিং সক্ষম করে এসএসএইচ দিয়ে সংযোগ করার কমান্ড: (আমার ডেবিয়ানের জন্য পথ)

    ssh -R /run/user/1000/gnupg/S.gpg-agent:/run/user/1000/gnupg/S.gpg-agent.extra <remote-host>
    

@ ব্রায়ান মিটন: অতিরিক্ত সকেটে না পাঠানো আমার পক্ষে কাজ করে না।
doak

0

এর /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 sshdclearly স্পষ্টতই যথেষ্ট ছিল না ...)

উবুন্টু 16.04 এ পরীক্ষিত

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