Puppet là một công cụ quản lý cấu hình giúp đơn giản hóa việc quản trị hệ thống. Puppet sử dụng mô hình máy khách/máy chủ trong đó các nút được quản lý của bạn, chạy một quy trình gọi là tác nhân Puppet , trao đổi và kéo xuống các cấu hình từ một máy chủ Puppet .

Triển khai Puppet có thể bao gồm từ nhóm máy chủ nhỏ đến hoạt động cấp doanh nghiệp. Hướng dẫn này sẽ trình bày cách cài đặt Puppet 6.1 trên ba máy chủ:

  • Một Puppet master chạy Ubuntu 18.04
  • Một nút Puppet được quản lý chạy Ubuntu 18.04
  • Một nút Puppet được quản lý chạy CentOS 7

Sau khi cài đặt, phần tiếp theo sẽ chỉ cho bạn cách bảo mật các máy chủ này thông qua Puppet. Phần này sẽ trình bày các tính năng cốt lõi của ngôn ngữ Puppet.

Ghi chú: Hầu hết các hướng dẫn sẽ hướng dẫn bạn làm theo hướng dẫn Thiết lập và Bảo mật Phiên bản Compute trước khi tiến hành. Vì Puppet sẽ được sử dụng để thực hiện tác vụ này, bạn nên bắt đầu hướng dẫn này với tư cách là người rootdùng. Người dùng bị giới hạn với các đặc quyền quản trị sẽ được cấu hình thông qua Puppet trong các bước sau.

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

Bảng sau đây hiển thị thông tin hệ thống mẫu cho các máy chủ sẽ được triển khai trong hướng dẫn này:

Sự miêu tảBẠNTên máy chủSố hiệu đầy đủĐịa chỉ IP
Người điều khiển rốiUbuntu 18.04con rốipuppet.example.com192.0.2.2
Nút 1 (Ubuntu)Ubuntu 18.04tác nhân rối-ubuntucon rối-agent-ubuntu.example.com192.0.2.3
Nút 2 (CentOS)CentOS 7con rối-đại lý-centoscon rối-agent-centos.example.com192.0.2.4

Bạn có thể chọn tên máy chủ khác nhau và tên miền đủ điều kiện (FQDN) cho mỗi máy chủ của mình và địa chỉ IP cho máy chủ của bạn sẽ khác với các địa chỉ ví dụ được liệt kê. Bạn sẽ cần phải có tên miền đã đăng ký để chỉ định FQDN cho máy chủ của mình.

Trong suốt hướng dẫn này, các lệnh và đoạn mã sẽ tham chiếu đến các giá trị được hiển thị trong bảng này. Bất cứ khi nào giá trị như vậy xuất hiện, hãy thay thế bằng giá trị của riêng bạn.

Tạo Linode của bạn

  1. Tạo ba Linode tương ứng với các máy chủ được liệt kê trong bảng trên. Puppet master Linode của bạn phải có ít nhất bốn lõi CPU; gói Linode 8GB được khuyến nghị. Hai nút còn lại có thể có bất kỳ kích thước gói nào, tùy thuộc vào cách bạn định sử dụng chúng sau khi Puppet được cài đặt và cấu hình.
  2. Cấu hình múi giờ trên các nút chính và nút tác nhân của bạn để tất cả chúng đều có cùng dữ liệu thời gian.
  3. Đặt tên máy chủ cho mỗi máy chủ.
  4. Đặt FQDN cho mỗi Linode bằng cách chỉnh sửa các tệp của máy chủ /etc/hosts.
  5. Thiết lập bản ghi DNS cho FQDN của Linode. Đối với mỗi Linode, hãy tạo một bản ghi A mới với tên được chỉ định bởi FQDN của nó và gán nó cho địa chỉ IP của Linode đó.Nếu bạn không sử dụng máy chủ tên của Linode cho tên miền của mình, hãy tham khảo trang web của cơ quan quản lý máy chủ tên để biết hướng dẫn về cách chỉnh sửa bản ghi DNS.

Người điều khiển rối

Cài đặt phần mềm Puppet Server

