作者: 启鑫

  • 使用 OpenSCAP 和 SCAP Security Guide 加固Ubuntu 24.04.2 (Noble Numbat)

    OpenSCAP 和 SCAP Security Guide 的作用

    • OpenSCAP 是一个用于自动化安全合规检查的开源工具,基于 SCAP(Security Content Automation Protocol,安全内容自动化协议)。它用于扫描系统,评估是否符合特定的安全基准,并生成修复建议或自动应用修复措施。
    • SCAP Security Guide(SSG) 是一套预定义的安全基准规则库,包含适用于不同操作系统(如 Ubuntu、RHEL、CentOS 等)的安全配置标准,例如 CIS(Center for Internet Security)基准DISA STIGPCI-DSS 规范。SSG 提供了 SCAP 兼容的 XML 文件,供 OpenSCAP 解析和执行安全检查。

    OpenSCAP 负责执行安全扫描,SCAP Security Guide 提供具体的安全基准规则,两者配合使用,可以自动化地评估和加固系统的安全性。

    1. 准备环境

    确保你的系统已安装 OpenSCAP 的必要工具。如果尚未安装,可使用以下命令安装:

    apt update
    apt install openscap-scanner -y

    安装完成后,验证 OpenSCAP 是否成功安装:

    oscap --version

    你应该会看到类似如下的版本信息:

    OpenSCAP command line tool (oscap) 1.3.9

    2. 下载并解压 SCAP Security Guide

    1. 下载 SCAP Security Guide:
    wget https://github.com/ComplianceAsCode/content/releases/download/v0.1.76/scap-security-guide-0.1.76.zip
    1. 解压文件并进入目录:
    unzip scap-security-guide-0.1.76.zip
    cd scap-security-guide-0.1.76

    解压后,你会看到多个 SCAP 配置文件。

    3. 选择适合的安全基准配置文件

    运行以下命令查看 Ubuntu 24.04 可用的 SCAP 配置文件:

    oscap info ssg-ubuntu2404-ds.xml

    Ubuntu 24.04 支持以下基准配置:

    • CIS Level 1 Server(较宽松,适用于基本安全需求)
    • xccdf_org.ssgproject.content_profile_cis_level1_server
    • CIS Level 1 Workstation
    • xccdf_org.ssgproject.content_profile_cis_level1_workstation
    • CIS Level 2 Server(更严格,适用于高安全需求)
    • xccdf_org.ssgproject.content_profile_cis_level2_server
    • CIS Level 2 Workstation
    • xccdf_org.ssgproject.content_profile_cis_level2_workstation

    推荐配置:

    • 服务器xccdf_org.ssgproject.content_profile_cis_level1_serverxccdf_org.ssgproject.content_profile_cis_level2_server
    • 工作站xccdf_org.ssgproject.content_profile_cis_level1_workstationxccdf_org.ssgproject.content_profile_cis_level2_workstation

    4. 执行安全检查

    使用以下命令评估系统是否符合 CIS Level 1 Server 基准:

    oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_cis_level1_server \
        --results scan-results.xml \
        --report report.html \
        ssg-ubuntu2404-ds.xml

    输出说明:

    • scan-results.xml:详细的扫描结果文件。
    • report.html:可视化的合规性报告,可用浏览器打开查看。

    5. 生成并应用安全加固修复脚本

    如果扫描结果显示有不合规项,可以生成修复脚本并应用加固:

    1. 生成修复脚本
    oscap xccdf generate fix --profile xccdf_org.ssgproject.content_profile_cis_level1_server \
        --output remediation.sh \
        ssg-ubuntu2404-ds.xml
    1. 检查修复脚本内容(确保符合预期):
    cat remediation.sh
    1. 执行修复脚本
    bash remediation.sh

    注意:修复过程可能会更改系统配置,建议在执行前备份关键数据。

    1. 再次检查修复效果
    oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_cis_level1_server \
        --results scan-results-after.xml \
        --report report-after.html \
        ssg-ubuntu2404-ds.xml

    6. 总结与注意事项

    选择合适的安全基准

    • 服务器推荐 cis_level1_servercis_level2_server
    • 工作站推荐 cis_level1_workstationcis_level2_workstation

    错误处理

    • 如果执行 oscap 命令时遇到错误,可检查 scan-results.xmlreport.html 获取详细信息。
    • 部分规则可能需要手动调整,具体可参考 remediation.sh 内容。

    查看合规性报告

    使用浏览器打开 report.html,详细查看系统安全状态。

    完整流程示例(适用于服务器,CIS Level 1):

    # 1. 运行安全合规性检查
    oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_cis_level1_server \
        --results scan-results.xml \
        --report report.html \
        ssg-ubuntu2404-ds.xml
    
    # 2. 生成修复脚本
    oscap xccdf generate fix --profile xccdf_org.ssgproject.content_profile_cis_level1_server \
        --output remediation.sh \
        ssg-ubuntu2404-ds.xml
    
    # 3. 执行修复脚本
    bash remediation.sh
    
    # 4. 重新运行检查以验证修复效果
    oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_cis_level1_server \
        --results scan-results-after.xml \
        --report report-after.html \
        ssg-ubuntu2404-ds.xml

    如果你有不同的系统用途(服务器/工作站)或需要更高安全级别(Level 2),可以调整 --profile 参数来适配不同基准。

  • Linux使用su成为root用户的几种方式

    在 Linux 系统中使用 su 命令获取 root (超级用户) 权限的几种主要方式

    使用 su 成为 root 的几种方式:

    1. su: 这是最基本的形式。当不带任何用户名执行 su 时,它默认切换到 root 用户。系统会提示您输入 root 密码。成功输入密码后,您将获得一个 root shell。您的环境变量通常会从之前的用户那里保留下来。
    $ su
    Password:
    #
    1. su -su - root: 这个命令会切换到 root 用户,并且还会加载 root 用户的环境变量。这意味着您将拥有与直接以 root 用户身份登录时相同的环境变量、工作目录(通常是 /root)和 shell 配置。这通常是完全获得 root 身份的推荐方式。
    $ su -
    Password:
    #
    1. su root: 这与第一个选项 (su) 等效。它明确指定目标用户为 root
    $ su root
    Password:
    #
    1. su -c <命令>su root -c <命令>: 这允许您以 root 身份执行单个命令,而无需获得 root shell。命令执行完毕后,您将返回到原始用户。系统会提示您输入 root 密码
    $ su -c "useradd newuser"
    Password:
    $
  • 通过命令行查看服务器硬件配置

    购买服务器后,通过这些命令你可以全面了解云服务器的硬件配置,包括操作系统、CPU、内存、硬盘、网络接口和显卡等信息

    1. 查看操作系统信息

    uname -a

    说明:该命令会显示操作系统的内核版本、主机名、系统架构等基本信息。

    2. 查看操作系统版本

    cat /etc/os-release

    说明:该命令会显示当前操作系统的名称、版本 ID、版本号、ID like 等详细信息。

    3. 查看CPU信息

    lscpu

    说明:该命令会显示CPU的架构、CPU(s)(逻辑CPU核心数)、Thread(s) per core(每核心线程数)、Core(s) per socket(每插槽核心数)、Socket(s)(插槽数)、型号名称、CPU MHz(当前频率)等信息,帮助你评估系统的计算能力。

    4. 查看内存信息

    free -h

    说明:该命令会以人类可读的格式显示总内存(Total)、已用内存(Used)、空闲内存(Free)、共享内存(Shared)、缓冲区/缓存(Buff/Cache)以及可用内存(Available)等信息,帮助你了解内存的使用情况。

    5. 查看硬盘信息

    lsblk

    或者:

    df -h

    说明:lsblk 会以树状结构列出块设备(磁盘、分区等)的信息,包括设备名称、大小、类型、挂载点等。而 df -h 会显示各文件系统的磁盘空间使用情况,包括文件系统、总大小(Size)、已用空间(Used)、可用空间(Avail)、使用百分比(Use%)和挂载点(Mounted on)。

    6. 查看网络接口信息

    ifconfig

    或者:

    ip a

    说明:ifconfig 命令会显示网络接口的详细配置信息,包括接口名称、MAC地址(HWaddr)、IP地址(inet addr)、子网掩码(Mask)、广播地址(Bcast)等。ip aiproute2 工具集中的命令,提供更强大和更现代的网络配置信息,包括接口状态、IP地址、MAC地址等。通常建议使用 ip a

    7. 查看系统负载和进程

    top

    或者:

    htop

    说明:top 会实时显示系统负载(load average)、CPU使用率(%Cpu(s))、内存使用率(%Mem, %Swap)以及各个进程的PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 等信息。htoptop 的交互式增强版,提供更友好的彩色界面,支持鼠标操作,可以更方便地查看和管理进程。

    8. 查看显卡配置

    8.1 查看NVIDIA显卡信息

    命令:

    nvidia-smi

    说明:nvidia-smi (NVIDIA System Management Interface) 命令会显示NVIDIA显卡的详细信息,包括显卡型号(Name)、CUDA版本、驱动版本(Driver Version)、GPU利用率(GPU)、显存使用情况(Memory-Usage)、GPU温度(Temp)、风扇转速(Fan)等。

    8.2 查看所有NVIDIA显卡信息

    如果有多个NVIDIA显卡,可以使用以下命令列出所有显卡及其索引:

    命令:

    nvidia-smi -L

    说明:该命令会列出所有检测到的NVIDIA显卡及其对应的索引(GPU 0, GPU 1, …)和型号信息。

    8.3 查看其他显卡信息(适用于非NVIDIA显卡)

    如果使用的是AMD或其他品牌的显卡,可以使用以下命令:

    命令:

    lspci | grep VGA

    说明:该命令使用 lspci (list PCI devices) 列出所有PCI设备,并通过 grep VGA 过滤出与VGA兼容的设备,通常包括显卡信息。输出会显示显卡的型号信息。

    8.4 查看OpenCL设备信息

    对于支持OpenCL的显卡或其他计算设备,可以使用以下命令查看设备信息:

    命令:

    clinfo

    说明:该命令会列出所有与OpenCL相关的平台(Platform)和设备(Device)信息,包括设备名称、供应商、OpenCL版本支持等。你需要先安装 clinfo 工具(例如,在Debian/Ubuntu上使用 sudo apt-get install clinfo,在CentOS/RHEL上使用 sudo yum install clinfo)。

  • macOS 使用CONSOLE线连接 FortiGate Console

    macOS 使用 USB 连接默认 Terminal 连接 FortiGate Console

    使用 macOS 操作系统自带的终端(Terminal)应用程序,通过 USB Console 线缆 连接到 FortiGate 防火墙设备的控制台接口。这种连接方式允许您在没有网络连接的情况下直接访问 FortiGate 的命令行界面(CLI),进行配置、故障排除等操作。

    前提条件

    • 一台运行 macOS 的计算机。
    • 一条 USB Console 线缆(线缆一端为 RJ45 接口,连接 FortiGate 的 Console 端口,另一端为 USB 接口,连接您的 macOS 电脑)。
    • 通常情况下,macOS 会自动识别并加载 USB Console 设备的驱动程序,您可能无需手动安装。

    操作步骤

    1. 打开终端(Terminal)应用

    在 macOS 中,打开“应用程序”文件夹,然后进入“实用工具”文件夹,找到并双击“终端”应用程序,或者使用 Spotlight 搜索“终端”并打开。

    2. 列出 USB 设备

    使用以下命令列出系统中所有与 USB 相关联的设备文件:

    ls /dev/*usb*

    解释

    • /dev/ 是一个特殊的目录,包含了系统中所有设备文件的入口。
    • *usb* 是一个通配符,用于匹配文件名中包含 “usb” 字符串的所有文件。通过执行此命令,您可以找到与 USB 连接相关的设备文件,包括您的 USB Console 设备。

    输出示例

    /dev/cu.usbserial-A9XBSOU6
    /dev/tty.usbserial-A9XBSOU6

    在输出结果中,您需要找到一个包含 tty.usbserialcu.usbserial 字符串的设备文件。通常,tty. 开头的设备文件用于拨出连接,而 cu. 开头的设备文件用于呼入连接。在 screen 命令中,通常使用 tty. 开头的设备。

    3. 选择 USB 串口设备

    仔细查看 ls /dev/*usb* 命令的输出,找到与您的 FortiGate 设备连接的 USB Console 线缆对应的设备路径。例如,在上述示例中,/dev/tty.usbserial-A9XBSOU6 就是您可能需要使用的设备。如果您不确定是哪个,可以尝试在插入和拔出 USB Console 线缆时多次运行该命令,观察新增或消失的设备文件。

    4. 连接到 FortiGate 控制台

    使用 screen 命令连接到 FortiGate 控制台。您需要将 /dev/tty.usbserial-A9XBSOU6 替换为您在第 3 步中找到的实际设备路径。大多数 FortiGate 设备的默认波特率为 9600,数据位为 8,停止位为 1,无奇偶校验(8N1)。因此,您可以运行以下命令:

    screen /dev/tty.usbserial-A9XBSOU6 9600

    解释

    • screen 是一个强大的命令行全屏窗口管理器,在这里我们用它来建立与串口设备的连接。
    • /dev/tty.usbserial-A9XBSOU6 是您选择的 USB 串口设备文件路径。
    • 9600 是波特率,必须与 FortiGate 设备的控制台配置匹配。

    5. 登录提示

    执行 screen 命令后,如果您的连接配置正确,您可能会看到一个空白的终端窗口。此时,请尝试按下 Enter 键。这通常会触发 FortiGate 设备的登录提示符显示出来。

    如果按下 Enter 键后仍然没有任何反应,请检查以下几点:

    • FortiGate 是否已开机? 确保 FortiGate 设备已通电并正在启动。
    • USB 连接是否牢固? 检查 USB Console 线缆的两端是否都已正确连接到您的 macOS 电脑和 FortiGate 设备的 Console 端口。
    • 是否选择了正确的 USB 串口设备? 再次运行 ls /dev/*usb* 命令,确认您使用的设备路径是正确的。
    • 波特率是否正确? 虽然 9600 是默认值,但如果之前被更改过,您可能需要尝试其他常见的波特率(例如 115200)。

    如果 FortiGate 正在启动,您可能会在终端窗口中看到设备的启动日志和系统信息,最终会显示登录提示符。

    注意事项

    • 确认连接:在执行 screen 命令之前,请务必检查 USB Console 线缆连接是否牢固,并确保 FortiGate 设备已正常开机。
    • 检查 USB 串口设备:仔细核对 ls /dev/*usb* 命令的输出,确保您选择了与连接 FortiGate 控制台的 USB 串口设备对应的正确 /dev/tty.usbserial/dev/cu.usbserial 设备路径。
    • 驱动程序:对于大多数现代 macOS 版本和常见的 USB Console 线缆,通常不需要手动安装驱动程序。macOS 会自动识别并配置。但如果遇到问题,请查阅您的 USB Console 线缆的说明文档。
  • 在 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()函数,用来显示错误。 你可以根据自己的需要,修改错误提示的内容。
  • Docker 环境清理命令详解

    常用的 Docker 环境清理命令,包括删除停止容器、悬挂镜像、未使用卷和网络的操作,帮助用户释放系统磁盘空间。通过使用这些命令,用户可以有效地管理 Docker 资源,避免积累不必要的文件和镜像。

    1. 删除所有停止的容器:

    docker rm $(docker ps -aq -f status=exited)

    解释:

    • docker ps -aq -f status=exited:这个命令列出所有已经停止的容器(状态为 exited),-a 表示显示所有容器,-q 表示只返回容器的 ID,-f status=exited 是通过过滤器指定只列出已经停止的容器。
    • docker rm:这个命令用来删除指定的容器。通过 $(docker ps -aq -f status=exited),它将所有已经停止的容器 ID 传递给 docker rm,从而删除所有停止的容器。

    2. 删除所有悬挂的镜像(dangling images):

    docker rmi $(docker images -q -f dangling=true)

    解释:

    • docker images -q -f dangling=true:这个命令列出所有悬挂镜像的 ID。悬挂镜像是那些没有被任何容器使用的镜像,通常是构建过程中中间层生成的镜像。-q 用来只返回镜像的 ID,-f dangling=true 是通过过滤器指定只列出那些悬挂镜像。
    • docker rmi:这个命令用来删除指定的镜像。通过 $(docker images -q -f dangling=true),它会删除所有悬挂镜像。

    3. 删除所有未使用的卷:

    docker volume prune -f

    解释:

    • docker volume prune:这个命令删除所有没有被任何容器使用的卷。Docker 卷用于存储数据,卷被删除后,任何容器无法再访问这些数据。
    • -f:这是一个强制选项,它让 Docker 在执行删除操作时不需要确认。这样会直接删除所有未使用的卷。

    4. 删除所有未使用的网络:

    docker network prune -f

    解释:

    • docker network prune:这个命令删除所有没有被任何容器使用的网络。Docker 网络是容器之间的通信基础,当网络没有容器使用时,它就成了未使用的资源。
    • -f:这是一个强制选项,确保 Docker 执行删除操作时不需要任何确认。

    5. 清理所有未使用的资源(镜像、容器、卷、网络):

    docker system prune -af

    解释:

    • docker system prune:这个命令用于清理所有未使用的 Docker 资源,包括容器、镜像、卷和网络。它会删除所有没有被使用的资源,从而释放磁盘空间。
    • -a:这是一个选项,表示删除所有未使用的镜像,不仅仅是悬挂镜像。如果没有这个选项,默认只会删除悬挂的镜像。
    • -f:这个选项强制执行删除操作,无需确认。在生产环境中使用时要小心,确保不会误删重要资源。

    注意事项:

    这些命令会永久删除数据,因此请在使用之前务必确认没有误删除重要资源。如果你在生产环境中使用这些命令,建议先做备份,或者使用命令前检查当前容器、镜像和卷的状态,确保删除的内容是无用的。