Làm cách nào để thiết lập SSH để tôi không phải nhập mật khẩu?


153

Làm cách nào để thiết lập SSH để tôi không phải nhập mật khẩu khi kết nối với máy chủ?


Người ta có thể tranh luận nếu sử dụng các khóa như vậy không yêu cầu mật khẩu. Để tránh việc bất cứ ai nắm giữ khóa riêng của bạn thực sự có thể lạm dụng nó, người ta có thể bảo vệ khóa bằng mật khẩu của chính nó. Tất nhiên, người ta có thể để trống mật khẩu đó, nhưng có nhiều trường hợp không được khuyến nghị.
Arjan

Trên Cygwin mới nhất với SSH mới nhất, tôi đã được nhắc lại bởi vì tôi cần thực hiện một thay đổi đối với ~/.ssh/confighiện tại là bắt buộc PubkeyAcceptedKeyTypes ssh-rsa*,ssh-dss*
HDave

Câu trả lời:


164

Tạo khóa SSH (nếu bạn không có)

Nếu bạn tình cờ sử dụng Gnome, ứng dụng cá ngựa ("Mật khẩu và khóa mã hóa") có thể làm điều đó cho bạn: Tệp -> Mới -> Khóa vỏ an toàn .

Nếu bạn thích thiết bị đầu cuối, hãy chạy để tạo ra một cặp khóa. Các loại khóa hợp lệ là:ssh-keygen -t <type>

  • rsa: mặc định
  • dsa: tương đương nhiều hơn hoặc ít hơn, ngoại trừ giới hạn ở khóa 1024 bit
  • ecdsa: bảo mật tương tự với các khóa nhỏ hơn, nhưng tương đối mới và hơi hiếm trong phần mềm SSH.
  • ed25519: Bảo mật cao (khả năng chống lại các cuộc tấn công kênh bên và khả năng tạo số ngẫu nhiên yếu hơn). Tạo chữ ký rất nhanh. Rất mới. Chỉ khả dụng trong OpenSSH> = 6.5 .

Chương trình sẽ yêu cầu bạn nhập cụm mật khẩu và vị trí lưu khóa mới. Nên sử dụng đường dẫn mặc định được đề xuất vì tất cả các công cụ khác sẽ tìm kiếm ở đó.

Tải khóa công khai lên máy chủ từ xa

Một lần nữa, cá ngựa thường có thể làm điều đó cho bạn - trong Khóa cá nhân của tôi , nhấp chuột phải vào khóa SSH của bạn và chọn Khóa cấu hình cho lớp vỏ an toàn .

Hoặc, ssh-copy-id -i ~/.ssh/id_rsa.pub remote-user@remote-hosttrong thiết bị đầu cuối.

Hoặc, hoàn toàn thủ công từng bước:

  1. Tạo một thư mục (nếu nó chưa tồn tại) được đặt tên .sshtrong thư mục chính của người dùng từ xa trên máy chủ từ xa.
  2. Trong thư mục đó, tạo một tệp có tên authorized_keys(nếu nó chưa tồn tại).
  3. Trong trường hợp điều khiển từ xa của bạn umasktự do hơn bình thường, hãy làm cho tệp không thể ghi nhóm : chmod go-w ~/.ssh ~/.ssh/authorized_keys.
  4. Cuối cùng, bằng cách nào đó sao chép (nối) nội dung của khóa chung cục bộ ( ~/.ssh/id_rsa.pub) vào ~/.ssh/authorized_keystệp từ xa .

Nạp khóa vào tác nhân ssh

Nếu bạn tải khóa riêng của mình vào một tác nhân ssh , nó sẽ giữ khóa được giải mã trong bộ nhớ. Chúng tôi muốn điều này để tránh nhập lại mật khẩu bất cứ khi nào chúng tôi vào máy chủ.

Đầu tiên, tác nhân phải được khởi động hoặc đường dẫn của ổ cắm truyền thông được khởi chạy được tải vào một biến. Chạy ssh-agent trên một thiết bị đầu cuối sẽ tạo ra các lệnh để gán và thiết lập các biến tác nhân. Các lệnh này có thể được lưu trong một tệp để sử dụng trong một thiết bị đầu cuối khác. Ngoài ra, người ta có thể chạy các lệnh này và quên đi việc sử dụng lại cùng một tác nhân trong một thiết bị đầu cuối khác. ví dụ : eval $(ssh-agent).

