resource "aws_iam_user" "gsirt_prisma_sqs_user" {
  name = "GSIRT-PRISMA-SQS-USER"
  tags = var.tags
}

resource "aws_iam_access_key" "gsirt_prisma_sqs_user" {
  user = aws_iam_user.gsirt_prisma_sqs_user.name
}

resource "aws_iam_user_policy_attachment" "gsirt_prisma_sqs_user_policy_attachment" {
  user       = aws_iam_user.gsirt_prisma_sqs_user.name
  policy_arn = aws_iam_policy.gsirt_aws_prisma_collection.arn
}

data "aws_iam_policy_document" "gsirt_aws_prisma_collection" {
  statement {
    effect    = "Allow"
    actions   = ["sqs:ListQueues"]
    resources = ["*"]
  }
  statement {
    effect = "Allow"
    actions = [
      "sqs:GetQueueAttributes",
      "sqs:GetQueueUrl",
      "sqs:ReceiveMessage",
      "sqs:DeleteMessage",
    ]
    resources = [
      aws_sqs_queue.prisma_cloud_export_to_gsirt.arn,
      aws_sqs_queue.prisma_cloud_export_to_gsirt_dlq.arn,
    ]
  }
  statement {
    effect    = "Allow"
    actions   = ["kms:Decrypt"]
    resources = [aws_kms_key.prisma_cloud_export_to_gsirt.arn]
  }
}

resource "aws_iam_policy" "gsirt_aws_prisma_collection" {
  name        = "GSIRT_AWS_PRISMA_Collection"
  description = "Allow to read SQS queue used for integration between Prisma Cloud and GSIRT"
  policy      = data.aws_iam_policy_document.gsirt_aws_prisma_collection.json
}

resource "aws_sqs_queue" "prisma_cloud_export_to_gsirt_dlq" {
  name = "gdb-prisma-logs-sqs-dlq"
  tags = var.tags
}

resource "aws_sqs_queue" "prisma_cloud_export_to_gsirt" {
  name                       = "gdb-prisma-logs-sqs"
  visibility_timeout_seconds = 300
  receive_wait_time_seconds  = 20
  kms_master_key_id          = aws_kms_key.prisma_cloud_export_to_gsirt.key_id
  redrive_policy = jsonencode({
    deadLetterTargetArn = aws_sqs_queue.prisma_cloud_export_to_gsirt_dlq.arn
    maxReceiveCount     = 3
  })
  tags = var.tags
}

data "aws_iam_policy_document" "prisma_cloud_export_to_gsirt_key_policy" {
  statement {
    effect    = "Allow"
    actions   = ["kms:*"]
    resources = ["*"]
    principals {
      type = "AWS"
      identifiers = [
        "arn:aws:iam::${local.account_id}:root",
      ]
    }
  }
}

resource "aws_kms_key" "prisma_cloud_export_to_gsirt" {
  description         = "SQS encryption for Prisma Cloud integration with GSIRT"
  enable_key_rotation = true
  policy              = data.aws_iam_policy_document.prisma_cloud_export_to_gsirt_key_policy.json
  tags                = var.tags
}

resource "aws_kms_alias" "prisma_cloud_export_to_gsirt" {
  name          = "alias/sqs-prismacloud"
  target_key_id = aws_kms_key.prisma_cloud_export_to_gsirt.key_id
}

data "aws_iam_policy_document" "prisma_role_sqs_policy" {
  statement {
    effect    = "Allow"
    actions   = ["sqs:ListQueues"]
    resources = ["*"]
  }
  statement {
    effect = "Allow"
    actions = [
      "sqs:GetQueueAttributes",
      "sqs:SendMessage",
      "tag:GetResources",
    ]
    resources = [
      aws_sqs_queue.prisma_cloud_export_to_gsirt.arn,
      aws_sqs_queue.prisma_cloud_export_to_gsirt_dlq.arn,
    ]
  }
  statement {
    effect = "Allow"
    actions = [
      "kms:GenerateDataKey*",
      "kms:Decrypt",
    ]
    resources = [aws_kms_key.prisma_cloud_export_to_gsirt.arn]
  }
}

resource "aws_iam_policy" "prisma_role_sqs_policy" {
  name        = "prisma_role_sqs_policy"
  description = "Allow Prisma cloud to send messages to SQS"
  policy      = data.aws_iam_policy_document.prisma_role_sqs_policy.json
}

resource "aws_iam_role_policy_attachment" "prisma_role_sqs_policy_attachment" {
  policy_arn = aws_iam_policy.prisma_role_sqs_policy.arn
  role       = "security-redlock_ro"
}
