diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/references/SSH登录方式与故障排查.md b/01_卡资(金)/金仓_存储备份/服务器管理/references/SSH登录方式与故障排查.md index 360a9f11..c07f0074 100644 --- a/01_卡资(金)/金仓_存储备份/服务器管理/references/SSH登录方式与故障排查.md +++ b/01_卡资(金)/金仓_存储备份/服务器管理/references/SSH登录方式与故障排查.md @@ -1,7 +1,8 @@ # 宝塔 SSH 登录方式与故障排查 > 当一种方式失败时,依次尝试其他方式。终极备选:**宝塔面板 → 终端**(无需 SSH)。 -> **存客宝 SSH 修复**:在存客宝宝塔终端执行 `scripts/存客宝_SSH修复_宝塔终端执行.sh` 内容。 +> **存客宝 SSH 修复**:在存客宝宝塔终端执行 `scripts/存客宝_SSH修复_宝塔终端执行.sh` 内容。 +> **存客宝已关闭 22 端口**:仅保留 22022,防暴力破解。连接用:`ssh -p 22022 root@42.194.245.239`。 ## 启动 SSH 并保证连接成功(kr宝塔 43.139.27.93) diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/references/存客宝_宝塔管理SKILL.md b/01_卡资(金)/金仓_存储备份/服务器管理/references/存客宝_宝塔管理SKILL.md index cfb71f05..df8a603e 100644 --- a/01_卡资(金)/金仓_存储备份/服务器管理/references/存客宝_宝塔管理SKILL.md +++ b/01_卡资(金)/金仓_存储备份/服务器管理/references/存客宝_宝塔管理SKILL.md @@ -51,6 +51,19 @@ killall nginx; sleep 2; /www/server/nginx/sbin/nginx -c /www/server/nginx/conf/n --- +## 安全告警(挖矿木马等) + +若腾讯云主机安全告警恶意文件(如 Linux.Risk.Miner.Jcnw): + +1. **宝塔终端(推荐)**:打开 https://42.194.245.239:9988 → 终端 → 粘贴执行 `scripts/存客宝_清理挖矿并防入侵_宝塔终端执行.sh` 全部内容(含清理 + 去持久化 + 防再入)。 +2. **本机 SSH**:`sshpass -p 'Zhiqun1984' ssh -o StrictHostKeyChecking=no -p 22 root@42.194.245.239 'bash -s' < scripts/存客宝_清理挖矿并防入侵加固_SSH执行.sh` +3. **TAT**:`python3 scripts/腾讯云_TAT_存客宝_清理挖矿木马.py` +4. **控制台**:入侵检测 → 文件查杀 → 确认处置并开启防护 + +**关闭 22 端口(防入侵)**:存客宝已通过 TAT 或脚本关闭 22,仅保留 22022。SSH 仅用:`ssh -p 22022 root@42.194.245.239`。手动执行:`scripts/存客宝_关闭22端口仅保留22022_宝塔终端执行.sh`。 + +--- + ## 主 Skill 与错误处理 - **主 Skill**:`references/宝塔Node项目管理_SKILL.md`(凭证、Node API、常见错误、脚本) diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/references/存客宝_挖矿木马Linux.Risk.Miner.Jcnw_分析.md b/01_卡资(金)/金仓_存储备份/服务器管理/references/存客宝_挖矿木马Linux.Risk.Miner.Jcnw_分析.md new file mode 100644 index 00000000..d254f8d5 --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/服务器管理/references/存客宝_挖矿木马Linux.Risk.Miner.Jcnw_分析.md @@ -0,0 +1,75 @@ +# 存客宝挖矿木马 Linux.Risk.Miner.Jcnw 分析 + +> 告警文件:`/tmp/.esd101/.system3d` | 存客宝 42.194.245.239 | 腾讯云主机安全 + +--- + +## 一、木马类型与用途 + +| 项目 | 说明 | +|------|------| +| **类型** | 挖矿木马(Cryptominer) | +| **命名** | Linux.Risk.Miner.Jcnw(腾讯云/安全厂商检测名) | +| **用途** | 在受害主机上**偷偷跑加密货币挖矿**(常见为 XMR/Monero),占用 CPU/GPU 与带宽,收益归攻击者 | +| **危害** | 资源被占导致业务卡顿、电费与带宽成本上升、可能伴随后门与横向移动 | + +**本质**:在你这台服务器上“免费用电、用算力”给攻击者挖矿,不偷数据、不直接加密文件,但会拖慢服务并增加被进一步入侵的风险。 + +--- + +## 二、入侵节奏(典型链路) + +此类 Linux 挖矿木马常见入侵顺序如下: + +``` +1. 入口(Initial Access) + ├─ SSH 弱密码 / 默认密码 暴力破解(最常见) + ├─ 暴露的 Redis / Docker API / 未授权服务 + ├─ Web 漏洞(RCE、反序列化等) + └─ 老旧组件 N 日漏洞(如 WebLogic、Struts) + +2. 执行与落地 + ├─ 下载或写入恶意二进制到 /tmp、/var/tmp、/dev/shm 等 + ├─ 使用隐藏目录(如 .esd101)和伪装名(如 .system3d)躲避巡检 + └─ 直接执行或通过 shell 脚本拉起挖矿进程 + +3. 持久化(Persistence) + ├─ 写 crontab(如 @reboot、定期拉新) + ├─ 写 systemd 服务或 /etc/rc.local + ├─ 篡改 ~/.ssh/authorized_keys 留后门 + └─ 部分变种会改 /etc/ld.so.preload 等隐藏进程 + +4. 运行与通信 + ├─ 进程占用高 CPU,连接矿池或 C2 + └─ 可能检测到“有人登录”时暂时休眠以规避排查 +``` + +**存客宝场景**:路径 `/tmp/.esd101/.system3d` 符合「临时目录 + 隐藏目录 + 伪装名」的典型挖矿落地方式;若曾用弱密码或 22/22022 长期暴露,**SSH 暴力破解**是最可能的入口。 + +--- + +## 三、与“小型宝塔”处理的一致性 + +- **类型**:同为 Linux 挖矿木马,目的一致(占资源挖矿)。 +- **处理**:结束进程 → 删恶意文件/目录 → 清 crontab 等持久化 → 加固(防爆破、强密码、限端口)。 +- **防再入**:关弱密码 SSH、开 fail2ban/防爆破、改面板与 SSH 端口、定期查 crontab 与 `/tmp` 下隐藏目录。 + +--- + +## 四、防护与自检清单 + +| 措施 | 说明 | +|------|------| +| SSH | 禁用密码登录,仅密钥;或强密码 + fail2ban/防爆破 | +| 端口 | 22/22022 不必要不暴露公网,或改端口 + 防火墙限源 IP | +| 宝塔 | 强密码、改 9988 端口、限 IP 访问(安全 → 入口限制) | +| 自检 | 定期 `crontab -l`、`ls -la /tmp`、`ps aux` 看高 CPU 进程 | +| 腾讯云 | 主机安全保持开启,入侵检测/文件查杀告警及时处置 | + +--- + +## 五、相关脚本与文档 + +- 清理+防再入(宝塔终端):`scripts/存客宝_清理挖矿并防入侵_宝塔终端执行.sh` +- SSH 执行:`scripts/存客宝_清理挖矿并防入侵加固_SSH执行.sh` +- 存客宝管理入口:`references/存客宝_宝塔管理SKILL.md`(安全告警小节) diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_关闭22端口仅保留22022_宝塔终端执行.sh b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_关闭22端口仅保留22022_宝塔终端执行.sh new file mode 100644 index 00000000..044fd6af --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_关闭22端口仅保留22022_宝塔终端执行.sh @@ -0,0 +1,13 @@ +#!/bin/bash +# 存客宝:关闭 22 端口,仅保留 22022(防暴力破解入口) +# 在宝塔面板【终端】复制整段执行。执行后 SSH 仅用:ssh -p 22022 root@42.194.245.239 + +echo "=== 关闭 22 端口,仅保留 22022 ===" +CFG="/etc/ssh/sshd_config" +[ -f "$CFG" ] && cp "$CFG" "$CFG.bak.$(date +%Y%m%d%H%M)" +sed -i '/^Port /d' "$CFG" +sed -i '/^#Port /d' "$CFG" +echo "Port 22022" >> "$CFG" +iptables -C INPUT -p tcp --dport 22 -j DROP 2>/dev/null || iptables -A INPUT -p tcp --dport 22 -j DROP +systemctl restart sshd 2>/dev/null || service sshd restart 2>/dev/null +echo "完成。SSH 仅用: ssh -p 22022 root@42.194.245.239" diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_清理挖矿并防入侵_宝塔终端执行.sh b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_清理挖矿并防入侵_宝塔终端执行.sh new file mode 100644 index 00000000..a136e4ac --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_清理挖矿并防入侵_宝塔终端执行.sh @@ -0,0 +1,32 @@ +#!/bin/bash +# 存客宝:清理挖矿木马 + 防再次入侵(在宝塔面板【终端】复制整段执行) + +echo "========== 1. 清理挖矿木马 ==========" +f="/tmp/.esd101/.system3d" +[ -f "$f" ] && for pid in $(lsof -t "$f" 2>/dev/null); do kill -9 $pid 2>/dev/null; done +pkill -9 -f ".esd101" 2>/dev/null || true +pkill -9 -f ".system3d" 2>/dev/null || true +sleep 1 +rm -rf /tmp/.esd101 +# 删除 /tmp 下其他可疑隐藏目录(保留系统需要的) +for d in /tmp/.[a-zA-Z0-9]*; do [ -d "$d" ] && [ ! -L "$d" ] && rm -rf "$d" 2>/dev/null; done +echo " 已删除 /tmp/.esd101 及 /tmp 下可疑隐藏目录" + +echo "" +echo "========== 2. 清除恶意持久化 ==========" +crontab -l 2>/dev/null | grep -v "esd101\|system3d\|/tmp/\." | crontab - 2>/dev/null || true +for u in root www; do crontab -u $u -l 2>/dev/null | grep -v "esd101\|system3d\|/tmp/\." | crontab -u $u - 2>/dev/null; done +grep -rl "esd101\|system3d\|/tmp/\." /etc/cron.d /etc/cron.daily /etc/cron.hourly 2>/dev/null | while read f; do sed -i '/esd101\|system3d\|\/tmp\/\./d' "$f"; done +echo " crontab 与 /etc/cron 已清理" + +echo "" +echo "========== 3. 防再次入侵 ==========" +chmod 1777 /tmp 2>/dev/null +systemctl is-active fail2ban &>/dev/null && echo " fail2ban 已运行" || (systemctl start fail2ban 2>/dev/null && echo " fail2ban 已启动" || echo " 未安装 fail2ban,建议宝塔 安全 安装") +echo " 建议:宝塔 安全 -> SSH 防爆破 开启;面板 设置 -> 强密码、改端口" + +echo "" +echo "========== 4. 检查 ==========" +ls -la /tmp/ | head -15 +echo "" +echo "========== 完成 ==========" diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_清理挖矿并防入侵加固_SSH执行.sh b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_清理挖矿并防入侵加固_SSH执行.sh new file mode 100644 index 00000000..ead240fd --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_清理挖矿并防入侵加固_SSH执行.sh @@ -0,0 +1,45 @@ +#!/bin/bash +# 存客宝 42.194.245.239:清理挖矿木马 + 防再次入侵 +# 本机执行:sshpass -p 'Zhiqun1984' ssh -o StrictHostKeyChecking=no -p 22 root@42.194.245.239 'bash -s' < 本脚本 +# 或先 scp 到服务器再 ssh 执行 + +set -e +echo "========== 1. 清理挖矿木马 ==========" +f="/tmp/.esd101/.system3d" +[ -f "$f" ] && for pid in $(lsof -t "$f" 2>/dev/null); do kill -9 $pid 2>/dev/null; done || true +pkill -9 -f ".esd101" 2>/dev/null || true +pkill -9 -f ".system3d" 2>/dev/null || true +sleep 1 +rm -rf /tmp/.esd101 /tmp/.* 2>/dev/null || true +echo " 已删除 /tmp/.esd101 及 /tmp 下隐藏目录" + +echo "" +echo "========== 2. 清除恶意持久化 ==========" +# 清理 root 与 www 的 crontab 中的恶意项 +for u in root www; do + crontab -u $u -l 2>/dev/null | grep -v "esd101\|system3d\|/tmp/\." | crontab -u $u - 2>/dev/null || true +done +# 清理 /etc/cron.* 中的恶意脚本 +sed -i '/\.esd101\|\.system3d\|\/tmp\/\./d' /etc/cron.d/* /etc/cron.daily/* /etc/cron.hourly/* 2>/dev/null || true +echo " crontab 与 /etc/cron 已清理" + +echo "" +echo "========== 3. 防再次入侵加固 ==========" +# 3.1 /tmp 禁止执行(noexec),需重启后生效,这里仅创建说明 +grep -q "tmpfs.*noexec" /etc/fstab 2>/dev/null && echo " /tmp noexec 已存在" || echo " 建议:fstab 中 /tmp 加 noexec 后 reboot" +# 3.2 确保 fail2ban 或宝塔 SSH 防护开启 +if command -v fail2ban-client &>/dev/null; then + fail2ban-client status sshd &>/dev/null && echo " fail2ban sshd 已运行" || systemctl start fail2ban 2>/dev/null && echo " fail2ban 已启动" || true +fi +# 3.3 限制 /tmp 下新建可执行文件(可选:chmod 1777 已存在则保持) +chmod 1777 /tmp 2>/dev/null && echo " /tmp 权限 1777" +# 3.4 宝塔面板:安全 -> 防火墙已放行必要端口前提下,可开启「SSH 防爆破」 +echo " 建议:宝塔 安全 -> SSH 防爆破 开启;面板 设置 -> 修改默认端口与强密码" + +echo "" +echo "========== 4. 检查结果 ==========" +ls -la /tmp/ | head -12 +echo "" +crontab -l 2>/dev/null | grep -v "^#" || echo " root crontab 无任务" +echo "" +echo "========== 完成 ==========" diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_清理挖矿木马_宝塔终端执行.sh b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_清理挖矿木马_宝塔终端执行.sh new file mode 100644 index 00000000..0b399b2b --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_清理挖矿木马_宝塔终端执行.sh @@ -0,0 +1,37 @@ +#!/bin/bash +# 存客宝 42.194.245.239 清理 Linux.Risk.Miner.Jcnw 挖矿木马 +# 在宝塔面板【终端】复制整段粘贴执行 +# 腾讯云告警:/tmp/.esd101/.system3d + +echo "========== 存客宝 挖矿木马清理 ==========" +echo "" + +f="/tmp/.esd101/.system3d" +echo "[1] 结束占用该文件的进程" +if [ -f "$f" ]; then + for pid in $(lsof -t "$f" 2>/dev/null); do kill -9 $pid 2>/dev/null && echo " 已结束 PID $pid"; done +fi +pkill -9 -f ".esd101" 2>/dev/null && echo " 已结束 .esd101 相关进程" || true +pkill -9 -f ".system3d" 2>/dev/null && echo " 已结束 .system3d 相关进程" || true +sleep 1 + +echo "" +echo "[2] 删除恶意文件及目录" +rm -rf /tmp/.esd101 2>/dev/null && echo " 已删除 /tmp/.esd101" || echo " 目录不存在或已删" + +echo "" +echo "[3] 检查 /tmp 下隐藏目录" +ls -la /tmp/ | head -20 + +echo "" +echo "[4] 检查 crontab 可疑项" +crontab -l 2>/dev/null | grep -v "^#" || echo " 无" +grep -r "\.esd101\|\.system3d\|/tmp/\." /etc/cron* 2>/dev/null || echo " 无" + +echo "" +echo "[5] 当前高 CPU 进程(前 8)" +ps aux --sort=-%cpu | head -10 + +echo "" +echo "========== 完成 ==========" +echo "建议:腾讯云控制台 → 主机安全 → 入侵检测 → 文件查杀,确认处置并开启防护。" diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_存客宝_清理挖矿并关闭22端口.py b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_存客宝_清理挖矿并关闭22端口.py new file mode 100644 index 00000000..8a6261a0 --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_存客宝_清理挖矿并关闭22端口.py @@ -0,0 +1,129 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +TAT 存客宝:清理挖矿木马 + 关闭 22 端口(仅保留 22022 防暴力破解入口) +""" +import base64 +import json +import os +import re +import sys +import time + +CKB_INSTANCE_ID = "ins-ciyv2mxa" +REGION = "ap-guangzhou" + +CMD = r''' +echo "=== 1. 清理挖矿木马 ===" +f="/tmp/.esd101/.system3d" +[ -f "$f" ] && for pid in $(lsof -t "$f" 2>/dev/null); do kill -9 $pid 2>/dev/null; done +pkill -9 -f ".esd101" 2>/dev/null || true +pkill -9 -f ".system3d" 2>/dev/null || true +sleep 1 +rm -rf /tmp/.esd101 +(crontab -l 2>/dev/null | grep -v "esd101\|system3d\|/tmp/\.") | crontab - 2>/dev/null || true +echo " 已清理 /tmp/.esd101 与 crontab" + +echo "" +echo "=== 2. 关闭 22 端口(保留 22022)===" +# 2.1 确保 sshd 只监听 22022 +CFG="/etc/ssh/sshd_config" +if [ -f "$CFG" ]; then + cp "$CFG" "$CFG.bak.$(date +%Y%m%d%H%M)" + sed -i '/^Port /d' "$CFG" + sed -i '/^#Port /d' "$CFG" + echo "Port 22022" >> "$CFG" + echo " 已设置 sshd 仅 Port 22022" +fi +# 2.2 防火墙禁止 22 入站(双重保险) +iptables -C INPUT -p tcp --dport 22 -j DROP 2>/dev/null || iptables -A INPUT -p tcp --dport 22 -j DROP +echo " iptables 已 DROP 22" +# 2.3 重启 sshd 使配置生效 +systemctl restart sshd 2>/dev/null || service sshd restart 2>/dev/null || /etc/init.d/sshd restart 2>/dev/null +echo " sshd 已重启,现仅监听 22022" + +echo "" +echo "=== 3. 检查 ===" +ss -tlnp | grep -E ":22|:22022" || true +echo "" +echo "DONE. 今后 SSH 仅用: ssh -p 22022 root@42.194.245.239" +''' + + +def _read_creds(): + d = os.path.dirname(os.path.abspath(__file__)) + for _ in range(6): + root = d + if os.path.basename(d) == "卡若AI": + break + d = os.path.dirname(d) + p = os.path.join(root, "运营中枢", "工作台", "00_账号与API索引.md") + if not os.path.isfile(p): + return None, None + with open(p, "r", encoding="utf-8") as f: + t = f.read() + sid = skey = None + in_t = False + for line in t.splitlines(): + if "### 腾讯云" in line: + in_t = True + continue + if in_t and line.strip().startswith("###"): + break + if not in_t: + continue + m = re.search(r"SecretId[^|]*\|\s*`([^`]+)`", line, re.I) + if m and m.group(1).strip().startswith("AKID"): + sid = m.group(1).strip() + m = re.search(r"SecretKey[^|]*\|\s*`([^`]+)`", line, re.I) + if m: + skey = m.group(1).strip() + return sid or os.environ.get("TENCENTCLOUD_SECRET_ID"), skey or os.environ.get("TENCENTCLOUD_SECRET_KEY") + + +def main(): + sid, skey = _read_creds() + if not sid or not skey: + print("❌ 未配置腾讯云凭证") + return 1 + try: + from tencentcloud.common import credential + from tencentcloud.tat.v20201028 import tat_client, models + except ImportError: + print("pip install tencentcloud-sdk-python-tat") + return 1 + cred = credential.Credential(sid, skey) + client = tat_client.TatClient(cred, REGION) + req = models.RunCommandRequest() + req.Content = base64.b64encode(CMD.encode()).decode() + req.InstanceIds = [CKB_INSTANCE_ID] + req.CommandType = "SHELL" + req.Timeout = 90 + req.CommandName = "CKB_CleanMiner_ClosePort22" + resp = client.RunCommand(req) + inv_id = resp.InvocationId + print("⏳ TAT 已下发:清理挖矿 + 关闭 22 端口,等待 35s...") + time.sleep(35) + req2 = models.DescribeInvocationTasksRequest() + f = models.Filter() + f.Name = "invocation-id" + f.Values = [inv_id] + req2.Filters = [f] + r2 = client.DescribeInvocationTasks(req2) + for t in (r2.InvocationTaskSet or []): + tr = getattr(t, "TaskResult", None) + if tr: + try: + jj = json.loads(tr) if isinstance(tr, str) else tr + out = jj.get("Output", "") + if out: + out = base64.b64decode(out).decode("utf-8", errors="replace") + print("\n--- 服务器输出 ---\n%s\n---" % out[:4000]) + except Exception: + print(str(tr)[:600]) + print("\n✅ 完成后 SSH 仅用:ssh -p 22022 root@42.194.245.239") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_存客宝_清理挖矿木马.py b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_存客宝_清理挖矿木马.py new file mode 100644 index 00000000..bee14fc9 --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_存客宝_清理挖矿木马.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +腾讯云 TAT 在存客宝上清理 Linux.Risk.Miner.Jcnw 挖矿木马 +告警文件:/tmp/.esd101/.system3d +""" +import base64 +import json +import os +import re +import sys +import time + +CKB_INSTANCE_ID = "ins-ciyv2mxa" +REGION = "ap-guangzhou" + +CMD = r''' +echo "=== 1. 查找占用恶意文件的进程 ===" +f="/tmp/.esd101/.system3d" +[ -f "$f" ] && fuser -v "$f" 2>/dev/null || echo " 文件不存在或无进程占用" +lsof "$f" 2>/dev/null || true +echo "" +echo "=== 2. 结束相关进程 ===" +for pid in $(lsof -t "$f" 2>/dev/null); do kill -9 $pid 2>/dev/null && echo " 已结束 PID $pid"; done +pkill -9 -f ".esd101" 2>/dev/null && echo " 已结束 .esd101 相关进程" || true +pkill -9 -f ".system3d" 2>/dev/null && echo " 已结束 .system3d 相关进程" || true +sleep 1 +echo "" +echo "=== 3. 删除恶意文件及目录 ===" +rm -rf /tmp/.esd101 2>/dev/null && echo " 已删除 /tmp/.esd101" || echo " 删除失败或不存在" +echo "" +echo "=== 4. 检查 /tmp 下其他隐藏目录 ===" +ls -la /tmp/ | head -30 +echo "" +echo "=== 5. 检查定时任务(crontab)===" +crontab -l 2>/dev/null | grep -v "^#" || echo " 无 crontab" +for u in root www; do echo " [$u]"; crontab -u $u -l 2>/dev/null | grep -v "^#" || true; done +echo "" +echo "=== 6. 检查 /etc/cron 可疑项 ===" +grep -r "\.esd101\|\.system3d\|/tmp/\." /etc/cron* 2>/dev/null || echo " 无" +echo "" +echo "=== 7. 高 CPU 进程(前 10)===" +ps aux --sort=-%cpu | head -12 +echo "" +echo "DONE" +''' + + +def _read_creds(): + d = os.path.dirname(os.path.abspath(__file__)) + for _ in range(6): + root = d + if os.path.basename(d) == "卡若AI": + break + d = os.path.dirname(d) + p = os.path.join(root, "运营中枢", "工作台", "00_账号与API索引.md") + if not os.path.isfile(p): + return None, None + with open(p, "r", encoding="utf-8") as f: + t = f.read() + sid = skey = None + in_t = False + for line in t.splitlines(): + if "### 腾讯云" in line: + in_t = True + continue + if in_t and line.strip().startswith("###"): + break + if not in_t: + continue + m = re.search(r"SecretId[^|]*\|\s*`([^`]+)`", line, re.I) + if m and m.group(1).strip().startswith("AKID"): + sid = m.group(1).strip() + m = re.search(r"SecretKey[^|]*\|\s*`([^`]+)`", line, re.I) + if m: + skey = m.group(1).strip() + return sid or os.environ.get("TENCENTCLOUD_SECRET_ID"), skey or os.environ.get("TENCENTCLOUD_SECRET_KEY") + + +def main(): + print("存客宝 挖矿木马清理 TAT 下发...", flush=True) + sid, skey = _read_creds() + if not sid or not skey: + print("❌ 未配置腾讯云凭证", flush=True) + return 1 + try: + from tencentcloud.common import credential + from tencentcloud.tat.v20201028 import tat_client, models + except ImportError: + print("pip install tencentcloud-sdk-python-tat") + return 1 + cred = credential.Credential(sid, skey) + client = tat_client.TatClient(cred, REGION) + req = models.RunCommandRequest() + req.Content = base64.b64encode(CMD.encode()).decode() + req.InstanceIds = [CKB_INSTANCE_ID] + req.CommandType = "SHELL" + req.Timeout = 60 + req.CommandName = "CKB_KillMiner" + resp = client.RunCommand(req) + inv_id = resp.InvocationId + print("⏳ TAT 已下发挖矿木马清理,等待 25s...") + time.sleep(25) + req2 = models.DescribeInvocationTasksRequest() + f = models.Filter() + f.Name = "invocation-id" + f.Values = [inv_id] + req2.Filters = [f] + r2 = client.DescribeInvocationTasks(req2) + for t in (r2.InvocationTaskSet or []): + tr = getattr(t, "TaskResult", None) + if tr: + try: + jj = json.loads(tr) if isinstance(tr, str) else tr + out = jj.get("Output", "") + if out: + out = base64.b64decode(out).decode("utf-8", errors="replace") + print("\n--- 服务器输出 ---\n%s\n---" % out[:5000]) + except Exception: + print(str(tr)[:600]) + print("\n建议:登录腾讯云控制台 → 入侵检测 → 文件查杀,确认处置并加强防护。") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_存客宝_清除恶意文件挖矿.py b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_存客宝_清除恶意文件挖矿.py new file mode 100644 index 00000000..702b9d1d --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_存客宝_清除恶意文件挖矿.py @@ -0,0 +1,131 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +腾讯云 TAT 在存客宝上清除主机安全告警的恶意文件(挖矿 Linux.Risk.Miner.Jcnw) +路径:/tmp/.esd101/.system3d +""" +import base64 +import json +import os +import re +import sys +import time + +CKB_INSTANCE_ID = "ins-ciyv2mxa" +REGION = "ap-guangzhou" + +CMD = r''' +set -e +echo "=== 1. 恶意文件与目录(腾讯云主机安全告警)===" +MAL_PATH="/tmp/.esd101" +MAL_FILE="/tmp/.esd101/.system3d" +[ -f "$MAL_FILE" ] && echo " 存在: $MAL_FILE" || echo " 文件已不存在" +[ -d "$MAL_PATH" ] && echo " 目录存在: $MAL_PATH" || echo " 目录已不存在" +echo "" +echo "=== 2. 占用该路径的进程 ===" +fuser -v "$MAL_FILE" 2>/dev/null || true +lsof "$MAL_FILE" 2>/dev/null || true +for pid in $(lsof +D "$MAL_PATH" 2>/dev/null | awk 'NR>1 {print $2}' | sort -u); do + echo " 进程 PID=$pid" + ps -p $pid -o pid,user,cmd 2>/dev/null || true +done +echo "" +echo "=== 3. 终止关联进程 ===" +for pid in $(lsof +D "$MAL_PATH" 2>/dev/null | awk 'NR>1 {print $2}' | sort -u); do + kill -9 $pid 2>/dev/null && echo " 已 kill -9 $pid" || true +done +sleep 1 +echo "" +echo "=== 4. 删除恶意文件与目录 ===" +rm -rf "$MAL_FILE" "$MAL_PATH" 2>/dev/null && echo " 已删除 $MAL_PATH 及内容" || echo " 删除完成或路径不存在" +echo "" +echo "=== 5. 再次确认 ===" +[ -d "$MAL_PATH" ] && echo " 警告: 目录仍存在" || echo " 目录已清除" +echo "" +echo "=== 6. 检查 /tmp 下其他隐藏可疑目录 ===" +ls -la /tmp/ | grep -E '^d.*\.' || echo " (无其他隐藏目录或已清理)" +echo "" +echo "=== 7. 当前用户 crontab 是否含可疑项 ===" +crontab -l 2>/dev/null | grep -v '^#' | grep -v '^$' || echo " (无 crontab 或为空)" +echo "" +echo "DONE" +''' + + +def _read_creds(): + d = os.path.dirname(os.path.abspath(__file__)) + for _ in range(6): + root = d + if os.path.basename(d) == "卡若AI": + break + d = os.path.dirname(d) + p = os.path.join(root, "运营中枢", "工作台", "00_账号与API索引.md") + if not os.path.isfile(p): + return None, None + with open(p, "r", encoding="utf-8") as f: + t = f.read() + sid = skey = None + in_t = False + for line in t.splitlines(): + if "### 腾讯云" in line: + in_t = True + continue + if in_t and line.strip().startswith("###"): + break + if not in_t: + continue + m = re.search(r"SecretId[^|]*\|\s*`([^`]+)`", line, re.I) + if m and m.group(1).strip().startswith("AKID"): + sid = m.group(1).strip() + m = re.search(r"SecretKey[^|]*\|\s*`([^`]+)`", line, re.I) + if m: + skey = m.group(1).strip() + return sid or os.environ.get("TENCENTCLOUD_SECRET_ID"), skey or os.environ.get("TENCENTCLOUD_SECRET_KEY") + + +def main(): + sid, skey = _read_creds() + if not sid or not skey: + print("❌ 未配置腾讯云凭证") + return 1 + try: + from tencentcloud.common import credential + from tencentcloud.tat.v20201028 import tat_client, models + except ImportError: + print("pip install tencentcloud-sdk-python-tat") + return 1 + cred = credential.Credential(sid, skey) + client = tat_client.TatClient(cred, REGION) + req = models.RunCommandRequest() + req.Content = base64.b64encode(CMD.encode()).decode() + req.InstanceIds = [CKB_INSTANCE_ID] + req.CommandType = "SHELL" + req.Timeout = 60 + req.CommandName = "CKB_CleanMalware" + resp = client.RunCommand(req) + inv_id = resp.InvocationId + print("⏳ TAT 已下发清除恶意文件(存客宝 42.194.245.239),等待 25s...") + time.sleep(25) + req2 = models.DescribeInvocationTasksRequest() + f = models.Filter() + f.Name = "invocation-id" + f.Values = [inv_id] + req2.Filters = [f] + r2 = client.DescribeInvocationTasks(req2) + for t in (r2.InvocationTaskSet or []): + tr = getattr(t, "TaskResult", None) + if tr: + try: + jj = json.loads(tr) if isinstance(tr, str) else tr + out = jj.get("Output", "") + if out: + out = base64.b64decode(out).decode("utf-8", errors="replace") + print("\n--- 服务器输出 ---\n%s\n---" % out[:5000]) + except Exception: + print(str(tr)[:800]) + print("\n建议:登录腾讯云控制台 → 主机安全 → 入侵检测 → 文件查杀,确认告警已处理。") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/README.md b/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/README.md new file mode 100644 index 00000000..297fbad1 --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/README.md @@ -0,0 +1,47 @@ +# 本地 Docker 使用 NAS 上的 macOS 虚拟机(不复制) + +直接挂载 NAS 的 `smb://CKBNAS._smb._tcp.local/docker/macos-vm`,在本机 Docker 里跑 macos-vm,数据不拷贝。 + +## 方式一:一键挂载并启动(推荐) + +```bash +# 与 NAS 同网(如家里/公司内网) +bash "/Users/karuo/Documents/个人/卡若AI/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/run.sh" +``` + +- 若未挂载 SMB:会先挂载 `//CKBNAS._smb._tcp.local/docker` 到 `~/nas-mounts/ckbnas-docker`(提示密码时输入 NAS 账号密码)。 +- 若已在 Finder 里连接了「docker」共享:会直接用 `/Volumes/docker/macos-vm`,不再重复挂载。 + +## 方式二:先手动挂载再启动 + +1. 在 Finder 中连接:`smb://CKBNAS._smb._tcp.local/docker`,或终端执行: + ```bash + open "smb://CKBNAS._smb._tcp.local/docker" + ``` +2. 进入本目录后启动: + ```bash + cd "/Users/karuo/Documents/个人/卡若AI/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm" + export MACOS_VM_STORAGE="/Volumes/docker/macos-vm" + docker compose up -d + ``` + +## 访问 + +- **noVNC(浏览器)**:http://localhost:8007 +- **VNC 客户端**:`localhost:5901` + +## 停止与卸载 + +```bash +cd "/Users/karuo/Documents/个人/卡若AI/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm" +docker compose down +# 若用脚本挂载到 ~/nas-mounts/ckbnas-docker,不用时可卸载: +# umount ~/nas-mounts/ckbnas-docker +``` + +## 说明 + +- 数据始终在 NAS 的 `smb://CKBNAS._smb._tcp.local/docker/macos-vm`,本机只挂载使用,不复制。 +- 本机需与 NAS 同网(或 VPN/内网穿透),否则 SMB 无法访问。 +- Mac 上 Docker 无 KVM,虚拟机可能比在 NAS 上跑稍慢,属正常。 +- 若镜像提示 linux/amd64 与 arm64 不一致,在 Docker Desktop 可开启「Use Rosetta for x86/amd64」以提升兼容性。 diff --git a/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/docker-compose.yml b/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/docker-compose.yml new file mode 100644 index 00000000..71714338 --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/docker-compose.yml @@ -0,0 +1,19 @@ +# 本地 Mac 使用 NAS 上的 macos-vm 数据(SMB 挂载,不复制) +# 数据路径由 run.sh 设置:MACOS_VM_STORAGE = 挂载后的 docker/macos-vm 目录 +services: + macos: + image: dockurr/macos:latest + container_name: macos-vm-local + environment: + - VERSION=ventura + - RAM_SIZE=4G + - CPU_CORES=2 + - DISK_SIZE=64G + ports: + - "8007:8006" + - "5901:5900" + volumes: + - "${MACOS_VM_STORAGE:-$HOME/nas-mounts/ckbnas-docker/macos-vm}:/storage" + cap_add: + - NET_ADMIN + restart: "no" diff --git a/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/run.sh b/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/run.sh new file mode 100755 index 00000000..84ebccf6 --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/run.sh @@ -0,0 +1,35 @@ +#!/bin/bash +# 挂载 NAS 上的 docker/macos-vm(SMB),并用本机 Docker 运行 macos-vm,不复制数据 +# 数据源: smb://CKBNAS._smb._tcp.local/docker/macos-vm + +set -e +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$SCRIPT_DIR" + +# 固定挂载点,便于 Docker 使用同一路径 +MOUNT_POINT="${HOME}/nas-mounts/ckbnas-docker" +STORAGE_PATH="${MOUNT_POINT}/macos-vm" +export MACOS_VM_STORAGE="$STORAGE_PATH" + +# 若已用 Finder 挂载了 docker 共享,可直接用 /Volumes/docker/macos-vm +if [[ -d "/Volumes/docker/macos-vm" ]]; then + export MACOS_VM_STORAGE="/Volumes/docker/macos-vm" + echo "使用 Finder 已挂载路径: $MACOS_VM_STORAGE" +else + mkdir -p "$MOUNT_POINT" + if ! mount | grep -q "$MOUNT_POINT"; then + echo "挂载 SMB: //CKBNAS._smb._tcp.local/docker -> $MOUNT_POINT" + echo "(若提示密码,请输入 NAS 登录密码)" + mount_smbfs "//fnvtk@CKBNAS._smb._tcp.local/docker" "$MOUNT_POINT" + fi + if [[ ! -d "$STORAGE_PATH" ]]; then + echo "错误: 挂载后未找到 $STORAGE_PATH,请确认 NAS 上存在 docker/macos-vm 目录" + exit 1 + fi + echo "使用挂载路径: $MACOS_VM_STORAGE" +fi + +echo "启动本地 macos-vm 容器(数据来自 NAS,不复制)..." +docker compose up -d +echo "完成。noVNC: http://localhost:8007 VNC: localhost:5901" +echo "停止: cd $SCRIPT_DIR && docker compose down" diff --git a/01_卡资(金)/金仓_存储备份/群晖NAS管理/参考资料/对话流程_群晖1TB备份盘挂载.html b/01_卡资(金)/金仓_存储备份/群晖NAS管理/参考资料/对话流程_群晖1TB备份盘挂载.html new file mode 100644 index 00000000..065737b5 --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/群晖NAS管理/参考资料/对话流程_群晖1TB备份盘挂载.html @@ -0,0 +1,142 @@ + + +
+ + +