Tải khóa là một vấn đề đơn giản để thực hiện ssh-addvà cung cấp cho nó cụm từ vượt qua.

Nếu bạn đang sử dụng Gnome, gnome-keyring-daemon thường cung cấp chức năng tác nhân SSH giống như ssh-agent, vì vậy bạn không cần phải bắt đầu bất cứ điều gì. Gnome cũng sẽ tự động tải và mở khóa khi đăng nhập.

Shell vào máy chủ từ xa mà không cần mật khẩu

Nếu mọi thứ đã được thực hiện chính xác, việc sử dụng sẽ không nhắc bạn nhập mật khẩu. Nếu có gì đó không đúng với tác nhân và không phải khóa, bạn sẽ được yêu cầu nhập cụm từ mật khẩu cho khóa và không phải mật khẩu cho tài khoản người dùng.ssh user@server

Bất cứ điều gì sử dụng ssh để liên lạc sẽ hoạt động mà không cần nhập mật khẩu tài khoản người dùng khi khóa chính xác được tải trong tác nhân. Các chương trình như scp , sftprsync sử dụng điều này.


Ghi chú:

  • Bạn chỉ cần một khóa SSHv2, vì SSHv1 rất không an toàn và hiện không được sử dụng.
  • Bạn cũng chỉ cần một loại khóa - RSA hoặc DSA là đủ. (ed25519 và ECDSA đều gần đây và do đó không được hỗ trợ ở mọi nơi).
  • Tất cả các bước này đều giống nhau cho cả khóa RSA và DSA. Nếu bạn sử dụng DSA, hãy sử dụng id_dsathay vì id_rsavà ECDSA sẽ có id_ecdsa.
  • Các máy chủ OpenSSH cũ hơn 3.0 được sử dụng authorized_keys2- nhưng thực sự không chắc bạn sẽ tìm thấy bất cứ thứ gì cũ hơn 5.0 đang sử dụng.
  • Các hướng dẫn này chỉ áp dụng cho OpenSSH phiên bản 3.0 trở lên. lsh, ssh.comvà các máy chủ SSH khác (Unix và không) không được bao gồm trong hướng dẫn này.

Ví dụ:

  • Sao chép khóa chung vào máy chủ từ xa:

    ssh-copy-id -i ~ / .ssh / id_rsa.pub myaccount @ remotehost # này
    
    mèo ~ / .ssh / id_rsa.pub | ssh myaccount @ remotehost \
          'mkdir -p ~ / .ssh; mèo >> ~ / .ssh / ủy quyền_key '# hoặc cái này
    
  • Lưu các biến đại lý để sử dụng lại (ví dụ chi tiết)
    ssh-agent> ~ / .ssh / cross-terminal-agent
    . ~ / .ssh / cross-terminal-agent
    

7
à, bạn phải nói "ssh-add {path-to-private-key-file}" và sau đó nó sẽ hỏi bạn cụm mật khẩu của bạn. Hãy làm cho điều này rõ ràng hơn trong bài viết của bạn. Bạn cũng nên thêm "Thứ tư, chạy ssh". Một phần của vấn đề với tài liệu với công cụ này là nó che đậy các bước dường như rõ ràng KHÔNG rõ ràng đối với người mới biết về quy trình không biết điều gì đang xảy ra và cách các chương trình này hoạt động cùng nhau.
Jason S

1
Jason: ssh-add -l là để kiểm tra xem một tác nhân đang chạy. ssh-add không có đối số sẽ thêm khóa từ vị trí mặc định (đó là ~ / .ssh / id_rsa). Dù sao, cập nhật.
grawity

4
có một lệnh ssh-copy-idsao chép khóa chung vào máy chủ đích và tự động đặt quyền.
hasen

1
Câu trả lời chính xác! Nó thiếu một chút về quyền truy cập tệp của các tệp chính - tôi vừa gặp sự cố liên quan đến vấn đề đó ngày hôm nay. Tệp khóa riêng chỉ có thể được tôi truy cập và tệp khóa công khai chỉ có thể ghi được bởi tôi.
ripper234

