LINUX.ORG.RU

chroot dir Смотри в конфиге vsftpd.conf

chroot_local_user=YES
local_root=/ftphome/$USER
user_sub_token=$USER

А так же:

usermod --home /var/www/ username

А так же, при создании пользователя в качестве шелла указать:

/sbin/nologin
yakunin ()

А проще всего дать ему этот каталог будет через mount --bind.

ValdikSS ★★★★★ ()
Ответ на: комментарий от yakunin

Каталог к которому давать доступ и он же будет домашним, я так понял тут указывать?

local_root=/ftphome/$USER
Подскажите пожалуйста, что означает следующая строка:
user_sub_token=$USER
И не совсем понял, мне нужно предварительно создавать виртуальных пользователей? Я создал пользователя через adduser. Но законектиться не удается, FTP клиент пишет Login Incorrect.

sergey_mo ()
Ответ на: комментарий от sergey_mo

Я делаю вот так:

добавляем юзера

useradd  -U -s /usr/sbin/nologin ftp_user
задаем ему пароль
passwd ftp_user
добавляем его в группу www-data
usermod -a -G ftp_user www-data
добавляем /usr/sbin/nologin в список шеллов
nano /etc/shells
устанавливаем утилиты для работы с базами в формате Berkeley
apt-get install db5.1-util
создаем папку для файлов со списком ftp юзеров
mkdir /etc/vsftpd
создаем текстовый файл со списком юзеров и забиваем туда ftp_user (каждый юзер на отдельной строчке)
nano /etc/vsftpd/vsftpdusers
ограничиваем права к этому файлику
chmod 0600 /etc/vsftpd/vsftpdusers
создаем базу ftp юзеров из текстового файла (после каждого изменения /etc/vsftpd/vsftpdusers нужно пересоздавать базу этой же командой)
db5.1_load -T -t hash -f /etc/vsftpd/vsftpdusers /etc/vsftpd/users.db
создаем файл политики для в vsftpd в /etc/pam.d/
nano /etc/pam.d/vsftpd.virtual
с содержимым
auth       required     pam_userdb.so db=/etc/vsftpd/users
account    required     pam_userdb.so db=/etc/vsftpd/users
session    required     pam_loginuid.so
создаем папку для папок ftp юзеров, к примеру, /var/vftp_users
mkdir /var/vftp_users
создаем симлинк на необходимую для доступа папку в /var/vftp_users с именем юзера
ln -s /путь/до/папки /var/vftp_users/ftp_user
конфиг vsftpd.conf
listen=YES
#listen_ipv6=YES
local_enable=YES
write_enable=YES
#local_umask=022
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
#chown_uploads=YES
#chown_username=whoever
#xferlog_file=/var/log/vsftpd.log
#xferlog_std_format=YES
#idle_session_timeout=600
#data_connection_timeout=120
#nopriv_user=ftpsecure
#async_abor_enable=YES
#ascii_upload_enable=YES
#ascii_download_enable=YES
#deny_email_enable=YES
#banned_email_file=/etc/vsftpd.banned_emails
chroot_local_user=YES
#chroot_list_enable=YES
#chroot_list_file=/etc/vsftpd.chroot_list
#ls_recurse_enable=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
#rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
#rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
#ssl_enable=NO
rsa_cert_file=/etc/ssl/private/vsftpd.pem
force_dot_files=YES
user_sub_token=$USER
local_root=/var/vftp_users/$USER
hide_ids=YES
guest_enable=YES
guest_username=www-data
virtual_use_local_privs=YES
pasv_enable=Yes
pasv_max_port=65535
pasv_min_port=32768
allow_writeable_chroot=YES
где user_sub_token - опция для автоматического создания домашней директории каждому виртуальному пользователю
local_root - рабочая директория для юзеров.

Перезапускаем vsftpd и логинимся под ftp_user. Для удаления доступа можно просто удалить симлинк в /var/vftp_users/, а для смены рабочей папки на другую удаляем существующий симлинк и создаем новый уже на другую папку.

Скорее всего не совсем верно, но работает)

zevilz ★★★ ()
Ответ на: комментарий от zevilz

Вроде бы сделал, но посоле подключения клиента по FTP у меня открывается каталог указанный в local_root= и доступ есть только к этому каталогу. Нужно чтобы открывалась одна из папок из каталога /var/www/. Где указывать эту папку, которая должна открываться сразу после подключения и чтобы доступ был только к этой папке?

