Debian.pro/

Про Debian


Большой мануал: часть 9. Cоздаём пользователей, группы и структуру каталогов на будущее

Эта статья — часть Большого Мануала по настройке lamp-сервера на debian.

Предыдущая часть цикла — учимся генерировать случайные пароли.

Следующая часть цикла — Cинхронизируем время на сервере.

Сегодня мы будем создавать пользователей в системе, которые позднее будут использоваться для доступа к серверу по ssh/ftp и для редактирования файлов наших сайтов.
Всё происходящее ниже — фундамент безопасности нашего сервера (точнее, сайтов, расположенных на нём, если их несколько).
Мы будем преследовать несколько целей:
1) пользователи не должны иметь возможности подсмотреть файлы друг у друга в домашних каталогах под собой.
2) веб-сервер, запущенный от имени пользователя www-data должен иметь возможность просматривать файлы сайтов, но не должен иметь возможности писать в произвольные файлы в докрутах.
3) работающий chroot по sftp/ftp (chroot для sftp мы уже настроили в статье про openssh-server, а chroot для ftp настроим позднее).
4) если мы запустили сайт от имени пользователя через mpm-itk (такое нужно битриксу, например), то пункт 1 должен соблюдаться.

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

root@server:~# apt-get install apache2 apache2-mpm-itk apache2-utils apache2.2-bin apache2.2-common

Теперь создадим 2 нужные нам группы пользователей:

root@server:~# addgroup secure; addgroup sftponly

Группа secure будет использоваться нами для того, чтобы пользователи не могли смотреть чужие файлы, а группу sftponly мы будем использовать для того, чтобы включать-выключать пользователю chroot в ssh-сервере (и, соответственно, по sftp). Освежите память, прочитайте часть 4 мануала, если не помните о чём я.

Теперь начинаем создавать пользователя. Далее считаем, что пользователя зовут username (заменяйте везде username на желаемое имя пользователя).
Создадим ему домашний каталог (обратите внимание, что домашним каталогом у нас будет /home/username/data, а не /home/username):

root@server:~# mkdir -p /home/username/data

Создадим пользователя:

root@server:~# useradd -d /home/username/data -s /bin/bash username

Добавим его в группу secure, чтобы он не мог попасть в домашний каталог другого пользователя:

root@server:~# usermod -a -G secure username

Пропишем ему пароль:

root@server:~# passwd username

Настроим права и создадим каталог для сайта.
Каталог /home/username должен быть доступен на запись только руту, чтобы работал chroot() в vsftpd и sftp:

root@server:~# chown root:root /home/username
root@server:~# chmod 755 /home/username

Пользователи, состоящие в группе secure, не должны иметь возможности попасть в домашний каталог пользователя, а сам пользователь и пользователи не состоящие в этой группе (в т.ч. и www-data) — должны. При этом сам пользователь в этом каталоге сможет писать, само собой:

root@server:~# chown username:secure /home/username/data
root@server:~# chmod 705 /home/username/data

Создадим каталоги для временных файлов веб-сервера и для докрутов наших сайтов:

root@server:~# mkdir -p /home/username/data/www
root@server:~# mkdir -p /home/username/data/mod-tmp

Все каталоги в домашней директории должны принадлежать нашему пользователю:

root@server:~# chown -R username:username /home/username/data/*

Но tmp каталог должен принадлежать и пользователю, и группе www-data:

root@server:~# chown -R username:www-data /home/username/data/mod-tmp

Ну и под конец запрещаем писать всем, кроме самого пользователя, в каталоги в нашем хомяке:

root@server:~# chmod -R 755 /home/username/data/*

Но разрешаем писать пользователю+группе www-data в каталог mod-tmp:

root@server:~# chmod -R 770 /home/username/data/mod-tmp

Теперь переходим к созданию каталога для нашего будущего сайта. В принципе, пофиг, как назвать этот каталог, но я стараюсь называть их по имени основного домена будущего сайта (пусть будет example.com):

root@server:~# mkdir /home/username/data/www/example.com
root@server:~# chown username:username /home/username/data/www/example.com

Если вы понимаете, что происходит выше — обязательно соблюдайте порядок команд, иначе у вас ничего не выйдет ;)
И последний штрих. Чтобы пользователь не мог зайти по ssh на сервер + чтобы запретить ему выходить за пределы каталога /home/username по sftp/ftp нужно добавить его в группу sftponly:

root@server:~# usermod -a -G sftponly username

Если понадобится снова включить ему ssh, то удалите его из этой группы:

root@server:~# deluser username sftponly

На этом всё.

18.07.2015 byinkvizitor68sl|big-manual

Комментарии (13):

  1. Jarvis :

    Привет.
    > 2) веб-сервер, запущенный от имени пользователя www-data должен иметь возможность просматривать файлы сайтов, но не должен иметь возможности писать в произвольные файлы в докрутах.
    Возможно, вопрос немного нубский, но для OwnCloud или Tiny Tiny RSS такая структура не пойдёт? Сервер, запущенный от пользователя www-data не сможет писать в директорию с сайтом, а там это как раз нужно. Как лучше сделать структуру папок для OwnCloud и Tiny Tiny RSS?

  2. Jarvis :

    Вроде бы разобрался. Не знаю, правильно или нет…
    chown -R username:www-data /home/username/data/www/tt-rss и для owncloud также.

  3. > chown -R username:www-data /home/username/data/www/tt-rss и для owncloud также.

    Это вы зря.
    Нужно выставить chmod 777 именно на те каталоги, куда движку нужно писать из http-рантайма.
    В случае tt-rss это каталоги cache, feed-icons, lock.
    В случае owncloud — только каталог с самими файлами.

    Остальные каталоги лучше чмодить в 777 только на время обновления движка/плагинов.

  4. Jarvis :

    Спасибо. :)

  5. Права на корневой каталог сайта взад вернуть не забудьте.

  6. sh :

    опечятка
    root@server:~# chown 705 /home/username/data

  7. В чём опечатка?

  8. а, понял, поправил

  9. Jarvis :

    inkvizitor68sl, да это тестовый сервер. Но на будущее буду иметь ввиду. Постепенно по вашему большому мануалу планирую научиться настраивать LAMP-сервер. Спасибо за статьи, кстати.

  10. Да не за что.
    Скоро дальше постараюсь начать писать.

  11. Здравствуйте, скажите пожалуйста если использовать nginx + apache2-mpm-itk то не получится использовать несколько версии php? для связки с несколькими версиями нужен fastcgi верно? пытаюсь настроить nginx + fpm, цель невозможность одному пользователю добраться до файлов другого, плюс разные версии пхп как думаете я на верном пути?

  12. > Здравствуйте, скажите пожалуйста если использовать nginx + apache2-mpm-itk то не получится использовать несколько версии php?
    Да.

    > как думаете я на верном пути?
    На верном, но геморройном.

  13. drcrazy :

    В Stretch: apt-get install apache2 libapache2-mpm-itk

Написать комментарий