SharePoint Online Security Audit Guide with PowerShell

Ce guide fournit des conseils sur la réalisation d'audits de sécurité dans SharePoint Online à l'aide de PowerShell pour garantir la protection des données.

blog sharepoint-online-security-audits-powershell Thu May 01 2025 02:00:00 GMT+0200 (heure d’été d’Europe centrale) zh techsecuritysharepoint 安全审计PowerShellSharePoint Online网络安全

SharePoint Online Security Audit Guide with PowerShell

Ce guide fournit des conseils sur la réalisation d'audits de sécurité dans SharePoint Online à l'aide de PowerShell pour garantir la protection des données.

Thu May 01 2025
4935 字 · 23 分钟

安全考虑和 M365 攻击统计

概述

本页面介绍了与保护数据和网络安全事件相关的安全问题和脆弱性统计数据,这些数据与法国及全球相关。

法国安全背景

  • 2022 年,法国向 ANSSI 报告了 832 起重大安全事件
  • 73% 的法国企业遭遇至少一次网络攻击
  • 勒索软件攻击比 2021 年增加了 255%

全球统计

以下是 2022 年发生的网络安全事件的具体示例:

  • 数据泄露的平均成本:4.35M 美元(例如:影响 980 万客户的 Optus 大规模泄露)
  • 83% 的组织经历了多次泄露(例如:Twitter, Uber 和 Rockstar Games 同年被黑客攻击)
  • 网络钓鱼仍是主要攻击手段(36% 的违规):
    • 例如:针对 10,000 名 Microsoft 员工的活动
    • 例如:通过针对员工的攻击导致 LastPass 被入侵
    • 例如:通过身份盗窃对 Accenture 盗取 2300 万美元

被利用的漏洞

2022 年的重大事件利用了这些漏洞:

  • 身份验证弱点(22%):

    • 绕过 MFA
    • 会话劫持
    • 凭证泄露
  • 应用程序漏洞(31%):

    • SQL 注入
    • XSS(跨站脚本)
    • IDOR(不安全的直接对象引用)
  • 配置错误(28%):

    • 配置错误的云访问
    • 暴露的 API
    • 开放的数据库
  • 社会工程(19%):

    • 针对特定目标的网络钓鱼
    • 身份冒充
    • 企业电子邮件被入侵

漏洞趋势

  • 零日漏洞利用增加了 40%(2022 年)
  • 供应链攻击增加了 300%
  • 云配置错误占违规的 15%

推荐的安全措施

  • 定期进行安全审计
  • 员工安全培训
  • 事件响应计划
  • 持续监控
  • 漏洞管理计划

关键安全要求

一般要求

数据安全是一个关键问题,涉及多个维度:

基本要求

  • 保护敏感信息的机密性
  • 存储数据的完整性
  • 服务的可用性
  • 访问的可追溯性
  • 合规性

常见问题

  • 攻击向量的增加
  • 系统复杂性的增加
  • 威胁的快速演变
  • 资源有限
  • 用户培训

识别的风险

  • 账户被攻陷
  • 数据泄露
  • 服务中断
  • 不合规
  • 声誉受到损害

实施的解决方案

  • 严格的访问控制
  • 系统性加密
  • 持续监控
  • 定期审计
  • 文档化的程序

这些组件之间的相互作用需要一种全面和协调的安全方法,如下图所示。

Diagram 1 : PnP PowerShell Overview

Diagram 1 : PnP PowerShell Overview

Diagram 1 : PnP PowerShell Overview

Diagram 1 : PnP PowerShell Overview

数据加密

  • 端到端加密

    • 用于通信的 TLS 1.3 * 情况:传输中数据拦截 * 解决方案:在所有终端实施 TLS 1.3 * 结果:防止 MITM 攻击

    • 使用 S/MIME 加密电子邮件 * 情况:通过电子邮件泄露机密数据 * 解决方案:部署 S/MIME 证书 * 结果:端到端加密的电子邮件

    • 远程访问的 VPN * 情况:网络外不安全连接 * 解决方案:始终打开的 VPN + 强身份验证 * 结果:远程工作的加密隧道

  • 数据静态保护

    • 数据库的 AES-256 加密 * 情况:数据库被盗 * 解决方案:使用 AES-256 的透明加密---

