Logrotate không còn đọc tệp cấu hình symlinked do quyền sở hữu không root


15

Chúng tôi hiện đang nâng cấp từ Ubuntu 12.04 LTS lên 14.04 LTS trên máy chủ ứng dụng ruby ​​trên đường ray và nhận thấy rằng các tệp nhật ký không còn quay.

Trên cả hai máy, chúng tôi có một tệp /var/app-name/config/logrotatethuộc sở hữu của người dùng unix deployerchứa tệp logrotate hợp lệ như sau:

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

Điều này sau đó được liên kết vào /etc/logrotate.d/thư mục nhưapp-name

Trên máy chủ Ubuntu 12.04 của chúng tôi, chúng tôi có logrotate 3.7.8 chạy tốt. Nó đi vào var/app-name/log/thư mục và xoay tất cả các tệp nhật ký

Nhưng trên máy chủ Ubuntu 14.04, chúng tôi có logrotate 3.8.7 không quay các logfiles cho ứng dụng của chúng tôi.

Khi tôi gỡ lỗi này thông qua sudo logrotate -d -f /etc/logrotate/.conftôi nhận được đầu ra sau:

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

Theo đuổi mã này, có vẻ như thay đổi này đã được thêm vào luồng phát hành 3.8.x: https://github.com/demands/logrotate/commit/b8ce386a969c60e5c8ee78023c24a1ba0aab1526

Nếu tôi thay đổi quyền sở hữu của tệp được liên kết /var/app-name/config/logrotatevới nhau rootthì nó sẽ bắt đầu hoạt động trở lại. Nhưng với tệp này là một phần của ứng dụng của tôi và được tạo bởi khung triển khai capistrano mà chúng tôi sử dụng ở trạng thái này, tôi không phải thay đổi quyền sở hữu, khi nó được sử dụng để hoạt động tốt.

Vì vậy, các tập tin cấu hình symlinked được đề xuất / hỗ trợ bởi logrotate?

Và nếu vậy, có nên từ chối sử dụng tệp của tôi (thuộc sở hữu deployer) được liên kết vào /etc/logrotate.dthư mục, có bị coi là một lỗi không?

Hoặc có một cách tiếp cận được đề xuất cho xoay vòng nhật ký dành riêng cho ứng dụng?

(cũng được hỏi trên unix StackExchange )


Câu hỏi hay! Tôi thấy rằng sau đó đã có một số cuộc thảo luận về việc kiểm tra tên người dùng "root" thay vì uid == 0, nhưng điều đó cũng không kích hoạt câu hỏi tại sao cần phải có quyền sở hữu root.
bất cứ lúc nào

Câu trả lời:


6

Vấn đề là một tệp cấu hình logrotate có thể chạy bất kỳ lệnh nào dưới dạng root (sử dụng sterotate / postrotate stanzas). Do đó, bạn thực sự sẽ cung cấp cho deployerngười dùng quyền root của mình bằng cách cấp cho nó quyền truy cập vào tệp /etc/logrotate.d/. Vì vậy, nó không phải là một lỗi.

Nếu bạn tin tưởng người dùng triển khai của mình, thì tôi đoán bạn có thể giải quyết vấn đề bằng cách cấp cho nó quyền sudo để sao chép tệp vào /etc/logrotate.d/. Tất nhiên, giả sử rằng người dùng triển khai không phải là người dùng giống như ứng dụng web đang chạy.


Cách tiếp cận của chúng tôi luôn là ưu tiên liên kết từ các thư mục bên ngoài ứng dụng vào các tệp ứng dụng, sao cho mỗi lần triển khai không chỉ đẩy ứng dụng mới ra mà còn thay đổi bất kỳ tệp cấu hình nào. Ngay cả việc trao cho người triển khai quyền triển khai mã bên ngoài thư mục ứng dụng cũng vi phạm cách tiếp cận này - nhưng cũng phải chau chuốt một tệp ứng dụng để được sở hữu sau khi triển khai cũng cảm thấy như một điều tồi tệ (tm). Có lẽ cách tiếp cận ban đầu do đó không còn có thể hoạt động độc đáo với logrotate 3.8.0+
ph Phantomwhale

2
@ph Phantomwhale Cách tiếp cận ban đầu của bạn đã ngầm cung cấp cho người dùng nhà triển khai của bạn toàn quyền root. Điều đó không mới trong logrotate 3.8. Nếu bạn muốn hạn chế quyền của nhà triển khai trong khi vẫn cho phép nó cập nhật cấu hình, thì tôi nghĩ bạn cần sử dụng một cái gì đó ngoài logrotate.
pelle

2

Tôi nhận ra rằng tôi đến muộn trong bữa tiệc, nhưng tôi cũng gặp vấn đề tương tự và nghĩ rằng tôi sẽ chia sẻ giải pháp của mình.

Vấn đề của tôi bắt đầu khi logrotatekhông đọc được cấu hình mà tôi đã viết. Tôi không muốn triển khai các cấu hình mới vào một thư mục do root sở hữu vì tôi không muốn người dùng triển khai có quyền truy cập root vào bất cứ thứ gì .

Lúc đầu, tôi đã cố gắng chạy logrotatenhư người dùng triển khai, nhưng nó phàn nàn về việc có quyền truy cập vào tệp trạng thái tại /var/lib/logrotate/state. Sau đó tôi đọc trang người đàn ông. Bạn có thể chỉ định tệp trạng thái logrotatesử dụng! Vì vậy, nó có vẻ là một giải pháp tốt hơn đối với tôi để thiết lập một cron hàng ngày để thực thi logrotatenhư người dùng triển khai với một tệp trạng thái tùy chỉnh. Bằng cách này, người dùng triển khai hoặc ứng dụng không cần truy cập root.

Đây là cách bạn chỉ định tệp trạng thái:

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

Bây giờ bạn có thể chạy logrotate như bất kỳ người dùng và chủ sở hữu cấu hình nào bạn muốn!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.