如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 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 配置文件启用。
启用
.env 文件中启用配置文件:COMPOSE_PROFILES=misp-guard
misp-core 已配置为使用代理: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
LDAP 身份验证
您可以使用以下两种方法在 MISP 中配置 LDAP 身份验证:
推荐使用 LdapAuth 而非 ApacheSecureAuth,因为它不需要带有 ldap 模块的 rproxy apache。
以下使用 LdapAuth 插件与您的 ldap/AD 服务器集成的配置经过测试且已强化。
此示例假设您已将根证书挂载到 Pod 的 /usr/local/share/ca-certificates/rootca.crt 路径下,该证书会自动添加到 /etc/ssl/certs/ca-certificates.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,请创建新的应用集成:
.env 文件中,设置以下变量: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_SKIP_PROXY=true
OIDC_ALLOW_EMAIL_LINKING=false
OIDC_REQUIRE_EMAIL_VERIFIED=true
OIDC_AUTH_METHOD 的有效选项包括:
client_secret_post:已测试client_secret_basic:如果未设置该变量,则为默认值,但在 Okta 中似乎存在问题。它会返回以下错误:"Error 'invalid_request' received from IdP: Cannot supply multiple client credentials"。client_secret_jwt:未测试private_key_jwt:未测试CustomAuth
您可以按照此处所述使用 Plugin.CustomAuth 插件添加身份验证:[***] HTTP 头对用户进行身份验证。这在 MISP 运行在身份验证反向代理服务器后面时非常有用。
如果要在负载均衡器后方部署多个 misp-core 容器,建议在 .env 文件中或容器环境内将以下参数设置为静态值,因为它们用于会话处理,若未设置将随机生成:
如果不这样做,可能会出现 CSRF 错误。
出于非会话相关原因,以下环境变量在所有 misp-core 容器中也应保持一致:
不建议共享 app/Config 目录,因为此镜像在每次容器启动时都会执行检查和修改,可能会导致竞争条件,损坏共享的 config.php 文件。建议每个容器使用独立的 app/Config 目录。
GitHub Action 会自动构建 misp-core、misp-modules 和 misp-guard 镜像,并将其推送到 https://github.com/orgs/MISP/packages%E3%80%82%E6%88%91%E4%BB%AC%E4%B8%8D%E5%9C%A8%E4%BB%93%E5%BA%93%E5%86%85%E4%BD%BF%E7%94%A8%E6%A0%87%E7%AD%BE%EF%BC%9B%E8%80%8C%E6%98%AF%E5%9C%A8%E9%95%9C%E5%83%8F%E6%8E%A8%E9%80%81%E5%88%B0 registry 时为其添加标签。对于每次构建,misp-core、misp-modules、misp-guard 镜像的标签规则如下:
misp-core:${commit-sha1}[0:7]、misp-modules:${commit-sha1}[0:7] 和 misp-guard:${commit-sha1}[0:7],其中 ${commit-sha1} 是触发构建的提交哈希misp-core:latest、misp-modules:latest 和 misp-guard:latest,用于跟踪可用的最新构建misp-core:${CORE_TAG}、misp-modules:${MODULES_TAG} 和 misp-guard:${GUARD_TAG},反映构建时 template.env 文件中指定的基础版本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
Podman 的旧版本(5 之前的版本)可能无法在 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%E3%80%82
通过遵循这些步骤,您可以高效地排查并解决构建问题。如果问题仍然存在,请在提交 issue 请求帮助时附上您的构建日志和环境详情。
来自真实用户的反馈,见证轩辕镜像的优质服务