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モードに設定しています。
何か案は?
http://grimwell.wikispaces.com/tftpd の情報に従い、selinuxポリシーを適用するために「すすぎと繰り返し」に特に注意を払いました。数回試行した後、すべてが機能し始めました-アップロード、および新しいファイルの作成。
要するに:
-c -v -s /tftpboot
を持っていることを確認してください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 reload
そしてtftpを使用してみてください。素晴らしい。他の人がこれが役に立つことを願っています!
この問題に対する別のより良い解決策を見つけました。 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 ..
-sオプションを指定してtftpdを起動していますか?一部のクライアントはこれを期待しているかもしれません。 foo
というファイルを/foo
にアップロードすることは、実際にはサーバー上の/tftpboot/foo
を対象としています。 -s /tftpboot
を追加すると、基本的に、そのディレクトリに対して「chroot」を実行するようサーバーに指示します。
手動でtftpdを実行してみてください。 xinetd経由ではなく、出力を確認します。 strace
で実行してみて、どのファイルが開こうとしているか、どのシステムがそれを呼び出しているかを正確に確認することもできます。
/etc/hosts.allow
と/etc/hosts.deny
を再確認して、サーバーへのトラフィックが許可されていることを確認します。
SELinuxに関しては、システムの構成方法によっては、auditdを有効にしている場合、/var/log/audit/audit.log
にログを記録している可能性があります。 このページ のセクション5を参照してください。