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 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 を起動していますか? 一部のクライアントはこれを期待している可能性があります。たとえば、 と呼ばれるファイルのアップロードは、実際にはサーバー上で/foo
行われることを意図しています。 を追加すると、基本的にサーバーにそのディレクトリへの "chroot" を実行するように指示します。/tftpboot/foo
-s /tftpboot
xinetd 経由ではなく手動で tftpd を実行して、出力がどうなるかを確認してください。また、strace
どのファイルを開こうとしているのか、どのシステム コールを実行しているのかを正確に確認するために、 で実行してみることもできます。
もう一度確認して/etc/hosts.allow
、/etc/hosts.deny
サーバーへのトラフィックが許可されていることを確認してください。
SELinuxに関しては、システムの設定によっては、/var/log/audit/audit.log
auditdを有効にした場合にログに記録される可能性があります。このページ。