TFTP 上传失败

TFTP 上传失败

我在 Centos 5.4 服务器上通过 xinetd 运行 TFTPD。我能够通过 tftp 正常访问文件,所以我知道该服务运行正常。但是,每当我尝试上传文件时,都会收到 0 权限被拒绝的消息。

我已经在/tftpboot中创建了该文件并将权限设置为666。

我的 tftpd 配置有详细日志记录 (-vvvv),但我在 /var/log/messages 中看到的只有:

开始:tftp pid=20383 来自=192.168.77.4

我看到有人提到 SELinux 可以阻止 TFTPD 上传,但我希望在日志中看到一些东西。我已将 SELinux 设置为宽容模式。

有任何想法吗?

答案1

关注以下信息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 tftpwriteselinux 策略。确保策略包含写入和创建行。如果没有,请尝试再次写入和创建以在审计日志中生成警报,然后重试。
  • 使用创建可安装策略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

foo您是否使用 -s 选项启动 tftpd?某些客户端可能期望这样做,例如,上传名为to 的文件/foo实际上是要将其发送/tftpboot/foo到服务器上。添加-s /tftpboot本质上是告诉服务器对该目录执行“chroot”。

尝试手动运行 tftpd(例如不通过 xinetd),然后查看输出内容。您还可以尝试使用以下命令运行它,以strace准确查看它试图打开哪些文件以及它正在进行哪些系统调用。

仔细检查/etc/hosts.allow/etc/hosts.deny确保允许流量进入服务器。

对于 SELinux,根据系统的配置,/var/log/audit/audit.log如果您启用了 auditd,则可能会记录日志。请参阅这一页

相关内容