Як я vsftpd налаштував, savepearlharbor

У зв'язку з недавніми подіями популярного поштового сервісу, який зберігав особисті файли користувачів у вільному доступі, я вирішив налаштувати FTP сервер для своїх потреб, - щоб знайомі могли безпосередньо мені передавати файли і завантажувати їх. Ні, тим сервісом я не користувався і давно зарікся не довіряти третім особам нічого зайвого, однак, якщо не свій особистий FTP, то коткто що? Звичайно OpenSSH, але чи будете ви кожному знайомому людині пояснювати, що потрібно для цього скачати / встановити, чи все ж просто повідомте посилання на свій FTP? Так само, консольний ftp-клієнт є «з коробки» навіть в Windows (якщо ви розумієте, про що я).

Все відбувається на локалхосте (тобто, на домашньому комп'ютері), тому обов'язковою умовою є наявність зовнішнього IP. І Linux. Звичайно ж Linux, куди ж без нього ...

I. Чому і навіщо?

За пару хвилин в думках пробігши по архітектурі сервера, структурі каталогів, як я бажаю зберігати файли і які функції повинні виконуватися сервером ... Завдання встала наступна.

Не маю нічого проти anonymous-користувачів, - нехай, буду викладати на паблік всілякі дурниці. Щоб не відчувати дискомфорт, для anonymous будуть жорсткі обмеження на зразок швидкості 16Кбайтам / секунду.
anonymous зможуть заливати файли на сервер в окрему директорію.
Порушувати структуру FHS не буду, тому anonymous потрапляють в директорію / srv / ftp. і в ній, вже дотримуючись традицій, створюю дві директорії для завантаження і віддачі файлів.

mkdir / srv / ftp /
chown root: ftp / srv / ftp /
chmod g + w / srv / ftp / incoming

Уже для себе, хочу мати користувача на сервері зі своїм логіном: паролем. а в ідеалі - створювати скільки завгодно різних користувачів, і вони будуть працювати з кореневої директорією в моєму хом'як

/ Downloads (яка так само використовується іншими програмами).
Вважаю ви здогадалися. що ці користувачі на сервері - ті самі знайомі, яким я хочу надати вільний доступ до файлообміну.
У неї вони можуть вільно завантажувати, завантажувати файли з необмеженою швидкістю. І мені не потрібно нічого зайвий раз милицях з правами і вигадуванням нових директорій. Все завантаження, - браузер, торрент, фтп, - все лежить в одному місці. Зручно.

Робити щось на зразок хостингу, щоб у кожного користувача сервера була своя директорія (а в ній наприклад, розшарений сайт), у мене завдання не стояло, але я розгляну і цей випадок.

Усе? Більше ніяких екзотичних побажань немає? Тоді почнемо.

Насамперед накочується сам FTP сервер. Мій вибір припав на vsftpd, - маленький, надійний, швидкий, безпечний (я б навіть сказав параноїдальний) сервер, та й сам вибір очевидний:

vsftpd is the default FTP server in the Ubuntu, CentOS, Fedora, NimbleX, Slackware and RHEL Linux distributions.

II. установка

Розповідати про установку зайвий раз не стану, в кожному дистрибутиві свій пакетний менеджер, і про три заповітні команди ./configure # 038; # 038; make # 038; # 038; su -c "make install" ви і так багато чули ... vsftpd у вас встановлений.

Для багатьох користувачів може бути звичним запускати програму, жмякайте кнопочки і розставляти галочки для управління користувачами і правами на директорії / файли.
У випадку з vsftpd є лише базові настройки сервера, а права на файли - реальні права, які встановлюються через chmod. Тому наприклад, щоб дозволити користувачам завантажувати файли на сервер, вам відповідно потрібно просто дозволити запис в директорію стандартними засобами. У vsftpd ви лише тільки включаєте функцію, що файли можна завантажувати на сервер, а в яку директорію, який користувач може завантажувати - це встановлюється стандартними chmod / chown. Так, для ясності.

III. Базова настройка

Включаємо роботу сервера в режимі самостійного демона, без всяких inetd, і ведення логів (по-замовчуванню /var/log/vsftpd.log)

Включаємо 20 порт для обміну безпосередньо даними через команду PORT, і обмежуємо кількість одночасних з'єднань.

Ховаємо користувачів в системі, так, що при лістингу директорій ім'я / група всіх об'єктів буде просто іменуватися ftp. а не мати id реального власника цього об'єкту, і включаємо можливість завантажувати файли на сервер - для цього ми його і налаштовуємо, же.

Замикаємо користувача в його хом'як. Без цієї настройки, ви могли б зайти в будь-яку директорію в системі і прочитати будь-який файл (ну, все залежить від прав).

Все, наша система з такими настройками в безпеці.

IV. користувачі

І тепер-то налаштуємо наших віртуальних користувачів на сервері.
Зазначимо директорію, де буде лежати персональний конфиг кожного такого користувача.

username
password
spoofing
blahblahblah
root
toor

де через підрядник записаний логін користувача, потім слід його пароль.

Виконаємо команду для конвертації файлу в базу даних Berkeley

db_load -T -t hash -f

/logins.txt /etc/vsftpd_login.db
chmod 600 /etc/vsftpd_login.db

проте в залежності від версії програми, у вас може бути db3_load, db4_load.

Зазначимо PAM, який файл з базою потрібно використовувати сервера, - створіть файл /etc/pam.d/ftp і запишіть в нього

auth required /lib/security/pam_userdb.so db = / etc / vsftpd_login
account required /lib/security/pam_userdb.so db = / etc / vsftpd_login

Залежно від того, яких ви користувачів вкажете в

/logins.txt (і потім процес конвертації бази потрібно повторити), - ви зможете логінитися на ftp під цими користувачами.
І для кожного користувача окремо ви можете вказати персональні настройки, - наостанок створимо директорію mkdir / etc / vsftpd_user_conf. де ці самі настройки будуть зберігатися.

Створюємо файл / etc / vsftpd_user_conf / spoofing (з логіном нашого віртуального користувача на сервері) і перевизначати настройки за замовчуванням, які були раніше вказані (або не вказані зовсім) в /etc/vsftpd.conf.
Суть в тому, що ці налаштування тепер працюють тільки для цього користувача.

Бзік vsftpd, який не бажав писати в директорію, вказану кореневої для користувача і від цього видавав помилку 500 OOPS: vsftpd: refusing to run with writable root inside chroot (). Тобто наприклад, за замовчуванням при логін на сервері ви потрапляєте в / home / spoofing / Downloads. Встановіть їй права chmod ga + w / home / spoofing / Downloads і виникне ця помилка. З чим пов'язана така параноя, що в «корінь не можна писати» - не знаю, але так добре. Все ж дозволяємо запис і позбавляємося від помилки.

Переобумовленої користувача, з правами якого будуть створюватися нові (завантажуються на сервер) файли. Раніше в конфіги у нас був вказаний користувач ftp. але нам же в нашому

/ Downloads не потрібні ніякі «чужі» файли? Так само, сесія на сервері буде створюватися під нашим користувачем, а значить не буде зовсім ніяким проблем з доступом в наш / home / spoofing. щоб зайти в

І нарешті, вказуємо сам

/ Downloads, яка для цього користувача буде кореневої директорією на сервері. І прибираємо ліміт на завантаження.

Тепер при логін під користувачем spoofing на сервері ви потрапляєте в свою директорію / home / spoofing / Downloads. можете в неї завантажувати файли і завантажувати.
Сесія відбувається під вашим вже справжнім користувачем spoofing. тільки тому ви і можете потрапити в свій

. і завантаження створюються під вашим користувачем. Так то.

Тепер точно так же створюємо інших користувачів на сервері, але щоб всі вони могли працювати тільки з одним загальним

/ Downloads.
Для цього описуємо їх в

/logins.txt. перетворюємо базу Berkeley, копіюємо вміст / etc / vsftpd_user_conf / spoofing в / etc / vsftpd_user_conf /. Усе.

VI. anonymous

Перед початком ми вже створили необхідні директорії / srv / ftp / і встановили права на запис в / srv / ftp / incoming.

Дозволимо anonymous логінитися.

Дозволимо завантажувати файли, створювати директорії, але а ось перейменовувати і видаляти вже створені файли - не можна.

Обмежимо пропускну здатність в 16384 байт. і вкажемо, з якими правами створювати нові файли.

Все, тепер anonymous потрапляючи в свою домашню / srv / ftp побачить incoming для завантаження файлів і pub ...
Сесія на сервері виконується під користувачем ftp. - той, якого ми вказали в /etc/vsftpd.conf, під ним же будуть створюватися нові компоненти для завантаження.

VII. Хостинг

Наприклад, ваші сайти лежать в /srv/http/example.com, /srv/http/example.net, /srv/http/example.org і через FTP ви хочете мати повний доступ до файлів кожного сайту окремо.

Створіть користувачів на сервері з іменами example.com, example.net, example.org, а в /etc/vsftpd.conf встановіть кореневу директорію з сайтами

Логін під іменами доменів - ви потрапляєте в корінь кожного з сайтів. Все просто.

Інший варіант, якщо ви будете створювати кожного користувача окремо в / etc / vsftpd_user_conf, кожному з яких будете встановлювати персональні настройки для доступу до файлів сайту.

VIII. Безпека

Це звичайно добре, що файли зберігаються не у відкритому доступі на якомусь файлообміннику, а переходять безпосередньо від користувача до користувача через пряме підключення по FTP. Однак, було б прекрасним трафік ще й шифрувати, щоб ніхто не дізнався які саме файли ви передаєте.

Налаштуємо SSL / TLS, і перш за включимо його в /etc/vsftpd.conf.

Виберіть, який протокол вам подобається.

openssl req -x509 -nodes -days 365 -newkey rsa 1024 -keyout /etc/ssl/certs/vsftpd.pem -out /etc/ssl/certs/vsftpd.pem

Вказуємо шлях до нього.

І, я вважаю обов'язковим всім локальним користувачам підключатися до вашого сервера по зашифрованому з'єднанню. Раптом, дівчина захоче перекинути свої фотографії жанру Ню?
Тому включаємо обов'язковий SSL / TLS для локальних користувачів, а ось anonymous воно мабуть не потрібно, витрачати лише процесорний час.

IX. перевіряємо

anonymous'и, безліч локальних користувачів, які одночасно працюють з вашим

/ Downloads, обов'язкове з'єднання через SSL / TLS.
Шикарно, безпечно, зручно, і, - все працює. Перевіримо.

Завантажуємо файл curl'ом на ftp: // localhost / incoming

/Desktop/userpic.jpg ftp: // localhost / incoming /
* About to connect () to localhost port 21 (# 0)
* Trying. 1 ...
% Total% Received% Xferd Average Speed ​​Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 -: -: - -: -: - -: -: - 0 * Connection refused
* Trying 127.0.0.1 ...
* connected
* Connected to localhost (127.0.0.1) port 21 (# 0)
<220 Welcome to Voglea FTPd
> USER anonymous
<331 Please specify the password.
> PASS [email protected]
<230 Login successful.
> PWD
<257 "/"
* Entry path is '/'
> CWD incoming
<250 Directory successfully changed.
> EPSV
* Connect data stream passively
<229 Entering Extended Passive Mode (|||8210|).
* Trying 127.0.0.1 ...
* connected
* Connecting to 127.0.0.1 (127.0.0.1) port 8210
> TYPE I
<200 Switching to Binary mode.
> STOR userpic.jpg
<150 Ok to send data.
> [Data not shown]
* We are completely uploaded and fine
* Remembering we are in dir «incoming /»
100 77050 0 0 100 77050 0 25418 0:00:03 0:00:03 -: -: - 25437<226 Transfer complete.
100 77050 0 0 100 77050 0 20654 0:00:03 0:00:03 -: -: - 20656
* Connection # 0 to host localhost left intact
> QUIT
<221 Goodbye.
* Closing connection # 0

Перевіряємо файл в / srv / ftp / incoming

]
└─╼ ls -la / srv / ftp / incoming /
total 88K
drwxrwxr-x 2 root ftp 4.0K Jan 17 20:31 ./
dr-xr-xr-x 4 root ftp 4.0K Jan 17 15:26. /
-rw-r-r- 1 ftp ftp 76K Jan 17 20:31 userpic.jpg

Перевіряємо підключення до сервера

]
└─╼ ftp localhost
ftp: connect to address. 1: Connection refused
ftp: Trying 127.0.0.1 ...
Connected to localhost.localdomain.
220 Welcome to Voglea FTPd
Name (localhost.localdomain: spoofing): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls -la
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
dr-xr-xr-x 4 ftp ftp 4096 Jan 17 7:26.
dr-xr-xr-x 4 ftp ftp 4096 Jan 17 року 07: 26 ...
drwxrwxr-x 2 ftp ftp 4096 Jan 17 12:31 incoming
drwxr-xr-x 2 ftp ftp 4096 Jan 16 15:08 pub
226 Directory send OK.
ftp> cd incoming
250 Directory successfully changed.
ftp> ls -la
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxrwxr-x 2 ftp ftp 4096 Jan 17 12:31.
dr-xr-xr-x 4 ftp ftp 4096 Jan 17 року 07: 26 ...
-rw-r-r- 1 ftp ftp 77050 Jan 17 12:31 userpic.jpg
226 Directory send OK.
ftp> quit
221 Goodbye.

Утиліта ftp не вміє працювати з SSL / TLS

]
└─╼ ftp localhost
ftp: connect to address. 1: Connection refused
ftp: Trying 127.0.0.1 ...
Connected to localhost.localdomain.
220 Welcome to Voglea FTPd
Name (localhost.localdomain: spoofing): spoofing
530 Non-anonymous sessions must use encryption.
ftp: Login failed.
421 Service not available, remote server has closed connection
ftp> quit

Пробуємо через curl -ftp-ssl завантажити файл

Перевіряємо файл в / home / spoofing / Downloads

/ Downloads]
└─╼ pwd
/ Home / spoofing / Downloads
┌─ [myhost

/ Downloads]
└─╼ ls -la
total 84K
drwxr-xr-x 2 spoofing users 4.0K Jan 17 20:51 ./
drwx-- 17 spoofing users 4.0K Jan 17 19:20. /
-rw-r-r- 1 spoofing users 76K Jan 17 20:51 userpic.jpg

Схоже, що все працює.
Файли, які завантажуються користувачами - потрапляють прямо в мій

/ Downloads, власником яких встановлюється я, а не ftp, і відразу з потрібними правами.

X. T3h end

# Chmod g + w / srv / ftp / incoming