Комментарии 100
Отключение рута это сомнительная тема применяемая в экзотических кейсах, когда есть несколько равноправных администраторов на один сервер с разными учётками и нужно отслеживать кто что делает.
Добавление ещё одного администратора не сломает схему администрирования. Удобно, и ничего не стоит. Нужно просто заблокировать root.
Хотя бы чтобы самому случайно не накосячить случайно. С точки зрения безопасности по дефолту получается два фактора: ключ и пароль пользователя для sudo. И даже три, если и ключ зашифрован
А если ключ утек, то вышеописанные меры — это просто небольшое препятствие.
Ну не такое уж небольшое, если для sudo пароль нужен и к его вібору серьёзно отнеслись. Вроде как в Linux, например, не было простого способа получить пароль, кроме как серьёзного брутфорса. В Windows был — точно помню пароль делился на две части и каждую можно было брутфорсить отдельно :)
сороктысячобезьян не такой уж сверхсложный )
Linux — ОС для админовЕсть мнение, что разрабатывали программисты для программистов.
Если нужно разграничить права доступа — есть Docker, виртуалки, доступ через Веб-интерфейс и подобные технологии.Для разграничения прав доступа применяется дискреционная или мандатная система разграничения прав доступа. Виртуализация, контейнеризация это немного про другое.
Для разграничения прав доступа применяется дискреционная или мандатная система разграничения прав доступа. Виртуализация, контейнеризация это немного про другое.
Вот понимания этого мне всегда не хватало. Наверное потому, что всегда самостоятельно возился со своими серверами. И именно поэтому контейнеризация как бальзам на душу, поскольку позволяет многое выбросить из головы и начинать с чистого листа с правами root.
Смена порта — сканером легко определить список открытых портов. Тогда, какой смысл в этом действии?
В общем как то про безопасность все как то спорно все.
"задаем пароль в 40 символов"
А вводить его как? Нужен ssh клиент с менеджером паролей. Тогда как с ключом работать умеют все.
Менеджер паролей с настройкой сценариев вполне подойдет.
KeePass тот же: вызывает ssh-клиента по клику в парольнице и заполняет все поля сам. Только предварительно нужно сценарий настроить в конкретной записи.
И вот у меня вопрос: а как безопаснее, хранить ключ на диске или хранить пароль длинный в зашифрованном виде в менеджере паролей?
КМК похитить ключ с диска проще, чем похитить файл парольницы и как то его расшифровать.
Или нет?
По сути получается примерно одинаково.
Разница только в том, что публичный ключ он как раз-таки «публичный».
Его можно отдавать кому угодно.
Если стоит задача предоставить удаленный доступ, то администратору сервера нужно только взять ваш публичный ключ и прописать его в authorized_keys нужного пользователя. А современных реалиях это чаще делается автоматически, например при создании виртуальных машин или аренде выделенных серверов.
Гораздо проще скриптом (системой конфигурирования) раскидывать публичный ключ, чем обеспечивать безопасность даже временных паролей.
Более того, невозможно проконтролировать хороший (длинный) ли пароль сделал себе пользователь или нет. Это хорошо, если пароль в 40 символов. Но он может оказаться и 123456. А ключи они уже достаточно длинные.
А если нет — то ключи удобнее. Как минимум раскидывать публичный ключ по серверам безопаснее при автоматизации, чем управлять паролями.
Смена порта — от тупых ботов, чтобы уменьшить спам в syslog, про безопасность речи не идет.
Как вы просите админов других серверов создавать вам аккаунт на их серверах с доступом по ssh? Что делаете, чтобы иметь доступ к одному аккаунту с нескольких девайсов, рабочего и домашнего, например?
Ключ в клиенте сохраняется точно также. Но помимо всего прочего ключ можно безопасно передавать и хранить стандартными способами. А ещё иногда к ssh приходится подключаться не ssh-клиентом, а через тоннель, например в закрытую сеть. Тогда отдельно заходим по ssh на торчащий наружу комп, а потом внутри приватной сети ходим по ключам на локальные сервера.
Просто с ключами — более стандартный и заведомо безопасный подход. С сорокасимвольными паролями — выглядит как велосипед. Пароль задумывался под ручной ввод, и менеджеры паролей — это своеобразный костыль. Ключи задумывались под автоматическое использование из коробки, и их для такой цели использовать правильнее.
Но я не понимаю, в свою очередь, зачем предлагается fail2ban, если аутентификация по паролю отключается.
Сканером да, но много "инструментов" которые сканят заданный список портов. И вот тут измененный порт даст возможность уменьшить вероятность взлома через стандартный порт.
Речь шла про масс-скан в котором обычно сканят определенный список портов.
Вот в таком случае перенос дефолтного порта — это неплохая идея.
Сам Fail2Ban в настройке то ещё удовольствие, не говоря уже о дополнительной нагрузке на систему.
Белые списки — да, безопаснее, но не гибко. Что если будет какая-то проблема с сетевой инфраструктурой в конторе, из которой велось управление серверами?
Port Knocking — это тоже не про безопасность (Security Through Obscurity), как и перенос ssh на нестандартный номер порта, а скорее про уменьшение нагрузки на сеть от атакующих ботов.
Нерутовый юзерНачали хорошо. Но зачем ему давать привилегии sudo? Нужен пример? Пожалуйста: через уязвимости злоумышленник получил возможность удалённого выполнения кода от нашего нерутового пользователя. Хорошо, если он просто начал запускать свой скрипт, хотя хорошего в этом мало. Но он может пойти дальше и устроить локальный брутфорс пароля нерутового пользователя. Если у него получится его раздобыть, то дальше у него полностью развязываются руки.
Ключи вместо паролей SSHДельное предложение. Только лучше использовать более продвинутый вариант с ключом на основе эллиптических кривых
ssh-keygen -t ed25519 -C "<comment>"
Fail2BanНе помню, чтобы он особенно помогал при атаках. Да, блокирует адреса при некоторых атаках, только при этом может отнять порядочное количество ресурсов, что его эффективность становится под вопросом. При неумелом использовании может вообще заблокировать систему от любого внешнего трафика и тогда начинается уже отдельное веселье.
Автоматические обновления безопасностиВообще это правильно называется автоматическая установка обновлений. И не всегда эти обновления связаны с безопасностью и не всегда обновления не приносят новых уязвимостей. Некоторые обновления могут приводить к перезапуску того или иного сервиса, а ещё могут вызывать конфликты с другими приложениями. С этим надо быть осторожней.
Смена портов по умолчаниюПомогает от тупых ботов, но есть продвинутые, которые, находя открытый порт, начинают проверять его на те или иные ответы. Поэтому лучше использовать более продвинутые методы защиты.
Авторизация по ключам + port knocking, и вы уже отгородились от большинства атак.
Хотите закрыть доступ? Ставьте fail2ban или ограничивайте доступ по IP. Возьмите себе простую VPS для постоянного IP. Поставьте openvpn и используйте.
Вариант с VPN может оказаться гораздо опасней, чем без неё, если это первая VPN для человека которому поручили её поднять.
Вот (https://github.com/angristan/openvpn-install) автоматизированный скрипт, чтобы поднять openvpn на сервере. Давайте по пунктам, какие опасности могут быть?
автоматизированный скрипт
Универсальное != безопасное. ИМХО.
Скрипт автоматизирует установку пакета, и генерацию конфига — который вы сами также бы сделали (или хуже).
Тогда давайте говорить, что универсальный nginx != безопасно. Надо свой
Что именно не безопасно? Давайте по пунктам.1 Совсем не обязательно вести атаку на целевой сервис и заниматься его компроментацией. Можно пойти с другой стороны и устроить DOS стороннего сервиса. Что у OpenVPN защитой от атак на отказ в обслуживании?
2 Не стоит думать, что OpenVPN безгрешен и не содержит уязвимостей.
3 Есть другой неприятный момент. Он не частый, но бывали случаи и люди на нём накалывались: некоторые провайдеры непонятно по какой такой блажи блокируют этот тоннель. Поэтому есть мануалы, как закосить под HTTPS, работая по OpenVPN.
Ещё надо иметь в виду, что некоторые провайдеры последней мили блокируют в своих сетях практически весь трафик UPD (сталкивался неоднократно). В настройках скрипта по умолчанию как раз идёт UDP. Но это не замечание, а просто личный опыт.
Любые могут быть при запуске башскрипта на 1500 строк с рутовыми правами. Если вы можете этот скрипт проверить на безопасность, то вы и, скорее всего, руками можете безопасно openvpn поднять. А если не можете...
Или вы полностью просмотрели код linux/nginx/sshd/etc и уверены, что там все безопасно?
Я доверяю авторам и используемым распространителям такого софта типа Canonical, но вот на творчество french software engineering student я бы критическую для компании инфраструктуру завязывать не стал.
Что критическое для компании? Я предложил использовать openvpn для доступа по ssh, если нет постоянного IP. А IP VPN прописать в белый список, кто может стучаться к порту.
Где проблема с безопасностью? Или вы думаете, что «french software engineering student» что-то внес в свой openvpn скрипт, что может перехватить зашифрованные данные между вашим ПК и сервером? Даже если на VPN есть вредоносный код, то он максимум что может, это стучать на открытый для этого IP порт и все. логин/пароль/ключ/… надо все равно где-то найти…
«Я доверяю авторам и используемым распространителям такого софта типа Canonical»… Пару лет назад уже было, что зайти под рутом, можно зажав какие-то клавиши… Дыры и вредонос может быть везде. Точно ли пакет собран из тех исходников, что вам показывают — вы не знаете, и никогда не узнаете.
Где проблема с безопасностью?
Она же одним интерфейсом будет смотреть в защищенный периметр, нет? Или я вашу идею как-то не так понял?
Про нерутового юзера не очень понял. sudo без ограничений — согласен, плохо. Вы об этом?
Атака скорее будет на повышение привилегий, чем на локальный брут, который по идее по логам детектится. Ну и если делать с норм политикой пароля, брут будет дооолгий. А если совсем убезопаситься, то можно второй фактор сделать, аля yubikey.
Можно подробнее про автообновление? Я в том плане, что Ваш комментарий скорее про администрирование, чем безопасность. Новые уязвимости в патчах — горькая правда жизни, но всяко лучше оставления известных дыр.
ИМХО, порты нет особого смысла менять, безопасность через незнание.
это же очевидно: если учётная запись админа будет скомпроментирована, злоумышленник сразу получит полный доступ ко всему.
в случае же пароля на sudo ему придётся ещё подобрать этот пароль.
использовать или нет — решать вам, на моих серверах в основном sudo без пароля.
Если учетная запись админа скомпрометирована на сервере, то просто отсылаем его пароль на сервер злоумышленника.
получить пароль — не такая уж тривиальная задача.
Даже не пароль, а приватный ключ, так как в нормальной конфигурации, доступ к учетной записи возможен только по ключу. Остается только дикий вариант с открытым терминалом, оставленным в кафе, пока админ пошел отлить.
а в чём принципиальная разница между «злоумышленник получил приватный ключ админа» и «злоумышленник сел за незаблокированный ноут админ»?
и там, и там у злоумышленника есть доступ в шелл с правами того админа.
sudo -i
запросит пароль, получить который ещё надо суметь.
alias sudo='sudo -A /tmp/askpass'
Далее, пароль наверняка не qwerty01, а посложнее. Значит, каждый раз пользователь его вводить не будет. sudo будет кэшировать введенный пароль и запрашивать снова только после определенного таймаута. По умолчанию это 5 минут.
Тогда сам пароль и не очень нужен. Просто подождем повышения привилегий и воспользуемся.
export PS1="\$(sudo -n whoami 2>/dev/null)$PS1"
Далее, если вы администрируете что-то серьезное, скорее всего, у вас целая инфраструктура имеется, серверов несколько, они бэкапятся, есть эталонный образ, из которого создаются новые сервера. Если вы пользуетесь паролями, то хэш вашего пароля очень много где будет лежать. Кто-то может получить доступ не к целевому серверу, а к какому-нибудь бэкапу, найти там /etc/shadow и начать его брутить на своих ресурсах.
Если же вы никогда не используете пароли, то можете образ своего сервера хоть в интернет выкладывать. Злоумышленники ничего полезного для взлома получить оттуда не смогут.
Пара вопросов.Более чем исчерпывающе ответили тут
От души благодарен за такой развёрнутый и понятный ответ.
Теперь вам расскажу более жуткую страшилку. Привилегированные доступы к системе сильно не нужны. Иногда совсем. Что мы обычно имеем на рабочем сервере? Процесс или несколько целевых процессов работающих в сеансе некого пользователя (не могу подобрать подходящего слова, буду благодарен, если поправите мою мысль более точно). Получая доступ к этому пространству, получаете доступ ко всем переменным, объявленных в нём (команда printenv). А что у нас там? Там обычно параметры подключения к базе данных, хранилищам, сторонним сервисам и многое к чему.
Дальше не хочется фантазировать.
Вообще это правильно называется автоматическая установка обновлений. И не всегда эти обновления связаны с безопасностью
ну вот как раз имеет смысл автоматически устанавливать только обновления связанные с безопасностью. и то не на всех серверах, некоторые этого могут и не пережить. современные пакетные менеджеры это позволют.
ведь эти обновления надо тестировать в рамках общего flow в компании.
Как и супер-длинный пароль.
А когда работа усложняется, пользователи ее упрощают(пишут пароль на бумажку, к примеру).
Класический пример убунту, где рут заблочен по умолчанию и есть пользователь с теми же по факту правами. Ну он просто называется ubuntu. Ага, ботнеты не вкурсе.
Ключи ок, все остальное — в топку.
Fail2ban надо понимать, как и firewall. На практике нормально работает только whitelist firewall с современными ботами. В эпоху ботнетов с сотнятми тысяч адресов fail2ban только им помогает.
fail2ban — тоже ни к чему, взломщикам он не помешает, а хозяевам сервера создаст неудобства. По логам видно, что ботнеты специально не заходят с одного и того же IP в течение нескольких месяцев. Блокируй его или не блокируй — ничего это не даст.
Я считаю, что у пользователей вообще не должно быть паролей, никаких.
passwd -l %username%
Вход только по ключам. sudo без пароля.
Странно, что никто не предложил selinux включить. А это как раз та штука, которая позволит предотвратить взлом через торчащий наружу сервис.
Сначала setenforce 0.
Потом все ставишь, запускаешь.
Недельку поработал.
sudo cat /var/log/audit/audit.log | audit2allow -M myselinux
sudo semodule -i myselinux.pp
setenforce 1
Все.
Кстати sudo без пароля я бы сделал при условии наличия пасса на ключе. Тогда и утеря ключа не так критична.
А наличие пасса на клиентском ключе разве можно проконтролировать на сервере?
alias sudo='sudo -A /tmp/askpass'
Но способов на самом деле много.
Позволяет дела много интересных вещей (несколько пользователей root с разными возможностями). Только утилитой audit2allow надо пользоваться с осторожностью, и внимательно изучать политику, которую она выдаёт. Там иногда бывают просто феерические права доступа.
fail2ban — тоже ни к чему, взломщикам он не помешает, а хозяевам сервера создаст неудобства
Какие неудобства имеются в виду? Я вижу разве что выяснение отношений «кто ввёл неправильный пароль эн раз подряд из нашего офиса» при более одного админа сервера.
Защита Linux-сервера. Что сделать в первую очередь