分类: 安全相关

  • 在 WordPress 中集成 Cloudflare Turnstile

    在 WordPress 评论中集成 Cloudflare Turnstile
    将密钥存储在 wp-config.php 中,并将验证代码放在 functions.php 中。

    更新内容:
    2025-03-26 第一版发布
    2025-03-30 修复了一些错误,Cloudflare Turnstile 验证将只在 WordPress 前台未登录的用户提交评论时才会出现和进行验证,从而提供更好的用户体验。

    1. wp-config.php 文件

    • 打开你的 WordPress 网站根目录下的 wp-config.php 文件。
    • wp-config.php 文件中,添加以下代码,替换 你的SiteKey你的SecretKey
    // Cloudflare Turnstile
    define('CLOUDFLARE_TURNSTILE_SITE_KEY', '你的SiteKey');
    define('CLOUDFLARE_TURNSTILE_SECRET_KEY', '你的SecretKey');

    2. functions.php 文件

    • 打开你的主题的 functions.php 文件。
    • 将以下代码添加到 functions.php 文件中:
    // Cloudflare Turnstile
    // 向评论表单添加 Turnstile JavaScript
    function add_cloudflare_turnstile_to_comment_form() {
        if (!is_admin() && !is_user_logged_in() && defined('CLOUDFLARE_TURNSTILE_SITE_KEY')) {
            echo '<div class="cf-turnstile" data-sitekey="' . esc_attr(CLOUDFLARE_TURNSTILE_SITE_KEY) . '"></div>';
            echo '<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>';
        }
    }
    add_action('comment_form_after_fields', 'add_cloudflare_turnstile_to_comment_form');
    
    // 验证 Turnstile 响应
    function verify_cloudflare_turnstile($commentdata) {
        // 在后台或已登录用户不进行验证
        if (is_admin() || is_user_logged_in()) {
            return $commentdata;
        }
    
        if (isset($_POST['cf-turnstile-response']) && defined('CLOUDFLARE_TURNSTILE_SECRET_KEY')) {
            $secret = CLOUDFLARE_TURNSTILE_SECRET_KEY;
            $response = sanitize_text_field($_POST['cf-turnstile-response']);
            $remoteip = $_SERVER['REMOTE_ADDR'];
    
            $url = 'https://challenges.cloudflare.com/turnstile/v0/siteverify';
            $data = array(
                'secret' => $secret,
                'response' => $response,
                'remoteip' => $remoteip
            );
    
            $options = array(
                'http' => array(
                    'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
                    'method'  => 'POST',
                    'content' => http_build_query($data)
                )
            );
            $context  = stream_context_create($options);
            $result = file_get_contents($url, false, $context);
            $json_result = json_decode($result);
    
            if ($json_result === null || !isset($json_result->success) || $json_result->success !== true) {
                wp_die(__('Turnstile verification failed, please try again.', 'your-text-domain'));
            }
        } else {
            wp_die(__('Turnstile was not submitted, please try again.', 'your-text-domain'));
        }
        return $commentdata;
    }
    add_filter('preprocess_comment', 'verify_cloudflare_turnstile');

    重要说明:

    • 替换密钥: 请务必将 "你的SiteKey""你的SecretKey" 替换为你在 Cloudflare Turnstile 中获得的实际密钥。
    • 备份: 在编辑 wp-config.phpfunctions.php 文件之前,请务必备份你的网站。
    • 测试: 在实际部署之前,请彻底测试 Turnstile 是否正常工作。
    • 主题更新: 如果你更新了主题,请确保将 functions.php 中的代码重新添加。
    • 安全: 妥善保管你的 Secret key.
    • 错误处理: 现在的错误处理是使用 wp_die()函数,用来显示错误。 你可以根据自己的需要,修改错误提示的内容。
  • Ollama 安全加固措施

    Ollama 安全加固措施

    为了保护在公网上运行的 Ollama 服务并限制访问,可以采取以下措施:

    方法一:通过防火墙限制

    Linux系统 使用 ufw 防火墙

    1. 检查 Ollama 默认监听的端口(通常是 11434)。
    2. 配置 ufw 只允许指定 IP 访问 11434 端口:
    # 允许指定 IP 访问 11434 端口
    ufw allow from <指定IP> to any port 11434 proto tcp
    
    # 拒绝其他所有 IP 访问 11434 端口
    ufw deny in to any port 11434 proto tcp

    <指定IP> 替换为允许访问的 IP 地址(如 192.168.1.100)。完成后,重新加载防火墙规则:

    ufw reload

    确保 ufw 已启用:

    ufw enable

    Windows 系统(使用 Windows 防火墙)

    1. 打开“Windows Defender 防火墙” -> “高级设置”。
    2. 创建一个新的“入站规则”,选择端口 11434,协议为 TCP。
    3. 在“范围”选项中,指定允许访问的远程 IP 地址。
    4. 保存并应用规则,其他未指定的 IP 将被阻止。

    方法二:修改 Ollama 监听地址(配合防火墙)

    默认情况下,Ollama 可能监听 0.0.0.0(所有接口)。你可以将其改为仅监听本地接口(127.0.0.1),然后通过反向代理(如 Nginx)控制访问。

    设置环境变量 OLLAMA_HOST

    Linux

    /etc/systemd/system/ollama.service 中添加:

    Environment="OLLAMA_HOST=127.0.0.1:11434"

    然后重启ollama服务

    systemctl daemon-reload
    systemctl restart ollama

    Windows

    在系统环境变量中添加 OLLAMA_HOST=127.0.0.1:11434,然后重启 Ollama 服务。

    通过配置Nginx反向代理,在代理层限制 IP:

    server {
        listen 80;
        location / {
            proxy_pass http://127.0.0.1:11434;
            allow <指定IP>;  # 替换为允许的 IP
            deny all;        # 拒绝其他 IP
        }
    }

    重启 Nginx:

    systemctl restart nginx

    方法三:使用 VPN 或内网访问

    将 Ollama 部署在本地网络中,通过 VPN连接到服务器,避免直接暴露在公网上。仅允许 VPN 内的 IP 访问服务。

  • Debian 12 上使用 Fail2Ban 来增强 SSH 的安全性

    使用 Fail2Ban 来增强 SSH 安全性是一个非常有效的选择,特别是针对暴力破解攻击。Fail2Ban 可以监控系统日志并自动封禁恶意 IP 地址,减少暴力破解的尝试。以下是配置 Fail2Ban 的步骤:

    1. 安装 Fail2Ban

    Debian 12 默认软件仓库中包含 Fail2Ban,可以通过以下命令安装:

    apt update
    apt install fail2ban

    安装完成后,Fail2Ban 会自动启动。你可以使用以下命令检查其状态:

    systemctl status fail2ban

    2. 配置 Fail2Ban

    Fail2Ban 的配置文件位于 /etc/fail2ban/ 目录下。默认的全局配置文件是 /etc/fail2ban/jail.conf,但建议不要直接修改该文件,而是创建一个本地配置文件 /etc/fail2ban/jail.local 或者在 /etc/fail2ban/jail.d/ 目录下添加自定义配置。

    创建本地配置文件

    首先,复制默认配置文件并编辑:

    cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
    nano /etc/fail2ban/jail.local

    配置 SSH 防护

    jail.local 文件中,找到 [sshd] 部分,或者添加以下内容:

    [sshd]
    enabled  = true
    port     = 22
    filter   = sshd
    logpath  = /var/log/auth.log
    maxretry = 5
    bantime  = 3600
    findtime = 600

    说明:

    • enabled = true:启用 SSH 防护。
    • port = 22:SSH 默认端口(如果更改过端口,请相应调整)。
    • filter = sshd:使用内置的 SSH 过滤器。
    • logpath = /var/log/auth.log:Debian 12 中 SSH 日志的默认路径。
    • maxretry = 5:如果超过 5 次登录失败,IP 将被封禁。
    • bantime = 3600:封禁时间为 1 小时(单位:秒,视情况调整)。
    • findtime = 600:统计失败登录尝试的时间窗口为 10 分钟。

    完成后保存并退出编辑器。

    3. 启动并测试 Fail2Ban

    配置完成后,重启 Fail2Ban 以应用配置:

    systemctl restart fail2ban

    检查 Fail2Ban 是否正常运行:

    fail2ban-client status

    查看 SSH 防护的具体状态:

    fail2ban-client status sshd

    4. 监控和解禁

    你可以随时查看被封禁的 IP 地址,并手动解禁:

    查看被封禁的 IP

    fail2ban-client get sshd banip

    手动解禁某个 IP(如果误封)

    fail2ban-client unban 目标IP

    注意事项

    • 确保 SSH 服务(sshd)已启用并正常运行。
    • 如果使用了非标准日志路径,需要调整 logpath
    • 定期检查日志文件 /var/log/fail2ban.log,确保规则已生效。
  • 如何从 Git 历史中彻底删除误上传的敏感信息

    如果你不小心提交了包含敏感信息(如 API 密钥、数据库密码)的 .env 文件到 Git 仓库,需要 彻底删除 这个文件及其历史记录,以防泄露。以下是完整的处理步骤。

    1. 立即更改敏感信息

    重要! .env 文件中的密码和密钥可能已经泄露,立即更改相关凭据,如:

    • 数据库密码
    • API 密钥
    • OAuth 令牌
    • SSH 私钥

    2. 确保 .env 文件不会再被提交

    .env 添加到 .gitignore,防止再次提交:

    echo ".env" >> .gitignore
    git add .gitignore
    git commit -m "Add .env to .gitignore"

    3. 从 Git 历史中删除 .env 文件

    推荐方式:使用 git filter-repo

    git filter-repo 是 Git 官方推荐的工具,速度快且更安全。

    3.1 安装 git filter-repo

    如果尚未安装,可以运行:

    pip install git-filter-repo

    3.2 彻底删除 .env 文件

    在 Git 仓库根目录运行:

    git filter-repo --path .env --invert-paths

    参数解析:

    • --path .env:指定要删除的文件
    • --invert-paths:删除所有提交中 .env 文件的历史记录

    4. 验证 .env 是否彻底删除

    检查 .env 是否仍在历史记录中:

    git log -- .env
    git log -S"你的敏感信息"

    如果没有返回任何记录,说明 .env 文件及其历史已经删除。

    5. 强制推送到远程仓库

    由于改写了 Git 历史,必须使用 --force 强制推送:

    git push origin main --force

    注意:

    • 所有协作者 需要重新克隆仓库,否则 git pull 会失败。
    • 确保 .env 不会再提交(参考步骤 2)。

    6. 清理本地和远程的旧引用

    如果 .env 可能出现在其他分支,确保所有分支都清理干净:

    git push origin --all --force

    7. 确保 .env 在远程仓库中消失

    前往 GitHub / GitLab 仓库,检查 .env 是否仍然可见:

    • 如果仍然存在,可能是缓存未清除,联系托管平台的技术支持要求彻底清除。

    8. 预防未来类似问题

    • 使用 .gitignore 确保敏感文件不会进入 Git 版本控制
    • 使用环境变量管理工具(如 dotenv)存储敏感数据
    • 定期检查 Git 提交,避免误提交敏感信息:
    git log -p | grep "API_KEY"

    重要提醒

    • 备份代码:执行 git filter-repo 之前,建议 备份仓库,以防误删。
    • 通知协作者:如果有其他人参与该仓库开发,他们需要重新克隆仓库,否则会遇到同步问题。
    • 合规性问题:如果泄露的是 用户数据,请考虑是否需要上报安全事件
    • 对于 GitHub 仓库:如果 .env 仍然可见,可以尝试 GitHub API 请求删除缓存或联系 GitHub 支持。
    • 对于 GitLab:使用 git gc --prune=now 清理本地仓库,并在 GitLab 管理面板中触发仓库垃圾回收。
    • 企业环境:如果 Git 服务器由企业管理可与管理员协商执行全局清理。
  • Windows系统恶意域名连接事件分析与响应

    事件概述

    在防火墙监控中检测到一台内部 Windows 主机(通过其 IP 地址识别)发起了对一个或多个恶意域名的网络连接。这可能表明该主机已受到恶意软件感染,需要立即进行排查和处理。

    1. 识别恶意请求来源

    1.1. 检查防火墙日志

    • 在防火墙管理界面中,找到相关的日志记录,确定:
      • 访问的恶意域名
      • 访问的时间
      • 发起请求的设备 IP
      • 访问的协议(如 HTTP、HTTPS、DNS 等)
      • 源端口和目标端口

    1.2. 在 Windows 设备上检查 DNS 解析历史

    在受感染的 Windows 设备上,使用以下命令查看 DNS 缓存:

    ipconfig /displaydns

    查找是否存在恶意域名,并记录相关条目。同时,检查 DNS 服务器的指向,是否被篡改。

    1.3. 查找相关进程

    使用以下命令查看当前连接的域名和进程:

    Get-NetTCPConnection -State Established | Select-Object LocalAddress,LocalPort,RemoteAddress,RemotePort,OwningProcess | Format-Table -AutoSize

    找到与恶意域名相关的 IP 地址,并记录对应的进程 ID(PID)。

    然后使用:

    Get-Process -Id <PID> -IncludeUserName

    查看是哪个进程在发起恶意请求,并查看进程的用户名,来判断是否是异常进程。

    1.4. windows事件日志分析

    • 打开事件查看器,检查“Windows 日志”下的“应用程序”、“安全”和“系统”日志。
    • 重点关注以下事件:
      • 异常的登录尝试(安全日志)。
      • 应用程序错误或崩溃(应用程序日志)。
      • 系统错误或警告(系统日志)。
      • 查找与恶意软件活动相关的事件,例如:
        • 可疑的进程启动或终止。
        • 异常的文件访问或修改。
        • 网络连接错误。

    1.5. 使用wireshark抓包分析

    • 在受感染主机上安装 Wireshark,捕获网络流量。
    • 使用过滤器(例如,dns.qry.name contains "malicious-domain.com")来查找与恶意域名相关的流量。
    • 分析流量中的数据包,查找恶意软件的通信模式和数据内容。
    • 重点关注以下信息:
      • 恶意软件使用的协议和端口。
      • 恶意软件通信的 IP 地址和域名。
      • 恶意软件传输的数据内容。

    2. 终止并分析恶意进程

    2.1. 终止可疑进程

    • 当发现感染的进程是系统进程时:
      • 仔细核对:使用Process Explorer等工具,查看进程的详细信息。
      • 数字签名验证:检查系统进程的数字签名。
      • 资源占用异常:监控系统进程的CPU、内存和网络占用情况。
      • 网络连接异常:通过netstat,wireshark等工具,确认系统进程的网络链接,是否链接了可疑的IP或者域名。
      • 隔离网络:立即将受感染的主机从网络中隔离。
      • 安全模式扫描:重启计算机进入安全模式,进行全面扫描。
      • 系统文件检查器(SFC):使用sfc /scannow命令扫描并修复受损的系统文件。
      • DISM工具:使用DISM工具,对系统镜像进行修复。
      • 系统还原:尝试回滚到感染前的状态。
      • 分析恶意软件:提取可疑的系统进程文件进行恶意软件分析。
      • 考虑重装系统:如果以上方法无效,考虑重装系统。
    • 找到可疑进程后,可以手动终止:
    Stop-Process -Id <PID> -Force

    或者在任务管理器中找到对应进程并结束任务。在终止前,使用工具进行进程的快照。

    2.2. 分析进程启动项

    使用以下命令检查进程是否在开机启动:

    Get-CimInstance Win32_StartupCommand | Select-Object Name, Command, Location

    如果发现恶意进程,手动删除启动项,或者使用 msconfig 检查启动项。同时检查服务列表,是否有可疑服务在运行。

    3. 查找恶意文件

    3.1. 检查系统文件

    使用 Windows Defender 进行完整扫描:

    Start-MpScan -ScanType FullScan

    或者使用 ClamAV(适用于 Windows 版本)进行手动扫描:

    clamscan.exe -r C:\ --bell --remove

    同时可以使用其他的杀毒软件进行辅助查杀

    3.2. 使用 Autoruns 检查隐藏启动项

    下载 Autoruns,运行后检查是否有恶意程序在系统启动时运行。尤其关注隐藏的启动项和服务。

    3.3. 检查 Hosts 文件

    打开 Hosts 文件:

    notepad C:\Windows\System32\drivers\etc\hosts

    删除所有与恶意域名相关的可疑条目。检查是否有异常的指向。

    4. 阻止恶意域名

    在本地防火墙或 Windows Defender 中阻止恶意域名:

    New-NetFirewallRule -DisplayName "Block Malicious Domain" -Direction Outbound -Action Block -RemoteAddress <恶意IP>

    或者在 Hosts 文件中将恶意域名指向本地:

    127.0.0.1 malicious-domain.com

    同时,在企业环境中,需要在边界防火墙,IDS/IPS 等设备中添加封禁策略。

    5. 排查后门和持久化机制

    5.1. 检查计划任务

    Get-ScheduledTask | Where-Object {$_.TaskName -match "malware"}

    删除任何可疑任务:

    Unregister-ScheduledTask -TaskName "<TaskName>" -Confirm:$false

    5.2. 检查注册表

    查看注册表启动项:

    reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Run

    删除可疑项:

    reg delete HKLM\Software\Microsoft\Windows\CurrentVersion\Run /v "<恶意项>" /f

    同时,检查其他的注册表启动项,例如 RunOnce,RunServices 等。

    5.3 检查网络连接

    通过 netstat 命令,检查异常网络连接。

    netstat -ano

    6. 进行系统修复

    如果感染严重,可以执行以下操作:

    1. 系统还原:回滚到之前的快照
    2. 重装 Windows:如果找不到恶意软件的来源,建议重装系统
    3. 更改密码:如果怀疑凭据被窃取,建议更改相关账户密码
    4. 隔离受感染主机:将受感染主机从网络中隔离,防止横向传播。
    5. 分析恶意软件样本:如果可能,提取恶意软件样本进行分析,了解其行为和目的。
    6. 更新安全补丁:确保系统和应用程序都安装了最新的安全补丁。
    7. 全网安全扫描:对网络中的其他主机进行安全扫描,确保没有其他主机受到感染。
    8. 备份重要数据:在重装系统前,尽可能的备份重要数据。
  • Debian12 安装ClamAV

    ClamAV 是一款流行的开源病毒扫描工具,可以用于扫描文件和目录中的恶意软件。

    1. 安装 ClamAV

    首先,使用以下命令安装 ClamAV 和其守护进程:

    apt install clamav clamav-daemon -y

    2. 更新病毒库

    安装完成后,使用以下命令更新病毒库:

    freshclam

    3. 扫描

    扫描单个文件

    使用以下命令扫描指定的文件:

    clamscan /path/to/file

    扫描整个目录

    扫描整个目录中的所有文件:

    clamscan -r /path/to/directory

    扫描指定目录并仅显示感染的文件

    使用 -i 参数,仅显示感染的文件:

    clamscan -r -i /path/to/directory

    扫描整个系统并仅显示感染的文件,并将结果记录到日志文件

    要扫描整个系统并将结果记录到日志文件中,可以使用以下命令:

    clamscan -r -i -l /var/log/clamscan-infected.log /