Sử dụng cùng một khóa triển khai cho nhiều dự án github


94

Github không cho phép sử dụng cùng một khóa triển khai ssh cho nhiều dự án, điều này sẽ rất hữu ích trong một số trường hợp (ví dụ: máy chủ CI xử lý dự án với các mô-đun con riêng). Tôi đã thấy nhiều chủ đề khác nhau dường như nói rằng giới hạn này là có vì 'lý do bảo mật', nhưng tôi vẫn chưa thấy một lời giải thích thuyết phục về chính xác rủi ro sẽ tăng lên.

Lưu ý rằng thực tế là Github không cho phép sử dụng lại các khóa Cấp tài khoản (hai người dùng không nên chia sẻ khóa). Đó chỉ là hạn chế đối với Khóa triển khai mà tôi đang thắc mắc.

Và để rõ ràng, tôi không tìm kiếm các giải pháp thay thế (tạo người dùng giả, sử dụng nhiều khóa, ...), mà chỉ để tìm một lời giải thích hợp lý cho hạn chế này trên Deploy Keys.

Chủ đề liên quan:


Vì không có cách nào tốt hơn nên chúng tôi tạo một người dùng triển khai chuyên dụng mà chúng tôi đang cấp quyền truy cập chỉ đọc vào các kho lưu trữ. Kết quả cuối cùng là như nhau.
Datageek

Câu trả lời tuyệt vời ở đây: stackoverflow.com/questions/11656134/…
apple16

Câu trả lời:


22

Lý do duy nhất, được minh họa bởi giải pháp mà bạn tham khảo (tạo một người dùng "bản dựng" duy nhất hoặc chia sẻ cùng id_rsa.REPONAME.pubmột repo) là:

tránh chia sẻ khóa công khai / riêng tư cho người dùng khác

Mặc dù điều đó sẽ không xảy ra trong trường hợp của bạn (xây dựng nhiều dự án), việc cho phép sử dụng lại cùng một khóa ssh sẽ mở ra khả năng cho hai người dùng khác nhau chia sẻ cùng một khóa ssh, điều này sẽ không đạt được mục đích xác thực .

Xác thực có nghĩa là:
"sử dụng một khóa ssh nhất định nên ngụ ý rằng bạn phải biết ai đang sử dụng nó".


Trang GitHub " Quản lý khóa triển khai " nêu chi tiết các tài khoản khác nhau sử dụng ssh:

  • Chuyển tiếp tác nhân SSH : Chuyển tiếp tác nhân sử dụng các khóa SSH đã được thiết lập trên máy phát triển cục bộ của bạn khi bạn SSH vào máy chủ của mình và chạy lệnh git.
    Bạn có thể cho phép các máy chủ từ xa truy cập vào ssh-agent cục bộ của mình một cách chọn lọc như thể nó đang chạy trên máy chủ.
    Vì vậy, không cần sao chép khóa cá nhân của bạn trên máy chủ.

  • Người dùng máy : (đây là chiến lược "tài khoản giả") Đính kèm khóa vào tài khoản người dùng. Vì tài khoản này sẽ không được sử dụng bởi con người, nó được gọi là người dùng máy.
    Bạn sẽ đối xử với người dùng này giống như cách bạn đối xử với con người, đính kèm khóa vào tài khoản người dùng máy như thể đó là một tài khoản bình thường.
    Cấp cho cộng tác viên tài khoản hoặc nhóm quyền truy cập vào kho mà họ cần quyền truy cập.
    Vì vậy, một khóa riêng được liên kết với một "người dùng máy", một khóa cho mỗi máy chủ.

( DHa chỉ ra trong các nhận xét về số giới hạn khóa triển khai và thực tế là bạn chỉ có thể có một tài khoản người dùng máy)

  • Triển khai khóa (một khóa trên mỗi repo GitHub) khóa SSH được lưu trữ trên máy chủ và cấp quyền truy cập vào một repo duy nhất trên GitHub.
    Khóa này được gắn trực tiếp vào repo thay vì vào tài khoản người dùng .
    Thay vì đi tới cài đặt tài khoản của bạn, hãy chuyển đến trang quản trị của đại diện mục tiêu.
    Đi tới " Deploy Keys" và nhấp vào " Add deploy key". Dán khóa công khai vào và gửi.

Lần này, khóa ssh không được gắn với người dùng (mà bạn có thể cấp quyền truy cập vào một số repo) mà cho một repo.
Cấp quyền truy cập ssh cho một số repo sẽ tương đương với "người dùng máy".

