Làm cách nào để định cấu hình SSH để nó không tự động thử tất cả các tệp nhận dạng?


101

Tôi đã đặt các tập tin nhận dạng ssh của mình vào thư mục ~ / .ssh /. Tôi có khoảng 30 tập tin trong đó.

Khi tôi kết nối với máy chủ, tôi sẽ chỉ định tệp nhận dạng sẽ sử dụng, với nội dung như

ssh -i ~ / .ssh / client1-nhận dạng client1@10.1.1.10

Tuy nhiên, nếu tôi không chỉ định tệp nhận dạng và chỉ sử dụng một cái gì đó như thế này:

ssh user123@example.com

Tôi nhận được lỗi

Quá nhiều lỗi xác thực cho user123

Tôi hiểu điều đó là bởi vì nếu không có tệp nhận dạng nào được chỉ định và ssh có thể tìm thấy tệp nhận dạng, thì nó sẽ thử tất cả chúng.

Tôi cũng hiểu rằng tôi có thể chỉnh sửa ~/.ssh/configtệp và chỉ định một cái gì đó như:

Máy chủ example.com
Mật khẩu tương tác bàn phím, mật khẩu

để ngăn kết nối đó thử các tập tin nhận dạng đã biết.

Vì vậy, tôi đoán rằng tôi có thể di chuyển các tệp nhận dạng của mình ra khỏi ~/.ssh/thư mục hoặc tôi có thể chỉ định từng máy chủ mà tôi muốn tắt xác thực tệp nhận dạng trong tệp cấu hình, nhưng có cách nào để nói với SSH mua mặc định không tìm kiếm hồ sơ nhận dạng? Hoặc để chỉ định những cái nó sẽ tìm kiếm?


4
Re "Tôi hiểu đó là bởi vì ..." - sử dụng ssh -vđể tìm hiểu cho chắc chắn.
grawity

Câu trả lời:


101

Bạn có thể sử dụng IdentitiesOnly=yestùy chọn cùng với IdentityFile(xem trang man ssh_config ). Bằng cách đó, bạn có thể chỉ định (các) tệp nào sẽ tìm.

Trong ví dụ này, ssh sẽ chỉ tìm trong các danh tính được cung cấp trong các tệp ssh_config + 4 danh sách được liệt kê trên dòng lệnh (các danh tính được cung cấp bởi tác nhân sẽ bị bỏ qua):

ssh -o IdentitiesOnly=yes \
    -o IdentityFile=id1.key \
    -o IdentityFile=id2.key \
    -i id3.key \
    -i id4.key \
    user123@example.com

Các hình thức -i-o IdentityFile=có thể thay thế cho nhau.


7
Một ví dụ sẽ rất hay
rubo77

1
Có phải vậy không: IdentitiesOnly yes(không có "=")?
Dimitrios Mistriotis

3
@DimitriosMistriotis Theo trang man ssh_config, có thể chấp nhận được:Configuration options may be separated by whitespace or optional whitespace and exactly one '='; the latter format is useful to avoid the need to quote whitespace when specifying configuration options using the ssh, scp, and sftp -o option.
Nick Anderegg

IdentitiesOnlycó thể không phải lúc nào cũng hoạt động, bạn có thể phải loại trừ một máy chủ lưu trữ cụ thể; xem superuser.com/questions/859661/ khăn
aexl

79

Câu trả lời ngắn gọn của user76528 là chính xác, nhưng tôi chỉ gặp vấn đề này và nghĩ rằng một số chi tiết sẽ hữu ích. Bạn cũng có thể quan tâm đến giải pháp này nếu bạn tự hỏi "Tại sao ssh lại bỏ qua tùy chọn cấu hình nhận dạng của tôi"?

Thứ nhất, không giống như mọi tùy chọn khác trong ssh_config, ssh không sử dụng tùy chọn đầu tiên IdentityFilemà nó tìm thấy. Thay vào đó, IdentityFiletùy chọn thêm tệp đó vào danh sách các danh tính được sử dụng. Bạn có thể xếp chồng nhiều IdentityFiletùy chọn và máy khách ssh sẽ thử tất cả chúng cho đến khi máy chủ chấp nhận một hoặc từ chối kết nối.

Thứ hai, nếu bạn sử dụng một tác nhân ssh, ssh sẽ tự động cố gắng sử dụng các khóa trong tác nhân, ngay cả khi bạn chưa chỉ định chúng với tùy chọn Nhận dạng (hoặc -i) của ssh_config. Đây là một lý do phổ biến bạn có thể nhận được Too many authentication failures for userlỗi. Sử dụng IdentitiesOnly yestùy chọn sẽ vô hiệu hóa hành vi này.

