diff --git a/src/homework/15-cloud-providers/15.3/readme.md b/src/homework/15-cloud-providers/15.3/readme.md new file mode 100644 index 0000000..730c629 --- /dev/null +++ b/src/homework/15-cloud-providers/15.3/readme.md @@ -0,0 +1,57 @@ +Выполнение [домашнего задания](https://github.com/netology-code/clokub-homeworks/blob/clokub-5/15.3.md) +по теме "15.3. Безопасность в облачных провайдерах" + +## Q/A + +> Используя конфигурации, выполненные в рамках предыдущих домашних заданиях, нужно добавить возможность шифрования бакета. + +### Задание 1 + +Вся конфигурация terraform прописана в директории [terraform](./terraform). Для запуска необходимо скопировать файл +[variables.tf.example](./terraform/variables.tf.example) в [variables.tf](./terraform/variables.tf) и проставить актуальные +значения для всех переменных: `yandex_cloud_id`, `yandex_folder_id`, `yandex_cloud_token`. +Последнее значение можно получить выполнив команду `yc iam create-token`. + +> 1. С помощью ключа в KMS необходимо зашифровать содержимое бакета: +> - Создать ключ в KMS + +Объект ключа шифрования создаётся следующим описанием: + +```terraform +resource "yandex_kms_symmetric_key" "os-cipher-key" { + name = "os-cipher-key" +} +``` + +> - С помощью ключа зашифровать содержимое бакета, созданного ранее. + +Из [домашнего задания 15.2](/src/homework/15-cloud-providers/15.2) взято описание создания бакета и одного объекта внутри данного бакета. +Для шифрования содержимого необходимо добавить следующий блок к описанию конфигурации `os-netology-bucket`: + +```terraform +server_side_encryption_configuration { + rule { + apply_server_side_encryption_by_default { + kms_master_key_id = yandex_kms_symmetric_key.os-cipher-key.id + sse_algorithm = "aws:kms" + } + } +} +``` + +PS. При создании подобного бакета загрузка файлов через `terraform` не проходит с ошибкой 403. +Ручная загрузка через web-интерфейс производится корректно. + +> 2. (Выполняется НЕ в terraform) *Создать статический сайт в Object Storage c собственным публичным адресом и сделать доступным по HTTPS +> - Создать сертификат, +> - Создать статическую страницу в Object Storage и применить сертификат HTTPS, +> - В качестве результата предоставить скриншот на страницу с сертификатом в заголовке ("замочек"). + +После создания бакета (например, с названием `os-netology`, во вкладке "Веб-сайт" необходимо выбрать "Хостинг" и сохранить изменения. Затем во вкладке "Объекты" +нужно загрузить два файла: [index.html](./static/index.html) и [error.html](./static/error.html). +После загрузки можно убедится, что сайт работает, перейдя по ссылке `https://os-netology.website.yandexcloud.net/`. + +Чтобы создать свой домен, необходимо следовать [инструкции yandex cloud](https://cloud.yandex.ru/docs/tutorials/web/static?from=int-console-empty-state#configure-dns). + +// todo вроде бы всё применилось, но не работает. Так как собственного домена у меня нет, +// то и точно следовать инструкции не представляется возможным. diff --git a/src/homework/15-cloud-providers/15.3/static/error.html b/src/homework/15-cloud-providers/15.3/static/error.html new file mode 100644 index 0000000..bf37460 --- /dev/null +++ b/src/homework/15-cloud-providers/15.3/static/error.html @@ -0,0 +1,10 @@ + + + + + Cute cat image test + + +

Hello world!

+ + diff --git a/src/homework/15-cloud-providers/15.3/static/index.html b/src/homework/15-cloud-providers/15.3/static/index.html new file mode 100644 index 0000000..bf37460 --- /dev/null +++ b/src/homework/15-cloud-providers/15.3/static/index.html @@ -0,0 +1,10 @@ + + + + + Cute cat image test + + +

Hello world!

+ + diff --git a/src/homework/15-cloud-providers/15.3/terraform/.gitignore b/src/homework/15-cloud-providers/15.3/terraform/.gitignore new file mode 100644 index 0000000..3309aee --- /dev/null +++ b/src/homework/15-cloud-providers/15.3/terraform/.gitignore @@ -0,0 +1,38 @@ +# Local .terraform directories +**/.terraform/* + +# .tfstate files +*.tfstate +*.tfstate.* + +# Crash log files +crash.log +crash.*.log + +# Exclude all .tfvars files, which are likely to contain sentitive data, such as +# password, private keys, and other secrets. These should not be part of version +# control as they are data points which are potentially sensitive and subject +# to change depending on the environment. +# +*.tfvars + +# Ignore override files as they are usually used to override resources locally and so +# are not checked in +override.tf +override.tf.json +*_override.tf +*_override.tf.json + +# Include override files you do wish to add to version control using negated pattern +# +# !example_override.tf + +# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan +# example: *tfplan* + +# Ignore CLI configuration files +.terraformrc +terraform.rc +.terraform.lock.hcl + +variables.tf diff --git a/src/homework/15-cloud-providers/15.3/terraform/main.tf b/src/homework/15-cloud-providers/15.3/terraform/main.tf new file mode 100644 index 0000000..565b274 --- /dev/null +++ b/src/homework/15-cloud-providers/15.3/terraform/main.tf @@ -0,0 +1,19 @@ +terraform { + required_providers { + yandex = { + source = "yandex-cloud/yandex" + } + } + required_version = ">= 0.13" +} + +provider "yandex" { + token = var.yandex_cloud_token + cloud_id = var.yandex_cloud_id + folder_id = var.yandex_folder_id + zone = "ru-central1-a" +} + +resource "yandex_iam_service_account" "os-service-account" { + name = "os-service-account" +} diff --git a/src/homework/15-cloud-providers/15.3/terraform/object_storage.tf b/src/homework/15-cloud-providers/15.3/terraform/object_storage.tf new file mode 100644 index 0000000..8cee80c --- /dev/null +++ b/src/homework/15-cloud-providers/15.3/terraform/object_storage.tf @@ -0,0 +1,40 @@ +// Назначение роли сервисному аккаунту +resource "yandex_resourcemanager_folder_iam_member" "os-storage-editor" { + folder_id = var.yandex_folder_id + role = "storage.editor" + member = "serviceAccount:${yandex_iam_service_account.os-service-account.id}" +} + +// Создание статического ключа доступа +resource "yandex_iam_service_account_static_access_key" "os-static-key" { + depends_on = [yandex_resourcemanager_folder_iam_member.os-storage-editor] + + service_account_id = yandex_iam_service_account.os-service-account.id + description = "static access key for object storage" +} + +// Создание ключа шифрования +resource "yandex_kms_symmetric_key" "os-cipher-key" { + name = "os-cipher-key" +} + +// Создание бакета с использованием ключа +resource "yandex_storage_bucket" "os-netology-bucket" { + access_key = yandex_iam_service_account_static_access_key.os-static-key.access_key + secret_key = yandex_iam_service_account_static_access_key.os-static-key.secret_key + bucket = "os-netology-bucket" + + anonymous_access_flags { + read = true + list = false + } + + server_side_encryption_configuration { + rule { + apply_server_side_encryption_by_default { + kms_master_key_id = yandex_kms_symmetric_key.os-cipher-key.id + sse_algorithm = "aws:kms" + } + } + } +} diff --git a/src/homework/15-cloud-providers/15.3/terraform/variables.tf.example b/src/homework/15-cloud-providers/15.3/terraform/variables.tf.example new file mode 100644 index 0000000..244f0f4 --- /dev/null +++ b/src/homework/15-cloud-providers/15.3/terraform/variables.tf.example @@ -0,0 +1,16 @@ +# Заменить на ID своего облака +# https://console.cloud.yandex.ru/cloud?section=overview +variable "yandex_cloud_id" { + default = "b1gu1gt5nqi6lqgu3t7s" +} + +# Заменить на Folder своего облака +# https://console.cloud.yandex.ru/cloud?section=overview +variable "yandex_folder_id" { + default = "b1gaec42k169jqpo02f7" +} + +# OAuth токен, используемый утилитой yc. Применялся на этапе с packer. +variable "yandex_cloud_token" { + default = "" +}