1
Một lót: ssh-keygen -f ~/.ssh/id_rsa -N "";ssh-copy-id -i ~/.ssh/id_rsa username@server-ip-or-address(chỉ cần thay thế username@server-ip-or-address).
totymedli

22

Bạn đã không chỉ định Unix bạn đang sử dụng cái gì, Unix bạn đang kết nối với cái gì, bạn đang sử dụng shell nào, biến thể SSH nào bạn đang sử dụng, v.v. Vì vậy, một số điều này có thể cần được điều chỉnh một chút; điều này dựa trên các phiên bản hợp lý gần đây của OpenSSH, được sử dụng trên rất nhiều biến thể unix.

Đây là tất cả từ hệ thống máy tính để bàn địa phương của bạn.

ssh-keygen

Đảm bảo sử dụng mặc định cho tên khóa. Tôi khuyên bạn nên đặt cụm mật khẩu trên khóa đó, nếu không đó là vấn đề bảo mật. "-t rsa" sẽ không phải là một ý tưởng tồi, nhưng có lẽ không cần thiết.

ssh-copy-id username@server

Điều đó sẽ hỏi bạn mật khẩu bạn sử dụng để đăng nhập và thiết lập công cụ ủy quyền cho bạn. (không cần phải làm bằng tay)

Thì đây:

`ssh-agent`

hoặc có thể thế này:

exec ssh-agent sh

hoặc là:

exec ssh-agent bash

Điều đó sẽ khởi động một tác nhân SSH có thể giữ khóa của bạn. Trên nhiều biến thể Unix hiện đại, nếu bạn đăng nhập bằng đồ họa, điều này sẽ xảy ra. Biến thể đầu tiên (với backticks) đặt một tác nhân ssh vào nền và thiết lập các biến môi trường để nói chuyện với nó. Hai cái thứ hai có tác nhân chạy shell cho bạn, để khi bạn thoát khỏi shell, tác nhân sẽ thoát.

Nhiều biến thể Unix hiện đại sẽ có một tác nhân chạy cho bạn, đặc biệt nếu bạn đăng nhập bằng đồ họa. Bạn có thể thử " ps aux | grep ssh-agent" hoặc " ps -ef | grep ssh-agent"; nếu một cái gì đó đang chạy, sử dụng nó.

Sau đó, cuối cùng:

ssh-add

Nó sẽ yêu cầu một mật khẩu; cung cấp cho nó một trong những bạn đã cho ssh-keygen. Cũng có cách để làm cho nó yêu cầu đồ họa. Và bạn có thể đặt công cụ ssh-agent và ssh-add vào tập lệnh đăng nhập của mình (thiết lập khác nhau tùy thuộc vào trình bao bạn sử dụng) để tự động hóa việc này, nhưng một số biến thể Unix (ví dụ Ubuntu Linux hiện tại) sẽ tự động làm điều đó rằng tất cả những gì bạn thực sự cần làm là tạo một khóa và sử dụng ssh-copy-id để thiết lập nó trên máy chủ từ xa.

Bây giờ, " ssh username@server" sẽ hoạt động mà không yêu cầu bất kỳ xác thực. Đằng sau hậu trường, nó sử dụng một chiếc chìa khóa mà nhân viên ssh đang giữ và yêu cầu nhân viên thực hiện các thủ thuật ký phép thuật cho nó.


11

Cũng có thể làm điều này trong PuTTY trên Windows.

Khi bạn đã có cặp khóa công khai / riêng tư được thiết lập (như các câu trả lời khác ở đây hiển thị) chạy PuttyGen. Trong đó, tải khóa riêng hiện có mà bạn đã thiết lập và sau đó lưu nó dưới dạng khóa riêng PuTTY (ppk).

Sau đó, trong PuTTY, chỉ cần nhấp vào phiên đã lưu mà bạn muốn tự động đăng nhập và nhấp vào Tải. Từ đây đi vào Kết nối -> Dữ liệu trong ngăn bên trái và nhập "Tên người dùng đăng nhập tự động" trong tên người dùng cho máy chủ từ xa đó:

Nhập tên người dùng PuTTY

Sau đó, đi vào Kết nối -> SSH -> Xác thực và duyệt tìm ppk bạn đã tạo trong PuttyGen:

Nhập khóa riêng PuTTY

Sau đó quay lại trang phiên và lưu phiên bạn đã tải trước đó.


