Використання одного і того ж ключа розгортання для декількох проектів github


94

Github не дозволяє використовувати один і той же ключ розгортання ssh для більш ніж одного проекту, що було б дуже корисно в деяких випадках (наприклад, сервер CI, що має справу з проектом з приватними підмодулями). Я бачив різні теми, які, здається, говорять про те, що це обмеження існує з "міркувань безпеки", але я ще не побачив переконливого пояснення щодо того, який саме ризик це може викликати.

Зауважте, що той факт, що Github не дозволяє повторно використовувати ключі рівня облікового запису, має сенс (двоє користувачів не повинні ділитися ключами). Це лише обмеження щодо ключів розгортання, яке я допитую.

І щоб бути зрозумілим, я не шукаю обхідних шляхів (створити фіктивного користувача, використовувати кілька ключів, ...), а лише правдоподібне пояснення цього обмеження на ключі розгортання.

Пов’язані теми:


Оскільки немає кращого способу, ми створили спеціального користувача розгортання, якому надаємо доступ лише до читання до сховищ. Кінцевий результат однаковий.
Datageek

Великий відповідь тут: stackoverflow.com/questions/11656134 / ...
apple16

Відповіді:


22

Єдиною причиною, проілюстрованою обхідним шляхом, на який ви посилаєтесь (створення одного користувача "побудови" або спільне використання одного і того ж id_rsa.REPONAME.pubрепо), є:

уникайте спільного використання відкритого / приватного ключа для різних користувачів

Навіть незважаючи на те, що у вашій ситуації це не так (побудова декількох проектів), повторне використання одного ключа ssh відкриє можливість двом різним користувачам спільно використовувати один і той же ключ ssh, що призведе до порушення цілей автентифікації .

Аутентифікація означає:
"використання певного ключа ssh має означати, що ви повинні знати, хто ним користується".


Сторінка GitHub " Керування ключами розгортання " деталізує різні облікові записи за допомогою ssh:

  • Переадресація агента SSH : переадресація агента використовує ключі SSH, уже налаштовані на вашій локальній машині розробки, коли SSH входить на ваш сервер і запускає команди git.
    Ви можете вибірково дозволити віддаленим серверам отримувати доступ до вашого локального агента ssh, як якщо б він працював на сервері.
    Тож не потрібно копіювати ваш приватний ключ на сервері.

  • Користувачі машини : (це стратегія "фіктивного облікового запису") Приєднайте ключ до облікового запису користувача. Оскільки цей обліковий запис не буде використовуватися людиною, він називається користувачем машини.
    Ви поводились би з цим користувачем так само, як із людиною, хоча б прикріпити ключ до облікового запису користувача машини, як якщо б це був звичайний обліковий запис.
    Надайте співробітнику облікового запису або команді доступ до репозиторіїв, до яких йому потрібен доступ.
    Отже, один приватний ключ пов'язаний з одним "користувачем машини", по одному на сервер.

( DHa вказує в коментарях на обмежене число ключа розгортання, а також на те, що ви можете мати лише один обліковий запис користувача машини)

  • Розгортання ключа (по одному на репозиторій GitHub) SSH, який зберігається на сервері та надає доступ до одного репо на GitHub.
    Цей ключ прикріплюється безпосередньо до репозиторію, а не до облікового запису користувача .
    Замість того, щоб переходити до налаштувань свого облікового запису, перейдіть на сторінку адміністратора цільового репо.
    Перейдіть до " Deploy Keys" та натисніть " Add deploy key". Вставте відкритий ключ і надішліть.

Цього разу ключ ssh прикріплений не до користувача (для якого ви можете надати доступ до кількох репо), а до одного репо.
Надання доступу ssh для кількох репо буде еквівалентом "користувача машини".

Що стосується автентифікації :

  • використання одного і того ж ключа для кількох репозиторіїв - це нормально, коли це робить користувач (який зазначений ключ пов’язаний з його / її обліковим записом)
  • використання одного і того ж ключа для декількох репо НЕ гаразд, коли ключ приєднується репо, оскільки ви взагалі не знаєте, хто до чого отримував доступ.
    Це відрізняється від "користувача машини", де "користувач" оголошується співавтором для багатьох репо.
    Тут (ключ розгортання) немає "співавтора" , лише прямий доступ ssh, що надається репо.

53
GitHub підтримує як відкриті ключі рівня облікового запису , так і ключі рівня проекту (вони ж - ключі розгортання). Не дозволяти повторне використання ключів рівня облікового запису має сенс, але я стверджую, що не дозволяти це для ключів розгортання цього не робить. Мій єдиний ключ рівня облікового запису дозволяє отримати доступ до всіх моїх проектів, так чому б я не міг мати ключ розгортання, який дозволяє отримати доступ до деяких моїх проектів? Це лише більш обмежувально і не створює жодного занепокоєння, яке я бачу. Ваша стурбованість відкриттям можливості для двох різних користувачів використовувати один і той же ключ ssh не відображається у цьому сценарії.
Девід Еббо,

@DavidEbbo Це може не відображатися на зображенні, але це занепокоєння (два різні користувачі мають один і той же ключ ssh) є основною причиною того, чому ключ ssh не використовується.
VonC

21
Боюсь, що я не слідую вашим міркуванням тут. Я запитую про дуже конкретний сценарій (використовуйте ключ розгортання в декількох проектах), і ваш аргумент, що це неможливо, - це підняття не пов’язаного між собою сценарію (двоє користувачів, що використовують спільні ключі ssh). Дотримуючись виключно сценарію розгортання ключа, що буде негативним, якщо github це дозволить?
Девід Еббо,

