对包中敏感数据的访问控制

为了保护 Integration Services 包中的数据,可以设置保护级别,以帮助仅保护包中的敏感数据或包中的所有数据。 另外,可以采用密码或用户密钥对数据加密,或依靠数据库对数据进行加密。 另外,您对包所采用的保护级别不一定是静态的,而是在包的整个生命周期内可能变化。 通常,您可以在包开发阶段设置一个保护级别,在包部署阶段设置另一个保护级别。

注意

除了本主题中所述的保护级别外,还可以使用固定数据库级角色保护保存到 Integration Services 服务器的包。

定义敏感信息

在 Integration Services 包中,下列信息定义为“敏感” 信息:

  • 连接字符串的密码部分。 但是,如果选择加密所有数据的选项,则整个连接字符串都将被视为敏感信息。

  • 标记为敏感的任务生成的 XML 节点。 XML 节点的标记由 Integration Services 控制,用户无法更改。

  • 标记为敏感的所有变量。 标记的变量由 Integration Services控制。

Integration Services 认为属性是否敏感,主要取决于 Integration Services 组件(连接管理器或任务)的开发人员是否将该属性指定为敏感。 用户不能向被视为敏感的属性列表添加属性,也不能从该列表删除属性。

加密

加密(包保护级别所使用的加密)是通过使用 Microsoft 数据保护 API (DPAPI) 来执行的,DPAPI 是 Cryptography API (CryptoAPI) 的一部分。

使用密码加密包的包保护级别还要求您提供密码。 如果将保护级别从不使用密码的级别更改为使用密码的级别,则系统将提示您输入密码。

另外,对于使用密码的保护级别, Integration Services 会使用 Triple DES 加密算法(其密钥长度为 192 位), .NET Framework 类库 (FCL) 中提供该算法。

保护级别

下表介绍 Integration Services 提供的保护级别。 括号中的值是来自 DTSProtectionLevel 枚举的值。 在 SQL Server Data Tools (SSDT)中处理包时,这些值出现在用来配置包属性的“属性”窗口中。

保护级别 说明
不保存敏感数据 (DontSaveSensitive) 保存包时不保存包中敏感属性的值。 这种保护级别不进行加密,但它防止标记为敏感的属性随包一起保存,因此其他用户将无法使用这些敏感数据。 如果其他用户打开该包,敏感信息将被替换为空白,用户必须提供这些敏感信息。

当与 dtutil 实用工具 (dtutil.exe) 一起使用时,此保护级别对应的值为 0。
使用密码加密所有数据 (EncryptAllWithPassword) 使用密码加密整个包。 使用用户在创建包或导出包时提供的密码加密包。 用户必须提供包密码,才能在 SSIS 设计器中打开包,或使用 dtexec 命令提示符实用工具运行包。 如果没有密码,用户将无法访问或运行包。

当与 dtutil 实用工具一起使用时,此保护级别对应的值为 3。
使用用户密钥加密所有数据 (EncryptAllWithUserKey) 使用基于当前用户配置文件的密钥加密整个包。 只有创建或导出了包的用户才能在 SSIS 设计器中打开包,或使用 dtexec 命令提示符实用工具运行包。

当与 dtutil 实用工具一起使用时,此保护级别对应的值为 4。

注意:对于使用用户密钥的保护级别, Integration Services 使用 DPAPI 标准。 有关 DPAPI 的详细信息,请参阅 MSDN Library https://msdn.microsoft.com/library
使用密码加密敏感数据 (EncryptSensitiveWithPassword) 使用密码只加密包中敏感属性的值。 DPAPI 用于此加密。 敏感数据作为包的一部分保存,但数据是使用当前用户在创建包或导出包时提供的密码加密的。 若要在 SSIS 设计器中打开包,用户必须提供包密码。 如果不提供该密码,则包虽然可以打开但其中不包含敏感数据,当前用户必须为敏感数据提供新值。 如果用户试图在不提供密码的情况下执行包,则包执行将会失败。 有关密码和命令行执行的详细信息,请参阅 dtexec Utility

当与 dtutil 实用工具一起使用时,此保护级别对应的值为 2。
使用用户密钥加密敏感数据 (EncryptSensitiveWithUserKey) 使用基于当前用户配置文件的密钥只加密包中敏感属性的值。 只有使用同一配置文件的同一个用户才能加载此包。 如果其他用户打开该包,敏感信息将被替换为空白,当前用户必须为敏感数据提供新值。 如果用户试图执行该包,则包执行将会失败。 DPAPI 用于此加密。

当与 dtutil 实用工具一起使用时,此保护级别对应的值为 1。

注意:对于使用用户密钥的保护级别, Integration Services 使用 DPAPI 标准。 有关 DPAPI 的详细信息,请参阅 MSDN Library https://msdn.microsoft.com/library
依靠服务器存储进行加密 (ServerStorage) 使用 SQL Server 数据库角色保护整个包。 将包保存到 SQL Server msdb 数据库后,支持此选项。 此外,SSISDB 目录使用 ServerStorage 保护级别。

在将包从 SQL Server Data Tools (SSDT)保存到文件系统时,不支持此选项。

保护级别设置和 SSISDB 目录

SSISDB 目录使用 ServerStorage 保护级别。 在向 Integration Services 服务器部署 Integration Services 项目时,该目录会自动对包数据和敏感值加密。 该目录还会在检索数据时自动解密数据。

如果将项目 (.ispac 文件) 从 Integration Services 服务器导出到文件系统,则系统会自动将保护级别更改为 EncryptSensitiveWithUserKey。 如果使用 SQL Server Data Tools (SSDT) 中的 Integration Services 导入项目向导导入项目,则“属性”窗口中的 ProtectionLevel 属性将显示值 EncryptSensitiveWithUserKey

基于包的生命周期设置保护级别

在 SQL Server Data Tools (SSDT) 中初次开发 SQL Server Integration Services 包时,可以设置该包的保护级别。 以后当部署包时,在 Integration Services 中将包导入 SQL Server Management Studio或从中导出包时,或者在将包从 SQL Server Data Tools (SSDT) 复制到 SQL Server、 SSIS 包存储区或文件系统时,都可以更新包的保护级别。 例如,如果在计算机上使用某个用户密钥保护级别选项创建并保存包,则在将包提供给其他用户时,很可能需要更改保护级别,否则,他们将无法打开该包。

通常,您可以按下面列出的步骤更改保护级别:

  1. 在部署期间,将包的保护级别保留为默认值 EncryptSensitiveWithUserKey。 此设置可以保证只有开发人员可以看到包中的敏感值。 或者,您可以考虑使用 EncryptAllWithUserKeyDontSaveSensitive

  2. 部署包时,您需要将保护级别更改为不依靠开发人员用户密钥的保护级别。 因此,通常需要选择 EncryptSensitiveWithPasswordEncryptAllWithPassword。 通过分配一个生产环境中运营团队也知道的临时强密码来加密包。

  3. 在将包部署到生产环境后,运营团队可以通过分配一个只有他们自己知道的强密码来重新加密部署的包。 他们也可以通过选择 EncryptSensitiveWithUserKeyEncryptAllWithUserKey,并使用要运行包的帐户的本地凭据来加密部署的包。

另请参阅

导入和导出包(SSIS 服务)
Integration Services (SSIS) 包
安全概览 (Integration Services)