Logrotate tidak lagi membaca file konfigurasi yang dikaitkan karena kepemilikan non-root

15

Kami saat ini meningkatkan dari Ubuntu 12,04 LTS ke 14,04 LTS pada server aplikasi ruby ​​on rails kami, dan telah memperhatikan bahwa file log tidak lagi berputar.

Di kedua mesin kami memiliki file yang /var/app-name/config/logrotatedimiliki oleh pengguna unix kami deployeryang berisi file logrotate yang valid sebagai berikut:

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

Ini kemudian dihubungkan ke /etc/logrotate.d/direktori sebagaiapp-name

Pada server Ubuntu 12.04 kami, kami memiliki logrotate 3.7.8 yang berjalan dengan baik. Ini masuk ke var/app-name/log/direktori dan memutar semua file log

Tetapi pada server Ubuntu 14.04 kami memiliki logrotate 3.8.7 yang tidak memutar file log untuk aplikasi kami.

Ketika saya men-debug ini melalui sudo logrotate -d -f /etc/logrotate/.confsaya mendapatkan output berikut:

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

Mengejar ini dalam kode, tampaknya perubahan ini ditambahkan untuk aliran rilis 3.8.x: https://github.com/demands/logrotate/commit/b8ce386a969c60e5c8ee78023c24a1ba0aab1526

Jika saya mengubah kepemilikan file yang disinkronkan /var/app-name/config/logrotateke rootmaka mulai berfungsi lagi. Tetapi mengingat file ini adalah bagian dari aplikasi saya, dan dibuat oleh kerangka kerja penyebaran capistrano yang kami gunakan di negara ini, saya lebih suka tidak perlu mengubah kepemilikannya, ketika dulu berfungsi dengan baik.

Jadi, apakah file konfigurasi symlinked direkomendasikan / didukung oleh logrotate?

Dan jika demikian, haruskah penolakan untuk menggunakan file saya (dimiliki oleh deployer) yang disinkronkan ke /etc/logrotate.ddirektori, dilihat sebagai bug?

Atau apakah ada pendekatan lain yang disarankan untuk rotasi log khusus aplikasi?

(juga ditanya tentang unix StackExchange )

hantu phantom
sumber
Pertanyaan bagus! Saya melihat bahwa ada beberapa diskusi kemudian tentang memeriksa terhadap nama pengguna "root" bukan uid == 0, tetapi juga tidak memicu pertanyaan mengapa kepemilikan root diperlukan.
agtoever

Jawaban:

6

Masalahnya adalah bahwa file konfigurasi logrotate dapat menjalankan perintah apa pun sebagai root (menggunakan bait prerotate / postrotate). Oleh karena itu, Anda secara efektif akan memberikan deployerhak root pengguna Anda dengan memberikannya akses tulis ke file di /etc/logrotate.d/. Jadi tidak, ini bukan bug.

Jika Anda mempercayai pengguna penempatan Anda, maka saya kira Anda bisa menyelesaikan masalah dengan memberikannya hak sudo untuk menyalin file /etc/logrotate.d/. Dengan asumsi, tentu saja, bahwa pengguna penyebar tidak sama dengan yang dijalankan oleh aplikasi web.

pelle
sumber
Pendekatan kami selalu untuk lebih memilih untuk symlink dari direktori eksternal ke aplikasi ke file aplikasi, sehingga setiap penyebaran tidak hanya mendorong keluar aplikasi baru, tetapi juga perubahan file konfigurasi. Bahkan memberikan hak pada para pengguna untuk menyebarkan kode di luar direktori aplikasi melanggar pendekatan ini - tetapi sama-sama harus menandai file aplikasi menjadi root yang dimiliki pasca-penyebaran terasa seperti hal yang buruk (tm) juga. Mungkin karena itu pendekatan asli tidak dapat lagi bekerja dengan baik dengan logrotate 3.8.0+
phantomwhale
2
@ phantomwhale Pendekatan orisinal Anda secara implisit memberikan hak root penuh kepada pengguna penempatan Anda. Itu bukan hal baru dalam logrotate 3.8. Jika Anda ingin membatasi hak-hak penggunaan sementara masih memperbolehkannya untuk memperbarui konfigurasi, maka saya pikir Anda perlu menggunakan sesuatu selain logrotate.
pelle
2

Saya menyadari bahwa saya agak terlambat ke pesta, tetapi saya memiliki masalah yang sama dan berpikir saya akan membagikan solusi saya.

Masalah saya mulai ketika logrotatetidak mau membaca konfigurasi yang saya tulis. Saya tidak ingin menyebarkan konfigurasi baru ke folder yang dimiliki oleh root karena saya tidak ingin pengguna menyebarkan memiliki akses root ke apa pun .

Pada awalnya saya mencoba untuk menjalankan logrotatesebagai pengguna penyebaran, tetapi mengeluh tentang memiliki akses ke file negara di /var/lib/logrotate/state. Lalu saya membaca halaman manual. Anda dapat menentukan file status yang logrotatedigunakan! Jadi, sepertinya solusi yang lebih baik bagi saya untuk mengatur cron harian untuk dieksekusi logrotatesebagai pengguna penyebaran dengan file status kustom. Dengan cara ini, tidak ada akses root diperlukan oleh pengguna menyebarkan atau aplikasi.

Inilah cara Anda menentukan file status:

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

Sekarang Anda dapat menjalankan logrotate sebagai sembarang pengguna dan pemilik konfigurasi yang Anda sukai!

dayer4b
sumber