by Phil Ekins | on 20 DEC 2023 |
Trong bài đăng blog này, chúng ta sẽ xem cách tự động xoay vòng các chứng chỉ AWS Identity and Access Management (IAM) đồng bộ hóa với chứng chỉ Microsoft SQL Server để đáp ứng yêu cầu xoay vòng mật khẩu.
Tổng quan về giải pháp
IAM Access key and Secret access key được sử dụng để tạo chứng chỉ SQL Server; do đó, để xoay vòng các khóa IAM, chúng ta cũng cần thay đổi chứng chỉ SQL Server. Có các hạn chế ký tự cụ thể cho trường hợp sử dụng này cũng cần được kiểm tra. Chúng tôi sẽ thực hiện điều này bằng cách sử dụng các tập lệnh Python trong AWS Lambda để xoay vòng các khóa và khởi chạy tài liệu AWS Systems Manager sẽ thay đổi chứng chỉ SQL Server. Tài liệu sẽ kết nối với các phiên bản riêng lẻ của Amazon Elastic Compute Cloud (Amazon EC2) để thay đổi chứng chỉ SQL Server. Quá trình đa bước này sẽ được quản lý bởi một tài liệu Automation của Systems Manager sẽ được lên lịch thực thi mỗi bảy ngày. Chúng tôi sẽ lưu trữ các chứng chỉ riêng lẻ trong AWS Secrets Manager.
Bài đăng blog này cho rằng kiến trúc, được thảo luận trong Sao lưu cơ sở dữ liệu SQL Server lên Amazon S3, đã được cấu hình và AWS Systems Manager đã được cấu hình đúng trong tài khoản của bạn.
Sơ đồ trong Hình 1 mô tả kiến trúc giải pháp của chúng tôi để xoay vòng chứng chỉ SQL:
Hình 1. Sơ đồ Thiết kế Kiến trúc
- Scheduler Triggers
- Automation Document Starts
- Lambda (RotateCreds) Runs
- Secret is returned to Lambda
- Key is Rotated
- Key is written back to Secret
- Lambda (UpdateCreds) Runs
- Command Document Start
- SQL Credentials are updated
1. Solution walkthrough
1.1. Create secrets in AWS Secrets Manager
Chúng ta cần tạo 5 secrets cho bài thuyết trình này. Để tạo các secrets này, làm theo hướng dẫn trong tài liệu “Create an AWS Secrets Manager secret” bằng cách sử dụng tab “plaintext” và thay thế {“” : “”} bằng các giá trị được hiển thị trong Hình 2:
| Name | Value |
| bucketurl | sql-backups-2022.s3.us-east-1.amazonaws.com/backups |
| iamuser | sql-backups-user |
| sqlcredential | AAA:bbbbbb |
| sqluser | cred-rotation-user |
| sqlpass | cred-rotation-user |
Hình 2. Table of AWS Secrets Manager secrets
1.2. Create AWS Systems Manager documents
Ví dụ này giả định rằng Systems Manager đã được cấu hình đúng trong tài khoản của bạn và các máy chủ Amazon EC2 được liệt kê trong Systems Manager > Fleet Manager. Để được trợ giúp trong việc cài đặt Systems Manager, hãy xem lại tài liệu “Setting up AWS Systems Manager“.
Tiếp theo, chúng ta sẽ tạo tài liệu Systems Manager để kết nối với mỗi SQL Server và chạy lệnh ALTER CREDENTIAL. Trong bài viết này, chúng ta sẽ tạo một tài liệu lệnh có tên SQL-Credentials-UpdateCreds sử dụng tài liệu JSON được trình bày trong Hình 3:
“`json
{
“schemaVersion”: “2.2”,
“description”: “Update SQL Server credentials”,
“parameters”: {
“InstanceId”: {
“type”: “String”,
“description”: “EC2 Instance ID”
},
“CredentialName”: {
“type”: “String”,
“description”: “Name of the SQL Server credential”
},
“Username”: {
“type”: “String”,
“description”: “New username for the credential”
},
“Password”: {
“type”: “String”,
“description”: “New password for the credential”
}
},
“mainSteps”: [
{
“action”: “aws:runPowerShellScript”,
“name”: “UpdateCredentials”,
“inputs”: {
“runCommand”: [
“$InstanceId = ‘{{InstanceId}}’”,
“$CredentialName = ‘{{CredentialName}}’”,
“$Username = ‘{{Username}}’”,
“$Password = ‘{{Password}}’”,
“$ScriptBlock = {“,
” param($InstanceId, $CredentialName, $Username, $Password)”,
” $Instance = Get-EC2Instance -InstanceId $InstanceId”,
” $PrivateIpAddress = $Instance.Instances[0].NetworkInterfaces[0].PrivateIpAddress”,
” $ConnectionString = \”Data Source=$PrivateIpAddress;Initial Catalog=master;User Id=$Username;Password=$Password;\””,
” Write-Host \”Updating SQL Server credentials…\””,
” Invoke-Sqlcmd -ServerInstance $PrivateIpAddress -Query \”ALTER CREDENTIAL $CredentialName WITH IDENTITY = ‘$Username’, SECRET = ‘$Password’\””,
” Write-Host \”SQL Server credentials updated successfully.\””,
“}”,
“& $ScriptBlock -InstanceId $InstanceId -CredentialName $CredentialName -Username $Username -Password $Password”
]
}
}
]
}
“`
Hình 3. SQL-Credentials-UpdateCreds json
1.3. Create IAM role
Trước tiên, chúng ta cần tạo một IAM role để gắn vào các hàm Lambda. Để biết thêm thông tin, hãy tham khảo “AWS Lambda execution role”. Đầu tiên, chúng ta sẽ tạo một vai trò có tên SQL-Credentials-Lambda-role và gắn kết chính sách và mối quan hệ tin cậy.
a. Tạo policy có tên SQL-Credentials-Lambda-policy bằng cách sử dụng kịch bản được trình bày trong Hình 4:
“`json
{
“Version”: “2012-10-17”,
“Statement”: [
{
“Sid”: “VisualEditor0”,
“Effect”: “Allow”,
“Action”: “ec2:DescribeInstances”,
“Resource”: “*”
},
{
“Sid”: “VisualEditor1”,
“Effect”: “Allow”,
“Action”: [
“ssm:SendCommand”,
“iam:DeleteAccessKey”,
“secretsmanager:GetSecretValue”,
“iam:CreateAccessKey”,
“iam:ListAccessKeys”,
“secretsmanager:UpdateSecret”
],
“Resource”: [
“arn:aws:iam::102228307451:user/sql-backups-user”,
“arn:aws:ec2:*:102228307451:instance/*”,
“arn:aws:ssm:*:102228307451:document/SQL-Credentials-UpdateCreds”,
“arn:aws:secretsmanager:*:102228307451:secret:*”
]
}
]
}
“`
Hình 4.SQL-Credentials-Lambda-policy json
b. Mối quan hệ tin cậy sẽ được cấu hình sẵn trong quá trình tạo. Hãy đảm bảo nó khớp với JSON trong Hình 5 và cập nhật thủ công nếu cần.
“`json
{
“Version”: “2012-10-17”,
“Statement”: [
{
“Effect”: “Allow”,
“Principal”: {
“Service”: “lambda.amazonaws.com”
},
“Action”: “sts:AssumeRole”
}
]
}
“`
Hình 5. trust relationship json
1.4. Create AWS Lambda function: SQL-Credentials-UpdateCreds
Bây giờ chúng ta sẽ tạo hàm Lambda sử dụng các thành phần này. Trong ví dụ của chúng ta, chúng ta sẽ tạo một hàm có tên SQL-Credentials-UpdateCreds với cấu hình sau:
a. Sử dụng runtime Python 3.11.
b. Thay đổi vai trò thực thi mặc định để sử dụng một vai trò đã tồn tại được tạo trong bước 1.3, SQL-Credentials-Lambda-role.
c. Sau khi tạo hàm, sửa lambda_function bằng cách dán mã trong phần code được trình bày trong Hình 6, và nhấp vào Deploy.
“`python
import boto3
def lambda_handler(event, context):
ssm = boto3.client(“ssm”)
ec2 = boto3.resource(service_name=”ec2″)
Instances = ec2.instances.filter(
Filters=[
{
‘Name’: ‘instance-state-name’,
‘Values’: [
‘running’
]
}
]
)
for Instance in Instances:
InstanceId = Instance.id
for tags in Instance.tags:
if tags[“Key”] == ‘SQL’ and tags[“Value”] == ‘2022’:
response = ssm.send_command(
InstanceIds=[InstanceId],
DocumentName=”SQL-Credentials-UpdateCreds”, )
“`
Hình 6. SQL-Credentials-Lambda-role script
d. Trên tab Configuration, chọn Edit và điều chỉnh giá trị Timeout thành 15 phút.
e. Hàm này sẽ thực thi tài liệu System Manager SQL-Credentials-UpdateCreds trên bất kỳ các thành phần Amazon EC2 nào được gắn thẻ với SQL:2022. Để thêm các thẻ vào môi trường của bạn, làm theo hướng dẫn về cách gắn thẻ cho các nguồn tài nguyên Amazon EC2 của bạn.
1.5. Create AWS Lambda function: SQL-Credentials-Rotate
Chúng ta cũng cần một hàm thứ hai có tên SQL-Credentials-RotateCreds sử dụng cùng cấu hình như trên và mã được trình bày trong Hình 7, và nhấp vào Deploy.
“`python
import boto3
def lambda_handler(event, context):
iam = boto3.client(‘iam’)
ssm = boto3.client(“ssm”)
sm = boto3.client(“secretsmanager”)
get_secret_value_response = sm.get_secret_value(SecretId=’iamuser’)
iamuser = get_secret_value_response[‘SecretString’]
Keys = iam.list_access_keys(UserName=iamuser)
c = 0
for keyValue in Keys[‘AccessKeyMetadata’]:
c += 1
if c > 1:
if Keys[‘AccessKeyMetadata’][0][‘CreateDate’] > Keys[‘AccessKeyMetadata’][1][‘CreateDate’]:
response = iam.delete_access_key(UserName=iamuser, AccessKeyId=Keys[‘AccessKeyMetadata’][1][‘AccessKeyId’])
else:
response = iam.delete_access_key(UserName=iamuser, AccessKeyId=Keys[‘AccessKeyMetadata’][0][‘AccessKeyId’])
NewKey = iam.create_access_key(UserName=iamuser)
KeyValidated = False
while KeyValidated == False:
if ‘:’ in NewKey[‘AccessKey’][‘AccessKeyId’] or ‘:’ in NewKey[‘AccessKey’][‘SecretAccessKey’]:
response = iam.delete_access_key(UserName=iamuser, AccessKeyId=NewKey[‘AccessKey’][‘AccessKeyId’])
NewKey = iam.create_access_key(UserName=iamuser)
else:
KeyValidated = True
sqlcredential = NewKey[‘AccessKey’][‘AccessKeyId’] + ‘:’ + NewKey[‘AccessKey’][‘SecretAccessKey’]
response = sm.update_secret(SecretId=’sqlcredential’, SecretString=sqlcredential)
“`
Hình 7. SQL-Credentials-RotateCreds script
a. Trên tab Configuration, chọn Edit và điều chỉnh giá trị Timeout thành 15 phút.
b. Hàm này sẽ xoay vòng các thông tin xác thực IAM cho người dùng sql-backups-user và cập nhật bí mật sqlcredential trong AWS Secrets Manager với khóa được nối cần thiết cho cấu hình thông tin đăng nhập SQL Server.
1.6. Create an IAM Automation role:
AmazonSSMAutomationRole
Chúng ta sẽ cần tạo một IAM Automation role có tên AmazonSSMAutomationRole sẽ được sử dụng với tài liệu tự động hóa, như mô tả trong Use IAM to configure roles for Automation. Bên cạnh chính sách được xác định trước AmazonSSMAutomationRole, chúng ta cũng sẽ thêm một chính sách nội tuyến có tên SSM-lambda-InvokeFunction sử dụng JSON được trình bày trong Hình 8.
“`json
{
“Version”: “2012-10-17”,
“Statement”: [
{
“Sid”: “VisualEditor0”,
“Effect”: “Allow”,
“Action”: “lambda:InvokeFunction”,
“Resource”: “*”
}
]
}
“`
Hình 8. SSM-lambda-InvokeFunction script
1.7. Create an AWS Systems Manager automation document
Chúng ta cũng sẽ tạo một Systems Manager automation document:
a. Đoạn mã YAML được trình bày trong Hình 9 sẽ cấu hình tài liệu tự động hóa AWS Systems Manager có tên SQL-Credentials-Automation. Lưu ý số tài khoản 000000000000 được đánh dấu, bạn cần chỉnh sửa nó cho tài khoản của bạn.
“`yaml
description: |
*SSM Automation document for SQL-Credentials-Rotation.*
schemaVersion: ‘0.3’
assumeRole: ‘arn:aws:iam::000000000000:role/AmazonSSMAutomationRole’
mainSteps:
– name: Step1_RotateCreds
action: ‘aws:invokeLambdaFunction’
inputs:
InvocationType: RequestResponse
FunctionName: SQL-Credentials-RotateCreds
– name: Step2_UpdateCreds
action: ‘aws:invokeLambdaFunction’
inputs:
InvocationType: RequestResponse
FunctionName: SQL-Credentials-UpdateCreds
“`
Hình 9. SSM-lambda-InvokeFunction script
b. Tài liệu tự động hóa này sẽ được lên lịch chạy hàng ngày 30 ngày. Làm theo hướng dẫn trong Using AWS Lambda with Amazon EventBridge để tạo lịch trình.
c. Tài liệu tự động hóa này có hai bước:
i. Bước một sẽ thực thi hàm Lambda SQL-Credentials-RotateCreds để xoay vòng thông tin xác thực IAM.
ii. Bước hai sẽ thực thi hàm Lambda SQL-Credentials-UpdateCreds để xác định bất kỳ thành phần Amazon EC2 nào đang chạy với một khóa thẻ có tên là SQL và giá trị là 2022. Sau đó, nó sẽ thực thi tài liệu Systems Manager SQL-Credentials-UpdateCreds trên mỗi máy chủ để xác định bất kỳ phiên bản SQL Server nào đang chạy trên máy chủ đó. Cuối cùng, nó sẽ thay đổi thông tin đăng nhập SQL Server trên mỗi phiên bản SQL Server bằng giá trị được lưu trữ trong bí mật Secrets Manager có tên là sqlcredential.
1.8 Create SQL Server login
Để kết nối vào cơ sở dữ liệu SQL Server bằng SQL Server Management Studio (SSMS) và tạo đăng nhập SQL Server, bạn cần sử dụng T-SQL như được trình bày trong Hình 10. Đảm bảo chế độ xác thực SQL được đặt thành Mixed Mode.
“`sql
USE master;
CREATE LOGIN [cred-rotation-user] WITH PASSWORD=N’cred-rotation-user’, DEFAULT_DATABASE=[master], CHECK_POLICY=OFF
GO
GRANT CONTROL SERVER TO [cred-rotation-user];
GO
“`
Hình 10.SQL Server login script
1.9. Tag Amazon EC2 resources
Trong ví dụ này, chúng ta sẽ sử dụng bộ lọc thẻ. Bạn cần thêm một khóa thẻ SQL với giá trị 2022 cho các phiên bản Amazon EC2. Để biết thêm hướng dẫn, hãy xem hướng dẫn về cách gắn thẻ cho các tài nguyên AWS của bạn.
2. Testing solution
2.1. Để xoay vòng thông tin xác thực IAM và thông tin đăng nhập SQL Server theo cách thủ công, làm theo các bước sau:
a. Mở AWS Systems Manager trong AWS Management Console.
b. Chọn Shared Resources > Documents.
c. Chọn Owned by me và chọn SQL-Credentials-Automation.
d. Chọn Execute automation, chọn tùy chọn mặc định Simple execution, và nhấp Execute.
e. Cột Status sẽ hiển thị thành công cho cả hai bước (Hình 11).
Hình 11. Automation document output showing success
f. Mở SQL Server Management Studio (SSMS) trên phiên bản SQL Server 2022 và chạy lệnh T-SQL được trình bày trong Hình 12. Cập nhật địa chỉ Amazon S3 dựa trên môi trường của bạn.
“`sql
BACKUP DATABASE db1
TO URL = ‘s3://sql-backups-2022.s3.us-east-1.amazonaws.com/backups/db1.bak’
WITH FORMAT, COMPRESSION, MAXTRANSFERSIZE = 20971520;
“`
Hình 12. T-SQL backup command
g. Kết quả dự kiến sẽ là thông báo “BACKUP DATABASE successfully processed”.
h. Giá trị của Secrets Manager Secret sqlcredential cũng sẽ thay đổi để phản ánh Access Key mới.
3. Cleanup resources
Khi bạn đã sử dụng xong các tài nguyên AWS trong bài viết này, hãy xóa các tài nguyên đó để tránh phát sinh các khoản phí không mong muốn.
a. Xóa các tài liệu AWS Systems Manager
b. Trên bảng điều khiển Lambda, chọn Functions trong bảng điều hướng.
c. Chọn chức năng bạn đã tạo và trên menu Hành động, chọn Delete.
d. Chọn Delete lại để xác nhận.
f. Xóa AWS Secrets Manager secrets.
g. Xóa đăng nhập SQL Server:
i. DROP LOGIN [cred-rotation-user];
h. Xóa IAM policies.
i. Xóa các IAM role.
4. Conclusion
Bảo mật là một phần quan trọng trong tất cả các quy trình làm việc và bài viết này đã chỉ ra cách thực hiện yêu cầu như xoay vòng thông tin xác thực để đảm bảo an toàn hơn.
Chúng ta đã tìm hiểu cách tự động xoay vòng thông tin xác thực IAM được sử dụng bởi SQL Server để sao lưu cơ sở dữ liệu SQL Server trực tiếp tới Amazon S3. Điều này được thực hiện thông qua việc kết hợp các hàm Lambda, tài liệu AWS Systems Manager và một tài liệu tự động hóa Systems Manager để quản lý quy trình làm việc của mỗi phần.
AWS có nhiều dịch vụ hơn và nhiều tính năng hơn trong các dịch vụ đó so với bất kỳ nhà cung cấp đám mây nào khác, giúp di chuyển ứng dụng hiện có của bạn lên đám mây nhanh chóng, dễ dàng và hiệu quả về chi phí, và xây dựng gần như bất kỳ thứ gì bạn có thể tưởng tượng. Hãy cung cấp cơ sở hạ tầng cần thiết cho ứng dụng Microsoft của bạn để đạt được các kết quả kinh doanh mà bạn mong mu