Làm cách nào để được hỏi mật khẩu khóa SSH một lần và chỉ khi cần?


15

(Tôi đã đọc nhiều câu hỏi trên trang web này có vẻ liên quan và tôi tin rằng đây là một câu hỏi thực sự mới.)

Tôi có rất nhiều khóa trên nhiều máy chủ và tất cả chúng đều được bảo vệ bằng cụm mật khẩu.

Tôi thích nhập cụm mật khẩu nhiều như tôi muốn nhập mật khẩu - đó là một sự giảm năng suất thực sự.

  • Các lệnh ssh-agent + ssh-add có thể được sử dụng trên shell đăng nhập để có nghĩa là bạn chỉ phải nhập cụm mật khẩu của mình một lần khi đăng nhập

  • móc khóa có thể được sử dụng để giữ một ssh-agent còn sống ngoài logout, vì vậy, ví dụ bạn có thể có nó để bạn chỉ phải nhập cụm mật khẩu một lần khi khởi động, hoặc bạn có thể giữ nó tồn tại trong một giờ hoặc lâu hơn.

Vấn đề tôi gặp phải là cả hai giải pháp này thường được bắt đầu trong một lần đăng nhập shell (ví dụ .zshrc) dựa vào tôi nhập cụm mật khẩu của tôi khi tôi đăng nhập, ngay cả khi tôi sẽ không cần mở khóa. (Tôi không hài lòng với móc khóa giữ một đại lý sống vô thời hạn.)

Điều tôi muốn là được nhắc nhập cụm mật khẩu (cho một tác nhân) chỉ khi cần .

Vì vậy, tôi có thể đăng nhập vào máy chủ A, làm một số thứ, sau đó ssh đến máy chủ B và tại thời điểm đó được yêu cầu nhập cụm mật khẩu. Làm một số thứ trên máy chủ B, đăng xuất. Quay lại A, làm thêm một số thứ, ssh đến B một lần nữa và không cần cụm mật khẩu của tôi (nó được giữ bởi một tác nhân).

Tôi lưu ý rằng điều này có thể có trên các máy tính để bàn đồ họa như Gnome - bạn nhận được một cửa sổ bật lên yêu cầu cụm mật khẩu để mở khóa khóa riêng của bạn ngay khi bạn cố gắng ssh. Vì vậy, đây là những gì tôi sau nhưng từ một giao diện điều khiển.


Tại sao không chỉ tạo các khóa ssh mà không có cụm mật khẩu? Nếu bạn sẽ trải qua tất cả những rắc rối này?
tà tà

1
Nếu ai đó xâm nhập và có khóa không có mật khẩu (hoặc tác nhân ssh hoạt động), họ cũng có thể có quyền truy cập vào nhiều máy chủ khác. Ngoài ra các khóa không có cụm mật khẩu có thể bị đánh cắp và sử dụng ở nơi khác.
artfulrobot

Theo tôi biết, không có cách nào để làm những gì bạn muốn mà không phải hy sinh một số mức độ bảo mật, điều này nghe có vẻ như bạn không muốn làm. Có một câu trả lời sâu sắc của Thomas Nyman ở đây có nhiều khả năng nếu bạn chưa đọc nó: unix.stackexchange.com/a/90869/82289 . Tôi giải quyết vấn đề này tại công ty của mình bằng cách sử dụng một máy chủ trung gian quản lý các phiên ssh với Tmux.
devnull

@DevNull có vẻ kỳ lạ khi bạn có thể làm điều đó với máy tính để bàn nhưng không phải với thiết bị đầu cuối, phải không? Chắc chắn nó chỉ cần các tác nhân nhảy đến tty nếu không có phím nào được thêm vào? Đây phải là cách gui làm việc?
artfulrobot

Bạn có thể xem câu trả lời của tôi ở đây: unix.stackexchange.com/a/184160/89706 (Liên kết câu hỏi: unix.stackexchange.com/questions/90853/ trộm )
Johnny Wong

Câu trả lời:


14

Đừng thêm bất cứ điều gì vào bất kỳ tập lệnh khởi động shell nào của bạn, đây là hack không cần thiết.

Thay vào đó, thêm

AddKeysToAgent yes

để .ssh / config của bạn

Như thế này, ssh-add được chạy tự động vào lần đầu tiên bạn ssh vào một hộp khác. Bạn chỉ phải nhập lại khóa của mình khi nó hết hạn từ ssh-agent hoặc sau khi bạn khởi động lại.


Tôi muốn mọi người sẽ bình luận khi xuống bỏ phiếu. Nếu nó không đúng là quan trọng, chúng tôi biết tại sao nó không đúng. Cảm ơn bạn đã đăng bài, tôi không có thời gian để tự mình thử đề xuất của bạn.
artfulrobot

