如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这段话即可:
请先阅读并遵守:https://xuanyuan.cloud/agents.md
未读文档前不要生成 pull 命令或排错方案。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
一个生产就绪的 Docker MISP 镜像(以前托管于 ,现已弃用)大致基于 CoolAcid 和 DSCO 构建,几乎所有逻辑都经过重写并验证了正确性和可移植性。
主要特性:
misp-core 和 misp-modulesconfigure_misp.sh)configure_misp.sh)docker-compose.yml 文件本项目的核心精神是实现“可重复部署”,所有朝着此方向的拉取请求都将尽快合并。
要覆盖这些行为,请编辑docker-compose.yml文件的misp-core卷定义,以启用“customize_misp.sh”行为(详见“生产环境”部分的底部)。“customize_misp.sh”脚本会在上述行为完成后触发,是覆盖设置的合适位置。建议使用/var/www/MISP/app/cake Admin setSetting命令来覆盖设置,因为此工具了解config.php文件和数据库设置。
不确定添加新设置时需要编辑哪些文件?
如果只是用户未设置时才需要设置的默认值,请将其添加到某个*.default.json文件中。
如果是由环境变量控制的、旨在覆盖已设置值的设置,请将其添加到某个*.envars.json文件中(注意仍可指定默认值)。
https://github.com/MISP/misp-guard是一个mitmproxy插件,旨在应用可配置过滤器,防止敏感威胁情报数据的无意泄露,同时促进受控信息共享。
默认情况下它处于禁用状态,但可通过compose配置文件启用。
启用
COMPOSE_PROFILES=misp-guard
PROXY_ENABLE=true
PROXY_HOST=misp-guard
# 必须与GUARD_PORT匹配(默认值=8888)
PROXY_PORT=8888
配置
guard/config.json中定义。entrypoint.sh自动替换misp-core的IP。以下格式用于定位misp-core,IP会在运行时替换为misp-core容器的IP:
{
"instances": {
"misp_container": {
"ip": "placeholder"
}
}
}
guard/config.json后,重启容器以应用更改:docker compose restart misp-guard
环境变量
# misp-guard监听端口(必须与PROXY_PORT匹配)
# 默认值:8888
GUARD_PORT=8888
# 可选:mitmdump misp-guard运行时参数(空格分隔)
GUARD_ARGS=--ssl-insecure -v
默认情况下,MISP会显示其内置的电子邮件/密码登录表单以及任何外部提供商。要禁用该表单并强制使用外部身份验证,请设置:
AUTH_ENFORCED=true
这对应MISP的Security.auth_enforced设置,并适用于任何已配置的外部提供商(OIDC/LDAP/AAD/CustomAuth)。
LDAP身份验证
您可以通过两种方法在MISP中配置LDAP身份验证:
推荐使用LdapAuth而非ApacheSecureAuth,因为它不需要带有ldap模块的反向代理apache。
以下使用LdapAuth插件与您的ldap/AD服务器集成的配置经过测试并强化。
本示例假设您已将根证书挂载到pod的/usr/local/share/ca-certificates/rootca.crt路径下,该证书会自动添加到/etc/ssl/certs/ca-certificates.crt证书bundle中。
使用memberOf:1.2.840.113556.1.4.1941:=旨在递归查找组中的嵌套成员。例如,如果我们有一个名为MIPS-ALLOW-IN的组对象,我们授予该组访问MISP的权限。并将该组添加为另一个名为Applications Admins的组的成员。那么Applications Admins中的所有成员/用户也将被授予访问权限。这种权限分配方法称为RBAC。
本示例使用userPrincipalName属性作为用户登录的用户名,并使用mail属性在用户登录时发送电子邮件。
您不需要使用任何单引号、双引号、转义或双重转义,/configure_misp.sh脚本会确保将需要引号的内容用单引号括起来,并写入/var/www/MISP/app/Config/config.php。
确保在instance-secrets.env中定义以下内容:
BASE_URL=https://misp.apps.openshift.domain.local
LDAPAUTH_ENABLE=true
LDAPAUTH_LDAPSERVER=ldaps://domain.local
LDAPAUTH_LDAPDN=OU=Company,OU=Management,DC=domain,DC=local
LDAPAUTH_LDAPREADERUSER=CN=ldap-account,OU=Accounts LDAP,OU=Management,DC=domain,DC=local
LDAPAUTH_LDAPREADERPASSWORD=YoucanType4nythingH3r3Even1'Are3scaped!
LDAPAUTH_LDAPSEARCHFILTER=(&(objectCategory=person)(objectClass=user)(memberOf:1.2.840.113556.1.4.1941:=CN=MIPS-ALLOW-IN,OU=Groups Applications,OU=Groups,DC=domain,DC=local))
LDAPAUTH_LDAPSEARCHATTRIBUTE=userPrincipalName
LDAPAUTH_LDAPEMAILFIELD=mail
LDAPAUTH_LDAPNETWORKTIMEOUT=-1
LDAPAUTH_UPDATEUSER=true
LDAPAUTH_LDAPDEFAULTORGID=1
LDAPAUTH_LDAPDEFAULTROLEID=3
LDAPAUTH_DEBUG=false
LDAPAUTH_LDAPTLSCUSTOMCACERT=false
LDAPAUTH_LDAPPROTOCOL=3
LDAPAUTH_LDAPALLOWREFERRALS=false
LDAPAUTH_STARTTLS=false
LDAPAUTH_MIXEDAUTH=true
LDAPAUTH_LDAPTLSREQUIRECERT=LDAP_OPT_X_TLS_DEMAND
LDAPAUTH_LDAPTLSCRLCHECK=LDAP_OPT_X_TLS_CRL_PEER
LDAPAUTH_LDAPTLSPROTOCOLMIN=LDAP_OPT_X_TLS_PROTOCOL_TLS1_2
STARTTLS设置为false,因为它旨在将未加密连接(LDAP)自动升级为安全连接(LDAPS)(如果可能)。由于我们使用LDAPS(硬编码)或根本不连接,因此不需要此功能。
OIDC身份验证
OIDC身份验证通过MISP OidcAuth插件实现。
有关使用KeyCloak的示例配置,请参见MISP Keycloak 26.1.x 基本集成指南
对于Okta,创建新的应用集成:
OIDC_ENABLE=true
OIDC_PROVIDER_URL=https:// /.well-known/openid-configuration
OIDC_ISSUER=https://
OIDC_CLIENT_ID=[client_id]
OIDC_CLIENT_SECRET=[client_secret]
OIDC_ROLES_PROPERTY="roles"
OIDC_ROLES_MAPPING="{\"Okta group - MISP Admin\": 1}" #
OIDC_DEFAULT_ORG="[Your default org in MISP]"
#OIDC_LOGOUT_URL=
OIDC_SCOPES="[\"profile\", \"email\", \"groups\"]"
OIDC_MIXEDAUTH=true #(如果要禁用密码登录,将此设置为false,请确保OIDC先正常工作)
OIDC_CODE_CHALLENGE_METHOD=S256
OIDC_AUTH_METHOD="client_secret_post"
OIDC_REDIRECT_URI="https:// /users/login" #(与Okta中设置的值相同)
OIDC_DISABLE_REQUEST_OBJECT=false
OIDC_DISABLE_PUSHED_AUTHORIZATION_REQUEST=false
OIDC_SKIP_PROXY=true
OIDC_ALLOW_EMAIL_LINKING=false
OIDC_REQUIRE_EMAIL_VERIFIED=true
OIDC_AUTH_METHOD的有效选项包括:
docker-compose.yml 指定要运行的构建版本(查看可用标签列表)./ssl: /etc/ssl/certscert.pemkey.pemca.pem./configs: /var/www/MISP/app/Config/./logs: /var/www/MISP/app/tmp/logs/./files: /var/www/MISP/app/files/./gnupg: /var/www/MISP/.gnupg/files/customize_misp.sh,并将 docker-compose.yml 中的 ${CUSTOM_PATH} 变量替换为其父路径。latest-slim 标签。只需调整 docker-compose.yml 文件,然后再次运行 docker compose pull 和 docker compose up。重大变更
通过 PR https://github.com/MISP/misp-docker/pull/430,NGINX 服务器已从 MISP 核心镜像中提取到独立镜像中。这提高了前端 NGINX 服务器的安全性和可扩展性,但也带来了如下所述的一些变更:
变量:作为此变更的一部分,template.env 中的几个变量已被修改
| 旧变量 | 新变量 |
|---|---|
CORE_HTTP_PORT | NGINX_HTTP_PORT |
CORE_HTTPS_PORT | NGINX_HTTPS_PORT |
FASTCGI_STATUS_LISTEN | FASTCGI_LISTEN_STATUS |
HSTS_MAX_AGE | NGINX_HSTS_MAX_AGE |
X_FRAME_OPTIONS | NGINX_X_FRAME_OPTIONS |
CONTENT_SECURITY_POLICY | NGINX_CONTENT_SECURITY_POLICY |
DISABLE_SSL_REDIRECT | 已完全移除,SSL 通过证书存在自动检测 |
基础 URL:由于 SSL 逻辑已更改(见下文),BASE_URL 变量现在是必填项。请确保环境中已设置此变量。
TLS/SSL:原 misp-core 中的 ./ssl 卷挂载已移至 misp-nginx 容器,因此现有证书仍可正常使用。
证书:如果缺少证书,SSL 将被禁用,但您可以使用以下命令生成自签名证书:
mkdir -p ./ssl/ && openssl req -x509 -subj '/CN=localhost' -nodes -newkey rsa:4096 -keyout ssl/key.pem -out ssl/cert.pem -days 365 -addext "subjectAltName = DNS:localhost, IP:127.0.0.1, IP:::1"
GPG 密钥交付:gpg.asc 现在通过 misp-nginx 提供,它将请求代理到 misp-core(PHP-FPM),而不是从 webroot 路径提供静态文件。
Kubernetes/Helm:清单已针对新的双容器拓扑进行更新;如果通过 Helm/Kubernetes 部署,请在升级前查看更新后的图表。
自定义根CA证书可以挂载到 /usr/local/share/ca-certificates 目录下,并将在 misp-core 容器启动时安装。
[!NOTE] 文件名必须带有 .crt 扩展名,否则将不会被处理。
misp-core:
# ...
volumes:
- "./configs/:/var/www/MISP/app/Config/"
- "./logs/:/var/www/MISP/app/tmp/logs/"
- "./files/:/var/www/MISP/app/files/"
- "./ssl/:/etc/nginx/certs/"
- "./gnupg/:/var/www/MISP/.gnupg/"
# 自定义:将 ${CUSTOM_PATH} 替换为包含 'files/customize_misp.sh' 的路径
# - "${CUSTOM_PATH}/:/custom/"
# 挂载自定义根CA证书
- "./rootca.pem:/usr/local/share/ca-certificates/rootca.crt"
可以使用卷归档来备份和恢复底层数据库。此过程未经过充分测试,因此不应不加批判地遵循。
docker compose down
tar 创建 misp-docker_mysql_data 卷的归档文件:tar -cvzf /root/misp_mysql_backup.tar.gz /var/lib/docker/volumes/misp-docker_mysql_data/
docker compose up
docker compose down
--overwrite 选项解压备份并覆盖现有数据,以替换现有文件:tar -xvzf /path_to_backup/misp_mysql_backup.tar.gz -C /var/lib/docker/volumes/misp-docker_mysql_data/ --overwrite
docker compose up
启用无密码Redis连接(出于安全考虑,默认值为false):
ENABLE_REDIS_EMPTY_PASSWORD=false
设置基础URL:
BASE_URL=https:// :10443
重新加载systemd用户守护进程:
systemctl --user daemon-reload
启动服务:
systemctl --user start misp-mail.service
systemctl --user start misp-db.service
systemctl --user start misp-redis.service
systemctl --user start misp-core.service
systemctl --user start misp-modules.service
稍等片刻,然后在https:// :10443检查您的服务。
如果一切正常,您可以使服务在重启和登出后保持持久化:
sudo loginctl enable-linger $USER
您甚至可以通过激活特定的定时器podman-auto-update.timer来设置podman检查新的容器版本:
systemctl --user enable podman-auto-update.timer --now
如果您的镜像构建失败,或者构建成功但容器无法启动,您可以通过创建新的https://github.com/MISP/misp-docker/issues获取帮助。为了获得最有效的支持,请包含您尝试构建镜像时的环境条件以及相关的调试输出。
确保包含您构建环境的版本,例如Docker(或Podman)、Docker Compose(或Podman Compose)、Python、操作系统,以及您是以root用户还是非root用户身份构建。
对于Docker,运行:
python3 -V
docker -v
docker compose version
对于Podman,运行:
python3 -V
podman -v
podman compose version
如果之前构建留下的不完整层仍然存在,可能会导致构建错误。为确保环境干净,请停止所有运行中的容器并删除旧镜像和卷。
使用Docker:
docker compose down
docker system prune
docker image rm ghcr.io/misp/misp-docker/misp-core
docker image rm ghcr.io/misp/misp-docker/misp-nginx
docker image rm ghcr.io/misp/misp-docker/misp-modules
docker image rm ghcr.io/misp/misp-docker/misp-guard
使用Podman:
podman compose down
podman system prune
podman image rm ghcr.io/misp/misp-docker/misp-core
podman image rm ghcr.io/misp/misp-docker/misp-nginx
podman image rm ghcr.io/misp/misp-docker/misp-modules
podman image rm ghcr.io/misp/misp-docker/misp-guard
您还可以在构建过程中使用--no-cache选项来忽略缓存的层。
清理环境后,使用详细日志记录来捕获构建过程的详细输出。建议将日志记录到文件中,以便进行故障排除和请求支持时使用。
对于Docker:
docker compose --verbose build --no-cache | tee build.log
对于Podman:
PODMAN_COMPOSE_VERBOSE=1 podman compose build --no-cache | tee build.log
您可以组合上述命令,一步完成镜像的完全重置和重建。
对于Docker:
docker system prune ; docker image rm ghcr.io/misp/misp-docker/misp-core ; docker image rm ghcr.io/misp/misp-docker/misp-modules ; docker image rm ghcr.io/misp/misp-docker/misp-guard ; rm -f build.log ; docker compose --verbose build --no-cache | tee build.log
对于Podman:
podman system prune ; podman image rm ghcr.io/misp/misp-docker/misp-core ; podman image rm ghcr.io/misp/misp-docker/misp-modules ; podman image rm ghcr.io/misp/misp-docker/misp-guard ; rm -f build.log ; PODMAN_COMPOSE_VERBOSE=1 podman compose build --no-cache | tee build.log
这确保您从干净的状态开始构建,而不使用之前构建的残余文件。
通过构建日志,您可以确定构建失败的位置。要精确定位具体步骤,请在Dockerfile中添加调试行。使用唯一标记以便在日志中轻松找到它们:
RUN echo "____MYDEBUG___1"
RUN echo "____MYDEBUG___2"
RUN echo "____MYDEBUG___3"
许多构建错误与变量未正确设置或导入有关。要进行调试,请打印它们的值:
RUN echo "____MYDEBUG___ CORE_TAG: ${CORE_TAG}"
示例输出:
[4/5] STEP 19/20: RUN echo "____MYDEBUG___ CORE_TAG: ${CORE_TAG}"
____MYDEBUG___ CORE_TAG: v2.5.16
--> 798999451f75
对于Dockerfile中的shell块,插入echo语句以打印变量值:
RUN <<-EOF
for mod in "$@"; do
mod_version_var=$(echo "PYPI_${mod}_VERSION" | tr '[:lower:]' '[:upper:]' | tr '-' '_')
mod_version=$(eval "echo \"\$mod_version_var\"")
echo "____MYDEBUG___ mod mod_version: ${mod}${mod_version}"
# ... rest of the code ...
done
EOF
旧版本(5之前的版本)的Podman可能无法在shell块中正确展开变量。如果遇到此问题,请确保使用正确的shell语法。对于Podman,将:
RUN <<-EOF
替换为(注意**'**引号)
RUN bash <<-'EOF'
以确保变量按预期展开。作为参考,此问题首次出现在成功构建镜像后,但启动容器时出现/usr/local/bin/supervisord: No such file or directory错误。有关更多详细信息,请参见https://github.com/MISP/misp-docker/issues/265和https://github.com/MISP/misp-docker/pull/273。
通过遵循这些步骤,您可以高效地排查和解决构建问题。如果问题仍然存在,请在创建issue请求帮助时包含您的构建日志和环境详情。
来自真实用户的反馈,见证轩辕镜像的优质服务