FTP-протокол, несмотря на преклонный возраст, продолжает активно использоваться, преимущественно для разных обменов: товароучетным ПО, торговым и промышленным оборудованием, оргтехникой.
В большинстве случаев клиенты не поддерживают шифрование и протокол используется в открытом виде, что, конечно же, по современным меркам небезопасно, но тут выбирать не приходится.
В нашем случае возникла потребность быстро настроить новый сервер для сети розничных магазинов, работающих на базе 1С:Предприятие. Проанализировав все за и против мы выбрали вариант с Docker.
Основных аргументов два: изоляция небезопасного сервера от хоста и независимость от пакетной базы дистрибутива, что дает возможность гибко управлять жизненным циклом ПО.
Нами был выбран образ stilliard/pure-ftpd:hardened, это популярный, поддерживаемый образ с уже внесенными из коробки настройками безопасности.
Допустим наш проект будет располагаться в
/opt/exch, поэтому первым делом создадим папки пользователей и служебный каталог для хранения базы паролей:mkdir -p /opt/exch/data/{user1,user2,user3,user4,user5}
mkdir -p /opt/exch/pure-ftpdСразу установим на них нужные права:
chown -R 1000:1000 /opt/exch/data /opt/exch/pure-ftpd
Затем создадим docker-compose.yml следующего содержимого:
services:
pure-ftpd:
image: stilliard/pure-ftpd:hardened
container_name: pure-ftpd
restart: unless-stopped
ports:
- "21:21"
- "60000-60499:60000-60499"
environment:
PUBLICHOST: exch.example.com
FTP_PASSIVE_PORTS: 60000:60499
ADDED_FLAGS: "-d -p 60000:60499"
TZ: "Europe/Moscow"
volumes:
- /opt/exch/data:/home/ftpusers
- /opt/exch/pure-ftpd:/etc/pure-ftpd
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
После запуска контейнера создадим пользователей командой:
docker exec -it pure-ftpd pure-pw useradd user1 \
-u ftpuser -d /home/ftpusers/user1
Создав всех пользователей, скомпилируем базу паролей:
docker exec pure-ftpd pure-pw mkdb
Теперь сервер полностью готов принимать соединения.
Сразу поясним несколько моментов. Кроме управляющего порта 21 мы указываем порты для передачи данных в пассивном режиме 60000-60499, активный режим работы сервера не предусмотрен.
Количество портов выбирайте исходя из количества активных клиентов, по умолчанию сервер допускает до пяти одновременных соединений. Таким образом указав диапазон в 500 портов, мы можем полноценно обслуживать до 100 клиентов.
Флаг -d включает режим визуализиции лога в режиме отладки, вы будете видеть все команды клиента, пароль в целях безопасности заменяется в логе звездочкой. Если вы хотите видеть еще и ответы сервера – добавьте второй флаг -d.
Переменная окружения PUBLICHOST: exch.example.com указывает на публичное имя сервера (или его IP-адрес), который будет передаваться клиенту для подключения, используйте для этого реальное внешнее имя или адрес хоста.
Переменная FTP_PASSIVE_PORTS: 60000:60499 и флаг -p 60000:60499 на первый взгляд дублируют друг друга, но на самом деле это разные опции. Флаг запускает службу на прослушивание указанных портов, а переменная говорит службе какой диапазон портов можно сообщать клиентам для подключения. Для нормальной работы их значения должны совпадать.
