2021SC@SDUSC
os-sim/frameworked源码分析之NagiosMisc.py
一、库
#
# GLOBAL IMPORTS
#
import os
import pwd
import grp
#
# LOCAL IMPORTS
#
from OssimConf import OssimConf
from OssimConf import OssimMiniConf
from Logger import Logger
from DBConstantNames import *
logger = Logger.logger
1、os库在前面一篇文章讲过,链接在这OSSIM项目研究记录(九)
主要作用:提供了多数操作系统的功能接口函数。
2、pwd模块,提供了一个Unix 密码数据库(/etc/passwd)的接口,这个数据库包含本地机器用户账户信息。
pwd.getpwuid(uid):
返回对应uid的用户信息
pwd.getpwnam(name):
返回对应name的用户信息
pwd.getpwall():
返回所有用户信息
3、grp模块,提供了一个Unix 用户组/group(/etc/group)数据库的接口。
grp.getgrgid(gid):
返回对应gid的组信息
grp.getgrname(name):
返回对应group name的组信息
grp.getgrall():
返回所有组信息
pwd和grp的用法都十分相似,对于操作linux系统用户和组十分方便灵活,推荐使用。
二、模块化分析
OSSIM有几个重要组成部分
- Arpwatch – 用于MAC异常检测。
- P0f – 用于被动操作系统检测和操作系统更改分析。
- Pads –用于服务异常检测。
- Nessus –用于漏洞评估和相互关联(IDS vs Security Scanner)
- Snort –IDS也用于与nessus的互相关。
- Tcptrack –用于会话数据信息,可证明对攻击关联有用。
- Ntop – 它建立了一个令人印象深刻的网络信息数据库,我们可以从中识别异常行为/异常检测。
- Nagios – 从主机资产数据库获取,它监视主机和服务可用性信息。
- Osiris – 一个 great HIDS.
- OCS-NG – 跨平台库存解决方案。
- OSSEC – 完整性、rootkit、注册表检测等。
本次分析的文件NagiosMisc.py从名字就可以看出和Nagios组件有关。
Nagios 主要功能如下:
监视网络服务 (SMTP, POP3, HTTP, NNTP, PING等)
监视主机资源 (进程, 磁盘等)
简单的插件设计可以轻松扩展Nagios的监视功能
服务等监视的并发处理
错误通知功能 (通过email, pager, 或其他用户自定义方法)
可指定自定义的事件处理控制器
可选的基于浏览器的WEB界面以方便系统管理人员查看网络状态,各种系统问题,以及日志等等
可以通过手机查看系统监控信息
三、class nagios_host
1、获取本机文件的地址,连接两个或更多的路径名组件
def file_host(self):
if self.__conf is None:
self.__conf = OssimConf ()
logger.debug("Getting new ossim config for %s " % self._name)
return os.path.join(self.__conf[VAR_NAGIOS_CFG], "hosts", self._address + ".cfg")
2、输出已检查的主机配置信息
def write(self):
cfg_text = "define host{\n"
cfg_text += "\thost_name " + self._alias + "\n"
cfg_text += "\talias " + self._alias + "\n"
cfg_text += "\taddress " + self._address + "\n"
cfg_text += "\tuse " + self._use + "\n"
cfg_text += "\t}\n"
try:
f=open(self.file_host(), "w")
f.write(cfg_text)
logger.debug("host configuration checked for %s " % self._name)
except Exception, e:
logger.error(e)
return False
四、class nagios_host
最关键的函数 def select_command
:
这就涉及到前文所说的监视网络服务,网络服务的协议有很多,这里需要进行选择。
通过端口号以及self的属性service_type来判断。
获取内容后在从配置文件里取用户名和密码登录DB。
def select_command(self):
if self._protocol not in self._allow_protocols:
return
if self._service_type in ['ping','PING']:
self._check_cmd = "check_ping!100.0,20%!500,60%"
self._descr='PING'
else:
port=self._port
if port == 21 and self._service_type in ['ftp','FTP']:
self._check_cmd="check_ftp"
self._descr="FTP"
elif port == 22 and self._service_type in ['ssh','SSH']:
self._check_cmd="check_ssh"
self._descr="SSH"
elif port == 23 and self._service_type in ['telnet','TELNET']:
self._check_cmd="check_tcp!23"
self._descr="TELNET"
elif port == 25 and self._service_type in ['smtp','SMTP']:
self._check_cmd="check_smtp"
self._descr="SMTP"
elif port == 80 and self._service_type in ['http','HTTP']:
self._check_cmd="check_http"
self._descr="HTTP"
elif port == 161 and self._service_type in ['snmp','SNMP']:
self._check_cmd="check_snmp"
self._descr="SNMP"
elif port == 389 and self._service_type in ['ldap','LDAP']:
self._check_cmd="check_ldap"
self._descr="LDAP"
elif port == 3306 and self._service_type in ['mysql', 'MYSQL']:
db_ip = self.__conf.__getitem__('ossim_host')
db_user = self.__conf.__getitem__('ossim_user')
db_pass = self.__conf.__getitem__('ossim_pass')
mysql_conf = '/etc/nagios/mysql.cnf'
nagios_dir = os.path.dirname(mysql_conf)
try:
os.stat(nagios_dir)
except:
os.mkdir(nagios_dir)
f = open(mysql_conf, 'w+')
f.write('[client]\nuser = ' + db_user + '\npassword = ' + db_pass + '\n')
f.close()
uid = pwd.getpwnam("root").pw_uid
gid = grp.getgrnam("nagios").gr_gid
os.chown(mysql_conf, uid, gid)
os.chmod(mysql_conf, 0640)
self._check_cmd = "av_check_mysql!" + db_ip
self._descr = "MYSQL"
else:
self._check_cmd="check_tcp!%d" % self._port
self._descr="GENERIC_TCP_%d" % self._port
# To search in /etc/services !!!
五、class nagios_host与class nagios_host_group_service
从方法上来说,几乎差别不大,那么这两者的区别和作用是什么呢?
答案是:没有区别,即使class nagios_host多了一个方法debug,但作用只是输出调试信息。
在后续程序中,为了区别服务和主机组的概念特别生成两个类,但方法实际相同。