Linux Daemon


分類

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命令將警告信息發給遠程用戶


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM