Управління SSH-ключами для команди: Ansible, Vault, ротація

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

Чому керування SSH-ключами ламається при зростанні команди

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

Далі керування SSH-ключами перетворюється на ручний ритуал. Неконтрольована видача доступів іде через чат: публічний ключ вставляють у конфіг вручну, звільнений співробітник залишається у списку, бо його рядок ніхто не видалив.

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

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

Аудит доступу до серверів у такій схемі неможливий — немає джерела правди, за яким видно, у кого доступ є, навіщо він виданий і ким підтверджений.

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

Розбираємо, як пов'язати видачі з ролями інженерів, винести публічні ключі в керований реєстр і зробити ротацію плановою — на Ansible і Vault.

Що дає єдиний контур видачі та відкликання доступів

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

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

Контур тримає опис доступів: хто отримав, на які хости, до якої дати. Видача зводиться до однієї команди — роль Ansible розкладає публічну частину по цільових машинах і прибирає ручні правки на серверах.

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

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

Вікно доступу підрядника задається заздалегідь і закривається само собою за календарем, а не за чиїмось листом «ми закінчили». Строк життя ключа прив'язаний до завдання: закінчився — доступ перестав працювати на всьому парку, включно з машинами, про які ніхто не згадав.

Так іде цілий клас відмов доступів — «висячі» ключі звільнених і підрядників, копії приватних ключів, доступ, що залишився після зміни ролі. Частка ручних операцій на доступ скорочується до одиниць замість десятка кроків: інженер описує намір, а не править файли на серверах.

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

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

Варіант Коли підходить Обмеження
Файли authorized_keys на серверах Парк із кількох машин, команда до п'яти осіб Ключі розповзаються копіями, відкликання — обхід усіх хостів вручну
Єдине сховище секретів Потрібне одне джерело правди та журнал, хто що отримав На серверах залишаються ті самі статичні ключі, ротація — окреме завдання
Роздача через засоби керування конфігурацією Парк уже описаний декларативно, склад хостів відомий Секрет проходить через репозиторій або змінні, потрібен захист самих описів
Короткоживучі сертифікати Команда зростає, доступ видається на години й під завдання Потрібен довірений центр сертифікації та його перевірка в момент підключення

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

На практиці варіанти комбінують: сховище та засоби керування конфігурацією закривають видачу, сертифікати — строк життя доступу.

Етапи впровадження: від інвентаризації до передачі

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

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

  1. Інвентаризація доступів. Збираємо всі точки входу: authorized_keys на серверах, ключі в конфігураціях розгортання, на машинах інженерів і в системах збірки. У кожного визначаємо власника, призначення та дату останнього входу — що не підтверджується активністю, іде на виведення.

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

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

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

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

  6. Передача регламенту експлуатації. Віддаємо команді життєвий цикл доступу: як запросити, видати й відкликати, хто відповідає, як розбирати інциденти. Періодичні перевірки фіксуємо окремо — інакше схема деградує назад за пару місяців.

Шаблони ролей, політик доступу та регламентів ротації

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

  • Опис ролей і груп доступу: власник сервісу, черговий, читач логів — з прив'язкою до конкретних вузлів і рівнів прав, а не абстрактне «адмін / не адмін».
  • Політики доступу: кому й на який строк видається ключ, що вважається відхиленням від шаблону, хто підтверджує виняток і як воно фіксується.
  • Конфігурації випуску ключів: ролі автоматизації та шаблони, які створюють пару, розкладають публічну частину по потрібних вузлах і не дають розійтися правам на файли й каталоги.
  • Регламент ротації: строк життя ключа для кожного класу доступу, порядок планової заміни, вікна, у яких заміна не ламає викладку, і правила позапланового відкликання.
  • Інструкція для команди: покрокові сценарії — підключити нового інженера, відкликати доступ при звільненні, діяти при підозрі на компрометацію ключа.
  • Схема видачі та відкликання: шлях від заявки до появи публічного ключа на вузлах і до запису в журналі — щоб кожну дію можна було перевірити постфактум.
  • Чек-ліст приймання та звітність: які події фіксуються, як переконатися, що зайвих доступів не залишилося, і за якими перевірками ви приймаєте контур без нашої участі.

Кейс: вікно доступу скоротилося з тижнів до хвилин

До нас прийшла продуктова команда із 40 інженерів: доступ до серверів видавався вручну, а ключі жили в листуванні, особистих сховищах і на старих робочих машинах. Єдиного реєстру не було, тому при звільненні ніхто не міг сказати, скільки копій ключа залишилося в природі. Новий співробітник чекав на доступ кілька днів — іноді тиждень, якщо погоджувач був у від'їзді.

Спочатку ми зібрали інвентар: пройшли по серверах, зіставили відкриті ключі з людьми й побачили, що на одного інженера припадає 6–8 копій.

Далі завели єдиний реєстр доступу та перевели видачу на автоматичні сценарії Ansible — ключ створюється під конкретну людину, отримує строк дії, а закрита частина не покидає його робочу машину.

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

Метрики до та після

Підключення нового інженера скоротилося з 3–5 робочих днів до 15–20 хвилин разом із перевіркою прав. Закриття доступу після відходу — з кількох тижнів до однієї команди: ключ відкликається з реєстру й перестає працювати на всіх вузлах одразу. Кількість копій ключів на людину впала з 6–8 до однієї.

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

Що робити, якщо ключі вже роздані по серверах і людях?

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

Починається все зі збору фактів, а не з генерації нових ключів. Із журналів входів вивантажується зв'язка «відбиток — обліковий запис — сервер — дата останнього успішного входу».

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

Шлях міграції Коли підходить Обмеження
Паралельний доступ із вікном Простій критичний, контур великий Потрібна жорстка дата закриття, інакше перехідний період триває безстроково
Поетапно, групами серверів Парк розбитий за середовищами та ролями Без реєстру ролей губиться, хто куди ходив
Відключення за розкладом Невеликий контур або підозра на компрометацію Найвищий ризик простою, потрібен черговий і швидкий відкат

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

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

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

Метрики перехідного періоду — частка входів за новими ключами, кількість залишених старих і дата примусового відключення.

Технічні сумніви: сумісність, відкат і аудит

Централізований випуск ключів не вимагає оновлювати парк цілком за один день.

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

Обов'язкова умова одна: керований доступ на запис до конфігурації sshd і запис кожної зміни в журнал.

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

Чи працюватиме схема на старих серверах?

Так. Для вузлів, де конфігурацію змінювати не можна, роль Ansible розкладає ключ із міткою власника та строком дії — за міткою потім видно, чий доступ лежить на хості й коли спливає.

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

Що відбувається при збої та як виглядає відкат?

Перед зміною знімається копія поточних файлів і конфігурації, стан хоста береться з інвентарю, а не з ручних правок. Відкат — перезаливка попередньої версії та повторна звірка: хвилини замість ручного обходу.

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

Як підтверджується, що доступ справді відкликано?

Не вивантаженням із панелі, а перевіркою на самих хостах: звірка вмісту authorized_keys і активних сертифікатів з актуальним списком. Звіт показує, де ключ ще приймається; кожне розходження — завдання з відповідальним і строком.

Як розділяється доступ підрядників?

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

Обговоримо завдання та повернемося з оцінкою й планом

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

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

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

Опишіть завдання — повернемося з оцінкою обсягу робіт і планом впровадження.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1393
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1368
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    815
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1139