TFTPアップロードが失敗しました

TFTPアップロードが失敗しました

Centos 5.4 サーバーで xinetd 経由で TFTPD を実行しています。tftp 経由でファイルにアクセスできるので、サービスが正常に実行されていることはわかります。ただし、ファイルをアップロードしようとすると、0 Permission denied というメッセージが表示されます。

すでに /tftpboot にファイルを作成し、権限を 666 に設定しました。

私の tftpd 設定には詳細なログ記録 (-vvvv) がありますが、/var/log/messages に表示されるのは次の内容だけです:

開始: tftp pid=20383 from=192.168.77.4

SELinux が TFTPD アップロードを阻止できるという言及を見ましたが、ログに何かが表示されることを期待しています。私は SELinux を permissive モードに設定しています。

何か案は?

答え1

以下の情報に従ってください出典: http://grimwell.wikispaces.comselinux ポリシーを適切に設定するために、「繰り返し実行」に特に注意を払いました。数回の試行の後、アップロードや新しいファイルの作成など、すべてが機能し始めました。

要するに:

  • CentOS に監査がインストールされていることを確認してください。そうしないと、SELinux は何もログに記録しない可能性があります。
  • xinetd.d/tftpdの-c -v -s /tftpbootサーバ引数行に
  • tftpが書き込むディレクトリに777の権限があることを確認してください
  • tftp localhostを実行してディレクトリにファイルを配置してみます
  • ディレクトリ内のファイルをタッチし、chmod 666 を実行してから、tftp localhost 経由でファイルを上書きしてみます。
  • selinux ポリシーを作成するにgrep tftp /var/log/audit/audit.log | audit2allow -m tftpwriteは、ポリシーに書き込み行と作成行が含まれていることを確認します。含まれていない場合は、書き込みと作成を再度実行して監査ログにアラートを生成し、再試行してください。
  • を使用してインストール可能なポリシーを作成しgrep tftp /var/log/audit/audit.log | audit2allow -M tftpwrite、それを使用してインストールします。semodule -i tftpwrite.pp
  • service xinetd reloadtftp を使用してみてください。

素晴らしいです。他の人もこれが役に立つことを願っています!

答え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 を起動していますか? 一部のクライアントはこれを期待している可能性があります。たとえば、 と呼ばれるファイルのアップロードは、実際にはサーバー上で/foo行われることを意図しています。 を追加すると、基本的にサーバーにそのディレクトリへの "chroot" を実行するように指示します。/tftpboot/foo-s /tftpboot

xinetd 経由ではなく手動で tftpd を実行して、出力がどうなるかを確認してください。また、straceどのファイルを開こうとしているのか、どのシステム コールを実行しているのかを正確に確認するために、 で実行してみることもできます。

もう一度確認して/etc/hosts.allow/etc/hosts.denyサーバーへのトラフィックが許可されていることを確認してください。

SELinuxに関しては、システムの設定によっては、/var/log/audit/audit.logauditdを有効にした場合にログに記録される可能性があります。このページ

関連情報