linux 11

来源:互联网 发布:各算法时间复杂度 编辑:程序博客网 时间:2024/05/21 20:27

Oct 2

第18章 认识系统服务(daemons)

18.1.1 daemon的主要分类

按照daemon的启动与管理方式来区分,daemon可以分为两类:

  • stand_alone: 此daemon可以自行单独启动服务。最大的优点是:因为是一直存在内存中并持续地提供服务,因此对于发生客户端的请求时,stand alone的daemon响应速度较快。
  • super daemon: 一个特殊的daemon来统一管理。当没有客户端的请求时,各项服务都是未启动的情况,等到有来自客户端的请求时,super daemon才唤醒相对应的服务。当客户端的请求结束后,被唤醒的这个服务也会关闭并释放系统资源。(所以反应时间会比较慢一点)优点:1. 由于super daemon负责唤醒各项服务,因此super daemon可以具有安全控管的机制,就是类似网络防火墙的功能。2. 由于服务在客户端的连接结束后就关闭,因此不会一直占用资源。

daemon的命名规则
服务的名称在被挂上Linux使用时,通常在服务的名称之后会加上一个d。例如例行性命令的新建at和cron这两个服务,它的程序文件名会被取为atd与crond,这个d代表的就是daemon的意思。

系统上面用什么设置可以让服务与端口号对应在一起呢?
/etc/services
格式如下:
<daemon name> <port/数据包协议> <该服务的说明>
这里写图片描述

显示出目前系统上面所有服务的运行状态:service --status-all

service的语法:

service [service name] (start|stop|restart|...)#service name: 是需要启动的服务名称,需要与/etc/init.d/对应#start|...:即是该服务要进行的工作

super daemon的启动方式:
因为super daemon要管理后续的其他服务,所以它自己要常驻在内存中。所以它自己的启动方式与stand alone是相同的。但是它所管理的其他daemon就不是这样做了,而是在配置文件中设置启动该daemon。

