Tôi có thể sử dụng tệp cấu hình ssh để cho phép chuyển tiếp các khóa ssh được thêm vào ssh-agent. Làm thế nào tôi có thể làm tương tự với các phím gpg?
Tôi có thể sử dụng tệp cấu hình ssh để cho phép chuyển tiếp các khóa ssh được thêm vào ssh-agent. Làm thế nào tôi có thể làm tương tự với các phím gpg?
Câu trả lời:
EDIT: Câu trả lời này đã lỗi thời khi hỗ trợ phù hợp đã được triển khai trong OpenSSH, xem câu trả lời của Brian Minton.
SSH chỉ có khả năng chuyển tiếp các kết nối tcp trong đường hầm.
Tuy nhiên, bạn có thể sử dụng một chương trình như socat
để chuyển tiếp ổ cắm unix qua TCP, với một cái gì đó tương tự (bạn sẽ cần giao tiếp cả trên máy khách và máy chủ lưu trữ):
# 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) &
Kiểm tra nếu nó hoạt động với gpg-connect-agent
. Đảm bảo rằng GPG_AGENT_INFO không được xác định trên máy chủ từ xa, để nó rơi trở lại $HOME/.gnupg/S.gpg-agent
ổ cắm.
Bây giờ hy vọng tất cả những gì bạn cần là một cách để chạy tất cả điều này một cách tự động!
localhost
bây giờ nó chỉ ràng buộc thôi.
gpg-connect-agent
: can't connect to server: ec=31.16383 gpg-connect-agent: error sending RESET command: Invalid value passed to IPC
. Điều khiển từ xa socat
chết. Các địa phương socat
chết và thốt lên socat[24692] E connect(3, AF=1 "", 2): Invalid argument
. Trang này khiến tôi tin rằng điều này sẽ không bao giờ hoạt động, vì đại lý không lưu trữ khóa (chỉ là cụm mật khẩu). Điều này đã được xác nhận để làm việc bởi bất cứ ai?
Chuyển tiếp ổ cắm tên miền Unix mới của OpenSSH có thể thực hiện việc này trực tiếp bắt đầu với phiên bản 6.7.
Bạn sẽ có thể một cái gì đó như:
ssh -R /home/bminton/.gnupg/S.gpg-agent:/home/bminton/.gnupg/S-gpg-agent -o "StreamLocalBindUnlink=yes" -l bminton 192.168.1.9
Trong các phiên bản mới của GnuPG hoặc Linux, các đường dẫn của ổ cắm có thể thay đổi. Đây có thể được tìm thấy thông qua
$ gpgconf --list-dirs agent-extra-socket
và
$ gpgconf --list-dirs agent-socket
Sau đó thêm các đường dẫn này vào cấu hình SSH của bạn:
Host remote
RemoteForward <remote socket> <local socket>
Giải pháp nhanh để sao chép các khóa công khai:
scp .gnupg/pubring.kbx remote:~/.gnupg/
Trên máy từ xa, kích hoạt tác nhân GPG:
echo use-agent >> ~/.gnupg/gpg.conf
Trên máy từ xa, cũng sửa đổi cấu hình máy chủ SSH và thêm tham số này (/ etc / ssh / sshd_config):
StreamLocalBindUnlink yes
Khởi động lại máy chủ SSH, kết nối lại với máy từ xa - sau đó nó sẽ hoạt động.
systemctl --global mask --now gpg-agent.service gpg-agent.socket gpg-agent-ssh.socket gpg-agent-extra.socket gpg-agent-browser.socket
là cần thiết để ngăn systemd khởi chạy một ổ cắm ăn cắp tác nhân gpg từ xa. Theo bug.debian.org/850982 đây là hành vi dự định.
Tôi đã phải làm như vậy, và dựa trên kịch bản của mình dựa trên giải pháp của b0fh, với một vài sửa đổi nhỏ: Nó bẫy thoát và giết chết các quy trình nền, và nó sử dụng các tùy chọn "fork" và "reuseaddr" để socat, giúp bạn tiết kiệm vòng lặp (và làm cho nền xã hội sạch sẽ có khả năng tiêu diệt).
Toàn bộ thiết lập tất cả chuyển tiếp trong một lần, vì vậy nó có thể đến gần hơn với một thiết lập tự động.
Lưu ý rằng trên máy chủ từ xa, bạn sẽ cần:
GPG_AGENT_INFO
biến giả . Tôi điền trước với ~/.gnupg/S.gpg-agent:1:1
- 1 đầu tiên là một PID cho tác nhân gpg (Tôi giả mạo nó là "init", luôn luôn chạy), thứ hai là số phiên bản giao thức đại lý. Điều này sẽ phù hợp với một chạy trên máy cục bộ của bạn.
#!/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'
Tôi tin rằng cũng có một giải pháp chỉ liên quan đến một lệnh gọi SSH (kết nối lại từ máy chủ từ xa đến máy chủ cục bộ) bằng cách sử dụng -o LocalCommand
, nhưng tôi không thể tìm ra cách tiêu diệt thuận tiện khi thoát ra.
Theo GnuPG Wiki , bạn phải chuyển tiếp ổ cắm từ xa S.gpg-agent.extra
đến ổ cắm cục bộ S.gpg-agent
. Hơn nữa, bạn cần phải kích hoạt StreamLocalBindUnlink
trên máy chủ.
Hãy nhớ rằng bạn cũng cần phần công khai của khóa có sẵn trên GnuPG từ xa .
Sử dụng gpgconf --list-dir agent-socket
tương ứng gpgconf --list-dir agent-extra-socket
trên điều khiển từ xa để có được các đường dẫn thực tế.
Cấu hình bổ sung trên remote /etc/sshd_config
:
StreamLocalBindUnlink yes
Nhập khóa công khai của bạn trên điều khiển từ xa:
gpg --export <your-key> >/tmp/public
scp /tmp/public <remote-host>:/tmp/public
ssh <remote-host> gpg --import /tmp/public
Lệnh kết nối thông qua SSH với tính năng chuyển tiếp tác nhân gpg: (đường dẫn cho Debian của tôi)
ssh -R /run/user/1000/gnupg/S.gpg-agent:/run/user/1000/gnupg/S.gpg-agent.extra <remote-host>
Thay thế cho việc sửa đổi /etc/ssh/sshd_config
bằng StreamLocalBindUnlink yes
, thay vào đó, bạn có thể ngăn việc tạo các tệp ổ cắm cần thay thế:
systemctl --global mask --now \
gpg-agent.service \
gpg-agent.socket \
gpg-agent-ssh.socket \
gpg-agent-extra.socket \
gpg-agent-browser.socket
Lưu ý rằng điều này ảnh hưởng đến tất cả người dùng trên máy chủ.
Phần thưởng: Cách kiểm tra chuyển tiếp đại lý GPG đang hoạt động:
ssh -v -o RemoteForward=${remote_sock}:${local_sock} ${REMOTE}
${remote_sock}
được hiển thị trong đầu ra dài dòng từ sshls -l ${remote_sock}
gpg --list-secret-keys
debug1
tin nhắn từ ssh hiển thị lưu lượng chuyển tiếpNếu điều đó không hiệu quả (vì nó không phù hợp với tôi), bạn có thể theo dõi GPG của socket nào đang truy cập:
strace -econnect gpg --list-secret-keys
Đầu ra mẫu:
connect(5, {sa_family=AF_UNIX, sun_path="/run/user/14781/gnupg/S.gpg-agent"}, 35) = 0
Trong trường hợp của tôi, đường dẫn được truy cập hoàn toàn khớp ${remote_sock}
, nhưng ổ cắm đó không được tạo sshd
khi tôi đăng nhập, mặc dù đã thêm StreamLocalBindUnlink yes
vào /etc/ssh/sshd_config
. Tôi đã được tạo bởi systemd khi đăng nhập.
(Lưu ý rằng tôi quá hèn nhát khi khởi động lại sshd, vì hiện tại tôi không có quyền truy cập vật lý vào máy chủ. service reload sshd
Rõ ràng là không đủ ...)
Đã thử nghiệm trên Ubuntu 16.04