Назад | Перейти на главную страницу

Ошибка загрузки по TFTP

Я запускаю TFTPD через xinetd на сервере Centos 5.4. Я могу получить доступ к файлам через tftp в порядке, поэтому я знаю, что служба работает нормально. Однако всякий раз, когда я пытаюсь загрузить файл, я получаю сообщение 0 Permission denied.

Я уже создал файл в / tftpboot и установил разрешения на 666.

Моя конфигурация tftpd имеет подробное ведение журнала (-vvvv), но все, что я вижу в моем / var / log / messages:

НАЧАЛО: tftp pid = 20383 from = 192.168.77.4

Я видел некоторые упоминания о том, что SELinux может предотвращать загрузку TFTPD, но я ожидал увидеть что-то в журналах. У меня SELinux установлен в разрешающий режим.

Любые идеи?

Я нашел другое, лучшее решение этой проблемы. Я не мог поверить, что люди, которые писали файлы политик selinux, не думали, что людям нужна загрузка tftp, поэтому я немного покопался. Я не смог найти в Интернете ничего, что еще не упоминалось здесь, но, выполнив поиск по политике selinux, я смог найти другой контекст безопасности, уже существующий в системе для записи tftp. Изменение контекста / tftpboot устранило проблему.

# sesearch -a | grep tftpdir  |grep tftpd_
   allow tftpd_t tftpdir_t : file { read getattr }; 
   allow tftpd_t tftpdir_t : dir { read getattr search }; 
   allow tftpd_t tftpdir_t : lnk_file { read getattr }; 
   allow tftpd_t tftpdir_rw_t : file { ioctl read write create getattr setattr lock append unlink link rename }; 
   allow tftpd_t tftpdir_rw_t : dir { ioctl read write create getattr setattr lock unlink link rename add_name remove_name reparent search rmdir }; 
   allow tftpd_t tftpdir_rw_t : lnk_file { read create getattr setattr unlink link rename }; 
# ls -Z /tftpboot/ -a
drwxrwxrwx  root root system_u:object_r:tftpdir_t      .
drwxr-xr-x  root root system_u:object_r:root_t         ..
# chcon -t tftpdir_rw_t /tftpboot
# ls -Z /tftpboot/ -a
drwxrwxrwx  root root system_u:object_r:tftpdir_rw_t   .
drwxr-xr-x  root root system_u:object_r:root_t         ..

Следил за информацией на http://grimwell.wikispaces.com/tftpd, обращая особое внимание на «промыть и повторить», чтобы применить политики selinux. После нескольких попыток все заработало - закачка и создание новых файлов.

Коротко:

  • убедитесь, что в centos установлен аудит, иначе SELinux может ничего не записывать!
  • убедитесь, что ваш xinetd.d / tftpd имеет -c -v -s /tftpboot в строке аргументов сервера
  • убедитесь, что каталог, в который будет записывать tftp, имеет права доступа 777
  • сделайте tftp localhost и попробуйте поместить файл в каталог
  • коснитесь файла в директории, chmod 666 его, а затем через tftp localhost, попробуйте перезаписать файл
  • делать grep tftp /var/log/audit/audit.log | audit2allow -m tftpwrite создать политику selinux. Убедитесь, что политика включает запись и создание строк. Если нет, попробуйте написать и создать еще раз, чтобы генерировать предупреждения в журнале аудита, и повторите попытку.
  • создать устанавливаемую политику, используя grep tftp /var/log/audit/audit.log | audit2allow -M tftpwrite затем установите его, используя semodule -i tftpwrite.pp
  • service xinetd reload и попробуйте использовать tftp.

Великолепно. Надеюсь, другие сочтут это полезным!

Вы запускаете tftpd с параметром -s? Некоторые клиенты могут этого ожидать, например загрузка файла с именем foo к /foo действительно предназначен для /tftpboot/foo на сервере. Добавление -s /tftpboot по сути, указывает серверу выполнить "chroot" для этого каталога.

Попробуйте запустить tftpd вручную, например не через xinetd, и посмотрите, что будет на выходе. Вы также можете попробовать запустить его с помощью strace чтобы увидеть, какие именно файлы он пытается открыть и какие системы вызывают.

Двойная проверка /etc/hosts.allow и /etc/hosts.deny чтобы убедиться, что трафик разрешен на сервер.

Что касается SELinux, в зависимости от того, как настроена ваша система, он может выполнять вход в /var/log/audit/audit.log если вы включили auditd. См. Раздел 5 эта страница.