在医疗保健应用中,保护患者数据的机密性和完整性至关重要。通常会要求确保数据在静态(存储时)和传输中(移动时)加密,并且只有授权人员可以访问。架构中可以使用 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)

# 创建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密钥的核心机制。对于医疗数据,必须实施最严格的访问控制:

{
"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:

{
"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

# 创建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的加密密钥设置严格的访问策略:

{
"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:

{
"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:数据收集与发布

  1. 患者通过移动应用提交症状数据
  2. 应用通过HTTPS/TLS将数据发送到应用程序服务器
  3. 服务器使用授权IAM角色向SNS发布消息
  4. SNS使用KMS CMK自动加密消息内容
  5. 只有具有解密权限的授权主体才能访问数据

步骤2:消息处理与消费

  1. SQS队列订阅SNS主题,接收加密消息
  2. 医院后端系统通过HTTPS/TLS从SQS队列获取消息
  3. 系统使用授权IAM角色,通过KMS解密消息
  4. 解密后的数据仅在内存中处理,不持久化存储明文

3. 密钥管理与轮换策略

KMS密钥管理策略:
- 密钥类型:客户管理密钥(CMK)
- 轮换频率:每年自动轮换一次
- 备份策略:通过AWS Backup服务定期备份
- 监控审计:通过CloudTrail记录所有密钥使用事件
- 访问评审:每季度审查密钥策略和IAM权限

合规性与审计考量

HIPAA合规性措施

  1. 技术保护措施

    • 静态加密:KMS FIPS 140-2验证的加密模块
    • 传输加密:TLS 1.2+协议
    • 访问控制:基于角色的最小权限访问
  2. 审计跟踪

    # 通过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"
  3. 数据完整性保障

    • SQS和SNS提供消息完整性验证
    • KMS确保加密操作的完整性
    • 所有操作均有不可否认的审计日志

成本优化与扩展性考虑

成本优化策略

  1. KMS密钥共享:为SNS和SQS使用相同的KMS CMK以减少成本
  2. 数据密钥缓存:配置适当的KMS数据密钥重用期(300秒)
  3. 队列类型选择:根据吞吐量需求选择标准队列或FIFO队列

扩展性设计

  1. 多区域部署:使用KMS多区域密钥支持跨区域灾难恢复
  2. 自动扩展:基于CloudWatch指标自动调整SQS可见性超时
  3. 监控告警:设置加密失败或未授权访问尝试的告警

总结

通过实施这样的组合解决方案,医院症状收集应用能够实现:

  1. 全面的静态加密:使用KMS客户管理密钥加密所有存储数据
  2. 强制传输加密:通过策略条件要求所有连接使用TLS
  3. 精细访问控制:通过密钥策略确保只有授权医院人员可以访问数据
  4. 合规性保障:满足HIPAA等医疗法规要求
  5. 可审计性:所有操作均有完整日志记录