结果: 数据在没有密钥的情况下无法读取

  • BitLocker 用于计算机

    • 情况: 笔记本电脑被盗
    • 解决方案: 强制启用 BitLocker
    • 结果: 保护抵御物理访问
  • Azure 存储服务加密

    • 情况: 不安全的云存储
    • 解决方案: 自动静态加密
    • 结果: 云数据始终加密
  • 密钥的安全管理

    • 定期轮换密钥

      • 情况: 旧密钥被泄露
      • 解决方案: 每90天自动轮换
      • 结果: 泄露的影响有限
    • 存储在 Azure Key Vault

      • 情况: 密钥不安全存储
      • 解决方案: 在 Key Vault HSM 中集中管理
      • 结果: 对秘密的访问受到控制
    • 有文档的恢复流程

      • 情况: 访问加密数据的权限丢失
      • 解决方案: 正式的恢复程序
      • 结果: 确保业务连续性

访问控制

多因素身份验证 (MFA)

多因素身份验证通过要求额外的身份验证证明(例如:短信代码,移动应用程序)来为安全性增加了一层防护。

显露的问题:

  • 仅凭密码容易受到网络钓鱼和盗窃的影响。
  • 暴力攻击或数据泄露可能危及关键账户。

解决方案:

  • 为所有管理帐户和敏感用户启用 MFA。
  • 使用身份验证应用程序(Microsoft Authenticator,Google Authenticator)或 FIDO2 密钥。

具体实例:

  • 强制使用 MFA 访问 SharePoint Online 管理门户。
  • 自动阻止无 MFA 的特权账户连接。

基于角色的访问控制 (RBAC)

基于角色的访问控制允许根据用户的角色分配权限,从而将对资源的访问限制在严格必要的范围内。

显露的问题:

  • 过度或错误分配的权限增加了泄露或未经授权修改的风险。
  • 在复杂环境中审核个别访问的难度。

解决方案:

  • 定义明确的角色(例如:只读、贡献者、管理员)。
  • 应用最小权限原则并定期审核分配。

具体实例:

  • 将“只读”角色分配给外部用户。
  • 使用 Microsoft 365 组管理 SharePoint 网站的访问。

定期访问审查

定期的访问审查能够检测和纠正过时或不当的权限。

显露的问题:

  • 休眠账户或前员工仍保持访问权限。
  • 在岗位或项目变更后未撤销权限。

解决方案:

  • 进行季度或半年一次的重新认证活动。
  • 自动生成访问报告并分析异常情况。

具体实例:

  • 按季度列出所有访问敏感数据的账户的报告。
  • 自动工作流验证或撤销人事变动时的访问权限。

合规性

GDPR 合规性

通用数据保护条例对个人数据处理施加了严格的规定。

显露的问题:

  • 数据使用透明度不足
  • 缺乏处理的法律基础
  • 过度保留个人数据

GDPR 合规解决方案:

  • 记录处理的操作日志

  • 权利管理程序:

    • 自助服务门户用于请求获取/更正访问
    • 自动化验证工作流
    • 记录请求和操作的日志
  • 自动化的保留政策:

    • 根据数据类型划分保留标签
    • 到期后自动清除
    • 删除审计

NIS2 指令

NIS2 指令增强关键基础设施的网络安全。

显露的问题:

  • 关键系统的脆弱性

    • 描述: 重要基础设施的弱点
    • 细节: 过时的架构、未修补的组件、默认配置
    • 具体情况: 通过未修复的漏洞攻击工业 SCADA 系统
  • 缺乏事件响应计划

    • 描述: 非正式的紧急程序
    • 细节: 角色未定义、沟通渠道模糊、行动未优先考虑
    • 具体情况: 因缺乏程序导致的勒索软件攻击后48小时瘫痪
  • 缺乏持续监控

    • 描述: 关键系统的监控不足
    • 细节: 缺乏集中日志、未配置警报、未探测到异常
    • 具体情况: 由于缺乏监视,入侵在事后3个月才被检测到

