Веб сервер lamp linux

И снова о… LAMP и базово защищённый мини-хостинг своими руками

Увидев в очередной раз презренный посыл в Google в ответ на вопрос о том, как развернуть собственную LAMP’у, решил написать данный пост. Чтобы хоть как-то разбавить тонны радостных отчётов об успешной установке из блогов, суть которых сводится к одной команде aptitude install blah-blah.

Нет, ну конечно понятно, PHP самый надёжный язык, а все движки сайтов, на нём написанные, являются живым воплощением непробиваемой защиты от взлома. Тогда да — aptitude install apache2 — и будет вам счастье. Не забудьте оставить phpmyadmin по дефолтному адресу, да поставьте какое-нибудь дырявое FTP решето.

Вообще, как оказалось, многие даже не в курсе, что взломав сайт и получив возможность исполнять свой PHP код, злоумышленник на системе с дефотными настройками сможет как минимум прочитать в вашей системе почти что угодно. Оно и понятно — работая с Linux привыкаешь как-то, что по дефолту безопасность находится на вполне достаточном уровне. А тут такая дыра…

В общем — в этой статье в очередной раз описывается банальщина на тему как развернуть LAMP и дать доступ внешним пользователям к файлам и базам ваших сайтов. Т.е. как быстро сделать мини-хостинг своими руками. Однако, в отличие от, хостинг у нас будет хотя бы базово защищённым.

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

И нет, это не ещё одна статья с описанием установки Linux и выполнением aptitude install apache2. Скорее наоборот: в этой статье я хотел показать фатальную недостаточность данных манипуляций и мягко говоря некомпетентность тех, кто их тиражирует в интернете.

Установка

Всё будет описано на примере Debian.

Для начала нужно установить всё необходимое (кстати, для Ubuntu phpMyAdmin лучше ставить из PPA):

При установке phpMyAdmin генерируем произвольный пароль для подключения к БД, в остальном всё очевидно.

Как это будет работать

Все пользователи, которым нужно получить доступ к файлам на сервере, будут иметь локальную учётную запись с возможностью захода только по SFTP и только в папку с принадлежащими им сайтами. При этом будет поддерживаться авторизация как по паролю, так и по ключу. Интерактивный же вход по SSH будет невозможен, хотя если очень надо — его можно будет включить, причём тоже с закрытым доступом к системным файлам.

Никакого FTP не будет, хотя его и возможно легко прикрутить. SFTP надёжней (шифрование, возможность авторизации по ключу), а FTP в данном случае элементарно избыточен и является достаточно большой потенциальной дырой в безопасности.

Каждый сайт будет принадлежать некоему ‘аккаунту’, т.е. под одним ‘аккаунтом’ может быть несколько сайтов. К этим ‘аккаунтам’ привязываются SFTP пользователи, причём никто не мешает к одному ‘аккаунту’ привязать несколько пользователей. Дальше, внутри ‘аккаунта’, всё можно будет разрулить стандартными механизмами прав доступа в Linux.

Пользователи и пароли от БД никак не будут зависеть от системных пользователей, управление БД будет происходить через стандартный phpMyAdmin.

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

Немного подробней про структуру

Все сайты будут лежать в каталогах вида /var/www/ACCOUNT/sites/SITENAME. ACCOUNT тут не обязательно означает какого-то системного пользователя, просто некий произвольный идентификатор.

У системных пользователей, которые будут подключаться по SFTP для редактирования сайтов, в качестве домашней директории будет установлено /var/www/ACCOUNT/home/USERNAME. Соответственно в зависимости от значения ACCOUNT тот или иной пользователь будет иметь доступ к тому или иному аккаунту. Создание каталога home внутри аккаунта нужно для того, чтобы иметь возможность авторизовывать SFTP пользователей по ключам.

Читайте также:  Как выключить компьютер по таймеру windows 10 командная

