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 mysql或service 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-essential和libmysqlclient-dev(如果mariadb-server已安装,其开发包通常会自动装上)就是为了解决这个问题。
3.2 配置数据库与项目设置
Cardinal的配置文件通常是一个settings.py或类似文件,我们需要修改其中的数据库连接信息,指向我们刚才创建的MySQL数据库。
1. 定位并修改配置:在Cardinal项目目录中,找到配置文件。常见路径是Cardinal/settings.py或Cardinal/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_URL和STATIC_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 migratemakemigrations命令会根据模型定义生成迁移文件,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:80000.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 --version2. 构建大屏前端:进入大屏前端代码目录。
cd ~/awd_platform/Cardinal/frontend # 请根据实际目录调整,可能是 `monitor` 或 `web`安装前端依赖(这可能需要一些时间):
npm install如果npm install速度慢,可以考虑配置淘宝镜像:
npm config set registry https://registry.npmmirror.com依赖安装完成后,进行项目构建。构建命令通常定义在package.json的scripts里,常见的是npm run build。
npm run build构建过程会将Vue.js代码编译、压缩,生成静态文件(HTML, CSS, JS)到dist目录。
3. 配置大屏后端服务:大屏可能需要一个简单的后端服务来提供静态文件或处理WebSocket。有时这个服务也由Python编写。查看大屏目录下是否有类似server.py或app.py的文件,以及对应的requirements.txt。如果有,需要为其创建另一个Python虚拟环境或复用主环境,并安装依赖、运行服务。
更常见的做法是,将构建好的dist目录中的静态文件,配置到主Django项目的静态文件服务或Nginx中,并通过Django的API来提供数据。具体配置需要参考Cardinal项目的官方文档或代码内的说明。
4.2 集成大屏与主平台
大屏需要获取比赛实时数据,因此必须与Cardinal后端正确连接。这通常涉及前端代码中的API地址配置。
1. 修改API配置:在大屏前端源码中(通常是构建前的源代码里),找到一个配置文件,可能是src/config.js、src/api/baseUrl.js或vue.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 gunicorn1. 测试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 nginx2. 配置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 大屏数据对接与展示
大屏需要获取比赛数据才能展示。确保:
- 比赛已创建并处于“进行中”状态。
- 大屏前端配置的API地址(如
/api/)能正确访问到后端。 - 后端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)“)或类似错误。
排查步骤:
- 检查MySQL服务状态:
sudo systemctl status mariadb。确保状态是active (running)。 - 检查socket文件:
ls -la /var/run/mysqld/mysqld.sock。如果文件不存在,可能是MySQL没启动或socket路径不对。 - 尝试TCP连接:在Django的
DATABASES配置中,将‘HOST‘: ‘127.0.0.1‘明确写出来,而不是使用默认的socket连接。 - 检查用户权限:确认你为Cardinal创建的数据库用户(如
cardinal_user)拥有对cardinal数据库的完全权限,并且主机限制是localhost。
解决方案:
- 启动MySQL服务:
sudo systemctl start mariadb。 - 如果使用TCP连接,确保
settings.py中HOST是‘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。
排查步骤:
- 检查Nginx配置:确认
location /static/的alias路径是否正确指向了collectstatic后生成的目录(即STATIC_ROOT)。 - 检查文件权限:确保Nginx进程用户(通常是
www-data)有权限读取静态文件目录。可以尝试sudo chmod -R 755 /path/to/your/static。 - 确认静态文件已收集:再次运行
python manage.py collectstatic,确保没有错误。 - 检查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)报错。
排查步骤:
- 检查网络请求:在Network选项卡查看向
/api/发起的请求,看状态码是404、502还是其他。- 404:API路径不对,检查大屏前端配置的
baseUrl。 - 502 Bad Gateway:Nginx无法连接到Gunicorn后端。检查Gunicorn服务是否运行 (
sudo systemctl status cardinal)。 - CORS错误:提示
Access-Control-Allow-Origin相关错误。
- 404:API路径不对,检查大屏前端配置的
- 检查Gunicorn服务:确保
cardinal.service正在运行,并且监听在127.0.0.1:8000。 - 检查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-headerssettings.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 比赛进行中靶机状态更新延迟
问题现象:选手攻击成功后,平台分数更新或状态变化有延迟。
排查步骤:
- 检查Checker调度:Cardinal通过“Checker”脚本定期检查各队伍靶机的存活状态和Flag是否正确。检查Checker服务是否正常运行。Checker通常是一个独立的Python脚本或Celery任务。
- 检查消息队列(如使用):如果使用了Celery等异步任务队列,检查Worker是否在线,Broker(如Redis/RabbitMQ)连接是否正常。
- 查看日志:检查Django日志、Gunicorn日志和Checker脚本的日志,看是否有错误或异常。
解决方案:
- 确认Checker脚本的定时任务(如crontab或Celery Beat)配置正确且正在执行。
- 对于实时性要求高的场景,可以考虑使用WebSocket代替HTTP轮询来推送状态更新,但这需要对Cardinal源码进行更深入的定制。
整个搭建过程就像完成一个精密的拼图,从系统环境到每个服务组件,再到前后端的联调,每一步都需要耐心和细致。当你在浏览器中看到Cardinal平台成功运行,攻防大屏上数据开始跳动的那一刻,那种成就感是对之前所有折腾的最好回报。这套平台不仅是一个工具,更是一个可以不断打磨、深入学习的沙箱环境。你可以尝试修改它的界面,定制它的比赛规则,甚至集成自己的漏洞靶场,让它真正成为你网络安全学习和演练的得力助手。