1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- #
- # Create an IAM user (and group) to use with GitHub Actions
- #
- ######################
- # Access keys
- #
- # For rotation purposes, there are two of these. Delete the oldest one,
- # add a new one (with a higher version number), and then update the output
- #
- # Possible futue improvement:
- # We could specify a pgp_key attribute, and then the secret will be encrypted
- # in both the state file and in the output. If we used the salt PGP key,
- # no user would ever have to see the secret key.
- resource "aws_iam_access_key" "github-actions-v1" {
- user = aws_iam_user.github-actions.name
- }
- resource "aws_iam_access_key" "github-actions-v2" {
- user = aws_iam_user.github-actions.name
- }
- output "access_keys" {
- value = {
- "current" = {
- "aws_access_key_id" : aws_iam_access_key.github-actions-v2.id
- "aws_secret_access_key" : aws_iam_access_key.github-actions-v2.secret
- },
- "previous" = {
- "aws_access_key_id" : aws_iam_access_key.github-actions-v1.id
- "aws_secret_access_key" : aws_iam_access_key.github-actions-v1.secret
- }
- }
- sensitive = true
- }
- ######################
- # The policy is attached to both the user and the instance profile
- data "aws_iam_policy_document" "github-actions" {
- statement {
- sid = "1"
- actions = [
- "s3:PutObject",
- "s3:GetObject",
- "s3:ListBucketMultipartUploads",
- "kms:Decrypt",
- "s3:AbortMultipartUpload",
- "kms:GenerateDataKey",
- "s3:ListBucket",
- "s3:DeleteObject",
- "s3:ListMultipartUploadParts"
- ]
- resources = [
- aws_kms_key.bucketkey.arn,
- aws_s3_bucket.bucket.arn,
- "${aws_s3_bucket.bucket.arn}/*"
- ]
- }
- }
- resource "aws_iam_policy" "github-actions" {
- name = "github-actions"
- path = "/"
- description = "Policy to allow the github-actions to use the GH Actions S3 bucket and KMS"
- policy = data.aws_iam_policy_document.github-actions.json
- }
- ######################
- # the user
- #
- # Note: CIS requires that policies _NOT_ be directly attached to a user. Users must
- # be members of groups, and those groups can have policies.
- resource "aws_iam_user" "github-actions" {
- name = "github-actions"
- path = "/instance/"
- tags = merge(local.standard_tags, var.tags)
- }
- # tfsec:ignore:aws-iam-enforce-mfa
- resource "aws_iam_group" "github-actions" {
- name = "github-actions"
- path = "/instance/"
- }
- resource "aws_iam_user_group_membership" "github-actions" {
- user = aws_iam_user.github-actions.name
- groups = [aws_iam_group.github-actions.name]
- }
- resource "aws_iam_group_policy_attachment" "github-actions-group" {
- group = aws_iam_group.github-actions.name
- policy_arn = aws_iam_policy.github-actions.arn
- }
|