mirror of
https://github.com/Dannecron/netology-devops.git
synced 2025-12-25 23:32: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