Puppet master chạy puppetserverdịch vụ, có trách nhiệm biên dịch và cung cấp hồ sơ cấu hình cho các nút được bạn quản lý.

Dịch puppetservervụ có dịch vụ tác nhân Puppet làm phụ thuộc (chỉ được gọi puppetkhi chạy trên hệ thống của bạn). Điều này có nghĩa là phần mềm tác nhân cũng sẽ được cài đặt và có thể chạy trên máy chủ của bạn. Vì máy chủ của bạn có thể chạy dịch vụ tác nhân, bạn có thể cấu hình máy chủ của mình thông qua Puppet giống như bạn có thể cấu hình các nút được quản lý khác của mình.

1.Đăng nhập vào Puppet master của bạn thông qua SSH (với tư cách là root):

ssh root@puppet.example.com

2.Tải xuống kho lưu trữ Puppet, cập nhật các gói hệ thống của bạn và cài đặt puppetserver:

wget https://apt.puppet.com/puppet-release-bionic.deb
dpkg -i puppet-release-bionic.deb
apt update
apt install puppetserver

Cấu hình phần mềm máy chủ

1.Sử dụng puppet configlệnh để thiết lập giá trị cho dns_alt_namescài đặt:

/opt/puppetlabs/bin/puppet config set dns_alt_names 'puppet,puppet.example.com' --section main

Nếu bạn kiểm tra tệp cấu hình, bạn sẽ thấy cài đặt đã được thêm vào:

cat /etc/puppetlabs/puppet/puppet.conf
[main]
dns_alt_names = puppet,puppet.example.com
# ...

Ghi chú:Theo mặc định, lệnh puppetkhông được thêm vào PATH của bạn. Sử dụng lệnh tương tác của Puppet yêu cầu đường dẫn tệp đầy đủ. Để tránh điều này, hãy cập nhật PATH cho phiên shell hiện tại của bạn:

export PATH=/opt/puppetlabs/bin:$PATH

Một giải pháp lâu dài hơn là thêm điều này vào tệp của .profilebạn .bashrc.

2.Cập nhật Puppet master của bạn /etc/hostsđể giải quyết địa chỉ IP của các nút được quản lý của bạn. Ví dụ, /etc/hoststệp của bạn có thể trông như sau:

127.0.0.1   localhost
192.0.2.2   puppet.example.com puppet

192.0.2.3   puppet-agent-ubuntu.example.com puppet-agent-ubuntu
192.0.2.4   puppet-agent-centos.example.com puppet-agent-centos

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Ghi chú: Đoạn mã này kết hợp khai báo FQDN được mô tả trong phần Tạo Linodes của bạn .

3.Khởi động và kích hoạt puppetserverdịch vụ:

systemctl start puppetserver
systemctl enable puppetserver

Theo mặc định, Puppet master sẽ lắng nghe các kết nối của máy khách trên cổng 8140. Nếu dịch puppetservervụ không khởi động được, hãy kiểm tra xem cổng đó đã được sử dụng chưa:

netstat -anpl | grep 8140

Các tác nhân bù nhìn

Cài đặt Puppet Agent

1.Trên nút được quản lý của bạn chạy Ubuntu 18.04 , hãy cài đặt puppet-agentgói:

wget https://apt.puppet.com/puppet-release-bionic.deb
dpkg -i puppet-release-bionic.deb
apt update
apt install puppet-agent

2.Trên nút được quản lý của bạn đang chạy CentOS 7 , hãy nhập:

rpm -Uvh https://yum.puppet.com/puppet/puppet-release-el-7.noarch.rpm
yum install puppet-agent

Cấu hình Puppet Agent

1.Sửa đổi các tệp máy chủ của các nút được quản lý của bạn để giải quyết IP của Puppet master. Để thực hiện, hãy thêm một dòng như sau:

192.0.2.2    puppet.example.com puppet

2.Trên mỗi nút được quản lý, hãy sử dụng puppet configlệnh để đặt giá trị cho servercài đặt của bạn thành FQDN của máy chủ chính:

/opt/puppetlabs/bin/puppet config set server 'puppet.example.com' --section main

