Logrotate artık kök olmayan sahiplik nedeniyle sembolize edilmiş yapılandırma dosyasını okumuyor


15

Şu anda Ubuntu 12.04 LTS'den ruby ​​on rails uygulama sunucularımızda 14.04 LTS'ye yükseltiyoruz ve günlük dosyalarının artık dönmediğini fark ettik.

Her iki makinede de , aşağıdaki gibi geçerli bir logrotate dosyası içeren /var/app-name/config/logrotateunix kullanıcısına ait bir dosya var deployer:

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

Bu daha sonra /etc/logrotate.d/dizine şu şekilde bağlanır:app-name

Ubuntu 12.04 sunucumuzda gayet iyi çalışan 3.7.8 logrotate var. var/app-name/log/Dizine gider ve tüm günlük dosyalarını döndürür

Ancak Ubuntu 14.04 sunucusunda, uygulama için günlük dosyalarını döndürmeyen 3.8.7 logrotate var.

Bu hata ayıklama zaman sudo logrotate -d -f /etc/logrotate/.confaşağıdaki çıktıyı alıyorum:

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

Bunu kodda takip ederek, bu değişiklik 3.8.x yayın akışı için eklendi gibi görünüyor: https://github.com/demands/logrotate/commit/b8ce386a969c60e5c8ee78023c24a1ba0aab1526

Şunu değiştirirsem dosyanın sahipliğini sembolik olarak /var/app-name/config/logrotateiçin rooto zaman yeniden çalışmaya başlar. Ama bu dosya benim uygulamamın bir parçası olduğu ve bu durumda kullandığımız capistrano dağıtım çerçevesi tarafından oluşturulan göz önüne alındığında, iyi çalışır eskiden sahipliğini değiştirmek zorunda kalmazdım.

Symlinked yapılandırma dosyaları logrotate tarafından öneriliyor / destekleniyor mu?

Ve eğer öyleyse, dizine deployersymlinked olan dosyamı (sahip olunan ) kullanmayı reddetmek /etc/logrotate.dbir hata olarak görülmeli mi?

Veya uygulamaya özgü günlük döndürme için önerilen başka bir yaklaşım var mı?

( unix StackExchange'te de sorulmuştur )


İyi soru! Daha sonra uid == 0 yerine "root" kullanıcı adına karşı kontrol hakkında bazı tartışmaların olduğunu görüyorum , ama aynı zamanda kök sahipliğinin neden gerekli olduğu sorusunu da tetiklemedi.
agtoever

Yanıtlar:


6

Sorun, bir logrotate yapılandırma dosyasının herhangi bir komutu root olarak çalıştırabilmesidir (prerotate / postrotate stanzas kullanarak). Bu nedenle, deployeriçindeki dosyalara yazma erişimi vererek kullanıcı köken ayrıcalıklarınızı etkili bir şekilde vermiş olursunuz /etc/logrotate.d/. Yani hayır, bu bir hata değil.

Dağıtımcı kullanıcısına güveniyorsanız, sanırım sorunu dosyaları kopyalamak için sudo hakları vererek çözebilirsiniz /etc/logrotate.d/. Tabii ki, dağıtıcı kullanıcının web uygulamasının çalıştığı kullanıcıyla aynı olmadığı varsayılmaktadır.


Yaklaşımımız her zaman uygulama dışındaki dizinlerden uygulama dosyalarına sembolik bağlamayı tercih ediyordu, böylece her konuşlandırma sadece yeni uygulamayı değil, aynı zamanda herhangi bir yapılandırma dosyası değişikliğini de içeriyor. Dağıtımcıya, uygulama dizininin dışında kod dağıtma hakkı vermek bile bu yaklaşımı ihlal eder - ancak eşit şekilde dağıtım sonrası kök sahibi olmak için bir uygulama dosyasını seçmek zorunda kalmak da kötü bir şey (tm) gibi hissettirir. Belki de orijinal yaklaşım bu nedenle artık 3.8.0+ logrotate ile iyi çalışamaz
fantomwhale

2
@phantomwhale Orijinal yaklaşımınız, dağıtıcı kullanıcısına tam kök ayrıcalıkları verdi. Logrotate 3.8'de bu yeni bir şey değil. Yine de yapılandırmayı güncellemesine izin verirken dağıtıcının haklarını kısıtlamak istiyorsanız, logrotate dışında bir şey kullanmanız gerektiğini düşünüyorum.
pelle

2

Partiye geç kaldığımı fark ettim, ama benzer bir sorunum vardı ve çözümümü paylaşacağımı düşündüm.

Sorunlarım logrotateyazdığım konfigürasyonu okumadığımda başladı . Konuşlandırma kullanıcısının herhangi bir şeye kök erişimine sahip olmasını istemediğim için root'a ait bir klasöre yeni yapılandırmalar dağıtmak istemedim .

İlk başta logrotatekonuşlandırma kullanıcısı olarak çalıştırmayı denedim , ancak adresindeki durum dosyasına erişmekten şikayet etti /var/lib/logrotate/state. Sonra adam sayfasını okudum. logrotateKullanan durum dosyasını belirtebilirsiniz ! Bu nedenle, logrotateözel bir durum dosyasıyla konuşlandırma kullanıcısı olarak yürütmek için günlük bir cron ayarlamak benim için daha iyi bir çözüm gibi görünüyordu . Bu şekilde konuşlandırma kullanıcısı veya uygulaması için kök erişimine gerek yoktur.

Durum dosyasını şu şekilde belirlersiniz:

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

Artık logrotate'i istediğiniz kullanıcı ve konfigürasyon sahibi olarak çalıştırabilirsiniz!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.