Nginx UI安全特性与权限管理

Nginx UI安全特性与权限管理

【免费下载链接】nginx-ui 【免费下载链接】nginx-ui 项目地址: https://gitcode.com/gh_mirrors/ngi/nginx-ui

Nginx UI提供了全面的安全特性和完善的权限管理系统,包括双因素认证(2FA)、WebAuthn与Passkey支持、基于角色的访问控制(RBAC)以及安全审计与日志监控功能。系统采用模块化设计,支持TOTP、Passkey和恢复码等多种认证方式,确保用户登录安全。权限管理系统通过精细的用户角色划分和数据加密存储,为多用户环境提供可靠的访问控制。安全审计功能则通过实时日志分析和事件监控,帮助管理员及时发现和响应安全威胁。

双因素认证(2FA)实现机制

Nginx UI提供了全面的双因素认证(2FA)解决方案,支持基于时间的一次性密码(TOTP)和Passkey两种认证方式,为用户登录提供额外的安全层。该实现遵循行业最佳实践,确保系统安全性和用户体验的平衡。

核心架构设计

Nginx UI的2FA系统采用模块化设计,主要包含以下核心组件:

mermaid

TOTP认证实现

密钥生成与存储

TOTP密钥生成采用RFC 6238标准,使用SHA1算法和30秒时间窗口:

func GenerateTOTP(c *gin.Context) {
    issuer := fmt.Sprintf("Nginx UI %s", settings.NodeSettings.Name)
    otpOpts := totp.GenerateOpts{
        Issuer:      issuer,
        AccountName: u.Name,
        Period:      30, // 30秒时间窗口
        Digits:      otp.DigitsSix, // 6位数字
        Algorithm:   otp.AlgorithmSHA1, // SHA1算法
    }
    otpKey, _ := totp.Generate(otpOpts)
    // 返回密钥和二维码URL
}

生成的TOTP密钥使用AES加密后存储在数据库中:

ciphertext, err := crypto.AesEncrypt([]byte(twoFA.Secret))
_, err = u.Where(u.ID.Eq(cUser.ID)).Update(u.OTPSecret, ciphertext)
验证流程

TOTP验证过程包含严格的错误处理和安全性检查:

func VerifyOTP(user *model.User, otp, recoveryCode string) error {
    if otp != "" {
        // 解密存储的密钥
        decrypted, err := crypto.AesDecrypt(user.OTPSecret)
        if err != nil {
            return err
        }
        // 验证TOTP代码
        if ok := totp.Validate(otp, string(decrypted)); !ok {
            return ErrOTPCode
        }
    } else {
        // 恢复码验证逻辑
        // ...
    }
    return nil
}

恢复码系统

恢复码生成机制

Nginx UI为每个启用2FA的用户生成16个唯一的恢复码,格式为xxxxx-xxxxx

func generateRecoveryCode() string {
    return fmt.Sprintf("%05x-%05x", rand.Intn(0x100000), rand.Intn(0x100000))
}

func generateRecoveryCodes(count int) []*model.RecoveryCode {
    recoveryCodes := make([]*model.RecoveryCode, count)
    for i := 0; i < count; i++ {
        recoveryCodes[i] = &model.RecoveryCode{
            Code: generateRecoveryCode(),
        }
    }
    return recoveryCodes
}
恢复码使用跟踪

系统会跟踪恢复码的使用状态,当所有恢复码都被使用时发出警告:

usedCount := 0
verified := false
for _, code := range user.RecoveryCodes.Codes {
    if code.Code == recoveryCode && code.UsedTime == nil {
        t := time.Now().Unix()
        code.UsedTime = &t
        verified = true
    }
    if code.UsedTime != nil {
        usedCount++
    }
}
if verified && usedCount == len(user.RecoveryCodes.Codes) {
    notification.Warning("All Recovery Codes Have Been Used", 
        "Please generate new recovery codes immediately to prevent lockout.", nil)
}

安全会话管理

会话ID生成与验证

安全会话使用UUID生成唯一的会话标识符,并设置5分钟的有效期:

func SetSecureSessionID(userId uint64) (sessionId string) {
    sessionId = uuid.NewString()
    cache.Set(secureSessionIDCacheKey(sessionId), userId, 5*time.Minute)
    return
}

func VerifySecureSessionID(sessionId string, userId uint64) bool {
    if v, ok := cache.Get(secureSessionIDCacheKey(sessionId)); ok {
        if v.(uint64) == userId {
            return true
        }
    }
    return false
}
缓存键设计