Nếu bạn sử dụng nhiều người dùng cho nhiều hệ thống, tôi khuyên bạn nên đưa IdentitiesOnly yesvào phần ssh_config toàn cầu của mình và đặt từng phần IdentityFiletrong các phần phụ Máy chủ phù hợp.


5
giải thích độc đáo, cảm ơn bạn. Không rõ ràng rằng tham số 'Nhận dạng duy nhất' có nghĩa là TakeOnlyWhatIExplicitlySpecifyThenFailoverToPassword . Và rõ ràng, khóa ./ssh/id_rsa vẫn được liệt kê.
lImbus

Đưa IdentitiesOnly yesvào phần toàn cầu của ssh_config là những gì đã làm cho tôi. Cảm ơn!
jamix 20/03/2015

1
Cảm ơn bạn đã bình luận chi tiết. Tôi đã từng sử dụng ('\' cho dòng mới) Host * \ IdentityFile ~/.ssh/mykeylàm tùy chọn cấu hình và lúc đầu, có vẻ lạ khi có một mục khác cho một trang web cụ thể, ví dụ: Host special \ IdentityFile ~/.ssh/specialkey \ IdentitiesOnly yestiếp tục cung cấp mykeythay vì specialkey. Chắc chắn là không rõ ràng, cho đến khi tôi nhận ra (từ câu trả lời của bạn) rằng các mục nhập IdentityFile được xếp chồng lên nhau theo thứ tự đánh giá và mục được xác định cuối cùng sẽ được sử dụng. Loại bỏ IdentityFile ~/.ssh/mykeygiải quyết vấn đề, và chính xác, khóa đơn đã được sử dụng.
Ryder

1
Trước khi tôi thử điều này, tôi nhận thấy git pull/pushcác lệnh của tôi đang thử mọi danh tính được tải trong tác nhân của tôi. Đó không phải là vấn đề cho đến một lúc tôi có quá nhiều chìa khóa.
sdkks

21

Tôi thường làm như vậy:

$ ssh -o IdentitiesOnly=yes -F /dev/null -i ~/path/to/some_id_rsa root@server.mydom.com

Các tùy chọn như sau:

  • -o IdentitiesOnly=yes- yêu cầu SSH chỉ sử dụng các khóa được cung cấp qua CLI và không có khóa nào từ $HOME/.sshhoặc thông qua ssh-agent
  • -F /dev/null - vô hiệu hóa việc sử dụng $HOME/.ssh/config
  • -i ~/path/to/some_id_rsa - khóa mà bạn rõ ràng muốn sử dụng cho kết nối

Thí dụ

$ ssh -v -o IdentitiesOnly=yes -F /dev/null -i ~/my_id_rsa root@someserver.mydom.com
OpenSSH_6.2p2, OSSLShim 0.9.8r 8 Dec 2011
debug1: Reading configuration data /dev/null
debug1: Connecting to someserver.mydom.com [10.128.12.124] port 22.
debug1: Connection established.
debug1: identity file /Users/sammingolelli/my_id_rsa type 1
debug1: identity file /Users/sammingolelli/my_id_rsa-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.2
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.3
debug1: match: OpenSSH_5.3 pat OpenSSH_5*
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Server host key: RSA f5:60:30:71:8c:a3:da:a3:fe:b1:6d:0b:20:87:23:e1
debug1: Host 'someserver' is known and matches the RSA host key.
debug1: Found key in /Users/sammingolelli/.ssh/known_hosts:103
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /Users/sammingolelli/my_id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 535
debug1: read PEM private key done: type RSA
debug1: Authentication succeeded (publickey).
Authenticated to someserver.mydom.com ([10.128.12.124]:22).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
Last login: Tue Dec  8 19:03:24 2015 from 153.65.219.15
someserver$

Lưu ý ở đầu ra ở trên sshchỉ xác định my_id_rsakhóa riêng thông qua CLI và nó sử dụng nó để kết nối với someserver.

Cụ thể các phần này:

debug1: identity file /Users/sammingolelli/my_id_rsa type 1
debug1: identity file /Users/sammingolelli/my_id_rsa-cert type -1

và:

debug1: Next authentication method: publickey
debug1: Offering RSA public key: /Users/sammingolelli/my_id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 535
debug1: read PEM private key done: type RSA
debug1: Authentication succeeded (publickey).

1
Cảm ơn, đây là giải pháp hoàn chỉnh duy nhất. Rõ ràng, -F /dev/nulllà phần còn thiếu trong các câu trả lời khác.
leden

10

Trong trường hợp bạn có nhiều khóa, bạn sẽ luôn gặp phải lỗi "Quá nhiều lỗi xác thực". Nếu bạn có mật khẩu và chỉ muốn sử dụng mật khẩu để đăng nhập, đây là cách bạn thực hiện.

Để sử dụng xác thực mật khẩu CHỈ và KHÔNG sử dụng khóa công khai và KHÔNG sử dụng "tương tác bàn phím" hơi sai lệch (là một superset bao gồm mật khẩu), bạn có thể thực hiện việc này từ dòng lệnh:

ssh -o PreferredAuthentications=password user@example.com

7

Sử dụng IdentityFile nhưng Tiếp tục sử dụng ssh-agent để tránh cụm từ mật khẩu lặp lại

Giải pháp sử dụng được chấp nhận IdentitiesOnly yescó nghĩa là bạn sẽ không bao giờ có thể tận dụng ssh-agent, dẫn đến lời nhắc lặp đi lặp lại cho cụm mật khẩu của bạn khi tải khóa của bạn.

Để tiếp tục sử dụng ssh-agentvà tránh các lỗi 'Quá nhiều lỗi xác thực', hãy thử điều này:

  1. Loại bỏ bất kỳ tập lệnh khởi động bàn điều khiển tương tác tự động tải các phím vào ssh-agent.

  2. thêm AddKeysToAgent yesvào cấu hình ssh của khách hàng của bạn. Điều này sẽ nhắc bạn về cụm mật khẩu trong lần kết nối đầu tiên, nhưng sau đó thêm khóa vào đại lý của bạn.

  3. sử dụng ssh-add -Dkhi bạn gặp lỗi 'quá nhiều xác thực'. Điều này chỉ đơn giản là 'đặt lại' (xóa) bộ đệm ssh-agent của bạn. Sau đó thử kết nối lại trong cùng một phiên. Bạn sẽ được nhắc nhập cụm mật khẩu và sau khi được chấp nhận, nó sẽ được thêm vào đại lý của bạn. Vì bạn sẽ chỉ có một khóa trong đại lý của mình, bạn sẽ được phép kết nối. ssh-agent sau đó vẫn ở đó cho các kết nối trong tương lai trong cùng một phiên để tránh lặp lại.

    Host ex example.com
       User joe
       HostName example.com
       PreferredAuthentications publickey,password
       IdentityFile /path/to/id_rsa
       AddKeysToAgent yes
    

Sẽ chấp nhận các khóa được thêm vào móc khóa?
vfclists

2

Máy khách ssh và máy khách ssh-agentđang liên lạc thông qua một ổ cắm tên miền Unix có tên được chỉ định cho máy khách theo SSH_AUTH_SOCKbiến môi trường (được đặt bởi tác nhân khi khởi động).

Do đó, để ngăn chặn một lời mời của khách hàng truy vấn tác nhân, biến này có thể được đặt rõ ràng thành một cái gì đó không hợp lệ, như một chuỗi rỗng;

$ SSH_AUTH_SOCK= ssh user@server

Một lệnh gọi máy khách như thế này sẽ không liên lạc được với tác nhân và chỉ có thể cung cấp các danh tính có sẵn dưới dạng tệp trong ~/.ssh/hoặc bất kỳ chỉ định nào trên dòng lệnh sử dụng -icho máy chủ.

debug1: pubkey_prepare: ssh_get_authentication_socket: Connection refused

Đây là một câu trả lời tuyệt vời. Thật đơn giản và hoạt động khi bạn đang sử dụng các lệnh sử dụng SSH "dưới mui xe", như git. Thật đáng tiếc tôi không thể nâng cao nó hơn.
rsuarez

1

Bạn đã có câu trả lời cùng (gần như):

Host *
PreferredAuthentications keyboard-interactive,password

Đã làm cho tôi.


8
Câu hỏi hỏi về cách giới hạn khóa công khai nào được sử dụng. Câu trả lời này vô hiệu hóa hoàn toàn xác thực khóa công khai.
chrishiestand

1
Tôi + 1'd vì đó là câu trả lời mà tôi đang tìm kiếm, cảm ơn @Henry Grebler
matiu

1

thêm phần này vào cuối ~/.ssh/configtệp để ngăn các khóa sử dụng cho các máy chủ không cấu hình:

Host *
IdentitiesOnly=yes
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.