Tôi cũng tự hỏi, có lẽ vì bài viết chéo của tôi?
Toby

Điều này làm việc cho tôi. Tuy nhiên, đây là một bổ sung rất gần đây cho openssh (7.2). Trong trường hợp nó giúp được bất cứ ai, openssh 7.3 có sẵn trong Debian Sid.
artfulrobot

@artfulrobot: Lạ thật, vì tôi đã có hành vi rất giống như vậy (auto-ssh-add ở lần gọi đầu tiên của ssh) hoạt động trong nhiều năm, cho đến khi cuối cùng nó dừng lại một thời gian trước đây. Tìm kiếm nguyên nhân, tôi tìm thấy AddKeysToAgent và cho rằng lý do khiến nó dừng lại là do tình cờ tôi phải dọn sạch .ssh / config và AddKeysToAgent cùng với nó. Bây giờ tôi tự hỏi tại sao nó hoạt động lâu trước khi OpenSSH 7.2 được phát hành? Tôi không tưởng tượng điều này :-)
Toby

@Toby đây chính xác là những gì tôi cần. Thật không may, ssh-agent dường như không bắt đầu tự động trong kubfox, vì vậy đó là điều tiếp theo tôi cần giải quyết.
Ogaday

7

Zsh có một preexechook thực thi một chức năng trước khi một lệnh được nhập trên dòng lệnh được thực thi. Đây là một hook tìm kiếm sshtrong dòng lệnh của bạn và nếu được tìm thấy, hãy kiểm tra sự tồn tại của một tác nhân ssh. Nếu không tìm thấy, nó chạy móc khóa.

Vì vậy, theo cách này, móc khóa chỉ chạy trước các lệnh ssh, và sau đó chỉ khi cần thiết.

Đặt cái này trong ~/.zshrc:

function check_ssh {
  [[ $3 =~ '\bssh\b' ]] || return
  [[ -n "$SSH_AGENT_PID" && -e "/proc/$SSH_AGENT_PID" ]] \
    && ssh-add -l >/dev/null && return
  eval `keychain --eval id_dsa --timeout 60`
}    
autoload -U add-zsh-hook
add-zsh-hook preexec check_ssh

Điều xảy ra ở đây là bất cứ khi nào một lệnh được gõ, check_sshđược gọi trước khi lệnh được thực thi.

Dòng đầu tiên của hàm kiểm tra lệnh mở rộng để sshsử dụng biểu thức chính quy Zsh. sshphải có ranh giới từ \bhai bên. Nếu điều này không được tìm thấy thì hàm trả về.

Dòng tiếp theo kiểm tra xem có một quy trình tác nhân SSH trong biến môi trường hay không và quy trình đó vẫn tồn tại trong bảng quy trình, và sau đó ít nhất một khóa đã được thêm vào tác nhân. Nếu tất cả điều đó là ổn, thì ssh agent được thiết lập và chúng ta không cần phải làm gì cả, vì vậy nó sẽ trả về.

Cuối cùng chúng tôi bắt đầu móc khóa, với các đại lý được giữ sống trong một giờ.

Nó vẫn còn để lại những vấn đề về công cụ ssh nhúng, như githoặc rsynchoặc scplàm như thế sẽ không kích hoạt chức năng (bạn có thể thêm chúng vào regex).


Ngay cả khi không có zsh, người ta có thể tạo một tập lệnh ngắn với cùng hiệu ứng và đặt nó PATHtrước sshmáy khách thực tế . Thậm chí có thể làm việc với rsyncet al, nếu họ đọc PATHthay vì chạy /usr/bin/sshtrực tiếp.
ilkkachu

2

Đối với zsh, tôi đã viết một bộ tiện ích và trình bao bọc để thực hiện ít nhiều những gì bạn muốn: https://www.vinc17.net/unix/index.en.html#zsh-ssh-utils

Trên thực tế, điều này thậm chí còn nhiều hơn, bởi vì ssh-agenttất cả các phiên đăng nhập sẽ được chia sẻ (máy tính để bàn hoặc qua SSH và GNU Screen cũng được hỗ trợ nếu bạn bắt đầu đăng nhập shell từ nó, ví dụ như shell -zshtrong ~/.screenrctệp) và nó sẽ chỉ thoát sau phiên cuối cùng chấm dứt.

Lưu ý: Tôi chỉ sử dụng một cụm mật khẩu cho tất cả các khóa của mình. Tôi không chắc chắn về hành vi cho các cụm mật khẩu khác nhau; có thể cần một số thay đổi.


Wow đó là khá nhiều mã. Công việc tốt đẹp và cảm ơn đã chia sẻ. Tôi nghĩ rằng tôi cần một cái gì đó đơn giản hơn - SSH là một công cụ cốt lõi đối với tôi.
artfulrobot
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.