Я собираюсь внедрить 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 без указания пароля
- какие-нибудь другие намеки?
Ответы:
Хост бастиона (центр управления ANSIL) принадлежит к отдельной подсети. Он не должен быть напрямую доступен извне, он не должен быть напрямую доступен с управляемых серверов!
Ваш ноутбук - наименее безопасное устройство из всех. Одна глупая почта, одна глупая уязвимость флэш-памяти, один тупой гость Wifi, и он становится pwned.
Для серверов вообще не разрешайте root-доступ через ssh. Многие ревизии смеются над этим.
Что касается ansible, пусть каждый администратор использует свою личную учетную запись на каждом целевом сервере и разрешит им sudo с паролями. Таким образом, пароль не передается между двумя людьми. Вы можете проверить, кто что делал на каждом сервере. Это зависит от вас, если личные учетные записи разрешают вход в систему с паролем, только с помощью ключа ssh или требуют оба.
Для уточнения ansible не требуется использовать одно целевое имя для входа . Каждый администратор может и должен иметь персональное целевое имя для входа.
Примечание: старайтесь никогда не создавать учетную запись, называемую каким-либо словом (например, «ansible», «admin», «cluster», «management» или «operator»), если у нее есть пароль. Единственное хорошее имя для учетной записи, которая имеет пароль, - это имя человека, например «jkowalski». Только человек может нести ответственность за действия, совершаемые через учетную запись, и нести ответственность за ненадлежащую защиту своего пароля, «отвечать» не может.
источник
> Вопрос 1: контрольная машина
В Userify (полное раскрытие информации: на самом деле мы предлагаем программное обеспечение для управления ключами SSH), мы постоянно занимаемся этим, поскольку у нас также есть крупнейшее хранилище ключей SSH. Как правило, мы рекомендуем локальную установку, а не использование облака, поскольку вы повысили уровень контроля, сократили площадь поверхности, и вы можете заблокировать ее только для известных доверенных сетей.
Важно помнить, что в правильно построенной системе, подобной этой, действительно не должно быть никаких существенных секретов, которые могли бы быть переданы злоумышленнику. Если кто-то загонит вилочный погрузчик в ваш центр обработки данных и уйдет с вашим сервером, он не получит много, за исключением некоторых сильно хешированных паролей, возможно, некоторых сильно зашифрованных файлов и некоторых открытых ключей без соответствующих закрытых ключей. Другими словами, не так много.
Как вы указали, настоящие векторы угроз - это то, что происходит, если злоумышленник получает контроль над этой машиной и использует ее для развертывания своих собственных учетных записей пользователей и (открытых) ключей. Это риск практически для любой облачной платформы (например, Linode). Вы должны быть наиболее сосредоточены на предотвращении доступа к плоскости управления, что означает минимизацию поверхности атаки (обнажая только несколько портов и максимально блокируя эти порты) и предпочтительно используя программное обеспечение, защищенное от повышения привилегий и различных атак ( SQL-инъекция, XSS, CSRF и т. Д.) Включите доступ 2FA / MFA к плоскости управления и сконцентрируйтесь на максимально возможной блокировке этой плоскости управления.
Это , безусловно , лучше иметь специальный контрольный аппарат в безопасном центре обработки данных, потому что вы можете изолировать его и заблокировать его , чтобы предотвратить / минимизировать риск кражи или несанкционированного доступа.
Вам не нужно запускать ЛЮБОЙ веб-интерфейс или вторичную плоскость управления для управления вашими ключами (даже Userify) до тех пор, пока вы не станете достаточно большими, чтобы начать заниматься проблемами управления из-за большего числа пользователей и разных уровней авторизации на серверах или необходимости дополнительной рука для ваших пользователей, которые могут не иметь знаний или доступа к Ansible для обновления ключей. Сначала Userify был не чем иным, как набором сценариев оболочки (сегодня они, вероятно, были бы Ansible, вероятно!), И в этом нет ничего плохого, пока вы не начнете нуждаться в дополнительном контроле управления и простых способах управления / поворота своих людей. собственные ключи. (Конечно, пожалуйста, посмотрите на Userify, если вы дойдете до этого!)
Ну, конечно, проверьте все ресурсы в сети для блокировки вещей, но самое главное начните с безопасного основания:
1. Разработайте свое решение с самого начала с точки зрения безопасности. Выберите технологию (например, базу данных или языки), в которой традиционно было меньше проблем, а затем создайте код с безопасностью на виду. Очистите все входящие данные, даже от доверенных пользователей. Паранойя это добродетель.
2. В конце концов, все нарушается. Минимизируйте ущерб, когда это происходит: как вы уже указали, постарайтесь свести к минимуму обращение с секретным материалом.
3. Сохраняйте это простым. Не делайте последние экзотические вещи, если вы не уверены, что это измеримо и доказуемо повысит вашу безопасность. Например, мы выбрали X25519 / NaCl (libsodium) вместо AES для нашего уровня шифрования (мы шифруем все, в покое и в движении), потому что он был изначально разработан и написан кем-то, кому мы доверяли (DJB и др.), И был рассмотрен в мире известные исследователи, такие как Шнайер и служба безопасности Google. Используйте вещи, которые стремятся к простоте, если они новее, поскольку простота затрудняет сокрытие глубоких ошибок.
4. Соответствовать стандартам безопасности. Даже если вы не попадаете в режим безопасности, такой как PCI или HIPAA Security Rule, прочитайте эти стандарты и выясните, как им соответствовать или, по крайней мере, очень строгие компенсационные меры. Это поможет вам убедиться, что вы действительно соответствуете «лучшим практикам».
5. Внедрите внешнее / независимое тестирование на проникновение и запустите множество ошибок, чтобы убедиться, что вы постоянно следуете этим рекомендациям. Все выглядит великолепно, пока вы не заставите некоторых умных и целеустремленных людей постучать в это ... как только вы закончите, вы будете очень уверены в своем решении.
Старайтесь никогда не использовать пароли на серверах, даже для sudo. Это имеет дело с секретами и в конечном итоге подорвет вашу безопасность (вы действительно не можете легко изменить этот пароль sudo между компьютерами, вам нужно где-то его хранить, пароль означает, что вы не можете на самом деле автоматизировать сервер-сервер, что именно то, о чем идет речь. Кроме того, если вы оставите SSH по умолчанию, эти пароли могут быть взломаны, что делает ключи несколько бессмысленными. Кроме того, избегайте использования пользователя root для каких-либо целей, особенно для удаленного входа в систему.
В точку. Непривилегированный пользователь, которого вы можете проверить обратно в ansible с помощью ролей sudo. В идеале, создать стандартного пользователя, предназначенного для межсерверной / ансильной связи с доступом sudo (без пароля).
... NB. Если бы вы использовали Userify, я бы предложил создать пользователя Userify для ansible (вы также можете разбить его по проектам или даже по группе серверов, если у вас есть несколько компьютеров управления ansible), сгенерировать SSH-ключ на управляющем сервере и предоставьте его открытый ключ на странице профиля Userify. (Это текстовое поле по сути становится
/home/ansible/.ssh/authorized_keys
). Вы должны держать ответную системную учетную запись отдельно от других системных серверных учетных записей, таких как удаленная резервная учетная запись, секретное управление и т. Д. Затем пригласите своих людей, и они также смогут создавать свои собственные ключи и управлять ими, и все останется разделенным. Но, как и при блокировке сервера управления Ansible, попробуйте заблокировать сервер Userify (или любое другое решение, которое вы развернете) таким же образом.Я думаю, вы определенно поступите правильно и зададите правильные вопросы. Если вы хотите обсудить подобные вещи, напишите мне (первая точка фамилия на userify), и я был бы рад поболтать, независимо от того, в каком направлении вы в конечном итоге будете следовать. Удачи!
источник
Ответ 1: контрольная машина
Несколько из них, вы можете использовать свой ноутбук для подключения к серверам VIA хост-бастиона. что-то типа:
Больше на бастионных Хозяевах
Где у вас есть ключ для бастионного сервера, а затем отдельный ключ для хоста позади него. (лично я бы использовал gpg-agent / ssh-agent)
Ответ 2: аутентификация
Я не уверен, насколько "конкретные" конкретные рекомендации отличаются от любых других рекомендаций по ssh-соединениям. Но нет, вы хотите запускать ansible как вы сами, а не учетную запись службы и не учетную запись root.
Сочетание следующих аутентификаций:
Другие мысли:
Наконец, вы ничего не упомянули об окнах. Поэтому я могу только предположить, что вы этим не пользуетесь. Однако в этом случае я бы использовал опцию делегата, чтобы ваш ноутбук использовал хост-бастион (
bastion.hostname.fqdn
Delegate_to:) и https Kerberos / winrm с билетами Kerberos.В случае, если вы пропустили это, лучшая практика для вычислений, никогда не делайте ничего как root, всегда используйте именованные учетные записи
источник