Настройка OpenBSD ftpd

ftpd(8) - это сервер передачи файлов по сети (FTP), установленный в OpenBSD по умолчанию.

Данная статья содержит описание создания анонимного FTP-доступа и настройки сервера после его запуска.

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

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

TL;DR: Полный сценарий настройки:

#!/bin/sh
#
# Setup Anonymous access for OpenBSD's ftpd server.

useradd -s /sbin/nologin  -c "Mr. Anonymous FTP" -d /home/ftp ftp 
mkdir -m 555 ~ftp
mkdir -m 511 ~ftp/etc
echo "default:*:0:0::::::" > ~ftp/etc/passwd
echo "default:*:0:0:" > ~ftp/etc/group
pwd_mkdb -d ~ftp/etc passwd
rm ~ftp/etc/master.passwd ~ftp/etc/spwd.db
chmod 444 ~ftp/etc/pwd.db ~ftp/etc/group
mkdir -m 555 ~ftp/pub
rcctl enable ftpd
rcctl start ftpd

Разберём настройку по шагам.

Шаг 1: Создание пользователя ftp.

Для дальнейшего создания анонимного доступа к FTP серверу нам необходимо создать пользователя ftp:

useradd -s /sbin/nologin -c "Mr. Anonymous FTP" -d /home/ftp ftp

Пользователю ftp можно задать собственные UID и GID, но учтите, что ftpd(8) блокирует подключения пользователей с UID ниже 1000 (по умолчанию).

Создание пользователя также позволяет использовать в дальнейшем тильду расширение комадной оболочки для простого обращения к домашнему каталогу пользователя (~ftp).

Шаг 2: Создание структуры директорий

Создаём домашний каталог пользователя ftp с помощью команды mkdir(1):

mkdir -m 555 ~ftp

Внимание: Использование флага -m обязательно. Без него есть вероятность того, что сервер даст возможность загружать случайным пользователям диск ненужными файлами. Он позволяет задавать права на созданную директорию, также как если мы использовали chmod(1).

По такому же принципу создаём директорию ~ftp/pub:

mkdir -m 555 ~ftp/pub

В дальнейшем она будет использована для хранения файлов.

Шаг 2.1: Создание конфигурационной диретории (Опционально)

По умолчанию ftpd(8) в информации о владельцах передаёт только численные UID пользователя и GID группы. Для того чтобы дать клиенту информацию о именах необходимо создать диреторию ~ftp/etc. Создавать в ней файлы не обязательно (как и директорию в целом), но это является хорошим тоном для FTP-сервера.

Создаём директорию и запрещаем её чтение:

mkdir -m 511 ~ftp/etc

Далее создаём файлы о пользователях и группах:

echo "default:*:0:0::::::" > ~ftp/etc/passwd
echo "default:*:0:0:" > ~ftp/etc/group
pwd_mkdb -d ~ftp/etc passwd

Данные команды создают настройки только для имён пользователя root (UID 0) и группы wheel (GID 0), имена может быть любыми.

Чтобы добавить больше пользователей и групп для отображения вам необходимо добавить их имена в файлы ~ftp/etc/passwd и ~ftp/etc/group соответственно, а также для имён выполнить все последующие команды, начиная со следующей.

Команда pwd_mkdb удаляет ~ftp/etc/passwd и создаёт ~ftp/etc/master.passwd, ~ftp/etc/spwd.db и ~ftp/etc/pwd.db из которых на нужен только последний, поэтому удаляем их:

rm ~ftp/etc/master.passwd ~ftp/etc/spwd.db

Меняем права чтения и записи на оставшиеся файлах:

chmod 444 ~ftp/etc/pwd.db ~ftp/etc/group

Шаг 3: Запускаем сервер

После того как все приготовления завершены, сервер можно запускать.

rcctl enable ftpd
rcctl start ftpd

Настройка сервера

После запуска дальнейшая настройка сервера доступна через системные конфигурационные файлы.

Блокировка доступа

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

echo "lessavin" > /etc/ftpusers

В качестве крайней меры через login(1) можно заблокировать доступ к серверу всем пользователям (кроме root):

echo "I'm sorry." > /etc/nologin

Внимание: Данная команда заблокирует доступ к любой авторизации, не только FTP.

Ограничение доступа

По умолчанию пользователи через FTP имеют доступ ко всем доступным директориям в системе, а анонимные пользователи ограничены одной домашней директорией ftp пользователя и ограничены через chroot(8).

Ограничить простых пользователей до их домашних директорий можно указав их имя в /etc/ftpchroot:

echo "lessavin" > /etc/ftpchroot

Изменения сообщений

До подключения пользователь увидит сообщение из /etc/ftpwelcome:

echo "Welcome to my FTP server." > /etc/ftpwelcome

После успешного подключения пользователь увидит сообщение MOTD из /etc/motd:

echo "Successfully connected." > /etc/motd

Заметка: Для анонимов данный файл располагается в ~ftp/etc/motd.

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

echo "Hello, this is the Important directory. It is Important!" > .message