Конечно, если доступ к сайту нужен только разработчику, лучше при создании пользователя (см. вторую часть) оставить ему shell и позволить подключаться по scp с именем и паролем основного пользователя сайта. Все равно, скорее всего, ему потребуется пакетный менеджер или composer. Но иногда доступ к сайту нужен и другим людям только для того, чтобы загружать файлы и делать простые правки html. В этом случае лучше разрешить им подключаться по FTP, чтобы можно было не лавать им shell и предоставить доступ только к конкретным директориям.
В качестве FTP-сервера будем использовать proftpd. Для хранения учетных записей пользователей будем использовать тестовый файл.
Установка
apt install proftpd
Файл конфигурации /etc/proftpd/proftpd.conf
В нем можно ничего не трогать, все дополнительные параметры задаем в подключаемом файле. Для это в создадим в директории conf.d файл custom.conf:
nano /etc/proftpd/conf.d/custom.conf
Пишем в него:
UseIPv6 off
ServerName "Debian"
ServerType standalone
TimeoutLogin 30
RootLogin off
UseReverseDNS off
DeleteAbortedStores on
DefaultRoot ~
RequireValidShell off
AuthUserFile /etc/proftpd/ftpd.passwd
PassivePorts 49152 49162
MaxLoginAttempts 5
ExtendedLog /var/log/proftpd/auth.log AUTH #auth
ExtendedLog /var/log/proftpd/access.log WRITE,READ #write
UseFtpUsers on
AllowStoreRestart on
Поясняю основные моменты.
RootLogin - запретить доступ по ftp пользователю root.
UseReverseDNS - определять имя хоста клиента по IP адресу, отключить, нам это не нужно. Можно еще отключить IdentLookups, если она не отключена по умолчанию.
DefaultRoot - домашняя директория пользователя является корнем сервера и пользователь не сможет подняться выше него. Путь к домашенй директории в контексте ftp будет задаваться при создании пользователя.
PassivePorts - диапазон портов в пассивном режиме.
UseFtpUsers - обрабатывать ли сайт ftpusers в котором перечислены пользователи, которым нужно запретить доступ по ftp.
RequireValidShell – авторизовывать клиента только если он имеет основной shell из списка /etc/shells. Отключаем проверку, иначе пользователи без shell не войдут.
AuthUserFile /etc/proftpd/ftpd.passwd - путь к файлу с пользователями.
Проверяем конфигурацию:
proftpd -t
Если ругается warning: unable to determine IP address, то необходимо добавить в hosts IP вашего сервера. Если ругается на отсутствие файла ftpd.passwd, то это нормально.
Теперь создаем пользователя FTP. Для этого сперва узнаем его ID и ID его группы:
id -u demo
id -g demo
Нам нужно, чтобы ftp пользователь имел возможность редактировать и удалять файлы, созданные скриптами.
Создаем нового виртуального ftp-пользователя с логином designer, идентификатором 1000, группой 1000 и домашним каталогом /var/www/test.ru. Здесь 1000 - это ID пользователя и группы, которые мы узнали на предыдущем шаге.
ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=designer --uid=1000 --gid=1000 --home=/home/demo/www --shell=/bin/false
Обратите внимание - в качестве домашней директории ftp (ключ home) здесь указана не домашняя директория владельца сайта (/home/demo), а директория с файлами сайта. Также можно настроить доступ на любую папку внутри сайта.
После выполнения команды система попросит ввести дважды пароль пользователя.
В итоге, у нас появится файл /etc/proftpd/ftp.passwd с записью о пользователе.
Изменить пароль пользователя можно следующей командой:
ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=designer--change-password
Перезапускаем ftp:
/etc/init.d/proftpd restart