Ajenti 配置文件完全指南:config.yml / smtp.yml / users.yml 结构与参数详解

发布时间:2026/9/26 13:59:39
Ajenti 配置文件完全指南:config.yml / smtp.yml / users.yml 结构与参数详解 后端运维【免费下载链接】ajentiAjenti Core and stock plugins项目地址https://gitcode.com/gh_mirrors/aj/ajenti点击查看免费下载本篇技术指南基于 Ajenti 官方文档 docs/source/man/config.rst 编写系统讲解 Ajenti 控制面板的全部配置文件——/etc/ajenti目录下的config.yml主配置、smtp.yml邮件中继凭据与users.yml用户认证数据并对照仓库源码如 ajenti-core/aj/config.py逐一解释每个参数的含义、默认值与底层实现。读者读完本文将能独立完成 Ajenti 的安装后配置、HTTPS/客户端证书认证启用、密码找回邮件功能开通以及多用户认证体系的自定义。配置文件总览Ajenti 的所有配置文件统一存放在/etc/ajenti目录下采用 YAML 格式YAML 规范。整个目录包含三个核心文件文件作用config.yml主配置文件包含几乎所有重要参数认证、监听绑定、SSL、邮件通知、界面与安全策略smtp.ymlSMTP 邮件服务器凭据用于密码重置功能users.yml用户认证提供者provider: users的默认用户数据文件其中smtp.yml与users.yml都通过config.yml中的相关配置项被引用。仓库自带的默认配置样例可参考 ajenti-panel/config.yml。config.yml 详解主配置文件的核心骨架如下对应 ajenti-core/aj/config.py 中BaseConfig.ensure_structure()定义的默认结构auth: allow_sudo: true emails: {} provider: os users_file: /etc/ajenti/users.yml bind: host: 0.0.0.0 mode: tcp port: 8000 ssl: enable: true certificate: /etc/ajenti/mycert.pem fqdn_certificate: /etc/letsencrypt/ajenti.pem force: false client_auth: enable: true force: true certificates: - digest: 15:E8:5E:E5:D2:E8:75:0D:53:FF:22:A8:79:28:E5:BE:33:E0:37:07:FB:31:47:4D:61:69:AB:43:F8:5B:23:78 name: CNA,STNA,Osajenti.mydomain.com,CNrootajenti.mydomain.com serial: 352674123960898230347891590646542168839110009016 user: root email: enable: true templates: reset_email: /etc/ajenti/email/mytemplate_for_reset_password.html color: blue language: en logo: /srv/dev/ajenti/ajenti-panel/aj/static/images/Logo.png max_sessions: 10 name: ajenti.mydomain.com restricted_user: nobody session_max_time: 1200 trusted_domains: [] trusted_proxies: []auth 块认证策略auth: allow_sudo: true emails: {} provider: os users_file: /etc/ajenti/users.ymlallow_sudotrue或false是否允许属于 sudo 组的用户进行权限提升。在 ajenti-core/aj/auth.py 中AuthenticationService.check_sudo_password()会先检查该开关只有为true时才通过sudo -S执行提权验证。emails{}当前版本未使用保留为占位。provider认证方法取值为os使用操作系统用户或users使用自定义用户文件。底层通过AuthenticationService.get_provider()在AuthenticationProvider组件中按id匹配实现见 ajenti-core/aj/auth.py。users_file当使用users认证提供者时指向用户文件的路径默认/etc/ajenti/users.yml。历史说明参数user_config曾用于指定用户配置存储位置现已废弃。由于用户数据已绑定到provideros或users独立指定会造成条目重复因此被移除。值得留意的是Ajenti 2.1.38 之前用户数据直接存放在config.yml的auth.users中升级后会触发自动迁移ensure_structure()检测到auth.users存在时会调用migrate_users_to_own_configfile()将用户数据写入users_file并删除原条目见 ajenti-core/aj/config.py。bind 块监听地址与端口bind: host: 0.0.0.0 mode: tcp port: 8000host监听 IP默认0.0.0.0对所有网卡开放。mode套接字类型tcp或unix。port监听端口默认8000。ssl 块HTTPS 与客户端证书认证ssl: enable: true certificate: /etc/ajenti/mycert.pem fqdn_certificate: /etc/letsencrypt/ajenti.pem force: false client_auth: enable: true force: true certificates: digest: 15:E8:5E:E5:D2:E8:75:0D:53:FF:22:A8:79:28:E5:BE:33:E0:37:07:FB:31:47:4D:61:69:AB:43:F8:5B:23:78 name: CNA,STNA,Osajenti.mydomain.com,CNrootajenti.mydomain.com serial: 352674123960898230347891590646542168839110009016 user: rootenabletrue或false是否启用 HTTPS。官方强烈建议设为true。默认值为false见 ajenti-core/aj/config.py。certificate默认全局证书的完整路径。它有两个用途一是用于生成客户端证书二是当fqdn_certificate未设置时作为 HTTPS 协议使用的证书。PEM 文件必须同时包含证书本身与私钥。fqdn_certificate面向你 FQDN 域名的证书完整路径例如/etc/letsencrypt/ajenti.pem适合 Lets Encrypt 等为域名签发的证书。PEM 文件同样需要包含证书与私钥。force设为true时Ajenti 会在 80 端口启动一个小型监听器将http://hostname重定向到https://hostname:port。该重定向逻辑实现在 ajenti-core/aj/https_redirect.py 中返回 301 状态并将Location指向 HTTPS 目标地址。client_auth客户端证书认证各字段默认值见 ajenti-core/aj/config.pyenabletrue或false是否启用基于客户端证书的认证。force为true时只允许使用客户端证书登录为false时仍允许使用密码认证。在 ajenti-core/aj/auth.py 的client_certificate_callback中force为false时对无法校验的证书直接放行回退到密码登录为true时则必须通过ClientCertificateVerificator的校验。certificates包含用于自动登录的所有客户端证书条目。该列表通常由 Ajenti 设置界面自动填充每条包含四个字段digest证书摘要SHA-256。name证书名称来自证书主题 Subject。serial证书序列号。user该证书对应的用户名。客户端证书的校验流程位于 ajenti-core/aj/security/verifier.pyClientCertificateVerificator.verify()提取请求证书的序列号与 SHA-256 摘要与配置中certificates列表逐条比对命中即返回该条目绑定的用户名随后由认证中间件完成自动登录ajenti-core/aj/auth.py。该实现还会对使用已弃用 SHA1 签名算法的证书输出告警日志提示应吊销并重新签发。email 块密码重置邮件email: enable: true templates: reset_email: /etc/ajenti/email/mytemplate_for_reset_password.htmlenabletrue或false是否启用密码重置功能。启用前必须在/etc/ajenti/smtp.yml中配置 SMTP 凭据否则邮件无法发出。默认值为false见 ajenti-core/aj/config.py。templatesreset_email密码重置邮件的 HTML 模板完整路径。未配置时Ajenti 回退到内置默认模板 ajenti-core/aj/static/emails/reset_email.html该模板支持自定义 Logo 样式与重置链接按钮。模板中的变量由 Jinja2 自动填充。邮件发送实现在 ajenti-core/aj/api/mail.pyMail.get_template()优先读取配置中的模板路径若未配置或文件不存在则回退到DEFAULT_TEMPLATESsend_password_reset()会将BASE64_LOGO配置的 logo 图片转 base64与RESET_LINK注入模板并使用 BeautifulSoup 从 HTML 派生纯文本版本同时发送 HTML 与纯文本两种 MIME 部分。其他全局参数color: blue language: en logo: /srv/dev/ajenti/ajenti-panel/aj/static/images/Logo.png max_sessions: 10 name: ajenti.mydomain.com restricted_user: nobody session_max_time: 1200 trusted_domains: [] trusted_proxies: []colorCSS 主题的次要颜色可选值为default、bluegrey、red、deeporange、orange、green、teal、blue与purple。language所有用户的默认语言默认en。logo自定义 Logo 图片的完整路径默认使用 Ajenti 自带 Logoajenti-core/aj/static/images/Logo.png。注意 ajenti-core/aj/config.py 中的默认值是相对于aj.config模块所在目录拼接的。max_sessions最大同时会话数默认99。达到上限时最旧的未活跃会话会被强制失效。实现见 ajenti-core/aj/gate/middleware.py当会话池大小达到max_sessions时按get_age()排序找出最老的会话并调用deactivate()。name你的域名。restricted_user用于受限功能如登录页的系统用户。这是一个重要的安全参数在受限环境中执行的所有操作都会以该用户的权限进行。默认nobody。在users认证提供者中当用户记录缺少uid时也会回退到该用户对应的 UID见 plugins/auth_users/api.py。session_max_time会话自动登出前的最大有效时间秒默认3600一小时。会话存活判定实现在 ajenti-core/aj/gate/session.pyis_dead()在会话非活跃或get_age() session_max_time时判定会话死亡随后被清理。trusted_domainsAjenti ≥ 2.2.1以逗号分隔的可信域名列表只有这些域名下的请求才被认为是合法的来源。校验 HTTP 头时合法的 Origin 必须是列表中的域名之一且需要写全协议与端口形如http://my.domain.com:8000。该配置同时用于两处关键逻辑CORS 白名单在 ajenti-core/aj/core.py 中设置后 Socket.IO 服务器以trusted_domains作为cors_allowed_origins未设置时仅允许同源。Origin 校验ajenti-core/aj/http.py 的_validate_origin()将请求HTTP_ORIGIN与trusted_domains 当前请求自身来源比对。若设置了该列表列表第一个条目还会被用作密码重置功能的链接基础地址见 ajenti-core/aj/security/pwreset.py避免构造重置链接时依赖不可信的SERVER_NAME。trusted_proxiesAjenti ≥ 2.2.1以逗号分隔的可信代理列表用于在反向代理场景下获取客户端真实 IP。smtp.yml 详解该文件保存用于发送密码重置邮件的 SMTP 中继服务器凭据。邮件后端已在 ajenti-core 中就绪未来也可能用于发送其他通知但目前仅用于密码重置功能。文件结构对应 ajenti-core/aj/config.py 中SmtpConfig类的定义smtp: password: MyVeryStrongStrongPassword port: starttls server: mail.mydomain.com user: mailmydomain.comportstarttls使用 587 端口或ssl使用 465 端口。对应 ajenti-core/aj/api/mail.pyssl走smtplib.SMTP_SSL465starttls走smtplib.SMTPstarttls()587。server邮件服务器主机名如mail.mydomain.com。user用于认证的邮箱账号。password邮箱账号密码。两个值得注意的安全细节见 ajenti-core/aj/config.py以 root 身份加载配置时SmtpConfig.load()会将文件权限强制收紧为0o600且从内存中的配置数据里抹掉密码读取时再按需从文件中取回get_smtp_password()防止凭据经配置接口泄露。save()时若新密码为空会自动沿用旧密码避免设置界面误清空凭据。users.yml 详解Ajenti 提供两种认证方法os或users。使用users时所有用户信息存储在users_file指向的文件中默认/etc/ajenti/users.yml并由 users 插件plugins/auth_users自动填充管理。文件结构对应 ajenti-core/aj/config.py 中AjentiUsers类users: arnaud: email: arnaudmydomain.com fs_root: /home/arnaud password: 73637279707..... permissions: packages:install: false sidebar:view:/view/cron: false uid: 1002password密码的 scrypt 哈希生成方法见下一节。permissions用户的权限列表键为权限 ID形如packages:install、sidebar:view:/view/cron值为true/false。校验时authorize()读取该映射并与权限 ID 比对见 plugins/auth_users/api.py。uid该用户对应的操作系统 UID用于将 worker 进程降权运行见 plugins/auth_users/api.py。fs_root用户的主目录/根目录。email用于密码重置的邮箱地址。check_mail()会遍历所有用户匹配邮箱后返回用户名plugins/auth_users/api.py。加载用户文件时以 root 身份也会将文件权限收紧为0o600ajenti-core/aj/config.py。如何生成密码哈希Ajenti 使用scrypt进行加密与哈希。注意scrypt.encrypt产生的并非传统意义上的哈希值而是一个派生的加密密文derived key其中包含随机盐与派生结果因此每次生成同一密码的结果都不同。官方给出的生成方法如下import scrypt, os bytes scrypt.encrypt(os.urandom(256), password, maxtime1) hex bytes.hex() print(hex)将输出的十六进制字符串填入users.yml的password字段即可。该流程与仓库实现完全一致UsersAuthenticationProvider.hash_password()使用os.urandom(256)生成 256 字节随机盐调用scrypt.encrypt(salt, password, maxtime1)后取.hex()见 plugins/auth_users/api.py校验时则用scrypt.decrypt(bytes.fromhex(user_hash), password, maxtime15)验证plugins/auth_users/api.py。users插件还通过update_password()使用同样的哈希方法在密码重置流程中更新用户密码plugins/auth_users/api.py。密码重置完整链路将上述配置串联起来即可理解 Ajenti 密码重置功能的完整工作流核心实现在 ajenti-core/aj/security/pwreset.py前置条件config.yml中email.enable: true且smtp.yml中配置了有效的 SMTP 凭据。用户请求重置PasswordResetMiddleware拦截/api/master/send_password_reset调用认证提供者的check_mail()校验邮箱是否存在。签发重置令牌从/etc/ajenti/.secret首次运行自动生成权限0o600见 ajenti-core/aj/security/pwreset.py读取密钥用URLSafeTimedSerializer生成包含用户名与邮箱的序列化令牌。构造重置链接若配置了trusted_domains则取第一个条目作为基础地址否则回退到请求自身的SERVER_NAME/SERVER_PORT拼接出{base_url}/view/reset_password/{serial}。发送邮件Mail.send_password_reset()读取模板、注入RESET_LINK与 base64 的 Logo经 SMTP 中继发出。校验与更新check_password_serial校验令牌有效性令牌 15 分钟内有效即max_age900秒update_password解出用户后调用auth_provider.update_password()写入新密码哈希。整个过程可概括为scrypt 哈希存储 → SMTP 中继发信 → 带时效签名的重置链接 → 回调接口完成改密各环节的安全边界文件权限、令牌时效、Origin 校验均已在源码中落实。常见配置示例综合以上说明一个启用 HTTPS 客户端证书 密码重置 自定义用户体系的完整配置示例auth: allow_sudo: true emails: {} provider: users users_file: /etc/ajenti/users.yml bind: host: 0.0.0.0 mode: tcp port: 8000 ssl: enable: true certificate: /etc/ajenti/ajenti.pem force: true client_auth: enable: true force: false certificates: [] email: enable: true templates: reset_email: /etc/ajenti/email/reset_email.html color: bluegrey language: en max_sessions: 99 name: ajenti.mydomain.com restricted_user: nobody session_max_time: 3600 trusted_domains: - http://ajenti.mydomain.com:8000 trusted_proxies: []同时配套的smtp.ymlsmtp: password: MyVeryStrongStrongPassword port: starttls server: mail.mydomain.com user: mailmydomain.com以及users.yml密码字段需按前述 scrypt 方法生成users: arnaud: email: arnaudmydomain.com fs_root: /home/arnaud password: scrypt 十六进制哈希 permissions: packages:install: false sidebar:view:/view/cron: false uid: 1002配置完成后可通过 docs/source/man/run.rst 中的启动方式运行 Ajenti并在 docs/source/man/security.rst 中进一步了解安全加固建议。赞分享后端运维【免费下载链接】ajentiAjenti Core and stock plugins项目地址https://gitcode.com/gh_mirrors/aj/ajenti点击查看免费下载相关推荐House3D与SUNCG数据集构建45k室内场景的完美结合House3D与SUNCG数据集构建45k室内场景的完美结合 House3D是一个基于SUNCG数据集构建的真实且丰富的3D环境它提供了超过45k个室内3Earthly 配置文件完全指南从 ~/.earthly/config.yml 到 earthly config 命令的全局与 Git 配置详解Earthly 配置文件完全指南从 ~/.earthly/config.yml 到 earthly config 命令的全局与 Git 配置详解 EarthlCI/CDDevOps构建工具SwiftGen 配置文件swiftgen.yml完全指南结构、参数与实战SwiftGen 配置文件swiftgen.yml完全指南结构、参数与实战 SwiftGen 通过仓库根目录下的 swiftgen.yml 配置文件统一声开发工具代码生成创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考