Logrotate liest keine symbolisch verknüpften Konfigurationsdateien mehr, da keine Rootberechtigten mehr sind

15

Wir führen derzeit ein Upgrade von Ubuntu 12.04 LTS auf 14.04 LTS auf unseren Ruby-on-Rails-Anwendungsservern durch und haben festgestellt, dass die Protokolldateien nicht mehr rotieren.

Auf beiden Rechnern haben wir eine Datei /var/app-name/config/logrotateunseres Unix-Benutzers, deployerdie eine gültige Logrotate-Datei wie folgt enthält:

/var/app-name/log/*.log {
  daily
  rotate 365
  delaycompress
  compress
  dateext
  dateformat -%Y%m%d
  missingok
  copytruncate
}

Dies wird dann in das /etc/logrotate.d/Verzeichnis als symbolisiertapp-name

Auf unserem Ubuntu 12.04 Server haben wir Logrotate 3.7.8, das einwandfrei läuft. Es geht in das var/app-name/log/Verzeichnis und dreht alle aus Protokolldateien

Aber auf dem Ubuntu 14.04 Server haben wir Logrotate 3.8.7, das die Logfiles für unsere Anwendung nicht dreht.

Wenn ich das über debugge sudo logrotate -d -f /etc/logrotate/.conf debugge, erhalte ich die folgende Ausgabe:

Ignoring /etc/logrotate.d/app-name because the file owner is wrong (should be root).

Dem Code nach zu urteilen, scheint diese Änderung für den Release-Stream 3.8.x hinzugefügt worden zu sein: https://github.com/demands/logrotate/commit/b8ce386a969c60e5c8ee78023c24a1ba0aab1526

Wenn ich den Besitzer der Datei ändere, auf die ein Link verweist /var/app-name/config/logrotate aufroot , funktioniert sie wieder. Da diese Datei jedoch Teil meiner Anwendung ist und mit dem Capistrano-Bereitstellungsframework erstellt wurde, das wir in diesem Zustand verwenden, möchte ich lieber nicht den Besitz ändern, wenn es früher einwandfrei funktioniert hat.

Werden symbolisch verknüpfte Konfigurationsdateien von logrotate empfohlen / unterstützt?

Und wenn ja, sollte es deployerabgelehnt werden, meine Datei (im Besitz von ) zu verwenden, die mit dem Symbol verknüpft ist/etc/logrotate.d Verzeichnis ist, als Fehler angesehen werden?

Oder gibt es einen anderen empfohlenen Ansatz für die anwendungsspezifische Protokollrotation?

(auch bei Unix StackExchange gefragt )

Phantomwal
quelle
Gute Frage! Ich sehe, dass es später einige Diskussionen darüber gab, ob der Benutzername "root" anstelle von "uid == 0" verwendet werden soll, aber das hat auch nicht die Frage aufgeworfen, warum Root-Besitz erforderlich ist.
Am

Antworten:

6

Das Problem ist, dass eine logrotate-Konfigurationsdatei jeden Befehl als root ausführen kann (mit Zeilengruppen vor / nach dem Drehen). Aus diesem Grund würden Sie Ihrem deployerBenutzer effektiv Root-Rechte gewähren, indem Sie ihm Schreibzugriff auf Dateien in gewähren/etc/logrotate.d/ . Also nein, es ist kein Fehler.

Wenn Sie Ihrem Deployer-Benutzer vertrauen, können Sie das Problem vermutlich lösen, indem Sie ihm Sudo-Rechte zum Kopieren von Dateien erteilen /etc/logrotate.d/. Vorausgesetzt natürlich, der Deployer-Benutzer ist nicht derselbe Benutzer, als der die Web-App ausgeführt wird.

pelle
quelle
Unser Ansatz war es immer, Symlinks von Verzeichnissen außerhalb der Anwendung in Anwendungsdateien zu erstellen, sodass bei jeder Bereitstellung nicht nur die neue Anwendung, sondern auch alle Änderungen an der Konfigurationsdatei veröffentlicht werden. Selbst wenn Sie dem Deployer die Berechtigung geben, Code außerhalb des Anwendungsverzeichnisses bereitzustellen, verstößt dies gegen diesen Ansatz - aber auch, wenn Sie eine Anwendungsdatei als Root-Benutzer nach der Bereitstellung angeben müssen, ist dies eine schlechte Sache. Möglicherweise funktioniert der ursprüngliche Ansatz mit Logrotate 3.8.0+
Phantomwal
2
@phantomwhale Ihr ursprünglicher Ansatz gab Ihrem Bereitstellungsbenutzer implizit alle Root-Rechte. Das ist nicht neu in Logrotate 3.8. Wenn Sie die Rechte des Deployers einschränken möchten, ohne die Konfiguration zu aktualisieren, müssen Sie meines Erachtens etwas anderes als logrotate verwenden.
Pelle
2

Mir ist klar, dass ich zu spät zur Party komme, aber ich hatte ein ähnliches Problem und dachte, ich würde meine Lösung teilen.

Meine Probleme begannen, als logrotateich die von mir geschriebene Konfiguration nicht lesen konnte. Ich wollte keine neuen Konfigurationen in einem Ordner bereitstellen, der root gehört, da der Bereitstellungsbenutzer keinen Rootzugriff auf irgendetwas haben soll .

Zuerst habe ich versucht, logrotateals Bereitstellungsbenutzer auszuführen , aber er hat sich über den Zugriff auf die Statusdatei unter beschwert /var/lib/logrotate/state. Dann habe ich die Manpage gelesen. Sie können die verwendete Statusdatei angeben logrotate! Daher schien es mir eine bessere Lösung zu sein, einen täglichen Cron für die Ausführung einzurichtenlogrotate als Bereitstellungsbenutzer mit einer benutzerdefinierten Statusdatei ausgeführt wird. Auf diese Weise benötigt der Bereitstellungsbenutzer oder die Anwendung keinen Root-Zugriff.

So legen Sie die Statusdatei fest:

logrotate --state /path/to/status /path/to/custom_logrotate.conf

Jetzt können Sie logrotate als jeder Benutzer und Konfigurationseigentümer ausführen, den Sie mögen!

dayer4b
quelle