使用 PowerShell 配置 Always Encrypted

适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例

SqlServer PowerShell 模块提供用于在 Azure SQL 数据库或 SQL Server 中配置 Always Encrypted 的 cmdlet。

使用 PowerShell 配置 Always Encrypted 时的安全注意事项

由于 Always Encrypted 的主要目的是确保加密敏感数据的安全(即使数据库系统遭到入侵),因此在 SQL Server 计算机上执行处理密钥或敏感数据的 PowerShell 脚本可减少或抵消该功能带来的益处。 有关其他安全相关的建议,请参阅 Security Considerations for Key Management(密钥管理的安全注意事项)。

你可以在分隔角色或不分隔角色的情况下使用 PowerShell 管理 Always Encrypted 密钥,从而控制可访问密钥存储中实际加密密钥的人员和可访问该数据库的人员。

有关其他建议,请参阅 密钥管理安全注意事项

先决条件

在一台安全计算机(并非托管 SQL Server 实例的计算机)上安装 SqlServer PowerShell 模块版本 22.0.50 或更高版本。 可通过 PowerShell 库直接安装该模块。 请参阅下载说明了解详细信息。

导入 SqlServer 模块

加载 SqlServer 模块:

  1. 使用 Set-ExecutionPolicy cmdlet 设置相应的脚本执行策略。
  2. 使用 Import-Module cmdlet 导入 SqlServer 模块。

此示例将加载 SqlServer 模块。

# Import the SQL Server Module.  
Import-Module "SqlServer" -MinimumVersion 22.0.50

连接到数据库

一些 Always Encrypted cmdlet 适用于数据库中的数据或元数据,并要求你首先应连接到数据库。 使用 SqlServer 模块配置 Always Encrypted 时,建议使用两种方法来连接到数据库:

  1. 使用 Get-SqlDatabase cmdlet 进行连接
  2. 使用 SQL Server PowerShell 提供程序进行连接。

使用 Get-SqlDatabase

通过 Get-SqlDatabase cmdlet,可以连接到 SQL Server 或 Azure SQL 数据库中的数据库。 它会返回一个数据库对象,随后你可以使用连接数据库的 cmdlet 的 InputObject 参数传递此对象

使用 SQL Server PowerShell

# Import the SqlServer module
Import-Module "SqlServer" -MinimumVersion 22.0.50

# Connect to your database
# Set the valid server name, database name and authentication keywords in the connection string
$serverName = "<Azure SQL server name>.database.windows.net"
$databaseName = "<database name>"
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Authentication = Active Directory Integrated"
$database = Get-SqlDatabase -ConnectionString $connStr

# List column master keys for the specified database.
Get-SqlColumnMasterKey -InputObject $database

或者,你可使用管道传送:

$database | Get-SqlColumnMasterKey

使用 SQL Server PowerShell 提供程序

SQL Server PowerShell 提供程序用类似于文件系统路径的路径公开 SQL Server 对象的层次结构。 通过 SQL Server PowerShell,你可以使用与你通常用于导航文件系统路径的命令相似的 Windows PowerShell 别名来导航路径。 在你导航到目标实例和数据库后,后续 cmdlet 将以该数据库为目标,如下面的示例所示。

注意

连接数据库的此方法仅适用于 SQL Server(Azure SQL 数据库中不支持此方法)。

# Import the SqlServer module.
Import-Module "SqlServer" -MinimumVersion 22.0.50
# Navigate to the database in the remote instance.
cd SQLSERVER:\SQL\servercomputer\DEFAULT\Databases\yourdatabase
# List column master keys in the above database.
Get-SqlColumnMasterKey

或者,你可使用泛型 Path 参数来指定数据库路径,而不是导航到该数据库。

# Import the SqlServer module.
Import-Module "SqlServer" -MinimumVersion 22.0.50
# List column master keys for the specified database.
Get-SqlColumnMasterKey -Path SQLSERVER:\SQL\servercomputer\DEFAULT\Databases\yourdatabase

使用 PowerShell 的 Always Encrypted 任务

Always Encrypted Cmdlet 参考

以下 PowerShell cmdlet 可供 Always Encrypted 使用:

CMDLET 说明
Add-SqlAzureAuthenticationContext 执行 Azure 身份验证,获取身份验证令牌。
Add-SqlColumnEncryptionKeyValue 为数据库中的现有列加密密钥对象添加新的加密值。
Complete-SqlColumnMasterKeyRotation 完成列主密钥的轮换
Get-SqlColumnEncryptionKey 返回数据库中定义的所有列加密密钥对象,或返回一个具有指定名称的列加密密钥对象。
Get-SqlColumnMasterKey 返回数据库中定义的列主密钥对象,或返回一个具有指定名称的列主密钥对象。
Invoke-SqlColumnMasterKeyRotation 启动列主密钥的轮换。
New-SqlAzureKeyVaultColumnMasterKeySettings 创建一个 SqlColumnMasterKeySettings 对象,该对象描述存储在 Azure 密钥保管库中的非对称密钥。
New-SqlCngColumnMasterKeySettings 创建一个 SqlColumnMasterKeySettings 对象,该对象描述存储在支持下一代加密技术 (CNG) API 的密钥存储中的非对称密钥。
New-SqlColumnEncryptionKey 在数据库中创建列加密密钥对象。
New-SqlColumnEncryptionKeyEncryptedValue 生成列加密密钥的加密值。
New-SqlColumnEncryptionSettings 创建一个 SqlColumnEncryptionSettings 对象,该对象封装有关单个列的加密的信息(包括 CEK 和加密类型)。
New-SqlColumnMasterKey 在数据库中创建列主密钥对象。
New-SqlColumnMasterKeySettings 使用指定的提供程序和密钥路径为列主密钥创建 SqlColumnMasterKeySettings 对象。
New-SqlCspColumnMasterKeySettings 创建一个 SqlColumnMasterKeySettings 对象,该对象描述存储在带有加密服务提供程序 (CSP)(支持加密 API (CAPI))的密钥存储中的非对称密钥。
Remove-SqlColumnEncryptionKey 从数据库删除列加密密钥对象。
Remove-SqlColumnEncryptionKeyValue 从数据库的现有列加密对象中删除加密值。
Remove-SqlColumnMasterKey 从数据库删除列主密钥对象。
Set-SqlColumnEncryption 加密、解密或重新加密数据库中的指定列。

另请参阅