Lưu trữ mật khẩu nếu khóa SSH bị cấm


46

Tôi có một máy chủ mà tôi phải truy cập thường xuyên qua ssh, vì tôi tính toán trên đó. Bây giờ, trung tâm điện toán rõ ràng cấm các khóa SSH vì chúng "không an toàn". Họ cảm thấy rằng việc nhập mật khẩu của tôi, trên bàn phím, mọi lúc, có thể trước mặt người khác, là cách đăng nhập an toàn hơn nhiều.

Hiện nay; Tôi không thể thay đổi suy nghĩ của họ (tôi đã cố gắng).

Có cách nào để ít nhất tạm thời lưu trữ mật khẩu SSH, cách GIT có thể lưu mật khẩu trong bộ đệm trong một thời gian xác định không?


55
the computing center explicitly forbids SSH-keys because they are "insecure"- ý kiến ​​của tôi về vấn đề này? Tìm một máy chủ mới, bởi vì máy của bạn rõ ràng là không phù hợp.
Matt Clark

18
@Matt: "trung tâm điện toán" nghe có vẻ giống như một hệ thống lưới học thuật, vốn không có nhiều sự cạnh tranh như tôi đoán
grawity

27
Họ sai. Có lẽ họ đã quên vô hiệu hóa khóa ssh khi hết hạn tài khoản, vì vậy họ quyết định rằng khóa ssh là vấn đề.
Joshua

10
grawity là đúng. nó là một siêu máy tính quốc gia nên tôi bị mắc kẹt với nó. Đối với những gì nó có giá trị, máy là tốt đẹp. Joshua có lẽ cũng đúng, nhưng, tốt, đó là loại quyền không tốt cho bất cứ điều gì
user2667180

7
@TheHansinator Nếu có cài đặt keylogger, bạn đã bị xâm phạm đến mức không còn quan trọng cho dù bạn có bảo vệ các kết nối ssh của mình hay không. Nhưng có những lợi thế khác của publickeyxác thực. Nếu bạn vô hiệu hóa passwordxác thực trên máy chủ, bạn sẽ ngăn tất cả những kẻ tấn công đó cố gắng đoán mật khẩu. Và nếu kẻ tấn công thực hiện một cuộc tấn công mitm chống lại máy khách chưa lưu trữ khóa công khai trước đó của máy chủ, bạn sẽ được bảo vệ tốt hơn nhiều publickeyso với khi bạn sử dụng passwordxác thực.
kasperd

Câu trả lời:


63

Tái sử dụng kết nối

SSHv2 cho phép cùng một kết nối được xác thực để thiết lập nhiều 'kênh' - shell tương tác, lệnh bó, SFTP, cùng với các kết nối phụ như chuyển tiếp tác nhân hoặc chuyển tiếp TCP. Máy chủ của bạn có thể hỗ trợ ghép kênh theo mặc định. (Nếu quản trị viên của bạn phàn nàn, nó không lưu trữ mật khẩu của bạn ở bất cứ đâu - đó là lưu trữ toàn bộ kết nối.)

Với OpenSSH, bạn có ControlMasterControlPathcác tùy chọn (-M và -S) để sử dụng điều này:

  1. Bắt đầu kết nối SSH 'chính chủ' bằng cách sử dụng -M. (Vì bạn chưa có ControlPath trong cấu hình của mình, nên bạn cần chỉ định nó trong dòng lệnh bằng cách sử dụng -S. Nó cần tồn tại lâu, vì vậy tôi thêm các -fNtùy chọn để thả xuống nền; chúng là tùy chọn về mặt kỹ thuật.)

    $ ssh foo@bar.example.com -fNMS ~/.ssh/bar.socket
    foo@bar.example.com's password:
    

    Bạn đang trở lại vỏ địa phương.

  2. Bắt đầu một kết nối mới thông qua tổng thể:

    $ ssh foo@bar.example.com -S ~/.ssh/bar.socket
    

    Bạn đang ở trong.

  3. Để làm điều này hữu ích cho Git / rsync / SFTP, bạn cần thiết lập ControlPathcấu hình của mình, vì bạn sẽ không thể chỉ định -Smọi lúc:

    Host *
        ControlPath ~/.ssh/S.%r@%h:%p
    

Bạn có thể tự động hóa điều này - các phiên bản OpenSSH gần đây cũng có ControlPersisttự động thiết lập kết nối chính trong nền nếu chưa có. Điều này cho phép bạn bỏ qua bước 1 và chỉ sử dụng ssh như bình thường.

  1. Cấu hình trong ~/.ssh/config:

    Host *
        ControlPath ~/.ssh/S.%r@%h:%p
        ControlMaster auto
        ControlPersist 15m
    
  2. Kết nối đầu tiên yêu cầu mật khẩu:

    $ ssh foo@bar.example.com
    foo@bar.example.com's password:
    [foo@bar:~]$ exit
    
  3. Thứ hai không:

    $ ssh foo@bar.example.com
    [foo@bar:~]$ yay
    

Để điều khiển bộ ghép kênh (dừng hoặc định cấu hình chuyển tiếp TCP), sử dụng -Otùy chọn.

Một phương pháp tương tự được hỗ trợ bởi các phiên bản PuTTY gần đây .


1
cảm ơn bạn rất nhiều vì câu trả lời tốt đẹp này google không hữu ích cho vấn đề này, vì nó luôn chuyển sang khóa ssh và tôi không biết từ khóa phù hợp. đã giúp tôi rất nhiều
user2667180

1
Không cần phải nói, nhưng nếu bạn sử dụng cấu hình này thì bắt buộc bạn phải đảm bảo tài khoản của mình được bảo mật và thư mục .ssh của bạn được khóa chính xác vì bất kỳ ai có quyền truy cập vào các tệp kênh trên máy đó đều có thể cõng bạn kết nối và truy cập máy chủ như bạn.
shellster

3
@shellster: Bạn có nghĩa là "bất cứ ai có cùng UID", giống như trường hợp của ssh-agent. Ngay cả khi bạn cố tình mở các quyền của tệp ổ cắm (theo mặc định là 0600), những người dùng khác sẽ chỉ nhận được "ghép kênh uid không khớp".
grawity

3
@shellster Ai đó có quyền root có thể cài đặt keylogger và đánh cắp mật khẩu của bạn vào hệ thống từ xa hoặc thực hiện bất kỳ số lượng việc bất chính nào. Nếu chúng tôi lo lắng về root cục bộ, điều này không kém phần an toàn so với việc lưu khóa riêng SSH.
amalloy

1
Tôi không coi gốc địa phương là mối đe dọa bởi vì nếu nó trở thành mối đe dọa, bạn sẽ không có vấn đề gì. (Như với gián điệp cấp chính phủ.) Thành thật mà nói, một root địa phương chỉ có thể thay thế ssh client ssh-agent của bạn bằng bất cứ thứ gì họ muốn. Lưu trữ tất cả mật khẩu và khóa riêng trong /root/.secret? Chắc chắn rồi.
grawity

19

Sử dụng sshpass

sshpass ( github , man page ) là một công cụ tự động cung cấp mật khẩu cho ssh. Cách an toàn để sử dụng nó là:

% echo 'correct horse battery staple' > ~/.ssh/compute_password
% chmod go-rw ~/.ssh/compute_password

% sshpass -f ~/.ssh/compute_password ssh foo@host

Điều này sẽ đọc mật khẩu từ ~/.ssh/compute_password, giống như một tệp khóa riêng mà không có cụm mật khẩu. Bạn có thể đặt sshpasslệnh trong một tập lệnh shell nhỏ hoặc bí danh shell để tránh gõ lệnh đầy đủ đó. Đáng buồn thay, tôi đã không tìm thấy một cách để làm điều này từ ~/.ssh/config.

(Cũng có thể chỉ định mật khẩu trực tiếp trên dòng lệnh sshpass, nhưng điều này nên tránh, vì nó làm rò rỉ mật khẩu cho bất cứ ai có thể làm ps)

So sánh với các phương pháp khác

Cách tiếp cận này tất nhiên là kém an toàn hơn so với thiết lập xác thực khóa công khai, nhưng bạn có thể biết điều đó rồi.

Nó cũng kém an toàn hơn câu trả lời của @ grawity về việc sử dụng lại kết nối, nhưng nó có ưu điểm là không phải nhập mật khẩu tương tác.

Bạn có thể xem câu trả lời của @ grawity là một thay thế cho pubkey auth với cụm mật khẩu và bộ nhớ đệm khóa riêng (nghĩa là ssh-agent). Sau đó, câu trả lời của tôi sẽ là một thay thế cho pubkey auth mà không có cụm mật khẩu trên tệp khóa riêng.


3
Nếu chính sách của trung tâm điện toán được viết dựa trên "nhưng khóa được lưu trữ trên đĩa nơi ai đó có thể đánh cắp chúng!", Thì có vẻ như chính sách đó sẽ gây phản tác dụng.
grawity

6
@grawity Chà, chính sách tồi dẫn đến những công việc thậm chí còn tồi tệ hơn \ _ (ツ) _ /
marcelm

