分类

Linux Daemon  分为 Stand alone 和 Super daemon 两类

1. Stand alone 为独立守护进程,例如 httpd,vsftpd,他们是常驻内存的进程,优点是响应迅速,缺点是占用内存

2. Super daemon 是由一个超级进程负责管理的守护进程, super daemon本身是一个stand alone进程,他的进程名是xinetd,他负责响应所有请求由他管理的daemon的服务的请求。其中super daemon的处理模式又氛围两种

  1) multi-threaded : 这种处理方式是多线程处理方式,可以同时提供多个不同daemon服务

  2)single-threaded: 这种处理方式是排队处理方式,处理方式为轮流处理多个请求

 

区分

对于不同的daemon的服务区分的方式是port(端口号),可以通过查看 /etc/services 看到所有不同的服务的port,例如http 80, ftp 20/21, ssh 22, telnet 23等等

 

启动方式

1. /etc 是服务的配置文件存放的目录

2. /etc/init.d 是存放所有stand alone deamon启动脚本的目录,里面的脚本由服务的安装程序提供

3. /etc/sysconfig/* :各服务的初始化环境配置文件

4. /etc/xinetd.conf, /etc/xinetd.d/* :super daemon 配置文件

5. /var/run 里存放了所有daemon的pid

6. /var/lib/* :各服务产生的数据库

此外,daemon的管理也可以通过service命令来管理 

 

super daemon的启动通过/etc/xinetd.d管理

以 /etc/xinetd.d/echo为例

# default: off
# description: An xinetd internal service which echo's characters back to
# clients.
# This is the tcp version.
service echo
{
    disable        = yes #把这个yes改为no
    type        = INTERNAL
    id        = echo-stream
    socket_type    = stream
    protocol    = tcp
    user        = root
    wait        = no
}                                                                               

# This is the udp version.
service echo
{
    disable        = yes #把这个yes改为no
    type        = INTERNAL
    id        = echo-dgram
    socket_type    = dgram
    protocol    = udp
    user        = root
    wait        = yes
}     

重启一下xinietd进程, /etc/init.d/xinetd restart

之后可以用 netstat -anptu | grep :7 看一下,会发现

tcp 0 0 0.0.0.0:7 0.0.0.0:* LISTEN 24250/xinetd
udp 0 0 0.0.0.0:7 0.0.0.0:* 24250/xinetd

则super daemon控制的echo服务已经启动

 

Super daemon默认配置及其提供服务的配置

以下内容直接转子 《鸟哥的Linux私房菜》

小标题的图示默认值配置文件:xinetd.conf

先来看一看默认的 /etc/xinetd.conf 这个文件的内容是什么吧!

[root@www ~]# vim /etc/xinetd.conf
defaults
{
# 服务启动成功或失败,以及相关登陆行为的记录文件
        log_type        = SYSLOG daemon info  <==登录文件的记录服务类型
        log_on_failure  = HOST   <==发生错误时需要记录的信息为主机 (HOST)
        log_on_success  = PID HOST DURATION EXIT <==成功启动或登陆时的记录信息
# 允许或限制联机的默认值
        cps         = 50 10 <==同一秒内的最大联机数为 50 个,若超过则暂停 10 秒
        instances   = 50    <==同一服务的最大同时联机数
        per_source  = 10    <==同一来源的客户端的最大联机数
# 网络 (network) 相关的默认值
        v6only          = no <==是否仅允许 IPv6 ?可以先暂时不启动 IPv6 支持!
# 环境参数的配置
        groups          = yes
        umask           = 002
}

includedir /etc/xinetd.d <==更多的配置值在 /etc/xinetd.d 那个目录内

为什么 /etc/xinetd.conf 可以称为默认值的配置文件呢?因为如果你有启动某个 super daemon 管理的服务, 但是该服务的配置值并没有指定上述的那些项目,那么该服务的配置值就以上述的默认值为主! 至于上述的默认值会将 super daemon 管理的服务配置为:『一个服务最多可以有 50 个同时联机, 但每秒钟发起的「新」联机最多仅能有 50 条,若超过 50 条则该服务会暂停 10 秒钟。同一个来源的用户最多仅能达成 10 条联机。 而登陆的成功与失败所记录的信息并不相同。』这样说,可以比较清楚了吧? ^_^ 至于更多的参数说明,我们会在底下再强调的!

既然这只是个默认参数档,那么自然有更多的服务参数文件啰~没错~而所有的服务参数档都在 /etc/xinetd.d 里面,这是因为上表当中的最后一行啊!这样瞭了吧! ^_^。那么每个参数文件的内容是怎样呢?一般来说,他是这样的:

service  <service_name>
{
       <attribute>   <assign_op>   <value>   <value> ...
       .............
}

第一行一定都有个 service ,至于那个 <service_name> 里面的内容,则与 /etc/services 有关,因为他可以对照着 /etc/services 内的服务名称与埠号来决定所要激活的 port 是哪个啊! 然后相关的参数就在两个大刮号中间。attribute 是一些 xinetd 的管理参数, assign_op 则是参数的配置方法。 assign_op 的主要配置形式为:

 = : 表示后面的配置参数就是这样啦!
+= : 表示后面的配置为『在原来的配置里头加入新的参数』
-= : 表示后面的配置为『在原来的参数舍弃这里输入的参数!』

用途不太相同,敬请留意呦!好了!底下再来说一说那些 attribute 与 value !

attribute (功能) 说明与范例
一般配置项目:服务的识别、启动与程序
disable
(启动与否)
  • 配置值:[yes|no],默认 disable = yes
disable 为取消的意思,此值可配置该服务是否要启动。默认所有的 super daemon 管理的服务都不启动的。 若要启动就得要配置为『 disable = no 』
id
(服务识别)
  • 配置值:[服务的名称]
虽然服务在配置文件开头『 service 服务名称』已经指定了,不过有时后会有重复的配置值,此时可以用 id 来取代服务名称。 你可以参考一下 /etc/xinetd.d/time-stream 来思考一下原理。
server
(程序文件名)
  • 配置值:[program 的完整檔名]
这个就是指出这个服务的启动程序!例如 /usr/bin/rsync 为启动 rsync 服务的命令,所以这个配置值就会成为: 『 server = /usr/bin/rsync 』
server_args
(程序参数)
  • 配置值:[程序相关的参数]
这里应该输入的就是你的 server 那里需要输入的一些参数啦!例如 rsync 需要加入 --daemon , 所以这里就配置:『 server_args = --daemon 』。与上面 server 搭配,最终启动服务的方式『/usr/bin/rsync --daemon』
user
(服务所属UID)
  • 配置值:[使用者账号]
如果 xinetd 是以 root 的身份启动来管理的,那么这个项目可以配置为其他用户。此时这个 daemon 将会以此配置值指定的身份来启动该服务的程序喔!举例来说,你启动 rsync 时会以这个配置值作为该程序的 UID。
group 跟 user 的意思相同!此项目填入组名即可。
一般配置项目:联机方式与联机封包协议
socket_type
(封包类型)
  • 配置值:[stream|dgram|raw],与封包有关
stream 为联机机制较为可靠的 TCP 封包,若为 UDP 封包则使用 dgram 机制。raw 代表 server 需要与 IP 直接对谈!举例来说 rsync 使用 TCP ,故配置为『socket_type = stream 』
protocol
(封包类型)
  • 配置值:[tcp|udp],通常使用 socket_type 取代此配置
使用的网络协议,需参考 /etc/protocols 内的通讯协议,一般使用 tcp 或 udp。由于与 socket_type 重复, 因此这个项目可以不指定。
wait
(联机机制)
  • 配置值:[yes(single)|no(multi)],默认 wait = no
这就是我们刚刚提到的 Multi-threaded 与 single-threaded !一般来说,我们希望大家的要求都可以同时被激活,所以可以配置『 wait = no 』 此外,一般 udp 配置为 yes 而 tcp 配置为 no。
instances
(最大联机数)
  • 配置值:[数字或 UNLIMITED]
这个服务可接受的最大联机数量。如果你只想要开放 30 个人联机 rsync 时,可在配置文件内加入:『 instances = 30 』
per_source
(单一用户来源)
  • 配置值:[一个数字或 UNLIMITED]
如果想要控制每个来源 IP 仅能有一个最大的同时联机数,就指定这个项目吧!例如同一个 IP 最多只能连 10 条联机『 per_source = 10 』
cps
(新联机限制)
  • 配置值:[两个数字]
为了避免短时间内大量的联机要求导致系统出现忙碌的状态而有这个 cps 的配置值。第一个数字为一秒内能够接受的最多新联机要求, 第二个数字则为,若超过第一个数字那暂时关闭该服务的秒数。
一般配置项目:登录文件的记录
log_type
(登录档类型)
  • 配置值:[登录项目 等级]
当数据记录时,以什么登录项目记载?且需要记载的等级为何(默认为 info 等级)。这两个配置值得要看过下一章登录档后才会知道哩!这边你先有印象即可。
log_on_success
log_on_failure
(登录状态)
  • 配置值:[PID,HOST,USERID,EXIT,DURATION]
在『成功登陆』或『失败登陆』之后,需要记录的项目:PID 为纪录该 server 启动时候的 process ID , HOST 为远程主机的 IP、USERID 为登陆者的账号、EXIT 为离开的时候记录的项目、DURATION 为该用户使用此服务多久?
进阶配置项目:环境、网络端口口与联机机制等
env
(额外变量配置)
  • 配置值:[变量名称=变量内容]
这一个项目可以让你配置环境变量,环境变量的配置守则可以参考第十一章
port
(非正规埠号)
  • 配置值:[一组数字(小于 65534)]
这里可以配置不同的服务与对应的 port ,但是请记住你的 port 与服务名称必须与 /etc/services 内记载的相同才行!不过,若服务名称是你自定义的,那么这个 port 就可以随你指定
redirect
(服务转址)
  • 配置值:[IP port]
将 client 端对我们 server 的要求,转到另一部主机上去!呵呵!这个好玩呦! 例如当有人要使用你的 ftp 时,你可以将他转到另一部机器上面去!那个 IP_Address 就代表另一部远程主机的 IP 啰!
includedir
(呼叫外部配置)
  • 配置值:[目录名称]
表示将某个目录底下的所有文件都给他塞进来 xinetd.conf 这个配置里头!这东西有用多了, 如此一来我们可以一个一个配置不同的项目!而不需要将所有的服务都写在 xinetd.conf 当中!你可以在 /etc/xinetd.conf 发现这个配置呦!
安全控管项目:
bind
(服务接口锁定)
  • 配置值:[IP]
这个是配置『允许使用此一服务的适配卡』的意思!举个例子来说,你的 Linux 主机上面有两个 IP ,而你只想要让 IP1 可以使用此一服务,但 IP2 不能使用此服务,这里就可以将 IP1 写入即可!那么 IP2 就不可以使用此一 server 啰
interface
  • 配置值:[IP]
与 bind 相同
only_from
(防火墙机制)
  • 配置值:[0.0.0.0, 192.168.1.0/24, hostname, domainname]
这东西用在安全机制上面,也就是管制『只有这里面规定的 IP 或者是主机名可以登陆!』如果是 0.0.0.0 表示所有的 PC 皆可登陆,如果是 192.168.1.0/24 则表示为 C class 的网域!亦即由 192.168.1.1 ~ 192.168.1.255 皆可登陆!另外,也可以选择 domain name ,例如 .dic.ksu.edu.tw 就可以允许昆山资传系网域的 IP 登陆你的主机使用该 server !
no_access
(防火墙机制)
  • 配置值:[0.0.0.0, 192.168.1.0/24, hostname, domainname]
跟 only_from 差不多啦!就是用来管理可否进入你的 Linux 主机激活你的 server 服务的管理项目! no_access 表示『不可登陆』的 PC 啰!
access_times
(时间控管)
  • 配置值:[00:00-12:00, HH:MM-HH:MM]
这个项目在配置『该服务 server 启动的时间』,使用的是 24 小时的配置!例如你的 ftp 要在 8 点到 16 点开放的话,就是: 08:00-16:00。
umask
  • 配置值:[000, 777, 022]
还记得在第七章提到的 umask 这个东西吗?呵呵!没错! 就是那个鬼玩意儿啰!可以配置用户创建目录或者是文件时候的属性!系统建议值是 022 。

OK!我们就利用上面这些参数来架构出我们所需要的一些服务的配置吧!参考看看底下的配置方法啰! ^_^


小标题的图示一个简单的 rsync 范例配置

我们知道透过 super daemon 控管的服务可以多一层管理的手续来达成类似防火墙的机制, 那么该如何仔细的配置这些类似防火墙机制的配置参数呢?底下我们使用 rsync 这个可以进行远程镜射 (mirror) 的服务来说明。 rsync 可以让两部主机上面的某个目录一模一样,在远程异地备援系统上面是挺好用的一个机制。 而且默认一装好 CentOS 就已经存在这玩意儿了!那就来瞧瞧默认的 rsync 配置文件吧!

[root@www ~]# vim /etc/xinetd.d/rsync
service rsync  <==服务名称为 rsync
{
        disable = no                     <==默认是关闭的!刚刚被我们打开了
        socket_type     = stream         <==使用 TCP 的联机机制之故
        wait            = no             <==可以同时进行大量联机功能
        user            = root           <==启动服务为 root 这个身份
        server          = /usr/bin/rsync <==就是这支程序启动 rsync 的服务啰
        server_args     = --daemon       <==这是必要的选项啊!
        log_on_failure  += USERID        <==登陆错误时,额外记录用户 ID
}

能不能修改 user 成为其他身份呢?由于在 /etc/services 当中规定 rsync 使用的端口口号码为 873 ,这个端口小于 1024 ,所以理论上启动这个端口的身份一定要是 root 才行!这里 user 就请您先别乱改啰! 由于鸟哥的测试主机在安装时已经有捉到网络卡,目前有两个接口,一个是 192.168.1.100 ,一个则是 127.0.0.1, 假设我将 192.168.1.100 设计为对外网域, 127.0.0.1 为内部网域,且内外网域的分别权限配置为:

  • 对内部 127.0.0.1 网域开放较多权限的部分:
    • 这里的配置值需绑在 127.0.0.1 这个接口上;
    • 对 127.0.0.0/8 开放登陆权限;
    • 不进行任何联机的限制,包括总联机数量与时间;
    • 但是 127.0.0.100 及 127.0.0.200 不允许登陆 rsync 服务。
  • 对外部 192.168.1.100 网域较多限制的配置:
    • 对外配置绑住 192.168.1.100 这个接口;
    • 这个接口仅开放 140.116.0.0/16 这个 B 等级的网域及 .edu.tw 网域可以登陆;
    • 开放的时间为早上 1-9 点以及晚上 20-24 点两个时段;
    • 最多允许 10 条同时联机的限制。
Tips:
有信息背景的朋友当然知道 127.0.0.1 是内部循环测试用的 IP ,用他来设计网络是没有意义的。 不过,我们这里仅是作一个设计的介绍,而且我们尚未谈到服务器篇的网络部分,所以大家先这样实际测试吧! ^_^
鸟哥的图示

在这样的规划情况下,我们可以将刚刚上头的 /etc/xinetd.d/rsync 这个文件修改成为:

[root@www ~]# vim /etc/xinetd.d/rsync
# 先针对对内的较为松散的限制来配置:
service rsync
{
        disable = no                        <==要启动才行啊!
        bind            = 127.0.0.1         <==服务绑在这个接口上!
        only_from       = 127.0.0.0/8       <==只开放这个网域的来源登陆
        no_access       = 127.0.0.{100,200} <==限制这两个不可登陆
        instances       = UNLIMITED         <==取代 /etc/xinetd.conf 的配置值
        socket_type     = stream            <==底下的配置则保留
        wait            = no
        user            = root
        server          = /usr/bin/rsync
        server_args     = --daemon
        log_on_failure  += USERID
}

# 再针对外部的联机来进行限制呢!
service rsync
{
        disable = no
        bind            = 192.168.1.100
        only_from       = 140.116.0.0/16
        only_from      += .edu.tw           <==因为累加,所以利用 += 配置
        access_times    = 01:00-9:00 20:00-23:59 <==时间有两时段,有空格隔开
        instances       = 10                <==只有 10 条联机
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/bin/rsync
        server_args     = --daemon
        log_on_failure  += USERID
}

在上面这个配置文件中,鸟哥共写了两段 service rsync 的配置,一段针对内部网域一段针对外部网域, 如果设计完毕你将他重新启动后,就会出现如下的状态喔!

# 0. 先看看原本的 873 状态为何!
[root@www ~]# netstat -tnlp | grep 873
tcp    0 0 0.0.0.0:873      0.0.0.0:*     LISTEN      4925/xinetd
# 仔细看,仅针对 0.0.0.0 这个全局网域监听而已哩!

# 1. 重新启动 xinetd 吧!不是启动 rsync 喔!别搞错。
[root@www ~]# /etc/init.d/xinetd restart
[root@www ~]# netstat -tnlp | grep 873
tcp    0 0 192.168.1.100:873     0.0.0.0:*       LISTEN    7227/xinetd
tcp    0 0 127.0.0.1:873         0.0.0.0:*       LISTEN    7227/xinetd
# 有没有看到两个接口啊~而且, PID 会是同一个呢!

如同上面的配置,我们就可以将某个系统服务针对不同的客户端来源指定不同的权限!这样子系统服务可以安全多了! 如果未来你的某些服务想要使用这个咚咚来配置也是 OK 的喔!更多的配置数据就有待您自己的理解了。

 

Super Daemon的防火墙管理

super daemon可以通过 /etc/host.allow /etc/host.deny 防火墙服务来管理服务的过滤host列表,我们可以通过ldd来查看服务的依赖包来确定服务是否支持防火墙的支持,如果依赖包里有libwrap,则支持防火墙过滤,例如

root@Sabretooth:/etc/xinetd.d# ldd $(which sshd)
    linux-gate.so.1 =>  (0x007f6000)
    libwrap.so.0 => /lib/libwrap.so.0 (0x00177000)
    libpam.so.0 => /lib/libpam.so.0 (0x00e22000)
    libselinux.so.1 => /lib/libselinux.so.1 (0x00110000)
    libcrypto.so.0.9.8 => /lib/i686/cmov/libcrypto.so.0.9.8 (0x003d0000)
    libutil.so.1 => /lib/libutil.so.1 (0x00f81000)
    libz.so.1 => /lib/libz.so.1 (0x0034b000)
    libcrypt.so.1 => /lib/libcrypt.so.1 (0x00636000)
    libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0x0012b000)
    libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0x00180000)
    libcom_err.so.2 => /lib/libcom_err.so.2 (0x00f6c000)
    libc.so.6 => /lib/libc.so.6 (0x00668000)
    libnsl.so.1 => /lib/libnsl.so.1 (0x0015a000)
    libdl.so.2 => /lib/libdl.so.2 (0x00f86000)
    /lib/ld-linux.so.2 (0x003b3000)
    libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0x0058b000)
    libkrb5support.so.0 => /usr/lib/libkrb5support.so.0 (0x00d26000)
    libkeyutils.so.1 => /lib/libkeyutils.so.1 (0x00609000)
    libresolv.so.2 => /lib/libresolv.so.2 (0x00b6e000)
    libpthread.so.0 => /lib/libpthread.so.0 (0x00d9d000)

1. host.allow里的ip为可访问,deny里的ip为不可访问

2. 据我的实际使用观察,如果host.allow/deny两个文件都为空,则默认应该是所有ip都可以使用该服务

3. 如果host.allow/deny两个文件存在相同的ip相冲突,则以allow文件为有限

下面是两个文件的格式

[root@www ~]# vim /etc/hosts.allow
rsync:  140.116.0.0/255.255.0.0
rsync:  203.71.39.0/255.255.255.0
rsync:  203.71.38.123
rsync:  LOCAL

[root@www ~]# vim /etc/hosts.deny
rsync: ALL  <==利用 ALL 配置让所有其他来源不可登陆

其中 rsync 为服务名, 后面接上需要限制或者放行的网段或ip

另外我们可以利用关键字实现对特殊网段的控制,例如  rsync: LOCAL

  • ALL:代表全部的 program_name 或者是 IP 都接受的意思,例如 ALL: ALL: deny
  • LOCAL:代表来自本机的意思,例如: ALL: LOCAL: allow
  • UNKNOWN:代表不知道的 IP 或者是 domain 或者是服务时;
  • KNOWN:代表为可解析的 IP, domain 等等信息时;

 

使用TCP Wrapper来追踪port扫描者

我们可以在deny后加入一段shell来记录服务端口扫描者的信息

[root@www ~]# vim /etc/hosts.deny
rsync : ALL: spawn (echo "security notice from host $(/bin/hostname)" ;\
    echo; /usr/sbin/safe_finger @%h ) | \
    /bin/mail -s "%d-%h security" root & \
    : twist ( /bin/echo -e "\n\nWARNING connection not allowed.\n\n" )

上述配置为对所有访问rsync端口服务的用户使用safe_fingerc查询远程用户信息并发送右键给管理员,同时使用twist命令将警告信息发给远程用户

posted on 2013-01-24 02:22  ZimZz  阅读(5790)  评论(0编辑  收藏  举报