背 景
在IT系統運維領域,有一個平臺或模塊是繞不過去,那就是CMDB。
“配置管理數據庫( Configuration Management Database,CMDB)是一個邏輯數據庫,包含了配置項全生命周期的信息以及配置項之間的關系(包括物理關系、實時通信關系、非實時通信關系和依賴關系)。
CMDB存儲與管理企業IT架構中設備的各種配置信息,它與所有服務支持和服務交付流程都緊密相聯,支持這些流程的運轉、發揮配置信息的價值,同時依賴于相關流程保證數據的準確性。”
以上的名詞解釋來自于百度百科。
可以看到在對CMDB的名詞解釋中有這樣一句話“依賴于相關流程保證數據的準確性”。
相信做過相關運維工作的人看到這句話都會暗自苦笑,這特么就是一個大坑。
CMDB數據不準確是運維中一個頻頻出現的場景。
原因也不難解釋,無非以下幾種:
1)管理流程不完善,設備或系統上線下線、配置變更沒有通知CMDB,存在隨意改動的行為, CMDB作為一個旁路存在于生產業務系統之外,形同虛設。
2)有系統或設備的管理流程,但對于權限管理不到位,開發人員或維護人員能自主修改配置或對設備做上線下線處理,CMDB同樣難以獲取到這樣的修改信息。
3)更有甚者,對于一個后來入駐的運維團隊來說,可能在CMDB建設之初就沒有IT系統環境的臺賬或臺賬不完善,搞不清楚到底有些什么設備。
由上述情況可以看出要實施好一套CMDB平臺,需要建立完善的變更服務流程,需要精細化控制權限,還需要在技術手段上實現對IT環境變更的自發現能力。
變更服務流程的建立與IT管理部門的掌控能力有關,運維團隊在技術上除了構建相對易用的ITSM流程以及提供權限管理入口外,更多的還是需要從管理入手,在此不做過多的闡述。
本文主要從技術角度探討如何利用常見的工具或系統命令構建CMDB的自發現能力。
CMDB自發現能力盤點
1. 盲掃
在進入一個新的運維場地,或在項目現場做CMDB的POC時,經常會聽到客戶提出問題:
你們的CMDB能不能做設備的盲掃?
盲掃這個詞原本是用于衛星信號接收的,對于IT運維領域算是個外來詞語。
顧名思義,就是在不知道環境中有什么的情況下,通過平臺的自主發現能力來找到未知的設備。(當然這個盲掃也不會是什么信息都沒有,畢竟基礎的目標系統【核心生產系統】的IP網段等信息還是會有的)。
對于盲掃利用最多的是在安全領域。
一名菜鳥黑客的進階之路上必然要學會使用掃描工具對攻擊目標進行盲掃,以此來發現目標系統里都有些什么網絡設備、中間件或數據庫等,并根據發現的信息利用漏洞來開展攻擊行動。
而作為系統運維團隊,同樣可以利用掃描工具實現對IT系統的摸底及變更發現。
我們可以利用掃描工具來實現對IP地址段的盲掃,以及對指定IP的開放端口的掃描,并利用掃描獲取到的信息做進一步分析判斷,例如判斷設備是否存活,該設備上運行了哪些服務,甚至對于部署在該設備上操作系統級版本號都能一一識別。
這里我們以Nmap工具為例,講解如何利用該工具來實現對于主機或端口的掃描,并且利用掃描返回的信息做相應的判斷。
以下對于Nmap的描述來自Namp參考指南。
“Nmap(“Network Mapper(網絡映射器)”)是一款開放源代碼的網絡探測和安全審核的工具。
它的設計目標是快速地掃描大型網絡,當然用它掃描單個主機也沒有問題。Nmap以新穎的方式使用原始IP報文來發現網絡上有哪些主機,那些主機提供什么服務(應用程序名和版本),那些服務運行在什么操作系統(包括版本信息),它們使用什么類型的報文過濾器/防火墻,以及一堆其它功能。
雖然Nmap通常用于安全審核,許多系統管理員和網絡管理員也用它來做一些日常的工作,比如查看整個網絡的信息,管理服務升級計劃,以及監視主機和服務的運行。”
一個典型的Nmap掃描:
在上述的掃描中,我們可以得到以下信息:
目標ip主機是否存在。
目標主機開放了哪些端口。
目標主機上可能正在跑哪些常見服務。
目標主機的操作系統甚至版本。
MAC地址。
設備類型。
1.1 主機掃描:
1.1.1 Nmap支持十多種不同的主機探測方式;默認發送四種:
ICMP echo request
a TCP SYN packet to port 443
a TCP ACK packet to port 80
an ICMP timestamp request
整理了一些Nmap的常用參數功能使用方法如下,給大家參考。
l -sL:List Scan 列表掃描,僅將指定的目標IP列舉出來,不進行主機發現。
l -sP:Ping Scan 只利用ping掃描進行主機發現,不進行端口掃描。
n 默認情況下發送ICMP回聲請求和一個TCP報文到80端口,非特權用戶發送一個SYN報文到80端口。
n 可以和除-P0之外的任何發現探測類型-P*選項結合使用以達到更高的靈活性。
l -Pn/-P0:將所有指定的主機視作開啟的,跳過主機發現的過程。
l -PS [portlist]:TCP SYN Ping,發送一個設置了SYN標志位的空TCP報文。
n 默認端口為80(可設置),也可指定端口。
n 目標主機端口關閉,回復RST,端口開放,則回復SYN/ACK,但都表明目標主機在線。
n UNIX機器上,只有特權用戶才能發送和接收原始的TCP報文,因此非特權用戶進行系統調用connect(),也發送一個SYN報文來嘗試建立連接。
l -PA [portlist]:TCP ACK ping,發送一個設置了ACK標志位的TCP報文。
n 默認端口為80(可設置),也可指定端口。
n 目標主機在線,回復RST,不在線則超時。
n UNIX機器上,只有特權用戶才能發送和接收原始的TCP報文,因此非特權用戶進行系統調用connect(),也發送一個SYN報文來嘗試建立連接。
l -PU [portlist]:UDP Ping,發送一個空的UDP報文到指定的端口。
n 默認端口為31338(可設置)。
n 優勢是可以穿越只過濾TCP的防火墻或過濾器。
n 若端口關閉,則回復ICMP端口無法到達,說明主機在線;其他類型的ICMP錯誤如主機/網絡無法到達或者TTL超時則表示主機不在線;沒有回應也被這樣解釋,但不一定正確(因為大多數開放該端口的服務會忽略該UDP報文)。
l -PE; -PP; -PM:ICMP Ping Types,發送ICMP Type 8 (回聲請求)報文,期待從運行的主機得到一個type 0 (回聲相應)報文。
l -PR:ARP Ping
l -n:不用域名解析,加快掃描速度。
l -R:為所有目標IP地址作反向域名解析。
l --system-dns:使用系統域名解析器,一般不使用該選項,因為比較慢。
1.2 端口掃描:
1.2.1 Nmap將端口分成六個狀態
open(開放的):該端口正在接收TCP連接或者UDP報文。
closed(關閉的):關閉的端口接收nmap的探測報文并做出響應。
filtered(被過濾的):探測報文被包過濾阻止無法到達端口,nmap無法確定端口的開放情況。
unfiltered(未被過濾的):端口可訪問,但nmap仍無法確定端口的開放情況。
open|filtered(開放或者被過濾的):無法確定端口是開放的還是被過濾的。
closed|filtered(關閉或者被過濾的):無法確定端口是關閉的還是被過濾的。
1.2.2 Nmap產生結果是基于目標機器的響應報文的,而這些主機可能是不可信任的,會產生迷惑或者誤導nmap的報文,更普遍的是非RFC兼容的主機以不正確的方式響應nmap探測,FIN/NULL和Xmas掃描特容易遇到這些問題。
1.2.3 Nmap支持十幾種掃描技術,默認情況下執行一個SYN掃描;一般一次只用一種方法,除了UDP掃描(-sU)可能和任何一種TCP掃描結合使用;一般格式是-s
a) –sS:TCP SYN掃描,半開放掃描,掃描速度快,不易被注意到(不完成TCP連接);且能明確區分open|closed|filtered。
i. Open SYN/ACK
ii. Closed RST復位
iii. Filtered 數次重發沒響應,或者收到ICMP不可達
b) –sT:TCPConnect(),建立連接,容易被記錄;對原始報文控制少,效率低。
c) –sU:激活UDP掃描,對UDP服務進行掃描,如DNS/SNMP/DHCP等,可以和TCP掃描結合使用。
但是效率低下,開放的和被過濾的端口很少響應,加速UDP掃描的方法包括并發掃描更多的主機,先只對主要端口進行快速掃描,從防火墻后面掃描,使用--host-timeout跳過慢速的主機。
d) –sN; -sF; -sX:TCP Null,Fin, Xmas掃描,從RFC挖掘的微妙方法來區分開放關閉端口;除了探測報文的標志位不同,三種掃描在行為上一致。
e) –sA:TCP ACK掃描,只設置ACK標志位,區分被過濾與未被過濾的。
f) –sW:TCP窗口掃描,依賴于互聯網上少數系統的實現細節,因此可信度不高;根據窗口大小來判斷端口是開放的(正數)還是關閉的(0)。
g) –sM:TCP Maimon掃描,探測報文是FIN/ACK,端口開放或關閉,都對這樣的報文響應RST報文,但如果端口開放,許多基于BSD的系統只是丟棄該探測報文。
h) –scanflags:通過指定任意的TCP標志位來設計掃描,可以是數字標記值,也可以使用字符名如URG/ACK/PSH/RST/SYN/FIN。
i) –sI
j) –sO:IP協議掃描,可以確定目標機支持哪些IP協議(TCP, ICMP, IGMP)。
k) –b
1.2.4 端口說明和掃描順序:
默認情況下,對1-1024以及nmap-services文件中列出的更高的端口在掃描。
a) –p
例如,參數 -p U:53,111,137,T:21-25,80,139,8080 將掃描UDP 端口53,111,和137,同時掃描列出的TCP端口。
注意,要既掃描 UDP又掃描TCP,您必須指定 -sU ,以及至少一個TCP掃描類型(如 -sS,-sF,或者 -sT)。
b) –p
c) –p U:[UDP ports],T:[TCP ports]:對指定的端口進行指定協議的掃描。
d) –F:快速掃描(僅掃描100個最常用的端口),nmap-services文件指定想要掃描的端口;可以用—datadir選項指定自己的小小nmap-services文件。
e) –top-ports
f) –r:不要按隨機順序掃描端口,默認情況下按隨機(常用的端口前移)。
1.3 服務與版本探測
1.3.1 nmap-services是一個包含大約2200個著名的服務的數據庫,Nmap通過查詢該數據庫可以報告那些端口可能對應于什么服務器,但不一定正確。
1.3.2 在用某種掃描方法發現TCP/UDP端口后,版本探測會詢問這些端口,確定到底什么服務正在運行。
nmap-service-probes數據庫包含查詢不同服務的探測報文和解析識別響應的匹配表達式。
當Nmap從某個服務收到響應,但不能在數據庫中找到匹配時,就打印出一個fingerprint和一個URL給您提交。
1.3.3 用下列選項打開和控制版本探測
a) –sV:打開版本探測。
b) –allports:不為版本探測排除任何端口,默認情況下跳過9100端口。
c) –version-intensity
d) –version-light:是—version-intensity2的別名。
e) –version-all:是—version-intensity9的別名。
f) –version-trace:跟蹤版本掃描活動,打印出詳細的關于正在進行的掃描的調試信息。
g) –sR:RPC掃描,對所有被發現開放的TCP/UDP端口執行SunRPC程序NULL命令,來試圖 確定它們是否RPC端口,如果是, 是什么程序和版本號。
1.4 操作系統探測
1.4.1 用TCP/IP協議棧fingerprinting進行遠程操作系統探測,Nmap發送一系列TCP和UDP報文到遠程主機,檢查響應中的每一個比特。
在進行一打測試如TCPISN采樣,TCP選項支持和排序,IPID采樣,和初始窗口大小檢查之后, Nmap把結果和數據庫nmap-os-fingerprints中超過 1500個已知的操作系統的fingerprints進行比較,如果有匹配,就打印出操作系統的詳細信息。
每個fingerprint包括一個自由格式的關于OS的描述文本,和一個分類信息,它提供供應商名稱(如Sun),下面的操作系統(如Solaris),OS版本(如10),和設備類型(通用設備,路由器,switch,游戲控制臺等)。
1.4.2 采用下列選項啟用和控制操作系統檢測
a) –O:啟用操作系統檢測;-A可以同時啟用操作系統檢測和版本檢測。
b) –osscan-limit:針對指定的目標進行操作系統檢測。
c) –osscan-guess|--fuzzy:當Nmap無法確定所檢測的操作系統時,會盡可能地提供最相近的匹配。
由上述的參數控制可以看出,Nmap在掃描探測方面功能異常強大,因此它也成為一個已經被黑客用到極致的工具。
并且Nmap也同樣是被各種安全防御設備所關注的,包括iptable的一些參數設定可以防范Nmap的某些掃描行為,以此來提高網絡安全性。
幸運的是,我們作為IT系統的運維人員可以在更了解內部系統的防護要求的情況下,靈活地利用Nmap的各種掃描參數來組合并以此發現所管轄主機或設備,甚至用一些參數來判斷該主機開通了哪些服務或安裝了哪些中間件或數據庫軟件。
2、關系發現
在網段中發現了一個個目標設備后,我們再次聚焦到CMDB的名詞解釋:
配置管理數據庫( Configuration Management Database,CMDB)是一個邏輯數據庫,包含了配置項全生命周期的信息以及配置項之間的關系(包括物理關系、實時通信關系、非實時通信關系和依賴關系)。
CMDB作為配置管理工具,靈活的構建配置管理數據庫的關系模型至關重要。
關系模型包含很多的關系維度,例如:
代表管理關系的科室部門歸屬、設備科室歸屬、系統科室歸屬等。
代表部署關系的主機歸屬機房,或中間件、數據庫、應用、進程等部署主機等。
代表邏輯歸屬關系的應用與系統歸屬關系、進程與系統歸屬關系。
代表調用關系的應用調用關系、服務模塊之間的調用關系等。
對于邏輯存在的關系,需要依賴人工梳理,通過構建ITSM流程方式進行增刪改查的維護。
而對于物理存在的關系,我們會希望通過自動發現能力來提升維護效率。例如:
A)主機常駐進程發現
主機上運行的中間件、數據庫等組件或常駐執行的進程的發現,我們可以通過主機上部署的agent(默認對于管轄內的主機設備,我們能安裝agent)執行操作系統命令掃描。
常用的命令如:
ps -ef 查看所有的進程信息:
UID: 該進程執行的用戶id。
PID: 進程id。
PPID: 該進程的父級進程id,如果一個程序的父級進程找不到,該程序的進程被稱為僵尸進程。
C: cpu的占用率,形式是百分數(%)。
STIME: 進程的啟動時間。
TTY: 終端設備,發起該進程的設備識別符號,如果顯示‘ ?’表示該進程并不是由終端發起。
TIME: 進程的執行時間。
CMD: 該進程的名稱或對應的路徑。
B)定時執行任務發現
主機上經常會定時執行的后臺腳本任務,我們同樣可以通過主機上部署的agent執行操作系統命令來實現掃描獲取。
常用命令如:
crontab -l 查看定時任務。
對于獲取到的crontab任務,無論是否被注釋,都應該錄入到CMDB中進行管理,并將狀態定義為“停用”。
C)安裝了但并未執行的應用發現
我們經常會發現在主機上有一些并未被運行的進程或中間件應用,特別是作為冷備存在的系統組件。這些組件的發現能補全系統的完整拼圖,對于摸底系統的拓撲結構很關鍵。
這些應用的發現,由于并無進程執行,也無定時任務配置,往往是通過人工等方式調用運行,因此可以預置一些常見的安裝目錄包含的關鍵字符串,例如mysql、tomcat等數據庫、中間件等應用,往往其部署目錄名稱、路徑都具備一定的可識別邏輯。
通過模糊掃描這些特定的目錄名,往往能發現未被執行的應用。又如應用的啟動腳本,往往會帶有“start”之類的關鍵字段,同樣可以作為未執行進程發現的關鍵入口。
常用命令如:
find -name mysql*
D)關鍵配置文件發現
對于一些應用的配置文件,我們需要將其納管并監視其是否被修改,同樣首先需要做自發現。需要注意的是,這部分的發現只能算是半自動了,因為發現后需要人工進行一定的篩查,過濾掉一些無用數據。
根據掃描到的已知數據庫、中間件等配置目錄,再對其默認配置目錄進行掃描,獲取其關鍵配置文件。
通過掃描應用模塊或進程模塊的bin目錄、conf目錄、etc目錄等,并獲取其中的*.conf文件,*.xml文件,*.profile文件,*.application文件等。
常用命令如:
find / -name *.conf
E)應用(進程)間調用關系發現
調用關系的獲取,首先可以通過獲取ip之間的網絡關系。再根據主機上的端口歸屬進程來關聯出應用關系的建立。
a. 網絡端口互聯關系
常用的命令如:
netstat -ano
協議:分為TCP和UDP。
本地地址(Local Address):代表本機IP地址和打開的端口號。
外部地址(Foreign Address):遠程計算機IP地址和端口號。
狀態(State):表明當前的連接狀態。
PID:對應進程 的PID。根據PID可以找到對應的進程。
netstat命令的功能是顯示網絡連接、路由表和網絡接口信息,可以讓用戶得知目前都有哪些網絡連接正在運作。
netstat [選項]命令中各選項的含義如下:
-a 顯示所有socket,包括正在監聽的。
-c 每隔1秒就重新顯示一遍,直到用戶中斷它。
-i 顯示所有網絡接口的信息,格式同“ifconfig -e”。
-n 以網絡IP地址代替名稱,顯示出網絡連接情形。
-r 顯示核心路由表,格式同“route -e”。
-t 顯示TCP協議的連接情況。
-u 顯示UDP協議的連接情況。
-v 顯示正在進行的工作。
-A 顯示任何關聯的協議控制塊的地址。主要用于調試。
-a 顯示所有套接字的狀態。在一般情況下不顯示與服務器進程相關聯的套接字。
-i 顯示自動配置接口的狀態。那些在系統初始引導后配置的接口狀態不在輸出之列。
其state字段的枚舉值如下:
LISTEN:偵聽來自遠方的TCP端口的連接請求。
SYN-SENT:再發送連接請求后等待匹配的連接請求。
SYN-RECEIVED:再收到和發送一個連接請求后等待對方對連接請求的確認。
ESTABLISHED:代表一個打開的連接。
FIN-WAIT-1:等待遠程TCP連接中斷請求,或先前的連接中斷請求的確認。
FIN-WAIT-2:從遠程TCP等待連接中斷請求。
CLOSE-WAIT:等待從本地用戶發來的連接中斷請求。
CLOSING:等待遠程TCP對連接中斷的確認。
LAST-ACK:等待原來的發向遠程TCP的連接中斷請求的確認。
TIME-WAIT:等待足夠的時間以確保遠程TCP接收到連接中斷請求的確認。
CLOSED:沒有任何連接狀態。
b. 端口歸屬應用關系
根據前述的查看本機網絡端口開放命令查到的數據,其中有對應的PID,即進程號信息。我們可以使用lsof命令來獲取該端口所歸屬的應用信息。
當然,我們其實也可以直接使用lsof -i的命令獲取到某個端口所對應的進程名。
lsof(list open files)是一個列出當前系統打開文件的工具。在linux環境下,任何事物都以文件的形式存在,通過文件不僅僅可以訪問常規數據,還可以訪問網絡連接和硬件。
所以如傳輸控制協議 (TCP) 和用戶數據報協議 (UDP) 套接字等,系統在后臺都為該應用程序分配了一個文件描述符,無論這個文件的本質如何,該文件描述符為應用程序與基礎操作系統之間的交互提供了通用接口。
因為應用程序打開文件的描述符列表提供了大量關于這個應用程序本身的信息,因此通過lsof工具能夠查看這個列表對系統監測以及排錯將是很有幫助的。
lsof輸出各列信息的意義如下:
COMMAND:進程的名稱。
PID:進程標識符。
USER:進程所有者。
FD:文件描述符,應用程序通過文件描述符識別該文件。如cwd、txt等 。
TYPE:文件類型,如DIR、REG等。
DEVICE:指定磁盤的名稱。
SIZE:文件的大小。
NODE:索引節點(文件在磁盤上的標識)。
NAME:打開文件的確切名稱。
文章小結
本文主要闡述了對CMDB的配置數據構建過程中,利用一些常見的IT命令或工具實現以下自發現能力:
應用Nmap工具對內部網絡的ip地址段實現盲掃發現存活設備及盡可能獲取更多信息。
基于已知的IP主機,通過部署agent并執行ps、crontab、find等命令來發現垂直部署的應用、中間件、數據組件、進程、定時任務、未啟動應用(進程)、關鍵配置信息等配置信息。
使用netstat、lsof等命令發現當前主機與其他網絡對象的互聯關系,以及根據端口與應用之間的關系找到應用與應用之間的關系。
利用以上這些命令或小工具的組合,通過腳本或運維平臺上的流程配置、調度管理等功能進行串聯,借助數據加工處理能力做采集數據的解析,可以實現很多的CMDB的自發現場景。
分享
收藏
點贊
在看
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/129660.html
摘要:我加入了騰訊,騰訊企業文化很好,經常會有很多小組活動部門活動什么的,但是做運維很苦。所以,年的時候我們幾個騰訊的同事一同創業,希望把我們的想法和經驗能夠傳遞出來。這里我列出了騰訊互聯網運維團隊所經歷的三個階段。 本文是數人云深圳技術分享課上優維科技聯合創始人彭鯉航的演講實錄,演講主題是《運維自動化實踐》。 精彩觀點搶鮮看 實現運維自動化閉環,最主要就是配置管理、狀態管理和變更管理能力。...
摘要:導讀阿里巴巴轉型之后,運維平臺是如何建設的阿里巴巴高級技術專家陳喻結合運維自身的理解,業務場景的分析和業界方法論的一些思考,得出來一些最佳實踐分享給大家。實施效果嘉賓介紹陳喻亞松,阿里巴巴高級技術專家。 導讀:阿里巴巴DevOps轉型之后,運維平臺是如何建設的?阿里巴巴高級技術專家陳喻結合運維自身的理解,業務場景的分析和業界方法論的一些思考,得出來一些最佳實踐分享給大家。 前言 我是這...
摘要:郭理靖表示,在京東商城的實踐中,針對線上系統選擇構建兩個機房,分別是生產環境以及在災備環境。在監控引擎方面,京東云的嘗試也是比較細致的,其中包括監控服務報警服務等。進一步,根據不同的報警,我們可以定位到 showImg(https://segmentfault.com/img/bVbtNqp?w=688&h=113); showImg(https://segmentfault.com/...
摘要:郭理靖表示,在京東商城的實踐中,針對線上系統選擇構建兩個機房,分別是生產環境以及在災備環境。在監控引擎方面,京東云的嘗試也是比較細致的,其中包括監控服務報警服務等。進一步,根據不同的報警,我們可以定位到 showImg(https://segmentfault.com/img/bVbtNqp?w=688&h=113); showImg(https://segmentfault.com/...
摘要:郭理靖表示,在京東商城的實踐中,針對線上系統選擇構建兩個機房,分別是生產環境以及在災備環境。在監控引擎方面,京東云的嘗試也是比較細致的,其中包括監控服務報警服務等。進一步,根據不同的報警,我們可以定位到 showImg(https://segmentfault.com/img/bVbtNqp?w=688&h=113); showImg(https://segmentfault.com/...
閱讀 1347·2023-01-11 13:20
閱讀 1685·2023-01-11 13:20
閱讀 1133·2023-01-11 13:20
閱讀 1860·2023-01-11 13:20
閱讀 4101·2023-01-11 13:20
閱讀 2705·2023-01-11 13:20
閱讀 1386·2023-01-11 13:20
閱讀 3599·2023-01-11 13:20