分類
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
(啟動與否)disable 為取消的意思,此值可配置該服務是否要啟動。默認所有的 super daemon 管理的服務都不啟動的。 若要啟動就得要配置為『 disable = no 』
- 配置值:[yes|no],默認 disable = yes
id
(服務識別)雖然服務在配置文件開頭『 service 服務名稱』已經指定了,不過有時后會有重復的配置值,此時可以用 id 來取代服務名稱。 你可以參考一下 /etc/xinetd.d/time-stream 來思考一下原理。
- 配置值:[服務的名稱]
server
(程序文件名)這個就是指出這個服務的啟動程序!例如 /usr/bin/rsync 為啟動 rsync 服務的命令,所以這個配置值就會成為: 『 server = /usr/bin/rsync 』
- 配置值:[program 的完整檔名]
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 為聯機機制較為可靠的 TCP 封包,若為 UDP 封包則使用 dgram 機制。raw 代表 server 需要與 IP 直接對談!舉例來說 rsync 使用 TCP ,故配置為『socket_type = stream 』
- 配置值:[stream|dgram|raw],與封包有關
protocol
(封包類型)使用的網絡協議,需參考 /etc/protocols 內的通訊協議,一般使用 tcp 或 udp。由於與 socket_type 重復, 因此這個項目可以不指定。
- 配置值:[tcp|udp],通常使用 socket_type 取代此配置
wait
(聯機機制)這就是我們剛剛提到的 Multi-threaded 與 single-threaded !一般來說,我們希望大家的要求都可以同時被激活,所以可以配置『 wait = no 』 此外,一般 udp 配置為 yes 而 tcp 配置為 no。
- 配置值:[yes(single)|no(multi)],默認 wait = no
instances
(最大聯機數)這個服務可接受的最大聯機數量。如果你只想要開放 30 個人聯機 rsync 時,可在配置文件內加入:『 instances = 30 』
- 配置值:[數字或 UNLIMITED]
per_source
(單一用戶來源)如果想要控制每個來源 IP 僅能有一個最大的同時聯機數,就指定這個項目吧!例如同一個 IP 最多只能連 10 條聯機『 per_source = 10 』
- 配置值:[一個數字或 UNLIMITED]
cps
(新聯機限制)為了避免短時間內大量的聯機要求導致系統出現忙碌的狀態而有這個 cps 的配置值。第一個數字為一秒內能夠接受的最多新聯機要求, 第二個數字則為,若超過第一個數字那暫時關閉該服務的秒數。
- 配置值:[兩個數字]
一般配置項目:登錄文件的記錄 log_type
(登錄檔類型)當數據記錄時,以什么登錄項目記載?且需要記載的等級為何(默認為 info 等級)。這兩個配置值得要看過下一章登錄檔后才會知道哩!這邊你先有印象即可。
- 配置值:[登錄項目 等級]
log_on_success
log_on_failure
(登錄狀態)在『成功登陸』或『失敗登陸』之后,需要記錄的項目:PID 為紀錄該 server 啟動時候的 process ID , HOST 為遠程主機的 IP、USERID 為登陸者的賬號、EXIT 為離開的時候記錄的項目、DURATION 為該用戶使用此服務多久?
- 配置值:[PID,HOST,USERID,EXIT,DURATION]
進階配置項目:環境、網絡端口口與聯機機制等 env
(額外變量配置)這一個項目可以讓你配置環境變量,環境變量的配置守則可以參考第十一章。
- 配置值:[變量名稱=變量內容]
port
(非正規埠號)這里可以配置不同的服務與對應的 port ,但是請記住你的 port 與服務名稱必須與 /etc/services 內記載的相同才行!不過,若服務名稱是你自定義的,那么這個 port 就可以隨你指定
- 配置值:[一組數字(小於 65534)]
redirect
(服務轉址)將 client 端對我們 server 的要求,轉到另一部主機上去!呵呵!這個好玩呦! 例如當有人要使用你的 ftp 時,你可以將他轉到另一部機器上面去!那個 IP_Address 就代表另一部遠程主機的 IP 啰!
- 配置值:[IP port]
includedir
(呼叫外部配置)表示將某個目錄底下的所有文件都給他塞進來 xinetd.conf 這個配置里頭!這東西有用多了, 如此一來我們可以一個一個配置不同的項目!而不需要將所有的服務都寫在 xinetd.conf 當中!你可以在 /etc/xinetd.conf 發現這個配置呦!
- 配置值:[目錄名稱]
安全控管項目: bind
(服務接口鎖定)這個是配置『允許使用此一服務的適配卡』的意思!舉個例子來說,你的 Linux 主機上面有兩個 IP ,而你只想要讓 IP1 可以使用此一服務,但 IP2 不能使用此服務,這里就可以將 IP1 寫入即可!那么 IP2 就不可以使用此一 server 啰
- 配置值:[IP]
interface 與 bind 相同
- 配置值:[IP]
only_from
(防火牆機制)這東西用在安全機制上面,也就是管制『只有這里面規定的 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 !
- 配置值:[0.0.0.0, 192.168.1.0/24, hostname, domainname]
no_access
(防火牆機制)跟 only_from 差不多啦!就是用來管理可否進入你的 Linux 主機激活你的 server 服務的管理項目! no_access 表示『不可登陸』的 PC 啰!
- 配置值:[0.0.0.0, 192.168.1.0/24, hostname, domainname]
access_times
(時間控管)這個項目在配置『該服務 server 啟動的時間』,使用的是 24 小時的配置!例如你的 ftp 要在 8 點到 16 點開放的話,就是: 08:00-16:00。
- 配置值:[00:00-12:00, HH:MM-HH:MM]
umask 還記得在第七章提到的 umask 這個東西嗎?呵呵!沒錯! 就是那個鬼玩意兒啰!可以配置用戶創建目錄或者是文件時候的屬性!系統建議值是 022 。
- 配置值:[000, 777, 022]
OK!我們就利用上面這些參數來架構出我們所需要的一些服務的配置吧!參考看看底下的配置方法啰! ^_^
我們知道透過 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命令將警告信息發給遠程用戶