适用于 SharePoint Server 的 GDPR

应用于:

  • SharePoint Server 2013
  • SharePoint Server 2016
  • SharePoint Server 2019
  • SharePoint Server 订阅版

作为保护个人信息的一部分,我们建议如下:

用户生成的内容

对于 SharePoint Server 站点和库中包含的用户生成的内容,建议使用以下基本方法:

对于文件共享和 SharePoint 站点和库,推荐的方法包括下列步骤:

  1. 安装并配置 Azure 信息保护扫描程序。

    • 决定要使用的敏感数据类型。

    • 指定要使用的 SharePoint 站点。

  2. 完成发现周期。

    • 以发现模式运行扫描程序并验证查找结果。

    • 如果需要,优化条件和敏感信息类型。

    • 评估自动应用标签的预期影响。

  3. 运行 Azure 信息保护扫描程序以便标记合格文档

  4. 对于保护:

    a. 配置 Exchange 数据丢失防护规则以保护具有所需标签的文档。

    b. 确保有权限制谁可以访问文件。

    c. 对于 SharePoint,请对库使用 IRM 保护。

  5. 要进行监控,请使用 SIEM 工具集成 Windows Server 日志。

    a. 若要查找数据主体请求的个人数据,请使用搜索中心或电子数据展示。

将标签应用于敏感数据时,请务必使用未配置保护的标签。 保护包括加密,可防止服务检测文件中的敏感数据。

