在医疗保健应用中,保护患者数据的机密性和完整性至关重要。通常会要求确保数据在静态(存储时)和传输中(移动时)加密,并且只有授权人员可以访问。架构中可以使用 Amazon SQS 和 Amazon SNS,因此需要针对这两个服务实施安全措施。
一家医院正在设计一个新的应用程序,用于收集患者的症状。医院决定在架构中使用 Amazon Simple Queue Service(Amazon SQS)和 Amazon Simple Notification Service(Amazon SNS)。解决方案架构师正在审查基础设施设计。数据必须在静态和传输中加密,只有医院的授权人员才能访问数据。解决方案架构师应在 SNS 组件上启用服务器端加密,使用 AWS Key Management Service(AWS KMS)客户管理密钥,应用密钥策略以限制密钥使用于一组授权主体。并在 SQS 组件上启用服务器端加密,使用 AWS Key Management Service(AWS KMS)客户管理密钥,应用密钥策略以限制密钥使用于一组授权主体,在队列策略中设置条件以仅允许通过 TLS 的加密连接。
解决方案详细论述
1. 核心安全要求
- 静态加密:数据在存储时(例如,在 SQS 队列或 SNS 主题中)必须加密,防止未授权访问。
- 传输加密:数据在传输过程中(例如,从客户端到服务或服务间通信)必须使用 TLS 加密,防止窃听或篡改。
- 访问控制:只有医院的授权人员(如医生或管理员)才能访问数据,这需要通过密钥策略和资源策略来限制。
AWS 提供了多种工具来实现这些要求,包括 AWS KMS(密钥管理服务)用于静态加密,以及策略条件用于强制执行传输加密。
这个组合确保了SNS和SQS组件都满足了所有安全要求。这种设计不仅提供了强大的安全保护,还保持了系统的可扩展性和可维护性,是医疗云应用程序的最佳实践架构。
1. Amazon SNS安全配置
实施步骤:
a. 启用服务器端加密(SSE)使用KMS客户管理密钥(CMK)
bash
# 创建KMS客户管理密钥
aws kms create-key \
--description "Hospital Symptoms App SNS Encryption Key" \
--key-usage ENCRYPT_DECRYPT \
--origin AWS_KMS
# 为SNS主题启用加密
aws sns create-topic \
--name patient-symptoms-topic \
--attributes '{
"KmsMasterKeyId": "arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"
}'
b. 配置严格的密钥策略
密钥策略是控制谁可以使用KMS密钥的核心机制。对于医疗数据,必须实施最严格的访问控制:
json
{
"Version": "2012-10-17",
"Id": "hospital-sns-key-policy",
"Statement": [
{
"Sid": "Allow hospital administrators to manage the key",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::123456789012:role/HospitalAdminRole",
"arn:aws:iam::123456789012:user/DrSmith"
]
},
"Action": [
"kms:Create*",
"kms:Describe*",
"kms:Enable*",
"kms:List*",
"kms:Put*",
"kms:Update*",
"kms:Revoke*",
"kms:Disable*",
"kms:Get*",
"kms:Delete*",
"kms:ScheduleKeyDeletion",
"kms:CancelKeyDeletion"
],
"Resource": "*"
},
{
"Sid": "Allow SNS to use the key for encryption",
"Effect": "Allow",
"Principal": {
"Service": "sns.amazonaws.com"
},
"Action": [
"kms:GenerateDataKey",
"kms:Decrypt"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"AWS:SourceAccount": "123456789012"
},
"ArnLike": {
"AWS:SourceArn": "arn:aws:sns:us-east-1:123456789012:*"
}
}
}
]
}
c. 补充传输加密
尽管SNS默认使用HTTPS,但为确保合规性,应在主题策略中显式要求TLS:
json
{
"Version": "2008-10-17",
"Id": "__default_policy_ID",
"Statement": [
{
"Sid": "AllowPublishFromAuthorizedUsers",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/HospitalDoctorRole"
},
"Action": "SNS:Publish",
"Resource": "arn:aws:sns:us-east-1:123456789012:patient-symptoms-topic",
"Condition": {
"Bool": {
"aws:SecureTransport": "true"
}
}
}
]
}
2. Amazon SQS安全配置
实施步骤:
a. 启用服务器端加密使用KMS CMK
bash
# 创建SQS队列并启用加密
aws sqs create-queue \
--queue-name patient-symptoms-queue \
--attributes '{
"KmsMasterKeyId": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-56ef-78gh-90ij-1234567890kl",
"KmsDataKeyReusePeriodSeconds": "300"
}'
b. 配置密钥策略限制访问
与SNS类似,需要为SQS的加密密钥设置严格的访问策略:
json
{
"Version": "2012-10-17",
"Id": "hospital-sqs-key-policy",
"Statement": [
{
"Sid": "Allow key usage only for hospital applications",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/SymptomsAppRole"
},
"Action": [
"kms:Decrypt",
"kms:GenerateDataKey"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"kms:EncryptionContext:aws:sqs:arn":
"arn:aws:sqs:us-east-1:123456789012:patient-symptoms-queue"
}
}
}
]
}
c. 强制TLS传输加密
在队列策略中明确要求所有连接必须使用TLS:
json
{
"Version": "2012-10-17",
"Id": "HospitalQueuePolicy",
"Statement": [
{
"Sid": "EnforceTLS",
"Effect": "Deny",
"Principal": "*",
"Action": "SQS:*",
"Resource": "arn:aws:sqs:us-east-1:123456789012:patient-symptoms-queue",
"Condition": {
"Bool": {
"aws:SecureTransport": "false"
}
}
},
{
"Sid": "AllowAuthorizedHospitalStaff",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::123456789012:role/HospitalStaffRole",
"arn:aws:iam::123456789012:role/SymptomsProcessor"
]
},
"Action": [
"SQS:SendMessage",
"SQS:ReceiveMessage",
"SQS:DeleteMessage"
],
"Resource": "arn:aws:sqs:us-east-1:123456789012:patient-symptoms-queue"
}
]
}
完整架构设计与工作流程
1. 系统架构图
患者设备 → (HTTPS/TLS) → 应用程序服务器 → (HTTPS/TLS + KMS加密) → SNS主题
↓
(HTTPS/TLS + KMS加密)
↓
SQS队列 → (HTTPS/TLS) → 医院后端系统
2. 端到端安全流程
步骤1:数据收集与发布
- 患者通过移动应用提交症状数据
- 应用通过HTTPS/TLS将数据发送到应用程序服务器
- 服务器使用授权IAM角色向SNS发布消息
- SNS使用KMS CMK自动加密消息内容
- 只有具有解密权限的授权主体才能访问数据
步骤2:消息处理与消费
- SQS队列订阅SNS主题,接收加密消息
- 医院后端系统通过HTTPS/TLS从SQS队列获取消息
- 系统使用授权IAM角色,通过KMS解密消息
- 解密后的数据仅在内存中处理,不持久化存储明文
3. 密钥管理与轮换策略
yaml
KMS密钥管理策略:
- 密钥类型:客户管理密钥(CMK)
- 轮换频率:每年自动轮换一次
- 备份策略:通过AWS Backup服务定期备份
- 监控审计:通过CloudTrail记录所有密钥使用事件
- 访问评审:每季度审查密钥策略和IAM权限
合规性与审计考量
HIPAA合规性措施
-
技术保护措施:
- 静态加密:KMS FIPS 140-2验证的加密模块
- 传输加密:TLS 1.2+协议
- 访问控制:基于角色的最小权限访问
-
审计跟踪:
bash# 通过AWS CloudTrail监控所有访问 aws cloudtrail lookup-events \ --lookup-attributes AttributeKey=EventName,AttributeValue=Decrypt \ --start-time "2024-01-01T00:00:00Z" \ --end-time "2024-01-31T23:59:59Z" -
数据完整性保障:
- SQS和SNS提供消息完整性验证
- KMS确保加密操作的完整性
- 所有操作均有不可否认的审计日志
成本优化与扩展性考虑
成本优化策略
- KMS密钥共享:为SNS和SQS使用相同的KMS CMK以减少成本
- 数据密钥缓存:配置适当的KMS数据密钥重用期(300秒)
- 队列类型选择:根据吞吐量需求选择标准队列或FIFO队列
扩展性设计
- 多区域部署:使用KMS多区域密钥支持跨区域灾难恢复
- 自动扩展:基于CloudWatch指标自动调整SQS可见性超时
- 监控告警:设置加密失败或未授权访问尝试的告警
总结
通过实施这样的组合解决方案,医院症状收集应用能够实现:
- 全面的静态加密:使用KMS客户管理密钥加密所有存储数据
- 强制传输加密:通过策略条件要求所有连接使用TLS
- 精细访问控制:通过密钥策略确保只有授权医院人员可以访问数据
- 合规性保障:满足HIPAA等医疗法规要求
- 可审计性:所有操作均有完整日志记录