Nếu bạn kiểm tra tệp cấu hình trên các nút, bạn sẽ thấy cài đặt đã được thêm vào:

cat /etc/puppetlabs/puppet/puppet.conf
[main]
server = puppet.example.com
# ...

3.Sử dụng puppet resourcelệnh để khởi động và kích hoạt dịch vụ tác nhân Puppet:

/opt/puppetlabs/bin/puppet resource service puppet ensure=running enable=true

Ghi chú:Trên hệ thống systemd, lệnh trên tương đương với việc sử dụng hai systemctllệnh sau:

systemctl start puppet
systemctl enable puppet

Tạo và ký chứng chỉ

Trước khi các nút được quản lý của bạn có thể nhận cấu hình từ máy chủ, trước tiên chúng cần được xác thực:

1.Trên các tác nhân Puppet của bạn , hãy tạo một chứng chỉ để người điều khiển Puppet ký:

/opt/puppetlabs/bin/puppet agent -t 

Lệnh này sẽ xuất ra lỗi, thông báo rằng không tìm thấy chứng chỉ nào. Lỗi này là do chứng chỉ được tạo ra cần được Puppet master chấp thuận.

2.Đăng nhập vào Puppet master của bạn và liệt kê các chứng chỉ cần phê duyệt:

/opt/puppetlabs/bin/puppetserver ca list 

Nó sẽ xuất ra danh sách tên máy chủ của các nút tác nhân của bạn.

3.Phê duyệt chứng chỉ:

/opt/puppetlabs/bin/puppetserver ca sign --certname puppet-agent-ubuntu.example.com,puppet-agent-centos.example.com

4.Quay lại các nút tác nhân Puppet và chạy lại tác nhân Puppet:

/opt/puppetlabs/bin/puppet agent -t

Bạn sẽ thấy nội dung tương tự như sau:

Info: Downloaded certificate for hostname.example.com from puppet
Info: Using configured environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Retrieving locales
Info: Caching catalog for hostname.example.com
Info: Applying configuration version '1547066428'
Info: Creating state file /opt/puppetlabs/puppet/cache/state/state.yaml
Notice: Applied catalog in 0.02 seconds

Thêm Mô-đun để Cấu hình Nút Đại lý

Các nút Puppet master và agent hiện đã hoạt động, nhưng chúng không an toàn. Dựa trên các khái niệm từ hướng dẫn Thiết lập và bảo mật Compute Instance , nên cấu hình một người dùng giới hạn và tường lửa. Điều này có thể được thực hiện trên tất cả các nút thông qua việc tạo các mô-đun Puppet cơ bản, được hiển thị bên dưới.

Ghi chú: Điều này không nhằm mục đích cung cấp cơ sở cho một máy chủ được bảo vệ hoàn toàn và chỉ nhằm mục đích là điểm khởi đầu. Thay đổi và thêm các quy tắc tường lửa và các tùy chọn cấu hình khác, tùy thuộc vào nhu cầu cụ thể của bạn.

Các mô-đun Puppet là cách Puppet quy định để tổ chức mã cấu hình nhằm phục vụ các mục đích cụ thể, như cài đặt và cấu hình ứng dụng. Bạn có thể tạo các mô-đun tùy chỉnh hoặc có thể tải xuống và sử dụng các mô-đun được xuất bản trên Puppet Forge .

Thêm Người dùng bị giới hạn

Để tạo người dùng giới hạn mới trên các nút của bạn, bạn sẽ tạo và áp dụng một mô-đun mới có tên là accounts. Mô-đun này sẽ sử dụng usertài nguyên .

1.Từ Puppet master , điều hướng đến thư /etc/puppetlabs/code/environments/production/modulesmục. Khi một nút được quản lý yêu cầu cấu hình của nó từ master, quy trình máy chủ Puppet sẽ tìm kiếm các mô-đun của bạn ở vị trí này:

cd /etc/puppetlabs/code/environments/production/modules/

2.Tạo thư mục cho mô accounts-đun mới:

mkdir accounts
cd accounts

3.Tạo các thư mục sau bên trong accountsmô-đun:

