summaryrefslogtreecommitdiff
path: root/LINUX/VSFTPD.md
blob: d2e80ed2bc1064d03dfe4343d2124c2411726a64 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
## Обновление системных пакетов

Перед установкой любого нового ПО рекомендуем обновлять системные пакеты до актуальных версий. Рассмотрим, какие команды для этого следует выполнить.

1. Обновление списка доступных пакетов и их версий:

    `sudo apt update`

2. Обновление установленных пакетов до последних версий:

    `sudo apt upgrade -y`

Теперь система готова к установке FTP-сервера.

## Выбор FTP-сервера на Ubuntu

FTP-серверы широко используют для обмена файлами, так как FTP-протокол позволяет одновременно передавать большие объемы данных, например резервные копии. Быстрое копирование файлов на FTP-сервер достигается благодаря передаче данных потоком. 

Существует несколько популярных FTP-серверов для Linux. Рассмотрим некоторые из них.

**VSFTPD (Very Secure FTP Daemon)**

Преимущества: высокий уровень безопасности, отличная производительность, поддержка виртуальных пользователей, возможность ограничения доступа к домашним директориям.

Недостатки: для обеспечения максимальной безопасности нужна детальная настройка.

**ProFTPD (Professional FTP Daemon)**

Преимущества: гибкие настройки, поддержка модулей, возможность использования конфигурации, похожей на Apache.

Недостатки: более длительная настройка по сравнению с VSFTPD, меньшая производительность при высокой нагрузке.

**Pure-FTPd**

Преимущества: легкость установки и использования, высокая производительность, поддержка виртуальных пользователей.

Недостатки: меньшее количество настроек безопасности по сравнению с VSFTPD и ProFTPD.

### Что выбрали

Для демонстрации установки и настройки будем использовать VSFTPD по нескольким причинам.

- Низкий ресурсный overhead. VSFTPD потребляет минимум ресурсов, что делает его идеальным для систем с ограниченными возможностями.
- Высокая скорость передачи данных. Обеспечивает отличную производительность при передаче файлов, что важно для высоконагруженных серверов.
- Встроенная поддержка шифрования для безопасной передачи данных — SSL/TLS.
- Многоплатформенность. Работает на большинстве UNIX-подобных систем.
- Простота интеграции с системами безопасности. Легко интегрируется с PAM и другими системами аутентификации для гибкого управления доступом.

[

## Создайте FTP-сервер на мощностях Selectel

Более 100 фиксированных конфигураций с готовностью — 2 минуты.

](https://selectel.ru/services/cloud/servers/ftp/)

## Установка FTP-сервера на Ubuntu

### Установка VSFTPD

VSFTPD прост в установке — он доступен в стандартных репозиториях Ubuntu. Откроем терминал и выполним следующую команду:

    `sudo apt install vsftpd -y`

### Запуск и настройка автозагрузки VSFTPD

После установки запустим VSFTPD:

    `sudo systemctl start vsftpd`

Совет: для настройки автозагрузки VSFTPD при запуске системы выполните команду sudo systemctl enable vsftpd.

### Проверка состояния VSFTPD

После запуска службы проверим ее состояние:

    `sudo systemctl status vsftpd`

В выводе отобразится текущий статус службы VSFTPD. Если она запущена корректно, мы увидим сообщение, что VSFTPD активен и работает (Active: active (running)).

Пример вывода sudo systemctl status vsftpd:

    `● vsftpd.service - vsftpd FTP server      Loaded: loaded (/lib/systemd/system/vsftpd.service; enabled; vendor preset: enabled)      Active: active (running) since Tue 2024-06-23 14:35:26 UTC; 2h 15min ago    Main PID: 12345 (vsftpd)       Tasks: 1 (limit: 4915)      Memory: 1.3M      CGroup: /system.slice/vsftpd.service              └─12345 /usr/sbin/vsftpd /etc/vsftpd.conf`

### Настройка файрвола для FTP

Если на сервере включен файрвол, следует открыть порты для FTP, чтобы обеспечить доступ к серверу.

В примере используем UFW (Uncomplicated Firewall). Команды далее могут отличаться в зависимости от вашего брандмауэра.

  
1. По умолчанию FTP использует порты 20 и 21 (TCP-трафик), а также диапазон 30000-31000 (пассивный режим FTP). Чтобы открыть их, выполним команды:

    `sudo ufw allow 20/tcp sudo ufw allow 21/tcp sudo ufw allow 30000:31000/tcp`

2. Перезапустим файрвол для применения изменений:

    `sudo ufw reload`

3. Убедимся, что правила файрвола применены корректно:

    `sudo ufw status`

Пример вывода sudo ufw status:

    `Status: active  To                         Action      From --                         ------      ---- 20/tcp                     ALLOW       Anywhere 21/tcp                     ALLOW       Anywhere 30000:31000/tcp            ALLOW       Anywhere 22/tcp                     ALLOW       Anywhere`

## Настройка FTP-сервера в Ubuntu

### Основная настройка

Конфигурационный файл VSFTPD находится в директории /etc/vsftpd.conf. Чтобы его отредактировать, можно воспользоваться любым текстовым редактором, например nano:

    `sudo nano /etc/vsftpd.conf`

Для обеспечения безопасности и эффективности работы сервера изменим конфигурационный файл VSFTPD в соответствии с настройками.

1. Отключим анонимный доступ, заменив значение параметра anonymous_enable на NO:

    `anonymous_enable=NO`

2. Для разрешения входа на сервер локальным пользователям установим значение параметра local_enable на YES:

    `local_enable=YES`

3. Разрешим команды записи. Чтобы пользователи могли загружать файлы на сервер, установим значение параметра write_enable на YES:

    `write_enable=YES`

4. Настроим права доступа для новых файлов, создаваемых пользователями. Их автоматическое назначение осуществляется с помощью параметра local_umask. Значение 022 позволяет владельцу файла записывать, читать и выполнять, а всем остальным — читать и выполнять:

    `local_umask=022`

Набор прав состоит из трех цифр:

- первая — права владельца,
- вторая — права группы владельца,
- третья — права остальных пользователей.

Каждая из них может принимать значения:

- 0 — нет прав;
- 1 — выполнение;
- 2 — запись;
- 3 — запись и выполнение;
- 4 — чтение;
- 5 — чтение и выполнение;
- 6 — чтение и запись;
- 7 — чтение, запись и выполнение.

Новые файлы и директории будут создаваться с правами, которые исходят из полного набора (777) за вычетом значений local_umask. Например, маска 022 означает набор прав 755.

5. Включим отображение приветственных сообщений при входе в директории:

    `dirmessage_enable=YES`

Для настройки текста сообщений следует перейти в интересующую директорию и создать в ней файл .message. Когда пользователь будет переходить в данную директорию, он будет получать сообщение, текст которого указан в файле.

6. Для корректной работы файрвола установим использование порта 20 для передачи данных:

    `connect_from_port_20=YES`

7. Чтобы ограничить пользователей их домашними директориями, установим значение параметра chroot_local_user на YES:

    `chroot_local_user=YES allow_writeable_chroot=YES`

Параметр allow_writeable_chroot используется, чтобы разрешить запись в домашнюю директорию пользователя при использовании chroot_local_user=YES.

8. Зададим корневую директорию для каждого пользователя:

    `user_sub_token=$USER local_root=/home/$USER/ftp`

9. После внесения всех изменений сохраним файл (**Ctrl+O** в nano), закроем редактор (**Ctrl+X** в nano) и перезапустим службу VSFTPD для применения изменений:

    `sudo systemctl restart vsftpd`

### Тестирование VSFTPD

1. Проверим корректность применения настроек. Для начала создадим тестового пользователя:

    `sudo adduser testuser sudo passwd testuser`

2. Создадим необходимые директории и настроим на них права:

    `sudo mkdir -p /home/testuser/ftp/upload sudo chown nobody:nogroup /home/testuser/ftp sudo chmod a-w /home/testuser/ftp sudo chown -R testuser:testuser /home/testuser/ftp/upload`

3. Добавим пользователя в список пользователей VSFTPD:

    `echo "testuser" | sudo tee -a /etc/vsftpd.userlist`

4. Подключимся к серверу с учетными данными тестового пользователя и убедимся в возможности загружать файлы в директорию /upload. Можно использовать любой FTP-клиент, в рамках инструкции будем пользоваться FileZilla.

### Настройка часового пояса

Чтобы сервер использовал локальное время, откроем конфигурационный файл VSFTPD и установим параметр use_localtime на YES:

    `use_localtime=YES`

### Настройка логов

Для настройки логирования перейдем в конфигурационный файл VSFTPD и включим логирование всех FTP-транзакций:

    `xferlog_enable=YES xferlog_std_format=YES`

Параметр xferlog_std_format позволяет использовать стандартный формат логов.

Также следует указать корректный путь к файлу логов (обычно /var/log/vsftpd.log):

    `xferlog_file=/var/log/vsftpd.log`

### Настройка PAM-сервиса

PAM (Pluggable Authentication Modules) — это система аутентификации, используемая в UNIX-подобных ОС, включая Linux. PAM позволяет администраторам настраивать политику аутентификации для различных приложений и служб. Для этого используется набор модулей, которые могут быть включены и настроены по мере необходимости. 

Для использования PAM необходимо предварительно включить его в файле /etc/vsftpd.conf.

1. Откроем файл /etc/vsftpd.conf:

    `sudo nano /etc/vsftpd.conf`

2. Отредактируем строку pam_service_name:

    `pam_service_name=vsftpd`

Для дальнейшей настройки сервиса PAM в VSFTPD следует внести изменения в файл /etc/pam.d/vsftpd. Внутри него — инструкции, которые PAM использует для управления аутентификацией пользователей при подключении к FTP-серверу. 

3. Откроем файл конфигурации PAM для VSFTPD:

    `sudo nano /etc/pam.d/vsftpd`

4. Настроим параметры аутентификации в соответствии со списком:

    `auth    required    pam_listfile.so item=user sense=deny file=/etc/vsftpd.ftpusers onerr=succeed auth    required    pam_shells.so auth    include     common-auth account include     common-account session include     common-session`

- auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd.ftpusers onerr=succeed — отказывает в доступе пользователям из файла /etc/vsftpd.ftpusers.
- auth required pam_shells.so — проверяет, что оболочка пользователя разрешена.
- auth include common-auth — включает общие правила аутентификации.
- account include common-account — включает общие правила управления учетными записями.
- session include common-session — включает общие правила управления сеансами.

5. Создадим файл списка пользователей:

    `sudo nano /etc/vsftpd.ftpusers`

Добавим имена пользователей, которым следует запретить доступ (по одному на строку).

6. Перезапустим службу VSFTPD:

    `sudo systemctl restart vsftpd`

## Создание пользователей

### Создание

Для создания нового пользователя на сервере выполним команду:

    `sudo adduser ftpuser`

Далее следует ввести пароль для нового пользователя и несколько дополнительных данных (имя, номер телефона и прочее). Можно оставить эти поля пустыми, нажав **Enter**.

Для назначения или изменения пароля пользователя нужно выполнить команду sudo passwd ftpuser, ввести новый пароль и подтвердить его.

### Настройка домашних папок

1. Создадим домашнюю папку пользователя:

    `sudo mkdir -p /home/ftpuser/ftp` 

2. Домашний каталог пользователя должен быть защищен от записи, чтобы соблюсти требования безопасности VSFTPD:

    `sudo chown nobody:nogroup /home/ftpuser/ftp sudo chmod a-w /home/ftpuser/ftp`

3. Далее создадим папку, в которую пользователь сможет загружать файлы, и настроим права доступа:

    `sudo mkdir -p /home/ftpuser/ftp/upload sudo chown -R ftpuser:ftpuser /home/ftpuser/ftp/upload sudo chmod -R 0755 /home/ftpuser/ftp/upload`

### Настройка анонимного или только авторизованного доступа

VSFTPD поддерживает доступ как анонимных, так и авторизованных пользователей. Для настройки политики следует внести изменения в конфигурационный файл.

#### Анонимный доступ

Если нам нужно разрешить анонимный доступ к FTP-серверу, следует указать для параметра anonymous_enable значение YES в конфигурационном файле /etc/vsftpd.conf:

    `anonymous_enable=YES`

#### Авторизованный доступ

Чтобы разрешить доступ к FTP-серверу авторизованным пользователям, укажем для параметра local_enable значение YES:

    `local_enable=YES`

### Разрешение / запрет доступа по SSH

Все настройки доступа к серверу по SSH находятся в конфигурационном файле /etc/ssh/sshd_config. В нем описываются разрешающие и запрещающие правила.

Для разрешения или запрета доступа к серверу по SSH группе пользователей следует указать в конфигурационном файле одну из следующих строк соответственно:

    `AllowGroups ftpusers`

    `DenyGroups ftpusers`

Чтобы разрешить или запретить доступ для отдельных пользователей, следует использовать следующие параметры:

    `AllowUsers ftpuser`

    `DenyUsers ftpuser`

Группа ftpusers и пользователь ftpuser указаны в качестве примера.

Для применения новых правил перезапустим службу SSH:

    `sudo systemctl restart ssh`

Порядок правил, указанных в конфигурационном файле SSH, имеет важное значение в определении политики доступа пользователя. Например, первым указано правило, запрещающее пользователям группы ftpusers доступ по SSH, а затем указано правило, разрешающее доступ пользователю ftpuser1 (входящему в группу ftpusers). 

В таком случае у пользователя ftpuser1 будет доступ к серверу по SSH. При установке этих правил в обратном порядке, пользователь ftpuser1 не получит доступ по SSH.

## Настройка SSL/TLS

Обеспечение безопасности FTP-соединений может обеспечить [SSL/TLS-протокол](https://selectel.ru/blog/what-is-ssl/).  

1. Создадим директорию,  в которой будут храниться SSL-сертификаты и ключи:

    `sudo mkdir /etc/ssl/private`

2. Создадим самоподписанный сертификат:

    `sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.key -out /etc/ssl/private/vsftpd.pem`

Ключ будет действителен в течение 10 лет.

В процессе генерации будет предложено ввести информацию о сертификате: страну, город, организацию и т. д. Можно оставить некоторые поля пустыми, нажав **Enter**.

3. Для использования созданного сертификата откроем конфигурационный файл VSFTPD:

    `sudo nano /etc/vsftpd.conf`

4. Внесем в него изменения в соответствии со следующим списком:

    `rsa_cert_file=/etc/ssl/private/vsftpd.pem rsa_private_key_file=/etc/ssl/private/vsftpd.key ssl_enable=YES allow_anon_ssl=NO force_local_data_ssl=YES force_local_logins_ssl=YES ssl_tlsv1=YES ssl_sslv2=NO ssl_sslv3=NO require_ssl_reuse=NO ssl_ciphers=HIGH`

- rsa_cert_file и rsa_private_key_file — указывают путь к сертификату и приватному ключу.
- ssl_enable=YES — включает SSL.
- allow_anon_ssl=NO — запрещает анонимный доступ через SSL.
- force_local_data_ssl=YES и force_local_logins_ssl=YES — требуют использование SSL для всех данных и логинов локальных пользователей.
- ssl_tlsv1=YES, ssl_sslv2=NO, ssl_sslv3=NO — включают TLSv1 и отключают устаревшие SSLv2 и SSLv3.
- require_ssl_reuse=NO — отключает требование повторного использования SSL-сессий.
- ssl_ciphers=HIGH — устанавливает использование только сильных шифров.

5. После внесения изменений сохраним файл и перезапустим службу VSFTPD:

    `sudo systemctl restart vsftpd`

При установке SSL/TLS-сертификатов подключение через FTP-клиенты осуществляется стандартным путем.

## Проверка подключения к серверу через FTP-клиент

Теперь FTP-сервер настроен и готов принимать безопасные соединения от клиентов.

Популярные программы, позволяющие подключаться к FTP-серверам, — FileZilla, WinSCP, FAR Manager, Total Commander, Midnight Commander и Cyberduck. Далее будем использовать наиболее известный кроссплатформенный FTP-клиент — FileZilla.

Для его установки в Ubuntu выполним команду:

    `sudo apt-get install filezilla`

Для подключения к FTP-серверу следует заполнить поля **Хост** (IP-адрес сервера), **Имя пользователя**, **Пароль** и нажать на кнопку **Быстрое соединение**. После подключения к FTP-серверу в правой части окна появится список директорий, доступных для данного пользователя.