有关使用 Azure 信息保护 扫描程序查找和标记个人数据的详细信息,请参阅 Microsoft GDPR 数据发现工具包 (https://aka.ms/gdprpartners) 。

有关为条件配置扫描程序以及使用Microsoft Purview 数据丢失防护 (DLP) 敏感信息类型的信息,请参阅如何为 Azure 信息保护配置自动分类和建议分类的条件。 请注意,新的Office 365敏感信息类型不会立即可用于扫描程序,并且自定义敏感信息类型不能与扫描程序一起使用。

从 Office 文件中删除个人信息

必须手动删除存储在 SharePoint 文档库中的 Office 文件中 (Word文档) 中的元数据或注释等个人信息。 请按照下列步骤操作:

  1. 将文档副本从 SharePoint Server 中下载到本地磁盘。

  2. 从 SharePoint 文档库中删除文档。

  3. 按照通过检查文档删除隐藏数据和个人信息中的步骤操作。

  4. 将文档上传到 SharePoint 文档库。

遥测和日志文件

ULS 日志

SharePoint Server 中的统一日志记录服务 (ULS) 和使用情况日志记录可跟踪各种系统功能,并且可以包含用户信息。 ULS 日志和使用情况日志是文本文件,可以使用各种搜索工具进行搜索。 Merge-SPLogFile PowerShell cmdlet 提供了一种从场中多个服务器上的 ULS 日志返回记录的方法。

请考虑将日志保留策略设置为业务目的所需的最小值。 有关在 SharePoint Server 中配置日志记录的信息,请参阅 在 SharePoint Server 中配置诊断日志记录

请注意,部分系统事件也记录在 Windows 事件日志中。

使用情况数据库

sharePoint Server Usage 数据库 (默认名称WSS_Logging) 包含 ULS 日志中的信息子集。 此数据库中数据的最大保留期为 30 天。 建议在业务需求允许的最短持续时间内对其进行配置。 有关详细信息,请参阅 在 SharePoint Server 中配置诊断日志记录

搜索查询历史记录和使用情况记录包含对用户名的引用。

查询历史记录和收藏的查询

在 SharePoint Server 中,查询历史记录和“收藏夹”查询在 365 天后自动过期。 如果用户离开组织,可以使用以下步骤从查询历史记录中删除对用户名的引用。

下列 SQL 查询适用于 SharePoint Server,并且可以:

  • 导出用户的查询历史记录或收藏的查询

  • 删除查询历史记录中对用户名的引用

注意

通常不支持将存储过程添加到 SharePoint Server 数据库。 Microsoft 将对此策略提出例外,以支持向 SharePoint Server 数据库添加和执行本文中所述的存储过程。

导出自特定日期以来的用户查询

使用以下过程从链接存储查询日志表导出查询,该表由 @UserName 自 执行 @StartTime。

[In dbo].[LinkStore_<ID>]:
CREATE PROCEDURE proc_MSS_GetQueryTermsForUser 
( 
    @UserName nvarchar(256), 
    @StartTime datetime 
) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SELECT searchTime, queryString 
    FROM 
        dbo.MSSQLogPageImpressionQuery 
    WITH 
        (NOLOCK) 
    WHERE 
        userName = @UserName AND 
        searchTime > @StartTime 
END 
GO 

导出用户过去 100 天的查询

DECLARE @FROMDATE datetime 
SET @FROMDATE = DATEADD(day, -100, GETUTCDATE()) 
EXECUTE proc_MSS_GetQueryTermsForUser '0#.w|domain\username', @FROMDATE 

导出用户收藏的查询

使用以下过程从 搜索管理员 DB 个人结果表中导出用户喜欢的查询,自 以来<DateTime>由 @UserName执行。

In [dbo].[Search_<ID>]:
CREATE PROCEDURE proc_MSS_GetPersonalFavoriteQueries 
( 
    @UserName nvarchar(256), 
    @SearchTime datetime 
) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SELECT max(queries.SearchTime) as SearchTime, 
           max(queries.querystring) as queryString, 
           max(url.url) as URL 
    FROM MSSQLogOwner owners WITH(NOLOCK) 
    JOIN MSSQLogPersonalResults results WITH(NOLOCK) on owners.OwnerId = results.OwnerId 
    JOIN MSSQLogUrl url WITH(NOLOCK) on results.ClickedUrlId = url.urlId 
    JOIN MSSQLogPersonalQueries queries WITH(NOLOCK) on results.OwnerId = queries.OwnerId 
    WHERE queries.SearchTime > @SearchTime 
        AND queries.UserName = @UserName 
        GROUP BY queries.QueryString,url.url 
END 
GO 

导出用户过去 100 天收藏的查询

DECLARE @FROMDATE datetime 
SET @FROMDATE = DATEADD(day, -100, GETUTCDATE()) 
EXECUTE proc_MSS_GetPersonalFavoriteQueries '0#.w|domain\username', @FROMDATE 

删除超过 X 天的用户名引用

使用以下过程从链接存储查询日志表中删除 对超过 旧的所有用户名 @Days 的引用。 该过程仅向后删除引用,直到到达 @LastCleanupTime。

In [dbo].[LinksStore_<ID>]:  
CREATE PROCEDURE proc_MSS_QLog_Cleanup_Users 
( 
    @LastCleanupTime datetime, 
    @Days int 
) 
AS 
BEGIN 
    DECLARE @TooOld datetime 
    SET @TooOld = DATEADD(day, -@Days, GETUTCDATE()) 
    DECLARE @FromLast datetime 
    SET @FromLast = DATEADD(day, -@Days, @LastCleanupTime) 
    BEGIN TRANSACTION 
         UPDATE MSSQLogPageImpressionQuery 
    SET userName = 'NA' 
    WHERE @FromLast <= searchTime AND searchTime < @TooOld 
    UPDATE MSSQLogO14PageClick 
    SET userName = 'NA' 
    WHERE @FromLast <= searchTime AND searchTime < @TooOld 
    COMMIT TRANSACTION 
END 
GO 

删除超过 X 天的特定用户名引用

使用以下过程从链接存储查询日志表中删除对 特定 用户名的引用,其中引用已超过 @Days 旧。 该过程仅向后删除引用,直到到达 @LastCleanupTime。

In [dbo].[LinksStore_<ID>]:
CREATE PROCEDURE proc_MSS_QLog_Cleanup_Users 
( 
    @UserName nvarchar(256),
    @LastCleanupTime datetime, 
    @Days int 
) 
AS 
BEGIN 
    DECLARE @TooOld datetime 
    SET @TooOld = DATEADD(day, -@Days, GETUTCDATE()) 
    DECLARE @FromLast datetime 
    SET @FromLast = DATEADD(day, -@Days, @LastCleanupTime) 
    BEGIN TRANSACTION 
         UPDATE MSSQLogPageImpressionQuery 
    SET userName = 'NA' 
    WHERE @FromLast <= searchTime AND searchTime < @TooOld AND userName = @UserName
    UPDATE MSSQLogO14PageClick 
    SET userName = 'NA' 
    WHERE @FromLast <= searchTime AND searchTime < @TooOld AND userName = @UserName
    COMMIT TRANSACTION 
END 
GO 

从查询历史记录中删除自某个日期起到过去 30 天内的所有用户名引用

EXECUTE proc_MSS_QLog_Cleanup_Users '1-1-2017', 30 

删除使用情况记录

SharePoint Server 会在 3 年后自动删除使用情况记录。 可使用以下过程手动删除此类记录:

删除与已删除文档相关联的所有使用情况记录:

  1. 确保已安装最新 SharePoint 更新。 

  2. 启动 SharePoint 命令行管理程序。

  3. 停止并清除“使用情况分析”分析:

    $tj = Get-SPTimerJob -Type Microsoft.Office.Server.Search.Analytics.UsageAnalyticsJobDefinition 
    $tj.DisableTimerjobSchedule()
    $tj.StopAnalysis() 
    $tj.ClearAnalysis() 
    $tj.EnableTimerjobSchedule()
    
  4. 等待分析再次启动(可能最多需要 24 小时)。 

  5. 下次运行分析时,它将转储 Analytics Reporting 数据库中的所有记录。 对于包含许多条目的大型数据库,此完整转储可能需要一段时间。

  6. 等待 10 天。 分析每天运行一次,与已删除文档关联的记录将在 10^次^ 次运行后删除。 如果需要删除许多记录,则此运行所需的时间可能比平常要长。 

SharePoint Server 2010 中的个人信息和搜索

FAST Search Server 2010 for SharePoint

除了在索引中存储文件外,FAST Search Server 2010 Add-On 还以名为 FixML 的中间格式存储文件。 FiXML 文件在每晚凌晨 3 点到凌晨 5 点之间定期压缩。 压缩会自动从 FiXML 文件中删除已删除的文件。 若要确保及时删除属于已删除用户或文档的信息,请确保始终启用压缩。

混合搜索解决方案的建议操作与 SharePoint Server 或 SharePoint Online 中的搜索操作相同。 有两种混合搜索解决方案:

云混合搜索解决方案 -使用 SharePoint 云混合搜索解决方案,可以在 Office 365 搜索索引中为所有已爬网内容(包括本地内容)编制索引。 当用户在 Office 365 中查询搜索索引时,他们会收到来自本地和Office 365内容的搜索结果。 从 SharePoint Server 环境中删除文档时,它们也会从 Office 365 中的搜索索引中删除。 详细了解云混合搜索解决方案 以及 搜索组件和数据库如何在云混合搜索中交互 ,以便更好地了解 GDPR 如何影响混合环境。

混合联合搜索解决方案 -使用混合联合搜索解决方案时,可以在 SharePoint Server 中使用索引,在 Office 365 中使用索引。 SharePoint Server 和 SharePoint Online Search 服务都可以查询其他环境中的搜索索引并返回联合结果。 当用户从搜索中心搜索时,搜索结果将来自 SharePoint Server 中的搜索索引和 Office 365 中的搜索索引。 阅读有关混合联合搜索解决方案的详细信息 ,以更好地了解 GDPR 如何影响混合环境。

本地到云的迁移

将数据从 SharePoint Server 迁移到 SharePoint Online 时,重复数据可能同时存在于这两个位置。 如果需要删除迁移过程中的数据,建议先完成迁移,然后从这两个位置删除数据。 可以从任一位置查询要导出的数据。

用户配置文件数据

用户配置文件服务允许从各种外部源导入配置文件数据。 此类用户配置文件数据的查询和更新应在主控数据的系统中处理。 如果对外部系统进行更新,请确保再次同步 SharePoint Server 中的用户配置文件。

按照以下基本步骤操作,从用户的 SharePoint Server 用户配置文件中删除其个人信息:

  1. 从馈送到 SharePoint Server 用户配置文件的任何外部系统中删除用户信息。 如果使用目录同步,则必须从本地 Active Directory环境中删除该用户。

  2. 在 SharePoint Server 上运行配置文件同步

  3. 从 SharePoint Server 中删除配置文件。 完成此操作后,SharePoint Server 将在 30 天内从用户配置文件数据库完全删除配置文件。 将删除用户的个人资料页和个人网站。

删除用户的个人资料后,用户访问过的网站集中可能仍会记录一些受限信息 (,例如用户 ID) 。 如果选择从给定网站集中删除此数据,可以使用 CSOM 执行此操作。 下面提供了一个示例脚本:

$username = "<admin@company.sharepoint.com>"
$password = "password"
$url = "<https://site.sharepoint.com>"
$securePassword = ConvertTo-SecureString $Password -AsPlainText -Force

# the path here might need to change if you use the SharePoint Server Client Components SDK in a different location.
Add-Type -Path "$env:CommonProgramFiles\microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "$env:CommonProgramFiles\microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"

# connect/authenticate to SharePoint Online and get ClientContext object.
$clientContext = New-Object Microsoft.SharePoint.Client.ClientContext($url)
$credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($username, $securePassword)
$clientContext.Credentials = $credentials
if (!$clientContext.ServerObjectIsNull.Value)
{
    Write-Host "Connected to SharePoint Online site: '$Url'" -ForegroundColor Green
}

# Get user
$user = $clientContext.Web.SiteUsers.GetByLoginName("i:0#.f|membership|user@company.sharepoint.com")

# Redact user
$user.Email = "Redacted"
$user.Title = "Redacted"
$user.Update()
$clientContext.Load($user)
$clientContext.ExecuteQuery()

# Get users
$users = $clientContext.Web.SiteUsers

# Remove user from site
$users.RemoveById($user.Id)
$clientContext.Load($users)
$clientContext.ExecuteQuery()