mục đích của ssh-agent là gì?


70

Tôi đã đọc định nghĩa chính thức:

ssh-agent là một chương trình giữ các khóa riêng được sử dụng để xác thực khóa chung (RSA, DSA, ECDSA). Ý tưởng là ssh-agent được bắt đầu vào đầu phiên X hoặc phiên đăng nhập và tất cả các cửa sổ hoặc chương trình khác được bắt đầu với tư cách là khách hàng của chương trình ssh-agent. Thông qua việc sử dụng các biến môi trường, tác nhân có thể được định vị và tự động sử dụng để xác thực khi đăng nhập vào các máy khác bằng ssh (1).

"..a chương trình để giữ phím tin .." - IMHO - phím ssh được tạo ra bởi người dùng với lệnh ssh-keygen và đơn giản & dễ lưu trữ trong ~ / .ssh - tại sao tôi cần một số daemon để giữ các phím? Chính xác thì nó giữ chúng bằng cách nào - không phải chúng chỉ được lưu trữ trong .ssh sao?

"được bắt đầu với tư cách là khách hàng của chương trình đại lý ssh" - Tôi không hiểu. Nơi nào người ta sẽ cần điều đó? Tôi thường chỉ sử dụng ssh như thế này:

 ssh -i ~/.ssh/private_key_name username@hostname

Chính xác thì "thủ công" nghĩa là gì - khách hàng là gì? Bạn không chạy lệnh ssh từ terminal để kết nối - những máy khách nào khác ở đó và tại sao chúng không thể sử dụng đường dẫn đến tệp riêng ssh đó, giống như lệnh ssh?

Câu trả lời:


76

Tác nhân SSH xử lý việc ký dữ liệu xác thực cho bạn. Khi xác thực với máy chủ, bạn được yêu cầu ký một số dữ liệu bằng khóa riêng của mình, để chứng minh rằng bạn là, tốt, bạn.

Là một biện pháp bảo mật, hầu hết mọi người đều bảo vệ một cách hợp lý các khóa riêng của họ bằng cụm mật khẩu, do đó, bất kỳ nỗ lực xác thực nào cũng sẽ yêu cầu bạn nhập cụm mật khẩu này. Điều này có thể là không mong muốn, vì vậy, ssh-agent lưu trữ khóa cho bạn và bạn chỉ cần nhập mật khẩu một lần, khi đại lý muốn giải mã nó (và thường thì không, vì ssh-agent có thể được tích hợp với pam, mà nhiều distro làm).

Tác nhân SSH không bao giờ trao các khóa này cho các chương trình máy khách, mà chỉ trình bày một ổ cắm mà khách hàng có thể gửi dữ liệu và qua đó nó phản hồi với dữ liệu đã ký. Một lợi ích phụ của việc này là bạn có thể sử dụng khóa riêng của mình ngay cả với các chương trình bạn không hoàn toàn tin tưởng.

Một lợi ích khác của tác nhân SSH là nó có thể được chuyển tiếp qua SSH. Vì vậy, khi bạn ssh đến máy chủ A, trong khi chuyển tiếp đại lý của mình, bạn có thể ssh từ A đến máy chủ B khác mà không cần phải có khóa của bạn (thậm chí không ở dạng mã hóa) trên máy chủ A.


10
Tôi cảm thấy đây là câu trả lời đầy đủ nhất, nhưng vẫn còn thiếu một điểm. Sử dụng một tác nhân chính cũng cho phép sử dụng nhiều khóa một cách dễ dàng. Thay vì phải chỉ định đường dẫn đến khóa, khi sử dụng tác nhân khóa ssh sẽ thử mọi khóa trong đó.
Patrick

3
@Patrick cũng có thể là nhược điểm - hãy thử quá nhiều khóa không hợp lệ trên máy chủ và nó sẽ đóng kết nối trước khi bạn nhận được khóa hợp lệ. Tất nhiên, đó ~/.ssh/configIdentityFilelựa chọn phù hợp, có hoặc không có đại lý
Tobias Kienzler

@Patrick dường như có thể như nhau mà không cần một đại lý
Andrey Fedorov

@AndreyFedorov Có, bạn có thể có nhiều khóa mà không cần đại lý, nhưng bạn cũng có thể chỉ định trong ~/.ssh/configkhóa nào sẽ sử dụng cho máy chủ từ xa nào, để nó biết chính xác cần khóa nào.
Patrick

3
vì vậy người ta có thể cho rằng ssh-agentkhông cần thiết nếu khóa riêng không được bảo vệ bằng cụm mật khẩu?
pkaramol

16

Lợi ích ssh-agentlà bạn chỉ cần nhập cụm mật khẩu của mình một lần. Nếu khóa RSA riêng của bạn không được mã hóa bằng cụm mật khẩu, thì ssh-agent là không cần thiết. Các sshlệnh sẽ là một ví dụ về một khách hàng.


7