Для всех пользователей SFTP основной группой будет установлена www-data (дефолтная группа Apache2 в deb-based). Кроме этого, все создаваемые как пользователем по SFTP, так и Apache, файлы по умолчанию будут иметь права 0660, а каталоги — 0770. Поскольку у Apache и SFTP пользователя одна и та же группа, то по-умолчанию в любой новый файл или каталог сможет писать как пользователь, так и веб-сервер, вне зависимости от того, кто его создал. Что обычно и требуется.

Базы же будут использовать свой, полностью отдельный механизм авторизации и контроля доступа. Тут всё крайне просто: создаём пользователей и даём им права только на конкретные базы. Поэтому к этому вопросу возвращаться больше не будем.

Создание ‘аккаунтов’ и системных пользователей

Размещение сайта на сервере стоит начать с подготовки места под него и создания пользователя для работы с ним. Как описано выше, для сайта нам нужна папка вида /var/www/ACCOUNT/. В качестве ACCOUNT задействуем для примера 42. Просто 42. Ок, создаём папку:

Кроме этого внутри аккаунта нам нужны каталоги home/USERNAME и sites. Создаём их:

Для будущей настройки SFTP сразу стоит убедиться, что и /var/www/42/sites, и все нижестоящие папки принадлежат root:root и ни у кого, кроме root, нет прав на запись в них.

Дальше создаём пользователя. Чтобы не путаться с обычными, полноценными пользователями сервера, SFTP пользователей можно перенести в диапазон UID от 901 до 999. Если вам это не надо — уберите соотв. параметры. Если вы хотите авторизовываться только по ключу, то добавьте параметр —disabled-password. В итоге команда такая:

Установка шелла в /bin/false гарантирует нам, что пользователь никак не сможет интерактивно зайти в систему.

Настройка SFTP

Настройка SFTP будет заключаться в том, что для всех членов группы www-data мы сделаем так, чтобы при заходе по SFTP они попадали сразу в папку sites ‘аккаунта’, в котором находится их HOME директория, без возможности выбраться выше по дереву каталогов.

Делается это просто. Достаточно в конец файла /etc/ssh/sshd_config дописать код

И ткнуть sshd для обновления конфигурации:

Этот кусочек кода для всех пользователей из группы www-data, во-первых, отключает TCP и X11 форвадинг (им незачем иметь доступ в вашу локалку). Во-вторых делает для них при заходе chroot в sites папку их ‘аккаунта’ (именно для этого нам нужно было делать sites папки доступными для записи только для root — иначе не работает chroot). Ну и в третьих меняет им обработчик SFTP на встроенный (которому не нужно полноценное окружение с шеллом и прочим), попутно говоря ему создавать все файлы и папки со значение umask в 007. То есть права по умолчанию на новые файлы будут 0660, а на каталоги — 0770.

Настройка Apache и phpMyAdmin

Как-либо специфично настраивать Apache для обеспечения базовой работы не нужно. Единственное, что в Debian пакет PHP5 идёт с интегрированным патчем Suhosin, повышающим безопасность. Он будет необходим при настройке конфигов сайта, хотя вполне можно обойтись и без него.

А так в целом для Apache нужно лишь изменить umask для создаваемых файлов и папок на такой же, который мы использовали для настройки SFTP. Делается это путём добавления в /etc/apache2/envvars строчек:

Для минимальной настройки phpMyAdmin нужно лишь поменять адрес, по которому он будет доступен, с неприлично бестолкового your.site/phpmyadmin на что-то другое. Для этого в файле /etc/phpmyadmin/apache.conf нужно заменить строчку

Не забывайте перезапускать Apache:

Добавление сайтов

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

Для размещения файлов нужно из-под root создать каталог сайта в папке нужного ‘аккаунта’. Например:

Дальше выставить желаемые права. Как минимум у SFTP пользователя, который будет работать с этим каталогом, должны быть права на запись. К примеру, можно сделать так:

Читайте также:  Windows cannot repair this computer automatically что это

Ок, теперь пользователь может зайти и залить файлы сайта. Осталось настроить апач. Для этого, как всегда, создаём файл настроек в директории /etc/apache2/sites-available. Содержимое этого файла для сайта deep-thought.net с данными в каталоге /var/www/42/sites/deep-thought.net должно быть примерно таким:

