mirror of
https://github.com/Dannecron/netology-devops.git
synced 2025-12-25 15:22:37 +03:00
homework 15.3: complete part 1 task 1, partially complete part 2 task 1
This commit is contained in:
57
src/homework/15-cloud-providers/15.3/readme.md
Normal file
57
src/homework/15-cloud-providers/15.3/readme.md
Normal file
@@ -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 вроде бы всё применилось, но не работает. Так как собственного домена у меня нет,
|
||||
// то и точно следовать инструкции не представляется возможным.
|
||||
10
src/homework/15-cloud-providers/15.3/static/error.html
Normal file
10
src/homework/15-cloud-providers/15.3/static/error.html
Normal file
@@ -0,0 +1,10 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Cute cat image test</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Hello world!</h1>
|
||||
</body>
|
||||
</html>
|
||||
10
src/homework/15-cloud-providers/15.3/static/index.html
Normal file
10
src/homework/15-cloud-providers/15.3/static/index.html
Normal file
@@ -0,0 +1,10 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Cute cat image test</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Hello world!</h1>
|
||||
</body>
|
||||
</html>
|
||||
38
src/homework/15-cloud-providers/15.3/terraform/.gitignore
vendored
Normal file
38
src/homework/15-cloud-providers/15.3/terraform/.gitignore
vendored
Normal file
@@ -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
|
||||
19
src/homework/15-cloud-providers/15.3/terraform/main.tf
Normal file
19
src/homework/15-cloud-providers/15.3/terraform/main.tf
Normal file
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 = ""
|
||||
}
|
||||
Reference in New Issue
Block a user