强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

10 - 安全加固

10 - 安全加固

全面掌握 Nextcloud 安全配置:双因素认证、SSO/LDAP 集成、审计日志、加密与访问控制。


10.1 安全架构概述

┌─────────────────────────────────────────────────────────┐
│                   Nextcloud 安全层次                     │
│                                                         │
│  ┌───────────────────────────────────────────────────┐  │
│  │  传输层安全 (TLS/HTTPS)                            │  │
│  ├───────────────────────────────────────────────────┤  │
│  │  Web 应用防火墙 (WAF) + 安全头 (HSTS/CSP/XSS)    │  │
│  ├───────────────────────────────────────────────────┤  │
│  │  身份认证                                         │  │
│  │  ├── 密码认证 + 暴力破解防护                      │  │
│  │  ├── 双因素认证 (TOTP/WebAuthn/SMS)              │  │
│  │  ├── SSO (SAML/OIDC)                             │  │
│  │  └── LDAP/AD 集成                                │  │
│  ├───────────────────────────────────────────────────┤  │
│  │  授权与访问控制                                    │  │
│  │  ├── 用户/群组/角色                               │  │
│  │  ├── 文件权限                                     │  │
│  │  └── IP 白名单/黑名单                             │  │
│  ├───────────────────────────────────────────────────┤  │
│  │  数据安全                                         │  │
│  │  ├── 服务端加密 (SSE)                             │  │
│  │  ├── 端到端加密 (E2EE)                            │  │
│  │  └── 文件版本与回收站                             │  │
│  ├───────────────────────────────────────────────────┤  │
│  │  审计与监控                                       │  │
│  │  ├── 审计日志                                     │  │
│  │  ├── 登录历史                                     │  │
│  │  └── 文件活动日志                                 │  │
│  └───────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────┘

10.2 双因素认证 (2FA)

支持的 2FA 方式

方式应用名称安全等级说明
TOTPtwofactor_totp基于时间的一次性密码 (Google Authenticator)
WebAuthntwofactor_webauthn最高硬件安全密钥 (YubiKey)
通知twofactor_nextcloud_notificationNextcloud App 推送确认
备用码恢复用,一次性使用

安装与配置 TOTP

# 安装 TOTP 应用
sudo -u www-data php /var/www/nextcloud/occ app:install twofactor_totp

用户操作流程:

1. 个人设置 → 安全 → 双因素认证
2. 启用 TOTP
3. 扫描二维码(Google Authenticator / Authy)
4. 输入验证码确认
5. 保存备用恢复码

安装 WebAuthn(硬件密钥)

sudo -u www-data php /var/www/nextcloud/occ app:install twofactor_webauthn
配置流程:
1. 个人设置 → 安全 → WebAuthn
2. 注册新设备
3. 插入 YubiKey / 触摸指纹传感器
4. 命名设备

强制 2FA

# 安装强制 2FA 应用
sudo -u www-data php /var/www/nextcloud/occ app:install twofactor_enforcement

# 设置强制 2FA 的群组
# 管理后台 → 设置 → 安全 → 强制双因素认证

2FA 管理

# 查看用户的 2FA 状态
sudo -u www-data php /var/www/nextcloud/occ twofactorauth:state <username>

# 禁用用户的 2FA(丢失设备时)
sudo -u www-data php /var/www/nextcloud/occ twofactorauth:disable <username>

10.3 LDAP / Active Directory 集成

安装 LDAP 应用

sudo -u www-data php /var/www/nextcloud/occ app:install user_ldap

配置 LDAP 连接

通过命令行配置

# 创建 LDAP 配置
sudo -u www-data php /var/www/nextcloud/occ ldap:create-empty-config

# 配置连接参数
sudo -u www-data php /var/www/nextcloud/occ ldap:set-config s01 ldapHost "ldap.example.com"
sudo -u www-data php /var/www/nextcloud/occ ldap:set-config s01 ldapPort "389"
sudo -u www-data php /var/www/nextcloud/occ ldap:set-config s01 ldapAgentName "cn=admin,dc=example,dc=com"
sudo -u www-data php /var/www/nextcloud/occ ldap:set-config s01 ldapAgentPassword "LDAPPassword"
sudo -u www-data php /var/www/nextcloud/occ ldap:set-config s01 ldapBase "dc=example,dc=com"
sudo -u www-data php /var/www/nextcloud/occ ldap:set-config s01 ldapBaseUsers "ou=users,dc=example,dc=com"
sudo -u www-data php /var/www/nextcloud/occ ldap:set-config s01 ldapBaseGroups "ou=groups,dc=example,dc=com"

# 用户过滤器
sudo -u www-data php /var/www/nextcloud/occ ldap:set-config s01 ldapUserFilter "(&(objectClass=inetOrgPerson))"
sudo -u www-data php /var/www/nextcloud/occ ldap:set-config s01 ldapUserFilterObjectclass "inetOrgPerson"

# 群组过滤器
sudo -u www-data php /var/www/nextcloud/occ ldap:set-config s01 ldapGroupFilter "(&(objectClass=groupOfNames))"
sudo -u www-data php /var/www/nextcloud/occ ldap:set-config s01 ldapGroupFilterObjectclass "groupOfNames"

