Де програми користувальницького простору повинні зберігати свої журнали?


23

Я пишу сценарій, який хочу запустити без пільг. Я хочу, щоб помилки, з якими стикається сценарій, були записані в якийсь файл журналу. У мене немає привілеїв, щоб писати одну /var/log. І я не хочу, щоб його було в домашньому довіднику.

Чи є місце, де сценарії простору користувача можуть записувати інформацію про час виконання? Яка найкраща практика використовувати інформацію мого сценарію /var/logбез створення будь-яких можливих проблем із безпекою? Я вагаюся встановити uid / gid на сценарій.

Відповіді:


8

Ви не можете писати в / var / log як звичайний користувач, але демон syslog зробить це за вас, якщо ви запитаєте. Якщо ви хочете записувати повідомлення до стандартних системних журналів (наприклад /var/log/syslog), у loggerвашій системі може бути доступна утиліта 4.4BSD . Він встановлений за замовчуванням на Debian і знаходиться в bsdutilsпакеті похідних Debian.

Ви отримаєте перевагу від усіх наявних інструментів повороту, обслуговування та моніторингу журналу, з недоліком необхідності привілеїв для читання системних журналів та змішування повідомлень сценарію із повідомленнями інших програм.

$ logger Hello
$ echo Goodbye | logger
$ sudo tail -2 /var/log/syslog
Feb 19 21:16:15 debian-host jander: Hello
Feb 19 21:16:21 debian-host logger: Goodbye

Є кілька варіантів конфігурації; ви можете прочитати більше в man logger.


чи існують мовні прив’язки для цієї утиліти? Краще не створюватимуть підпроцеси для кожного рядка stdout у додатку.
ThorSummoner

@ThorSummoner: Як говорить відповідь Гілла, syslogце звичайна бібліотека С, і C ++ може викликати будь-який C за допомогою extern "C". Інші мови часто забезпечують або загальне прив'язування до чого-небудь С, або прив'язку до конкретних речей, але це залежить від мови.
dave_thompson_085

12

Якщо ви як звичайний користувач вирішили запустити програму, природне місце для її журналів знаходиться у вашому домашньому каталозі. Ваш домашній каталог призначений для вас, щоб зберігати всі ваші файли, будь то журнали програми, яку ви запускаєте, або щось інше.

Якщо програма виконується як частина системи, працює як типово виділений користувач системи, то природне місце для її журналів знаходиться /var/log. Створіть підкаталог /var/log/myappі надайте йому відповідні дозволи, щоб ваша програма могла писати туди.

Якщо це доречно і ваша операційна система це дозволяє, позначте файл журналу як додаток. Це може зробити тільки корінь. Це має перевагу в тому, що якщо ваша програма порушена, вона не зможе стерти минулі журнали, що може бути дуже корисно для криміналістичного аналізу компромісу. Вам потрібно буде втручання root для обертання журналу: chownщоб файл журналу більше не можна було відкривати програмою, renameфайл журналу, створити новий файл лише для додавання з відповідним правом власності, а потім повідомити програму про відкриття нового порожнього файлу .

Ви можете зробити будь-який журнал додатків в системні журнали по телефону logger(1)або syslog(3).


4

Як правило, для демона файл журналу створюється, rootтоді дозволи змінюються, щоб непривілейований користувач міг писати на нього. logrotateпотім встановлюється для збереження дозволів під час обертання.

Якщо це команда, а не демон, то увійдіть до /tmp(бажано використовуючи mktemp) та повідомте користувача, STDOUTкуди пішов журнал.


Гарна ідея. У моєму ~ / .profile є кілька рядків, які перевіряють, чи працює демон вікна, і запускає його, якщо його немає. Я розглядав можливість додавання, &щоб уникнути затримки підказки, але стартовий дропбокс записує на консоль. В даний час я переспрямовую його на вихід /dev/null, але хотів би мати якийсь спосіб налагодження, якщо папка не вдається запустити.
Лорд Лох.

1
Перевірте daemonize.
bahamat

Тільки щоб знати, "дозволи змінюються, щоб непривілейований користувач міг писати на нього". це робиться просто chmod 666? чи мені потрібно додати користувача до групи чи щось подібне?
Лорд Лох.

Краще під / var / tmp, / tmp не гарантується, щоб пережити завантаження.
vonbrand

@LordLoh .: Так, с chmod. Зазвичай 0644або 0664і власність користувача / групи також змінюється на власність демона, який, як очікується, буде писати на нього.
bahamat

3

Я перебуваю під враженням, що програми користувальницького простору, як очікується, відкинуть журнали за замовчуванням. Я бачив, як різні програми скидають журнали, де б вони не хотіли, і це ніколи не особливо вітається в моїх системах; прагнуть нарощуватись у якомусь місці, яке ніколи не помічається, якщо / поки воно не стане величезним.

Я вважаю за краще, якби для них було певне місце, я розігруюсь у своїй системі, намагаючись знайти для них стабільне місце.

Моя перша ідея полягала в тому, щоб використовувати /var/run/user/$UID/log, але виявив, що в моїй системі, це кріплення TMPFS, недостатньо велике або дійсно добре для використання з журналами.

Створіть для них місце

Оскільки я не розумію / var / run / user досить добре, щоб інтегруватися з ним, я вибрав емуляцію вручну для користувача 1000.

# mkdir /var/log/user
# install -d /var/log/user/1000 --owner 1000 -g 1000 -m 0700

Я рекомендую дотримуватися FHS / var / log spc для структури в цій папці, але специфікація вільної форми, тому не дуже багато цього потрібно виконувати.

Logrotate Config

У цій директорії, що надається вашою системою, немає повороту журналу, я рекомендую створити його для вашої системи:

# /etc/logrotate.d/userlogs

/var/log/user/*/log/*.log 
/var/log/user/*/log/**/*.log
{
        daily
        missingok
        rotate 7
        compress
        notifempty
        nocreate
}

Нижче наведено попереднє повідомлення / var / run / user / 1000 / журнал, я не можу рекомендувати його, якщо ви дійсно не знаєте, чим займаєтесь (І якщо ви це зробите, скажіть мені, як це зробити!)

можливо, як слід, але я просто придумав це, бо це мало сенс для мене.

/var/run/user/1000/log/<app>.log
/var/run/user/1000/log/<app>/<context>.log

Інтеграція з / var / log / user / 1000:

# Integrate with above /var/run/user, probably a bad idea:
# ln -s /var/log/user/1000/ /var/run/user/1000/log

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.