6
@DavidEbbo Дотримуючись help.github.com/articles/managing-deploy-keys , жоден із трьох методів (Облікові записи, Розгортання або Машинні облікові записи) не передбачає спільний доступ до приватного ключа SSH для доступу до вказаних репо. Дотримання виключно сценарію розгортання ключа, оскільки він є ключем на сервері , для того, щоб він був дійсним на декількох репозиторіях, це означало б спільне використання (або реплікацію) приватного ключа на декількох репо. Це зменшує аспект автентифікації, і якщо ключ порушений, збільшується кількість виставлених репо.
VonC

8
дякую, на цій сторінці є цікава інформація. Я позначу вашу відповідь як відповідь через день-два, якщо я не бачу нічого іншого, хоча, чесно кажучи, я все ще не переконаний аргументом. Наявність ключа розгортання, що використовується на двох репозиторіях, не є слабшим, ніж використання машинного ключа, який має доступ до того самого набору репозиторіїв.
Девід Еббо,

11

На жаль, це сценарій, коли github просто неправильно інтерпретує різницю між парою ключів та рахунком або проектом.

Оскільки пара ключів використовується для автентифікації та авторизації, це фактично ідентичність. Облікові записи Github - це ще одна ідентичність. Підключення облікових записів github до пар ключів ефективно встановлює співвідношення 1: N між ідентифікаціями, заснованими на облікових записах github, та ідентифікаторами пар ключів.

І навпаки, github застосовує 1: N відображення проектів до ідентифікацій на основі пар ключів. Реальний аналог світу полягає в тому, що є двері, що забезпечують доступ до проекту, яку можуть відкрити багато різних людей. Але як тільки хтось із них отримає ключ від дверей, вони не зможуть отримати будь-які інші ключі від будь-яких інших дверей, ніколи більше.

Є сенс не повторно використовувати ключі часто з точки зору, що містять порушення, якщо ключ стає скомпрометованим. Але це лише хороша адміністративна політика . Не має сенсу перешкоджати використанню ключа в принципі більше одного разу . Що є деякі ключі для деяких дверей, які ніколи не використовуються повторно, ну, знову ж таки, це залежить від політики .


Трохи складніший погляд полягає в тому, щоб проілюструвати пари ключів як ролі . Ви можете володіти багатьма парами ключів, а отже, жити в багатьох ролях. Приватний ключ автентифікує вас на роль.

Зіставлення ключів розгортання Github у проектах свідчить, що роль ніколи не може охоплювати більше одного завдання. Це рідко реалістично.

Звичайно, жодне з них не змінює того, що дозволяє github.


1
Хе. Дуже дивно, як це стає проти, коли це правильніше прийнятої відповіді. У цьому буквально немає нічого, що заважає ділитися ключем із кількома користувачами.
Йенс Фінкхейзер,

2

Мені знадобилося багато роздумів, щоб обґрунтувати наслідки, і я придумав такий сценарій.

Уявіть, що ви створюєте єдиний ключ розгортання для користувача, якого ви призначили кільком сховищам. Тепер ви хочете відкликати цей ключ, але він використовується в кількох місцях. Отже, замість можливості скасувати весь доступ, ви ненавмисно можете скасувати лише частковий доступ.

Це може звучати як вигода, але ці стосунки багато до одного насправді є невпевненими в собі, коли врахувати людський фактор. Це пов’язано з тим, що ви не можете точно знати, чи дійсно ви скасували весь доступ, не перевіривши кожне сховище, і порівняти кожен відкритий ключ окремо у тому випадку, якщо ви забули, де ви насправді його призначили.

Безумовно, викликає розчарування призначення та керування такою кількістю унікальних ключів, але наслідки для безпеки зрозумілі з того, як GitHub запровадив свою політику: коли ви відкликаєте ключ, ви гарантовано скасуєте весь доступ, наданий цим ключем, оскільки він використовується лише в одному місці .


1
Мене це переконання не переконує. Чим це принципово відрізняється від дозволу одному користувачеві доступу до декількох сховищ, що очевидно дозволено? Якщо ви більше не довіряєте цьому користувачеві, вам потрібно буде видалити його з кожного репо.
Девід Еббо,

@David: How is that fundamentally different from allowing one user to access multiple repositories, which is obviously allowedЧи можете ви пояснити це далі? У мене є лише обліковий запис розробника, і я бачу, що ви можете додати ключі ssh для доступу до всього облікового запису (один ключ для всіх сховищ) або додати окремі ключі розгортання (по одному ключу для кожного сховища). Це як і раніше відносини "один до багатьох" або "один до одного", коли відміна ключа "один" у обох випадках скасовує доступ "усіх".
Жро

Для подальшого уточнення, немає можливості (що я можу сказати) випадково призначити ключ у відносинах "багато-до-одного", де доступ може існувати деінде після скасування. Здається, це мотивація GitHub для цього обмеження, але я лише здогадуюсь.
Жро

Як я дивлюся на речі, ключі розгортання трохи нагадують "анонімних користувачів", які не мають повного облікового запису, але все ж представляють якусь ідентичність. Різниця полягає в тому, що у випадку з обліковим записом ви надаєте доступ до облікового запису, який побічно надає доступ до всіх ключів ssh у цьому обліковому записі. Перебуваючи у випадку розгортання ключа, ви пропускаєте абстракцію облікового запису і безпосередньо надаєте доступ до ключа ssh. Але крім цього, я не бачу, щоб потреби в безпеці були іншими. Якщо Обліковий запис АБО власник ключа розгортання стає злим, вам потрібно видалити їх із кожного репо.
Девід Еббо,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.