系统环境部署

系统环境说明

系统安全审计功能的服务器端作为 OMServer 项目的 App 存在,关于服务器端 Web Server 的环境搭建本节将不再说明。为了便于读者理解,下面对上报主机系统环境配置、Agent 与服务器端 Python 实现方法进行详细说明,环境设备角色如表14-1所示。

image 2023 12 09 17 27 27 035
Figure 1. 表14-1 系统环境说明表

上报主机配置

系统安全审计功能主机上报需要完成两个任务,一为配置用户 profile,二为编写上报 Python 脚本,下面一一进行说明。

(1) 系统用户环境配置

通过配置 Linux profile 的 history 相关变量来实现与安全审计功能的对接,包括指定系统账号 history 存放路径、存储长度、扩展信息、PROMPT_COMMAND 事件等,更多见以下配置及含义说明。

# vi /etc/profile
# 追加以下配置
#add by OMAudit
export HISTFILE=$HOME/.bash_history    #指定用户history日志存放路径
export HISTSIZE=1200    #指定history命令输出的记录数
export HISTFILESIZE=1200    #指定历史记录文件.bash_history的最大存储行数
export HISTCONTROL=ignoredups    #不记录连续重复的命令
export HISTTIMEFORMAT="`whoami` %F %T "  # history命令显示当前记录的用户与时间,例如:
#“root 2014-06-05 23:32:16 free -m”
# PROMPT_COMMAND变量最为核心,实现了指定内容在出现bash提示符前执行的功能;
#“history -a”将目前新增的history命令写入histfiles中;“history -c”刪除记录的所有命令(仅内存);
#“history -r”将histfiles的內容读到内存中,即可以通过history查看;
#“/home/test/OMAudit/OMAudit_agent.py $(history 1)”通过$(history 1)获取最后一条
# 命令,且作为参数传递给OMAuditmain.py脚本,做后续的命令数据信息上报
export PROMPT_COMMAND="history -a; history -c; history -r;"'/home/test/OMAudit/
OMAudit_agent.py $(history 1)'
shopt -s histappend    #历史清单将以添加形式加入HISTFILE变量指定的文件,而不是覆盖
typeset -r PROMPT_COMMAND    #设置关键变量只读,提高安全性
typeset -r HISTTIMEFORMAT

保存配置后使其生效,运行 “source /etc/profile” 命令,profile 环境配置完成。

(2) 客户端上报脚本

客户端上报脚本的作用是将接收的最新 Linux 命令 “$(history 1)” 及服务器相关信息提交到 OMServer 主机,其中 config.py 为上报 agent 的配置文件,涉及三个选项,详细说明如下:

OMAudit/config.py
# -*- coding: utf-8-*-
#!/usr/bin/env python
Net_driver = "eth0"    #为便于记录上报来源主机,获取指定网卡驱动的IP地址
OMServer_address = "omserver.domain.com"    #OMServer服务器端地址,作为上报的目的
Connect_TimeOut = 3    #指定上报超时时间,单位为秒

OMAudit_agent.py 作为主上报 agent 程序,负责信息的上报,采用了 httplib 模块作为 HTTP 客户端,详细源码及说明如下:

OMAudit/OMAudit_agent.py
#!/usr/bin/env python

# coding:utf-8
import sys
import socket
import fcntl
import struct
import logging
from config import *
import urllib, httplib

socket.setdefaulttimeout(Connect_TimeOut)  # 设置全局Socket超时时间(覆盖HTTP连接超时)
logging.basicConfig(level=logging.DEBUG,  # 启用日志记录
            format = '%(asctime)s [%(levelname)s] %(message)s',
            filename = sys.path[0] + '/omsys.log',
            filemode = 'a')

# 对$(history 1)信息进行合法校验,少于6个参数则报错,正确的格式为“173  root 2014-06-07 22: 05:56 ls”
if len(sys.argv) < 6:
    logging.error('History not configured in /etc/profile!')
    sys.exit()


def get_local_ip(ethname):  # 获取本地IP地址函数,用来确认数据来源
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        addr = fcntl.ioctl(sock.fileno(), 0x8915, struct.pack('256s', ethname))
        return socket.inet_ntoa(addr[20:24])
    except Exception as e:
        logging.error('get localhost IP address error:' + str(e))
        return "127.0.0.1"


def pull_history(http_get_param=""):  # 数据上报函数
    try:
        # 与OMServer服务器建立HTTP连接,指定超时时间
        http_client = httplib.HTTPConnection(OMServer_address, 80, timeout=Connect_TimeOut)
        http_client.request("GET", http_get_param)  # 发起GET请求
        response = http_client.getresponse()  # 获取HTTP返回对象
        if response.status != 200:  # 非HTTP 200状态则退出
            logging.error('response http status error:' + str(response.status))
            sys.exit()

        http_content = response.read().strip()  # 返回字符串非“OK”则退出
        if http_content != "OK":
            logging.error('response http content error:' + str(http_content))
            sys.exit()

    except Exception as e:
        logging.error('connection django-cgi server error:' + str(e))
        sys.exit()
    finally:
        if http_client:
            http_client.close()
        else:
            logging.error('connection django-cgi server unknown error.')
            sys.exit()


Sysip = get_local_ip(Net_driver)  # 调用获取本地IP函数
SysUser = sys.argv[2]  # 获取history信息中的系统用户
History_Id = sys.argv[1]  # 获取history ID信息
History_date = sys.argv[3]  # 获取history日期信息
History_time = sys.argv[4]  # 获取history时间信息
History_command = ""

for i in range(5, len(sys.argv)):  # 获取history的系统命令信息
    History_command += sys.argv[i] + " "

# 合并所有信息的HTTP GET参数格式,部分信息使用urllib.quote进行URL编码
s = "/omaudit/omaudit_pull/?history_id=" + History_Id + "&history_ip = "+Sysip+" & history_user = "+SysUser+ \
    " & history_datetime = "+History_date+urllib.quote(" ")+History_time+" & history_command = "+urllib.quote(History_command.strip())
pull_history(s)  # 调用数据上报函数

添加 “/home/test/OMAudit/OMAudit_agent.py” 可执行权限,执行以下 chmod 命令,客户端上报 agent 部署完毕。接下来使用 SSH 工具登录Linux 服务器,输入的任何 shell 命令都会即时同步到服务器端,见图14-4。

image 2023 12 09 17 40 44 534
Figure 2. 图14-4 系统命令即时上报并展示
# chmod +x/home/test/OMAudit/OMAudit_agent.py