mkdir {examples,files,manifests,templates}
Thư mụcSự miêu tả
manifestsMã Puppet cung cấp năng lượng cho mô-đun
filesCác tập tin tĩnh được sao chép vào các nút được quản lý
templatesCác tệp mẫu sẽ được sao chép vào các nút được quản lý có thể tùy chỉnh bằng các biến
examplesMã ví dụ cho thấy cách sử dụng mô-đun

Ghi chú: Xem lại bài viết về nguyên tắc cơ bản của Module của Puppet để biết thêm thông tin về cách cấu trúc một module.

4.Điều hướng đến thư manifestsmục:

cd manifests

5.Bất kỳ tệp nào chứa mã Puppet đều được gọi là manifest và mỗi tệp manifest đều kết thúc bằng .pp. Khi nằm bên trong một mô-đun, manifest chỉ nên định nghĩa một lớp. Nếu thư mục manifests của mô-đun có một init.pptệp, định nghĩa lớp mà nó chứa được coi là lớp chính cho mô-đun. Định nghĩa lớp bên trong init.ppphải có cùng tên với mô-đun.

Tạo một init.pptệp có nội dung của đoạn mã sau. Thay thế tất cả các trường hợp usernamebằng tên người dùng bạn chọn:

class accounts {

  user { 'username':
    ensure      => present,
    home        => '/home/username',
    shell       => '/bin/bash',
    managehome  => true,
    gid         => 'username',
  }

}
Lựa chọnSự miêu tả
ensureĐảm bảo rằng người dùng tồn tại nếu được đặt thành presenthoặc không tồn tại nếu được đặt thànhabsent
homeĐường dẫn đến thư mục home của người dùng
managehomeKiểm soát xem có nên tạo thư mục gốc khi tạo người dùng hay không
shellĐường dẫn đến shell cho người dùng
gidNhóm chính của người dùng

6.Mặc dù lớp khai báo nhóm chính của người dùng là gì, nhưng nó sẽ không tự tạo nhóm. Tạo một tệp mới có tên groups.ppbên trong manifeststhư mục với nội dung sau. Thay thế usernamebằng tên người dùng bạn đã chọn:

class accounts::groups {

  group { 'username':
    ensure  => present,
  }

}

7.accountsLớp của bạn có thể khai báo lớp mới của bạn accounts::groupsđể sử dụng trong accountsphạm vi lớp. Mở init.pptrong trình soạn thảo của bạn và nhập một includekhai báo mới vào đầu lớp:

class accounts {

  include accounts::groups

  # ...

}

8.Người dùng mới phải có quyền quản trị. Vì chúng tôi có các nút tác nhân trên cả hệ thống dựa trên Debian và Red Hat, nên người dùng mới cần phải nằm trong nhóm sudotrên hệ thống Debian và wheelnhóm trên hệ thống Red Hat.

Giá trị này có thể được thiết lập động thông qua việc sử dụng Puppet facts . Hệ thống facts thu thập thông tin hệ thống về các nút của bạn và cung cấp thông tin đó trong manifest của bạn.

Thêm câu lệnh chọn vào đầu accountslớp của bạn:

class accounts {

  $rootgroup = $osfamily ? {
    'Debian'  => 'sudo',
    'RedHat'  => 'wheel',
    default   => warning('This distribution is not supported by the Accounts module'),
  }

  include accounts::groups

  # ...

}

Mã này định nghĩa giá trị cho $rootgroupbiến bằng cách kiểm tra giá trị của , đây là một trong những sự kiện cốt lõi$osfamily của Puppet . Nếu giá trị của không khớp với Debian hoặc Red Hat, giá trị sẽ đưa ra cảnh báo rằng bản phân phối đã chọn không được mô-đun này hỗ trợ.$osfamilydefault

Ghi chú: Ngôn ngữ cấu hình Puppet thực thi mã từ trên xuống dưới. Vì userkhai báo tài nguyên sẽ tham chiếu đến $rootgroupbiến, bạn phải định nghĩa $rootgroup trước khi khai userbáo.