缓存键采用前缀加会话ID的模式,防止键冲突:

func secureSessionIDCacheKey(sessionId string) string {
    return fmt.Sprintf("2fa_secure_session:_%s", sessionId)
}

API端点设计

Nginx UI提供了完整的2FA RESTful API接口:

端点方法功能描述认证要求
/2fa_statusGET获取2FA状态信息
/2fa_secure_session/statusGET检查安全会话状态
/2fa_secure_session/otpPOST通过OTP启动安全会话
/otp_secretGET生成TOTP密钥
/otp_enrollPOST启用TOTP认证
/otp_resetGET重置TOTP设置安全会话
/recovery_codesGET查看恢复码安全会话
/recovery_codes_generateGET生成新恢复码安全会话

错误处理机制

系统定义了详细的错误代码和消息:

错误代码错误消息描述
40304Invalid otp codeTOTP验证码错误
40305Invalid recovery code恢复码错误
40306Legacy recovery code not allowed传统恢复码不允许
50001User not enabled otp as 2fa用户未启用OTP
50002OTP or recovery code empty验证码或恢复码为空

前端集成

前端通过统一的API接口与后端交互,提供流畅的用户体验:

// 2FA状态检查
const status = await twoFA.status()

// 启动安全会话
const session = await twoFA.start_secure_session_by_otp(passcode, recovery_code)

// 生成TOTP密钥
const secret = await otp.generate_secret()

// 启用TOTP
const recoveryCodes = await otp.enroll_otp(secret, passcode)

安全性特性

  1. 密钥加密存储:所有TOTP密钥使用AES加密存储在数据库中
  2. 会话超时:安全会话5分钟自动过期,防止会话劫持
  3. 恢复码保护:恢复码使用JSON AES序列化器加密存储
  4. 使用跟踪:记录恢复码使用时间和次数,提供安全审计
  5. 防暴力攻击:集成IP封禁机制,防止认证暴力尝试

Nginx UI的双因素认证实现不仅提供了强大的安全保障,还确保了良好的用户体验,支持多种认证方式和灵活的恢复机制,是现代Web应用安全认证的典范实现。

WebAuthn与Passkey支持

Nginx UI从v2.0.0-beta.34版本开始全面支持WebAuthn标准和Passkey无密码认证技术,为用户提供了更加安全、便捷的身份验证方式。WebAuthn是一种现代化的Web认证标准,允许用户使用生物识别技术(如指纹、面部识别)、移动设备或FIDO安全密钥进行登录,彻底摆脱传统密码的束缚。

WebAuthn技术架构与实现原理

Nginx UI采用Go语言的go-webauthn库实现WebAuthn协议支持,后端架构基于标准的WebAuthn注册和认证流程:

mermaid

Passkey数据模型与存储结构

Nginx UI使用专门的数据模型来存储Passkey凭证信息:

type Passkey struct {
    Model
    
    Name       string               `json:"name"`
    UserID     uint64               `json:"user_id"`
    RawID      string               `json:"raw_id"`
    Credential *webauthn.Credential `json:"-" gorm:"serializer:json"`
    LastUsedAt int64                `json:"last_used_at" gorm:"default:0"`
}

每个Passkey包含以下关键信息:

  • Name: 用户自定义的Passkey名称,用于识别不同的认证设备
  • UserID: 关联的用户ID,确保凭证与用户绑定
  • RawID: 凭证的唯一标识符
  • Credential: WebAuthn凭证对象,包含公钥和认证器信息
  • LastUsedAt: 最后使用时间戳,用于审计和安全监控

WebAuthn配置要求与安全设置

为确保最高级别的安全性,Nginx UI要求必须通过配置文件手动设置WebAuthn参数,禁止通过Web界面配置:

配置文件示例 (app.ini):

[webauthn]
RPDisplayName = Nginx UI Management
RPID          = your-domain.com
RPOrigins     = https://your-domain.com,https://admin.your-domain.com

配置参数说明:

参数类型必需描述示例值
RPDisplayNamestring依赖方显示名称,在用户注册时显示Nginx UI
RPIDstring依赖方ID,通常使用域名localhostyour-domain.com
RPOrigins[]string允许的源地址列表,支持多个URLhttp://localhost:3002,https://your-domain.com

环境变量配置方式:

export NGINX_UI_WEBAUTHN_RP_DISPLAY_NAME="Nginx UI"
export NGINX_UI_WEBAUTHN_RPID="localhost"
export NGINX_UI_WEBAUTHN_RP_ORIGINS="http://localhost:3002"

