我正在 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
您是否使用 -s 選項啟動 tftpd?一些客戶端可能期望這一點,例如上傳一個名為foo
to 的檔案/foo
實際上是為了/tftpboot/foo
在伺服器上使用。添加-s /tftpboot
本質上告訴伺服器對該目錄執行“chroot”。
嘗試手動運行 tftpd,例如不通過 xinetd,然後查看輸出是什麼。您也可以嘗試運行它,以strace
準確查看它正在嘗試開啟哪些檔案以及正在進行哪些系統呼叫。
仔細檢查/etc/hosts.allow
並/etc/hosts.deny
確保允許流量進入伺服器。
對於 SELinux,根據您的系統配置方式,/var/log/audit/audit.log
如果您啟用了auditd,它可能會記錄到。請參閱第 5 節這一頁。