2023年全国技能大赛 | 职业名称 | 云计算 | | 课题名称 | Automation | | 比赛时间 | 4小时 | | 编号 | | | 课题编号 | 第 2 题 | | 评审委员确认 | (印) | 1. 需求 收集并处理来自多个资源产生的日志,保存到云存储,并基于保存的日志执行查询,以用作改善系统运营的依据。同时,存储并提供静态内容,自动化内容控制操作,并为应对安全事件,自动化安全事件响应流程。参考详细需求,必须配置日志收集/处理/查询操作、静态内容提供服务的运营、安全事件响应自动化。 示意图 云计算 第2题 1 - 7 Software Stack AWS - VPC 开发语言/框架 - Golang / Gin - EC2 - CloudFront - S3 - Kinesis Series - Athena - Lambda 2. 选手注意事项 1) 使用机械及工具等时请注意安全,必要时请穿戴安全装备和服装等,以预防事故。 2) 作业中请注意预防烧伤、触电、擦伤等安全事故,使用工具或作业工具时请遵守佩戴安全防护用品等安全守则。 3) 作业中请注意工具的使用,遵守安全守则,预防事故。 4) 比赛开始前请通过轻度拉伸等放松紧张,使用作业工具时请注意安全。 5) 选手账户存在费用限制,如果产生更高费用,账户可能无法使用。 6) 题目中给出的尖括号 <> 表示变量,选手必须适当更改后使用。 7) EC2 实例的 TCP 80/443 outbound 应配置为 anyopen 以供使用。 8) 大部分评分在任务的 Bastion 服务器上进行,如果未创建实例或实例处于已终止状态,则无法评分,请特别留意。 9) 任务结束时,请终止所有正在进行的测试,以免给服务器造成负载。 10) 如无特别说明,请在 ap-northeast-2 区域创建资源。 11) 第1页的示意图是抽象表示架构的图,详细配置应满足以下需求。(例如,子网可能存在2个以上。) 12) 所有资源的名称、标签、变量和变量都区分大小写。 13) 题目中未给出的值必须基于 AWS Well-Architected Framework 6 pillars 设置适当的值。 14) 如果创建了不必要的资源,可能会成为扣分因素。(例如,额外创建 VPC) 15) 如果不遵循题目要求的标签策略,可能会成为扣分因素。 16) 所有资源的时间均按 UTC+9 (KST) 时区设置。 云计算 第2题 2 - 7 3. 网络配置 为能够对云基础设施进行网络级别的隔离和分离,参考以下需求配置 VPC。子网名称后面的字母表示 Availability Zone。 VPC 信息 - VPC CIDR : 10.1.0.0/16 - VPC Tag : Name=wsi-vpc - Internet G/W Tag : Name=wsi-igw App subnet A 信息 - CIDR : 10.1.0.0/24 - Tag : Name=wsi-app-a - 外部通信:配置 NAT G/W,使其能够访问互联网。 - Route table Tag : Name=wsi-app-a-rt - NAT G/W Tag : Name=wsi-natgw-a Public subnet A 信息 - CIDR : 10.1.2.0/24 - Tag : Name=wsi-public-a - 外部通信:配置 Internet G/W 以访问互联网。 - Route table Tag : Name=wsi-public-rt 4. Bastion 服务器 使用 EC2 配置 Bastion 服务器。为访问 bastion 服务器,使用 TCP 4272(SSH)。配置 Security Group,使 bastion 服务器仅允许来自外部的 SSH 协议。通过 SSH 协议访问时,将访问日志保存到 CloudWatch Logs。日志中必须包含用户名、访问 IP(Client IP)。访问日志必须在 1 分钟内保存到 CloudWatch Logs。 在 Bastion 服务器上创建 user01、user02、user03 Linux 账户,并将密码设置为 pAss@@12。此外,这些用户必须能够使用密码通过 SSH 访问 Bastion 服务器。 - Instance type : t3.small - AMI : Amazon Linux2 - Subnet : Public subnet A - 安装包:awscli, jq, curl, parquet-tools - Tag : Name=wsi-bastion - Security group name: wsi-bastion-sg(*仅使用指定的一个 Security Group。) 云计算 第2题 3 - 7 - EC2 IAM Role:创建一个对所有资源具有 full access 的 role 并附加。role 名称设置为 wsi-bastion-role。 - CloudWatch Logs group: /wsi/security/bastion-ssh - CloudWatch Logs stream: login 5. Web 应用程序 部署 foo/bar 应用程序。提供的 binary 已在基于 x86 的 EC2 的 Amazon Linux2 上构建并确认可运行。go version 为 go1.18.9 linux/amd64。应用程序运行时绑定的端口为 TCP/8080。应用程序将 access log 保存到 log/app.log 文件(相对路径)。不对 app.log 文件进行单独的 log rotation 设置。所有 API 必须在 5 秒内响应。 - foo/bar 用于生成访问日志的临时 API。输出简单字符串。 | Path | Method | Request body | Response body | | /v1/foo | GET | - | {"application": "foo"} | | /v1/bar | GET | - | {"application": "bar"} | | /healthcheck | GET | - | {"status": "ok"} | foo/bar 应用程序无需考虑可用性/扩展性。创建 EC2 实例,部署应用程序并以守护进程运行。为应对突发错误,应用程序在重启时也必须能够重新启动。 - Instance type: t3.small - Subnet: App subnet A - Tag: Name=wsi-app foo/bar 应用程序从 wsi-bastion 服务器直接访问,不暴露给外部用户。配置为仅允许最小权限。 6. S3 创建2个 S3 桶,并根据各自用途设置桶。一个桶用于存储和提供静态内容。存储在 S3 的静态内容不得直接暴露给用户,必须仅能通过 CloudFront 访问。如果更新 S3 桶中的现有内容,通过 CloudFront 访问的用户必须能在 1 分钟内收到更新后的内容。提供静态内容的桶使用任意 CMK 进行服务器端加密。评分时,先删除静态内容存储桶中的所有 object,然后开始评分。此外,访问静态内容 S3 桶的服务器日志必须保存到日志存储桶的 s3-accesslog/ 路径。比赛结束前,s3-accesslog/ 路径下必须存在至少 2 条 S3 服务器访问记录(日志),才能进行评分。另一个桶用于存储日志数据。该桶是 云计算 第2题 4 - 7 用于存储所有日志数据。 - 桶名称(静态内容):wsi-static-<任意 4 位英文字母> - 桶名称(日志存储):wsi-logs-<任意 4 位英文字母> 7. CloudFront 通过 CloudFront 使静态内容可被访问。配置为可缓存上传到 S3 的静态内容。配置为用户即使通过 HTTP 访问 CloudFront,也会重定向到 HTTPS,从而只能通过 HTTPS 访问。配置为提供的 images 文件在提供给用户之前更改为 128x128 大小,然后提供给用户。但现有内容(图像)不得被更改。 - Origin : S3 Bucket(静态内容) - Edge:配置为不仅韩国,全球用户都能快速访问 - Tag : Name=wsi-cdn - 其他:为防止评分时出现异常,禁用 IPv6,并且仅创建一个 CloudFront 8. Kinesis 通过 Kinesis 收集/处理 foo/bar 应用程序产生的 access log,然后保存到日志收集桶(S3)。分析应用程序产生的 access log 模式,为便于分析,按如下方式执行转换操作。转换操作后,配置为以 parquet 格式保存到“6. S3”中创建的日志存储桶的 accesslog/ 下。/healthcheck 路径的日志数据不得保存到 S3。 - 应用程序日志格式 clientIP - [ Timestamp ] "Method Path Protocol ResponseCode ProcessingTime " UserAgent " 例如 8.8.8.8 - [2023-10-13T04:00:00Z] "GET /v1/foo HTTP/1.1 200 40.1us "curl/x.x.x" " - 数据转换规则 | Source | Transformed Data (columns) | | clientip | 不转换 | | timestamp | 转换为年、月、日、时、分、秒 (year, month, day, hour, minute, second)
例如将 2023-10-13T04:02:42Z 转换时如下:
year: 2023, month: 10, day: 13,
hour: 04, minute: 02, second: 42 | | method | 不转换 | | path | 不转换 | | protocol | 不转换 | | responsecode | 不转换 | | processingtime | 不转换 | | useragent | 不转换 | 以毫秒为基准转换(仅用数字表示,不带单位) 无转换 云计算第二次作业 5 - 7 - 转换为parquet格式后,数据列名称如下。 clientip, year, month, day, hour, minute, second, method, path, protocol, responsecode, processingtime, useragent - Kinesis Stream 名称: wsi-log-stream - Kinesis Firehose 名称: wsi-log-firehose 9. Athena 为了分析存储在S3桶中的日志数据,使用Athena。基于存储在S3桶中的应用程序日志数据分析流量模式。以1分钟为间隔汇总比赛当天产生的日志数据。此时,基于path和status code的组合进行计数。/v1/foo + 200和/v1/foo + 201是不同的组合,因此必须区分并汇总。/v1/foo + 200和/v1/bar + 200也是不同的组合,因此必须区分并汇总。只有path和status code完全相同时,才汇总为同一组合。查询名称命名为TrafficPatternQuery。Athena Table的名称指定为accesslog。创建表时,为了高效的查询,配置按日分区。在评分表结构时,使用Athena query的describe query来评分表结构。 查询名称 TrafficPatternQuery 描述(示例) | year | month | day | hour | minute | path | statuscode | count | | 2023 | 10 | 12 | 16 | 18 | /v1/foo | 200 | 3 | | 2023 | 10 | 12 | 16 | 18 | /v1/foo | 201 | 2 | | 2023 | 10 | 12 | 16 | 18 | /v1/bar | 200 | 5 | 10. 日志备份 为了应对wsi-app实例突然终止的情况,每分钟将保存access log的文件(app.log文件)备份到用于日志存储的S3桶中。 - 存储位置: accesslog-backup/interval//////app.log 配置脚本,使得在实例终止或重启时,能够将access log文件上传到S3并终止。 - 存储位置: accesslog-backup/shutdown//////app.log 11. 安全响应自动化 - Bastion 安全配置 如果对Bastion的SSH访问(登录)在5分钟内发生10次以上,则判断为异常访问,隔离Bastion。(撤销Bastion服务器的所有Security Group Ingress / Egress Rule。) 云计算第二次作业 6 - 7 在Bastion中,如果在5分钟内登录尝试失败5次,则判断为异常登录尝试,配置为锁定Linux用户120秒。 - Console login 安全配置 创建consoleuser IAM账户,并且当该账户在5分钟内Console登录失败5次以上时 cloudwatch Alarm的 Alert 发生 配置。 loginAlarm设置为。 云计算第二次作业 7 - 7 cloudwatch Alarm名称是