Настройка 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