Python 环境搭建:Python3 安装、虚拟环境、常用审计库
嗯,开始搭环境了。说实话,我见过太多审计日志脚本跑不起来,最后发现是 Python 版本不对或者包冲突。这一章咱们把地基打牢,后面写代码才不会手忙脚乱。
Python3 安装、虚拟环境隔离、再加上 re、datetime、json 这三个审计必备库,三件事一次搞定。我个人的习惯是:先装干净的系统 Python,然后用虚拟环境隔离每个项目,这样就算同时跑十几个审计脚本也不会打架。
4.1 Python3 安装:不同系统怎么选
你想想看,审计日志巡检脚本大多数跑在 Linux 服务器上,但开发环境可能是 Windows 或 macOS。所以三种平台的安装方法都得会。
| 操作系统 | 推荐版本 | 安装方式 | 注意事项 |
|---|---|---|---|
| Linux (Ubuntu/Debian) | Python 3.8+ | sudo apt install python3 python3-pip | 系统自带 Python3,千万别动默认 python 软链接 |
| Linux (CentOS/RHEL) | Python 3.9+ | yum 安装或源码编译 | 旧版本可能自带 Python2,需要单独安装 Python3 |
| Windows | Python 3.10+ | 官网下载 exe,勾选「Add to PATH」 | 安装完重启终端,否则环境变量不生效 |
| macOS | Python 3.11+ | Homebrew: brew install python@3.11 | 系统自带 Python3 是旧版,建议用 brew 装最新 |
yum install python3 装了个 3.6.8,结果 regex 库有些特性不支持,最后被迫重新编译 3.9。所以建议审计脚本最低要求 Python 3.8,最好 3.10 以上。装完验证一下:
python3 --version
pip3 --version
能看到版本号就对了。好,环境搭好了,接下来是虚拟环境。
4.2 虚拟环境:独立房间,互不干扰
为什么要用虚拟环境?说白了,就是怕不同项目的依赖打架。比如项目 A 用 requests 2.28,项目 B 用 requests 2.30,全局装的话肯定乱套。我建议每个审计脚本项目都建独立的虚拟环境。
venv 模块(Python 3.3+ 内置)
# 创建虚拟环境
python3 -m venv audit_env
# 激活(Linux/macOS)
source audit_env/bin/activate
# 激活(Windows CMD)
audit_env\Scripts\activate.bat
# 激活(Windows PowerShell)
audit_env\Scripts\Activate.ps1
激活后终端前面会出现 (audit_env) 前缀,代表你已经在虚拟环境里了。此时 pip install 的包只会装在这个环境里,不会污染全局。
requirements.txt,把依赖写进去。这样新人克隆仓库后,只要执行 pip install -r requirements.txt 就能一键还原环境。退出虚拟环境
deactivate
嗯,就这么简单。接下来是三个审计审计日志最常用的库,我一个个说。
4.3 正则表达式库 re:日志文本处理的核心武器
审计日志本质上是文本,而正则表达式就是文本的「手术刀」。我在项目里用它提取 IP 地址、时间戳、错误码、操作类型……几乎每天都要写几十条正则。
重点掌握几个函数:
re.search(pattern, string)– 扫描整个字符串,返回第一个匹配re.findall(pattern, string)– 返回所有匹配的列表re.sub(pattern, repl, string)– 替换匹配的部分re.compile(pattern)– 编译正则,提高多次匹配的效率
举个例子,从一条审计日志里提取操作人和时间:
import re
log = "2024-09-15 10:23:45 用户 admin 执行了 删除操作,目标文件 /etc/passwd"
pattern = r"(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) 用户 (\w+) 执行了 (\w+)"
match = re.search(pattern, log)
if match:
timestamp, user, action = match.groups()
print(f"时间:{timestamp},用户:{user},操作:{action}")
输出:时间:2024-09-15 10:23:45,用户:admin,操作:删除操作
.,结果匹配到了意料之外的字符。审计日志里有很多特殊字符(比如 /、.、*),记得用 \. 或原始字符串 r"..."。4.4 日期时间库 datetime:时间戳处理利器
审计日志最不缺的就是时间。什么时候发生的?距离现在多久?凌晨和高峰期的异常要分开统计?这些都要用 datetime 处理。
最常用的几个功能:
datetime.now()– 当前时间datetime.strptime(date_str, format)– 字符串转 datetime 对象datetime.strftime(format)– datetime 对象转指定格式字符串timedelta– 时间差计算
看一段实际代码:
from datetime import datetime, timedelta
# 解析日志时间
log_time = datetime.strptime("2024-09-15 10:23:45", "%Y-%m-%d %H:%M:%S")
now = datetime.now()
delta = now - log_time
print(f"该日志距今 {delta.days} 天 {delta.seconds//3600} 小时")
# 判断是否在巡检窗口内(例如凌晨2-4点)
hour = log_time.hour
if 2 <= hour < 4:
print("这是凌晨巡检段,需要特殊关注")
注意:日志里的时间格式五花八门。有的带时区 2024-09-15T10:23:45+08:00,有的用斜杠 2024/09/15。我的经验是:先统一转换成标准格式再处理,否则会乱。
DATE_FORMAT = "%Y-%m-%d %H:%M:%S" 常量,所有 strptime 和 strftime 都用它,改格式时只改一行。4.5 JSON 库 json:日志结构化的标准方案
很多现代审计系统(比如 Elasticsearch 接入的日志)直接输出 JSON 格式。json 库就干两件事:dumps(Python 对象转 JSON 字符串),loads(JSON 字符串转 Python 字典)。
import json
# 假设这是一条从日志文件读取的 JSON 行
log_line = '{"timestamp": "2024-09-15T10:23:45Z", "user": "admin", "action": "delete", "target": "/etc/passwd", "result": "success"}'
event = json.loads(log_line)
# 访问字段
print(event["user"]) # admin
print(event["action"]) # delete
# 修改后写回文件
event["result"] = "failure"
with open("parsed_audit.json", "w") as f:
json.dump(event, f, indent=2)
经常会有多层嵌套的 JSON 结构。比如:
{
"request": {
"header": {"method": "POST"},
"body": {"id": 123}
},
"response": {
"status": 200,
"data": []
}
}
取值时用 chain 索引:event["request"]["header"]["method"]。如果怕键不存在,用 .get() 方法加默认值。
2024-09-15T10:23:45Z),而 datetime 库不直接支持 "Z" 结尾。我一般先替换 "Z" 为 "+00:00",或者用 datetime.fromisoformat()(Python 3.7+ 支持部分格式)。4.6 本章知识结构总览
下面这张图把 Python 环境搭建的核心逻辑串起来了。你可以当作速查地图:左边是环境安装,右边是三个库的使用场景。
好了,现在你的机器上应该已经装好 Python3,学会了虚拟环境,也认识了 re/datetime/json 三个核心库。这些工具就像审计员的扳手、螺丝刀和万用表,接下来我们就要用它们修机器了——下一章直接上手写第一个巡检脚本。不过那得你自己翻页看了。