解决方案:

  • 24/7 监控系统

    • 描述: 持续监控,配备待命团队
    • 细节: 已部署 SIEM,外包 SOC,定义关键指标
    • 具体情况: 检测并自动阻止入侵尝试
  • 有文档的升级程序

    • 描述: 正式的事故升级流程
    • 细节: 联系矩阵、严重程度水平、响应时间
    • 具体情况: 通过快速升级在 2 小时内解决的重大事件
  • 定期恢复测试

    • 描述: 计划的业务恢复演习
    • 细节: 记录场景、恢复时间测量、经验反馈
    • 具体情况: 每季度测试关键系统的完整恢复

数据保护法

法国第 78-17 号法于1978年1月6日制定,旨在为个人数据保护设定法律框架。

主要目标:

  • 保护个人的权利和自由

  • 对个人数据处理进行规范---

  • 处理责任人的义务的规范

  • 数据安全的保证

信息系统中的问题:

  • 客户数据库的安全性
  • 对敏感数据访问的可追溯性
  • 企业应用程序的合规性
  • 防止数据泄露

组织影响:

  • 指定数据保护官(DPO)
  • 培训团队关于数据保护的知识
  • 更新内部流程
  • 记录数据处理

所需的技术措施:

  • 敏感数据的加密
  • 细粒度访问控制
  • 行为日志记录
  • 安全备份程序

不合规的制裁:

  • 罚款可达2000万欧元或公司营业额的4%
  • 由国家数据保护委员会(CNIL)发出的警告
  • 可能的刑事责任
  • 重大声誉影响

暴露的问题:

  • 不遵守访问权

    • 描述:缺乏处理GDPR请求的程序
    • 影响:罚款风险高达公司营业额的4%(GDPR第83条)
    • 示例:2019年,SERGIC因不遵守权利被CNIL罚款40万欧元
  • 用户信息不足

    • 描述:数据处理的法律信息不完整
    • 影响:违反GDPR第13条
    • 示例:2019年,谷歌因缺乏透明度被罚款5000万欧元
  • 数据无限期保存

    • 描述:缺乏规定的保留政策
    • 影响:违反GDPR第5(1)(e)条
    • 示例:2021年,CNIL对联合国儿童基金会(UNICEF)因过度保存发出警告

解决方案:

  • 自动化访问请求流程

    • 行动:实施符合GDPR的自助门户
    • 时限:最多30天内回复(GDPR第12条)
    • 验证:处理请求的审计日志
  • 完整的法律信息

    • 行动:发布详尽的隐私政策
    • 内容:处理列表、法律依据、接收者
    • 参考:CNIL关于透明度义务的指南
  • 过时数据的自动清除

    • 行动:配置M365的保留政策
    • 时长:保留期限制在法律要求的时间内
    • 控制:每月自动删除报告

M365中的风险分析和解决方案

概述

要理解风险结构及其相关解决方案,我们来看下面的图表,展示了不同安全组件之间的互动:

Diagram 1 : PnP PowerShell Overview

Diagram 1 : PnP PowerShell Overview

组件展示

上面的图表展示了三个主要风险类别:

  1. 访问风险 - 与权限和认证相关
  2. 数据风险 - 关于信息的保护
  3. 合规风险 - 与监管义务相关

实施的解决方案

针对每个风险类别,实施了特定的解决方案:

自动化访问控制

  • MFA认证

    • 配置: 通过条件访问强制实施MFA
    • 示例: 阻止没有第二因素的连接
    • 指标: 账户妥协减少99%
  • 特权访问管理(PAM)---

配置:按需访问通过 PIM

  • 示例:临时提升维护
  • 指标:永久管理员账户减少 60%

零信任网络访问

  • 配置:通过 Azure AD 始终验证
  • 示例:持续验证连接上下文
  • 指标:检测到 95% 异常行为

