Лучшие практики безопасности

37

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

Вопрос 1: контрольная машина

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

Если лучше всего использовать мой ноутбук (который, конечно, может быть украден, но мои публичные ключи можно безопасно хранить в Интернете в облаке или в автономном режиме на переносном зашифрованном устройстве), что если мне нужно использовать некоторые веб-интерфейсы с Ansible, например, Ansible Tower, Semaphore, Rundeck или Foreman, который необходимо установить на централизованном компьютере в центре обработки данных? Как обезопасить его и не стать «единой точкой атаки»?

Вопрос 2: ключи SSH

Предположим, что мне нужно использовать Ansible для выполнения некоторых задач, которые должны выполняться пользователем root (например, установка пакетов программного обеспечения или что-то в этом роде). Я думаю, что лучше всего не использовать пользователя root на управляемых серверах, а добавить обычного пользователя для Ansible с разрешениями sudo. Но, если Ansible нужно выполнять почти все задачи, ему нужен доступ ко всем командам через sudo. Итак, что является лучшим выбором:

  • разрешить Ansible использовать пользователя root (открытый ключ которого сохранен в ~/.ssh/authorized_keys
  • создать непривилегированного пользователя, выделенного для Ansible с доступом sudo
  • разрешить пользователю Ansible запускать все команды через sudo с указанием пароля (уникальность которого должна знать каждый системный администратор, использующий Ansible для управления этими серверами)
  • разрешить пользователю Ansible запускать все команды через sudo без указания пароля
  • какие-нибудь другие намеки?
Мат
источник
Вы хотите выделенную подсеть управления (или VLAN). Ваш компьютер управления ANSIBLE находится в этой подсети. Если вам нужно связаться с управляющим компьютером, вы подключитесь к VPN в этой подсети. Не позволяйте ansible быть корнем
Нил Макгиган
1
Хост управления Ansible будет находиться во внутренней локальной сети и не будет доступен снаружи, но я думаю, что этого недостаточно.
Мат

Ответы:

15

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

Ваш ноутбук - наименее безопасное устройство из всех. Одна глупая почта, одна глупая уязвимость флэш-памяти, один тупой гость Wifi, и он становится pwned.

Для серверов вообще не разрешайте root-доступ через ssh. Многие ревизии смеются над этим.

Что касается ansible, пусть каждый администратор использует свою личную учетную запись на каждом целевом сервере и разрешит им sudo с паролями. Таким образом, пароль не передается между двумя людьми. Вы можете проверить, кто что делал на каждом сервере. Это зависит от вас, если личные учетные записи разрешают вход в систему с паролем, только с помощью ключа ssh или требуют оба.

Для уточнения ansible не требуется использовать одно целевое имя для входа . Каждый администратор может и должен иметь персональное целевое имя для входа.

Примечание: старайтесь никогда не создавать учетную запись, называемую каким-либо словом (например, «ansible», «admin», «cluster», «management» или «operator»), если у нее есть пароль. Единственное хорошее имя для учетной записи, которая имеет пароль, - это имя человека, например «jkowalski». Только человек может нести ответственность за действия, совершаемые через учетную запись, и нести ответственность за ненадлежащую защиту своего пароля, «отвечать» не может.

kubanczyk
источник
Спасибо, вы убедили меня в использовании централизованного бастионного хоста в отдельной подсети в центре обработки данных. Я также знаю, что лучше использовать одного персонального пользователя на каждого системного администратора, но теперь у меня есть другой вопрос (возможно, это будет лучше для отдельного вопроса Serverfault): как централизовать пользователей и ключи SSH на хостах Linux без использования NIS, NFS делится или как то так? Обратите внимание, что у меня уже есть Active Directory для серверов Windows.
Мат
Хорошо, лучше подумать на мой вопрос. У меня есть два возможных ответа: использовать хранилище ключей LDAP или Userify (см. Два ответа ниже). Но ... мне это действительно нужно? Нет, если я использую своего собственного пользователя для развертывания новых пользователей и ключей через сам Ansible! :-)
Мат
@ Мат, полностью согласен - как я сказал ниже, вам действительно не нужен Userify или любой другой подобный инструмент, пока ваша команда не станет больше. (Тем не менее, это делает его намного приятнее.) Установка LDAP довольно трудна (исследуйте pam_ldap и nss_ldap), но мы встроили инструменты для интеграции за считанные секунды с Ansible, Chef, Puppet и т. Д. Кроме того, он бесплатный для <20 серверов.
Джеймисон Беккер
16

> Вопрос 1: контрольная машина

В Userify (полное раскрытие информации: на самом деле мы предлагаем программное обеспечение для управления ключами SSH), мы постоянно занимаемся этим, поскольку у нас также есть крупнейшее хранилище ключей SSH. Как правило, мы рекомендуем локальную установку, а не использование облака, поскольку вы повысили уровень контроля, сократили площадь поверхности, и вы можете заблокировать ее только для известных доверенных сетей.

Важно помнить, что в правильно построенной системе, подобной этой, действительно не должно быть никаких существенных секретов, которые могли бы быть переданы злоумышленнику. Если кто-то загонит вилочный погрузчик в ваш центр обработки данных и уйдет с вашим сервером, он не получит много, за исключением некоторых сильно хешированных паролей, возможно, некоторых сильно зашифрованных файлов и некоторых открытых ключей без соответствующих закрытых ключей. Другими словами, не так много.