Важным тут является только содержимое блока . В нём находятся настройки PHP, которые во-первых, запрещают обращение к файлам вне корневой директории сайта (open_basedir и перенос в temp), во-вторых отключают две крайне опасные возможности PHP (allow_url_include, enable_dl), которые всё ещё присутствую в современных версиях PHP и даже могут быть включены. И наконец в-третьих, запрещают PHP скриптам использовать целый ряд функций взаимодействия с ОС. Например, функций исполнения произвольной команды. Список функций честно выцеплен откуда-то из интернета и не претендует на всеобщий охват, хотя вроде бы является достаточным для обеспечения безопасности.

Немного про temp: поскольку мы запрещаем PHP обращаться к файлам вне корневой директории сайта, то нам нужно указать каталог для сохранения временных файлов (файлов, загружаемых пользователями сайта на сервер через стандартный механизм загрузки из HTML формы) и файлов сессий внутри корня сайта. Каталог этот нужно, естественно, предварительно создать. Кроме этого лучше бы явно закрыть к нему доступ из интернета, что и сделано во втором блоке Directory. Иначе кто-нибудь может невзначай получить сессии ваших пользователей.

Если на сервере не установлен Suhosin, то вместо suhosin.executor.func.blacklist можно использовать стандартную опцию PHP disable_functions. Правда её нужно указывать в php.ini, т.е. она будет действовать на все сайты на вашем сервере.

Кроме этого в приведённых выше настройках не отключена функция eval. Увы, многим сайтам она зачем-то нужна, хотя всё же лучше её отключать. Обратите внимание на опции suhosin.executor.disable_eval и suhosin.executor.disable_emodifier всё того же Suhosin.

После того, как вы подготовите нужный вам конфиг, просто активируйте сайт:

И не забудьте пнуть апач:

Ну и конечно нужно залить файлы и базу данных сайта на сервер — без них вряд ли что-то заработает.

Тюнинг SSH: ключи и интерактивный вход

Для доступа пользователей SFTP по ключам нужно сделать всё тоже, что делается всегда: внутри HOME каталога создать директорию .ssh/, в ней файлик authorized_keys, в который прописать публичный ключи для пользователя.

Кроме этого, можно некоторым пользователям открыть интерактивный доступ на сервер. Для этого нужно, во-первых, подготовить в корневой папке соответствующего ‘аккаунта’ нужное chroot окружение, как минимум с интерпретатором и всеми необходимыми виртуальными ФС. Делается это стандартно и ничего сложно в этом нет.

Дальше можно создать дополнительную группу для интерактивного входа. Например, ssh-interactive:

Добавить в неё нужных пользователей, попутно сменив им SHELL на полноценный bash:

И прописать для этой группы специфические настройки в sshd_config. Для этого нужно модифицировать директиву Match, относящейся к www-data, дописав к ней !ssh-interactive, дабы она не распространялась на пользователей этой группы:

И после неё добавить ещё одну директиву Match:

Проблема только в том, что для членов группы ssh-interactive umask больше не будет выставляться в 007. Исправить это можно дописав соответствующий параметр в глобальных настройках подсистемы sftp в sshd_config. Кстати, вряд ли вы захотите перетаскивать компоненты openssh в chroot окружение, так что можно заодно сменить внешний обработчик sftp на внутреннюю реализацию:

В заключение

Меня всегда интересовал вопрос — а нет ли где-нибудь на официальных ресурсах полного списка с описанием всех PHP функций, которые так или иначе могут дать доступ скрипту к компонентам и файлам системы. Приведённый выше список честно взят из интернета, так что если кто поделится ссылочкой на списочек функций — буду премного благодарен.

Ну и да — если есть какие-то комментарии по поводу того, что ещё минимально можно сделать для обеспечения безопасной работы простейшего хостинга — пишите.

Источник

Веб сервер lamp linux

