Ich führe TFTPD über xinetd auf einem Centos 5.4-Server aus. Ich kann problemlos über TFTP auf Dateien zugreifen, daher weiß ich, dass der Dienst ordnungsgemäß ausgeführt wird. Wenn ich jedoch versuche, eine Datei hochzuladen, erhalte ich die Meldung „0 Zugriff verweigert“.
Ich habe die Datei bereits in /tftpboot erstellt und die Berechtigungen auf 666 gesetzt.
Meine TFTPD-Konfiguration verfügt über eine ausführliche Protokollierung (-vvvv), aber alles, was ich in meinen /var/log/messages sehe, ist:
START: tftp pid=20383 von=192.168.77.4
Ich habe einige Erwähnungen gesehen, dass SELinux TFTPD-Uploads verhindern kann, aber ich würde erwarten, etwas in den Protokollen zu sehen. Ich habe SELinux auf den permissiven Modus eingestellt.
Irgendwelche Ideen?
Antwort1
Habe die Info unterhttp://grimwell.wikispaces.com/tftpd, wobei Sie besonders auf „Ausspülen und Wiederholen“ achten, um die Selinux-Richtlinien zu implementieren. Nach ein paar Versuchen funktionierte alles – Hochladen und Erstellen neuer Dateien.
Zusamenfassend:
- Stellen Sie sicher, dass Sie Audit in CentOS installiert haben, andernfalls protokolliert SELinux möglicherweise nichts!
- Stellen Sie sicher, dass Ihr xinetd.d/tftpd
-c -v -s /tftpboot
in der Server-Argumente-Zeile steht - Stellen Sie sicher, dass das Verzeichnis, in das TFTP schreibt, die Berechtigung 777 hat.
- Führen Sie einen TFTP-Localhost aus und versuchen Sie, eine Datei in das Verzeichnis zu legen
- Berühren Sie eine Datei im Verzeichnis, setzen Sie sie auf chmod 666 und versuchen Sie dann über TFTP Localhost, die Datei zu überschreiben
- tun Sie
grep tftp /var/log/audit/audit.log | audit2allow -m tftpwrite
dies, um eine Selinux-Richtlinie zu erstellen. Stellen Sie sicher, dass die Richtlinie Schreib- und Erstellungszeilen enthält. Wenn nicht, versuchen Sie erneut zu schreiben und zu erstellen, um Warnungen im Prüfprotokoll zu generieren, und versuchen Sie es erneut. - Erstellen Sie eine installierbare Richtlinie mit und
grep tftp /var/log/audit/audit.log | audit2allow -M tftpwrite
installieren Sie sie dann mitsemodule -i tftpwrite.pp
service xinetd reload
und versuchen Sie, TFTP zu verwenden.
Großartig. Ich hoffe, andere finden das nützlich!
Antwort2
Ich habe eine andere, bessere Lösung für dieses Problem gefunden. Ich konnte nicht glauben, dass die Leute, die die Selinux-Richtliniendateien geschrieben haben, nicht dachten, dass die Leute TFTP-Uploads brauchen würden, also habe ich ein bisschen nachgeforscht. Ich konnte im Internet nichts finden, was hier nicht bereits referenziert ist, aber durch die Suche in der Selinux-Richtlinie konnte ich einen anderen Sicherheitskontext finden, der bereits auf dem System für TFTP-Schreibvorgänge vorhanden ist. Das Ändern des Kontexts von /tftpboot hat das Problem behoben.
# 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 ..
Antwort3
Starten Sie tftpd mit der Option -s? Manche Clients erwarten dies möglicherweise, z. B. beim Hochladen einer Datei, die foo
eigentlich /foo
für /tftpboot/foo
den Server bestimmt ist. Das Hinzufügen -s /tftpboot
weist den Server im Wesentlichen an, ein „chroot“ in diesem Verzeichnis durchzuführen.
Versuchen Sie, tftpd manuell auszuführen, also nicht über xinetd, und sehen Sie sich die Ausgabe an. Sie können es auch mit ausführen, strace
um genau zu sehen, welche Dateien es zu öffnen versucht und welche Systemaufrufe es durchführt.
Überprüfen Sie es noch einmal /etc/hosts.allow
und /etc/hosts.deny
stellen Sie sicher, dass Datenverkehr auf den Server zugelassen wird.
In Bezug auf SELinux kann es je nach Konfiguration Ihres Systems zu einer Protokollierung kommen, /var/log/audit/audit.log
wenn Sie auditd aktiviert haben. Siehe Abschnitt 5 vondiese Seite.