Skip to content

Instantly share code, notes, and snippets.

@hisashiyamaguchi
Created October 26, 2023 04:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hisashiyamaguchi/9075a21be5d954bc48eb15cbcd2a02b3 to your computer and use it in GitHub Desktop.
Save hisashiyamaguchi/9075a21be5d954bc48eb15cbcd2a02b3 to your computer and use it in GitHub Desktop.
{
"AWSTemplateFormatVersion": "2010-09-09",
"Outputs": {
"OrcaRoleArn": {
"Value": {
"Fn::GetAtt": [
"OrcaSecurityRole",
"Arn"
]
}
}
},
"Parameters": {
"ExternalId": {
"Type": "String"
},
"SecretManagerAccess": {
"Type": "String",
"Default": "true",
"AllowedValues": [
"true",
"false"
]
},
"DeployRdsScanner": {
"Type": "String",
"Default": "true",
"AllowedValues": [
"true",
"false"
]
}
},
"Conditions": {
"SecretManagerAccessAllowed": {
"Fn::Equals": [
{
"Ref": "SecretManagerAccess"
},
"true"
]
},
"DeployRdsScanner": {
"Fn::Equals": [
{
"Ref": "DeployRdsScanner"
},
"true"
]
}
},
"Resources": {
"OrcaSecurityPolicy": {
"Type": "AWS::IAM::ManagedPolicy",
"Properties": {
"Description": "Orca Security Account Policy",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": [
"ec2:CreateTags"
],
"Resource": "arn:aws:ec2:*::snapshot/*",
"Condition": {
"ForAnyValue:StringEquals": {
"aws:TagKeys": [
"Orca"
]
},
"StringEquals": {
"ec2:CreateAction": [
"CreateSnapshot",
"CreateSnapshots",
"CopySnapshot"
]
}
}
},
{
"Effect": "Deny",
"Action": [
"ec2:DeleteSnapshot"
],
"Resource": "*",
"Condition": {
"StringLike": {
"ec2:ResourceTag/Orca": "*"
},
"StringNotLikeIfExists": {
"ec2:ResourceTag/OrcaOptOut": "*"
}
}
},
{
"Effect": "Deny",
"Action": [
"ec2:CreateSnapshots",
"ec2:CreateSnapshot",
"ec2:CopySnapshot",
"ec2:ModifySnapshotAttribute"
],
"Resource": "*",
"Condition": {
"StringNotLikeIfExists": {
"ec2:ResourceTag/OrcaOptOut": "*"
}
}
},
{
"Effect": "Deny",
"Action": [
"kms:ReEncryptFrom",
"kms:ReEncryptTo",
"kms:Encrypt",
"kms:Decrypt",
"kms:GenerateDataKeyWithoutPlaintext",
"kms:CreateGrant"
],
"Resource": "*",
"Condition": {
"StringNotLikeIfExists": {
"aws:ResourceTag/OrcaOptOut": "*"
},
"StringLike": {
"kms:ViaService": "ec2.*.amazonaws.com"
}
}
},
{
"Effect": "Deny",
"Action": [
"kms:PutKeyPolicy"
],
"Resource": "*",
"Condition": {
"StringNotLikeIfExists": {
"aws:ResourceTag/OrcaOptOut": "*"
}
}
}
]
}
}
},
"OrcaSecuritySecretsManagerPolicy": {
"Type": "AWS::IAM::ManagedPolicy",
"Condition": "SecretManagerAccessAllowed",
"Properties": {
"Description": "Orca Security Secrets Manager Policy",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": [
"secretsmanager:GetSecretValue"
],
"Resource": "arn:aws:secretsmanager:*:*:secret:*",
"Condition": {
"StringLike": {
"secretsmanager:ResourceTag/Orca": "SecretAccess"
}
}
},
{
"Effect": "Deny",
"Action": [
"kms:Decrypt"
],
"Resource": "*",
"Condition": {
"StringLike": {
"aws:ResourceTag/Orca": "SecretAccess",
"kms:ViaService": [
"secretsmanager.*.amazonaws.com"
]
}
}
}
]
}
}
},
"OrcaSecurityViewOnlyExtrasPolicy": {
"Type": "AWS::IAM::ManagedPolicy",
"Properties": {
"Description": "Orca Security Extras For View Only Policy",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"access-analyzer:ListAnalyzers",
"acm:DescribeCertificate",
"acm:GetCertificate",
"apigateway:GET",
"application-autoscaling:Describe*",
"appsync:Get*",
"appsync:List*",
"autoscaling-plans:Describe*",
"backup:Get*",
"backup:List*",
"cassandra:Select",
"cloudfront:Get*",
"cloudhsm:DescribeClusters",
"cloudtrail:Describe*",
"cloudtrail:Get*",
"cloudtrail:List*",
"cloudwatch:Describe*",
"codebuild:BatchGet*",
"codebuild:List*",
"codecommit:GetRepository",
"codepipeline:GetPipeline",
"config:Get*",
"dlm:Get*",
"dms:Describe*",
"dynamodb:Describe*",
"dynamodb:List*",
"ec2:Describe*",
"ec2:GetEbsEncryptionByDefault",
"ec2:List*",
"ec2:SearchTransitGatewayRoutes",
"ecr:BatchGetImage",
"ecr:Describe*",
"ecr:Get*",
"ecr:List*",
"eks:Describe*",
"eks:List*",
"elasticache:Describe*",
"elasticfilesystem:Describe*",
"elasticfilesystem:List*",
"elasticloadbalancing:Describe*",
"elasticmapreduce:DescribeSecurityConfiguration",
"elasticmapreduce:DescribeCluster",
"es:Describe*",
"es:List*",
"events:List*",
"glacier:Describe*",
"glacier:Get*",
"globalaccelerator:List*",
"glue:GetDataCatalogEncryptionSettings",
"glue:GetDatabases",
"glue:GetDevEndpoints",
"glue:GetResourcePolicy",
"glue:GetSecurityConfigurations",
"guardduty:Get*",
"guardduty:List*",
"iam:Generate*",
"iam:Get*",
"iam:Simulate*",
"kafka:Describe*",
"kafka:List*",
"kinesis:DescribeStream",
"kms:Describe*",
"kms:Get*",
"kms:List*",
"lakeformation:GetDataLakeSettings",
"lakeformation:GetEffectivePermissionsForPath",
"lakeformation:ListResources",
"lambda:Get*",
"logs:FilterLogEvents",
"logs:Get*",
"logs:ListTagsLogGroup",
"logs:StartQuery",
"logs:TestMetricFilter",
"memorydb:Describe*",
"memorydb:List*",
"mq:Describe*",
"mq:List*",
"network-firewall:List*",
"network-firewall:Describe*",
"organizations:Describe*",
"qldb:DescribeLedger",
"qldb:ListLedgers",
"rds:List*",
"redshift:Describe*",
"resource-groups:Get*",
"resource-groups:List*",
"resource-groups:Search*",
"route53:Test*",
"route53domains:Check*",
"route53domains:Get*",
"route53domains:View*",
"s3:Get*",
"s3:List*",
"secretsmanager:Describe*",
"secretsmanager:GetResourcePolicy",
"secretsmanager:List*",
"serverlessrepo:Get*",
"serverlessrepo:List*",
"ses:GetIdentityDkimAttributes",
"ses:GetIdentityPolicies",
"ses:GetIdentityVerificationAttributes",
"sns:Get*",
"sqs:GetQueueAttributes",
"sqs:ListQueueTags",
"ssm:Describe*",
"ssm:GetParameter*",
"ssm:GetParametersByPath",
"ssm:List*",
"sso:DescribePermissionSet",
"sso:GetInlinePolicyForPermissionSet",
"sso:ListAccountAssignments",
"sso:ListInstances",
"sso:ListManagedPoliciesInPermissionSet",
"sso:ListPermissionSets",
"states:DescribeStateMachine",
"timestream:ListDatabases",
"identitystore:DescribeGroup",
"identitystore:DescribeUser",
"identitystore:ListGroups",
"identitystore:ListUsers",
"identitystore:ListGroupMemberships",
"tag:Get*",
"waf-regional:Get*",
"waf:Get*"
],
"Resource": "*"
}
]
}
}
},
"OrcaRdsSnapshotCreatePolicy": {
"Type": "AWS::IAM::ManagedPolicy",
"Condition": "DeployRdsScanner",
"Properties": {
"Description": "Orca Security RDS Snapshot Creation Policy",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": [
"rds:AddTagsToResource",
"rds:DeleteDBSnapshot",
"rds:DeleteDBClusterSnapshot"
],
"Resource": [
"arn:aws:rds:*:*:snapshot:*",
"arn:aws:rds:*:*:cluster-snapshot:*"
],
"Condition": {
"StringLike": {
"aws:ResourceTag/Orca": "*"
},
"StringNotLikeIfExists": {
"aws:ResourceTag/OrcaOptOut": "*"
}
}
},
{
"Effect": "Deny",
"Action": [
"rds:CreateDBSnapshot",
"rds:CreateDBClusterSnapshot",
"rds:CopyDBSnapshot",
"rds:CopyDBClusterSnapshot"
],
"Resource": [
"arn:aws:rds:*:*:db:*",
"arn:aws:rds:*:*:cluster:*",
"arn:aws:rds:*:*:snapshot:*",
"arn:aws:rds:*:*:cluster-snapshot:*"
],
"Condition": {
"ForAnyValue:StringEquals": {
"aws:TagKeys": "Orca"
},
"StringNotLikeIfExists": {
"aws:ResourceTag/OrcaOptOut": "*"
}
}
}
]
}
}
},
"OrcaRdsSnapshotReencryptPolicy": {
"Type": "AWS::IAM::ManagedPolicy",
"Condition": "DeployRdsScanner",
"Properties": {
"Description": "Orca Security RDS Snapshot Re-Encryption Policy",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "CreateGrantForDbSnapshotReencryption",
"Effect": "Deny",
"Action": "kms:CreateGrant",
"Resource": "arn:aws:kms:*:*:key/*",
"Condition": {
"ForAllValues:StringLike": {
"kms:GrantOperations": [
"DescribeKey",
"Decrypt",
"Encrypt",
"GenerateDataKeyWithoutPlaintext",
"CreateGrant",
"RetireGrant"
]
},
"Bool": {
"kms:GrantIsForAWSResource": true
},
"StringLike": {
"aws:ResourceAccount": "${aws:PrincipalTag/OrcaScannerAccountId, '*'}"
},
"ForAnyValue:StringLike": {
"kms:ViaService": "rds.*.amazonaws.com"
}
}
},
{
"Sid": "DescribeKeyForDbSnapshotReencryption",
"Effect": "Deny",
"Action": "kms:DescribeKey",
"Resource": "arn:aws:kms:*:*:key/*",
"Condition": {
"StringLike": {
"aws:ResourceAccount": "${aws:PrincipalTag/OrcaScannerAccountId, '*'}"
},
"ForAnyValue:StringLike": {
"kms:ViaService": "rds.*.amazonaws.com"
}
}
},
{
"Sid": "Tag",
"Effect": "Deny",
"Action": "rds:AddTagsToResource",
"Resource": [
"arn:aws:rds:*:*:snapshot:*",
"arn:aws:rds:*:*:cluster-snapshot:*"
],
"Condition": {
"StringLike": {
"aws:ResourceTag/Orca": "*"
},
"StringNotLikeIfExists": {
"aws:ResourceTag/OrcaOptOut": "*"
}
}
},
{
"Sid": "CopyDbSnapshots",
"Effect": "Deny",
"Action": [
"rds:CopyDBSnapshot",
"rds:CopyDBClusterSnapshot"
],
"Resource": [
"arn:aws:rds:*:*:snapshot:*",
"arn:aws:rds:*:*:cluster-snapshot:*"
],
"Condition": {
"ForAnyValue:StringEquals": {
"aws:TagKeys": "Orca"
},
"StringNotLikeIfExists": {
"aws:ResourceTag/OrcaOptOut": "*"
}
}
}
]
}
}
},
"OrcaRdsSnapshotSharePolicy": {
"Type": "AWS::IAM::ManagedPolicy",
"Condition": "DeployRdsScanner",
"Properties": {
"Description": "Orca Security RDS Snapshot Sharing Policy",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ModifyDbSnapshots",
"Effect": "Deny",
"Action": [
"rds:ModifyDBSnapshotAttribute",
"rds:ModifyDBClusterSnapshotAttribute"
],
"Resource": [
"arn:aws:rds:*:*:snapshot:*",
"arn:aws:rds:*:*:cluster-snapshot:*"
],
"Condition": {
"StringLike": {
"aws:ResourceTag/Orca": "*"
},
"StringNotLikeIfExists": {
"aws:ResourceTag/OrcaOptOut": "*"
}
}
}
]
}
}
},
"OrcaSecurityRole": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::976280145156:root"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": {
"Ref": "ExternalId"
}
}
}
}
]
},
"ManagedPolicyArns": {
"Fn::Split": [
",",
{
"Fn::Join": [
"",
[
{
"Fn::Join": [
",",
[
"arn:aws:iam::aws:policy/job-function/ViewOnlyAccess",
{
"Ref": "OrcaSecurityPolicy"
},
{
"Ref": "OrcaSecurityViewOnlyExtrasPolicy"
}
]
]
},
{
"Fn::If": [
"SecretManagerAccessAllowed",
{
"Fn::Sub": [
",${SecretsManagerPolicyArn}",
{
"SecretsManagerPolicyArn": {
"Ref": "OrcaSecuritySecretsManagerPolicy"
}
}
]
},
""
]
},
{
"Fn::If": [
"DeployRdsScanner",
{
"Fn::Sub": [
",${RdsCreateSnapshotPolicyArn},${RdsReencryptSnapshotPolicyArn},${RdsShareSnapshotPolicyArn}",
{
"RdsCreateSnapshotPolicyArn": {
"Ref": "OrcaRdsSnapshotCreatePolicy"
},
"RdsReencryptSnapshotPolicyArn": {
"Ref": "OrcaRdsSnapshotReencryptPolicy"
},
"RdsShareSnapshotPolicyArn": {
"Ref": "OrcaRdsSnapshotSharePolicy"
}
}
]
},
""
]
}
]
]
}
]
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment