Настройка TFTP сервера для FreeBSD 5.x+

Написал Alexey Tsvetnov

http://www.rostovlinux.ru/content/view/665/56/

1. Постановка задачи.

2. Решение задачи.

3. Пошаговая реализация.

1. Постановка задачи.

Необходимо настроить сервер для сохранения (восстановления) конфигурации коммутаторов и маршрутизаторов по протоколу tftp. Сервер должен быть достаточно стабильным в работе и обеспечивать оптимальный уровень безопасности, учитывая специфику tftp-протокола.

2. Решение задачи.

------------------

В качестве tftp-сервера был выбран tftp-hpa by Brooks Davis

brooks@FreeBSD.org.

Программа позволяет запускать дочерний процесс от непривилегированного пользователя, создавать от его имени и с определёнными правами новые файлы, выполнять chroot в выбранный каталог, ограничивать доступ к файлам по таким критериям, как имя файла и переданная комманда (WRQ или RRQ), выполнять прозрачное переименовывание файлов в зависимости от IP-адреса клиента. Программа прекрасно работает как самостоятельный сервер и не нуждается в использовании inetd. В поставке идёт так же достаточно удобная клиентская программа, которая в отличает от поставляемой с базовой системой, позволяет передавать желаемые команды прямо в строке вызова.

Предложенная ниже конфигурация обеспечивает:

* программа используется как самостоятельный сервис, без использования inetd;

* умеренное протоколирование через syslog по ftp facility. Уровень детализации протоколирования задаётся в строке парамметров, от полного отсутствия до максимального (-vvv);

* дочерние процессы выполняются от имени непривилегированного пользователя tftpd;

* осуществляется chroot в каталог /var/tftp;

* разрешено создавать новые файлы, если такие отсутствую в рабочем каталоге;

* все новые файлы создаются от имени tftpd:tftpd и назначаются права 740, т.е. к файлу имеют доступ только владелец и группа;

* доступ для всех остальных пользователей, как к файлам, так и к рабочему каталогу /var/tftp не требуется;

* все имена файлов прозрачно преобразуются при записи из ИМЯ в IP-ИМЯ, а при чтении - из IP-ИМЯ в ИМЯ. Это позволяет ограничить доступ к файлам основываясь на IP-адресе клиента. Т.е. одно и тоже имя файла от абсолютно разных хостов на сервере будет сохраняться под разными именами и у каждого хоста будет доступ только к своей копии файла.

3. Пошаговая реализация.

Установить программу:

cd /usr/ports/ftp/tftp-hpa && make install clean

Добавить новую группу:

pw groupadd tftpd

Добавить нового пользователя:

pw useradd tftpd -c tftp_manager -d /nonexistent -g tftpd -s /usr/sbin/nologin

Создать рабочий каталог для размещения скачанных/закаченных данных:

mkdir /var/tftp && chown tftpd:tftpd /var/tftp && chmod 750 /var/tftp

Настроить syslog на протоколирование от ftp.* и ротацию протокола. Если настройки по-умолчанию syslog и newsyslog не менялись, то ни чего настраивать не нужно.

Протоколирование в этом случае будет производиться в /var/log/xferlog

Создать конфигурационный файл обработки файлов (переименование, контроль доступа):

touch /usr/local/etc/tftpd-remap.conf && chmod 440 /usr/local/etc/tftpd-remap.conf &&

chown tftpd:tftpd /usr/local/etc/tftpd-remap.conf

Добавить в файл /usr/local/etc/tftpd-remap.conf:

# Rename all files

# If WRQ: filename -> IP-filename

# If RRQ: IP-filename -> filename

r .* i-

Создать стартовый скрипт:

touch /usr/local/etc/rc.d/tftpd.sh && chmod +x /usr/local/etc/rc.d/tftpd.sh

Добавить в файл /usr/local/etc/rc.d/tftpd.sh:

#!/bin/sh

#

# tftp-hpa init script

# Copyright (c) 2006 by Alexey Tsvetnov,

vorakl@fbsd.kiev.ua

#

# PROVIDE: tftpd

# REQUIRE: DAEMON

# BEFORE: LOGIN

# KEYWORD: shutdown

#

# Define these tftpd_* variables in one of these files:

# /etc/rc.conf

# /etc/rc.conf.local

# /etc/rc.conf.d/tftpd

#

# tftpd_enable (bool): Set it to "YES" to enable tftpd.

# Default is "NO".

# tftpd_pidfile (path): Set full path to tftpd.pid.

# Default is "/var/run/tftpd.pid".

# tftpd_remapfile (path): Set full path to remap file.

# Default is "/usr/local/etc/tftpd-remap.conf".

# tftpd_datadir (path): Set full path to directory with data.

# Default is "/var/tftp".

# tftpd_flags (str): Extra flags passed to start command.

# Default is "-cps -u tftpd -U 037 -B 1468".

#

. /etc/rc.subr

name="tftpd"

rcvar=`set_rcvar`

load_rc_config $name

# DO NOT CHANGE THESE DEFAULT VALUES HERE

: ${tftpd_enable="NO"}

: ${tftpd_pidfile="/var/run/tftpd.pid"}

: ${tftpd_remapfile="/usr/local/etc/tftpd-remap.conf"}

: ${tftpd_datadir="/var/tftp"}

: ${tftpd_flags="-vvcps -u tftpd -U 037 -B 1468"}

extra_commands="reload"

start_cmd="tftpd_start"

stop_postcmd="tftpd_poststop"

reload_cmd="tftpd_reload"

required_files="/usr/local/etc/tftpd-remap.conf"

pidfile=$tftpd_pidfile

procname="/usr/local/libexec/in.tftpd"

tftpd_start() {

/bin/echo -n "Starting tftpd"

/usr/local/libexec/in.tftpd $tftpd_flags -l -m $tftpd_remapfile $tftpd_datadir

/bin/ps x | /usr/bin/grep in.tftpd | /usr/bin/grep -v grep | /usr/bin/awk '{print $1}' > $tftpd_pidfile

/bin/echo "."

}

tftpd_poststop() {

/bin/rm -f $tftpd_pidfile

}

tftpd_reload() {

/bin/kill -1 `cat $tftpd_pidfile`

}

run_rc_command "$1"

Добавить в /etc/rc.conf:

tftpd_enable="YES"

Требуемые настройки firewall:

а) для сервера:

UDP ServerIP [69] <- ClientIP [1024-65535]

UDP ServerIP [1024-65535] <-> ClientIP [1024-65535]

ipfw:

ipfw -q add pass udp from ${tftp_clnt} 1024-65535 to me 69 in

ipfw -q add pass udp from me 1024-65535 to ${tftp_clnt} 1024-65535 out

ipfw -q add pass udp from ${tftp_clnt} 1024-65535 to me 1024-65535 in

б) для клиента:

UDP ClientIP [1024-65535] -> ServerIP [69]

UDP ClientIP [1024-65535] <-> ServerIP [1024-65535]

ipfw:

ipfw -q add pass udp from me 1024-65535 to ${tftp_srv} 69 out

ipfw -q add pass udp from ${tftp_srv} 1024-65535 to me 1024-65535 in

ipfw -q add pass udp from me 1024-65535 to ${tftp_srv} 1024-65535 out

Обновлено: 12.03.2015