Казалось бы, что может быть проще, чем добавить пользователя на сервере? Напечатал в консоли команду adduser, ответил на пару вопросов о пароле и другой информации, и вот, можно заходить с полученным логином и паролем, размещать файлы и т.д.
Затем, вручную, приходится создавать папки. Например, одну для сайта. Другую для временных файлов, чтобы не бросать их в общий /tmp в целях защиты. Ещё одну для сессий, если не настроено кэширование в Redis. А ещё же нужно скопировать нужные файлы настроек, типа публичного ssh ключа для аутентификации.
Всё это становится не слишком удобным процессом, когда пользователей создавать приходится часто, если не постоянно. К счастью, многое мы можем настроить, включая первичные параметры при создании (расположение домашней папки, группу), так и вторичные необходимые папки, файлы настроек.
Первичные настройки, определяемые при использовании команды adduser, берутся из файла /etc/adduser.conf.
Изменяем домашнюю папку
Изначально домашние папки всех пользователей размещаются в разделе /home. Но мы можем заранее переопределить местоположение, используя любую другую папку, например /var/www. Для этого отредактируем параметр DHOME.
DHOME=/var/www
Следует обратить внимание на параметр SKEL=/etc/skel. Он определяет, откуда будут скопированы файлы настроек и папки для каждого конкретного пользователя. Наверняка вы видели в папках пользователей своего сервера файлы .profile, .bashrc. Они как раз скопированы из этого источника. 🙂
Добавление пользователей в единую группу
С параметрами по-умолчанию для каждого пользователя создаётся отдельная одноимённая группа. Но для веб-сервера можно добавлять разных пользователей в одну группу, чтобы лучше управлять политикой безопасности.
Когда создаётся юзер для размещения сайтов, право на редактирование/удаление файлов должно принадлежать только ему. Веб-сервер, будь то nginx или apache, должны запускаться от имени другого пользователя, которому доступно только чтение файлов. Остальные же пользователи никаких прав иметь не должны.
Добавляя всех юзеров в одну группу, мы, затем, можем выставить права для этой группы только на чтение. И запустить веб-сервер от имени этой группы. Всяко лучше, чем добавлять пользователя веб-сервера в группы пользователей, где размещаются сайты.
Общей группой станет группа пользователя www-data. Он специально создан для запуска веб-серверов, имеет максимально ограниченные права и не может пользоваться шелл-ом.
В файле adduser.conf нам нужно сначала отключить создание одноимённой группы при создании пользователя.
USERGROUPS=no
А, затем, указать ID группы www-data.
USERS_GID=33
Как правило, идентификатор равен 33. Но следует перепроверить командой, запускаемой от root: id www-data.
И последний параметр, изменяемый в этом конфигурационном файле:
DIR_MODE=0710
Он определяет права на домашнюю папку пользователя /var/www/username. Тут мы разрешаем все действия владельцу файлов, только исполнение для группы и не даём никаких прав всем остальным.
Права для конкретного пользователя и дополнительные файлы
Теперь нам нужно продолжить выдачу корректных прав, но уже в рамках одного пользователя. Чтобы при создании файлов и папок им сразу присваивались нужные права, отредактируем соответствующим образом параметр umask в файлах .bashrc и .profile.
umask 027
Для папок эти права будут интерпретированы как 0750, что разрешает любые действия с файлами для владельца, чтение и исполнение для группы.
А для файлов 0640: чтение/изменение для владельца и только чтение для группы. Рекомендую самостоятельно изучить статью о правах доступа в Linux.
Также не забываем в каталоге /etc/skel обновить права на существующие файлы и папки командой chmod.
В завершение создаём дополнительные папки: для сайтов, временных файлов, сессий и т.д. Файл authorized_keys с вашим публичным ключом к ssh нужно расположить в папке .ssh пользователя. В итоге структура будет выглядеть примерно так:
/etc/skel -.ssh/ —authorized_keys -sessions/ -tmp/ -www/ -.bashrc -.profile
Всё это будет скопировано в домашний каталог пользователя при его создании.