Відповідальний досвід безпеки


37

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

Питання 1: контрольна машина

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

Якщо найкращою практикою є використання мого ноутбука (який, звичайно, може бути викрадений, але я можу безпечно зберігати свої відкриті ключі в Інтернеті в хмарі чи в автономному режимі на портативному зашифрованому пристрої), що робити, якщо мені потрібно використовувати деякі веб-інтерфейси Відповіді, як Ansible Tower, Semaphore, Rundeck або Foreman, які потрібно встановити на централізовану машину в центр обробки даних? Як убезпечити його та уникнути, щоб він став "єдиною точкою нападу"?

Питання 2: ключі SSH

Припустимо, що мені потрібно використовувати Ansible для виконання деяких завдань, які потребують виконання root (наприклад, встановлення програмних пакетів або щось подібне). Я думаю, що найкраща практика - не використовувати root-користувача на керованих серверах, а додати нормального користувача для Ansible з дозволами sudo. Але якщо Ansible потребує виконання майже кожного завдання, він повинен мати доступ до кожної команди через sudo. Отже, який найкращий вибір:

  • нехай Ansible використовує користувач root (з його відкритим ключем, збереженим у ~/.ssh/authorized_keys
  • створити непривілейованого користувача, призначеного для Ansible з доступом до sudo
  • дозвольте користувачеві Ansible запускати всі команди за допомогою sudo із зазначенням пароля (який унікальний повинен знати кожен sysadmin, який використовує Ansible для управління цими серверами)
  • нехай користувач Ansible запускає всі команди через sudo, не вказуючи пароль
  • будь-які інші підказки?

ви хочете виділити підмережу управління (або VLAN). ваш комп’ютер управління безвідповідності знаходиться в цій підмережі. Якщо вам потрібно зв’язатися з керуючим комп'ютером, ви VPN в цю підмережу. Не дозволяйте ansible бути корінцем
Ніл Макгуйган

1
Хост управління Ansible буде знаходитись у внутрішній локальній мережі та не буде доступний ззовні, але я думаю, що цього недостатньо.
Мат

Відповіді:


15

Хост бастіону (центр управління безвідмовним) належить до окремої підмережі. Він не повинен бути безпосередньо доступний ззовні, він не повинен бути безпосередньо доступний з керованих серверів!

Ваш ноутбук - найменш захищений пристрій з усіх. Одна дурна пошта, одна дурна вразливість спалаху, один дурний гість Wi-Fi, і він стає pwned.

Для серверів взагалі не дозволяйте кореневий доступ через ssh. Багато ревізій насміхаються з цього приводу.

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

Для уточнення ansible не потрібно використовувати єдине цільове ім’я для входу . Кожен адміністратор міг і повинен мати ім’я для входу в особисте цільове.

Побічна примітка: намагайтеся ніколи не створювати обліковий запис, який називається яким-небудь словом (наприклад, "ansible" або "admin" або "cluster" або "management" або "operator"), якщо у нього є пароль. Єдине добре ім’я для облікового запису, який має пароль, - це ім’я людини, як-от "jkowalski". Тільки людина може нести відповідальність за дії, вчинені через обліковий запис і відповідати за неналежне забезпечення свого пароля, "відповідальний" не може.


Дякую, ви переконали мене у використанні централізованого хоста бастіонів в окремій підмережі в центрі обробки даних. Я також усвідомлюю, що найкраще використовувати одного особистого користувача на кожен sysadmin, але тепер у мене є ще одне питання (можливо, це було б краще в окремому питанні Serverfault): як централізувати користувачів та SSH ключі на хостах Linux без використання NIS, NFS акції чи щось подібне? Зверніть увагу, що у мене вже є Active Directory для серверів Windows.
Мат

Гаразд, краще роздумуючи над своїм запитанням, я маю дві можливі відповіді: використовувати сховище ключів LDAP або Userify (див. Дві відповіді нижче). Але ... Мені це справді потрібно? Ні, якщо я використовую власного користувача для розгортання нових користувачів та ключів через сам Ansible! :-)
Мат