9.Cập nhật tài nguyên người dùng để bao gồm groupstùy chọn như sau:

# ...

user { 'username':
  ensure      => present,
  home        => '/home/username',
  shell       => '/bin/bash',
  managehome  => true,
  gid         => 'username',
  groups      => "$rootgroup",
}

# ...

Giá trị "$rootgroup"được đặt trong dấu ngoặc kép " "thay vì dấu ngoặc đơn ' 'vì đây là biến cần được nội suy trong mã của bạn.

10.Giá trị cuối cùng cần thêm vào là mật khẩu của người dùng. Vì chúng ta không muốn sử dụng văn bản thuần túy, nên mật khẩu phải được cung cấp cho Puppet dưới dạng tóm tắt SHA1, được hỗ trợ theo mặc định. Tạo tóm tắt bằng lệnh openssl:

openssl passwd -1

Bạn sẽ được nhắc nhập mật khẩu. Mật khẩu băm sẽ được xuất ra. Sao chép giá trị này vào bảng tạm của bạn.

11.Cập nhật tài nguyên người dùng để bao gồm tùy passwordchọn như sau; chèn hàm băm mật khẩu đã sao chép của bạn làm giá trị cho tùy chọn:

# ...

user { 'username':
  ensure      => present,
  home        => '/home/username',
  shell       => '/bin/bash',
  managehome  => true,
  gid         => 'username',
  groups      => "$rootgroup",
  password    => 'your_password_hash',
}

# ...

Quan trọng: Mật khẩu băm phải được đặt trong dấu ngoặc đơn ' '.

12.Sau khi lưu các thay đổi, hãy sử dụng trình phân tích cú pháp Puppet để đảm bảo mã là chính xác:

/opt/puppetlabs/bin/puppet parser validate init.pp

Bất kỳ lỗi nào cần được xử lý sẽ được ghi vào đầu ra chuẩn. Nếu không có gì được trả về, mã của bạn là hợp lệ.

13.Điều hướng đến thư examplesmục và tạo một init.pptệp khác:

cd ../examples
include accounts

14.Khi vẫn còn trong examplesthư mục, hãy kiểm tra mô-đun:

/opt/puppetlabs/bin/puppet apply --noop init.pp

Ghi chú: Tham số này --noopngăn không cho Puppet áp dụng mô-đun vào hệ thống của bạn và thực hiện bất kỳ thay đổi nào.

Notice: Compiled catalog for puppet.example.com in environment production in 0.26 seconds
Notice: /Stage[main]/Accounts::Groups/Group[username]/ensure: current_value absent, should be present (noop)
Notice: Class[Accounts::Groups]: Would have triggered 'refresh' from 1 events
Notice: /Stage[main]/Accounts/User[username]/ensure: current_value absent, should be present (noop)
Notice: Class[Accounts]: Would have triggered 'refresh' from 1 events
Notice: Stage[main]: Would have triggered 'refresh' from 2 events
Notice: Finished catalog run in 0.02 seconds

15.Một lần nữa từ examplesthư mục, chạy puppet applyđể thực hiện những thay đổi sau cho máy chủ Puppet master:

/opt/puppetlabs/bin/puppet apply init.pp

Puppet sẽ tạo người dùng Linux giới hạn trên máy chủ của bạn.

16.Đăng xuất rootvà đăng nhập vào Puppet master với tư cách là người dùng mới của bạn.

Chỉnh sửa cài đặt SSH

Mặc dù người dùng giới hạn mới đã được thêm thành công vào Puppet master, vẫn có thể đăng nhập vào hệ thống với tư cách là root. Để bảo mật hệ thống của bạn đúng cách, quyền truy cập root phải bị vô hiệu hóa.

Ghi chú: Vì hiện tại bạn đã đăng nhập vào Puppet master với tư cách là người dùng bị giới hạn nên bạn sẽ cần thực thi lệnh và chỉnh sửa tệp bằng quyền sudo của người dùng.

1.Điều hướng đến filesthư mục trong accountsmô-đun:

cd /etc/puppetlabs/code//production/modules/accounts/files