# 登录属性
sudo -u www-data php /var/www/nextcloud/occ ldap:set-config s01 ldapLoginFilter "(&(objectClass=inetOrgPerson)(|(uid=%uid)(mail=%uid)))"

# 属性映射
sudo -u www-data php /var/www/nextcloud/occ ldap:set-config s01 ldapExpertUsernameAttr "uid"
sudo -u www-data php /var/www/nextcloud/occ ldap:set-config s01 ldapExpertUUIDAttr "entryUUID"
sudo -u www-data php /var/www/nextcloud/occ ldap:set-config s01 ldapEmailAttribute "mail"

# 启用配置
sudo -u www-data php /var/www/nextcloud/occ ldap:set-config s01 ldapConfigurationActive "1"

通过管理界面配置

设置 → 管理 → LDAP/AD 集成

服务器 1:
├── 主机: ldap.example.com
├── 端口: 389
├── DN: cn=admin,dc=example,dc=com
├── 密码: ****
└── 基础 DN: dc=example,dc=com

用户:
├── 对象类: inetOrgPerson
├── 登录过滤器: (|(uid=%uid)(mail=%uid))
└── 用户名属性: uid

群组:
├── 对象类: groupOfNames
└── 群组成员属性: member

测试 LDAP 连接

# 测试 LDAP 配置
sudo -u www-data php /var/www/nextcloud/occ ldap:test-config s01

# 列出 LDAP 用户
sudo -u www-data php /var/www/nextcloud/occ ldap:show-remnants

# 同步用户
sudo -u www-data php /var/www/nextcloud/occ user:sync "OCA\User_LDAP\User_Proxy"

LDAP + LDAPS (SSL)

# 使用 LDAPS(端口 636)
sudo -u www-data php /var/www/nextcloud/occ ldap:set-config s01 ldapPort "636"
sudo -u www-data php /var/www/nextcloud/occ ldap:set-config s01 ldapTLS "1"

# 或者使用 StartTLS(端口 389 + TLS)
sudo -u www-data php /var/www/nextcloud/occ ldap:set-config s01 ldapTLS "1"

10.4 SSO 单点登录

SAML 2.0 集成

# 安装 SAML 应用
sudo -u www-data php /var/www/nextcloud/occ app:install user_saml

配置 SAML

# 设置 SAML 类型为 SAML
sudo -u www-data php /var/www/nextcloud/occ user_saml:update-config \
  --type=1 \
  --general-uid_mapping=uid \
  --general-displayname_mapping=displayName \
  --general-email_mapping=email \
  --idp-entityId="https://idp.example.com/saml/metadata" \
  --idp-singleSignOnService.url="https://idp.example.com/saml/sso" \
  --idp-singleLogoutService.url="https://idp.example.com/saml/slo" \
  --idp-x509cert="MIIDXTCCAkWgAwIBAgIJAL..." \
  --sp-entityId="https://cloud.example.com" \
  --sp-name-id-format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"

或通过管理界面:

设置 → 管理 → SSO & SAML 身份验证

身份提供者 (IdP):
├── 实体 ID: https://idp.example.com/saml/metadata
├── 单点登录 URL: https://idp.example.com/saml/sso
├── 单点登出 URL: https://idp.example.com/saml/slo
└── X.509 证书: (IdP 证书内容)

服务提供者 (SP):
├── 实体 ID: https://cloud.example.com
└── 名称 ID 格式: email

属性映射:
├── 用户名: uid
├── 显示名: displayName
└── 邮箱: email

OpenID Connect (OIDC)

# 安装 OIDC 应用
sudo -u www-data php /var/www/nextcloud/occ app:install user_oidc

配置示例(Keycloak):

// config/config.php
'user_oidc' => array(
    'auto_provision' => true,
    'provider' => array(
        'keycloak' => array(
            'client_id' => 'nextcloud',
            'client_secret' => 'ClientSecretKey',
            'discovery_uri' => 'https://keycloak.example.com/realms/master/.well-known/openid-configuration',
            'scope' => array('openid', 'profile', 'email'),
            'uid_claim' => 'sub',
            'display_name_claim' => 'name',
            'email_claim' => 'email',
        ),
    ),
),

10.5 审计日志

安装审计应用

sudo -u www-data php /var/www/nextcloud/occ app:install admin_audit

审计事件类型

事件类别记录内容
认证登录成功/失败、注销、2FA 验证
文件操作创建、读取、修改、删除、分享
用户管理创建、删除、修改用户
群组管理创建、删除群组、成员变更
管理操作系统配置变更、应用安装/卸载

查看审计日志

# Web 界面
# 设置 → 管理 → 日志

# 命令行
tail -f /var/log/nextcloud/nextcloud.log | grep "admin_audit"

# 查看登录事件
grep "Login" /var/log/nextcloud/nextcloud.log | jq '.'

日志集中管理

// config/config.php - 发送到 syslog
'log_type' => 'syslog',
'syslog_tag' => 'Nextcloud',

使用 rsyslog 转发到集中日志服务器:

