cfn/ESDK-Hierarchy-CI.yaml (505 lines of code) (raw):
AWSTemplateFormatVersion: "2010-09-09"
Description: "DDB Table and IAM Managed Policies/Role for AWS KMS Hierarchical Keyring Testing"
Parameters:
TableName:
Type: String
Description: Test Table Name
Default: HierarchicalKeyringTestTable
KeyStoreTable:
Type: String
Description: Key Store Test Table Name
Default: KeyStoreTestTable
KeyStoreDdbTable:
Type: String
Description: Key Store DynamoDB Table Name
Default: KeyStoreDdbTable
KeyStoreStaticTable:
Type: String
Description: Key Store Static Table Name
Default: KeyStoreStaticTable
ProjectName:
Type: String
Description: A prefix that will be applied to any names
# This must remain ESDK-Dafny, or several GHWs will break
Default: ESDK-Dafny
GitHubRepo:
Type: String
Description: GitHub Repo that invokes CI
Default: aws/private-aws-encryption-sdk-dafny-staging
Resources:
KeyStoreTestTable:
Type: AWS::DynamoDB::Table
Properties:
AttributeDefinitions:
- AttributeName: "branch-key-id"
AttributeType: "S"
- AttributeName: "type"
AttributeType: "S"
- AttributeName: "status"
AttributeType: "S"
BillingMode: PAY_PER_REQUEST
KeySchema:
- AttributeName: "branch-key-id"
KeyType: "HASH"
- AttributeName: "type"
KeyType: "RANGE"
TableName: !Ref KeyStoreTable
GlobalSecondaryIndexes:
- IndexName: !Sub "Active-Keys"
KeySchema:
- AttributeName: "branch-key-id"
KeyType: "HASH"
- AttributeName: "status"
KeyType: "RANGE"
Projection:
ProjectionType: "ALL"
- IndexName: !Sub "Active-Keys-KeyStoreTestTable"
KeySchema:
- AttributeName: "branch-key-id"
KeyType: "HASH"
- AttributeName: "status"
KeyType: "RANGE"
Projection:
ProjectionType: "ALL"
KeyStoreTestDdbTable:
Type: AWS::DynamoDB::Table
Properties:
AttributeDefinitions:
- AttributeName: "branch-key-id"
AttributeType: "S"
- AttributeName: "type"
AttributeType: "S"
BillingMode: PAY_PER_REQUEST
KeySchema:
- AttributeName: "branch-key-id"
KeyType: "HASH"
- AttributeName: "type"
KeyType: "RANGE"
TableName: !Ref KeyStoreDdbTable
HierarchicalKeyringTestTable:
Type: AWS::DynamoDB::Table
Properties:
AttributeDefinitions:
- AttributeName: "branch-key-id"
AttributeType: "S"
- AttributeName: "version"
AttributeType: "S"
- AttributeName: "status"
AttributeType: "S"
BillingMode: PAY_PER_REQUEST
KeySchema:
- AttributeName: "branch-key-id"
KeyType: "HASH"
- AttributeName: "version"
KeyType: "RANGE"
TableName: !Ref TableName
GlobalSecondaryIndexes:
- IndexName: "Active-Keys"
KeySchema:
- AttributeName: "status"
KeyType: "HASH"
- AttributeName: "branch-key-id"
KeyType: "RANGE"
Projection:
ProjectionType: "ALL"
# Static Key Store table for storing static branch keys
KeyStoreTestStaticTable:
Type: AWS::DynamoDB::Table
Properties:
AttributeDefinitions:
- AttributeName: "branch-key-id"
AttributeType: "S"
- AttributeName: "type"
AttributeType: "S"
BillingMode: PAY_PER_REQUEST
KeySchema:
- AttributeName: "branch-key-id"
KeyType: "HASH"
- AttributeName: "type"
KeyType: "RANGE"
TableName: !Ref KeyStoreStaticTable
StaticKeyStoreTableReadOnly:
Type: "AWS::IAM::ManagedPolicy"
Properties:
Description: "Allow Read-Only access to Static Key Store Table"
ManagedPolicyName: !Sub "${ProjectName}-DDB-${KeyStoreStaticTable}-ReadOnly-${AWS::Region}"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- dynamodb:DescribeTable
- dynamodb:GetItem
- dynamodb:Query
- dynamodb:BatchGetItem
- dynamodb:Scan
Resource:
- !Sub "arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/${KeyStoreStaticTable}"
- !Sub "arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/${KeyStoreStaticTable}/index/*"
# This policy SHOULD be given to:
# - aws/private-aws-encryption-sdk-dafny-staging
# - ToolsDevelopment
HierarchicalKeyringTestTableUsage:
Type: "AWS::IAM::ManagedPolicy"
Properties:
Description: "Allow Read, Write, and Delete of Items in HierarchicalKeyringTestTable"
ManagedPolicyName: !Sub "${ProjectName}-DDB-ReadWriteDelete-${AWS::Region}"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- dynamodb:DescribeTable
- dynamodb:CreateTable
- dynamodb:PutItem
- dynamodb:DeleteItem
- dynamodb:GetItem
- dynamodb:Query
- dynamodb:ConditionCheckItem
- dynamodb:UpdateItem
- dynamodb:BatchGetItem
- dynamodb:Scan
Resource:
- !Sub "arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/${KeyStoreDdbTable}"
- !Sub "arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/${KeyStoreDdbTable}/index/*"
- !Sub "arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/${KeyStoreTestTable}"
- !Sub "arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/${KeyStoreTestTable}/index/*"
- !Sub "arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/${HierarchicalKeyringTestTable}"
- !Sub "arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/${HierarchicalKeyringTestTable}/index/*"
HierarchicalGitHubKMSKeyID:
Type: "AWS::KMS::Key"
Properties:
Description: KMS Key for GitHub Action Workflow
Enabled: true
KeyPolicy:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
Action: "kms:*"
Resource: "*"
HierarchicalGitHubKMSKeyIDTwo:
Type: "AWS::KMS::Key"
Properties:
Description: Another KMS Key for GitHub Action Workflow
Enabled: true
KeyPolicy:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
Action: "kms:*"
Resource: "*"
KmsKeyForHV1ReEncryptStrategy:
Type: "AWS::KMS::Key"
Properties:
Description: KMS Key for GitHub Action Workflow for HV1 Only Branch Keys
Enabled: true
KeyPolicy:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
Action: "kms:*"
Resource: "*"
KmsKeyForHV2Only:
Type: "AWS::KMS::Key"
Properties:
Description: KMS Key for GitHub Action Workflow for HV2 Only Branch Keys
Enabled: true
KeyPolicy:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
Action: "kms:*"
Resource: "*"
KeyStoreAdminSystemKeyKmsSymEnc:
Type: "AWS::KMS::Key"
Properties:
Description: KMS Key for System Key
Enabled: true
KeyPolicy:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
Action: "kms:*"
Resource: "*"
EccP256:
Type: "AWS::KMS::Key"
Properties:
Description: ECC Key with P-256
KeySpec: ECC_NIST_P256
KeyUsage: SIGN_VERIFY
KeyPolicy:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
Action: "kms:*"
Resource: "*"
EccP384:
Type: "AWS::KMS::Key"
Properties:
Description: ECC Key with P-384
KeySpec: ECC_NIST_P384
KeyUsage: SIGN_VERIFY
KeyPolicy:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
Action: "kms:*"
Resource: "*"
EccP521:
Type: "AWS::KMS::Key"
Properties:
Description: ECC Key with P-521
KeySpec: ECC_NIST_P521
KeyUsage: SIGN_VERIFY
KeyPolicy:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
Action: "kms:*"
Resource: "*"
KMSUsage:
Type: "AWS::IAM::ManagedPolicy"
Properties:
PolicyDocument: !Sub |
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"kms:Decrypt",
"kms:Encrypt",
"kms:GenerateDataKey",
"kms:GenerateDataKeyWithoutPlaintext",
"kms:ReEncrypt*",
"kms:DescribeKey",
"kms:CreateGrant",
"kms:ListGrant",
"kms:RevokeGrant"
],
"Resource": [
"arn:aws:kms:*:${AWS::AccountId}:key/${HierarchicalGitHubKMSKeyID}",
"arn:aws:kms:*:${AWS::AccountId}:key/${HierarchicalGitHubKMSKeyIDTwo}"
]
},
{
"Effect": "Allow",
"Action": [
"kms:ReEncrypt*",
"kms:GenerateDataKeyWithoutPlaintext",
"kms:Decrypt"
],
"Resource": [
"arn:aws:kms:*:${AWS::AccountId}:key/${KmsKeyForHV1ReEncryptStrategy}"
]
},
{
"Effect": "Allow",
"Action": [
"kms:Decrypt",
"kms:Encrypt",
"kms:GenerateDataKey"
],
"Resource": [
"arn:aws:kms:*:${AWS::AccountId}:key/${KeyStoreAdminSystemKeyKmsSymEnc}",
"arn:aws:kms:*:${AWS::AccountId}:key/${KmsKeyForHV2Only}"
]
},
{
"Effect": "Allow",
"Action": [
"kms:*"
],
"Resource": [
"arn:aws:kms:*:${AWS::AccountId}:key/${EccP256}",
"arn:aws:kms:*:${AWS::AccountId}:key/${EccP384}",
"arn:aws:kms:*:${AWS::AccountId}:key/${EccP521}"
]
},
{
"Effect": "Allow",
"Action": [
"kms:GenerateRandom"
],
"Resource": [
"*"
]
}
]
}
ManagedPolicyName: Hierarchical-GitHub-KMS-Key-Policy
RSAGitHubKMSKeyID:
Type: "AWS::KMS::Key"
Properties:
Description: KMS RSA Key for GitHub Action Workflow
Enabled: true
KeyPolicy:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
Action: "kms:*"
Resource: "*"
KeySpec: "RSA_2048"
KeyUsage: "ENCRYPT_DECRYPT"
MultiRegion: true
RSAKMSUsage:
Type: "AWS::IAM::ManagedPolicy"
Properties:
PolicyDocument: !Sub |
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:Generate*",
"kms:GetPublicKey",
"kms:DescribeKey"
],
"Resource": "arn:aws:kms:*:${AWS::AccountId}:key/${RSAGitHubKMSKeyID}"
}
]
}
ManagedPolicyName: RSA-GitHub-KMS-Key-Policy
# The MPL-Dafny Repo get access to everything here
# via the CI.yaml#GitHubCIRole
GitHubCIRole:
Type: "AWS::IAM::Role"
Properties:
RoleName: !Sub "GitHub-CI-${ProjectName}-Role-${AWS::Region}"
Description: "Access DDB, KMS, Resources for CI from GitHub"
ManagedPolicyArns:
- "arn:aws:iam::370957321024:policy/KMS-Public-CMK-EncryptDecrypt-Key-Access"
- "arn:aws:iam::370957321024:policy/Github-ECDH-KMS"
- "arn:aws:iam::370957321024:policy/PolymorphTestModels-KMS-us-west-2"
- !Ref KMSUsage
- !Ref RSAKMSUsage
- "arn:aws:iam::370957321024:policy/PolymorphTestModels-DDB-ReadWriteDelete-us-west-2"
- !Ref HierarchicalKeyringTestTableUsage
- !Ref StaticKeyStoreTableReadOnly
AssumeRolePolicyDocument: !Sub |
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Federated": "arn:aws:iam::${AWS::AccountId}:oidc-provider/token.actions.githubusercontent.com" },
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
},
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:${GitHubRepo}:*"
}
}
},
{
"Effect": "Allow",
"Principal": { "AWS": "arn:aws:iam::${AWS::AccountId}:role/ToolsDevelopment" },
"Action": "sts:AssumeRole"
}
]
}
RestrictedKMSHKeyOneOnly:
Type: "AWS::IAM::Role"
Properties:
RoleName: !Sub "Restricted-KMS-HKey-One-Only"
Description: "Restricted to only KMS Key One"
Policies:
- PolicyName: root
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- "kms:CreateGrant"
- "kms:Decrypt"
- "kms:DescribeKey"
- "kms:Encrypt"
- "kms:GenerateDataKeyWithoutPlaintext"
- "kms:ListGrant"
- "kms:RevokeGrant"
Resource: !Sub "arn:aws:kms:*:${AWS::AccountId}:key/${HierarchicalGitHubKMSKeyID}"
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Federated: !Sub "arn:aws:iam::${AWS::AccountId}:oidc-provider/token.actions.githubusercontent.com"
Action: "sts:AssumeRoleWithWebIdentity"
Condition:
StringEquals:
token.actions.githubusercontent.com:aud: "sts.amazonaws.com"
StringLike:
token.actions.githubusercontent.com:sub:
- "repo:aws/private-aws-encryption-sdk-dafny-staging:*"
- "repo:aws/aws-encryption-sdk-dafny:*"
- "repo:aws/aws-cryptographic-material-providers-library:*"
- "repo:aws/private-aws-cryptographic-material-providers-library-dafny-staging:*"
- Effect: Allow
Principal:
AWS:
- !Sub "arn:aws:iam::${AWS::AccountId}:role/ToolsDevelopment"
- "arn:aws:iam::648638458147:role/AVP-14101"
- !GetAtt GitHubCIRole.Arn
- "arn:aws:iam::370957321024:role/GitHub-CI-MPL-Dafny-Role-us-west-2"
Action: "sts:AssumeRole"
RestrictedKMSHKeyTwoOnly:
Type: "AWS::IAM::Role"
Properties:
RoleName: !Sub "Restricted-KMS-HKey-Two-Only"
Description: "Restricted to only KMS Key Two"
Policies:
- PolicyName: root
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- "kms:CreateGrant"
- "kms:Decrypt"
- "kms:DescribeKey"
- "kms:Encrypt"
- "kms:GenerateDataKeyWithoutPlaintext"
- "kms:ListGrant"
- "kms:RevokeGrant"
Resource: !Sub "arn:aws:kms:*:${AWS::AccountId}:key/${HierarchicalGitHubKMSKeyIDTwo}"
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Federated: !Sub "arn:aws:iam::${AWS::AccountId}:oidc-provider/token.actions.githubusercontent.com"
Action: "sts:AssumeRoleWithWebIdentity"
Condition:
StringEquals:
token.actions.githubusercontent.com:aud: "sts.amazonaws.com"
StringLike:
token.actions.githubusercontent.com:sub:
- "repo:aws/private-aws-encryption-sdk-dafny-staging:*"
- "repo:aws/aws-encryption-sdk-dafny:*"
- "repo:aws/aws-cryptographic-material-providers-library:*"
- "repo:aws/private-aws-cryptographic-material-providers-library-dafny-staging:*"
- Effect: Allow
Principal:
AWS:
- !Sub "arn:aws:iam::${AWS::AccountId}:role/ToolsDevelopment"
- "arn:aws:iam::648638458147:role/AVP-14101"
- !GetAtt GitHubCIRole.Arn
- "arn:aws:iam::370957321024:role/GitHub-CI-MPL-Dafny-Role-us-west-2"
Action: "sts:AssumeRole"