1
Nếu bạn tạo mật khẩu của mình dưới dạng một dòng ký tự ngẫu nhiên đủ dài (giả head -c 16 /dev/urandom | base64sử là 128 bit) và không sử dụng nó trên các hệ thống khác, thì nó bảo mật tương tự như một khóa. Càng khó dùng vũ lực, và càng đơn giản để sử dụng từ tệp nếu không được mã hóa. Điều này cũng đúng với kẻ xấu, nếu họ lấy được tập tin. Sự khác biệt duy nhất là mật khẩu được gửi đến máy chủ, trong khi các khóa có toán học tốt hơn để chứng minh rằng bạn sở hữu khóa riêng chính xác mà không tiết lộ và khả năng sử dụng, việc mã hóa tệp chứa mật khẩu sẽ khó hơn (không công cụ tiêu chuẩn).
ilkkachu

1

Sử dụng trình quản lý mật khẩu.

Một số trình quản lý mật khẩu (ví dụ: KeePassXC) có tính năng 'tự động gõ'. Bạn lưu mật khẩu trên trình quản lý mật khẩu, mở khóa cơ sở dữ liệu khi bạn chạy trình quản lý và mỗi lần sshnhắc bạn nhập mật khẩu, bạn nhấn tổ hợp phím khiến trình quản lý mật khẩu ghi mật khẩu dài của bạn vào bảng điều khiển.

Không cần phải sao chép, hãy nhớ bất cứ điều gì (ngoại trừ mật khẩu để mở khóa cơ sở dữ liệu) và bạn có thể có một mật khẩu mạnh mà không cần trộn 30 ký tự đó mỗi khi bạn cố gắng đăng nhập.

Bạn có thể chọn mục ưa thích từ danh sách này: https://en.wikipedia.org/wiki/List_of_password_manager


3
Tôi không chắc tính năng loại tự động có hoạt động tốt với các chương trình dựa trên thiết bị đầu cuối hay không. Việc phát hiện sẽ tìm kiếm một tiêu đề cửa sổ cụ thể và bản thân việc tự tạo mẫu tốt nhất không có các tính năng "chống khóa" ưa thích mà KeePass2 có ...
grawity

1
@grawity gnome-terminalthay đổi tiêu đề của nó thành ssh somehostkhi ssh hỏi tôi mật khẩu để bạn có thể khớp cửa sổ tiêu đề với điều này mà không gặp vấn đề gì. Tôi không biết gì về các tính năng 'chống keylogging' - Tôi đang sử dụng KeePassXC trong thiết bị đầu cuối hàng ngày và điều tồi tệ nhất tôi phải đối phó là chọn tài khoản phù hợp từ danh sách.
xốp bay

2
@grawity Các tính năng chống keylogging cần phải được bật trên cơ sở mỗi lần nhập (chính xác là vì lý do nhiều chương trình không hỗ trợ dán).
Bob

0

Một cách khác là sử dụng máy khách GUI ssh. Trên Windows, sự lựa chọn rõ ràng sẽ là PuTTY . Ngoài ra còn có phiên bản Linux của PuTTY, đáng chú ý là hầu hết các bản phát hành dựa trên Debian như Ubuntu thường bao gồm PuTTY trong repo của họ.

Một khách hàng thực sự tốt khác là Termius . Nó hỗ trợ không chỉ Windows và Linux mà cả OSX, iOS và Android. Mặc dù nó được thiết kế chủ yếu cho điện thoại, phiên bản máy tính để bàn thực sự khá tốt.

Nếu tôi không nhầm, Hyperterminal đáng kính trên Windows cũng đã / có một ứng dụng khách ssh được tích hợp nhưng tôi đã không sử dụng windows trong một thời gian rất dài nên tôi không hoàn toàn chắc chắn.

Tất cả các máy khách GUI bao gồm khả năng lưu cài đặt kết nối bao gồm tên người dùng và mật khẩu của bạn.


2
"Dựa trên GUI" không tự động ngụ ý rằng nó sẽ cho phép lưu trữ mật khẩu của bạn, điều mà PuTTY rõ ràng từ chối thực hiện . Phiên bản HyperTerminal đi kèm với Windows chỉ dành cho Telnet, tập trung nhiều hơn vào các liên kết nối tiếp. Có thể bạn đang nghĩ về CKermit cho Windows có hỗ trợ SSH, nhưng hỗ trợ mật mã của nó quá lỗi thời nên sẽ không dễ dàng kết nối với nhiều máy chủ hiện tại.
grawity
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.