Я запускаю 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 установлен в разрешающий режим.
Есть идеи?
решение1
Следил за информацией наhttp://grimwell.wikispaces.com/tftpd, уделяя особое внимание "промыть и повторить", чтобы политики selinux были на месте. После нескольких попыток все заработало - загрузка и создание новых файлов.
Суммируя:
- убедитесь, что в CentOS установлен аудит, иначе SELinux может ничего не регистрировать!
- убедитесь, что ваш xinetd.d/tftpd имеет
-c -v -s /tftpboot
в строке аргументов сервера - убедитесь, что каталог, в который будет производиться запись, имеет права доступа 777
- сделайте tftp localhost и попробуйте поместить файл в каталог
- коснитесь файла в каталоге, примените к нему chmod 666, а затем через tftp localhost попробуйте перезаписать файл
- сделать
grep tftp /var/log/audit/audit.log | audit2allow -m tftpwrite
, чтобы создать политику selinux. Убедитесь, что политика включает строки write и create. Если нет, попробуйте снова выполнить write и creation, чтобы сгенерировать оповещения в журнале аудита, и попробуйте еще раз. - создайте устанавливаемую политику, используя,
grep tftp /var/log/audit/audit.log | audit2allow -M tftpwrite
а затем установите ее, используяsemodule -i tftpwrite.pp
service xinetd reload
и попробуйте использовать tftp.
Великолепно. Надеюсь, это будет полезно и другим!
решение2
Я нашел другое, лучшее решение этой проблемы. Я не мог поверить, что люди, которые писали файлы политики 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 ..
решение3
Вы запускаете 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эта страница.