@Mat, повністю погоджено - як я вже говорив нижче, вам дійсно не потрібен Userify або будь-який подібний інструмент, поки ваша команда не стане більшою. (Хоча це робить набагато приємніше.) LDAP - це біль для встановлення (дослідження pam_ldap та nss_ldap), але ми вбудували інструменти для інтеграції за лічені секунди з Ansible, Chef, Puppet тощо. Крім того, це безкоштовно для <20 серверів.
Джеймісон Бекер

16

> Питання 1: контрольна машина

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

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

Як ви зазначаєте, реальні вектори загроз тут - це те , що відбувається, якщо зловмисник отримає контроль над цією машиною і використовує її для розгортання власних облікових записів користувачів та (відкритих) ключів. Це ризик практично для кожної хмарної платформи (наприклад: Linode). Вам слід сильніше зосередитись на тому, щоб не допустити доступу до контрольної площини, що означає мінімізацію поверхні атаки (лише оголення декількох портів та максимально фіксацію цих портів) та бажано використовувати програмне забезпечення, яке посилено проти ескалації привілеїв та різних атак ( Введення SQL, XSS, CSRF тощо) Дозвольте 2FA / MFA отримати доступ до контрольної площини та зосередитись на тому, щоб максимально заблокувати цю контрольну площину.

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

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

Якщо найкраща практика використовувати свій ноутбук (який може бути вкрадений, звичайно, але я міг би мати мої відкриті ключі надійно збережені в Інтернеті в хмарі або в автономному режимі на переносному зашифроване пристрій), що , якщо мені потрібно використовувати деякі веби - інтерфейси з Відповіді, як Ansible Tower, Semaphore, Rundeck або Foreman, які потрібно встановити на централізовану машину в центр обробки даних?

Вам не потрібно запускати будь-який веб-інтерфейс або вторинну площину управління, щоб керувати своїми ключами (навіть Userify), поки ви не отримаєте достатньо великих розмірів, щоб почати вступати в проблеми управління через більшу кількість користувачів та різний рівень авторизації на серверах або не потрібні додаткові тримання рук для ваших користувачів, які можуть не мати знань або доступу до Ansible для оновлення ключів. Спочатку Userify був не набагато більше, ніж купа скриптів оболонок (сьогодні, мабуть, вони будуть відповіді!), І в цьому немає нічого поганого, поки ви не почнете потребувати додаткового контролю управління та простих способів управління людьми / поворотом їх власні ключі. (Звичайно, будь ласка, подивіться на Userify, якщо ви дістанетесь до цього моменту!)

Як убезпечити його та уникнути, щоб він став "єдиною точкою нападу"?

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

1. Архітектуйте своє рішення з урахуванням безпеки з самого початку. Виберіть технологію (наприклад, базу даних чи мови), у яких традиційно виникало менше проблем, а потім кодуйте із захистом на очах. Очистити всі вхідні дані, навіть від надійних користувачів. Параноїя - чеснота.

2. Врешті-решт все зламається. Мінімізуйте шкоду, коли це відбувається: як ви вже вказували, намагайтеся мінімізувати поводження з секретними матеріалами.

3. Нехай це буде просто. Не робіть найновіші екзотичні речі, якщо ви не впевнені, що це помітно і доказово підвищить вашу безпеку. Наприклад, ми вибрали X25519 / NaCl (libsodium) над AES для нашого шару шифрування (ми шифруємо все, в спокої та в русі), оскільки він спочатку був розроблений та написаний ким-то, кому ми довіряли (DJB та ін.), І його переглянув світ -відомі дослідники, такі як Schneier та команда безпеки Google. Використовуйте речі, що мають тенденцію до простоти, якщо вони новіші, оскільки простота ускладнює приховування глибоких помилок.