Về mặt xác thực :

  • sử dụng cùng một khóa cho một số repos là được khi nó được thực hiện bởi người dùng (người đã nói khóa được liên kết với tài khoản của họ)
  • Sử dụng cùng một khóa cho nhiều repo KHÔNG được khi khóa được đính kèm bởi repo, vì bạn hoàn toàn không biết ai đã truy cập vào cái gì.
    Điều đó khác với "người dùng máy" ở đó "người dùng" được khai báo là cộng tác viên cho nhiều repo.
    Ở đây (Deploy key), không có "cộng tác viên" , chỉ là quyền truy cập ssh trực tiếp được cấp cho repo.

53
GitHub hỗ trợ cả khóa công khai Cấp tài khoản và khóa Cấp dự án (hay còn gọi là Khóa triển khai). Không cho phép sử dụng lại các khóa Cấp tài khoản là có lý, nhưng tôi khẳng định rằng việc không cho phép sử dụng Khóa triển khai thì không. Một khóa Cấp tài khoản của tôi cho phép truy cập vào tất cả các dự án của tôi, vậy tại sao tôi không thể có Khóa triển khai cho phép truy cập vào một số dự án của mình? Nó chỉ hạn chế hơn và không tạo ra bất kỳ mối quan tâm nào mà tôi có thể thấy. Mối quan tâm của bạn về việc mở khả năng cho hai người dùng khác nhau chia sẻ cùng một khóa ssh không xuất hiện trong hình ảnh trong trường hợp đó.
David Ebbo

@DavidEbbo Có thể không xuất hiện trong hình, nhưng mối quan tâm đó (hai người dùng khác nhau chia sẻ cùng một khóa ssh) là cốt lõi của lý do tại sao khóa ssh không được chia sẻ.
VonC

21
Tôi e rằng tôi không theo lý luận của bạn ở đây. Tôi đang hỏi về một tình huống rất cụ thể (sử dụng Khoá triển khai trong nhiều dự án) và lập luận của bạn về việc không thể thực hiện được là đưa ra một kịch bản không liên quan (hai người dùng chia sẻ khoá ssh). Chỉ gắn bó với kịch bản Deploy Key, tiêu cực của việc github cho phép nó là gì?
David Ebbo

6
@DavidEbbo Sau help.github.com/articles/managing-deploy-keys , không có phương pháp nào trong ba phương pháp (Tài khoản, Triển khai hoặc Tài khoản máy) liên quan đến việc chia sẻ khóa SSH riêng tư để truy cập các kho lưu trữ nói trên. Chỉ gắn bó với trường hợp Deploy Key, vì nó là một khóa trên máy chủ , để nó có hiệu lực trên một số repos có nghĩa là chia sẻ (hoặc sao chép) một private key trên nhiều repos. Điều đó làm giảm khía cạnh xác thực và nếu khóa bị xâm phạm, sẽ làm tăng số lượng repo bị lộ.
VonC

8
cảm ơn, trang đó có thông tin thú vị Tôi sẽ đánh dấu câu trả lời của bạn là câu trả lời trong một hoặc hai ngày nếu tôi không thấy gì khác, mặc dù thành thật mà nói, tôi vẫn không bị thuyết phục bởi lập luận. Có một khóa triển khai được sử dụng trên hai đại diện không yếu hơn việc sử dụng một khóa máy có quyền truy cập vào cùng một tập hợp các đại diện.
David Ebbo

11

Thật không may, đây là một tình huống mà github chỉ hiểu sai sự khác biệt giữa cặp khóa và tài khoản hoặc dự án.

Vì một cặp khóa được sử dụng để xác thực và ủy quyền, nó thực sự là một danh tính. Tài khoản Github là một danh tính khác. Việc kết nối tài khoản github với các cặp khóa thiết lập một cách hiệu quả ánh xạ 1: N giữa danh tính dựa trên tài khoản github và danh tính cặp khóa.

Ngược lại, github thực thi ánh xạ 1: N của các dự án tới danh tính dựa trên cặp khóa. Điều tương tự trong thế giới thực là có một cánh cửa cấp quyền truy cập vào dự án mà nhiều người khác nhau có thể mở khóa. Nhưng một khi bất kỳ ai trong số họ có được chìa khóa mở cửa, họ sẽ không thể lấy lại bất kỳ chìa khóa nào khác cho bất kỳ cánh cửa nào khác.

Bạn không nên sử dụng lại các khóa thường xuyên dưới góc độ chứa vi phạm nếu khóa bị xâm phạm. Nhưng đó chỉ là một chính sách quản trị tốt . Về nguyên tắc, không có ý nghĩa gì khi ngăn chặn một chìa khóa được sử dụng nhiều lần . Đó là một số chìa khóa cho một số cửa không bao giờ được sử dụng lại, tốt, một lần nữa đó là do chính sách .