2.Sao chép tập tin hiện có của hệ thống sshd_configvào thư mục này:

sudo cp /etc/ssh/sshd_config .

3.Mở tệp trong trình soạn thảo của bạn (đảm bảo rằng bạn mở tệp bằng sudoquyền) và đặt PermitRootLogingiá trị thành no:

PermitRootLogin no

4.PermitRootLogin no

cd ../manifests

5.Tạo một manifest mới có tên là ssh.pp. Sử dụng filetài nguyên để thay thế tệp cấu hình SSH mặc định bằng tệp do Puppet quản lý:

class accounts::ssh {

  file { '/etc/ssh/sshd_config':
    ensure  => present,
    source  => 'puppet:///modules/accounts/sshd_config',
  }

}

Ghi chú: Thư filesmục bị bỏ qua khỏi sourcedòng vì filesthư mục là vị trí mặc định của các tệp trong một mô-đun. Để biết thêm thông tin về định dạng được sử dụng để truy cập tài nguyên trong một mô-đun, hãy tham khảo tài liệu mô-đun Puppet chính thức .

6.Tạo một tài nguyên thứ hai để khởi động lại dịch vụ SSH và thiết lập để chạy bất cứ khi nào sshd_configcó thay đổi. Điều này cũng sẽ yêu cầu một câu lệnh selector vì dịch vụ SSH được đặt tên sshtrên hệ thống Debian và sshdtrên hệ thống Red Hat:

class accounts::ssh {

  $sshname = $osfamily ? {
    'Debian'  => 'ssh',
    'RedHat'  => 'sshd',
    default   => warning('This distribution is not supported by the Accounts module'),
  }

  file { '/etc/ssh/sshd_config':
    ensure  => present,
    source  => 'puppet:///modules/accounts/sshd_config',
    notify  => Service["$sshname"],
  }

  service { "$sshname":
    hasrestart  => true,
  }

}

Ghi chú: notify là một trong những siêu tham số quan hệ của Puppet .

7.Bao gồm accounts::sshlớp trong accountslớp trong init.pp:

class accounts {

  # ...

  include accounts::groups
  include accounts::ssh

  # ...

}

Nội dung của bạn init.ppbây giờ sẽ trông giống như đoạn trích sau:

class accounts {

    $rootgroup = $osfamily ? {
        'Debian' => 'sudo',
        'RedHat' => 'wheel',
        default => warning('This distro not supported by Accounts module'),
    }

    include accounts::groups
    include accounts::ssh

    user { 'example':
        ensure  => present,
        home    => '/home/username',
        shell   => '/bin/bash',
        managehome  => true,
        gid     => 'username',
        groups  => "$rootgroup",
        password => 'your_password_hash'
    }

}

8.Chạy trình phân tích cú pháp Puppet để kiểm tra cú pháp của lớp mới, sau đó điều hướng đến thư examplesmục để kiểm tra và chạy bản cập nhật cho accountslớp của bạn:

sudo /opt/puppetlabs/bin/puppet parser validate ssh.pp
cd ../examples
sudo /opt/puppetlabs/bin/puppet apply --noop init.pp
sudo /opt/puppetlabs/bin/puppet apply init.pp

Ghi chú: Bạn có thể thấy dòng sau trong đầu ra khi xác thực:

Error: Removing mount "files": /etc/puppet/files does not exist or is not a directory

Điều này đề cập đến tệp cấu hình Puppet, không phải tài nguyên mô-đun mà bạn đang cố gắng sao chép. Nếu đây là lỗi duy nhất trong đầu ra của bạn, thao tác vẫn có thể thành công.

9.Để đảm bảo sshlớp học hoạt động bình thường, hãy đăng xuất khỏi Puppet master rồi thử đăng nhập bằng root. Bạn sẽ không thể làm như vậy.

hêm và cấu hình IPtables

Để hoàn tất cài đặt bảo mật của hướng dẫn này, tường lửa cần được cấu hình trên Puppet master và các nút của bạn. Phần iptablesmềm tường lửa sẽ được sử dụng.

