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

您是否使用 -s 選項啟動 tftpd?一些客戶端可能期望這一點,例如上傳一個名為footo 的檔案/foo實際上是為了/tftpboot/foo在伺服器上使用。添加-s /tftpboot本質上告訴伺服器對該目錄執行“chroot”。

嘗試手動運行 tftpd,例如不通過 xinetd,然後查看輸出是什麼。您也可以嘗試運行它,以strace準確查看它正在嘗試開啟哪些檔案以及正在進行哪些系統呼叫。

仔細檢查/etc/hosts.allow/etc/hosts.deny確保允許流量進入伺服器。

對於 SELinux,根據您的系統配置方式,/var/log/audit/audit.log如果您啟用了auditd,它可能會記錄到。請參閱第 5 節這一頁

相關內容