Đây là một ví dụ điển hình về sự đánh đổi giữa an ninh và tiện lợi. May mắn thay, có một số tùy chọn. Giải pháp phù hợp nhất phụ thuộc vào kịch bản sử dụng và mức độ bảo mật mong muốn.
ssh-key với cụm mật khẩu, không ssh-agent
Bây giờ mật khẩu phải được nhập mỗi lần khóa được sử dụng để xác thực. Mặc dù đây là tùy chọn tốt nhất từ quan điểm bảo mật, nó cung cấp khả năng sử dụng tồi tệ nhất. Điều này cũng có thể dẫn đến một cụm mật khẩu yếu được chọn theo thứ tự - để giảm bớt gánh nặng nhập liên tục.
ssh-key với cụm mật khẩu, với ssh-agent
Thêm các mục sau vào ~/.bash_profile
sẽ tự động bắt đầu ssh-agent
và tải (các) khóa ssh khi đăng nhập:
if [ -z "$SSH_AUTH_SOCK" ] ; then
eval `ssh-agent -s`
ssh-add
fi
Bây giờ mật khẩu phải được nhập vào mỗi lần đăng nhập. Mặc dù tốt hơn một chút từ góc độ khả năng sử dụng, nhưng điều này có nhược điểm ssh-agent
nhắc nhở cụm mật khẩu bất kể khóa có được sử dụng hay không trong phiên đăng nhập. Mỗi lần đăng nhập mới cũng sinh ra một thể hiện riêng biệt ssh-agent
vẫn đang chạy với các khóa được thêm vào trong bộ nhớ ngay cả sau khi đăng xuất, trừ khi bị giết rõ ràng.
Để tắt ssh_agent
khi đăng xuất, hãy thêm vào như sau~/.bash_logout
if [ -n "$SSH_AUTH_SOCK" ] ; then
eval `/usr/bin/ssh-agent -k`
fi
hoặc sau đây để ~/.bash_profile
trap 'test -n "$SSH_AUTH_SOCK" && eval `/usr/bin/ssh-agent -k`' 0
Tạo nhiều ssh-agent
trường hợp có thể tránh được bằng cách tạo một ổ cắm liên lạc liên tục cho tác nhân tại một vị trí cố định trong hệ thống tệp, chẳng hạn như trong câu trả lời của Collin Anderson . Tuy nhiên, đây là một cải tiến trong việc sinh ra nhiều trường hợp tác nhân, trừ khi rõ ràng đã giết khóa được giải mã vẫn còn trong bộ nhớ sau khi đăng xuất.
Trên máy tính để bàn, các tác nhân ssh đi kèm với môi trường máy tính để bàn, chẳng hạn như Tác nhân SSH của Gnome , có thể là một cách tiếp cận tốt hơn vì chúng thường được sử dụng để nhắc cụm mật khẩu lần đầu tiên sử dụng khóa ssh trong phiên đăng nhập và lưu trữ khóa riêng được giải mã trong bộ nhớ cho đến khi kết thúc phiên.
ssh-key với cụm mật khẩu, với ssh-ident
ssh-ident
là một tiện ích có thể quản lý ssh-agent
thay mặt bạn và tải danh tính khi cần thiết. Nó chỉ thêm khóa một lần khi cần, bất kể có bao nhiêu thiết bị đầu cuối, ssh hoặc phiên đăng nhập yêu cầu quyền truy cập vào một ssh-agent
. Nó cũng có thể thêm và sử dụng một tác nhân khác và bộ khóa khác nhau tùy thuộc vào máy chủ được kết nối hoặc thư mục ssh được gọi từ đó. Điều này cho phép cô lập các khóa khi sử dụng chuyển tiếp tác nhân với các máy chủ khác nhau. Nó cũng cho phép sử dụng nhiều tài khoản trên các trang như GitHub.
Để bật ssh-ident
, hãy cài đặt nó và thêm bí danh sau vào ~/bash_profile
:
alias ssh='/path/to/ssh-ident'
ssh-key với cụm mật khẩu, với keychain
keychain
là một tiện ích nhỏ quản lý ssh-agent
thay mặt bạn và cho phép ssh-agent
duy trì hoạt động khi phiên đăng nhập kết thúc. Trong lần đăng nhập tiếp theo, keychain
sẽ kết nối với phiên bản hiện có ssh-agent
. Trong thực tế, điều này có nghĩa là chỉ phải nhập cụm mật khẩu trong lần đăng nhập đầu tiên sau khi khởi động lại. Trong các lần đăng nhập tiếp theo, khóa không được mã hóa từ phiên bản hiện tại ssh-agent
được sử dụng. Điều này cũng có thể hữu ích để cho phép xác thực RSA / DSA cron
không mật khẩu trong các công việc mà không cần ssh-key không mật khẩu.
Để kích hoạt keychain
, cài đặt nó và thêm một cái gì đó như sau ~/.bash_profile
:
eval `keychain --agents ssh --eval id_rsa`
Từ quan điểm bảo mật, ssh-ident
và keychain
tồi tệ hơn các ssh-agent
trường hợp giới hạn trong vòng đời của một phiên cụ thể, nhưng chúng mang lại mức độ tiện lợi cao. Để cải thiện tính bảo mật keychain
, một số người thêm --clear
tùy chọn vào lệnh ~/.bash_profile
gọi móc khóa của họ . Bằng cách thực hiện cụm mật khẩu này phải được nhập lại khi đăng nhập như trên, nhưng các cron
công việc vẫn sẽ có quyền truy cập vào các khóa không được mã hóa sau khi người dùng đăng xuất. Các keychain
trang wiki có thêm thông tin và ví dụ.
ssh-key không có cụm mật khẩu
Từ quan điểm bảo mật, đây là tùy chọn tồi tệ nhất vì khóa riêng hoàn toàn không được bảo vệ trong trường hợp nó bị lộ. Tuy nhiên, đây là cách duy nhất để đảm bảo rằng cụm mật khẩu không cần phải nhập lại sau khi khởi động lại.
ssh-key với cụm mật khẩu, với ssh-agent
, chuyển cụm mật khẩu đến ssh-add
từ tập lệnh
Mặc dù có vẻ như là một ý tưởng đơn giản để chuyển cụm mật khẩu đến ssh-add
từ một tập lệnh, ví dụ echo "passphrase\n" | ssh-add
, đây không phải là căng thẳng vì nó dường như ssh-add
không đọc cụm mật khẩu từ stdin
, nhưng mở /dev/tty
trực tiếp để đọc .
Điều này có thể được làm việc xung quanh với expect
, một công cụ để tự động hóa các ứng dụng tương tác. Dưới đây là một ví dụ về tập lệnh thêm khóa ssh bằng cụm mật khẩu được lưu trong tập lệnh:
#!/usr/bin/expect -f
spawn ssh-add /home/user/.ssh/id_rsa
expect "Enter passphrase for /home/user/.ssh/id_rsa:"
send "passphrase\n";
expect "Identity added: /home/user/.ssh/id_rsa (/home/user/.ssh/id_rsa)"
interact
Lưu ý rằng vì cụm mật khẩu được lưu trữ trong văn bản gốc trong tập lệnh, từ góc độ bảo mật, điều này khó tốt hơn so với việc sử dụng khóa ssh-key không mật khẩu. Nếu cách tiếp cận này được sử dụng, điều quan trọng là phải đảm bảo rằng expect
tập lệnh chứa cụm mật khẩu có các quyền thích hợp được đặt cho nó, làm cho nó có thể đọc được, có thể ghi và có thể chạy được bởi chủ sở hữu khóa.