# /etc/rsyslog.d/nextcloud.conf
if $programname == 'Nextcloud' then @@logserver.example.com:514

10.6 暴力破解防护

内置防护配置

// config/config.php
// 启用暴力破解防护
'auth.bruteforce.protection.enabled' => true,

// 速率限制
'ratelimit.protection.enabled' => true,

IP 白名单

// config/config.php
// 信任的代理 IP(不做暴力破解检查)
'trusted_proxies' => array(
    '10.0.0.1',       // 反向代理
    '192.168.1.0/24', // 内网
),

手动解封

# 查看被封锁的 IP
sudo -u www-data php /var/www/nextcloud/occ security:bruteforce:attempts

# 解封特定 IP
sudo -u www-data php /var/www/nextcloud/occ security:bruteforce:reset 192.168.1.100

fail2ban 集成

# 安装 fail2ban
sudo apt install -y fail2ban

# 创建 Nextcloud 过滤器
cat << 'EOF' | sudo tee /etc/fail2ban/filter.d/nextcloud.conf
[Definition]
failregex = ^.*Login failed: .*Remote IP: <HOST>.*$
            ^.*\"remoteAddr\":\"<HOST>\".*Trusted domain error.*$
ignoreregex =
EOF

# 配置 jail
cat << 'EOF' | sudo tee /etc/fail2ban/jail.d/nextcloud.conf
[nextcloud]
enabled  = true
port     = http,https
filter   = nextcloud
logpath  = /var/log/nextcloud/nextcloud.log
maxretry = 5
findtime = 300
bantime  = 3600
action   = iptables-multiport[name=nextcloud, port="http,https"]
EOF

sudo systemctl restart fail2ban

10.7 访问控制

IP 白名单访问

// config/config.php
// 限制只能从特定 IP 访问
'allow_local_remote_servers' => true,

通过 Nginx 实现 IP 访问控制:

server {
    # 仅允许内网访问管理后台
    location /index.php/settings/admin {
        allow 10.0.0.0/8;
        allow 192.168.0.0/16;
        deny all;
    }
}

用户会话管理

// config/config.php
// 会话超时(秒)
'session_lifetime' => 60 * 60 * 24,  // 24 小时

// 记住登录 cookie 有效期
'remember_login_cookie_lifetime' => 60 * 60 * 24 * 15,  // 15 天

// 强制注销后销毁所有会话
'inactivity_timeout' => 60 * 30,  // 30 分钟不活动自动注销

设备与活动管理

个人设置 → 安全 → 设备与活动

活动:
├── 2026-05-10 14:30 - Chrome on Windows - 登录
├── 2026-05-10 12:00 - Nextcloud Android - 登录
└── 2026-05-09 09:00 - Desktop Client - 登录

应用密码:
├── My Script (CLI) - 最后使用: 2026-05-10
├── Thunderbird - 最后使用: 2026-05-09
└── [ 撤销全部 ]

10.8 Web 服务器安全配置

Nginx 安全头

# 安全响应头
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "no-referrer" always;
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;
add_header X-Robots-Tag "noindex, nofollow" always;

# CSP (Content Security Policy)
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; font-src 'self' data:; connect-src 'self' wss:; frame-ancestors 'self';" always;

隐藏版本信息

# 隐藏 Nginx 版本
server_tokens off;

# 隐藏 PHP 版本
# php.ini 中设置:
# expose_php = Off

10.9 安全扫描

内置安全扫描

# 运行安全检查
sudo -u www-data php /var/www/nextcloud/occ security:checks

Nextcloud Security Scan

访问 scan.nextcloud.com 输入域名进行在线安全扫描。

安全加固检查清单

# 1. 检查所有安全头
curl -I https://cloud.example.com | grep -E "Strict-Transport|X-Content-Type|X-Frame|X-XSS"

# 2. 检查 SSL 配置
nmap --script ssl-enum-ciphers -p 443 cloud.example.com

# 3. 检查敏感文件是否可访问
curl -s -o /dev/null -w "%{http_code}" https://cloud.example.com/config/config.php
curl -s -o /dev/null -w "%{http_code}" https://cloud.example.com/data/nextcloud.log
# 应返回 403 或 404

# 4. 检查 PHP 信息泄露
curl -s -o /dev/null -w "%{http_code}" https://cloud.example.com/index.php?mode=phpinfo
# 应返回 404

10.10 注意事项

  1. 2FA 备用码: 启用 2FA 后务必保存备用恢复码,否则设备丢失将无法登录
  2. LDAP 同步: 定期运行 LDAP 同步以更新用户和群组信息
  3. 审计日志: 审计日志会占用较多磁盘空间,配置合理的日志轮转策略
  4. fail2ban: 确保 fail2ban 不会误封合法用户的 IP
  5. SSO 可用性: SSO 服务器宕机时,用户无法登录,建议配置备用认证方式
  6. 密码策略: 通过管理后台设置合理的密码策略(长度、复杂度、过期)

10.11 扩展阅读


上一章: 09 - 在线协作 下一章: 11 - 性能优化 — Redis 缓存、PHP OPcache、数据库调优与 CDN。