Skip to content

Commit d5400b0

Browse files
authored
refactor: use aws-iam-eks-trusted module to create all roles used in k8s (#143)
1 parent b6cdccd commit d5400b0

File tree

42 files changed

+645
-1090
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+645
-1090
lines changed

.github/CONTRIBUTING.md

Lines changed: 1 addition & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ Please note we have a code of conduct, please follow it in all your interactions
2626
- [General configuration files](#general-configuration-files)
2727
- [Specific configuration files](#specific-configuration-files)
2828
- [Modules](#modules)
29-
- [Project structure](#project-structure)
29+
- [### Project structure](#-project-structure)
3030

3131
## Pull Request Process
3232

@@ -304,65 +304,6 @@ Examples:
304304
- `aws-ec2-pritunl` - module for creating pritunl ec2 instance
305305

306306
### Project structure
307-
308-
```
309-
aws-eks-base
310-
┣ docker
311-
┣ examples
312-
┣ helm-charts
313-
┣ terraform
314-
┃ ┣ layer1-aws
315-
┃ ┃ ┣ examples
316-
┃ ┃ ┣ templates
317-
┃ ┃ ┣ aws-acm.tf
318-
┃ ┃ ┣ aws-eks.tf
319-
┃ ┃ ┣ aws-vpc.tf
320-
┃ ┃ ┣ locals.tf
321-
┃ ┃ ┣ main.tf
322-
┃ ┃ ┣ outputs.tf
323-
┃ ┃ ┣ providers.tf
324-
┃ ┃ ┗ variables.tf
325-
┃ ┣ layer2-k8s
326-
┃ ┃ ┣ examples
327-
┃ ┃ ┣ templates
328-
┃ ┃ ┣ eks-aws-node-termination-handler.tf
329-
┃ ┃ ┣ eks-cert-manager.tf
330-
┃ ┃ ┣ eks-certificate.tf
331-
┃ ┃ ┣ eks-cluster-autoscaler.tf
332-
┃ ┃ ┣ eks-cluster-issuer.tf
333-
┃ ┃ ┣ eks-external-dns.tf
334-
┃ ┃ ┣ eks-external-secrets.tf
335-
┃ ┃ ┣ eks-namespaces.tf
336-
┃ ┃ ┣ eks-network-policy.tf
337-
┃ ┃ ┣ eks-nginx-ingress-controller.tf
338-
┃ ┃ ┣ locals.tf
339-
┃ ┃ ┣ main.tf
340-
┃ ┃ ┣ outputs.tf
341-
┃ ┃ ┣ providers.tf
342-
┃ ┃ ┣ ssm-ps-secrets.tf
343-
┃ ┃ ┗ variables.tf
344-
┃ ┗ modules
345-
┃ ┃ ┣ aws-iam-alb-ingress-controller
346-
┃ ┃ ┣ aws-iam-autoscaler
347-
┃ ┃ ┣ aws-iam-ci
348-
┃ ┃ ┣ aws-iam-external-dns
349-
┃ ┃ ┣ aws-iam-grafana
350-
┃ ┃ ┣ aws-iam-roles
351-
┃ ┃ ┣ aws-iam-s3
352-
┃ ┃ ┣ aws-iam-ssm
353-
┃ ┃ ┣ eks-rbac-ci
354-
┃ ┃ ┣ kubernetes-namespace
355-
┃ ┃ ┣ kubernetes-network-policy-namespace
356-
┃ ┃ ┣ pritunl
357-
┃ ┃ ┗ self-signed-certificate
358-
┣ .editorconfig
359-
┣ .gitignore
360-
┣ .gitlab-ci.yml
361-
┣ .pre-commit-config.yaml
362-
┣ README.md
363-
┗ README_OLD.md
364-
```
365-
366307
---
367308

368309
| FILE / DIRECTORY| DESCRIPTION |

README-RU.md

Lines changed: 39 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -42,39 +42,45 @@
4242

4343
## Оглавление
4444

45-
- [Архитектурная схема](#архитектурная-схема)
46-
- [Стоимость текущей инфры](#стоимость-текущей-инфры)
47-
- [Структура неймспейсов в K8S кластере](#структура-неймспейсов-в-k8s-кластере)
48-
- [Необходимый инструментарий](#необходимый-инструментарий)
49-
- [Полезные экстеншены VSCode](#полезные-экстеншены-vscode)
50-
- [AWS аккаунт](#aws-аккаунт)
51-
- [Настройки IAM](#настройки-iam)
52-
- [Настройка awscli](#настройка-awscli)
53-
- [Как использовать этот репо](#как-использовать-этот-репо)
54-
- [Подготовка](#подготовка)
55-
- [S3 state backend](#s3-state-backend)
56-
- [Секреты](#секреты)
57-
- [Домен и SSL](#домен-и-ssl)
58-
- [Работа с terraform](#работа-с-terraform)
59-
- [init](#init)
60-
- [plan](#plan)
61-
- [apply](#apply)
62-
- [terragrunt](#terragrunt)
63-
- [Что делать после деплоя](#что-делать-после-деплоя)
64-
- [examples](#examples)
65-
- [Coding conventions](#coding-conventions)
66-
- [Имена и подходы используемые в коде](#имена-и-подходы-используемые-в-коде)
67-
- [Базовое имя проекта](#базовое-имя-проекта)
68-
- [Формирование уникального префикса имен ресурсов](#формирование-уникального-префикса-имен-ресурсов)
69-
- [Разделители](#разделители)
70-
- [Формирование имен ресурсов](#формирование-имен-ресурсов)
71-
- [Формирование имен переменных](#формирование-имен-переменных)
72-
- [Формирование имен вывода данных](#формирование-имен-вывода-данных)
73-
- [Название файлов, директорий и модулей терраформа](#название-файлов-директорий-и-модулей-терраформа)
74-
- [Общие конфигурационные файлы](#общие-конфигурационные-файлы)
75-
- [Специфичные конфигурационные файлы](#специфичные-конфигурационные-файлы)
76-
- [Модули](#модули)
77-
- [Структура проекта](#структура-проекта)
45+
- [Бойлерплейт базовой AWS инфраструктуры c EKS-кластером](#бойлерплейт-базовой-aws-инфраструктуры-c-eks-кластером)
46+
- [Преимущества этого бойлерплейта](#преимущества-этого-бойлерплейта)
47+
- [Причины использовать этот бойлерплейт](#причины-использовать-этот-бойлерплейт)
48+
- [Описание](#описание)
49+
- [Оглавление](#оглавление)
50+
- [Архитектурная схема](#архитектурная-схема)
51+
- [Стоимость текущей инфры](#стоимость-текущей-инфры)
52+
- [Структура неймспейсов в K8S кластере](#структура-неймспейсов-в-k8s-кластере)
53+
- [Необходимый инструментарий](#необходимый-инструментарий)
54+
- [Полезные экстеншены VSCode](#полезные-экстеншены-vscode)
55+
- [AWS аккаунт](#aws-аккаунт)
56+
- [Настройки IAM](#настройки-iam)
57+
- [Настройка awscli](#настройка-awscli)
58+
- [Как использовать этот репо](#как-использовать-этот-репо)
59+
- [Подготовка](#подготовка)
60+
- [S3 state backend](#s3-state-backend)
61+
- [Входные данные](#входные-данные)
62+
- [Секреты](#секреты)
63+
- [Домен и SSL](#домен-и-ssl)
64+
- [Работа с terraform](#работа-с-terraform)
65+
- [init](#init)
66+
- [plan](#plan)
67+
- [apply](#apply)
68+
- [terragrunt](#terragrunt)
69+
- [Что делать после деплоя](#что-делать-после-деплоя)
70+
- [examples](#examples)
71+
- [Coding conventions](#coding-conventions)
72+
- [Имена и подходы, используемые в коде](#имена-и-подходы-используемые-в-коде)
73+
- [Базовое имя проекта](#базовое-имя-проекта)
74+
- [Формирование уникального префикса имен ресурсов](#формирование-уникального-префикса-имен-ресурсов)
75+
- [Разделители](#разделители)
76+
- [Формирование имен ресурсов](#формирование-имен-ресурсов)
77+
- [Формирование имен переменных](#формирование-имен-переменных)
78+
- [Формирование имен вывода данных](#формирование-имен-вывода-данных)
79+
- [Название файлов, директорий и модулей терраформа](#название-файлов-директорий-и-модулей-терраформа)
80+
- [Общие конфигурационные файлы](#общие-конфигурационные-файлы)
81+
- [Специфичные конфигурационные файлы](#специфичные-конфигурационные-файлы)
82+
- [Модули](#модули)
83+
- [### Структура проекта](#-структура-проекта)
7884

7985
## Архитектурная схема
8086

@@ -575,65 +581,6 @@ locals {
575581
- `aws-ec2-pritunl` - модуль для создания pritunl ec2 инстанса
576582
577583
### Структура проекта
578-
579-
```
580-
aws-eks-base
581-
┣ docker
582-
┣ examples
583-
┣ helm-charts
584-
┣ terraform
585-
┃ ┣ layer1-aws
586-
┃ ┃ ┣ examples
587-
┃ ┃ ┣ templates
588-
┃ ┃ ┣ aws-acm.tf
589-
┃ ┃ ┣ aws-eks.tf
590-
┃ ┃ ┣ aws-vpc.tf
591-
┃ ┃ ┣ locals.tf
592-
┃ ┃ ┣ main.tf
593-
┃ ┃ ┣ outputs.tf
594-
┃ ┃ ┣ providers.tf
595-
┃ ┃ ┗ variables.tf
596-
┃ ┣ layer2-k8s
597-
┃ ┃ ┣ examples
598-
┃ ┃ ┣ templates
599-
┃ ┃ ┣ eks-aws-node-termination-handler.tf
600-
┃ ┃ ┣ eks-cert-manager.tf
601-
┃ ┃ ┣ eks-certificate.tf
602-
┃ ┃ ┣ eks-cluster-autoscaler.tf
603-
┃ ┃ ┣ eks-cluster-issuer.tf
604-
┃ ┃ ┣ eks-external-dns.tf
605-
┃ ┃ ┣ eks-external-secrets.tf
606-
┃ ┃ ┣ eks-namespaces.tf
607-
┃ ┃ ┣ eks-network-policy.tf
608-
┃ ┃ ┣ eks-nginx-ingress-controller.tf
609-
┃ ┃ ┣ locals.tf
610-
┃ ┃ ┣ main.tf
611-
┃ ┃ ┣ outputs.tf
612-
┃ ┃ ┣ providers.tf
613-
┃ ┃ ┣ ssm-ps-secrets.tf
614-
┃ ┃ ┗ variables.tf
615-
┃ ┗ modules
616-
┃ ┃ ┣ aws-iam-alb-ingress-controller
617-
┃ ┃ ┣ aws-iam-autoscaler
618-
┃ ┃ ┣ aws-iam-ci
619-
┃ ┃ ┣ aws-iam-external-dns
620-
┃ ┃ ┣ aws-iam-grafana
621-
┃ ┃ ┣ aws-iam-roles
622-
┃ ┃ ┣ aws-iam-s3
623-
┃ ┃ ┣ aws-iam-ssm
624-
┃ ┃ ┣ eks-rbac-ci
625-
┃ ┃ ┣ kubernetes-namespace
626-
┃ ┃ ┣ kubernetes-network-policy-namespace
627-
┃ ┃ ┣ pritunl
628-
┃ ┃ ┗ self-signed-certificate
629-
┣ .editorconfig
630-
┣ .gitignore
631-
┣ .gitlab-ci.yml
632-
┣ .pre-commit-config.yaml
633-
┣ README.md
634-
┗ README_OLD.md
635-
```
636-
637584
---
638585
639586
| FILE / DIRECTORY| DESCRIPTION |

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -481,16 +481,16 @@ We use GitHub Actions and [tfsec](https://github.com/aquasecurity/tfsec) to chec
481481
| layer1-aws/aws-eks.tf | aws-eks-no-public-cluster-access | Resource 'module.eks:aws_eks_cluster.this[0]' has public access is explicitly set to enabled | By default we create public accessible EKS cluster from anywhere |
482482
| layer1-aws/aws-eks.tf | aws-eks-no-public-cluster-access-to-cidr | Resource 'module.eks:aws_eks_cluster.this[0]' has public access cidr explicitly set to wide open | By default we create public accessible EKS cluster from anywhere |
483483
| layer1-aws/aws-eks.tf | aws-vpc-no-public-egress-sgr | Resource 'module.eks:aws_security_group_rule.workers_egress_internet[0]' defines a fully open egress security group rule | We use recommended option. [More info](https://docs.aws.amazon.com/eks/latest/userguide/sec-group-reqs.html) |
484-
| modules/aws-iam-ssm/iam.tf | aws-iam-no-policy-wildcards | Resource 'module.aws_iam_external_secrets:data.aws_iam_policy_document.this' defines a policy with wildcarded resources. | We use aws-iam-ssm module for external-secrets and grant it access to all secrets. |
485-
| modules/aws-iam-autoscaler/iam.tf | aws-iam-no-policy-wildcards | Resource 'module.aws_iam_autoscaler:data.aws_iam_policy_document.this' defines a policy with wildcarded resources | We use condition to allow run actions only for certain autoscaling groups |
484+
| modules/aws-iam-eks-trusted/main.tf | aws-iam-no-policy-wildcards | Resource 'module.aws_iam_external_secrets:aws_iam_role_policy.this' defines a policy with wildcarded resources. | We use this policy for external-secrets and grant it access to all secrets. |
485+
| modules/aws-iam-eks-trusted/main.tf | aws-iam-no-policy-wildcards | Resource 'module.aws_iam_autoscaler:aws_iam_role_policy.this' defines a policy with wildcarded resources | We use condition to allow run actions only for certain autoscaling groups |
486486
| modules/kubernetes-network-policy-namespace/main.tf | kubernetes-network-no-public-ingress | Resource 'module.dev_ns_network_policy:kubernetes_network_policy.deny-all' allows all ingress traffic by default | We deny all ingress trafic by default, but tfsec doesn't work as expected (bug) |
487487
| modules/kubernetes-network-policy-namespace/main.tf | kubernetes-network-no-public-egress | Resource 'module.dev_ns_network_policy:kubernetes_network_policy.deny-all' allows all egress traffic by default | We don't want to deny egress traffic in a default installation |
488488
| kubernetes-network-policy-namespace/main.tf | kubernetes-network-no-public-egress | Resource 'module.dev_ns_network_policy:kubernetes_network_policy.allow-from-this' allows all egress traffic by default | We don't want to deny egress traffic in a default installation |
489489
| modules/kubernetes-network-policy-namespace/main.tf | kubernetes-network-no-public-egress | Resource 'module.dev_ns_network_policy:kubernetes_network_policy.allow-from-ns[0]' allows all egress traffic by default | We don't want to deny egress traffic in a default installation |
490-
| modules/aws-iam-aws-loadbalancer-controller/iam.tf | aws-iam-no-policy-wildcards | Resource 'module.eks_alb_ingress[0]:module.aws_iam_aws_loadbalancer_controller:aws_iam_role_policy.this' defines a policy with wildcarded resources | We use recommended [policy](https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json) |
490+
| modules/aws-iam-eks-trusted/main.tf | aws-iam-no-policy-wildcards | Resource 'module.eks_alb_ingress[0]:module.aws_iam_aws_loadbalancer_controller:aws_iam_role_policy.this' defines a policy with wildcarded resources | We use recommended [policy](https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json) |
491491
| layer2-k8s/locals.tf | general-secrets-sensitive-in-local | Local 'locals.' includes a potentially sensitive value which is defined within the project | tfsec complains on helm_repo_external_secrets url because it contains the word *secret* |
492-
| modules/aws-iam-external-dns/main.tf | aws-iam-no-policy-wildcards | Resource 'module.aws_iam_external_dns:aws_iam_role_policy.this' defines a policy with wildcarded resources | We use the policy from the [documentation](https://github.com/kubernetes-sigs/external-dns/blob/master/docs/tutorials/aws.md#iam-policy)
493-
| modules/aws-iam-external-dns/main.tf | aws-iam-no-policy-wildcards | Resource 'module.aws_iam_cert_manager:aws_iam_role_policy.this' defines a policy with wildcarded resources | Certmanager uses Route53 to create DNS records and validate wildcard certificates. By default we allow it to manage all zones |
492+
| modules/aws-iam-eks-trusted/main.tf | aws-iam-no-policy-wildcards | Resource 'module.aws_iam_external_dns:aws_iam_role_policy.this' defines a policy with wildcarded resources | We use the policy from the [documentation](https://github.com/kubernetes-sigs/external-dns/blob/master/docs/tutorials/aws.md#iam-policy)
493+
| modules/aws-iam-eks-trusted/main.tf | aws-iam-no-policy-wildcards | Resource 'module.aws_iam_cert_manager:aws_iam_role_policy.this' defines a policy with wildcarded resources | Certmanager uses Route53 to create DNS records and validate wildcard certificates. By default we allow it to manage all zones |
494494
495495
## Contributing
496496

terraform/layer1-aws/examples/aws-rds-postgresql.tf

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -137,13 +137,39 @@ resource "aws_s3_bucket_public_access_block" "rds_backups" {
137137
}
138138

139139
module "aws_iam_rds_backups" {
140-
source = "../modules/aws-iam-s3"
141-
142-
name = "${local.name}-rds-backups"
143-
region = var.region
144-
bucket_names = [aws_s3_bucket.rds_backups.id]
145-
oidc_provider_arn = module.eks.oidc_provider_arn
146-
create_user = true
140+
source = "../modules/aws-iam-user-with-policy"
141+
142+
name = "${local.name}-rds-backups"
143+
policy = jsonencode({
144+
"Version" : "2012-10-17",
145+
"Statement" : [
146+
{
147+
"Effect" : "Allow",
148+
"Action" : [
149+
"s3:ListBucket",
150+
"s3:GetBucketLocation",
151+
"s3:ListBucketMultipartUploads",
152+
"s3:ListBucketVersions"
153+
],
154+
"Resource" : [
155+
"arn:aws:s3:::${aws_s3_bucket.rds_backups.id}"
156+
]
157+
},
158+
{
159+
"Effect" : "Allow",
160+
"Action" : [
161+
"s3:GetObject",
162+
"s3:PutObject",
163+
"s3:DeleteObject",
164+
"s3:AbortMultipartUpload",
165+
"s3:ListMultipartUploadParts"
166+
],
167+
"Resource" : [
168+
"arn:aws:s3:::${aws_s3_bucket.rds_backups.id}/*"
169+
]
170+
}
171+
]
172+
})
147173
}
148174

149175
module "ssm" {

terraform/layer2-k8s/eks-cert-manager.tf

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,3 @@
1-
#tfsec:ignore:aws-iam-no-policy-wildcards
2-
module "aws_iam_cert_manager" {
3-
source = "../modules/aws-iam-external-dns"
4-
5-
name = local.name
6-
region = local.region
7-
oidc_provider_arn = local.eks_oidc_provider_arn
8-
}
9-
101
data "template_file" "cert_manager" {
112
template = file("${path.module}/templates/cert-manager-values.yaml")
123

@@ -34,3 +25,44 @@ resource "kubernetes_namespace" "certmanager" {
3425
name = "certmanager"
3526
}
3627
}
28+
29+
#tfsec:ignore:aws-iam-no-policy-wildcards
30+
module "aws_iam_cert_manager" {
31+
source = "../modules/aws-iam-eks-trusted"
32+
33+
name = "${local.name}-certmanager"
34+
region = local.region
35+
oidc_provider_arn = local.eks_oidc_provider_arn
36+
policy = jsonencode({
37+
"Version" : "2012-10-17",
38+
"Statement" : [
39+
{
40+
"Effect" : "Allow",
41+
"Action" : "route53:GetChange",
42+
"Resource" : "arn:aws:route53:::change/*"
43+
},
44+
{
45+
"Effect" : "Allow",
46+
"Action" : [
47+
"route53:ChangeResourceRecordSets",
48+
"route53:ListResourceRecordSets"
49+
],
50+
"Resource" : [
51+
"arn:aws:route53:::hostedzone/*"
52+
]
53+
},
54+
{
55+
"Effect" : "Allow",
56+
"Action" : [
57+
"route53:ListHostedZones"
58+
],
59+
"Resource" : ["*"]
60+
},
61+
{
62+
"Effect" : "Allow",
63+
"Action" : "route53:ListHostedZonesByName",
64+
"Resource" : "*"
65+
}
66+
]
67+
})
68+
}

0 commit comments

Comments
 (0)