我在 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 tftpwrite
selinux 策略。确保策略包含写入和创建行。如果没有,请尝试再次写入和创建以在审计日志中生成警报,然后重试。 - 使用创建可安装策略
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,则可能会记录日志。请参阅这一页。