Các mô-đun Terraform cho phép bạn tổ chức mã cấu hình của mình tốt hơn và phân phối và tái sử dụng mã đó. Bạn có thể lưu trữ các mô-đun Terraform của mình trên các dịch vụ kiểm soát phiên bản từ xa, như GitHub, để những người khác sử dụng. Terraform Module Registry lưu trữ các mô-đun cộng đồng mà bạn có thể tái sử dụng cho các cấu hình Terraform của riêng bạn hoặc bạn có thể xuất bản các mô-đun của riêng mình để cộng đồng Terraform sử dụng.

Trong hướng dẫn này, bạn sẽ tạo một mô-đun Tường lửa Linode khai báo các cấu hình Tường lửa đám mây thường dùng. Sau đó, bạn sẽ sử dụng mô-đun để tạo một phiên bản Linode và gán Linode cho Tường lửa đám mây. Bạn có thể áp dụng các cấu hình ví dụ trong hướng dẫn này để tạo các cấu hình Tường lửa đám mây có thể tái sử dụng của riêng bạn. Để biết thêm thông tin về Tường lửa đám mây, hãy xem tài liệu Tường lửa đám mây .

Trước khi bạn bắt đầu

  1. Nếu bạn mới sử dụng Terraform, hãy đọc hướng dẫn về Terraform dành cho người mới bắt đầu của chúng tôi để làm quen với các khái niệm chính.
  2. Xem mục Tạo mô-đun Terraform để hiểu sâu hơn về cấu trúc mô-đun chuẩn của Terraform và các thông tin chi tiết hữu ích khác.
  3. Bạn cần mã thông báo truy cập cá nhân API Linode để sử dụng với Terraform. Mã thông báo này sẽ cho phép bạn tạo, cập nhật và hủy tài nguyên Linode. Xem hướng dẫn Quản lý mã thông báo truy cập cá nhân để biết các bước tạo mã thông báo.Ghi chúWhen you create a personal access token ensure that you set **Read/Write** access permissions for Linode instances and Cloud Firewalls.
  4. Cài đặt Terraform trên máy tính cục bộ của bạn.Ghi chúHướng dẫn này được viết bằng Terraform phiên bản 0.13.0 .
  5. Cài đặt Git trên máy tính của bạn và hoàn tất các bước trong phần Cấu hình Git của hướng dẫn Bắt đầu với Git .

Tạo mô-đun tường lửa đám mây của bạn

Các bước sau đây sẽ tạo mô-đun Cloud Firewalls, bao gồm một số mô-đun con chia nhỏ các tài nguyên cần thiết giữa mô-đun gốc , một inbound_sshmô-đun, một mysqlmô-đun và một web-servermô-đun. Mô-đun gốc là thư mục chứa các tệp cấu hình Terraform được áp dụng để xây dựng cơ sở hạ tầng mong muốn của bạn. Các tệp này cung cấp điểm vào bất kỳ mô-đun con nào. Mỗi mô-đun con sử dụng tài linode_firewallnguyên để tạo các quy tắc Cloud Firewall có thể tái sử dụng cho các trường hợp sử dụng cụ thể.

Ghi chú: Bạn có thể áp dụng tối đa ba Tường lửa đám mây cho mỗi phiên bản Linode.Ghi chúBạn có thể xem các tệp được tạo trong suốt hướng dẫn này trong kho lưu trữ GitHub của tác giả . Bạn có thể sao chép kho lưu trữ và sử dụng nó làm nền tảng để tạo mô-đun Tường lửa đám mây tùy chỉnh của riêng bạn.

Tạo cấu trúc thư mục của mô-đun của bạn

Trong phần này, bạn sẽ tạo cấu trúc thư mục được nêu dưới đây, chứa các tệp cấu hình mô-đun và mô-đun con mà bạn sẽ tạo ở các bước sau.

