使用SSL加密保护Amazon RDS Custom的数据库连接
关键要点
在这篇文章中,我们将探讨如何为SQL Server的Amazon RDS Custom实例配置SSL/TLS加密。这一配置不仅增强了安全性,还满足了常见的合规要求。文章涵盖自动化步骤,确保在创建RDS Custom实例时,SSL加密设置能够自动实现。
Amazon Relational Database Service (Amazon RDS) Custom for SQL Server 是一项托管数据库服务,适用于需要操作系统访问和数据库自定义功能的应用程序,这些功能在 Amazon RDS for SQL Server中无法获得。使用SSL加密应用程序与RDS Custom的数据库连接是一个重要的安全需求,可以通过安全套接层 (SSL) 和传输层安全性 (TLS) 证书来保护数据在传输过程中的安全。
在本文中,我们将介绍如何使用自管理证书配置SQL Server的RDS Custom实例的SSL/TLS加密。此外,我们还将展示如何选择性地配置SSL/TLS加密并启用Kerberos身份验证。我们在本示例中使用由内部CA颁发的证书。
解决方案概述
在此示例中,我们将利用 State Manager,这是 AWS Systems Manager 的一项功能,自动化RDS Custom实例的SSL加密,具体步骤如下:
自动化工作流程步骤如下:
创建一个带有标签(RDSCertSSL donotdeleterdscustomltdbinstanceidgt)的RDS Custom实例。创建过程中,RDS Custom实例会向Systems Manager注册。配置State Manager以运行与标签匹配的Systems Manager命令文档(awsrunPowerShellScript)。在运行命令时,从 AWS Secrets Manager 和 Amazon Simple Storage Service (Amazon S3) 中分别获取导入证书所需的秘密和SSL证书。配置RDS Custom实例以启用SSL加密。可选情况下,将RDS Custom实例加入域并重启以启用Kerberos身份验证。接下来的部分将详细介绍如何设置这项自动化。我们还将提供可选步骤,以执行域加入并更改SQL Server服务账户以支持Kerberos身份验证。
前提条件
在我们开始之前,您需要具备以下前提条件:
一个 AWS帐户。一个S3桶,用于存储您的证书并记录Systems Manager命令输出。满足创建RDS Custom实例的要求。已安装并配置AWS CLI。一个带有 SQL Server Management Studio (SSMS) 的 Amazon Elastic Compute Cloud (Amazon EC2) Windows实例。一个SSL证书,符合 SQL Server加密的要求,并已上传到S3桶。从RDS Custom实例创建之前,我们能够获取RDS终端节点,因此可以创建包含RDS终端节点的证书,证书的主体属性包含了RDS终端节点。以下是一个RDS终端节点URL的示例。要获取您的RDS终端节点URL的一致部分,请参阅 查找数据库实例终端节点和端口号。
如果您计划执行域加入,则需配置DNS解析。这可以通过多种方式实现;一种方法是使用 Amazon Route 53 出站端点将DNS请求转发到DNS服务器。有关更多信息,请参见 将出站DNS查询转发到您的网络。请注意,该解决方案涉及新AWS资源的创建和利用,因此会在您的帐户上产生费用。有关更多信息,请参阅 AWS定价。
我们建议您在非生产环境中测试此设置,然后再在生产环境中实施。
创建证书密码秘密
将证书密码添加到Secrets Manager中,以防止未授权用户访问,并实现基于Systems Manager的自动化。在这篇文章中,我们使用的是由 企业证书授权 (CA) 颁发的证书,其中包含证书、私钥和以个人信息交换 (PFX) 格式导出的中间证书,并使用密码进行保护。导入证书到RDS Custom时需要使用相同的密码。
请按照以下步骤操作:
创建一个名为 CertPassjson 的文件,内容如下:
json{ password ltCERTPASSWORDgt}
使用以下AWS CLI命令创建秘密:
bashaws secretsmanager createsecret name RDSSSLCert description Password to perform SSL certificate import into RDS Custom secretstring file//CertPassjson region ltAWS regiongt
命令将返回该秘密的详细信息。
您需要允许RDS Custom使用的 AWS身份与访问管理 (IAM) 角色访问您创建的秘密。还需要允许RDS Custom实例从所创建的S3桶中下载SSL证书,并将输出记录到相应的S3桶中。
创建一个名为 policyjson 的文件,内容如下:
json{ Version 20121017 Statement [ { Sid SSLSecret Effect Allow Action secretsmanagerGetSecretValue Resource ltSecretARNgt } { Sid GetSSLCert Effect Allow Action [ s3PutObject s3GetObject s3PutObjectAcl ] Resource ltS3BucketARNgt } ]}
使用以下AWS CLI命令将策略添加到RDS Custom IAM角色:
bashaws iam putrolepolicy rolename ltAWSRDSCustomSQLServerInstanceRolegt policyname RDSSSLCert policydocument file//policyjson
此命令没有输出。
创建Systems Manager命令文档
Systems Manager文档 (SSM文档) 是一组命令,Systems Manager将在您的托管实例上运行。在这篇文章中,您将定义在RDS Custom实例创建过程中执行的命令。以下是一组在yaml文件中定义的PowerShell命令。这些脚本高层次上自动化以下步骤:
在C盘创建文件夹并从Amazon S3下载证书文件。从Secrets Manager获取导入证书所需的密码。将证书导入到本地计算机证书存储。授予网络服务账户对证书私钥的读取权限。将中间证书移动到本地机器的受信任根证书颁发机构证书存储中。启用SQL Server的SSL加密。重启SQL Server服务。创建一个名为 RDSSSLConfigyaml 的文件,内容如下。用您账户中的信息替换占位符,包括存储SSL证书的S3桶名称和证书文件名称。在PowerShell脚本中,取消注释将中间证书移动到受信任根证书颁发机构证书存储的部分,以自动化此任务。该命令将自动执行这些任务。
yamlschemaVersion 22description Command Document to configure SSLmainSteps action awsrunPowerShellScript precondition StringEquals platformType Windows name RunPowershellScript inputs runCommand folder=CCert NewItem folder ItemType Directory secret=(GetSECSecretValue SecretId )SecretString ConvertFromJson mypwd=ConvertToSecureString secretpassword AsPlainText Force CopyS3Object BucketName Key LocalFolder CCert fp=CCert csl=CertLocalMachineMy pass=mypwd bp=ImportPfxCertificate FilePath fp CertStoreLocation csl Password pass tb=bpThumbprint CertObj=GetChildItem CertLocalMachinemytb rsaCert=[SystemSecurityCryptographyX509CertificatesRSACertificateExtensions]GetRSAPrivateKey(CertObj) fileName=rsaCertkeyUniqueName
SetLocation envALLUSERSPROFILEMicrosoftCrypto file=GetChildItem filename Recurse filepath=fileDirectoryName path=filepathfileName permissions=GetAcl Path path rule=newobject securityaccesscontrolfilesystemaccessrule Network Service read allow permissionsAddAccessRule(rule) SetAcl Path path AclObject permissions# The following code moves the intermediate certificate to the trusted certificate store# cacert= (GetPfxData FilePath fp Password mypwd)OtherCertificatesThumbprint# SetLocation Cert# cert=GetChildItem path cacert recurse WhereObject {PSParentPathContains(LocalMachine)}# MoveItem Path certPSPath Destination CertLocalMachineRoot# end of code that moves the intermediate certificate SetItemProperty Path (getItemProperty Path HKLMSOFTWAREMicrosoftMicrosoft SQL ServerMSSQLServerSuperSocketNetLib)PsPath Name Certificate Type String Value (tb) SetItemProperty Path (getItemProperty Path HKLMSOFTWAREMicrosoftMicrosoft SQL ServerMSSQLServerSuperSocketNetLib)PsPath Name ForceEncryption Type DWORD Value 1 server = envCOMPUTERNAME service = getwmiObject win32service computername server {name eq mssqlserver} stopservice = servicestopservice() StartSleep Seconds 5 startservice = servicestartservice()输入以下AWS CLI命令来创建SSM文档:
bashaws ssm createdocument name RDSSSLConfig content file//RDSSSLConfigyaml documenttype Command targettype /AWSEC2Instance documentformat YAML region ltAWS regiongt
创建State Manager关联
State Manager自动化保持管理实例处于特定状态在本例中是RDS Custom实例的过程。在此步骤中,您配置State Manager在创建RDS Custom实例后调用SSM文档的执行。您使用标签键 RDSSSLConfig 和值 donotdeleterdscustomltdbinstanceidgt 来运行SSM文档。在有多个需要SSL配置的RDS Custom实例时,可以使用不同的唯一值来区分实例之间的关联。您还需要配置State Manager将命令输出记录到您在前提条件中创建的S3桶。
输入以下AWS CLI命令来配置State Manager。用您账户中的信息替换占位符,包括实例ID、AWS Region和S3桶名称。