数据保护措施

  • 数据丢失防护 (DLP)

    • 配置:M365 策略针对敏感数据
    • 示例:通过电子邮件阻止发送 IBAN
    • 指标:意外泄露减少 85%
  • 自动分类

    • 配置:自动应用的敏感性标签
    • 示例:RGPD 数据自动标记
    • 指标:90% 文档正确分类
  • 加密

    • 配置:始终加密数据库
    • 示例:SQL 上的 TDE,终端上的 BitLocker
    • 指标:100% 敏感数据已加密

记录治理过程

  • 持续审计

    • 配置:日志分析工作区
    • 示例:实时 Power BI 仪表板
    • 指标:在 15 分钟内检测到异常
  • 自动报告

    • 配置:定期 PowerShell 脚本
    • 示例:外部访问的每周报告
    • 指标:对风险的可见性达 95%
  • 定期合规性

    • 配置:Microsoft Purview 合规门户
    • 示例:RGPD/NIS2 自动化控制
    • 指标:合规性得分 > 85%

交互与依赖

该图展示了日常 IT 场景中的相互依赖关系:

控件交互

使用案例 #1:检测可疑访问

使用案例 #2:保护敏感数据

使用案例 #3:安全审计

相互加强

案例 #1:防止泄露

案例 #2:合规性

案例 #3:风险管理

常见审计场景

权限审计

定期权限审计是一个关键的合规要求。

  • 确保与 RGPD 和其他标准(SOX、NIS2)的合规性
  • 防止数据泄露和未授权访问
  • 维护最小权限原则
  • 检测闲置或过时的账户

与权限相关的事故案例

事件 1:通过过度权限泄露数据

  • 背景:CAC40 公司,2022 年
  • 影响:10 万个客户档案泄露
  • 原因:未审计的级联权限
  • 解决方案:实施了季度访问审查

事件 2:未撤销的访问

  • 背景:金融机构,2021 年
  • 影响:前员工的欺诈性访问
  • 原因:离职后账户仍然激活 6 个月
  • 解决方案:自动化撤销流程

控制指标

  • 每月审查特权账户
  • 每季度全面审计权限
  • 每周报告访问变更
  • 实时特权提升警报

重新认证报告

定期审核(建议每季度进行)需要:

  • 安全风险分析:

    • 确定特权访问
    • 检测风险账户
    • 评估过度权限
    • 审查外部访问
  • 敏感数据评估:

    • 保密文件分类
    • 个人数据映射(RGPD)
    • 加密验证
    • 保留控制
  • 商业风险分析:

    • 对业务连续性的影响
    • 战略数据的暴露
    • 合规性风险
    • 声誉风险
  • 记录的纠正措施:

    • 撤销无正当理由的访问
    • 更新安全政策
    • 存档或删除内容
    • 用户培训

SharePoint 安全审计工具

推荐的 Microsoft 解决方案

  1. Microsoft Defender for Cloud Apps

    • 检测异常行为
    • 实时风险分析
    • 针对可疑活动的警报
  2. Microsoft Sentinel

    • 自动化工作流程
    • 安全仪表板
    • 事件关联
  3. Entra ID Protection

    • 威胁检测
    • 风险政策
    • 自动修复
  4. Microsoft Purview 安全门户

    • 原生审计
    • 合规报告
    • 安全警报
  5. SharePoint 管理中心

    • 访问报告
    • 使用分析
    • 网站管理

兼容的第三方工具

PLAINTEXT
- AvePoint DocAve
- Sharegate
- Quest Security Explorer
- ManageEngine SharePoint Manager
- Netwrix Auditor

我们推荐的替代性脚本示例

这些报告使团队能:

  • 验证访问的合法性
  • 识别权限异常---

治理决策的文档化
维护合规性审计跟踪