1.Theo mặc định, các thay đổi đối với iptablesquy tắc của bạn sẽ không tồn tại qua các lần khởi động lại. Để tránh điều này, hãy cài đặt gói phù hợp trên Puppet master và các nút của bạn:

Ubuntu/Debian :

sudo apt install iptables-persistent

CentOS 7 :

CentOS 7 sử dụng firewalld theo mặc định làm bộ điều khiển cho iptables. Hãy đảm bảo firewalld đã dừng và vô hiệu hóa trước khi bắt đầu làm việc trực tiếp với iptables:

sudo systemctl stop firewalld && sudo systemctl disable firewalld
sudo yum install iptables-services

2.Trên máy chủ Puppet của bạn, hãy cài đặt mô-đun tường lửa của Puppet Lab từ Puppet Forge:

sudo /opt/puppetlabs/bin/puppet module install puppetlabs-firewall

Mô-đun sẽ được cài đặt trong /etc/puppetlabs/code/environments/production/modulesthư mục của bạn.

3.Điều hướng đến manifeststhư mục bên trong mô-đun mới firewall:

cd /etc/puppetlabs/code/environments/production/modules/firewall/manifests/

4.Tạo một tệp có tiêu đề pre.pp, trong đó sẽ chứa tất cả các quy tắc mạng cơ bản cần chạy trước tiên:

class firewall::pre {

  Firewall {
    require => undef,
  }

   # Accept all loopback traffic
  firewall { '000 lo traffic':
    proto       => 'all',
    iniface     => 'lo',
    action      => 'accept',
  }->

   #Drop non-loopback traffic
  firewall { '001 reject non-lo':
    proto       => 'all',
    iniface     => '! lo',
    destination => '127.0.0.0/8',
    action      => 'reject',
  }->

   #Accept established inbound connections
  firewall { '002 accept established':
    proto       => 'all',
    state       => ['RELATED', 'ESTABLISHED'],
    action      => 'accept',
  }->

   #Allow all outbound traffic
  firewall { '003 allow outbound':
    chain       => 'OUTPUT',
    action      => 'accept',
  }->

   #Allow ICMP/ping
  firewall { '004 allow icmp':
    proto       => 'icmp',
    action      => 'accept',
  }

   #Allow SSH connections
  firewall { '005 Allow SSH':
    dport    => '22',
    proto   => 'tcp',
    action  => 'accept',
  }->

   #Allow HTTP/HTTPS connections
  firewall { '006 HTTP/HTTPS connections':
    dport    => ['80', '443'],
    proto   => 'tcp',
    action  => 'accept',
  }

}

5.Trong cùng thư mục, tạo post.pp, lệnh này sẽ chạy bất kỳ quy tắc tường lửa nào cần được nhập cuối cùng:

class firewall::post {

  firewall { '999 drop all':
    proto  => 'all',
    action => 'drop',
    before => undef,
  }

}

Các quy tắc này sẽ chỉ đạo hệ thống loại bỏ mọi lưu lượng truy cập đến chưa được phép qua tường lửa.

6.Chạy trình phân tích cú pháp Puppet trên cả hai tệp để kiểm tra lỗi cú pháp:

sudo /opt/puppetlabs/bin/puppet parser validate pre.pp
sudo /opt/puppetlabs/bin/puppet parser validate post.pp

7.Điều hướng đến thư mục chính manifests:

cd /etc/puppetlabs/code/environments/production/manifests

8.Tạo một tệp có tên site.ppbên trong /etc/puppetlabs/code/environments/production/manifests. Tệp này là manifest chính cho dịch vụ máy chủ Puppet. Tệp này được sử dụng để ánh xạ các mô-đun, lớp và tài nguyên vào các nút mà chúng cần được áp dụng.

node default {

}

node 'puppet.example.com' {

  include accounts

  resources { 'firewall':
    purge => true,
  }

  Firewall {
    before        => Class['firewall::post'],
    require       => Class['firewall::pre'],
  }

  class { ['firewall::pre', 'firewall::post']: }

  firewall { '200 Allow Puppet Master':
    dport         => '8140',
    proto         => 'tcp',
    action        => 'accept',
  }

}

