在Kali Linux上部署Cardinal AWD攻防演练平台全攻略
2026/7/12 12:39:43 网站建设 项目流程

1. 项目概述与核心价值

最近在整理自己的渗透测试和攻防演练环境,发现一个挺有意思的现象:很多安全从业者,包括我自己在内,手里都有一套Kali Linux,但真正把它用成一个集成的、可复现的攻防演练平台的人却不多。大家往往是需要什么工具临时装什么,或者用一些现成的靶场,但缺乏一个统一的、能模拟真实AWD(Attack With Defense,攻防兼备)竞赛场景的平台。这就像你有一把瑞士军刀,却只用来开瓶盖,有点浪费了它的潜力。

于是,我把目光投向了Cardinal AWD平台。这是一个开源的、专门为AWD竞赛设计的平台,它不仅能部署和管理多个漏洞靶机,还能实时展示攻防双方的得分、状态,甚至能配置一个酷炫的“大屏”来监控整个战况。对于想深入学习内网渗透、应急响应,或者组织内部红蓝对抗演练的朋友来说,在Kali Linux上亲手搭建一套Cardinal,无疑是把你的“瑞士军刀”升级成“多功能作战平台”的绝佳方式。这个过程本身,就是对Linux环境、Web服务、数据库和网络安全架构理解的一次深度实践。

网上关于Cardinal的教程不少,但要么步骤过于简略,要么环境依赖没讲清楚,特别是如何在Kali Linux这个渗透测试专用发行版上完美适配,以及如何配置那个极具实战感的大屏,资料比较零散。我花了几天时间,从环境准备、平台搭建、大屏配置到问题排查,完整地走了一遍,把其中关键的步骤、踩过的坑和优化技巧都记录了下来。无论你是安全新手想搭建一个学习环境,还是有一定经验的从业者想部署一个内部演练平台,这篇攻略都能给你提供一条清晰的路径。

2. 环境准备与前期规划

在Kali Linux上搭建任何服务,第一步永远不是直接开干,而是理清思路和准备好战场。Kali默认面向攻击,很多服务默认不开启,库依赖也可能和常规的Ubuntu/Debian服务器略有不同,直接照搬其他Linux发行版的教程很容易出问题。

2.1 系统与网络环境确认

我的实验环境是Kali Linux 2024.1 Rolling Release,安装在VMware Workstation Pro 17上。首先,我们需要确保基础环境是健康的。

1. 更新系统与安装基础编译工具:Kali Rolling版本更新频繁,首先更新软件源并升级系统,避免后续安装因版本过旧产生冲突。同时,Cardinal平台的部署需要从源码编译或安装一些Python包,因此编译工具链必不可少。

sudo apt update && sudo apt full-upgrade -y sudo apt install -y build-essential libssl-dev zlib1g-dev libncurses5-dev libncursesw5-dev libreadline-dev libsqlite3-dev libgdbm-dev libdb5.3-dev libbz2-dev libexpat1-dev liblzma-dev tk-dev libffi-dev

注意:full-upgrade比单纯的upgrade更彻底,会处理软件包依赖关系的变更。在渗透测试环境中,有时我们为了保持工具链稳定会谨慎升级,但作为服务平台搭建,一个较新的基础环境能减少很多依赖冲突。

2. 网络与服务状态检查:Cardinal平台是一个Web应用,依赖MySQL数据库和Python环境。我们需要确保Kali的MySQL服务(如果之前没安装)能正常安装并运行,同时网络配置(特别是NAT或桥接模式)允许主机访问虚拟机的Web服务。

  • 检查MySQL:systemctl status mysqlservice mysql status。如果未安装,我们会在下一步统一安装。
  • 检查Python3:Kali默认已安装Python3,但需要确认版本:python3 --version。Cardinal推荐Python 3.6+,Kali当前版本完全满足。
  • 检查80/8080端口占用:使用netstat -tlnp | grep -E ‘:(80|8080)’查看是否有其他服务(如Apache)占用了默认Web端口。如果有,可以选择停止它们(sudo systemctl stop apache2)或为Cardinal配置其他端口。

3. 规划安装目录与数据库:良好的习惯是从一开始就规划好。我建议在用户目录下创建一个专门的工作目录,例如~/awd_platform,所有相关操作都在这里进行,方便管理。

