Làm việc với Chính sách Khóa (Key Policies)

Làm việc với Chính sách Khóa (Key Policies)

Key policies đóng vai trò quan trọng trong việc kiểm soát Ai được phép Làm gì với CMK của bạn.

Hiện tại IAM role KMSWorkshop-InstanceInitRole cho phép Instance thực hiện nhiều tác vụ với AWS KMS. Tuy nhiên theo best practice Least PrivilegeSeparation of Duties, nhằm đảm bảo bảo mật Instance chỉ nên có quyền upload file lên S3 với Server Side Encryption, và không nên có quyền decrypt và download file từ S3. Quyền DecryptDownload file nên được gán cho một Instance khác với những quy định về bảo mật chặt chẽ hơn. Để đáp ứng các yêu cầu này chúng ta dựa vào 2 yếu tố chính đó là:

  • Các IAM role và các policies của chúng giúp kiểm soát quyền truy cập vào CMK.
  • Key policies giúp kiểm soát quyền truy cập vào khóa CMK và chúng ta có thể điều chỉnh theo yêu cầu của chúng ta.

Mỗi khóa CMK được khởi tạo bởi AWS KMS đều có một policy khởi tạo ban đầu. Chạy lệnh dưới đây để để kiểm tra policy khởi tạo ban đầu gán cho CMK có alias ImportedCMK

aws kms get-key-policy --key-id <key ID of the CMK whose alias is ImportedCMK> --policy-name default

Key Policies

Mặc định, policy khởi tạo ban đầu của CMK chỉ cho phép chủ sở hữu là AWS account (root user) có quyền full access đối với CMK. Có 2 lợi ích từ chính sách khởi tạo ban đầu này đó là:

  • Giảm thiểu rủi ro trong trường hợp mất quyền quản lý CMK do bạn không thể tự xóa bỏ AWS account (root user)
  • Có thể bật các chính sách IAM để cho phép thao tác với CMK. Cụ thể, tạo các chính sách IAM cho phép IAM User hoặc IAM Role được quyền thao tác với CMK.
Chúng ta sẽ cùng chỉnh sửa lại Role đang được gán cho Instance. Role sẽ chỉ cho phép Instance được Encrypt mà không được quyền Decrypt với KMS.
  1. Truy cập vào giao diện quản trị dịch vụ IAM.
  • Click Roles.
  • Click KMSWorkshop-InstanceInitRole. Key Policies
  1. Trong phần Permissions policies
  • Click KMSWorkshop-AdditionalPermissions Key Policies
  1. Tại trang Summary
  • Click Edit policy Key Policies
  1. Tại trang **Edit KMSWorkshop-AdditionalPermissions **
  • Click KMS
  • Click Actions
  • Trong phần Actions, nhập Decrypt vào ô tìm kiếm
  • Bỏ chọn Decrypt
  • Click Review policy Key Policies
  1. Trong phần Review policy
  • Click Save changes Key Policies
  1. Chạy lệnh dưới đây để thực hiện start Web App
sudo python WebAppEncSSE.py 80
  • Nhập Key Id của CMK có alias là ImportedCMK chúng ta đã lưu trong phần 5.2 Key Policies
  1. Truy cập Web App thông qua địa chỉ Public IP http://54.221.111.102 của KMSWorkshop-Instance Key Policies
  2. Để xem trực tiếp nội dung file SampleFile-KMS.txt click S3//SampleFile-KMS.txt Key Policies
  • Chúng ta sẽ thấy Web App sẽ không đáp ứng lại yêu cầu Key Policies
  1. Kiểm tra log chúng ta sẽ thấy xuất hiện lỗi. Nguyên nhân do Instance đã bị tước quyền decrypt và không thể generate ra file dạng readable. Key Policies
Giới hạn khóa chỉ được sử dụng trong tài khoản của mình.

Với Role hiện tại, Instance có thể Encrypt dữ liệu tải lên S3 nhưng không thể Decrypt dữ liệu tải xuống. Để bảo mật hơn nữa, ta áp dụng chính sách khóa Key policy để giới hạn khả năng encrypt, chỉ cấp quyền thực hiện cho chính account của chúng ta mà không cho phép bất cứ Cross-Account Role nào có quyền thực hiện.

  1. Truy cập vào giao diện quản trị dịch vụ IAM.
  • Click Roles.
  • Click KMSWorkshop-InstanceInitRole. Key Policies
  1. Tại trang Summary
  • Sao chép ARN Key Policies
  1. Để thay đổi Key Policy của ImportedCMK chúng ta truy cập KMS Console
  • Click Customer managed keys
  • Click ImportedCMK Key Policies
  1. Trong phần Key policy
  • Click Edit Key Policies
  1. Trong phần Key policy
  • Dán
{
"Version": "2012-10-17",
"Id": "key-default-1",
"Statement": [
    {
    "Sid": "Enable IAM User Permissions",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::<your acount id>:root"
    },
    "Action": "kms:*",
    "Resource": "*"
    },
    {
    "Sid": "Allow for Use only within our Account",
    "Effect": "Allow",
    "Principal": {
        "AWS": "<the ARN we copied in the step 11>"
    },
    "Action": "kms:*",
    "Resource": "*",
    "Condition": {
        "StringEquals": {
        "kms:CallerAccount": "<your acount id>"
        }
    }
    }
]
}
  • Click Save changes Key Policies
Giới hạn khóa chỉ được sử dụng cho Role chỉ định.

Đây là một trong những kiểu chính sách khóa phổ biến hay được áp dụng, đảm bảo chỉ những Instance được gán với Role đã được chỉ định mới có khả năng sử dụng khóa.

  1. Làm tương tự phần giới hạn khóa chỉ được sử dụng trong tài khoản của mình nhưng thay thế nội dung Key policy CMK bằng nội dung bên dưới
{
  "Version": "2012-10-17",
  "Id": "key-default-1",
  "Statement": [
    {
      "Sid": "Enable IAM User Permissions",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<your acount id>:root"
      },
      "Action": "kms:*",
      "Resource": "*"
    },
    {
      "Sid": "Allow for Use only within our Account",
      "Effect": "Deny",
      "NotPrincipal": { 
        "AWS": [ "arn:aws:iam::<your acount id>:role/KMSWorkshop-InstanceInitRole", "arn:aws:iam::<your acount id>:root"]
      },
      "Action": "kms:*",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "kms:CallerAccount": "<your acount id>"
        }
      }
    }
  ]
}
Giới hạn khóa chỉ được sử dụng với điều kiện được thêm vào.

Bạn có thể thêm các điều kiện đối vào nội dung của Chính sách Khóa, giúp tinh chỉnh quyền sử dụng Khóa và sự liên kết đến một số tham số khác.

  1. Bổ sung nội dung policy với điều kiện liên quan tới MFA, yêu cầu User muốn sử dụng CMK thì phải vượt qua MFA process.
{
  "Version": "2012-10-17",
  "Id": "key-default-1",
  "Statement": [
    {
      "Sid": "Enable IAM User Permissions",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<your acount id>:root"
      },
      "Action": "kms:*",
      "Resource": "*"
    },
    {
      "Sid": "Allow for Use only within our Account",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::<your acount id>:user/userA"
        ]
      },
      "Action": [
        "kms:DeleteAlias",
        "kms:DeleteImportedKeyMaterial",
        "kms:PutKeyPolicy",
        "kms:ScheduleKeyDeletion"
      ],
      "Resource": "*",
      "Condition": {
        "NumericLessThan": {
          "aws: MultiFactorAuthAge": "300"
        }
      }
    }
  ]
}