Які найкращі практики управління ключами SSH в команді?


42

Я працюю з невеликими командами (<10) розробників та адміністраторів з такими характеристиками:

  • Більшість членів команди мають> 1 персональний комп'ютер, більшість з яких є портативним
  • Учасники команди мають доступ до 10-50 серверів, як правило, з sudo

Я думаю, що це досить типово для більшості стартапів та корпоративних ІТ-груп середнього та середнього розміру.

Які найкращі практики управління ключами SSH у такій команді?

Чи слід поділитися одним ключем для всієї команди?

Чи повинна кожна людина мати свій ключ на спільному обліковому записі ("ubuntu" на кожному сервері)?

Окремі рахунки?

Чи повинен кожен член команди зберігати окремий ключ для кожного свого ноутбука чи настільного комп’ютера?

Відповіді:


33

У моїй компанії ми використовуємо LDAP, щоб мати послідовний набір облікових записів на всіх машинах, а потім використовуємо інструмент управління конфігурацією (у нашому випадку зараз cfengine) для розподілу authorized_keysфайлів для кожного користувача на всіх серверах. Самі файли ключів зберігаються (разом з іншою інформацією про конфігурацію системи) у сховищі git, щоб ми могли бачити, коли ключі надходять та йдуть. cfengine також поширює sudoersфайл, який контролює, хто має доступ, щоб запустити те, що як root на кожному хості, використовуючи користувачів та групи з каталогу LDAP.

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

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

Host prod-*.example.com
     User jsmith
     ForwardAgent yes
     ProxyCommand ssh -q bastion.example.com "nc %h %p"

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

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

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


Це дійсно гарна відповідь! Наступне запитання: ви використовуєте cfengine для розповсюдження .authorized_keys. Чи вивчали ви будь-який із способів зберігання відкритих ключів SSH на сервері LDAP безпосередньо? В основному вони вимагають виправлення sshd, який відчуває себе крихким.
Еван Продрому

Я щось подібне зробив з шеф-кухарем.
gWaldo

1
@EvanProdromou Я встановив SSH відкриті ключі в LDAP, але це було набагато більше клопоту, ніж це було варто, враховуючи, що мені довелося самостійно підтримувати актуальні пакети SSH, і це було приблизно під час кількох вразливостей SSH
Даніель Лоусон

1
У LDAP також можуть бути розміщені правила судо і ключі SSH, для налаштування цього може використовуватися SSSD. Посилання: sudo.ws/sudoers.ldap.man.html і access.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_Linux / ...
фуерос

Мені подобається твій ProxyCommand ssh -qшматочок! Ніколи цього не бачив. Я не вагаюсь, щоб виставити бастіонний сервер, але якщо він може бути прозорим для кінцевих користувачів, я можу бути для цього всім. Дякую Мартине!
the0ther

6

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

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

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


5

У мене була ситуація, коли мені потрібно було надати SSH ключ доступу для команди з 40 розробників до ~ 120 віддалених серверів клієнтів.

Я контролював доступ, змушуючи розробників з'єднуватися через єдиний "стрибковий хост". З цього хоста я створив приватні / відкриті ключі та висунув їх на сервери клієнтів. Якщо розробникам потрібен доступ з ноутбука, вони могли використовувати ту саму клавішу у своїй локальній системі.


2

Я особисто пішов би з кожним користувачем, тоді ви моментально матимете відповідальність і встановите обмеження набагато простіше - я не знаю, що думають інші?


2

Один із підходів, про який я чув, але не використовувався сам, полягає у тому, щоб кожен користувач мав пакет (наприклад, .deb, .rpm), який містить їх конфігурацію відкритого ключа ssh, а також будь-які точкові файли, які вони хочуть налаштувати (.bashrc , .profile, .vimrc тощо). Це підписується та зберігається у сховищі компанії. Цей пакет також може нести відповідальність за створення облікового запису користувача, або він може доповнювати щось інше, створюючи обліковий запис (cfengine / marpet тощо) або центральну систему аутентифікації, як LDAP.

Потім ці пакунки встановлюються на хости через будь-який механізм, який ви надаєте перевагу (cfengine / marpet тощо, cron task). Один із підходів - це метапакет, який залежить від пакетів для кожного користувача.

Якщо ви хочете видалити відкритий ключ, але не користувача, пакет оновлень для кожного користувача оновлюється. Якщо ви хочете видалити користувача, ви видалите пакунок.

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

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


1

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

Якщо у вас є спільні ключі між користувачами --- навіть якщо ви невелика команда --- відкликання ключа - це незручність для всіх інших.

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


1

Кілька років тому Envy Labs написав інструмент під назвою Keymaster (співпрацював із клієнтом Gatekeeper), щоб обробити щось подібне для команд розвитку.

За останні два роки проект не мав великої любові, але це, ймовірно, щось, з чим ти міг би поцікавитися, а може, повернути до життя?

Репо доступний на веб-сайті github: https://github.com/envylabs/keymaster


-4

Підступ може бути налаштуванням сервера NIS з / домашньою часткою через NFS. Це поєднується з sudo на серверах і дозволяє лише користувачам, яких ви хочете, до кожного сервера через ssh-конфігурацію.

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

З повагою,

Рафаель


1
1) Увімкнення NIS - це отвір для безпеки. 2) Наявність одного пароля та облікового запису суперечить простежуваності та підзвітності.
Мисливець на олень
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.