推荐的自动化报告

  • 权限变更周报

  • 外部访问月报

  • 合规性季度仪表板

  • 关键变更实时警报

    POWERSHELL
    # 简化的权限审计
    Get-BasicPermissionReport.ps1
    Get-ExternalUserAccess.ps1
    Get-GroupMembershipAudit.ps1
    Get-UniquePermissionItems.ps1
    Get-SiteCollectionAdmins.ps1
    
    # 安全报告
    Get-SecurityAuditReport.ps1
    Get-ComplianceStatus.ps1
    Get-SharingLinks.ps1
    
    # 持续监控
    Start-PermissionMonitoring.ps1
    Start-SecurityAlerts.ps1
    Start-AuditLogging.ps1
    POWERSHELL
    # 重新认证的完整权限报告
    function Get-PermissionAuditReport {
        $report = @()
        
        # 站点分析
        Get-PnPTenantSite | ForEach-Object {
            Connect-PnPOnline -Url $_.Url -Interactive
            
            # 直接权限
            $webPerms = Get-PnPWeb -Includes RoleAssignments | 
                Select-Object -ExpandProperty RoleAssignments |
                Select-Object @{N='Scope';E={'站点'}}, 
                            @{N='Principal';E={$_.Member.Title}},
                            @{N='Permission';E={$_.RoleDefinitionBindings.Name}}
            
            # 列表权限
            $listPerms = Get-PnPList | Where-Object {$_.HasUniqueRoleAssignments} | ForEach-Object {
                Get-PnPListPermissions -Identity $_.Title | 
                Select-Object @{N='Scope';E={$_.Title}},
                            @{N='Principal';E={$_.PrincipalName}},
                            @{N='Permission';E={$_.PermissionLevels}}
            }
            
            $report += $webPerms + $listPerms
        }
        
        return $report | Export-Csv "PermissionAudit_$(Get-Date -Format 'yyyyMMdd').csv"
    }
Entra ID 特权账户审计
PLAINTEXT
```powershell
# 特权管理角色审计
Connect-MgGraph -Scopes "RoleManagement.Read.Directory","Directory.Read.All"

# 关键角色的账户列表
$roles = @(
    "全局管理员",
    "安全管理员", 
    "交换管理员",
    "SharePoint管理员"
)

foreach($role in $roles) {
    Get-MgDirectoryRole -Filter "displayName eq '$role'" | ForEach-Object {
        Get-MgDirectoryRoleMember -DirectoryRoleId $_.Id
    }
}

# PIM 特权提升监控
Get-MgAuditLogDirectoryActivity -Filter "activityDisplayName eq 'Add member to role completed (PIM activation)'"

# 角色变更警报
Get-MgAuditLogDirectoryActivity -Filter "category eq 'RoleManagement'" |
    Where-Object {$_.ActivityDateTime -gt (Get-Date).AddDays(-1)}
```


监控脚本
```powershell
# 关键访问警报
$criticalAlert = @{
    Operation = "Add member to role"
    RoleName = "Global Administrator"
    AlertRecipient = "security@contoso.com"
}

# 通知功能
function Send-SecurityAlert {
    param($event)
    $body = @{
        title = "安全警报: 关键角色变更"
        text = "详情: $($event.ActivityDateTime) - $($event.ActivityDisplayName)"
    }
    Send-MgGraphRequest -Uri "webhook_url" -Body $body
}

# 持续监控
while($true) {
    Get-MgAuditLogDirectoryActivity -Filter "activityDisplayName eq '$($criticalAlert.Operation)'" |
        Where-Object {$_.TargetResources.displayName -eq $criticalAlert.RoleName} |
        ForEach-Object { Send-SecurityAlert $_ }
    Start-Sleep -Seconds 300
}
```
敏感邮件监控

Exchange Online 监控配置

POWERSHELL
# 启用邮件审计
Set-AdminAuditLogConfig -UnifiedAuditLogIngestionEnabled $true

# 创建敏感数据传输规则
New-TransportRule -Name "敏感数据警报" `
    -SubjectOrBodyContainsWords @("机密","秘密","IBAN","SSN") `
    -SentTo "*@external.com" `
    -GenerateIncidentReport "security@contoso.com" `
    -IncidentReportContent All `
    -SetAuditSeverity High

# 实时监控数据传输
$sensitiveTypes = @(
    "信用卡号",
    "欧盟借记卡号", 
    "IBAN",
    "法国社会保障号码"
)

foreach($type in $sensitiveTypes) {
    New-DlpSensitiveInformationType -Name $type -Locale "fr-FR"
}

# 持续监控脚本
while($true) {
    $logs = Search-UnifiedAuditLog -StartDate (Get-Date).AddMinutes(-5) `
        -RecordType ExchangeItem `
        -Operations "Send" `
        -ResultSize 5000

    $logs | Where-Object {$_.AuditData -match "SensitiveInfoDetected"} |
        ForEach-Object {
            $data = $_.AuditData | ConvertFrom-Json
            Send-MailMessage -To "alerts@contoso.com" `
                -Subject "警报: 检测到敏感数据" `
                -Body "发件人: $($data.SenderId)$($data.RecipientAddress)"
        }
    Start-Sleep -Seconds 300
}

