# CMDB自发现能力盘点

> 作者/来源: UCloud 运营管理员
> 发布时间: 2023-01-11T05:20:00.000Z
> 分类: 解决方案
> 标签: AI, 数据库, 安全
> 原文链接: http://117.50.162.249:3000/yun/articles/1256

---

# CMDB自发现能力盘点

> 来源: https://www.ucloud.cn/yun/129660.html
> 作者: IT那活儿
> 发布日期: 发布于2023-01-11 13:20

CMDB自发现能力盘点

## **点击上方“IT那活儿”，关注后了解更多内容，不管什么活儿，干就完了！！！**

# 01

背  景

在IT系统运维领域，有一个平台或模块是绕不过去，那就是CMDB。

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129660/images/129660_000.png)

“配置管理数据库( Configuration Management Database,CMDB)是一个逻辑数据库，包含了配置项全生命周期的信息以及配置项之间的关系(包括物理关系、实时通信关系、非实时通信关系和依赖关系)。

CMDB存储与管理企业IT架构中设备的各种配置信息，它与所有服务支持和服务交付流程都紧密相联，支持这些流程的运转、发挥配置信息的价值，同时依赖于相关流程保证数据的准确性。”

以上的名词解释来自于百度百科。

可以看到在对CMDB的名词解释中有这样一句话“**依赖于相关流程保证数据的准确性**”。

相信做过相关运维工作的人看到这句话都会暗自苦笑，这特么就是一个大坑。

**CMDB数据不准确是运维中一个频频出现的场景。**

**原因也不难解释，无非以下几种：**

1）管理流程不完善，设备或系统上线下线、配置变更没有通知CMDB，存在随意改动的行为， CMDB作为一个旁路存在于生产业务系统之外，形同虚设。

2）有系统或设备的管理流程，但对于权限管理不到位，开发人员或维护人员能自主修改配置或对设备做上线下线处理，CMDB同样难以获取到这样的修改信息。

3）更有甚者，对于一个后来入驻的运维团队来说，可能在CMDB建设之初就没有IT系统环境的台账或台账不完善，搞不清楚到底有些什么设备。

由上述情况可以看出要实施好一套CMDB平台，需要建立完善的变更服务流程，需要精细化控制权限，还需要在技术手段上实现对IT环境变更的自发现能力。

变更服务流程的建立与IT管理部门的掌控能力有关，运维团队在技术上除了构建相对易用的ITSM流程以及提供权限管理入口外，更多的还是需要从管理入手，在此不做过多的阐述。

**本文主要从技术角度探讨如何利用常见的工具或系统命令构建CMDB的自发现能力。**

# 02

CMDB自发现能力盘点

**1. 盲扫**

在进入一个新的运维场地，或在项目现场做CMDB的POC时，经常会听到客户提出问题：

**你们的CMDB能不能做设备的盲扫？**

盲扫这个词原本是用于卫星信号接收的，对于IT运维领域算是个外来词语。

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129660/images/129660_001.png)

顾名思义，就是在不知道环境中有什么的情况下，通过平台的自主发现能力来找到未知的设备。（当然这个盲扫也不会是什么信息都没有，毕竟基础的目标系统【核心生产系统】的IP网段等信息还是会有的）。

**对于盲扫利用最多的是在安全领域。**

一名菜鸟黑客的进阶之路上必然要学会使用扫描工具对攻击目标进行盲扫，以此来发现目标系统里都有些什么网络设备、中间件或数据库等，并根据发现的信息利用漏洞来开展攻击行动。

**而作为系统运维团队，同样可以利用扫描工具实现对IT系统的摸底及变更发现。**

我们可以利用扫描工具来实现对IP地址段的盲扫，以及对指定IP的开放端口的扫描，并利用扫描获取到的信息做进一步分析判断，例如判断设备是否存活，该设备上运行了哪些服务，甚至对于部署在该设备上操作系统级版本号都能一一识别。

这里我们以Nmap工具为例，讲解如何利用该工具来实现对于主机或端口的扫描，并且利用扫描返回的信息做相应的判断。

**以下对于Nmap的描述来自Namp参考指南。**

“Nmap(“Network Mapper(网络映射器)”)是一款开放源代码的网络探测和安全审核的工具。

它的设计目标是快速地扫描大型网络，当然用它扫描单个主机也没有问题。Nmap以新颖的方式使用原始IP报文来发现网络上有哪些主机，那些主机提供什么服务(应用程序名和版本)，那些服务运行在什么操作系统(包括版本信息)，它们使用什么类型的报文过滤器/防火墙，以及一堆其它功能。

虽然Nmap通常用于安全审核，许多系统管理员和网络管理员也用它来做一些日常的工作，比如查看整个网络的信息，管理服务升级计划，以及监视主机和服务的运行。”