4. Відповідати стандартам безпеки. Навіть якщо ви не потрапляєте в режим безпеки на зразок PCI або правила безпеки HIPAA, ознайомтеся з цими стандартами і з’ясуйте, як їх виконати або, принаймні, дуже сильний компенсаційний контроль. Це допоможе гарантувати, що ви справді зустрічаєтеся з «найкращими методами».

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


Запитання 2: ключі SSH. Найкращий вибір: нехай Ansible використовує кореневий користувач (його відкритий ключ збережений у ~/.ssh/authorized_keys/ дозволь користувачеві Ansible запускати всі команди за допомогою sudo із зазначенням пароля (який унікальний повинен знати кожен sysadmin) який використовує Ansible для управління цими серверами)

Намагайтеся уникати використання паролів на серверах, навіть для sudo. Це стосується таємниць і в кінцевому підсумку підірве вашу безпеку (ви дійсно не можете дуже легко змінювати цей пароль на sudo між машинами, вам доведеться його зберігати десь; пароль означає, що ви не можете дійсно зробити автоматизацію сервер-сервер, яка є про те, про що йдеться. Крім того, якщо ви залишаєте SSH за його типовими налаштуваннями, ці паролі можуть бути жорстокими, що робить ключі дещо безглуздими, а також уникайте використання root користувача з будь-якою метою, а особливо віддаленого входу.

Створіть непривілейованого користувача, призначеного для Ansible з доступом до sudo / дозвольте користувачеві Ansible виконувати всі команди через sudo, не вказуючи пароль

Саме так. Непривілейований користувач, якого ви можете перевірити до ансибілу, з ролями sudo. В ідеалі створіть стандартного користувача, присвяченого комунікації сервер-сервер / ансібіл з доступом до sudo (без пароля).

... Зверніть увагу: якщо ви використовували Userify, я б запропонував зробити це шляхом створення користувача Userify для ansible (ви також можете розбити це за проектом чи навіть групою серверів, якщо у вас є кілька автовідповідальних машин управління), генеруйте ключ SSH на сервері управління та надайте його відкритий ключ на своїй сторінці профілів Userify. (Це текстове поле по суті стає /home/ansible/.ssh/authorized_keys). Вам слід тримати окремий обліковий запис відповідальної системи від інших облікових записів систем-сервер, таких як віддалений обліковий запис резервного копіювання, секретне управління тощо. Потім запросіть людей, і вони також зможуть створювати та керувати власними ключами, і все залишається відокремленим. Але, як і при блокуванні сервера управління Ansible, спробуйте заблокувати сервер Userify (або будь-яке рішення, яке ви розгортаєте) таким же чином.

будь-які інші підказки?

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


5

Відповідь 1: контрольна машина

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

Host private1
  IdentityFile ~/.ssh/rsa_private_key
  ProxyCommand ssh user@bastion -W %h:%p

Host bastion
  IdentityFile ~/.ssh/bastion_rsa_key

Детальніше про бастіонні хости

Там, де у вас є ключ для бастіонного сервера, а потім окремий ключ для хоста за ним. (особисто я використовував би gpg-agent / ssh-agent)

Відповідь 2: Автентифікація

Я не впевнений, чим конкретні найкращі практики "Ansible" відрізняються від будь-яких інших найкращих практик підключення до ssh. Але ні, ви хочете запустити ansible як себе, а не обліковий запис служби та не root.

Поєднання таких автентифікацій:

Інші думки:

  • Завжди зберігайте секрети / приватну інформацію в ansible-treult.
  • Відповідь не вимагає запуску SUDO / Root, якщо тільки те, що ви робите, не вимагає sudo / root.
  • Відповідь може підвищити дозволи на різні способи

Нарешті, ви нічого не згадали про вікна. Тож можу лише припустити, що ви цим не користуєтесь. Однак у цьому випадку я б застосував варіант делегата, щоб ваш ноутбук використовував хост бастіону (delegate_to bastion.hostname.fqdn:) та kerberos / winrm https з kerberos квитками.

Якщо ви пропустили це, найкраща практика для обчислень, ніколи не робіть нічого як root, завжди використовуйте названі акаунти

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.