Поради щодо забезпечення безпеки LAMP-сервера


Відповіді:


107

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

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

L
Існує маса хороших посібників, які допоможуть вам допомогти. Цей список може чи не допоможе вам залежно від вашого розповсюдження.

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

М

P
Це наштовхується на всю ідею безпечних програм програмування, яка є цілою своєю дисципліною. SANS та OWASP мають смішний обсяг інформації з цього приводу, тому я не намагатимусь повторити її тут. Я зупинюсь на конфігурації виконання та дозволю вашим розробникам хвилюватися про інше. Іноді 'P' у LAMP відноситься до Perl, але зазвичай це PHP. Я припускаю останнє.


1
Я хочу проголосувати цю відповідь принаймні 10 разів.
user58859

10
Безшумний N - За допомогою IPTables або зовнішнього брандмауера блокуйте мережеві з'єднання лише до того, що необхідно для доступу населення.
Метт

Це має бути вікі спільноти
Брайан Адкінс

1
Так легко забути брандмауер. Я чув про когось, хто створив веб-сервер для веб-сайту і навіть зайшов на злом стека TCP / IP, щоб викинути трафік, який не був портом 80. Ще одна річ, яку не помічають - це непотрібні сервіси - якщо це не потрібно щоб увімкнути, вимкніть його.
Аарон Мейсон

4
@AaronMason: Вітаємо! У вас вдалий анекдот. Згадаймо, що твоя конкретна ситуація спрацювала добре, але сподіваємось, майбутні читачі зрозуміють ваше незвичне оточення. У загальному випадку ця порада досить небезпечна.
Скотт Пак

14

Ви задали питання, яке, відверто кажучи, гідне кількох книг на цю тему. Але є деякі загальні основні рекомендації, які добре працюють:

  1. Тримайте оновлення. Це означає ОС, усі сервіси та ОСОБЛИВО всі веб-сайти, які ви працюєте.
  2. Вимкніть будь-які непотрібні сервіси, обмежте необхідні до мінімальної експозиції (якщо ви віддалено не підключаєтесь до MySQL, то не слухайте його на TCP) та запустіть хост-брандмауер. (Якщо це суворо LAMP, ви повинні бути хорошими з 80 і 443, але, можливо, і SSH, а також для адміністрації.))
  3. Використовуйте надійні паролі. А ще краще, якщо ви використовуєте SSH, використовуйте лише auth на основі ключів.
  4. Переконайтеся, що ви не входили як root. Увійдіть як користувачі та використовуйте su & sudo.
  5. Хоча це не робить речі більш безпечними, ви повинні запускати такі інструменти, як logwatch, щоб ви знали, що відбувається на вашому сервері.

Сподіваюся, що допоможе вам розпочати роботу.


1
Я пропоную прочитати "Посібник з безпечної конфігурації Red Hat Enterprise Linux 5", написаний NSA
ALex_hha

1
запізнився на вечірку, але недавно я прочитав, що "не входити в систему як корінь" - це вже не така велика справа, особливо якщо ви використовуєте SSH auth на основі публічних / приватних ключів.
the0ther

8

Ось хороший контрольний список, з якого я люблю починати.

Брандмауер

  • Приємний підхід - не дозволяти починати будь-який трафік, а потім відкривати лише те, що вам потрібно , як вам потрібно. Це призводить до відкриття мінімальних портів / ips для роботи та мінімізації експозиції.
  • Для сервера LAMP вам може знадобитися лише відкривати порти для http / https у світі та ssh для sysadmins.
  • Переконайтеся, що такі речі, як трафік ipv6, заблоковані, якщо не використовуєте його
  • AWS пропонує групи безпеки, linux має iptables, а також безліч пакетів на вибір.

SSH та користувачі

  • Немає пароля для доступу до 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. Хоча затьмарення цієї інформації не є безпекою, багато людей там сканують певні версії іншого програмного забезпечення і чим менше інформації ви вільно видаєте, тим більше зловмиснику доводиться працювати. Це хороший спосіб переконатися, що ви не один із низько висячих фруктів. Звичайно, це нічого не зробить тому, хто хоче витратити трохи більше зусиль, щоб потрапити
  • Обмежте людей, які мають доступ до сервера

5

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

Що це означає: якщо або користувач apache, або користувач MySql піддаються компрометації, вони не можуть заподіяти ніякої шкоди за межами області папок (ів), з яких апаш має доступ (у випадку з користувачем apache) та поза таблицею ( s) / database (s) (у випадку користувача для бази даних MySQL).

Якщо якимось чином користувач MySQL мав би бути поставлений під загрозу, наприклад, він не зміг би отримати доступ до бази даних та скинути всі бази даних з MySQL та зруйнувати всі ваші дані. Вони МОЖУТЬ за деяких обставин мати можливість скидати таблиці або вставляти інформацію в деякі таблиці в ізольованій базі даних, тому важливо надавати доступ до таблиць лише там, де це абсолютно необхідно, і надавати лише необхідні дозволи ... якщо ви цього не зробите ' не потрібно мати привілеї для скидання таблиць або привілеї оновлення, а потім не надавати їх цьому користувачеві.

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

Приклад часу! Я збираюся навести системний приклад, щоб якось спростити ідею.

скажімо, у вас у вашій системі є користувачі (root повинен бути відключений для безпеки через щось на зразок umod -l або passwd -l тощо): Джон, Барні, Теренс та Ліза.

ви можете створити користувача в MySQL з ім'ям bigbird (переконайтеся, що ви використовуєте хешований пароль). Bigbird має лише привілеї вибору та оновлення привілеїв, але не випадати та створювати, і, звичайно, ні . Крім того, ви створюєте іншого адміністративного користувача MySQL з іменем garfield для роботи над базою даних MySQL і ви видаляєте кореневого користувача з бази даних MySQL, щоб його не можна було компрометувати. гарфілд був наданий . привілеї в усьому MySQL (фактично це просто перейменування root).

Тепер ви створюєте або групу apache, або користувача, і ми називаємо її apweb2. Appweb2 не є членом інших груп, і всі файли / папки для apache зберігаються в / home / apweb2 /. Кожен віртуальний хост мав би свою папку, і кожен з цих хостів мав би корінь документа, встановлений для цієї підпапки. Символьні посилання будуть відключені, щоб випадково не забезпечити доступ до решти системи.

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

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

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


3

Я вважаю цей документ від SANS.org справді корисним http://www.sans.org/score/checklists/linuxchecklist.pdf


Ласкаво просимо до помилки сервера! Як правило, нам подобаються відповіді на сайті, щоб мати можливість самостійно стояти - Посилання чудові, але якщо це посилання коли-небудь перерветься, відповідь повинна мати достатньо інформації, яка все-таки буде корисною. Будь ласка, подумайте про редагування своєї відповіді, щоб включити більше деталей Див. Поширені запитання для отримання додаткової інформації.
slm

1

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

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

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