Passkey注册与认证流程

1. Passkey注册流程

用户可以通过以下步骤注册新的Passkey:

  1. 进入"设置 > 认证"页面
  2. 点击"添加Passkey"按钮
  3. 输入Passkey名称(如"MacBook Touch ID")
  4. 浏览器弹出WebAuthn对话框
  5. 选择认证方式(指纹、面部识别、安全密钥等)
  6. 完成生物识别验证
  7. 系统保存Passkey凭证
2. Passkey登录流程

mermaid

双因素认证(2FA)集成

Nginx UI的Passkey支持与现有的双因素认证系统完美集成:

自动2FA机制:

  • 当用户使用Passkey登录时,所有后续需要2FA的操作将自动使用Passkey
  • 无需在2FA对话框中手动选择认证方式
  • 系统自动识别并优先使用Passkey进行验证

2FA优先级逻辑: mermaid

安全特性与最佳实践

1. 会话管理安全
  • Passkey会话使用30秒超时机制,防止重放攻击
  • 每个认证请求生成唯一的Session ID
  • 支持多因素认证回退机制
2. 浏览器兼容性要求

由于安全策略限制,Passkey在使用时需注意:

  • HTTPS要求: 生产环境必须使用HTTPS,localhost除外
  • 现代浏览器: 需要支持WebAuthn标准的浏览器
  • 平台认证器: 支持Windows Hello、Touch ID、Face ID等
3. 凭证管理功能

用户可以在认证设置页面:

  • 查看所有已注册的Passkey设备
  • 重命名Passkey以便识别
  • 删除不再使用的Passkey凭证
  • 监控最后使用时间

故障排除与常见问题

配置验证检查

在启用WebAuthn前,系统会验证以下配置:

func Enabled() bool {
    options := settings.WebAuthnSettings
    if options.RPDisplayName == "" || options.RPID == "" || len(options.RPOrigins) == 0 {
        return false
    }
    return true
}
常见错误处理
错误代码错误信息解决方案
50000WebAuthn settings are not configured检查app.ini配置文件中的webauthn章节
-浏览器不支持WebAuthn升级浏览器或使用支持的设备
-非HTTPS环境限制生产环境必须配置SSL证书

性能优化与扩展性

Nginx UI的WebAuthn实现经过优化:

  • 内存缓存: 使用高效的会话缓存机制,减少数据库压力
  • 并发处理: 支持高并发认证请求,适合企业级部署
  • 可扩展性: 架构设计支持未来添加更多认证器类型

通过WebAuthn和Passkey支持,Nginx UI为用户提供了现代化、无密码的安全认证体验,同时保持了与传统认证方式的兼容性,确保平滑的迁移路径和灵活的安全策略配置。

用户权限与角色管理系统

Nginx UI的用户权限与角色管理系统采用了基于角色的访问控制(RBAC)模型,通过精心设计的用户管理架构和安全机制,为多用户环境提供了完善的权限管理解决方案。系统支持用户账户管理、身份验证、双因素认证以及细粒度的权限控制,确保只有授权用户才能访问和操作Nginx配置。

用户模型与数据结构

Nginx UI的用户系统基于GORM ORM框架构建,用户模型定义了完整的用户属性和安全特性:

type User struct {
    Model

    Name          string        `json:"name" cosy:"add:max=20;update:omitempty,max=20;list:fussy;db_unique"`
    Password      string        `json:"-" cosy:"json:password;add:required,max=20;update:omitempty,max=20"`
    Status        bool          `json:"status" gorm:"default:1"`
    OTPSecret     []byte        `json:"-" gorm:"type:blob"`
    RecoveryCodes RecoveryCodes `json:"-" gorm:"serializer:json[aes]"`
    EnabledTwoFA  bool          `json:"enabled_2fa" gorm:"-"`
    Language      string        `json:"language" gorm:"default:en"`
}

用户数据表结构包含以下关键字段:

字段名类型描述约束
iduint64用户唯一标识符主键,自增
namevarchar(20)用户名唯一,最大20字符
passwordtext加密密码bcrypt加密存储
statusboolean用户状态默认启用(true)
otp_secretblobOTP密钥二进制存储
recovery_codestext恢复代码AES加密JSON序列化
languagevarchar(10)用户语言偏好默认

【免费下载链接】nginx-ui 【免费下载链接】nginx-ui 项目地址: https://gitcode.com/gh_mirrors/ngi/nginx-ui

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值