Nếu bạn đang thường xuyên sshing vào một loạt các máy khác nhau, đều có chìa khóa và mật khẩu riêng của họ, sau đó chạy ssh-agentcho phép bạn nhập cụm từ mật khẩu cho mỗi phím một lần 1 vào đầu phiên của bạn và sau đó bạn có thể xác thực cho mỗi máy nhiều lần như bạn muốn mà không cần phải nhập lại cụm mật khẩu của bạn.

Một lợi ích nữa là, theo mantrang, đại lý không bao giờ gửi khóa riêng qua kênh yêu cầu của nó; vì vậy nếu bạn nhảy giữa các hộp khác nhau, khóa riêng của bạn sẽ được bảo vệ.

1 Bạn có thể đặt lifethời gian các phím được giữ trong tác nhân.


6

Bài viết Wikipedia có thể có mô tả tốt nhất:

Việc xác minh đến máy chủ dựa trên xác thực phản hồi thử thách. ssh kết nối với máy chủ với tên người dùng và yêu cầu nhập khóa. Trình nền ssh nhận được yêu cầu và gửi lại một thử thách dựa trên khóa chung được lưu trong tệp xác thực. ssh sử dụng khóa riêng để tạo phản hồi khóa và gửi nó đến sshd đang chờ ở đầu kia của kết nối. Nó không gửi khóa riêng. Trình nền ssh xác nhận phản hồi chính và nếu hợp lệ, cấp quyền truy cập vào hệ thống. ssh-agent đơn giản hóa điều này bằng cách tạo một socket lắng nghe các kết nối SSH. Người dùng chỉ cần khởi động ssh-agent, cho nó biết cách tìm khóa của họ (nếu chúng không ở vị trí mặc định), nhập cụm mật khẩu cho mỗi khóa được sử dụng, trên cơ sở một lần,

Một lần nữa nguyên văn từ bài viết trên wikipedia:

... ssh-agent tạo một ổ cắm và sau đó kiểm tra các kết nối từ ssh. Mọi người có thể kết nối với ổ cắm này cũng có quyền truy cập vào ssh-agent. Các quyền được đặt như trong một hệ thống Linux hoặc Unix thông thường. Khi tác nhân khởi động, nó tạo một thư mục mới trong / tmp với các quyền hạn chế. Các ổ cắm được đặt trong thư mục.

Thông thường, nó được đặt trong các tệp RC của hệ thống hoặc người dùng như $HOME/.bashrchoặc $HOME/.profile(đối với bash shell) để các biến môi trường ssh-agentđược đặt hoàn toàn vào môi trường của bạn.

Trên hệ thống Fedora 14 của tôi, nó khởi động khá sớm như là một phần của hệ thống con X11. Trong tập tin này , /etc/X11/xinit/xinitrc-common:

# Prefix launch of session with ssh-agent if available and not already running.
SSH_AGENT=
if [ -z "$SSH_AGENT_PID" ] && [ -x /usr/bin/ssh-agent ]; then
    if [ "x$TMPDIR" != "x" ]; then
        SSH_AGENT="/usr/bin/ssh-agent /bin/env TMPDIR=$TMPDIR"
    else
        SSH_AGENT="/usr/bin/ssh-agent"
  fi
fi

Biến $SSH_AGENTsau đó được sử dụng trong các tập lệnh khởi động X11 khác như ở đây , /etc/X11/xinit/Xclients:

exec -l $SHELL -c "$SSH_AGENT $XCLIENTS_D/Xclients.$1.sh"

Bằng cách kết hợp nó vào đây, các biến môi trường sau đây sẽ được thiết lập như một phần của vỏ cha mẹ, do đó, tất cả trẻ em rẽ nhánh cũng nên có chúng, ví dụ:

SSH_AUTH_SOCK=/tmp/ssh-PspRF18958/agent.18958; export SSH_AUTH_SOCK;
SSH_AGENT_PID=18959; export SSH_AGENT_PID;

Có một chút phức tạp hơn về vấn đề này nhưng tóm lại, đây là cơ bản những gì đang diễn ra ssh-agent.

Ví dụ: trong Gnome, ssh-agentthực tế là khởi chạy cho mỗi người dùng dưới dạng một ứng dụng khởi động:

                     ss của ứng dụng khởi động

TL; DR

Dòng dưới cùng, ssh-agenttồn tại để khi các khóa ssh của bạn được yêu cầu, bạn chỉ phải mở khóa chúng một lần bằng cụm mật khẩu của chúng (giả sử chúng có một) và từ đó chúng có sẵn ở dạng được giải mã trong bộ nhớ (RAM).


1

"được bắt đầu với tư cách là khách hàng của chương trình ssh-agent" đề cập đến ý tưởng rằng ssh-agent được khởi động trong quá trình khởi tạo phiên đăng nhập (cục bộ) để tất cả các chương trình có được các biến môi trường $SSH_AGENT_PID$SSH_AUTH_SOCKcần thiết để kết nối tác nhân.

Một ưu điểm khác của việc xử lý khóa riêng ra khỏi ssh là ssh-agent có thể được thay thế bằng gpg-agent. Do đó, bạn có thể sử dụng các khóa OpenPGP (có khả năng xác thực) cho SSH. Đó là một giải pháp tốt cho các khóa OpenPGP trên thẻ thông minh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.