Liên kết hình ảnh đầu tiên, "mục nhập tên người dùng PuTTY", dường như bị phá vỡ.
Peter Mortensen

2
PuTTY bao gồm phiên bản riêng của ssh-agent; nó được gọi là cuộc thi. Nó chạy trong khay hệ thống và giữ chìa khóa cho bạn. Bạn không cần phải chạy ssh-agent, chỉ cần kiểm tra "Cho phép chuyển tiếp đại lý" trong các tùy chọn của PuTTY trong phần Auth và kết nối của Pagete sẽ được chuyển tiếp đến đầu từ xa để cung cấp cho tác nhân chính của bạn.
Kevin Panko

3

Từ một câu hỏi tương tự trên ServerFault , tôi khuyên bạn nên sử dụng ssh-copy-id , thực hiện tất cả các bước liên quan đến việc thiết lập khóa xác thực cho bạn:

ssh-copy-id là một tập lệnh sử dụng ssh để đăng nhập vào một máy từ xa (có lẽ sử dụng mật khẩu đăng nhập, vì vậy nên xác thực mật khẩu, trừ khi bạn đã sử dụng thông minh nhiều danh tính)

Nó cũng thay đổi các quyền của nhà người dùng từ xa, ~ / .ssh và ~ / .ssh / ủy quyền để xóa khả năng ghi của nhóm (điều này sẽ ngăn bạn đăng nhập, nếu sshd từ xa có StrictModes được đặt trong cấu hình của nó).

Nếu tùy chọn -i được cung cấp thì tệp nhận dạng (mặc định là ~ / .ssh / id.pub) được sử dụng, bất kể có bất kỳ khóa nào trong tác nhân ssh của bạn hay không.

Tất cả bạn cần làm chỉ đơn giản là thế này:

ssh-copy-id user@host

Nhập mật khẩu của bạn một lần, và bạn tốt để đi!


3

Ngoài tất cả những gì đã được nói về cách đặt khóa ssh, tôi khuyên dùng Keychain làm giao diện điều khiển ssh-agent cho phép bạn xử lý chỉ một lần cho mỗi quy trình hệ thống thay vì mỗi lần đăng nhập.

Tôi biết đã có các công cụ Gnome và KDE làm tương tự nhưng nếu bạn là người nghiện bảng điều khiển thì điều này thật tuyệt (và có thể được sử dụng trên hầu hết các hệ thống Unix).

Để sử dụng nó, chỉ cần nối các phần sau vào ~/.bashrc(tương tự cho các shell khác):

if type keychain >/dev/null 2>/dev/null; then
  keychain --nogui -q <all your SSH/PGP keys>
  [ -f ~/.keychain/${HOSTNAME}-sh ] && . ~/.keychain/${HOSTNAME}-sh
  [ -f ~/.keychain/${HOSTNAME}-sh-gpg ] && . ~/.keychain/${HOSTNAME}-sh-gpg
fi

2

http: // linuxpropet.org/art_9.html

Mục đích của bạn

Bạn muốn sử dụng Linux và OpenSSH để tự động hóa các tác vụ của mình. Do đó, bạn cần đăng nhập tự động từ máy chủ A / người dùng a đến Máy chủ B / người dùng b. Bạn không muốn nhập bất kỳ mật khẩu nào, vì bạn muốn gọi ssh từ một tập lệnh shell.


1
Các downvote không phải là của tôi, nhưng tôi sẽ không phiền mọi người xóa câu trả lời của họ nếu họ nhận thấy ai đó đã đăng một câu trả lời gần như tương tự một vài phút trước đó.
Arjan

2
Arjan: Đối với hầu hết các phần tôi đồng ý với bạn, nhưng khi các bài viết chỉ cách nhau vài giây, tôi không nhất thiết nghĩ rằng việc trừng phạt người đó ở vị trí thứ 2 là công bằng. Tôi không nói rằng bạn phải thưởng cho họ bằng cách nâng cấp, nhưng việc hạ cấp mang lại ấn tượng rằng câu trả lời là sai, thay vì không kịp
TheTXI

2

Tôi đã viết hướng dẫn rất ngắn này sau khi thực sự thất vọng với THỰC SỰ THỰC SỰ hướng dẫn dài vì thực sự nó rất đơn giản :)

