Tự động triển khai và tích hợp bảo mật cho hạ tầng trên AWS bằng các công cụ mã nguồn mở

Tram Ho

Giới thiệu

Bài viết này giới thiệu cách triển khai hạ tầng trên AWS một cách tự động hóa với Terraform và tích hợp một số phương pháp bảo mật cho hệ thống của bạn.

Các bạn tham khảo repository tại đây

Mô hình triển khai

Kiến trúc hạ tầng

Trong topic này chúng tôi triển khai một mô hình multi-layer web và cài đặt WordPress để kiểm tra các service.
* Network layer : VPC, Internet Gateway, Security Groups rules,…
* Database layer : Amazon RDS Mysql hoặc Amazon Aurora MySql, AWS Secrets Manager, AWS Backup,…
* Application layer : EC2, EFS, AutoScaling Group, Application Load Balancer, ElastiCache Memcached, S3, Cloudfront,…

Note : Chúng tôi không sử dụng Private subnet để tối ưu một phần chi phí, thay vào đó cấu hình các Security groups's rules để kiểm soát traffic đến các tài nguyên

Triển khai trên Git

Với việc quản lý source code trên Github hay Gitlab hoặc Bitbucket,… , chúng ta cần các tool CI/CD, tự động check lỗi để quá trình tích hợp và triển khai code đảm bảo việc commit code giữa các contributor không bị conflict với nhau.

Lưu ý: Các giá trị mặc định cho các resource nằm trong file /main/variables.tf

Workflow

Checkov

Checkov là một công cụ tự động kiểm tra các cấu hình của các file IaC trước khi chúng được triển khai, nó scan các file IaC để tìm ra các cấu hình không phù hợp liên quan đến bảo mật hoặc tuân thủ các tiêu chuẩn. Checkov hỗ trợ các loại file IaaC như Terraform, CloudFormation, Docker, Kubernetes,… . Policy của Checkov có thể là predefined(cấu hình sẵn) hoặc custom(tùy chỉnh).
Trong hệ thống này, Checkov được setup như sau :

.github/workflow/release.yaml

Checkov sẽ kiểm tra xem các tài nguyên được tạo ra có đáp ứng được yêu cầu bảo mật hay không, nó cũng sẽ đưa ra các recommend cho developer thực hiện :

Cost Estimate

Song song với việc triển khai các tài nguyên, việc quản lý chi phí triển khai và vận hành cũng là một vấn đề cần được kiểm soát. Tự động dự toán chi phí với các resource được tạo ra bởi Terraform sử dụng infracost.io ngay trên Pull request, điều này giúp cho team dễ dàng phân tích các chi phí trước khi có những thay đổi.

.github/workflow/infra-cost.yaml

Atlantis

Atlantis là một công cụ mã nguồn mở được tích hợp với Terraform cho phép chạy các lệnh terraform planterraform apply trực tiếp từ một Pull request. Bằng cách comment trên Pull request, một trigger sẽ được gửi đến http endpoint của Atlantis, và sau khi thực thi plan hoặc apply nó sẽ trả về kết quả Output ngay trên comment của Pull request. Từ đó ta có thể review lại code trong Terraform trước khi merge vào nhánh Master.

Note : Vì lý do bảo mật nên trong repository này sẽ không có Atlantis.

Nếu không có Atlantis, workflow của chúng ta có thể như sau :

Workflow khi được tích hợp Atlantis:

Ngay sau khi có thay đổi, Pull request được tạo ra sẽ gửi một trigger đến Atlantis để chạy plan, hoặc comment atlantis plan:

Sau khi quá trình review code đã OK và Pull request được approve, comment atlantis apply để gửi một trigger đến Atlantis và apply vào hệ thống:

Atlantis rất hiệu quả khi làm việc theo team, bằng cách quản lý source code trên Git, các Pull request được tạo ra bởi các member trong team sẽ được team leader review hoặc plan để quyết định có merge hay không ngay trên Pull request đó. Để triển khai một server Atlantis với Git, các bạn tham khảo tại đây

Workflow cho Atlantis trong hệ thống này được define như sau:

atlantis/repos.yaml

/atlantis.yaml

Giúp hạ tầng bảo mật hơn

Security Groups

Traffic đến các tài nguyên được kiểm soát bởi các rule trong security groups. Đối với EC2, chỉ cho phép các traffic đến từ Application Load Balancer và đối với Database, chỉ cho phép các traffic đến từ EC2.

Create security group for EC2 (/modules/networking/main.tf)

Create security group for database (/modules/networking/main.tf)

AWS Secrets Manager

AWS Secrets Manager giúp bạn lưu trữ và bảo mật các credentials truy xuất đến các ứng dụng hoặc dịch vụ. Người dùng và ứng dụng truy xuất đến các credentials bằng lệnh gọi đến API Secrets Manager. Nó cũng có khả năng tự động hoặc tích hợp với Lambda để rotate các credentials theo chu kì, giúp các tài nguyên an toàn hơn khi sử dụng các thông tin đăng nhập nhạy cảm.
Trong hệ thống này, chúng tôi sử dụng AWS Secrets Manager để lưu trữ thông tin đăng nhập của Database, và sau đó mỗi 30 ngày password của Database sẽ được thay đổi thông qua Lambda.

Lưu credentials của Database trên AWS Secrets Manager (/modules/database/db-rotate.tf)

Tự động rotate password (/modules/database/db-rotate.tf)

Chu kì rotate password (/main/variables.tf)

Triển khai ở local

Tương tự với triển khai trên Git nhưng không có workflow, thích hợp với việc tự quản lý source code.

Yêu cầu

Để triển khai một hạ tầng trên AWS với Terraform, các bạn cần cài đặt AWS CLI và Terraform.

  • Cách cài đặt AWS CLI, các bạn tham khảo tại đây
  • Cách cài đặt Terraform, các bạn tham khảo tại đây

Các bước triển khai

  • Download source code trên Github
  • Mở Terminal và cd đến thư mục đã tải về
    cd ./main
  • Cấu hình hạ tầng mới với terraform init, bước này là bắt buộc để các tài nguyên từ provider sẽ được tải về khi ta viết trong file main.tf
  • Kiểm tra trước khi apply : terraform plan
  • Thực hiện apply cấu hình : terraform apply -auto-approve
  • Để hủy bỏ hạ tầng, sử dụng terraform destroy -auto-approve

Kiểm tra kết quả

  • Sau khi apply, Outputs sẽ cho ra các dns tương ứng. Truy cập vào wordpress webserver với dns = lb_dns_name
  • Để login vào Admin site, các bạn thêm /wp-admin vào sau đường dẫn của trang web
  • Để sử dụng được CDN và Memcached, tại mục Plugins các bạn activate W3 Total Cache

    Enable Memcached và CDN trong General Settings của W3 Total Cache

  • Kiểm tra Database Cache với Memcached
  • Kiểm tra CDN với Cloudfront
Lưu ý

Các giá trị mặc định nằm trong file /main/variables.tf . Các bạn có thể thay đổi các giá trị này phù thuộc với mục đích sử dụng.

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo