1 什么是syslogd
syslogd可以简单地被称为记录系统活动的一个daemons。比如可以记录谁,在什么时间,在哪里,做了什么事情;也可以记录你的系统曾经发生过什么事情,比如什么时候重新引导过、软硬件的错误信息等;当然也记录着您系统上运行着的服务的信息。
很多时候,有朋友上来就问,“我的X不能启动了是怎么回事啊?!”问号和叹号这样使用在语文规范上是不允许的,但是我们可以获知,他的心情是急迫的。可是为什么您不先考虑一下您做了什么更改,为什么不先看看是否有错误输出,为什么不看看日志文件?起码,日志为解决问题提供了很好的参考啊。很多人讲自己的某个设备不工作,dmesg的信息您是否认真参考了?
syslogd做的是琐碎的工作,但却是相当重要的工作。很多朋友为了提高系统的性能,节省那一点点资源就决定把这个daemons停掉。我认为,这是不可取的。
syslogd记录的日志一般在/var/log/下,当然也有存储在另外的服务器上的。因为syslogd记录的信息实在是太重要了,所以还要涉及日志安全的问题。
一般系统中日志信息:
代码:
/var/log/secure: 记录系统的安全信息,比如ssh、ftp、pop3等;
/var/log/wtmp: 记录谁曾经登陆过系统,由于本日志被编码过,所以可以用utmpdump命令使这个文件变成可读格式。
/var/log/boot.log: 顾名思义,记录开启或者关闭系统及武夫的信息;
/var/log/message:系统发生的错误信息都会记录在这个日志中,比如iptables中你使用log功能的日志;
/var/log/mail:
/var/log/httpd/
/var/log/mysqld.d 等,记录的就是这些服务的日志。
2 什么是klogd
klogd 守护进程获得并记录 Linux 内核信息。通常,syslogd 会记录 klogd 传来的所有信息,然而,如果调用带有 -f filename 变量的 klogd 时,klogd 就在 filename 中记录所有信息,而不是传给 syslogd。当指定另外一个文件进行日志记录时,klogd 就向该文件中写入所有级别或优先权。Klogd 中没有和 /etc/syslog.conf 类似的配置文件。使用 klogd 而避免使用 syslogd 的好处在于可以查找大量错误。如果有人入侵了内核,使用 klogd 可以修改错误。
其命令行语法如下:
klogd [ -f file ] [ -iI ] [ -n ] [ -o ] [ -p ] [ -s ] [ -k file ] [ -v ] [ -x ] [ -2 ]
命令行参数说明:
-f file
将日志直接记录到指定的file中,而不是转发到 syslogd 进程。
-i
-I
要求当前正在运行的 klogd 守护进程重新装载内核符号表。
-i 用于让守护进程重新装载内核模块符号。
-I 用于让守护进程重新装载静态内核符号和内核模块符号。
-n
禁止自动后台运行,在 klogd 由 init 启动并直接被 init 控制的情况下必须使用此开关。
-o
klogd 在读取并记录所有内核消息缓冲区中的消息之后立即退出(不作为守护进程)。
-p
只要 klogd 检测到内核消息流中包含了一个 Oops 字符串,那么就重新加载内核符号表。
-s
可以通过两个途径获取内核消息: /proc 文件系统和 sys_syslog 系统调用接口。虽然两者本质上完全等价,但 klogd 会优先使用 /proc/kmsg 文件。这个开关则强制 klogd 使用系统调用获取内核消息。
-k file
将指定的 file 作为内核符号表文件,也就是System.map文件的位置。
-v
打印版本信息后退出。
-x
忽略 EIP 转换信息,这样就不需要读取 System.map 文件。
-2
当展开符号时打印两行,一行将地址转换为符号,一行是原始文本。这样就允许一些外部程序(比如ksymoops)在原始数据上做一些处理。
消息转发
如果 klogd 将内核消息转发给 syslogd 进程,那么它可以分拣出某些特定的消息。原始内核消息的格式如下:
<[0-7]>Something said by the kernel.
尖括号中的数字表示内核消息的优先级,这些数字的定义位于 kernel.h 文件中。当 klogd 收到内核消息之后,将会读取这个数字,并在将此消息转发给 syslogd 时按照这个数字分配适当的优先级。
如果使用 -f 将内核消息直接记录到特定的文件中,那么这条消息将保持原样。
内核地址解析
klogd 会尝试将内核地址解析为对应的符号,如果你想得到原始的地址信息,那么可以使用"-2"开关。如果没有使用"-k"选项,那么将会依次尝试下面的路径:
/boot/System.map
/System.map
/usr/src/linux/System.map
因为内核模块动态加载所以地址并不固定,这时就要使用"-i"/"-I"通知 klogd 内核模块的变化。这两个开关都将导致当前正在运行的 klogd 守护进程重新加载内核符号表。应当在每一次加载或者卸载内核模块后立即运行下列命令:
klogd -i
-p 开关也可以用于更新内核符号表。它会让 klogd 在检测到保护性错误的时候重新加载内核符号表。使用这个开关需要小心,因为操作系统在出现保护性错误(protection fault)的时候已经变得不稳定了,而 klogd 必须执行系统调用才能重新装载内核符号表,所以这样做可能会导致更糟糕的结果。
控制台日志等级
内核默认的控制台日志等级是"7"(debug),也就是等级数字小于等于6的消息(优先级更高)都会显示在控制台上。这些不同等级所代表的意思位于 kernel.h 文件内,这个包内的 syslog.h 中也有一份拷贝。可以使用 sysctl 来指定控制台日志等级,这通常是在 /etc/sysctl.conf 文件中设置的,比如下面这一行:
kernel.printk = 4 4 1 7
就是把内核的控制台日志等级设为了"4"。
信号处理
klogd 可以响应8种信号: SIGHUP, SIGINT, SIGKILL, SIGTERM, SIGTSTP, SIGUSR1, SIGUSR2, SIGCONT 。SIGINT, SIGKILL, SIGTERM, SIGHUP 信号会让进程优雅的正常退出。SIGTSTP 信号会让进程停止记录日志并进入休眠状态;SIGCONT 信号会让处于休眠状态的进程重新开始记录日志。组合使用 SIGSTOP 和 SIGCONT 可以在不退出进程的情况下切换日志消息的来源。比如需要卸载 /proc 文件系统的时候,可以使用下面的命令:
# kill -TSTP pid
# umount /proc
# kill -CONT pid
SIGUSR1 和 SIGUSR2 用于加载/重新加载内核符号表。SIGUSR1 表示重新加载内核模块的符号信息;SIGUSR2 表示同时重新加载模块和静态内核的符号信息。如果 System.map 文件位置正确,那么 SIGUSR1 信号将非常有用。特别是在内核模块改变的时候。
3 什么是auditd
默认情况下,审核在内核中被禁用。但是,当安装了 auditd 软件后,运行这个软件将会启动审核守护进程(auditd)。
当 auditd 运行的时候,审核信息会被发送到一个用户配置日志文件中(默认的文件是 /var/log/audit/audit.log)。如果 auditd 没有运行,审核信息会被发送到 syslog。这是通过默认的设置来把信息放入 /var/log/messages。如果审核子系统没有被启用,没有审核信息会被产生。
这些审核信息包括了 SELinux AVC 信息。以前,AVC 信息会被发送到 syslog,但现在会被审核守护进程发送到审核日志文件中。
要完全在内核中禁用审核,在启动的时候使用 audit=0 参数。您还需要使用 chkconfig auditd off 2345 来关闭 auditd。您可以在运行时使用 auditctl -e 0 来在内核中关闭审核。
审核守护进程(auditd)从内核的 audit netlink 接口获取审核事件数据。auditd 的配置会不尽相同,如输出文件配置和日志文件磁盘使用参数可以在 /etc/auditd.conf 文件中配置。请参阅 auditd(8) 和 auditd.conf(5) 说明书页来获得详悉的信息。请注意,如果您设置您的系统来进行 CAPP 风格的审核,您必须设置一个专用的磁盘分区来只供 audit 守护进程使用。这个分区应该挂载在 /var/log/audit。
系统管理员还可以使用 auditctl 工具程序来修改 auditd 守护进程运行时的审核参数、syscall 规则和文件系统的查看。它包括了一个 CAPP 配置样本,您可以把它拷贝到 /etc/audit.rules 来使它起作用。