推荐的监控工具:

  • Microsoft Defender for Office 365

    • 高级威胁检测
    • 针对目标钓鱼的保护
    • 自动隔离
  • Azure 信息保护扫描器

    • 自动分类
    • 敏感内容标记
    • 传输保护
  • Exchange Online 保护

    • 邮件过滤
    • 垃圾邮件策略
    • 自定义传输规则

监督报告

POWERSHELL
# 敏感邮件的每日报告
function Get-SensitiveMailReport {
    $report = @()
    $startDate = (Get-Date).AddDays(-1)
    
    $logs = Search-UnifiedAuditLog -StartDate $startDate `
        -RecordType ExchangeItem `
        -Operations "Send" 
        
    foreach($log in $logs) {
        $data = $log.AuditData | ConvertFrom-Json
        if($data.DataClassifications) {
            $report += [PSCustomObject]@{
                Sender = $data.SenderId
                Recipient = $data.RecipientAddress
                SensitiveData = $data.DataClassifications
                Timestamp = $data.CreationTime
            }
        }
    }
    
    return $report | Export-Csv "SensitiveMail_$(Get-Date -Format 'yyyyMMdd').csv"
}
```---

##### 外部用户审计

```powershell
# 先决条件:
# - 安装ExchangeOnlineManagement模块: Install-Module -Name ExchangeOnlineManagement
# - 安装Microsoft.Graph模块: Install-Module Microsoft.Graph
# - 必需角色: 全局读取者或用户管理员
Connect-ExchangeOnline
Connect-MgGraph -Scopes "User.Read.All","Directory.Read.All"

# 有访问权限的外部用户列表
Get-PnPUser | Where-Object {$_.LoginName -like "*ext*"} | 
    Select-Object Title,Email,LoginName | 
    Export-Csv "UsersExternes.csv"

# AAD邀请用户列表
Get-MgUser -Filter "userType eq 'Guest'" | 
    Select-Object DisplayName,Mail,UserPrincipalName |
    Export-Csv "InvitesAAD.csv"

# Exchange外部共享列表
Get-ExternalInOutlook | 
    Select-Object Identity,DisplayName,EmailAddress |
    Export-Csv "PartageMail.csv"

Disconnect-ExchangeOnline
Disconnect-MgGraph

报告给安全和合规团队

直接权限
POWERSHELL
# 检测唯一权限
$web = Get-PnPWeb
Get-PnPList | Where-Object {$_.HasUniqueRoleAssignments} | ForEach-Object {
    Get-PnPListPermissions -Identity $_.Title
}

报告给网站所有者和SharePoint管理员

继承权限与唯一权限
POWERSHELL
# 识别具有唯一权限的项目
Get-PnPList | ForEach-Object {
    $list = $_
    Get-PnPListItem -List $list.Title -PageSize 500 | 
        Where-Object {$_.HasUniqueRoleAssignments}
}

报告给SharePoint管理员进行治理

访问矩阵
POWERSHELL
# 生成用户/权限矩阵
Get-PnPWeb -Includes RoleAssignments | ForEach-Object {
    $_.RoleAssignments | Select-Object Member,RoleDefinitionBindings
}

报告给审计人员和合规团队

参考资料

官方安全报告

2022年ANSSI年度报告

2022年IBM数据泄露成本报告

2022年DBIR Verizon报告


Thanks for reading!

SharePoint Online Security Audit Guide with PowerShell

Thu May 01 2025
4935 字 · 23 分钟