Назад | Перейти на главную страницу

Советы по защите LAMP-сервера

Это Канонический вопрос о защите стека LAMP

Каковы абсолютные рекомендации по обеспечению безопасности сервера LAMP?

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

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

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

А
Безопасность Apache может быть интересной. Мне легче укрепить ОС и поддерживать удобство использования, чем Apache или PHP.

М

P
Это наталкивается на саму идею безопасного программирования, которая представляет собой целую дисциплину. SANS и OWASP содержат невероятное количество информации по этому вопросу, поэтому я не буду пытаться воспроизводить ее здесь. Я сосредоточусь на настройке среды выполнения, а обо всем остальном позаботятся ваши разработчики. Иногда «P» в LAMP относится к Perl, но обычно к PHP. Я предполагаю последнее.

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

  1. Держите в курсе. Это означает, что ОС, все службы и ОСОБЕННО все веб-приложения, которые вы используете.
  2. Отключите все ненужные службы, ограничьте те, которые необходимы, до минимума (если вы не подключаетесь удаленно к MySQL, не позволяйте ему прослушивать TCP) и запустите брандмауэр на основе хоста. (Если это строго LAMP, вы должны быть хороши с 80 и 443, но, возможно, SSH также для администрирования.))
  3. Используйте надежные пароли. Еще лучше, если вы используете SSH, используйте только аутентификацию на основе ключей.
  4. Убедитесь, что вы не входите в систему как root. Войдите как пользователь и используйте su & sudo.
  5. Хотя это не делает вещи более безопасными, вам следует запускать такие инструменты, как logwatch, чтобы знать, что происходит на вашем сервере.

Надеюсь, это поможет вам начать работу.

Вот хороший контрольный список, с которого мне нравится начинать.

Брандмауэр

  • Хороший подход - не позволять трафику начинать, а затем открывайте только то, что вам нужно, как вам это нужно. Это приводит к открытию минимального количества портов / IP-адресов, чтобы все работало, и это сводит к минимуму вашу уязвимость.
  • Для сервера LAMP вам может потребоваться только открыть порты для http / https для мира и ssh для системных администраторов.
  • Убедитесь, что такие вещи, как трафик ipv6, заблокированы, если он не используется
  • AWS предоставляет группы безопасности, в Linux есть iptables, а также множество пакетов на выбор.

SSH и пользователи

  • Нет пароля для доступа по ssh (используйте закрытый ключ)
  • Не разрешать root для ssh (соответствующие пользователи должны войти по ssh, затем su или sudo)
  • Используйте sudo для пользователей, чтобы команды регистрировались
  • Регистрируйте попытки несанкционированного входа в систему (и подумайте о программном обеспечении для блокировки / запрета пользователей, которые пытаются получить доступ к вашему серверу слишком много раз, например, fail2ban)
  • ssh на нестандартном порте (это может быть полезно, чтобы убедиться, что вы не низко висящие фрукты, и не допускайте большого количества надоедливого трафика, но мало что даст для безопасности, особенно само по себе)
  • заблокируйте ssh только до требуемого диапазона IP (большой диапазон лучше, чем отсутствие диапазона)

База данных

  • Очистить данные пользователя
  • Параметризация запросов
  • Рассмотрите возможность абстрагирования БД на ее собственном компьютере. Это разделение может затруднить злоумышленнику доступ к вашему веб-стеку и наоборот.
  • Как и любой софт быть в курсе является важным.
  • Пользователь для каждой цели. При создании пользователей начинайте без привилегий и добавляйте только тех, которые им необходимы для выполнения своей роли. Наличие отдельных пользователей для разных приложений (или иногда отдельных частей приложений) поможет уменьшить выгоду, которую получает злоумышленник в случае компрометации какой-либо одной учетной записи. Также будьте осторожны с особыми привилегиями, такими как GRANT, которые не следует назначать легкомысленно.
  • Хорошая идея - иметь политику периодической смены паролей. Если вас беспокоит количество требуемых усилий, помните, что лучше реже, чем никогда.
  • Понять шифрование паролей. Солевые пароли. Не используйте md5!

Программное обеспечение

  • Обновляйте программное обеспечение (ОС, веб-сервер, язык сценариев, CMS). Многие люди будут сканировать известные уязвимости в старых (не исправленных) версиях.
  • Удалите все ненужное программное обеспечение (в идеале не храните пакет, необходимый для компиляции программного обеспечения на производственных серверах, лучше предварительно скомпилировать программное обеспечение и сделать его доступным в виде пакета для ваших производственных машин)
  • Убедитесь, что файл разрешения заблокированы (особенно для таких вещей, как загрузки пользователей и файлы конфигурации)
  • Защита паролем админки CMS на уровне веб-сервера (HTTP-аутентификация может сидеть перед уязвимой CMS и помогать блокировать доступ, что является хорошим способом предотвращения атак)
  • Использовать SSL для админки и других конфиденциальных данных
  • Автоматизируйте управление своими серверами и инфраструктурой (что-то вроде Puppet, Chef или SaltStack. Если также используется AWS CloudFormation). Это поможет вам исправить ситуацию на множестве серверов и сократить количество сценариев, таких как исправление разрешений на сервере A, но забвение сделать это на сервере B.
  • По возможности не разглашайте конкретную версию вашей CMS, PHP или WebServer. Хотя сокрытие этой информации не является безопасностью, многие люди сканируют определенные версии различных программ, и чем меньше информации вы предоставляете, тем больше у злоумышленника работы. Это хороший способ убедиться, что вы не один из низко висящих фруктов. Конечно, это ничего не даст тем, кто хочет потратить немного больше усилий, чтобы попасть внутрь.
  • Ограничьте людей, у которых есть доступ к серверу

