1、守护程序与服务
简单来说,可以将服务与守护程序视作相同的东西,就是在后台中执行的程序,可以提供某些功能。
2、守护进程的主要分类
根据启动与管理方式,可以将守护程序分为可独立启动的独立启动守护程序,以及通过统一安全机制管理的超级守护程序两大类。
a、独立启动(stand_alone):该守护程序启动后,就直接常驻内存。他虽然一直占用系统资源,但最大的优点就是响应快。常见的守护程序比如httpd。
b、超级守护程序(super daemon):相对于独立启动的执行方式,这种服务的启动方式是通过统一的守护程序来负责唤起服务。统一负责的守护程序就是inet服务。不过,后来的Linux开发套件中,是使用xinet。以FC4的xinet说明下。当有网络服务要求时,该要求会先送给xinet服务,然后xinet根据该网络要求送来的数据包内容(该内容会记录IP地址与端口号),将数据包送给实际运行的服务,而该服务此时才会启动。最常见的就是ftp服务。他的最大优点是不会一直占用系统资源(该服务会在睡眠状态),但他的反应时间也比较慢,因为还要花时间去“唤醒”该服务。
针对超级守护进程的处理模式有两种:
(1)多线程(multi-threaded):可以理解为将所有请求一次交给程序处理,所以一个服务同时会负责好几个程序。
(2)单线程(single-threaded):请求一个个的处理,前一个没处理完之前,后面的请排队。
如果以守护程序的工作状态来区分,主要分为:
a、单独控制(signal-control):这种守护程序是通过信号来管理的,只要有任何需求,他就会立即启动去处理,如打印机的服务(cupsd)。
b、间隔控制(interval-control):这种守护程序是每隔一段时间就主动执行某项工作,所以,即使设置好配置文件,他也不会立即执行,而是某个时间点才回去工作。atd与crond就是这样(每分钟执行一次)。
3、与服务有关的端口信息:/etc/services
不同的网络服务又不一样的监听端口(listen port)。Linux主机的服务与端口信息记录在/etc/services文件中。这个文件的内容以下面的方式来排:<守护进程名称> <port与数据类型> <该服务的说明>
注意:一般不要修改这个文件的内容,使用默认的即可,否则可能出现问题。
4、守护进程命名规则
通常在服务名称后面加上一个d,例如建立at与cron这两个服务,通常被称为atd或crond,d表示守护进程。
5、系统的守护程序位置
为了很轻松的启动服务,Linux会替系统启动守护程序,方法是利用shell脚本。举个例子,如果想知道syslogd是如何启动的,可以查询man 8 syslogd,很麻烦,其实可以使用启动syslogd守护程序的shell脚本(/etc/init.d/syslog)。只要“/etc/init.d/syslog restart”就行了。
这些shell脚本放置的地方根据独立启动守护程序还是超级守护程序有所不同:
a、独立启动守护程序:放在/etc/init.d/目录里,几乎所有的RPM安装的套件启动脚本都在这里。不过FC4是放到/etc/rc.d/init.d/*中。
b、超级守护程序:即xinet或inet。请注意,xinet也是一个守护程序。他是独立启动的,所以xinet的启动脚本写在/etc/init.d/xinted 里。挂在这个守护程序里的服务设置项目写在/etc/cinetd.conf与/etc/xinetd.d/*目录的任何文件中。
守护进程的启动:
a、/etc/init.d/
对于独立期待您给的守护程序,以syslog为例:
[root@linux ~]# /etc/init.d/syslog start
[root@linux ~]# service syslog start
service格式:
[root@linux ~]# service [service name] (start|stop|restart|...)
service name:急需要启动的服务名称,与/etc/init.d对应
start|...:即该服务要进行的工作
b、/etc/xinetd.conf :这个文件就是设置xinet服务的参数文件
c、/etc/xinetd.d/*:这个目录里面的所有文件就是挂上xinet的所有服务,如wu-ftpd、telnet与pop3等。
对于启动超级守护进程,以telnet为例:
[root@linux ~]# vi /etc/xinetd.d/telnet
[root@linux ~]# /etc/init.d/xinetd restart
6、超级守护进程序的设置文件
xinetd的主要默认参数文件:/etc/xinetd.conf,几项主要内容:
instances = 60 //同一服务的同时联机数最多可达60台
log_type = SYSLOG daemon info //登录后,会记录到登陆文件的信息
log_on_failure = HOST //成功登陆是,记录的信息有哪些
log_on_success = PID HOST DURATION EXIT //登录失败,记录的信息是什么
cps = 25 30 //同一秒钟内最大联机数量为25台,若超过25台,该服务会暂时停止30秒
includedir /etc/xinetd.d //更多设置值在/etc/xinetd.d目录中
这个文件中的数据只是默认值,当某个使用超级守护程序管理的服务启动时,除非该服务已经设置好管理的项目,否则将使用上述xinetd.conf内的默认值。所有的服务参数文件都在/etc/xinetd.d目录中(如果某服务在此目录中有设置文件,就不再使用默认值)。每个参数配置文件的格式一般:
service <service_name>
{
<attribute> <assign_op> <value> <value> ...
...
}
其中attribute是一些xinetd的管理参数,assign_op是参数的设置方法。assign_op的主要设置形式为:
=:表示后面的设置参数就是这样;
+=:表示后面的设置为“在原设置中加入新的参数”
-+:表示后面的设置为“在原参数中舍弃这里输入的参数”
attribute与value:
一般设置项目:
disable:设置服务器可执行或不可执行。设置为yes表示不能执行,设置为no表示可以执行。(必须设置)
socket_type:stream为联机机制较为可靠的TCP包,若为UDP表,则使用dgram机制。ram表示服务器需要与IP直接对话。
protocol:联机状态使用哪种协议。各协议代号可参考/etc/protocols的内容,除非自己设置的服务,否则这个可以不用设置。
wait:多线程与单线程方式,如果是多线程设置为no,单线程设置为yes。
user:UID,这是个安全防范机制,需要注意UID必须在/etc/passwd中。
group:与user的意思相同,这个GID也必须在 /etc/group中。
instances:同一时间内同一个服务允许的联机数目,可以写入一个数字。例在同时段ftp联机最多30台,这里就可以填入30。
nice:范围是-19~19,数字越小表示程序越优先执行。
server:指出服务的启动程序。例如telnet的话,就是server = /usr/sbin/in.telnetd。
server_args:服务器的参数。例如in.telnetd中,可以加入某些参数。
log_on_success:成功登陆后需要记录的项目。PID为记录该服务器启动时的进程ID,HOST为远程主机IP,USERID为登陆者账号,EXIT为离开是记录的项目,DURATION为该用户使用此服务的时间。
log_on_failure:登录失败时需要记录的项目。HOST为远程主机IP,USERID为登陆者账号,ATTEMPT记录登录失败者的企图,RECORD为记录远程主机的信息,以及为什么本机server不能启动的原因。login、shell、exec、finger等命令可以在这里使用。
高级设置项目:
env:可以设置环境变量。
port:可以设置不同服务与对应的端口,但是记住端口与服务名称必须与/etc/services内的记载相同。
redirect:将客户端对我们server的需求转到另一台主机上去。例如当有人要使用您的ftp时,您就可以将他转到另一台机器上去。那个IP_Address就表示另一台远程主机的IP。
includedir:将某个目录下所有文件都放到xinetd.conf设置里。很有用,这样就可以一个一个设置不同的项目,而不用将所有服务都写进xinetd.conf里。
安全控管项目:
bind:设置允许使用此服务的适配卡。例如Linux主机上有两个IP,而只想让IP1可以使用此服务,IP2不能使用,这里就可以写入IP1,IP2就不能使用此服务器。
interface:与bind相同。
only_from:用在安全机制上,就是管制只有这里规定的IP或主机名称可以登录,如果是0.0.0.0表示所有PC皆可登陆。另外,也可以选择域名。
no_access:与only_from差不多,用来管理能否进入Linux主机启用服务器服务的管理项目。no_access表示不可登陆的PC。
access_times:设置该服务的服务器启动的时间,使用24小时设置。例如ftp要在8点到16点开放,则:08:00- 16:00。
umask:可以设置用户建立的目录或者是文件的属性。系统建议022。
注:对于一个网段,可以这样设置:192.168.1.0/24表示192.168.1.0~192.168.1.24网段。
7、TCP_Wrappers
除了使用xinetd的设置文件来设置安全机制外,还可以使用额外的机制来阻止某些不受欢迎的数据来源,就是/etc/hosts.allow以及/etc/hosts.deny这两个文件。需要安装tcp_wrappers套件。/etc/hosts.allow优先级高于/etc/hosts.deny,可以把所有条件都写进一个文件,但是会显得杂乱无章。
格式:<service (program_name)> : <IP, domain, hostname> : <action>
例:以telnet在FC4下为例:
[root@linux ~]# vi /etc/hosts.deny
in.telnetd : 140.116.44.202 140.116.32.0/255.255.255.0 : deny
也可以写成两行:
in.telnetd: 140.116.44.202 : deny
in.telnetd: 140.116.32.0/255.255.255.0 : deny
另外,在第一个和第二个字段还可以使用一些特殊参数:
ALL:表示接受全部的program_name或者IP,例如:ALL:ALL:deny;
LOCAL:表示来自本机,例如:ALL:LOCAL:allow
UNKNOWN:表示不知道的IP、域或服务
KNOWN:表示可解析的IP、域等信息
再次强调,service_name必须与xinetd或/etc/init.d/*中的程序名相同。
还有更安全的设置,比如他人扫描telnet端口时,记录他的IP,以便查询与取证,这要在第三栏中使用额外的参数:
spawn(action):可以利用后续接的shell来进行附加工作,且具有变量功能,主要变量内容为:%h(homename)、%a(address)、%d(daemon)等。
twist(action):立刻执行后面的命令,起执行完后终止该次联机的要求。
例:利用safe_finger追踪对方主机信息,将追踪到的结果以电子邮件方式寄给root,在对方屏幕上显示不可登陆的消息,此时可利用:
spwan(action1)|(action2):twist(action3) 来进行。
[root@linux ~]# vi /etc/hosts.deny
in.telnetd: ALL : spawn (echo "security notice from host '/bin/hostname'";\
echo; /usr/sbin/safe_finger @%h) | \
/bin/main -s "%d-%h securitv" root & \
: twist (/bin/echo -e "\n\nWARNING connect not allowed.\n\n")
另外注意:/usr/sbin/safe_finger是由tcp_wrappers套件提供。
8、观察系统启动的服务
观察已启动服务的方式很多,但最常使用的是netstat。通常,以ps来观察整个系统上的服务比较好,但是观察启动网络监听的服务,netstat比较好。
例:找出当前系统打开的“网络服务”有哪些
[root@linux ~]# netstat -tulp
例:找出所有监听网络的服务(包含套接字状态)
[root@linux ~]# netstat -lnp
例:观察所有的网络连接状态,查询是否有异常联机
[root@linux ~]# netstat -anp
9、设置开机后立即启动的服务
整个服务开机就能启动的地方有两处,一处是在守护程序启动(/etc/rc.d/rc[0-6].d/*)目录下,该目录下的文件主要以S或K开头,分别表示开机时启动与关机时关闭。也就是说如果可以要启动的服务写入这个目录内,该服务开机时就能自动启动。另一处也可以在开机时启动的文件就是/etc/rc.d/rc.local。可以将任何想在开机时启动的程序写入这个文件,该文件以shell脚本的语法写成。
实际上不用手动去修改这两个地方就能设置启动服务,系统提供了两个命令来实现这个功能:chkconfig和ntsysv
a、chkconfig
[root@linux ~]# chkconfig --list
[root@linux ~]# chkconfig [--add | --del] [service_name]
[root@linux ~]# chkconfig --level [0123456] [service_name] [on|off]
--list :仅列出当前各项服务的状态
--add:给chkconfig增加一个服务名称,该service_name必须在/etc/init.d中
--del:删除chkconfig管理的一个服务
--level:设置某个服务在该level下启动或关闭
例:列出当前系统上所有被chkconfig管理的服务
[root@linux ~]# chkconfig --list | more
//输出主要分为两个部分,首先是独立启动的服务,他会列出0~6各运行等级的数据,即上半部分的显示。下半部是超级守护程序管理的服务输出,由超级守护程序管理的服务,是没有运行等级之分的。
例:让atd服务在运行等级3、4、5是启动
[root@linux ~]#chkconfig --level 345 atd on //会在/etc/rc.d/rc3.d、/etc/rc.d/rc4.d和/etc/rc.d/rc5.d里建立一个链接文件。
例:将自己建立的服务加入到chkconfig的管理中。首先该服务必须加入init可管理的脚本中,即/etc/init.d/中。比如,在/etc/init.d中建立一个myvbird文件,该文件是简单的服务范例,要求:将在运行等级3和5启动;在/etc/rc.d/rc[35].d中启动时,以S80开始以K70结束。
[root@linux ~]# vi /etc/init.d/myvbird
#!/bin/bash
#chkconfig: 35 80 70
echo "Nothing"
说明:第二行比较重要,他的语法是:chkconfig: [runlevels] [start number] [stop number],其中runlevels为不容的运行等级状态,start number与stop number则是在/etc/rc.d/rc[35].d内建立的设置文件,文件名为S80myvbird即K70myvbird
[root@linux ~]# chkconfig --add myvbird //加入chkconfig管理中
[root@linux ~]# chkconfig --list myvbird
//如果想删除
[root@linux ~]#chkconfig --del myvbird
[root@linux ~]#rm /etc/init.d/myvbird
b、ntsysv(很多版本都有chkconfig,但是ntsysv是Red Hat所特有的)
[root@linux ~]# ntsysv [--level <levels>]
--level:后面接不同的运行等级,例如ntsysv --level 35
例:直接编辑当前运行等级下默认启动项目
[root@linux ~]# ntasysv //出现编辑菜单,上下键控制移动;空格键选择需要的服务,tab键可在方框、OK、CANCEL间移动,[F1]键显示该服务的说明。
原文出处:http://hi.baidu.com/cds_wh/item/e3e6e60e12dc4ee5f45ba635