9.Chạy site.pptệp qua trình phân tích cú pháp Puppet để kiểm tra lỗi cú pháp. Sau đó, kiểm tra tệp bằng tùy --noopchọn để xem tệp có chạy được không:

sudo /opt/puppetlabs/bin/puppet parser validate site.pp
sudo /opt/puppetlabs/bin/puppet apply --noop site.pp

Nếu thành công, hãy chạy puppet applymà không có --nooptùy chọn:

sudo /opt/puppetlabs/bin/puppet apply site.pp

10.Sau khi Puppet hoàn tất việc áp dụng các thay đổi, hãy kiểm tra các quy tắc iptables của Puppet master:

sudo iptables -L

Nó sẽ trả về:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere             /* 000 lo traffic */
REJECT     all  --  anywhere             127.0.0.0/8          /* 001 reject non-lo */ reject-with icmp-port-unreachable
ACCEPT     all  --  anywhere             anywhere             /* 002 accept established */ state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere             /* 004 allow icmp */
ACCEPT     tcp  --  anywhere             anywhere             multiport ports ssh /* 005 Allow SSH */
ACCEPT     tcp  --  anywhere             anywhere             multiport ports http,https /* 006 HTTP/HTTPS connections */
ACCEPT     tcp  --  anywhere             anywhere             multiport ports 8140 /* 200 Allow Puppet Master */
DROP       all  --  anywhere             anywhere             /* 999 drop all */

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere             /* 003 allow outbound */

Áp dụng các mô-đun cho các nút tác nhân

Bây giờ các mô-đun accountsvà firewallđã được tạo, thử nghiệm và chạy trên Puppet master, đã đến lúc áp dụng chúng vào các nút được quản lý của bạn.

1.Trên Puppet master , điều hướng đến /etc/puppetlabs/code/environments/production/manifests:

cd /etc/puppetlabs/code/environments/production/manifest

2.Cập nhật site.ppđể khai báo các mô-đun, lớp và tài nguyên cần áp dụng cho mỗi nút được quản lý:

node default {

}

node 'puppet.example.com' {
  # ...
}

node 'puppet-agent-ubuntu.example.com' {

  include accounts

  resources { 'firewall':
    purge => true,
  }

  Firewall {
    before        => Class['firewall::post'],
    require       => Class['firewall::pre'],
  }

  class { ['firewall::pre', 'firewall::post']: }

}

node 'puppet-agent-centos.example.com' {

  include accounts

  resources { 'firewall':
    purge => true,
  }

  Firewall {
    before        => Class['firewall::post'],
    require       => Class['firewall::pre'],
  }

  class { ['firewall::pre', 'firewall::post']: }

}

3.Theo mặc định, dịch vụ tác nhân Puppet trên các nút được quản lý của bạn sẽ tự động kiểm tra với máy chủ chính sau mỗi 30 phút và áp dụng bất kỳ cấu hình mới nào từ máy chủ chính. Bạn cũng có thể gọi thủ công quy trình tác nhân Puppet giữa các lần chạy tác nhân tự động.

Đăng nhập vào từng nút được quản lý (với tư cách là root) và chạy tác nhân Puppet:

/opt/puppetlabs/bin/puppet agent -t

4.Để đảm bảo tác nhân Puppet hoạt động:

  • Đăng xuất khỏi phiên SSH gốc của bạn và đăng nhập lại với tư cách là người dùng giới hạn đã được tạo.
  • Kiểm tra các quy tắc tường lửa của nút:
sudo iptables -L

Xin chúc mừng! Bạn đã cài đặt thành công Puppet trên một máy chủ chính và hai nút được quản lý. Bây giờ bạn đã xác nhận mọi thứ đang hoạt động, bạn có thể tạo thêm các mô-đun để tự động hóa việc quản lý cấu hình trên các nút của mình. Để biết thêm thông tin, hãy xem tài liệu nguồn mở của Puppet . Bạn cũng có thể cài đặt và sử dụng các mô-đun mà người khác đã tạo trên Puppet Forge .

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/getting-started-with-puppet-6-1-basic-installation-and-setup/