sergey_mo ()
Ответ на: комментарий от sergey_mo

А $USER не забыл добавить в local_root?

local_root=/var/vftp_users/$USER
Папку не нужно нигде указывать. В local_root автоматически подставляется имя пользователя вместо $USER. Просто создаешь симлинк на нужную папку с именем пользователя в /var/vftp_users/.

К примеру, у тебя имя юзера - ftp_user, рабочая папка для него будет /var/vftp_users/ftp_user. Эту папку не создаешь, а делаешь ссылку на нужную папку в /var/vftp_users/ с именем ftp_user. При логине ftp_user попадет в папку, на которую создана ссылка.

zevilz ★★★ ()
Ответ на: комментарий от zevilz

Понятно. А то я думал нужно менять права на файл с помощью chown и chmod. Я выполнил следующие команды:

chown username /var/www/
chmod 700 /var/www/
И теперь при подключении выдается такая ошибка:
500 OOPS:vsftpd:refusing to run with writable root inside chroot()
Как все это исправить?

sergey_mo ()
Ответ на: комментарий от sergey_mo

Виртуальные юзеры работают от имени веб-сервера. Веб-сервер и должен быть владельцем.

zevilz ★★★ ()
Ответ на: комментарий от sergey_mo

а на всякий случай лучше

chown -R www-data:www-data /var/www/

zevilz ★★★ ()
Ответ на: комментарий от zevilz

Выполнил

chown -R www-data:www-data /var/www
Все отлично, спасибо вам! Сим линки создал, открывается нужная папка. Но файлы с удаленного хоста на ftp сервер не копируются, выскакивает ошибка:
533 Could not create file

sergey_mo ()
Ответ на: комментарий от zevilz

Вот конфиг vsftpd:

isten=YES
#listen_ipv6=YES
local_enable=YES
write_enable=YES
#local_umask=022
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
#chown_uploads=YES
#chown_username=whoever
#xferlog_file=/var/log/vsftpd.log
#xferlog_std_format=YES
#idle_session_timeout=600
#data_connection_timeout=120
#nopriv_user=ftpsecure
#async_abor_enable=YES
#ascii_upload_enable=YES
#ascii_download_enable=YES
#deny_email_enable=YES
#banned_email_file=/etc/vsftpd.banned_emails
chroot_local_user=YES
#chroot_list_enable=YES
#chroot_list_file=/etc/vsftpd.chroot_list
#ls_recurse_enable=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
#rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
#rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
#ssl_enable=NO
rsa_cert_file=/etc/ssl/private/vsftpd.pem
force_dot_files=YES
user_sub_token=$USER
local_root=/var/vftp_users/$USER
hide_ids=YES
guest_enable=YES
guest_username=www-data
virtual_use_local_privs=YES
pasv_enable=Yes
pasv_max_port=65535
pasv_min_port=32768
allow_writeable_chroot=YES
У меня еще такая проблема есть, может она связана с chown: симлинк создается на папку для доступа FTP клиентов. Но когда клиент авторизуется, симлинк не отрабатывает.

sergey_mo ()

Я решил вашу проблему проще (если я правильно понял проблему):

  1. создаю нового пользователя в системе с домашней директорией /var/www/user, добавляю его в группу вебсервера
  2. Делаю там ему директорию для его сайта
  3. Даю права вебсерверу писать в эту директорию
  4. Ограничиваю доступ юзеру выше homedirectory
  5. ???????
  6. PROFIT

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

noiseme ()
Последнее исправление: noiseme (всего исправлений: 4)
Ответ на: комментарий от sergey_mo

Значит накосячил где-то. Этот конфиг рабочий. Кстати у тебя vsftpd из родных репов или левый vsftpd-ext?

У меня еще такая проблема есть, может она связана с chown: симлинк создается на папку для доступа FTP клиентов. Но когда клиент авторизуется, симлинк не отрабатывает.

Это как он не отрабатывает?

zevilz ★★★ ()
Ответ на: комментарий от noiseme

А если потребуется дать права 2му временному пользователю на определенную папку сайта в папке 1го пользователя, и чтобы еще и у 1го пользователя и веб-сервера остались полные права на эту папку?

zevilz ★★★ ()
Последнее исправление: zevilz (всего исправлений: 1)
Ответ на: комментарий от zevilz

тока финт ушами: создать группу куда будут входить оба юзера и вебсервер

noiseme ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.