Каждый начинающий веб-разработчик однажды сталкивается с необходимостью самостоятельно установить и настроить LAMP. Сегодня я расскажу, как это сделать.

Читайте также:  Calendars readdle для windows

Данная статья описана для Ubuntu 16.04 и выше.

Но прежде, чем переходить к самому руководству, давайте расшифруем эту аббревиатуру.

Linux – здесь все понятно. Данная статья предполагает, что ваша операционная система уже установлена и настроена. В данной статье будет использоваться ОС Ubuntu 16.10.

Apache – собственно веб-сервер. Отвечает за получение и обработку запросов пользователей, но умеет гораздо больше.

MySQL – одна из самых распространенных систем управления базами данных. Строго говоря, вывести заветный «Hello World» с помощью PHP можно и без этого компонента. Тем не менее, он необходим как для популярных CMS вроде WordPress, Joomla и Drupal, так и для самописных систем.

PHP – один из самых популярных языков программирования. На PHP написана серверная часть подавляющего большинства сайтов в мире.

Установка Apache, MySQL и PHP.

Установить вышеперечисленный набор можно как с помощью графического интерфейса, так и через командную строку. Мы рассмотрим второй вариант, как более универсальный.

в этой статье рассматривается установка и настройка сервера для локального использования. Подготовка площадки для размещения сайта, доступного извне, потребует более серьезной настройки.

Обновим список доступных пакетов:

После этого установим Apache:

Пакетный менеджер отыщет необходимые зависимости и попросит подтвердить согласие на установку. Вводим Y, жмем Enter, дожидаемся завершения установки.

Проверяем работу Apache, введя в адресной строке браузера следующий адрес:

Если вы увидите страницу, изображенную ниже – значит, сервер работает как надо.

При получении сообщения об ошибке не спешите расстраиваться, скорее всего, Apache не запустился автоматически. Сделайте это вручную:

После чего обновите страницу.

Устанавливаем сервер MySQL:

Снова подтверждаем согласие и через несколько секунд получаем предложение установить пароль.

Выполнив требуемое, дожидаемся окончания и вводим следующую команду:

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

Для более простой и наглядной работы с базами данных рекомендую установить phpmyadmin. Но прежде не помешает убедиться, что сервер MySQL запущен:

Нас интересует строка Active. Если она сообщает нам, что сервер активен, как на скриншоте, расположенном ниже – все прекрасно.

В противном случае выполним команду

Теперь можно устанавливать phpmyadmin:

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

После перезапускаем Apache командой:

phpmyadmin будет доступен по адресу http://localhost/phpmyadmin

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

Корневым каталогом сервера является /var/www/html. Здесь находится тот самый документ, который мы видим, переходя по адресу http://localhost. Удаляем его и создаем файл index.php со следующим содержимым:

Сохраняем, снова переходим по тому же адресу и наблюдаем результат – страница с информацией о конфигурации PHP. Здесь можно найти сведения об установленных модулях, настройках и многом другом.

Мы можем разместить в каталоге /var/www/html свою папку и получить доступ к ее содержимому, прибавив к адресу слеш и ее название. Например, распаковав дистрибутив WordPress в /var/www/html/ мы найдем установочный скрипт по адресу:

После выполнения вышеуказанных действий сервер уже должен быть готов для локального использования. Конфигурационные файлы, созданные при установке, содержат наиболее разумные и подходящие большинству настройки. Но иногда их все же требуется изменить.

Основной конфигурационный файл Apache называется apache2.conf и находится в /etc/apache2. Перед каждой директивой в этом файле расположен комментарий, поясняющий ее суть. Строки, начинающиеся со знака «#», считаются комментариями и не влияют на работу сервера.

Основной конфигурационный файл PHP лежит в /etc/php/7.0/apache2 и называется php.ini. Здесь в качестве символа комментария используется «;». Не забудьте сделать резервные копии файлов перед тем, как вносить в них изменения. После правки и сохранения конфига сервер нужно перезапустить командой:

В следующих статьях мы еще вернемся к конфигурационным файлам и настройке веб-сервера.

Источник

Оцените статью