main_firewalls/
├── main.tf
├── outputs.tf
├── secrets.tfvars
├── terraform
├── terraform.tfvars
├── variables.tf
└── modules/
    ├── inbound_ssh/
        ├── main.tf
        ├── variables.tf
        └── outputs.tf
    └── mysql/
        ├── main.tf
        ├── variables.tf
        └── outputs.tf
    └── web_server/
        ├── main.tf
        ├── variables.tf
        └── outputs.tf

1.Di chuyển vào terraformthư mục của bạn.

cd ~/terraform

2.Từ terraformthư mục của bạn, hãy tạo cấu trúc thư mục được nêu ở trên.

mkdir -p main_firewalls/modules/{inbound_ssh,mysql,web_server}

Ghi chú

If you followed our [install Terraform](/docs/guides/how-to-build-your-infrastr

Tạo Mô-đun Con SSH Đến

Khi áp dụng cho cấu hình Terraform, inbound_sshmô-đun sẽ tạo Tường lửa đám mây với các quy tắc đến để cho phép TCPkết nối đến cổng 22từ mọi nguồn. Cổng 22thường được sử dụng cho kết nối shell an toàn (SSH), đăng nhập an toàn, truyền tệp (scp, sftp) và chuyển tiếp cổng.

1.Sử dụng trình soạn thảo văn bản ưa thích của bạn, tạo tệp inbound_sshmô-đun main.tf. Sao chép và lưu nội dung của ví dụ bên dưới.

terraform {
  required_providers {
    linode = {
      source = "linode/linode"
      version = "1.16.0"
    }
  }
}
resource "linode_firewall" "ssh_inbound" {
  label = var.firewall_label
  tags  = var.tags

  inbound {
    protocol = "TCP"
    ports = ["22"]
    addresses = ["0.0.0.0/0"]
  }

  linodes = var.linodes
}
  • Tệp này sử dụng tài nguyên của Nhà cung cấp Terraform Linode linode_firewallđể tạo Tường lửa đám mây với các quy tắc đến được mô tả ở trên.
  • Đối linodessố mong đợi một danh sách ID Linode. Khi ID Linode được truyền cho linodesđối số, inbound_sshtường lửa sẽ được gán cho ID đó.
  • Các đối số labeltags, và linodessử dụng các biến đầu vào , cho phép tùy chỉnh các giá trị này khi sử dụng mô-đun cho cấu hình tài nguyên của bạn.

2.Tạo variables.tftệp để khai báo inbound_sshcác biến đầu vào của mô-đun. Sao chép và lưu nội dung của ví dụ bên dưới.

variable "linodes" {
  description = "List of Linode ids to which the rule sets will be applied"
  type        = list(string)
  default     = []
}

variable "firewall_label" {
  description = "This firewall's human-readable firewall_label"
  type = string
  default = "my-firewall"
}

variable "tags" {
  description = "List of tags to apply to this Firewall"
  type        = list(string)
  default     = []
}

Các biến đầu vào được khai báo trong tệp này tương ứng với linode_firewallscác đối số tài nguyên mà inbound_sshmô-đun đưa ra để tùy chỉnh. Tương tự như vậy, bạn có thể đưa ra các đối số khác nhau cho các mô-đun con Cloud Firewall của mình khi cần.

Tạo mô-đun con MySQL

Mô mysql-đun con tạo ra một Tường lửa đám mây với một quy tắc gửi đến thường phù hợp với các kết nối máy khách đến máy chủ cơ sở dữ liệu MySQL. Quy tắc gửi đến cho phép TCPkết nối đến cổng 3306addresssesĐối số chấp nhận một biến đầu vào để có thể tùy chỉnh nhằm hạn chế quyền truy cập vào một địa chỉ IP cụ thể hoặc khối CIDR.

1.Sử dụng trình soạn thảo văn bản ưa thích của bạn, tạo tệp inbound_sshmô-đun main.tf. Sao chép và lưu nội dung của ví dụ bên dưới.

terraform {
  required_providers {
    linode = {
      source = "linode/linode"
      version = "1.16.0"
    }
  }
}

resource "linode_firewall" "mysql" {
  label = var.firewall_label
  tags  = var.tags

  inbound {
    protocol = "TCP"
    ports = ["3306"]
    addresses = var.addresses
  }
  linodes = var.linodes
}
  • Tệp này sử dụng tài nguyên của Nhà cung cấp Terraform Linode linode_firewallđể tạo Tường lửa đám mây với các quy tắc đến được mô tả ở trên.
  • Đối linodessố mong đợi một danh sách ID Linode. Khi ID Linode được truyền cho linodesđối số, mysqltường lửa sẽ được gán cho ID đó.
  • Các đối số labeltagslinodes, và addressessử dụng các biến đầu vào , cho phép tùy chỉnh các giá trị này khi sử dụng mô-đun cho cấu hình tài nguyên của bạn.

2.Tạo variables.tftệp để khai báo inbound_sshcác biến đầu vào của mô-đun. Sao chép và lưu nội dung của ví dụ bên dưới.

variable "linodes" {
  description = "List of Linode ids to which the rule sets will be applied"
  type        = list(string)
  default     = []
}

variable "firewall_label" {
  description = "This firewall's human-readable firewall_label"
  type = string
  default = "my-firewall"
}

variable "tags" {
  description = "List of tags to apply to this Firewall"
  type        = list(string)
  default     = []
}

variable "addresses" {
  description = "A list of IP addresses, CIDR blocks, or 0.0.0.0/0 (to allow all) this rule applies to."
  type        = list(string)
  default     = ["0.0.0.0/0"]
}

Các biến đầu vào được khai báo trong tệp này tương ứng với linode_firewallscác đối số tài nguyên mà mysqlmô-đun đưa ra để tùy chỉnh.

Tạo Mô-đun con của Máy chủ Web

Khi được áp dụng, mô web_server-đun con sẽ tạo ra Tường lửa đám mây với các quy tắc vào và ra cho phép các kết nối vào và ra từ mọi nguồn và đích đến đến các cổng 80và 443qua TCP. Các cổng này thường được liên kết với HTTP và HTTPS .

1.Sử dụng trình soạn thảo văn bản ưa thích của bạn, tạo tệp web_servermô-đun main.tf. Sao chép và lưu nội dung của ví dụ bên dưới.

terraform {
  required_providers {
    linode = {
      source = "linode/linode"
      version = "1.16.0"
    }
  }
}

resource "linode_firewall" "web_server" {
  label = var.firewall_label
  tags  = var.tags

  inbound {
    protocol = "TCP"
    ports = ["80"]
    addresses = ["0.0.0.0/0"]
  }

  outbound {
    protocol  = "TCP"
    ports     = ["80"]
    addresses = ["0.0.0.0/0"]
  }

  inbound {
    protocol = "TCP"
    ports = ["443"]
    addresses = ["0.0.0.0/0"]
  }

  outbound {
    protocol  = "TCP"
    ports     = ["443"]
    addresses = ["0.0.0.0/0"]
  }

  linodes = var.linodes
}
  • Tệp này sử dụng tài nguyên của Nhà cung cấp Terraform Linode linode_firewallđể tạo Tường lửa đám mây với các quy tắc đến và đi được mô tả ở trên.
  • Đối linodessố mong đợi một danh sách ID Linode. Khi ID Linode được truyền cho linodesđối số, web_servertường lửa sẽ được gán cho ID đó.
  • Các đối số labeltags, và linodessử dụng các biến đầu vào , cho phép tùy chỉnh các giá trị này khi sử dụng mô-đun cho cấu hình tài nguyên của bạn.

2.Tạo variables.tftệp để khai báo web_servercác biến đầu vào của mô-đun. Sao chép và lưu nội dung của ví dụ bên dưới.

variable "linodes" {
  description = "List of Linode ids to which the rule sets will be applied"
  type        = list(string)
  default     = []
}

variable "firewall_label" {
  description = "This firewall's human-readable firewall_label"
  type = string
  default = "my-firewall"
}

variable "tags" {
  description = "List of tags to apply to this Firewall"
  type        = list(string)
  default     = []
}
  1. Các biến đầu vào được khai báo trong tệp này tương ứng với linode_firewallscác đối số tài nguyên mà web_servermô-đun đưa ra để tùy chỉnh.

Tạo mô-đun gốc

Bây giờ tất cả các mô-đun con của Cloud Firewall đã được tạo, bạn có thể tạo mô-đun gốc của mình. Mô-đun gốc chịu trách nhiệm xác định cơ sở hạ tầng sẽ được Terraform xây dựng. Mô-đun gốc có quyền truy cập vào tất cả các mô-đun con và có thể sử dụng tất cả hoặc không sử dụng mô-đun nào trong số chúng. Trong phần này, bạn sẽ tạo một mô-đun gốc có thể tạo Cloud Firewall bằng các quy tắc được xác định trong web_servermô-đun con. Nó cũng tạo hai phiên bản Linode và chỉ định Cloud Firewall cho cả hai phiên bản Linode.

1.Sử dụng trình soạn thảo văn bản ưa thích của bạn, tạo tệp mô-đun gốc main.tf. Sao chép và lưu nội dung của ví dụ bên dưới.

terraform {
  required_providers {
    linode = {
      source = "linode/linode"
      version = "1.16.0"
    }
  }
}

provider "linode" {
    api_version = "v4beta"
    token = var.token
}

locals {
    key = var.key
    linode_ids = linode_instance.linode_base[*].id
}

module "firewalls_web" {
    source = "./modules/web_server"
    firewall_label = var.firewall_label_map["web"]
    tags = var.tags
    linodes = local.linode_ids
}

resource "linode_sshkey" "main_key" {
    label = var.key_label
    ssh_key = chomp(file(local.key))
}

resource "linode_instance" "linode_base" {
    count = var.linode_count
    image = var.image
    label = "${var.label}_${count.index}"
    region = var.region
    type = var.type
    authorized_keys = [ linode_sshkey.main_key.ssh_key ]
    root_pass = var.root_pass
}
  • Khối này providerlà yêu cầu bắt buộc để sử dụng nhà cung cấp Linode. Vì Cloud Firewall hiện đang trong giai đoạn beta mở, bạn phải sử dụng api_versionđối số để yêu cầu Terraform sử dụng điểm cuối API beta v4 của Linode .
  • Khối này localskhai báo một biến cục bộ keycó giá trị sẽ được cung cấp bởi một biến đầu vào. linode_idsBiến cục bộ được sử dụng bởi web_serverphiên bản mô-đun trong khối tiếp theo để lấy ID Linode cho các Linode được chỉ định cho Cloud Firewall sẽ được tạo.
  • Khối này module "firewalls_web"tạo ra một phiên bản của web_servermô-đun con, khi áp dụng sẽ tạo ra một Cloud Firewall mới với các cấu hình do mô-đun con cung cấp và các giá trị biến đầu vào mà bạn sẽ cung cấp ở bước sau.
  • Đối số này sourcecung cấp vị trí của mã nguồn mô-đun con và là bắt buộc bất cứ khi nào bạn tạo một phiên bản của mô-đun.
  • Tất cả các đối số khác được xác định bởi mô-đun con. Vì web_servermô-đun con hiển thị các giá trị firewall_labeltags, và linodes, phải được cung cấp cho chúng. Các biến đầu vào được sử dụng trong mô-đun gốc để làm cho nó có thể tái sử dụng. Tùy thuộc vào mô-đun con mà bạn đang sử dụng và nhãn bạn muốn gán cho Cloud Firewall, bạn nên thay thế giá trị khóa cho var.firewall_label_map["web"]. Tham khảo tệp variables.tfđể biết chi tiết.
  • Đối linodessố lấy giá trị của nó từ biến cục bộ được xác định trong khối trước đó.
  • Tài linode_sshkeynguyên sẽ tạo Linode SSH Keys được liên kết với tài khoản Linode của bạn. Các khóa này có thể được sử dụng lại cho các lần triển khai Linode trong tương lai sau khi tài nguyên đã được tạo.
  • ssh_key = chomp(file(local.key))sử dụng hàm tích hợp của Terraform file()để cung cấp đường dẫn tệp cục bộ đến vị trí khóa SSH công khai của bạn. Vị trí của đường dẫn tệp là giá trị của biến cục bộ keychomp()Hàm tích hợp xóa các dòng mới theo sau khỏi khóa SSH.
  • Tài nguyên này linode_instancetạo ra hai phiên bản Linode với các cấu hình được cung cấp bởi các đối số của nó.
  • Đối số này countkiểm soát số lượng phiên bản Linode sẽ được tạo bằng các cấu hình được cung cấp trong các đối số của khối tài nguyên.
  • Vì nhãn Linode phải là duy nhất nên labelđối số sẽ tạo nhãn dựa trên giá trị được cung cấp cho var.labelbiến đầu vào và số chỉ mục biểu thị phiên bản Linode được tạo.
  • Đối authorized_keyssố sử dụng khóa công khai SSH do linode_sshkeytài nguyên trong khối tài nguyên trước đó cung cấp.

2.Tạo variables.tftệp để khai báo các biến đầu vào của mô-đun gốc. Các biến đầu vào này là sự kết hợp của tất cả các giá trị được yêu cầu bởi các tài nguyên khác nhau được sử dụng trong tệp main.tf. Bạn có thể cập nhật các giá trị mặc định theo sở thích của riêng bạn.

variable "token" {
  description = " Linode API token"
}

variable "key" {
  description = "Public SSH Key's path."
}

variable "key_label" {
  description = "New SSH key label."
}

variable "linode_count" {
  description = "The number of Linode instances to deploy."
  type = number
  default = 1
}

variable "image" {
  description = "Image to use for Linode instance."
  default = "linode/ubuntu18.04"
}

variable "label" {
  description = "The Linode's label is for display purposes only, but must be unique."
  default = "default-linode"
}

variable "region" {
  description = "The region where your Linode will be located."
  default = "us-east"
}

variable "type" {
  description = "Your Linode's plan type."
  default = "g6-standard-1"
}

variable "root_pass" {
  description = "Your Linode's root user's password."
}

variable "linodes" {
  description = "List of Linode ids to which the rule sets will be applied"
  type        = list(string)
  default     = []
}

variable "firewall_label_map" {
  type = "map"
  default = {
    "web" = "firewall_web_server"
    "mysql" = "firewall_mysql"
    "ssh" = "firewall_ssh"
  }
}

variable "tags" {
  description = "List of tags to apply to this Firewall"
  type        = list(string)
  default     = []
}

Khai báo biến cho firewall_label_map, theo mặc định, tạo một bản đồ với các khóa mặc định weblà , mysql, và ssh. Bạn có thể sử dụng các khóa này để cung cấp các giá trị mặc định của bản đồ cho firewall_labelđối số. Ngoài ra, bạn có thể ghi đè các giá trị mặc định trong tệp terraform.tfvarsmà bạn sẽ tạo ở bước sau.

3.Tạo outputs.tftệp. Tệp này hiển thị ID của các phiên bản Linode được tạo bởi linode_instancekhối tài nguyên và sẽ được in ra bảng điều khiển của bạn khi cấu hình của mô-đun gốc được áp dụng.

output "linode_id" {
    value = linode_instance.linode_base[*].id
}

4.Tạo terraform.tfvarstệp để cung cấp giá trị cho tất cả các biến đầu vào được xác định trong variables.tftệp. Tệp này sẽ loại trừ bất kỳ giá trị nào cung cấp dữ liệu nhạy cảm, như mật khẩu và mã thông báo API. Một tệp chứa các giá trị nhạy cảm sẽ được tạo ở bước tiếp theo. Bạn có thể thay thế bất kỳ giá trị nào trong số này bằng giá trị của riêng bạn.

key = "~/.ssh/id_rsa.pub"
linode_count = 3
key_label = "my-ssh-key"
label = "linode"
tags = ["my-example-tag"]
firewall_label_map = {
    "web" = "firewall_webserver_http_https"
}

5.Tạo một tệp có tên secrets.tfvarsđể lưu trữ bất kỳ giá trị nhạy cảm nào. Thay thế các giá trị ví dụ bằng giá trị của riêng bạn.

token = "my-api-v4-token"
root_pass = "my-super-strong-root-password"

Ghi chú: Tệp này không bao giờ được theo dõi trong phần mềm kiểm soát phiên bản và phải được liệt kê trong .gitignoretệp của bạn nếu sử dụng GitHub.

Bây giờ bạn đã sẵn sàng áp dụng main_firewallscấu hình Terraform của mô-đun. Các bước này sẽ được hoàn tất trong phần tiếp theo.

Khởi tạo, lập kế hoạch và áp dụng cấu hình Terraform

Bất cứ khi nào một nhà cung cấp mới được sử dụng trong cấu hình Terraform, trước tiên nó phải được khởi tạo. Quá trình khởi tạo sẽ tải xuống và cài đặt plugin của nhà cung cấp và thực hiện bất kỳ bước nào khác cần thiết để sử dụng plugin đó. Trước khi áp dụng cấu hình của bạn, việc xem kế hoạch thực hiện cấu hình của bạn trước khi thực hiện bất kỳ thay đổi thực tế nào đối với cơ sở hạ tầng của bạn cũng rất hữu ích. Trong phần này, bạn sẽ hoàn thành tất cả các bước này.

1.Khởi tạo nhà cung cấp Linode. Đảm bảo bạn đang ở trong linode_stackscriptsthư mục trước khi chạy lệnh này:

terraform init

Bạn sẽ thấy một thông báo xác nhận rằng plugin của nhà cung cấp đã được khởi tạo thành công.

2.Chạy lệnh Terraform plan:

terraform plan -var-file="secrets.tfvars" -var-file="terraform.tfvars"

Kế hoạch Terraform sẽ không thực hiện bất kỳ hành động nào hoặc thực hiện bất kỳ thay đổi nào trên tài khoản Linode của bạn. Thay vào đó, một phân tích được thực hiện để xác định hành động nào (tức là tạo, xóa hoặc sửa đổi phiên bản Linode) là cần thiết để đạt được trạng thái được mô tả trong cấu hình của bạn.

2.Bây giờ bạn đã sẵn sàng để tạo cơ sở hạ tầng được xác định trong tệp cấu hình mô-đun gốc của mình main.tf:

terraform apply -var-file="secrets.tfvars" -var-file="terraform.tfvars"

Vì bạn đang sử dụng nhiều tệp giá trị biến, bạn phải gọi từng tệp riêng lẻ bằng var-fileđối số. Bạn sẽ được nhắc xác nhận hành applyđộng. Nhập yes và nhấn enter . Terraform sẽ bắt đầu tạo các tài nguyên bạn đã xác định trong suốt hướng dẫn này. Quá trình này sẽ mất vài phút để hoàn tất. Sau khi cơ sở hạ tầng được xây dựng thành công, bạn sẽ thấy đầu ra tương tự:

Apply complete! Resources: 3 added, 0 changed, 0 destroyed.

4.Bạn có thể xác minh Tường lửa đám mây của mình đã được tạo và áp dụng cho phiên bản Linode mới hay chưa bằng cách đăng nhập vào Trình quản lý đám mây Linode và điều hướng đến phần Tường lửa của trình quản lý.

Các bước tiếp theo

Để tìm hiểu cách kiểm soát phiên bản mô main-firewalls-đun mà bạn đã tạo trong hướng dẫn này, hãy xem hướng dẫn Tạo mô-đun Terraform .

Thông tin thêm

Bạn có thể muốn tham khảo các nguồn sau để biết thêm thông tin về chủ đề này. Mặc dù chúng tôi cung cấp với hy vọng rằng chúng sẽ hữu ích, nhưng xin lưu ý rằng chúng tôi không thể đảm bảo tính chính xác hoặc tính kịp thời của các tài liệu được lưu trữ bên ngoài.

Nguồn: https://www.linode.com/docs/guides/how-to-deploy-secure-linodes-using-cloud-firewalls-and-terraform/