Как вы указали, настоящие векторы угроз - это то, что происходит, если злоумышленник получает контроль над этой машиной и использует ее для развертывания своих собственных учетных записей пользователей и (открытых) ключей. Это риск практически для любой облачной платформы (например, Linode). Вы должны быть наиболее сосредоточены на предотвращении доступа к плоскости управления, что означает минимизацию поверхности атаки (обнажая только несколько портов и максимально блокируя эти порты) и предпочтительно используя программное обеспечение, защищенное от повышения привилегий и различных атак ( SQL-инъекция, XSS, CSRF и т. Д.) Включите доступ 2FA / MFA к плоскости управления и сконцентрируйтесь на максимально возможной блокировке этой плоскости управления.

Так лучше ли иметь отдельный компьютер управления в центре обработки данных или удаленный компьютер управления (например, мой ноутбук, удаленно подключенный к центру обработки данных)?

Это , безусловно , лучше иметь специальный контрольный аппарат в безопасном центре обработки данных, потому что вы можете изолировать его и заблокировать его , чтобы предотвратить / минимизировать риск кражи или несанкционированного доступа.

Если лучше всего использовать мой ноутбук (который, конечно, может быть украден, но мои публичные ключи можно безопасно хранить в Интернете в облаке или в автономном режиме на переносном зашифрованном устройстве), что если мне нужно использовать некоторые веб-интерфейсы с Ansible, например, Ansible Tower, Semaphore, Rundeck или Foreman, который необходимо установить на централизованном компьютере в центре обработки данных?

Вам не нужно запускать ЛЮБОЙ веб-интерфейс или вторичную плоскость управления для управления вашими ключами (даже Userify) до тех пор, пока вы не станете достаточно большими, чтобы начать заниматься проблемами управления из-за большего числа пользователей и разных уровней авторизации на серверах или необходимости дополнительной рука для ваших пользователей, которые могут не иметь знаний или доступа к Ansible для обновления ключей. Сначала Userify был не чем иным, как набором сценариев оболочки (сегодня они, вероятно, были бы Ansible, вероятно!), И в этом нет ничего плохого, пока вы не начнете нуждаться в дополнительном контроле управления и простых способах управления / поворота своих людей. собственные ключи. (Конечно, пожалуйста, посмотрите на Userify, если вы дойдете до этого!)

Как обезопасить его и не стать «единой точкой атаки»?

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

1. Разработайте свое решение с самого начала с точки зрения безопасности. Выберите технологию (например, базу данных или языки), в которой традиционно было меньше проблем, а затем создайте код с безопасностью на виду. Очистите все входящие данные, даже от доверенных пользователей. Паранойя это добродетель.

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

3. Сохраняйте это простым. Не делайте последние экзотические вещи, если вы не уверены, что это измеримо и доказуемо повысит вашу безопасность. Например, мы выбрали X25519 / NaCl (libsodium) вместо AES для нашего уровня шифрования (мы шифруем все, в покое и в движении), потому что он был изначально разработан и написан кем-то, кому мы доверяли (DJB и др.), И был рассмотрен в мире известные исследователи, такие как Шнайер и служба безопасности Google. Используйте вещи, которые стремятся к простоте, если они новее, поскольку простота затрудняет сокрытие глубоких ошибок.

4. Соответствовать стандартам безопасности. Даже если вы не попадаете в режим безопасности, такой как PCI или HIPAA Security Rule, прочитайте эти стандарты и выясните, как им соответствовать или, по крайней мере, очень строгие компенсационные меры. Это поможет вам убедиться, что вы действительно соответствуете «лучшим практикам».

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


Вопрос 2: ключи SSH. Каков наилучший выбор: разрешите Ansible использовать пользователя root (с сохраненным в нем открытым ключом ~/.ssh/authorized_keys/ разрешите пользователю Ansible запускать все команды через sudo с указанием пароля (уникальный номер должен знать каждый системный администратор) который использует Ansible для управления этими серверами)

Старайтесь никогда не использовать пароли на серверах, даже для sudo. Это имеет дело с секретами и в конечном итоге подорвет вашу безопасность (вы действительно не можете легко изменить этот пароль sudo между компьютерами, вам нужно где-то его хранить, пароль означает, что вы не можете на самом деле автоматизировать сервер-сервер, что именно то, о чем идет речь. Кроме того, если вы оставите SSH по умолчанию, эти пароли могут быть взломаны, что делает ключи несколько бессмысленными. Кроме того, избегайте использования пользователя root для каких-либо целей, особенно для удаленного входа в систему.

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

В точку. Непривилегированный пользователь, которого вы можете проверить обратно в ansible с помощью ролей sudo. В идеале, создать стандартного пользователя, предназначенного для межсерверной / ансильной связи с доступом sudo (без пароля).

... NB. Если бы вы использовали Userify, я бы предложил создать пользователя Userify для ansible (вы также можете разбить его по проектам или даже по группе серверов, если у вас есть несколько компьютеров управления 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: аутентификация

Я не уверен, насколько "конкретные" конкретные рекомендации отличаются от любых других рекомендаций по ssh-соединениям. Но нет, вы хотите запускать ansible как вы сами, а не учетную запись службы и не учетную запись root.

Сочетание следующих аутентификаций:

Другие мысли:

  • Всегда храните секреты / личную информацию в хранилище ansible.
  • Ansible не требует запуска SUDO / Root, если только то, что вы делаете, не требует sudo / root.
  • Ansible может повысить права доступа различными способами.

Наконец, вы ничего не упомянули об окнах. Поэтому я могу только предположить, что вы этим не пользуетесь. Однако в этом случае я бы использовал опцию делегата, чтобы ваш ноутбук использовал хост-бастион ( bastion.hostname.fqdnDelegate_to:) и https Kerberos / winrm с билетами Kerberos.

В случае, если вы пропустили это, лучшая практика для вычислений, никогда не делайте ничего как root, всегда используйте именованные учетные записи

Джейкоб Эванс
источник