eg, 如何得知super daemon所管理的服务是否有启动呢:
grep -i 'disable' /etc/xinetd.d/*
这里写图片描述

disable = yes 代表取消此项服务的启动。

如果想要启动如上的rsync服务,可以先修改配置文件/etc/xinetd.d/rsync改成disable=no,然后重新启动xinetd这个服务/etc/init.d/xinetd restart。最后查看一下启动的端口:grep 'rsync' /etc/services看看是哪一号。

一个简单的rsync范例设置
vim /etc/xinetd.d/rsync
这里写图片描述

18.3 服务的防火墙管理xinetd, TCP Wrappers

一般来说,系统的防火墙分析主要可以通过数据包过滤或者是通过软件分析,而Linux默认有提供一个软件分析工具,那就是/etc/hosts.deny 和/etc/hosts.allow这两个配置文件。

18.3.1 /etc/hosts.allow, /etc/hosts.deny管理

  • 任何以xinetd管理的服务都可以通过/etc/hosts.allow, / etc/hosts.deny来设置防火墙。通过分析TCP数据包的文件头,查看来源主机的IP和port,并对比/etc/hosts.{allow|deny},就能决定该连接能否进入我们的主机。

什么是防火墙?
- 针对源IP或域进行允许或拒绝的设置,以决定该链接是否能够成功实现连接的一种方式。

基本上只要一个服务受到xinetd管理,或者是该服务的程序支持TCP Wrappers 函数的功能时,那么该服务的防火墙方面的设置就能够以/etc/hosts.{allow,deny}来处理。

那么,如何得知一个服务的程序有没有支持TCP Wrappers呢?
eg.

#测试一下sshd及httpd这两个程序有没支持TCP Wrappers的功能ldd $(which sshd httpd)

这里写图片描述

ldd (library dependency discovery)这个命令可以查询某个程序的动态函数库支持状态。因此可以查出sshd, httpd有无支持tcp wrappers所提供的libwrap.so这个函数库文件。

配置文件语法

<service(program_name)> : <IP,domain, hostname> : <action>

eg.

vim /etc/hosts.denyrsync : 127.0.0.100 127.0.0.200 : deny或者rsync : 127.0.0.100 : denyrsync : 127.0.0.200 : deny#最后的“:deny”是optional的
  • hosts.deny和hosts.allow这两个文件的判断依据是:以/etc/hosts.allow为优先,若分析到的IP或网段并没有记录在/etc/hosts.allow,则以/etc/hosts.deny来判断。

  • 此外,我们还可以使用一些特殊参数在第一及第二个字段喔!内容有:
    ALL: 代表全部的 program_name 或者是 IP 都接受的意思,例如 ALL: ALL: deny
    LOCAL: 代表来自本机的意思,例如: ALL: LOCAL: allow
    UNKNOWN: 代表不知道的 IP 或者是 domain 或者是服务时;
    KNOWN: 代表为可解析的 IP, domain 等等信息时;

18.4 系统开启的服务

  • 如何查询目前系统上面已经启动了的服务?用ps与top!
  • 如何知道该服务启动的port是哪一个?可以直接用netstat直接查看port,也可以帮忙找到该port的进程。

eg 找出目前系统开启的网络服务有哪些: netstat -tulp
这里写图片描述

eg 找出所有的有监听网络的服务(包含socket状态):netstat -lnp
这里写图片描述

18.4.2 设置开机后立即启动服务的方法

Linux 主机是怎么启动的呢?
1. 打开计算机电源,开始读取 BIOS 并进行主机的自我测试;
2. 透过 BIOS 取得第一个可启动装置,读取主要启动区 (MBR) 取得启动管理程序;
3. 通过启动管理程序的配置,取得 kernel 并加载内存且侦测系统硬件;
4. 内核主动调用 init 程序;
5. init 程序开始运行系统初始化 (/etc/rc.d/rc.sysinit)
6. 依据 init 的设置进行 daemon start (/etc/rc.d/rc[0-6].d/*)
7. 加载本机配置 (/etc/rc.d/rc.local)

我们启动linux系统时,可以进入不同的模式,这模式我们成为执行等级(run level)。不同的执行都等级有不同的功能与服务。如,具有X窗口界面的run level 5,纯文本界面run level 3.

  • chkconfig:管理系统服务默认开机启动与否
    eg 列出目前在run level 3为启动的服务:
    chkconfig --list | grep '3:on'
    eg 让atd这个服务在run level为3,4,5时启动:
    chkconfig --level 345 atd on

eg。chkconfig仅是设置开机时默认会启动的服务,所以该服务目前的状态如何是不知道的。

/etc/init.d/httpd status #查看httpd有没有启动chkconfig --list httpd   #查看其有没有默认启动chkconfig httpd on; chkconfig --list httpd #把httpd设置成“开机默认启动”/etc/init.d/httpd status   #再次查看httpd有没启动,发现还是没有启动。(因为我们并没有使用/etc/init.d/httpd start)

eg。查看rsync是否启动,若要将其关闭该如何处理?

/etc/init.d/rsync status#rsync 是super daemon管理的,所以不可以使用stand alone的启动方式来查看。netstat -tlup | grep rsync
  • ntsysv:类图形界面管理模式

重点回顾:
- stand alone daemon启动的脚本放置到/etc/init.d/这个目录中,super daemon的配置文件放在/etc/xinetd.d/*内,而启动的方式则为/etc/init.d/xientd restart
- 立即启动stand alone daemon的方法也可以使用service这个命令。
- super daemon的配置文件/etc/xinetd.conf,个别daemon配置文件则在/etc/xinetd.d/* 内。在配置文件内还可以设置客户端连接与否,具有类似防火墙的功能。
- 可以通过/etc/hosts.{allow,deny}来实现统一管理防火墙功能。
- 若想要设置开机时启动的某个服务,可以通过chkconfig, ntsysv等命令。

情景模拟一:
安装telnet服务:

rpm -q telnet-server #检查是否有安装telnet服务yum install telnet-server #安装telnet服务#查看一下配置文件,看看telnet是stand alone还是super daemon----用chkconfigchkconfig --list telnet>> telnet    off   #-----如果结果只有on或者off者为super daemon

这里写图片描述
由图所示, httpd是stand alone daemon, 而telnet是由super daemon控制的。

ll /etc/xinetd.d/telnet#在xinetd.d里面找到了telnet

这里写图片描述
发现其配置文件在xinetd.d里,说明它是由super daemon控制的个别daemon.

#查看telnet的端口grep '^telnet' /etc/services

这里写图片描述
两种grep方法都可以,我们看到telnet启动的端口是23.

如果想要启动的话,可以:

chkconfig telnet on; chkconfig --list telnet #把telnet设置为开机启动。/etc/init.d/xinetd restart  #然后重启一下xinetdnetstat -tlnp | grep xinetd #用netstat检查一下端口是否开放

4 Oct

第19章 认识与分析日志文件

日志文件就是就是记录系统活动信息的几个文件,例如:何时、何地(来源IP)、何人(什么服务名称)、做了什么操作(信息日志)。

  • Linux常见的日志文件名
    • /var/log/cron: 与例行性工作调度有关
    • /var/log/dmesg:记录系统在开机的时候内核监测过程所产生的各项信息。
    • /var/log/lastlog:可以记录系统上面所有的账号最近一次登录系统时的相关信息。
    • /var/log/maillog或者/var/log/mail/*:记录邮件的往来信息。SMTP是发信所使用的协议,POP3则是收信使用的协议。
    • /var/log/messages:几乎系统发生的错误信息(或重要信息)都会记录在这个文件中。
    • /var/log/secure:牵涉到需要输入账号密码的软件,当登录时(不管登录正确或错误)都会被记录在此文件中。包括系统的login,su,sudo,ssh,telnet等。
    • /var/log/wtmp, /var/log/faillog:可以记录正确登录系统者的账户信息(wtmp)与错误登录时所使用的账户信息(faillog).
    • /var/log/httpd/*, /var/log/news/*, /var/log/samba/*

logrotate(日志文件轮替)

  • 如果日志文件容量太大时,可能会导致大文件读写效率不佳的问题,所以需要对日志文件备份与更新。logrotate就能自动化处理日志文件容量与更新问题。
  • 具体操作:logrotate其实就是将旧的日志文件更改名称,然后新建一个空的日志文件。这样新的日志文件将重新开始记录。旧的记录保存大概几个月(?)后就会被系统自动删除掉。

总的来说,日志文件所需的服务与程序有:

  • syslogd: 主要登录系统与网络等服务的信息
  • klogd: 主要登录内核产生的各项信息
  • logrotate:主要进行日志文件的轮替功能

19.2 syslogd: 记录日志文件的服务

ref:

集中日志服务器Rsyslog

这里写图片描述

19.2.1 日志文件内容的一般格式

系统产生的信息经过syslog而记录下来的数据中,每条信息均会记录下面的几个重要数据:

  • 事件发生的日期与时间
  • 发生此事件的主机名
  • 启动此事件的服务名称或函数名称
  • 该信息的实际数据内容

分析日志格式:
|—–日期/时间—–|-Host-|—-服务与相关函数—-|–信息说明—|
这里写图片描述

19.2.2 syslog的配置文件:/etc/syslog.conf

配置文件规定了“什么服务的什么等级信息以及需要被记录在哪里(设备或文件)”。

服务名称[.=!]信息等级       信息记录的文件名或设备或主机# 下面以 mail 这个服务产生的 info 等级为例:mail.info           /var/log/maillog_info# 这一行说明:mail 服务产生的大于等于 info 等级的信息,都记录到 # /var/log/maillog_info 文件中。

上方的例子分为三部分:

  1. 服务名称。syslog本身有设置一些服务,如下:
    这里写图片描述
    软件调用与syslog所指定的服务名称关系:
    这里写图片描述

  2. 信息等级。syslog将信息分为7个主要的等级。
    这里写图片描述

    • 信息等级之前的[.=!]的意思是:
    • . :代表『比后面还要高的等级 (含该等级) 都被记录下来』的意思,例如: mail.info 代表只要是 mail 的资讯,而且该资讯等级高於 info (含 info 本身)时,就会被记录下来的意思。
    • .=:代表所需要的等级就是后面接的等级而已, 其他的不要!
    • .!:代表不等於, 亦即是除了该等级外的其他等级都记录。
  3. 信息记录的文件名或设备或主机:一般是记录文件的路径(/var/log中),或者是输出到设备(如打印机)。

eg. 将mail相关的数据写入/var/log/maillog当中,那么在/etc/syslog.conf的语法怎样设计?

mail.info      /var/log/maillog

eg. 将news和cron的信息都写到/var/log/cronnews文件中,但是这两个程序的警告信息则额外地记录在/var/log/cronnews.warn中,那该如何设计?

news.*;cron.*           /var/log/cronnews #所有信息写在cronnews中news.=warn;cron.=warn   /var/log/cronnews.warn#警告信息额外记录

eg. 用messages这个文件记录所有的信息,除了cron,mail以及news的信息。

*.*;new.none;cron.none;mail.none    /var/log/messages #排除某几个信息用“.none”或者这样写:*.*;new,cron,mail.none      /var/log/messages #用,分隔时,等级只需要接在最后一个即可

总结

  • 每个linux 版本的syslog.conf设置区别是很大的,如果需要找到相对应的日志信息时,要查阅一下/etc/syslog.conf.
  • 如果自己的软件想要发布到linux不同版本上时,需要自行设计与修改/etc/syslog.conf,否则就可能会分析到错误的信息。
  • 自行增加日志文件功能。eg,让所有的信息都额外写入到/var/log/admin.log这个文件:
vim /etc/syslog.conf>> *.info        /var/log/admin.log#重新启动syslog/etc/init.d/syslog restartll /var/log/admin.log

19.2.3 日志文件的安全性设置

注意,syslog的日志文件只要“被编辑过”就无法继续记录,所以要重新启动syslog让它继续服务才行。(比如用vim打开然后使用wq退出)

我们可以使用a属性。如果日志文件设置了这个属性的话,那么它只能被增加,而不能被删除!
eg:

chattr +a /var/log/messageslsattr /var/log/messages>> -----a------ /var/log/messages

19.2.4 日志文件服务器的设置

把某一台主机成为“日志文件服务器”,用它来记录其他所有主机的信息。
这里写图片描述
如图所示,服务器会启动监听端口514,客户端则将日志文件再转出一份到服务器中去。如何设置呢?

#server端,修改syslogd的启动配置文件,通常在/etc/sysconfig内vim /etc/sysconfig/syslog# 找到底下这一行:SYSLOGD_OPTIONS="-m 0"# 改成底下这样子!SYSLOGD_OPTIONS="-m 0 -r"#重新启动与查看syslogd/etc/init.d/syslog restartnetstat -lunp | grep syslog>> Proto Recv-Q Send-Q Local Address  Foreign Address State   PID/Program nameudp        0      0 0.0.0.0:514    0.0.0.0:*               13981/syslogd
#关于客户端的设置,只要指定某个信息传送到这部主机即可#eg. 文件服务器 IP 为 192.168.1.100 ,而 client 端希望所有的数据都送给主机, 可以在 /etc/syslog.conf 里面新增这样的一行:vim /etc/syslog.conf>> *.*       @192.168.1.100

19.3 日志文件的轮替(logrotate)

syslog利用的是daemon的方式来启动的,当有需求的时候就会立刻被执行,但是logrotate是到了规定的时间才进行日志文件的轮替,所以logrotate是挂在cron下面进行的。

我们可以在/etc/cron.daily/logrotate文件里找到logrotate的行为设定。

而logrotate这个程序的参数配置文件在:

  • /etc/logrotate.conf
  • /etc/logrotate.d

logrotate的执行过程:
这里写图片描述
当第一次的rotate完成之后,原本的messages会变成messages.1,而且会制造一个空的messages给系统来保存日志文件。而第二次执行之后,则messages.1会变成messages.2,而messages会变成messages.1,又制造一个空的messages来保存日志文件。

  • 那么,多久进行一次logrotate工作呢?在/etc/logrotate.conf
[root@www ~]# vim /etc/logrotate.conf# 底下的配置是 "logrotate 的默认配置值" ,如果个别的文件配置了其他的参数,# 则将以个别的文件配置为主,若该文件没有配置到的参数则以这个文件的内容为默认值!weekly    #<==默认每个礼拜对登录文件进行一次 rotate 的工作rotate 4  #<==保留几个登录文件呢?默认是保留四个!create    #<==由於登录文件被更名,因此创建一个新的来继续储存之意!#compress #<==被更动的登录文件是否需要压缩?如果登录文件太大则可考虑此参数启动include /etc/logrotate.d# 将 /etc/logrotate.d/ 这个目录中的所有文件都读进来运行 rotate 的工作!/var/log/wtmp {       #<==仅针对 /var/log/wtmp 所配置的参数    monthly           #<==每个月一次,取代每周!    minsize 1M        #<==文件容量一定要超过 1M 后才进行 rotate (略过时间参数)    create 0664 root utmp #<==指定新建文件的权限与所属帐号/群组    rotate 1          #<==仅保留一个,亦即仅有 wtmp.1 保留而已。}# 这个 wtmp 可记录登陆者与系统重新启动时的时间与来源主机及登陆期间的时间。# 由於具有 minsize 的参数,因此不见得每个月一定会进行一次喔!要看文件容量。# 由於仅保留一个登录文件而已,不满意的话可以将他改成 rotate 5 吧!

因此,logrotate.conf的设置语法:

日志文件的绝对路径文件名...{        个别的参数设置值,如monthly, compress等}

例子
看看如何设置/etc/logrotate.d/syslog这个syslog服务的rotate:
这里写图片描述
1-5行: 被处理的日志文件的绝对路径文件名
6-11行:参数,用{}包括起来
7,8,10行:可运行脚本。可用的环境:prerotate, postrotate.

19.3.2 实际测试logrotate的操作

命令:
logrotate [-vf] logfile
-v : 启动显示模式,会显示logrotate运行的过程
-f : 不论是否符合配置文件的数据,强制每个日志文件都进行rotate的操作

eg. 强制进行logrotate的操作
logrotate -vf /etc/logrotate.conf

19.3.3 自定义日志文件的轮替功能

任务:假设已经新建了/var/log/admin.log这个文件,现在需要给改文件加上+a这个隐藏标签,且设置以下信息:

  • 登录文件轮替一个月进行一次;
  • 该登录文件若大於 10MB 时,则主动进行轮替,不需要考虑一个月的期限;
  • 保存五个备份文件;
  • 备份文件需要压缩

加上+a这个属性:
这里写图片描述

因为加入了a隐藏属性,root无法移动此日志文件:
这里写图片描述

开始新建logrotate的配置文件,新增一个文件在/etc/logrotate.d内
这里写图片描述

测试一下logrotate相关功能的信息显示
logrotate -v /etc/logrotate.conf

测试一下强制logrotate与相关功能的信息显示:
logrotate -vf /etc/logrotate.d/admin

19.4 分析日志文件

系统提供一些软件可以让用户从日志文件中取得数据,如日志文件分析程序logwatch。

19.4.1 CentOS默认提供的logwatch

它会每天分析一次日志文件,并且将数据以email的格式寄送给root。