bashaws ssm createassociation associationname RDSSSLConfigTags targets Key=tagRDSSSLConfigValues=donotdeleterdscustomltdbinstanceidgt name RDSSSLConfig outputlocation S3Location={OutputS3Region=ltregiongtOutputS3BucketName=ltS3 bucket namegt}
创建RDS Custom实例
在创建RDS Custom实例时添加标签至关重要。这确保触发新实例创建的未来事件如磁盘损坏继承该标签,从而调用运行SSM文档以自动配置RDS Custom上的SSL。如今,AWS控制台不支持在创建时添加标签,因此我们使用AWS CLI。
输入以下AWS CLI命令来创建RDS Custom实例。用您账户中的信息替换占位符。
bashaws rds createdbinstance engine customsqlserverse engineversion 150043222v1 dbinstanceidentifier ltdbinstanceidgt dbinstanceclass dbm6ilarge allocatedstorage 100 storagetype gp3 masterusername ltsausernamegt masteruserpassword ltsapasswordgt kmskeyid ltkmskeyidgt customiaminstanceprofile ltAWSRDSCustomSQLServerInstanceProfilegt dbsubnetgroupname ltdbsubnetgroupgt vpcsecuritygroupids ltyour security group idgt nopubliclyaccessible region ltAWS regiongt tags Key=RDSSSLConfigValue=donotdeleterdscustomltdbinstanceidgt
日本免费加速器下载在创建过程中,Systems Manager会运行SSM文档以下载和配置RDS Custom实例的SSL设置。
可选域加入和配置RDS Custom上的SSL
在某些场景中,您可能需要将RDS Custom实例加入域并配置SSL加密。本节将详细介绍自动将RDS Custom实例加入域、配置SQL Server使用域账户以及在实例创建过程中设置SSL加密的SSM文档。
将RDS Custom实例加入域的一个原因是启用Kerberos身份验证。Kerberos身份验证需要注册服务主体名称 (SPN)。SPN注册可以由SQL Server服务账户自动完成,或通过手动预注册来完成。为了实现自动注册,服务账户需要在Active Directory中获得相关权限。有关更多信息,请参阅 注册Kerberos连接的服务主体名称。
以下是配置SSL和启用Kerberos身份验证的高层步骤:
创建Active Directory秘密。创建Systems Manager命令文档。创建State Manager关联。创建RDS Custom实例。您需要一个SSL证书,该证书包括需要进行加密连接的实例的完全限定域名FQDN,并上传到您的S3桶中。
创建Active Directory秘密
除了创建一个秘密以存储证书的密码外,您还需要创建一个秘密来存储凭据和域信息,存储在Secrets Manager中。这可以防止未授权的使用,并支持Systems Manager自动化。Active Directory账户仅需在指定Active Directory中创建计算机对象的权限。遵循最小权限原则,请勿重用具有不必要权限的账户。
创建一个名为 RDSADJoinjson 的文件,内容如下:
json{ username ltADUSERgt password ltDOMAINPASSWORDgt domainname ltDOMAINNAMEgt}
创建秘密的命令如下:
bashaws secretsmanager createsecret name RDSADJoin description Credentials and details for RDS Custom instances to join Active Directory secretstring file//RDSADJoinjson region ltAWS regiongt
创建Systems Manager命令文档
此文档自动将RDS Custom实例加入Active Directory、配置SQL Server服务账户并使用在yaml文件中定义的PowerShell命令设置SSL加密。整体上,这些脚本自动化以下步骤:
获取域用户名称和密码,以便进行域加入。加入域。更改SQL Server服务的服务账户。在C盘创建文件夹并从Amazon S3下载证书文件。从Secrets Manager获取导入证书所需的密码。将证书导入到本地计算机证书存储