mkdir -p ~/awd_platform cd ~/awd_platform

同时,想好你的MySQL root密码,并决定Cardinal平台使用的数据库名和用户。这里我计划:

  • 数据库名:cardinal
  • 数据库用户:cardinal_user
  • 用户密码:YourStrongPasswordHere!(请务必替换为复杂密码)

2.2 核心依赖安装:MySQL与Python虚拟环境

Cardinal平台的后端主要由Python(Django框架)编写,前端涉及Node.js(用于大屏),数据存储使用MySQL。因此,我们需要搭建好这个“铁三角”。

1. 安装与配置MySQL数据库:Kali的仓库提供了MariaDB(MySQL的一个分支),完全兼容。

sudo apt install -y mariadb-server mariadb-client

安装完成后,运行安全初始化脚本,这会设置root密码、移除匿名用户、禁止远程root登录等,是必须的步骤。

sudo mysql_secure_installation

你会被问到一系列问题:

  • 输入当前root密码(初始为空,直接回车)。
  • 是否设置root密码?选Y,并设置一个强密码(这个密码要记住,后续管理数据库要用)。
  • 移除匿名用户?选Y
  • 禁止root远程登录?选Y(因为我们只在本地连接)。
  • 移除测试数据库?选Y
  • 立即重新加载权限表?选Y

接下来,登录MySQL,为我们Cardinal平台创建专用的数据库和用户。

sudo mysql -u root -p

输入你刚刚设置的root密码,进入MySQL命令行后,执行以下SQL语句:

-- 创建数据库 CREATE DATABASE cardinal CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 创建用户并授予权限(将‘YourStrongPasswordHere!‘替换成你的密码) CREATE USER ‘cardinal_user‘@‘localhost‘ IDENTIFIED BY ‘YourStrongPasswordHere!‘; GRANT ALL PRIVILEGES ON cardinal.* TO ‘cardinal_user‘@‘localhost‘; FLUSH PRIVILEGES; -- 退出 EXIT;

实操心得:这里数据库字符集使用utf8mb4而非utf8,是为了支持完整的Unicode字符(如emoji),避免未来在题目描述、队伍名称等地方出现乱码问题。这是一个容易被忽略但很重要的细节。

2. 创建Python虚拟环境:强烈建议使用虚拟环境(venv)来管理Cardinal的Python依赖,这样可以与Kali系统自带的Python环境隔离,避免包版本冲突,也方便未来清理或迁移。

cd ~/awd_platform python3 -m venv venv

激活虚拟环境:

source venv/bin/activate

激活后,你的命令行提示符前会出现(venv)字样。后续所有与Python相关的操作(pip安装,运行Django命令)都必须在此虚拟环境激活的状态下进行。

3. Cardinal平台部署与初始化

环境准备就绪,现在可以开始部署Cardinal平台本身了。核心步骤包括获取源码、安装Python依赖、配置项目、初始化数据库和启动服务。

3.1 获取源码与安装依赖

Cardinal的源代码托管在GitHub上,我们直接克隆下来。

cd ~/awd_platform git clone https://github.com/vidar-team/Cardinal.git cd Cardinal

注意:如果GitHub克隆速度慢,可以考虑使用镜像源,或者在能正常访问的网络环境下先下载ZIP包再上传到Kali。

接下来,在虚拟环境中安装项目所需的Python包。项目根目录通常有一个requirements.txt文件。

pip install --upgrade pip pip install -r requirements.txt

这个过程可能会花费一些时间,具体取决于网络速度。你可能会看到一些关于编译的警告,只要最终安装成功即可。如果遇到某个包安装失败(特别是需要编译的,如mysqlclient),通常是因为缺少对应的系统开发库。回顾我们第一步安装的build-essentiallibmysqlclient-dev(如果mariadb-server已安装,其开发包通常会自动装上)就是为了解决这个问题。

3.2 配置数据库与项目设置

Cardinal的配置文件通常是一个settings.py或类似文件,我们需要修改其中的数据库连接信息,指向我们刚才创建的MySQL数据库。

1. 定位并修改配置:在Cardinal项目目录中,找到配置文件。常见路径是Cardinal/settings.pyCardinal/Cardinal/settings.py。使用文本编辑器(如nano或vim)打开它。

nano Cardinal/settings.py

找到数据库配置部分(通常是一个名为DATABASES的字典)。将其修改为如下内容:

DATABASES = { ‘default‘: { ‘ENGINE‘: ‘django.db.backends.mysql‘, ‘NAME‘: ‘cardinal‘, # 你创建的数据库名 ‘USER‘: ‘cardinal_user‘, # 你创建的数据库用户 ‘PASSWORD‘: ‘YourStrongPasswordHere!‘, # 对应用户的密码 ‘HOST‘: ‘127.0.0.1‘, ‘PORT‘: ‘3306‘, } }

2. 处理静态文件与密钥:

  • 静态文件:确保STATIC_URLSTATIC_ROOT配置正确。STATIC_ROOT是执行收集静态文件命令后文件存放的目录,例如可以设置为os.path.join(BASE_DIR, ‘static‘)。后续我们需要运行命令来收集静态文件。
  • 密钥(SECRET_KEY):Django项目需要一个密钥,用于加密签名等。在生成的配置文件中应该已经有一个。切勿在正式环境中使用默认的或公开的密钥。对于测试环境,可以暂时使用,但若部署到公网,务必生成一个新的随机字符串替换它。

3.3 数据库迁移与超级用户创建

Django使用“迁移(Migration)”来管理数据库表结构的变化。我们需要应用这些迁移来在数据库中创建Cardinal所需的表。

1. 执行数据库迁移:在项目根目录(有manage.py的目录)下,运行:

python manage.py makemigrations python manage.py migrate

makemigrations命令会根据模型定义生成迁移文件,migrate命令则执行这些迁移,在数据库中创建实际的表。如果一切顺利,你会看到一系列Applying ... OK的输出。

2. 创建后台管理员账户:Cardinal平台有一个管理后台,用于管理比赛、题目、队伍等。我们需要创建一个超级用户(superuser)来登录后台。

python manage.py createsuperuser

根据提示输入用户名、邮箱(可选)和密码。这个账户将用于登录http://你的IP:8000/admin/

3. 收集静态文件:Django的CSS、JavaScript等静态文件需要收集到一个目录,以便Web服务器提供。运行:

python manage.py collectstatic

系统会询问你是否确认,输入yes即可。所有静态文件将被复制到STATIC_ROOT指定的目录。

3.4 启动开发服务器进行测试

至此,平台的核心部分已经部署完成。我们可以先使用Django自带的轻量级开发服务器启动,验证服务是否正常。

python manage.py runserver 0.0.0.0:8000
  • 0.0.0.0表示监听所有网络接口,这样宿主机才能访问到虚拟机里的服务。
  • 8000是端口号,如果8000被占用,可以换成其他端口,如8080。

在Kali本机的浏览器中访问http://127.0.0.1:8000,应该能看到Cardinal平台的首页。在宿主机的浏览器中访问http://[你的Kali虚拟机IP]:8000,也应该能看到同样页面。

重要提示:Django的开发服务器(runserver仅用于开发和测试,性能和安全性都不足以应对生产环境。在确认平台基本功能正常后,我们需要使用更专业的WSGI服务器(如Gunicorn)和Web服务器(如Nginx)来部署,这部分将在后续章节详述。

4. 大屏(Monitor)配置详解

Cardinal AWD平台的一个亮点就是其攻防态势大屏,它能实时、可视化地展示比赛得分、队伍排名、攻防动态,极具实战感和观赏性。大屏实际上是一个独立的前端项目,通常使用Vue.js等框架开发,通过WebSocket或API与后端通信获取数据。

4.1 大屏组件安装与构建

大屏的代码通常包含在Cardinal项目的某个子目录中,比如frontend/monitor/。我们需要安装Node.js环境来构建它。

1. 安装Node.js与npm:Kali仓库中的Node.js版本可能较旧。建议从NodeSource仓库安装LTS版本。

curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - sudo apt install -y nodejs

安装后验证:

node --version npm --version

2. 构建大屏前端:进入大屏前端代码目录。

cd ~/awd_platform/Cardinal/frontend # 请根据实际目录调整,可能是 `monitor` 或 `web`

安装前端依赖(这可能需要一些时间):

npm install

如果npm install速度慢,可以考虑配置淘宝镜像:

npm config set registry https://registry.npmmirror.com

依赖安装完成后,进行项目构建。构建命令通常定义在package.jsonscripts里,常见的是npm run build

npm run build

构建过程会将Vue.js代码编译、压缩,生成静态文件(HTML, CSS, JS)到dist目录。

3. 配置大屏后端服务:大屏可能需要一个简单的后端服务来提供静态文件或处理WebSocket。有时这个服务也由Python编写。查看大屏目录下是否有类似server.pyapp.py的文件,以及对应的requirements.txt。如果有,需要为其创建另一个Python虚拟环境或复用主环境,并安装依赖、运行服务。

更常见的做法是,将构建好的dist目录中的静态文件,配置到主Django项目的静态文件服务或Nginx中,并通过Django的API来提供数据。具体配置需要参考Cardinal项目的官方文档或代码内的说明。

4.2 集成大屏与主平台

大屏需要获取比赛实时数据,因此必须与Cardinal后端正确连接。这通常涉及前端代码中的API地址配置。

1. 修改API配置:在大屏前端源码中(通常是构建前的源代码里),找到一个配置文件,可能是src/config.jssrc/api/baseUrl.jsvue.config.js。你需要修改其中指向后端API的地址。

例如,假设原配置是:

const baseUrl = ‘http://localhost:8000/api/‘;

你需要将其改为你Cardinal后端实际运行的地址。如果大屏和主站部署在同一台机器、由同一个Nginx服务,可以使用相对路径,如/api/

2. 重新构建与部署:修改配置后,必须重新运行npm run build来生成新的dist文件。

然后,你需要将这些新的静态文件放到Web服务器能访问的位置。有两种主流方式:

  • 方式A:集成到Django静态文件:将dist目录下的所有文件复制到Django项目的某个静态目录(如static/monitor/),然后配置Django的URL路由,将某个路径(如/monitor/)指向这些静态文件。
  • 方式B:由Nginx直接服务:将dist目录放到Nginx的网站根目录下(如/var/www/monitor/),然后在Nginx配置中单独为其设置一个server块或location块。

考虑到性能和分离性,方式B(Nginx直接服务)更推荐。我们将在下一章生产环境部署中详细说明Nginx的配置。

3. 验证大屏访问:配置完成后,通过浏览器访问大屏的URL(例如http://你的IP/monitor)。你应该能看到一个动态的、展示比赛信息的大屏界面。如果数据没有加载,需要打开浏览器的开发者工具(F12),查看“网络(Network)”选项卡,确认API请求是否成功,地址是否正确,以及是否有CORS(跨域资源共享)错误。

踩坑记录:大屏最常见的两个问题是API地址配置错误CORS错误。如果大屏页面是独立的域名或端口,而后端API是另一个,浏览器会因为同源策略阻止请求。解决方法是在后端Django中安装并配置django-cors-headers中间件,允许大屏前端的域名进行跨域访问。

5. 生产环境部署:Nginx + Gunicorn

开发服务器 (runserver) 绝不能用于公开访问。为了平台的稳定、安全和性能,我们必须使用生产级的WSGI服务器和应用服务器组合。这里我们采用Gunicorn+Nginx的方案。

5.1 使用Gunicorn作为WSGI服务器

Gunicorn是一个Python WSGI HTTP服务器,性能比开发服务器好得多。首先在虚拟环境中安装它:

source ~/awd_platform/venv/bin/activate cd ~/awd_platform/Cardinal pip install gunicorn

1. 测试Gunicorn启动:在项目根目录下,使用以下命令测试Gunicorn是否能正常启动Django应用:

gunicorn --workers 3 --bind 127.0.0.1:8000 Cardinal.wsgi:application
  • --workers 3:启动3个工作进程,根据CPU核心数调整,通常建议(2 * CPU核心数) + 1
  • --bind 127.0.0.1:8000:绑定到本地的8000端口。注意,这里我们绑定到127.0.0.1,而不是0.0.0.0,因为我们将用Nginx反向代理,Gunicorn只对本地服务。
  • Cardinal.wsgi:application:指向Django项目的WSGI应用入口,Cardinal是你的项目名称目录。

如果命令执行后没有报错,说明Gunicorn可以正常加载你的应用。按Ctrl+C停止它。

2. 创建Gunicorn系统服务(Systemd):为了让Gunicorn在系统启动时自动运行,并在崩溃时重启,我们将其配置为systemd服务。

创建服务文件:

sudo nano /etc/systemd/system/cardinal.service

写入以下内容(请根据你的实际路径修改):

[Unit] Description=Gunicorn daemon for Cardinal AWD Platform After=network.target mariadb.service [Service] User=你的Kali用户名 Group=你的Kali用户组 WorkingDirectory=/home/你的用户名/awd_platform/Cardinal Environment=“PATH=/home/你的用户名/awd_platform/venv/bin” ExecStart=/home/你的用户名/awd_platform/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:8000 Cardinal.wsgi:application [Install] WantedBy=multi-user.target
  • User/Group:运行服务的用户和组,建议使用你的普通用户,避免root权限过高。
  • WorkingDirectory:Cardinal项目根目录的绝对路径。
  • Environment=“PATH=...”:指定虚拟环境的bin目录到PATH,确保使用虚拟环境中的gunicorn和python。
  • ExecStart:启动命令,绑定到本地回环地址的8000端口。

保存退出后,重新加载systemd配置,启动服务并设置开机自启:

sudo systemctl daemon-reload sudo systemctl start cardinal.service sudo systemctl enable cardinal.service

检查服务状态:

sudo systemctl status cardinal.service

如果看到active (running),说明服务启动成功。可以通过curl http://127.0.0.1:8000简单测试。

5.2 配置Nginx作为反向代理与静态文件服务器

Nginx将作为面向公众的Web服务器,它有三个主要作用:1) 处理静态文件(效率远高于Django);2) 将动态请求反向代理给Gunicorn;3) 为Cardinal大屏提供Web服务。

1. 安装Nginx:

sudo apt install -y nginx

2. 配置Nginx站点:删除默认站点配置,创建我们自己的配置:

sudo rm /etc/nginx/sites-enabled/default sudo nano /etc/nginx/sites-available/cardinal

写入以下配置。这个配置假设:

  • 主平台(管理后台和API)通过http://你的域名或IP/访问。
  • 大屏通过http://你的域名或IP/monitor/访问,其静态文件位于/home/你的用户名/awd_platform/Cardinal/frontend/dist
server { listen 80; server_name _; # 这里可以换成你的域名或IP,_表示通配 # 主平台静态文件(由Django的collectstatic收集) location /static/ { alias /home/你的用户名/awd_platform/Cardinal/static/; expires 30d; } # 大屏静态文件 location /monitor/ { alias /home/你的用户名/awd_platform/Cardinal/frontend/dist/; index index.html; try_files $uri $uri/ /monitor/index.html; } # 将其他所有动态请求代理给Gunicorn location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_connect_timeout 300s; proxy_send_timeout 300s; proxy_read_timeout 300s; send_timeout 300s; } }

关键点解析:

  • location /static/:Nginx直接处理/static/开头的请求,返回对应的静态文件,减轻Django负担。
  • location /monitor/:Nginx直接服务大屏的静态文件。try_files指令用于支持Vue Router的history模式,确保刷新页面不404。
  • location /:将所有其他请求(如/admin/,/api/)转发给运行在127.0.0.1:8000的Gunicorn。
  • proxy_set_header:将客户端的一些原始信息(如真实IP)传递给后端,这对于日志记录和安全分析很重要。
  • timeout设置得较长(300秒),是因为AWD比赛中的一些操作(如上传文件、长时间轮询)可能耗时。

3. 启用配置并测试:创建符号链接启用站点配置,然后测试Nginx配置语法并重启。

sudo ln -s /etc/nginx/sites-available/cardinal /etc/nginx/sites-enabled/ sudo nginx -t # 测试配置语法,必须显示“syntax is ok” sudo systemctl restart nginx

现在,你应该可以通过http://你的Kali虚拟机IP访问Cardinal主平台,通过http://你的Kali虚拟机IP/monitor访问大屏。

6. 平台配置、使用与优化

平台部署成功后,我们还需要进行一些必要的配置,并了解基本的使用流程,才能让它真正运转起来。

6.1 后台管理初步配置

通过http://你的IP/admin登录之前创建的超级用户账户。

1. 创建比赛(Game):在后台,你需要先创建一个比赛。填写比赛名称、开始时间、结束时间、描述等。这里的关键是“比赛类型”,选择AWD模式。

2. 管理题目(Challenge):AWD比赛的题目通常是存在漏洞的Web应用或二进制程序。在Cardinal后台,你可以添加题目。

  • 题目名称与描述:清晰描述题目内容和漏洞点(对参赛者可见或不可见)。
  • 题目类型:如Web、Pwn、Crypto等。
  • 题目分值、初始分值、最低分值:定义题目的动态计分规则。
  • 题目文件/地址:如果是Web题,可能需要提供可访问的URL或上传部署包;如果是二进制题,可能需要上传二进制文件。Cardinal通常需要与题目容器(如Docker)结合,实现动态靶机的部署和flag的轮询。这部分是高级功能,可能需要额外配置题目部署脚本和Checker脚本。

3. 管理队伍(Team)与用户(User):

  • 可以批量创建队伍,并为每个队伍生成初始账户密码。
  • 也可以让用户通过前台注册,然后在后台审核并分配到队伍。

6.2 大屏数据对接与展示

大屏需要获取比赛数据才能展示。确保:

  1. 比赛已创建并处于“进行中”状态。
  2. 大屏前端配置的API地址(如/api/)能正确访问到后端。
  3. 后端Django项目已经正确配置了CORS(如果需要),允许大屏域名访问API。

大屏通常会实时显示:

  • 队伍排名:按总分实时排序。
  • 题目状态:用颜色(如绿/红/灰)表示各队伍对各题目的攻防状态(防守成功/被攻击/未开始)。
  • 攻击流与得分变化:动态展示攻击事件和分数变化。
  • 时间轴:比赛剩余时间。

6.3 性能与安全优化建议

1. 数据库优化:

  • 为频繁查询的字段(如队伍ID、题目ID、时间戳)建立数据库索引。
  • 定期清理旧的日志和比赛数据,避免数据库膨胀。

2. 服务进程管理:

  • 根据服务器负载调整Gunicorn的worker数量。可以使用(2 * CPU核心数) + 1作为起始值,通过监控进行调整。
  • 考虑使用进程管理工具如supervisor来更精细地管理Gunicorn进程(虽然systemd已经够用)。

3. 安全加固:

  • 修改Django SECRET_KEY:使用openssl rand -base64 64生成一个随机字符串,替换settings.py中的SECRET_KEY
  • 关闭Debug模式:在生产环境中,务必设置DEBUG = False。同时需要正确配置ALLOWED_HOSTS = [‘你的域名或IP‘]
  • 配置HTTPS:使用Let‘s Encrypt免费证书为Nginx配置HTTPS,加密数据传输。这需要你有一个域名。
  • 防火墙:配置UFW或iptables,只开放必要的端口(如80, 443, SSH端口)。

7. 常见问题与故障排查实录

搭建过程中难免会遇到各种问题。这里记录了我遇到的一些典型问题及其解决方法。

7.1 数据库连接失败

问题现象:运行python manage.py migrate或启动服务时,报错django.db.utils.OperationalError: (2002, “Can‘t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘ (2)“)或类似错误。

排查步骤:

  1. 检查MySQL服务状态:sudo systemctl status mariadb。确保状态是active (running)
  2. 检查socket文件:ls -la /var/run/mysqld/mysqld.sock。如果文件不存在,可能是MySQL没启动或socket路径不对。
  3. 尝试TCP连接:在Django的DATABASES配置中,将‘HOST‘: ‘127.0.0.1‘明确写出来,而不是使用默认的socket连接。
  4. 检查用户权限:确认你为Cardinal创建的数据库用户(如cardinal_user)拥有对cardinal数据库的完全权限,并且主机限制是localhost

解决方案:

  • 启动MySQL服务:sudo systemctl start mariadb
  • 如果使用TCP连接,确保settings.pyHOST‘127.0.0.1‘,并且MySQL用户允许从localhost连接。
  • 重新授予权限:
    GRANT ALL PRIVILEGES ON cardinal.* TO ‘cardinal_user‘@‘localhost‘ IDENTIFIED BY ‘YourStrongPasswordHere!‘ WITH GRANT OPTION; FLUSH PRIVILEGES;

7.2 静态文件404错误

问题现象:网站能打开,但样式全无,浏览器控制台显示CSS/JS文件404。

排查步骤:

  1. 检查Nginx配置:确认location /static/alias路径是否正确指向了collectstatic后生成的目录(即STATIC_ROOT)。
  2. 检查文件权限:确保Nginx进程用户(通常是www-data)有权限读取静态文件目录。可以尝试sudo chmod -R 755 /path/to/your/static
  3. 确认静态文件已收集:再次运行python manage.py collectstatic,确保没有错误。
  4. 检查Nginx错误日志:sudo tail -f /var/log/nginx/error.log,访问网站时看是否有相关报错。

解决方案:

  • 修正Nginx配置中的路径。
  • 调整目录权限:sudo chown -R 你的用户名:www-data /path/to/static && sudo chmod -R 755 /path/to/static
  • 重启Nginx:sudo systemctl restart nginx

7.3 大屏无法加载数据(API错误或CORS错误)

问题现象:大屏页面能打开,但一直加载中,或数据显示为空。浏览器控制台(F12 -> Console/Network)报错。

排查步骤:

  1. 检查网络请求:在Network选项卡查看向/api/发起的请求,看状态码是404、502还是其他。
    • 404:API路径不对,检查大屏前端配置的baseUrl
    • 502 Bad Gateway:Nginx无法连接到Gunicorn后端。检查Gunicorn服务是否运行 (sudo systemctl status cardinal)。
    • CORS错误:提示Access-Control-Allow-Origin相关错误。
  2. 检查Gunicorn服务:确保cardinal.service正在运行,并且监听在127.0.0.1:8000
  3. 检查Nginx代理配置:确保location /块正确代理到了http://127.0.0.1:8000

解决方案:

  • API地址错误:修改大屏前端配置,重新构建部署。
  • Gunicorn未运行:启动服务并查看日志sudo journalctl -u cardinal.service -f
  • 解决CORS:在后端Django项目中安装配置django-cors-headers
    pip install django-cors-headers
    settings.py中:
    INSTALLED_APPS = [ ... ‘corsheaders‘, ... ] MIDDLEWARE = [ ‘corsheaders.middleware.CorsMiddleware‘, # 尽量放在最前 ‘django.middleware.common.CommonMiddleware‘, ... ] # 允许大屏前端域名,如果同域名同端口则无需配置,否则如下 CORS_ALLOWED_ORIGINS = [ “http://你的大屏前端域名或IP:端口“, ] # 或者允许所有(仅限测试环境!) # CORS_ALLOW_ALL_ORIGINS = True

7.4 上传文件或长时间操作超时

问题现象:在后台上传题目附件或进行某些操作时,页面卡住然后报错。

原因分析:这通常是Nginx或Gunicorn的默认超时时间太短导致的。

解决方案:

  • 如之前Nginx配置所示,在location /块中增加超时配置:
    proxy_connect_timeout 300s; proxy_send_timeout 300s; proxy_read_timeout 300s; send_timeout 300s;
  • 同时,也可以在Gunicorn启动命令中增加超时参数--timeout 300
  • 修改后重启Nginx和Gunicorn服务。

7.5 比赛进行中靶机状态更新延迟

问题现象:选手攻击成功后,平台分数更新或状态变化有延迟。

排查步骤:

  1. 检查Checker调度:Cardinal通过“Checker”脚本定期检查各队伍靶机的存活状态和Flag是否正确。检查Checker服务是否正常运行。Checker通常是一个独立的Python脚本或Celery任务。
  2. 检查消息队列(如使用):如果使用了Celery等异步任务队列,检查Worker是否在线,Broker(如Redis/RabbitMQ)连接是否正常。
  3. 查看日志:检查Django日志、Gunicorn日志和Checker脚本的日志,看是否有错误或异常。

解决方案:

  • 确认Checker脚本的定时任务(如crontab或Celery Beat)配置正确且正在执行。
  • 对于实时性要求高的场景,可以考虑使用WebSocket代替HTTP轮询来推送状态更新,但这需要对Cardinal源码进行更深入的定制。

整个搭建过程就像完成一个精密的拼图,从系统环境到每个服务组件,再到前后端的联调,每一步都需要耐心和细致。当你在浏览器中看到Cardinal平台成功运行,攻防大屏上数据开始跳动的那一刻,那种成就感是对之前所有折腾的最好回报。这套平台不仅是一个工具,更是一个可以不断打磨、深入学习的沙箱环境。你可以尝试修改它的界面,定制它的比赛规则,甚至集成自己的漏洞靶场,让它真正成为你网络安全学习和演练的得力助手。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询