Di mana program userspace seharusnya menyimpan log mereka?

23

Saya menulis skrip yang ingin saya jalankan tanpa hak istimewa. Saya ingin kesalahan yang ditemukan skrip untuk dicatat ke beberapa file log. Saya tidak punya hak untuk menulis satu /var/log. Dan saya tidak ingin memilikinya di direktori home saya.

Apakah ada lokasi di mana skrip userspace dapat mencatat informasi runtime? Apa praktik terbaik untuk mendapatkan informasi log skrip saya /var/logtanpa membuat masalah keamanan potensial? Saya ragu untuk mengatur uid / gid pada skrip.

Tuan Loh.
sumber

Jawaban:

8

Anda tidak dapat menulis ke / var / log sebagai pengguna normal, tetapi daemon syslog akan melakukannya untuk Anda jika Anda bertanya. Jika Anda ingin mencatat pesan ke log sistem standar (mis. /var/log/syslog), Utilitas 4.4BSD loggermungkin tersedia di sistem Anda. Ini diinstal secara default pada Debian, dan ada dalam bsdutilspaket pada turunan Debian.

Anda akan mendapatkan keuntungan dari setiap rotasi log yang sudah ada, pemeliharaan, dan alat pemantauan, dengan kekurangan membutuhkan hak istimewa untuk membaca log sistem, dan memiliki pesan skrip Anda dicampur dengan pesan dari program lain.

$ 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

Ada beberapa opsi konfigurasi yang tersedia; Anda dapat membaca lebih lanjut di man logger.

Jander
sumber
apakah ada ikatan bahasa untuk utilitas ini? Lebih suka tidak menelurkan sub-proses untuk setiap baris stdout dalam aplikasi.
ThorSummoner
@ThorSummoner: Seperti yang dikatakan Gilles, syslogadalah rutin pustaka C, dan C ++ dapat memanggil C apa pun menggunakan extern "C". Bahasa lain sering memberikan pengikatan generik pada apa pun C, atau mengikat pada hal-hal tertentu, tetapi itu tergantung pada bahasanya.
dave_thompson_085
12

Jika Anda sebagai pengguna biasa memutuskan untuk menjalankan suatu program, tempat alami untuk log-nya ada di direktori home Anda. Direktori rumah Anda dimaksudkan untuk menyimpan semua file Anda, apakah itu log dari program yang Anda jalankan atau apa pun.

Jika program dijalankan sebagai bagian dari sistem, berjalan sebagai pengguna sistem khusus, maka tempat alami untuk log-nya adalah masuk /var/log. Buat subdirektori /var/log/myappdan berikan izin yang sesuai sehingga aplikasi Anda dapat menulis di sana.

Jika relevan dan sistem operasi Anda mengizinkannya, tandai file log sebagai append-only. Hanya root yang bisa melakukan ini. Ini memiliki keuntungan bahwa jika aplikasi Anda dikompromikan, itu tidak akan dapat menghapus log sebelumnya, yang dapat sangat berguna untuk analisis forensik kompromi. Anda akan memerlukan intervensi root untuk memutar log: chownsehingga file log tidak lagi dapat dibuka oleh aplikasi, renamefile log, buat file append-only baru dengan kepemilikan yang sesuai, kemudian beri tahu aplikasi untuk membuka file kosong yang baru. .

Anda dapat membuat log aplikasi apa pun ke log sistem dengan menelepon logger(1)atau syslog(3).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
4

Secara umum untuk daemon file log dibuat pada rootsaat itu izin diubah sehingga pengguna yang tidak memiliki hak istimewa dapat menulis untuk itu. logrotatekemudian diatur untuk mempertahankan izin selama rotasi.

Jika itu adalah perintah, bukan daemon, maka masuklah /tmp(lebih disukai menggunakan mktemp) dan beri tahu pengguna melalui STDOUTtempat log itu pergi.

bahamat
sumber
Ide bagus. Saya memiliki beberapa baris di profil ~ /. Saya yang memeriksa untuk melihat apakah demon dropbox berjalan dan memulainya jika tidak. Saya sedang mempertimbangkan menambahkan sebuah &untuk menghindari mengangkat prompt, tetapi mulai menulis dropbox ke konsol. Saat ini saya sedang mengarahkan kembali outputnya /dev/null, tetapi ingin memiliki beberapa cara untuk debug jika dropbox gagal memulai.
Tuan Loh.
1
Lihat daemonize.
bahamat
Sekadar tahu, "izin diubah sehingga pengguna yang tidak memiliki hak istimewa dapat menulis ke sana." Apakah ini dilakukan hanya dengan chmod 666? atau apakah saya harus menambahkan pengguna ke grup atau sesuatu seperti itu?
Tuan Loh.
Lebih baik di bawah / var / tmp, / tmp tidak dijamin untuk bertahan boot.
vonbrand
@ LordLoh .: Ya, dengan chmod. Biasanya 0644atau 0664dan kepemilikan pengguna / grup juga diubah ke daemon yang diharapkan akan ditulis untuk itu.
bahamat
3

Saya mendapat kesan bahwa program userspace diharapkan untuk membuang log secara default. Saya telah melihat berbagai program membuang log di mana pun mereka suka, dan itu tidak pernah disambut dengan baik di sistem saya; cenderung membangun di beberapa lokasi yang tidak pernah diperhatikan kecuali / sampai menjadi besar.

Saya lebih suka jika ada tempat yang pasti untuk mereka, saya bermain-main di sistem saya mencoba mencari tempat yang stabil untuk mereka.

Ide pertama saya adalah menggunakan /var/run/user/$UID/log, tetapi menemukan bahwa di sistem saya, itu adalah TMPFS mount, tidak cukup besar, atau benar-benar bagus untuk digunakan dengan log.

Buat tempat untuk mereka

Karena saya tidak mengerti / var / run / pengguna dengan cukup baik untuk diintegrasikan dengannya, saya memilih untuk menirunya dengan tangan, untuk pengguna 1000.

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

Saya akan merekomendasikan menempel pada FHS / var / log spc untuk struktur dalam folder ini, tetapi spec-form jadi tidak ada banyak untuk mematuhi.

Logrotate Config

Tidak ada rotasi log yang ada pada direktori ini yang disediakan oleh sistem Anda, saya sarankan membuat satu untuk sistem Anda:

# /etc/logrotate.d/userlogs

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

Di bawah ini adalah postingan / var / run / user / 1000 / log saya sebelumnya, saya tidak bisa merekomendasikan hal ini kecuali Anda benar-benar tahu apa yang Anda lakukan (Dan jika Anda tahu, beritahu saya caranya juga!)

mungkin sebagai berikut, tetapi saya hanya mengada-ada karena itu masuk akal bagi saya.

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

Integrasikan dengan / 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

ThorSummoner
sumber