**一个典型的Nmap扫描：**

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129660/images/129660_002.png)

在上述的扫描中，我们可以得到以下信息：

- 目标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，除了deprecatedFTP bounce扫描-b。

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挖掘的微妙方法来区分开放关闭端口；除了探测报文的标志位不同，三种扫描在行为上一致。

i.优势：能躲过一些无状态防火墙和报文过滤路由器，比SYN还要隐秘。

ii.劣势：现代的IDS产品可以发现，并非所有的系统严格遵循RFC 793。

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 ：Idlescan，利用zombie主机上已知IP分段ID序列生成算法来窥探目标上开放端口的信息，极端隐蔽，可以指定端口号，否则默认80。

j) –sO：IP协议扫描，可以确定目标机支持哪些IP协议（TCP, ICMP, IGMP）。

k) –b ：FTP弹跳扫描。

1.2.4 端口说明和扫描顺序：

默认情况下，对1-1024以及nmap-services文件中列出的更高的端口在扫描。

a) –p ：只扫描指定的端口，单个端口和用连字符表示的端口范围都可以；当既扫描TCP端口又扫描UDP端口时，您可以通过在端口号前加上T: 或者U:指定协议。协议限定符一直有效您直到指定另一个。

例如，参数 -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 ：扫描指定的端口名称，如nmap–p smtp,http 10.10.1.44。

c) –p U:[UDP ports],T:[TCP ports]：对指定的端口进行指定协议的扫描。

d) –F：快速扫描（仅扫描100个最常用的端口），nmap-services文件指定想要扫描的端口；可以用—datadir选项指定自己的小小nmap-services文件。

e) –top-ports ：扫描前number个端口。

f) –r：不要按随机顺序扫描端口，默认情况下按随机（常用的端口前移）。

**1.3 服务与版本探测**

1.3.1 nmap-services是一个包含大约2200个著名的服务的数据库，Nmap通过查询该数据库可以报告那些端口可能对应于什么服务器，但不一定正确。

1.3.2 在用某种扫描方法发现TCP/UDP端口后，版本探测会询问这些端口，确定到底什么服务正在运行。

nmap-service-probes数据库包含查询不同服务的探测报文和解析识别响应的匹配表达式。

当Nmap从某个服务收到响应，但不能在数据库中找到匹配时，就打印出一个fingerprint和一个URL给您提交。

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129660/images/129660_003.png)

1.3.3 用下列选项打开和控制版本探测

a) –sV：打开版本探测。

b) –allports：不为版本探测排除任何端口，默认情况下跳过9100端口。

c) –version-intensity：设置版本扫描强度，范围为0-9，默认是7，强度越高，时间越长，服务越可能被正确识别。

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的某些扫描行为，以此来提高网络安全性**。

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129660/images/129660_004.png)

幸运的是，我们作为IT系统的运维人员可以在更了解内部系统的防护要求的情况下，灵活地利用Nmap的各种扫描参数来组合并以此发现所管辖主机或设备，甚至用一些参数来判断该主机开通了哪些服务或安装了哪些中间件或数据库软件。

**2、关系发现**

在网段中发现了一个个目标设备后，我们再次聚焦到CMDB的名词解释：

配置管理数据库( Configuration Management Database,CMDB)是一个逻辑数据库，包含了配置项全生命周期的信息以及**配置项之间的关系(包括物理关系、实时通信关系、非实时通信关系和依赖关系)**。

CMDB作为配置管理工具，灵活的构建配置管理数据库的关系模型至关重要。

**关系模型包含很多的关系维度，例如：**

1. 代表管理关系的科室部门归属、设备科室归属、系统科室归属等。
2. 代表部署关系的主机归属机房，或中间件、数据库、应用、进程等部署主机等。
3. 代表逻辑归属关系的应用与系统归属关系、进程与系统归属关系。
4. 代表调用关系的应用调用关系、服务模块之间的调用关系等。

对于逻辑存在的关系，需要依赖人工梳理，通过构建ITSM流程方式进行增删改查的维护。

**而对于物理存在的关系，我们会希望通过自动发现能力来提升维护效率。例如：**

**A）主机常驻进程发现**

主机上运行的中间件、数据库等组件或常驻执行的进程的发现，我们可以通过主机上部署的agent（默认对于管辖内的主机设备，我们能安装agent）执行操作系统命令扫描。

**常用的命令如：**

- ps -ef 查看所有的进程信息：

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129660/images/129660_005.png)

- UID: 该进程执行的用户id。
- PID: 进程id。
- PPID: 该进程的父级进程id，如果一个程序的父级进程找不到，该程序的进程被称为僵尸进程。
- C: cpu的占用率，形式是百分数（%）。
- STIME: 进程的启动时间。
- TTY: 终端设备，发起该进程的设备识别符号，如果显示‘ ？’表示该进程并不是由终端发起。
- TIME: 进程的执行时间。
- CMD: 该进程的名称或对应的路径。

****B）**定时执行任务发现**

主机上经常会定时执行的后台脚本任务，我们同样可以通过主机上部署的agent执行操作系统命令来实现扫描获取。

**常用命令如：**

crontab -l 查看定时任务。

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129660/images/129660_006.png)

对于获取到的crontab任务，无论是否被注释，都应该录入到CMDB中进行管理，并将状态定义为“停用”。

**C）安装了但并未执行的应用发现**

我们经常会发现在主机上有一些并未被运行的进程或中间件应用，特别是作为冷备存在的系统组件。这些组件的发现能补全系统的完整拼图，对于摸底系统的拓扑结构很关键。

这些应用的发现，由于并无进程执行，也无定时任务配置，往往是通过人工等方式调用运行，因此可以预置一些常见的安装目录包含的关键字符串，例如mysql、tomcat等数据库、中间件等应用，往往其部署目录名称、路径都具备一定的可识别逻辑。

通过模糊扫描这些特定的目录名，往往能发现未被执行的应用。又如应用的启动脚本，往往会带有“start”之类的关键字段，同样可以作为未执行进程发现的关键入口。

**常用命令如：**

find -name mysql\*

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129660/images/129660_007.png)

**D）关键配置文件发现**

对于一些应用的配置文件，我们需要将其纳管并监视其是否被修改，同样首先需要做自发现。需要注意的是，这部分的发现只能算是半自动了，因为发现后需要人工进行一定的筛查，过滤掉一些无用数据。

1. 根据扫描到的已知数据库、中间件等配置目录，再对其默认配置目录进行扫描，获取其关键配置文件。
2. 通过扫描应用模块或进程模块的bin目录、conf目录、etc目录等，并获取其中的\*.conf文件，\*.xml文件，\*.profile文件，\*.application文件等。

**常用命令如:**

find / -name \*.conf

**E）应用（进程）间调用关系发现**

调用关系的获取，首先可以通过获取ip之间的网络关系。再根据主机上的端口归属进程来关联出应用关系的建立。

**a. 网络端口互联关系**

**常用的命令如：**

netstat -ano

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129660/images/129660_008.png)

- 协议：分为TCP和UDP。
- 本地地址（Local Address）：代表本机IP地址和打开的端口号。
- 外部地址（Foreign Address）：远程计算机IP地址和端口号。
- 状态（State）：表明当前的连接状态。
- PID：对应进程 的PID。根据PID可以找到对应的进程。

**netstat命令的功能是显示网络连接、路由表和网络接口信息，可以让用户得知目前都有哪些网络连接正在运作。**

**netsta****t [选项]命令中各选项的含义如下：**

- -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的命令获取到某个端口所对应的进程名。

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129660/images/129660_009.png)

lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下，任何事物都以文件的形式存在，通过文件不仅仅可以访问常规数据，还可以访问网络连接和硬件。

所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等，系统在后台都为该应用程序分配了一个文件描述符，无论这个文件的本质如何，该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。

因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息，因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

**lsof输出各列信息的意义如下：**

- COMMAND：进程的名称。
- PID：进程标识符。
- USER：进程所有者。
- FD：文件描述符，应用程序通过文件描述符识别该文件。如cwd、txt等 。
- TYPE：文件类型，如DIR、REG等。
- DEVICE：指定磁盘的名称。
- SIZE：文件的大小。
- NODE：索引节点（文件在磁盘上的标识）。
- NAME：打开文件的确切名称。

# 03

文章小结

本文主要阐述了对CMDB的配置数据构建过程中，利用一些常见的IT命令或工具实现以下自发现能力：

1. 应用Nmap工具对内部网络的ip地址段实现盲扫发现存活设备及尽可能获取更多信息。
2. 基于已知的IP主机，通过部署agent并执行ps、crontab、find等命令来发现垂直部署的应用、中间件、数据组件、进程、定时任务、未启动应用（进程）、关键配置信息等配置信息。
3. 使用netstat、lsof等命令发现当前主机与其他网络对象的互联关系，以及根据端口与应用之间的关系找到应用与应用之间的关系。

利用以上这些命令或小工具的组合，通过脚本或运维平台上的流程配置、调度管理等功能进行串联，借助数据加工处理能力做采集数据的解析，可以实现很多的CMDB的自发现场景。

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129660/images/129660_010.png)

## 本文作者：李秋霖

## 本文来源：IT那活儿（上海新炬王翦团队）

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129660/images/129660_011.png)

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129660/images/129660_012.png)

分享

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129660/images/129660_013.png)

收藏

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129660/images/129660_014.png)

点赞

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129660/images/129660_015.png)

在看