Добавляя к тому, что предлагает Дэвид, чем более модульная ваша установка, я имею в виду ограничение доступа для определенных пользователей / групп, созданных специально для одной задачи, и ограничение их объема, тем более безопасным будет ваш стек LAMP: Примером этого является наличие пользователя Apache для файлов / папок Apache с соответствующими разрешениями, а не в каких-либо группах, которые могут получить доступ к важным системным файлам / папкам. Пользователь, который может получить доступ к таблицам MySql, связанным с вашими веб-сайтами, которые вы собираетесь обслуживать, и только к этим таблицам. Кроме того, вы можете ограничить их доступ, чтобы предоставить минимальный объем доступа из вызова PHP. Также убедитесь, что имя пользователя MySQL, используемое / предоставляемое через файл PHP, не совпадает с именем пользователя или паролем, используемым для другого пользователя.

Что это означает: если либо пользователь apache, либо пользователь MySql скомпрометированы, они не могут причинить никакого вреда за пределами папки (папок), к которой apache имеет доступ (в случае пользователя apache) и за пределами таблицы ( s) / database (s) (в случае пользователя базы данных MySQL).

Если каким-то образом пользователь MySQL будет скомпрометирован, он не сможет, например, получить доступ к базе данных и удалить все базы данных из MySQL и испортить все ваши данные. Они МОГУТ при некоторых обстоятельствах иметь возможность отбрасывать таблицы или вставлять информацию в некоторые таблицы в изолированной базе данных, поэтому важно предоставлять доступ к таблицам только там, где это абсолютно необходимо, и предоставлять только необходимые разрешения ... если вы этого не сделаете. t должны иметь привилегии отбрасывания таблиц или привилегии обновления, тогда не давайте их этому пользователю.

Кроме того, если по какой-то причине имя пользователя и пароль вашей административной учетной записи обнаружены для MySQL, если вы используете имя пользователя, отличное от любых имен пользователей в вашей системе, они должны сначала взломать безопасность вашей системы, прежде чем проникнуть в вашу базу данных, чтобы нанести ущерб. То же самое касается пользователя apache и доступа к файлам.

Пример время! Я собираюсь привести пример системы, чтобы упростить идею.

скажем, у вас есть пользователи в вашей системе (root должен быть отключен для безопасности с помощью чего-то вроде umod -l или passwd -l и т. д.): john, barney, terence и lisa.

вы можете создать пользователя в MySQL с именем bigbird (убедитесь, что вы используете хешированный пароль). Bigbird имеет только привилегии выбора и обновления, но не удаляет и не создает, и уж точно не . Кроме того, вы создаете другого административного пользователя MySQL с именем garfield для работы с базой данных MySQL и удаляете пользователя root из базы данных MySQL, чтобы его нельзя было скомпримировать. Гарфилд получил . привилегии во всем MySQL (фактически, это просто переименование root).

теперь вы создаете либо группу apache, либо пользователя, и мы назовем его apweb2. Appweb2 не является членом других групп, и все файлы / папки для apache хранятся в / home / apweb2 /. У каждого виртуального хоста будет своя собственная подпапка, и на каждом из этих хостов корень документа будет установлен в эту подпапку. Символьные ссылки будут отключены, чтобы случайно не предоставить доступ к остальной части системы.

Кроме того, вы можете ограничить доступ по ssh только определенным пользователям (или определенным группам, мне нравится помещать их в группу ssh и делать это единственное, что может использовать ssh).

Кроме того, вы можете выбрать, у каких пользователей есть привилегии sudo, чтобы еще больше ограничить работу. Еще один шаг, который вы можете сделать дальше, - это сделать всех пользователей ssh ​​не способными к sudo, вы можете создать специальных пользователей, которые могут использовать sudo, которые не могут использовать ssh, так что после того, как вы войдете ssh, вам нужно будет войти в систему другого пользователя, чтобы иметь доступ к sudo.

Таким образом, модулируя каждый сегмент, если один будет скомпрометирован, весь стек не будет скомпрометирован, и вы сможете решить 1 проблему вместо того, чтобы начинать все заново с нуля.

Я нашел этот документ с SANS.org действительно полезным http://www.sans.org/score/checklists/linuxchecklist.pdf

В настоящее время не стоит пренебрегать виртуализацией контейнеров, а именно Docker, systemd-nspawn и механизмами виртуализации контейнеров, на которых они построены (пространства имен, cgroups). Использование виртуализации контейнеров позволяет изолировать процессы, например, если одна из служб будет скомпрометирована, злоумышленник не получит доступа к другим службам.

В случае с LAMP можно использовать, например, четыре контейнера Docker с SSH-сервером, Apache, MySQL, PHP-FPM / Python / Perl / и т. Д.