test -f ~/.ssh/id_rsa.pub || ssh-keygen -t rsa #press enter twice if given prompts, then "ssh-add"

scp ~/.ssh/id_rsa.pub destID@destMachine:/tmp/ #type password

ssh destID@destMachine #type password

cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys

rm /tmp/id_rsa.pub

2

Putty có một -pwtùy chọn cho phép bạn tạo một lối tắt trên máy tính để bàn như thế này:

"C:\Program Files\PuTTY\putty.exe" -ssh user@192.168.2.2 -pw your_password

1
  1. Trên máy chủ kết nối, chạy ssh-keygen. (Nếu nó cho bạn biết bạn phải chỉ định một loại, hãy làm ssh-keygen -t rsa.) Khi nó yêu cầu bạn cho một vị trí tệp, hãy lấy mặc định. Khi nó hỏi bạn một cụm mật khẩu, hãy nhấn enter để không có cụm mật khẩu.
  2. cat ~/.ssh/id_rsa.pub(hoặc bất kể vị trí tệp mặc định ssh-keygenlà gì, mặc dù bạn phải có một bản cài đặt thực sựsshđể nó khác biệt); sao chép đầu ra vào clipboard của bạn.
  3. Đăng nhập bình thường vào máy chủ đích như tài khoản bạn muốn kết nối. Chỉnh sửa tệp ~/.ssh/authorized_keys(nếu ~/.sshkhông tồn tại, sloginở một nơi nào đó; đây là cách đơn giản, dễ dàng để tạo tệp với quyền phù hợp). Dán bảng tạm của bạn (chứa id_rsa.pubtừ máy chủ khác) vào tệp này.

3
-1 để đề xuất không thêm cụm mật khẩu. Nếu không có cụm mật khẩu, bất kỳ ai đọc tệp bây giờ cũng có thể đặt ra là người dùng hợp pháp.
bortzmeyer

2
Đầu tiên, anh ta yêu cầu không phải gõ mật khẩu của mình; Tôi thực sự không nghĩ rằng việc phải nhập cụm mật khẩu thay vì mật khẩu của anh ấy sẽ là một sự cải thiện. Thứ hai, bạn đã sai; đó là lý do tại sao có khóa công khai và khóa riêng, vì vậy khóa công khai có thể xuất hiện trên thế giới.
hỗn loạn

Mật khẩu trong câu hỏi được nhập trong quá trình tạo khóa, không phải mỗi khi bạn kết nối. Chính xác?
Richard Hoskins

Không. Các khóa được tạo bằng cụm mật khẩu yêu cầu nhập cụm mật khẩu mỗi khi sử dụng khóa.
hỗn loạn

2
Sai lầm. Với ssh-agent (xem câu trả lời được chấp nhận), bạn chỉ nhập mật khẩu một lần mỗi phiên.
bortzmeyer

0

Nếu bạn muốn làm tất cả trong thiết bị đầu cuối trong Linux:

Trên máy chủ

cd ~ / .ssh /

ssh-keygen -t {rsa | dsa} -b {1024 | 2048 | 4096} -C "một số văn bản nhận xét nếu bạn muốn" -f id_ArbitraryName

Các mục trong {} là các tùy chọn, sử dụng rsa hoặc dsa và chọn kích thước bit (lớn hơn sẽ an toàn hơn)

Sau đó, bạn cần thêm quyền vào các tệp ủy quyền và khóa ủy quyền.

mèo id_ArbitraryName.pub >> ủy quyền

mèo id_AribtraryName.pub >> ủy quyền_keys2

Sau đó tải tệp id_AribtraryName vào hộp bạn muốn ssh từ đó. Nếu hộp kết nối là unix dựa trên, một tập tin cấu hình có thể là cần thiết (trong putty, ai đó ở trên đã che đậy điều đó).

Trên hộp kết nối

Trong tệp cấu hình của bạn - vim ~ / .ssh / config

Máy chủ ví dụ.host.com # hoặc tên máy tính của bạn

Tên người dùng

Danh tínhFile ~ / .ssh / id_ArbitraryName

Tệp cấu hình cần quyền 600. Thư mục SSh cần 700.

Hy vọng rằng sẽ giúp nếu bạn gặp phải vấn đề cấu hình bị bỏ qua rất nhiều.

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.