OpenSSH với các khóa công khai từ cơ sở dữ liệu


14

Có thể tìm nạp các khóa công khai từ cơ sở dữ liệu thay vì tệp ủy quyền không?

Tôi muốn sử dụng một thiết lập như vậy để quản lý quyền truy cập ssh vào những thứ như kho git cho nhiều người dùng mà không cần phải tạo lại tệp ủy quyền mỗi khi thay đổi hoặc thêm khóa công khai.


1
Tôi đang sử dụng con rối cho việc này
Matt Simmons

Userify có thể quản lý các tài khoản đó bằng quản trị tập trung nhưng xác thực cục bộ .. theo cách này nếu DB tập trung của bạn bị hỏng, bạn vẫn có thể truy cập, nhưng bạn nhận được tất cả lợi ích của quản lý tập trung.
Jamieson Becker

Câu trả lời:


16

Tôi tìm thấy câu hỏi này khi cố gắng tự trả lời nó. Sau một số tìm kiếm và thử nghiệm, tôi đã tìm thấy một vài lựa chọn khác cho việc này. Tôi sẽ bỏ qua phần phân phối khóa thay thế vì Matt Simmons đã đề cập đến điều đó. Ngoài ra, tôi biết có những lúc điều đó không đủ tốt. Ví dụ: nếu bạn là GitHub và phải lưu trữ hàng triệu khóa công khai đối với một người dùng, việc cập nhật liên tục các tệp SSH ủy quyền và giữ chúng được đồng bộ hóa qua hàng chục đến hàng trăm hộp cạnh là không khả thi hoặc không mong muốn.

Vì thế,

  1. Trước hết, RedHat (và các biến thể) có một bản vá được hỗ trợ cho OpenSSH có thêm các tùy chọn AuthorizedKeysCommandAuthorizedKeysCommandRunAs. Bản vá đã được hợp nhất ngược dòng trong openssh 6.2. Để trích dẫn từ trang người đàn ông :

    AuthorizedKeysCommand

    Chỉ định chương trình được sử dụng để tra cứu các khóa công khai của người dùng. Chương trình sẽ được gọi với đối số đầu tiên là tên của người dùng được ủy quyền và sẽ tạo ra các dòng AuthorizedKeys đầu ra tiêu chuẩn (xem AUTHORIZED_KEYS trong sshd (8)). Theo mặc định (hoặc khi được đặt thành chuỗi trống), không có AuthorizedKeysCommand chạy. Nếu AuthorizedKeysCommand không ủy quyền thành công cho người dùng, ủy quyền sẽ thuộc về AuthorizedKeysFile. Lưu ý rằng tùy chọn này chỉ có hiệu lực khi bật PubkeyAuthentication.

    AuthorizedKeysCommandRunAs

    Chỉ định người dùng trong tài khoản mà AuthorizedKeysCommand đang chạy. Chuỗi rỗng (giá trị mặc định) có nghĩa là người dùng được ủy quyền được sử dụng.

    Trong các thử nghiệm của tôi tối nay, tôi thấy rằng ngoài hộp, điều này không hoạt động do các chính sách Selinux mặc định. Bạn có thể khắc phục điều này bằng cách tắt thực thi SELinux với setenforce 0. Vì việc chuyển sang Selinux có lẽ là một ý tưởng tồi , thay vào đó bạn có thể tạo chính sách chính xác. Trong trường hợp của tôi, điều đó đơn giản như cố gắng đăng nhập với AuthorizedKeysCommandtùy chọn được thiết lập /etc/ssh/sshd_configvà sau đó sử dụng audit2allow -a -M local && semodule -i local.pp. Điều này về cơ bản xem qua nhật ký kiểm toán và tìm thấy những thứ bị ngăn chặn và tạo ra ngoại lệ cho chúng. Nếu bạn có thể có những thứ khác trong đó có thể được đưa vào danh sách trắng, có lẽ bạn nên tìm hiểu thêm về audit2allowđể đảm bảo bạn có được các chính sách mới vừa phải.

  2. Có nhiều bản vá khác nhau (có thể ít được thử nghiệm và đáng tin cậy) ngoài kia để thêm chức năng tương tự. Ví dụ, có, openssh-script-auth . Bạn cũng có thể tìm thấy bản vá mà RedHat đã sử dụng và áp dụng trực tiếp. Một cơn nhanh chóng phát hiện ra Googling https://launchpadlibrarian.net/89063205/openssh-5.3p1-authorized-keys-command.patchhttps://launchpadlibrarian.net/105938151/openssh-authorized-keys-command.patch đó là dựa trên các phiên bản RH nhưng đã được cập nhật cho các phiên bản OpenSSH mới hơn.

  3. Vá OpenSSH để thực hiện tra cứu khóa trực tiếp từ một số cửa hàng (ví dụ như GitHub và CodeBaseHQ và những người khác đã thực hiện). GitHub đã không mở bản vá này, theo sự hiểu biết tốt nhất của tôi, nhưng tôi biết trong quá khứ tôi đã bắt gặp các phiên bản để tra cứu khóa MySQL và PostgreQuery. Tôi đã cố gắng tìm lại chúng ngay bây giờ nhưng không gặp nhiều may mắn.

  4. Ngoài ra còn có một số tùy chọn dựa trên FUSE. Ví dụ: có LPKFuse cho phép bạn cung cấp các khóa công khai từ LDAP bằng cách thay đổi AuthorizedKeysFilevị trí thành một trên hệ thống tệp LPKFuse. LPKFuse FS tạo các tệp ảo có nội dung được hỗ trợ bởi các trường từ máy chủ thư mục.


Nói chung, tôi nghĩ tùy chọn số 1 là tốt nhất vì nó được RedHat hỗ trợ chính thức. Hơn nữa, nó cho phép bạn đặt bất kỳ logic nào bạn thích trong tập lệnh đó (bao gồm cả nói chuyện với cơ sở dữ liệu) bằng bất kỳ ngôn ngữ nào bạn muốn.


Re: # 1 tìm thấy tốt đẹp !! Tôi hy vọng rằng đi ngược dòng, nó sẽ có ích trong ESXi.
Jason Tan

@JasonTan: AuthorizedKeysCommand đã đi ngược dòng trong openssh 6.2. Tôi cũng đã cập nhật câu trả lời để phản ánh điều đó.
Bluewind

Câu trả lời tuyệt vời, tùy chọn 1 chính xác là những gì tôi đang tìm kiếm.
Shane Kilkelly

3

OpenSSH không có khả năng này, theo như tôi biết. Đặt cược tốt nhất của bạn có thể là để một tập lệnh tự động tạo lại tập tin hàng đêm (hoặc thường xuyên khi cần thiết).

Ngoài ra, bạn có thể muốn xem câu hỏi này: Một hệ thống phân phối khóa công khai SSH


1

Tôi tin rằng trong các phiên bản openssh mới hơn, bạn có thể lưu trữ khóa trong mục nhập LDAP của người dùng. Nếu bạn đã sử dụng LDAP hoặc AD để quản lý tài khoản, bạn cũng có thể tận dụng nó để quản lý khóa.

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.