Một cách nhìn phức tạp hơn một chút là minh họa các cặp chính như các vai trò . Bạn có thể sở hữu nhiều cặp khóa và do đó đảm nhiệm nhiều vai trò. Khóa riêng tư xác thực bạn cho vai trò.

Bản đồ chìa khóa triển khai của Github cho các dự án nói rằng một vai trò không bao giờ có thể bao gồm nhiều hơn một nhiệm vụ. Điều đó hiếm khi thực tế.

Tất nhiên, không có cái nào thay đổi những gì github cho phép.


1
Heh. Thật là buồn cười khi điều này bị phản đối, khi nó đúng hơn câu trả lời được chấp nhận. Thực sự thì không có gì ngăn cản việc chia sẻ khóa với nhiều người dùng.
Jens Finkhaeuser

2

Tôi đã mất rất nhiều suy nghĩ để hợp lý hóa các hàm ý và đưa ra kịch bản này.

Hãy tưởng tượng rằng bạn tạo một khóa triển khai duy nhất cho một người dùng mà bạn đã chỉ định cho nhiều kho lưu trữ. Bây giờ bạn muốn thu hồi khóa đó nhưng nó được sử dụng ở nhiều nơi. Vì vậy, thay vì có thể thu hồi tất cả quyền truy cập, bạn có thể vô tình chỉ thu hồi quyền truy cập một phần.

Điều này nghe có vẻ có lợi nhưng mối quan hệ nhiều người này thực ra vốn không an toàn một khi bạn cân nhắc đến yếu tố con người. Điều này là do bạn không thể biết chắc chắn liệu bạn có thực sự thu hồi tất cả quyền truy cập mà không kiểm tra từng kho lưu trữ và so sánh từng khóa công khai riêng lẻ trong trường hợp bạn đã quên nơi bạn đã thực sự gán nó hay không.

Chắc chắn là rất khó chịu khi gán và quản lý quá nhiều khóa duy nhất nhưng ý nghĩa bảo mật rõ ràng với cách GitHub thiết lập chính sách của họ: khi bạn thu hồi khóa, bạn được đảm bảo sẽ thu hồi tất cả quyền truy cập được cấp bởi khóa đó vì nó chỉ được sử dụng ở một nơi .


1
Tôi không bị thuyết phục bởi lời giải thích này. Điều đó khác về cơ bản như thế nào so với việc cho phép một người dùng truy cập vào nhiều kho lưu trữ, điều đó rõ ràng là được phép? Nếu bạn không còn tin tưởng người dùng đó, bạn cần xóa họ khỏi mọi repo.
David Ebbo

@David: How is that fundamentally different from allowing one user to access multiple repositories, which is obviously allowedBạn có thể giải thích thêm về điều này không? Tôi chỉ có tài khoản Nhà phát triển và tôi thấy rằng bạn có thể thêm các khóa ssh để truy cập toàn tài khoản (một khóa cho tất cả các kho) hoặc thêm các khóa triển khai riêng lẻ (một khóa cho mỗi kho). Đây vẫn là mối quan hệ một-nhiều hoặc một-một trong đó việc thu hồi khóa "một" sẽ thu hồi quyền truy cập "tất cả" trong cả hai trường hợp.
Zhro

Để làm rõ thêm, không có cơ hội (những gì tôi có thể nói) để vô tình gán một khóa trong mối quan hệ nhiều-một nơi quyền truy cập có thể tồn tại ở nơi khác sau khi bị thu hồi. Đây dường như là động lực của GitHub cho hạn chế này nhưng tôi chỉ phỏng đoán.
Zhro

Cách tôi nhìn mọi thứ, các khóa triển khai hơi giống 'người dùng ẩn danh' không có tài khoản đầy đủ, nhưng vẫn đại diện cho một số loại danh tính. Sự khác biệt là trong trường hợp tài khoản, bạn cấp quyền truy cập vào tài khoản, điều này gián tiếp cấp quyền truy cập vào tất cả các khóa ssh trong tài khoản đó. Trong trường hợp Khóa triển khai, bạn bỏ qua phần tóm tắt tài khoản và trực tiếp cấp quyền truy cập vào khóa ssh. Nhưng ngoài ra, tôi không thấy nhu cầu bảo mật có gì khác biệt. Nếu Tài khoản HOẶC chủ sở hữu của khóa triển khai trở nên xấu, bạn cần xóa chúng khỏi mỗi repo.
David Ebbo
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.