Tìm hiểu Icinga2 (phần 2)

Ở bài viết lần trước, mình đã monitor 1 host cơ bản với 2 dịch vụ là ping là check web. Sức mạnh chính của Icinga2 nằm trong mô đun của nó. Có hàng ngàn plugin mà cộng đồng có sẵn bên cạnh các plugin chuẩn được cung cấp bởi dự án Monitoring Plugins. Các plugin của cộng đồng có thể được tìm thấy tại Icinga Exchange.

Bài này sẽ hướng dẫn bạn thông qua thiết lập một môi trường giám sát phân tán, bao gồm các tính năng clustering và cài đặt sẵn có cao cho Icinga 2.

  1. Các role của icinga: Master, Satellites, and Clients

Icinga 2 nodes can be given names for easier understanding:

Master node nằm trên đầu của cây phân cấp. Satellites node là con của nút vệ tinh hoặc chủ. Client node hoạt động như một agent nối với các node master hoặc satellites.

  • master node ko có parent node
  • master node là nơi cài Icinga Web 2.
  • Master node có thể bao gồm cả việc checks từ nodes con và cảnh báo.
  • Satellite node có node cha hoặc node con.
  • Satellite node có thể thực thi việc check trên chính nó hoặc phân quyền check tới các nodes con.
  • Satellite node có thể nhận configuration cho hosts/services từ the parent node.
  • Satellite node tiếp tục chạy nếu master node tạm thời dừng hoạt động
  • Client node chỉ có parent node.
  • Client node sẽ chạy các config check từ chính nó hoặc nhận command thực thi event từ parent node
  1. Zones

Hệ thống phân cấp của icinga bao gồm các vùng. Các vùng sẽ dựa vào quan hệ parent-child để tin tưởng lẫn nhau.

VD:

object Zone "master" {
   //...
}

object Zone "satellite region 1" {
  parent = "master"
  //...
}

object Zone "satellite region 2" {
  parent = "master"
  //...
}

Có một số hạn chế nhất định cho các vùng con, ví dụ: Các thành viên của vùng con không được phép gửi các lệnh cấu hình tới các thành viên vùng cha. Ngược lại, hệ thống phân cấp tin cậy cho phép ví dụ vùng master để gửi tập tin cấu hình đến vùng satellite.

  1. Endpoints

Các node là thành viên của một vùng được gọi là các Endpoint.

VD:

object Endpoint "icinga2-master1.localdomain" {
  host = "10.0.1.102"
}

object Endpoint "icinga2-satellite1.localdomain" {
  host = "10.0.1.101"
}

object Zone "master" {
  endpoints = [ "icinga2-master1.localdomain" ]
}

object Zone "satellite" {
  endpoints = [ "icinga2-satellite1.localdomain" ]
  parent = "master"
}

Tất cả các Endpoint trong cùng một vùng hoạt động như thiết lập tính sẵn sàng cao. Ví dụ: nếu bạn có hai node trong vùng master, chúng sẽ cân bằng tải khi thực hiện kiểm tra.

  1. ApiListener

Trong trường hợp bạn đang sử dụng lệnh CLI sau đó, bạn không phải viết cấu hình này từ đầu trong trình soạn thảo văn bản. Đối tượng ApiListener được sử dụng để tải chứng chỉ SSL và chỉ định các hạn chế, ví dụ: Để chấp nhận lệnh cấu hình.

Nó cũng được sử dụng cho Icinga 2 REST API chia sẻ cùng một máy chủ và cổng với giao thức Icinga 2 Cluster.

Cấu hình đối tượng được lưu trong tệp /etc/icinga2/features-enabled/api.conf. Tùy thuộc vào chế độ cấu hình, các thuộc tính accept_commands và accept_config có thể được cấu hình ở đây.

Để sử dụng tính năng api bạn cần kích hoạt nó và khởi động lại Icinga 2.

icinga2 feature enable api

  1. Security

Mặc dù có một số cơ chế để đảm bảo giao tiếp an toàn giữa tất cả các nút (firewalls, policies, software hardening, etc.), Icinga 2 cũng cung cấp bảo mật bổ sung:

  • Giấy chứng nhận SSL là bắt buộc đối với giao tiếp giữa các nút. Các lệnh CLI giúp bạn tạo các chứng chỉ đó.
  • Các vùng con chỉ nhận được các cập nhật (kiểm tra kết quả, các lệnh ...) cho các đối tượng đã được cấu hình của chúng.
  • Các vùng con không được phép cập nhật cấu hình cho các vùng master.
  • Các vùng không thể can thiệp vào các vùng khác và ảnh hưởng lẫn nhau. Mỗi host hoặc service chỉ có thể được gán cho 1 vùng.
  • Tất cả các nút trong một vùng tin tưởng lẫn nhau.
  • Đồng bộ hóa cấu hình và thực hiện lệnh điểm cuối từ xa được tắt theo mặc định.

Giao thức cơ bản sử dụng thông báo sự kiện JSON-RPC được trao đổi bởi các nút. Kết nối được đảm bảo bởi TLS. Giao thức thư sử dụng một API nội bộ, và do các kiểu và tên thông báo như vậy có thể thay đổi nội bộ và không được ghi lại.

  1. Cấu hình Master
  • Các Step:
    • Enable the api feature.
    • Generate a new certificate authority (CA) in /var/lib/icinga2/ca if it doesn’t exist.
    • Create a certificate signing request (CSR) for the local node.
    • Sign the CSR with the local CA and copy all files to the /etc/icinga2/pki directory.
    • Update the zones.conf file with the new zone hierarchy.
    • Update /etc/icinga2/features-enabled/api.conf and constants.conf.
[email protected]:/etc/icinga2# icinga2 node wizard
Welcome to the Icinga 2 Setup Wizard!

We'll guide you through all required configuration details.



Please specify if this is a satellite setup ('n' installs a master setup) [Y/n]: n
Starting the Master setup routine...
Please specify the common name (CN) [ubuntu]: icinga2-master1.localdomain
Checking for existing certificates for common name 'icinga2-master1.localdomain'...
Certificates not yet generated. Running 'api setup' now.
information/cli: Generating new CA.
information/base: Writing private key to '/var/lib/icinga2/ca/ca.key'.
information/base: Writing X509 certificate to '/var/lib/icinga2/ca/ca.crt'.
information/cli: Generating new CSR in '/etc/icinga2/pki/icinga2-master1.localdomain.csr'.
information/base: Writing private key to '/etc/icinga2/pki/icinga2-master1.localdomain.key'.
information/base: Writing certificate signing request to '/etc/icinga2/pki/icinga2-master1.localdomain.csr'.
information/cli: Signing CSR with CA and writing certificate to '/etc/icinga2/pki/icinga2-master1.localdomain.crt'.
information/pki: Writing certificate to file '/etc/icinga2/pki/icinga2-master1.localdomain.crt'.
information/cli: Copying CA certificate to '/etc/icinga2/pki/ca.crt'.
Generating master configuration for Icinga 2.
information/cli: Adding new ApiUser 'root' in '/etc/icinga2/conf.d/api-users.conf'.
information/cli: Enabling the 'api' feature.
Enabling feature api. Make sure to restart Icinga 2 for these changes to take effect.
information/cli: Dumping config items to file '/etc/icinga2/zones.conf'.
information/cli: Created backup file '/etc/icinga2/zones.conf.orig'.
Please specify the API bind host/port (optional):
Bind Host []: 
Bind Port []: 
information/cli: Created backup file '/etc/icinga2/features-available/api.conf.orig'.
warning/cli: CN 'icinga2-master1.localdomain' does not match the default FQDN 'ubuntu'. Requires update for NodeName constant in constants.conf!
information/cli: Updating constants.conf.
information/cli: Created backup file '/etc/icinga2/constants.conf.orig'.
information/cli: Updating constants file '/etc/icinga2/constants.conf'.
information/cli: Updating constants file '/etc/icinga2/constants.conf'.
information/cli: Updating constants file '/etc/icinga2/constants.conf'.
Done.

Now restart your Icinga 2 daemon to finish the installation!

[email protected]:/etc/icinga2# systemctl restart icinga2

Khóa CA public và private key được lưu trữ trong thư mục /var/lib/icinga2/ca.

Trong trường hợp bạn bị mất private key CA, bạn phải tạo một CA mới để sign lại các request của client. Sau đó, bạn phải tạo lại các giấy chứng nhận đã ký cho tất cả các nút hiện có.

  1. Client/Satellite Setup

Icinga 2 trên Master phải chạy và chấp nhận các kết nối trên cổng 5665.

7.1. CSR Auto-Signing

Node wizard sẽ thiết lập một satellite / client bằng cách sử dụng CSR auto-signed. Điều này liên quan đến việc trình hướng dẫn thiết lập sẽ gửi một yêu cầu ký kết chứng chỉ (CSR) đến nút master. Có một cơ chế an toàn bắt client phải gửi một ticket hợp lệ cho việc CSR auto-signing.

Ticket này phải được tạo trước. Thuộc tính ticket_salt cho ApiListener phải được cấu hình để làm việc này.

Có 2 cách để nhận ticket: - CLI command trên master node. - REST API request đến master node.

  • generate ticket trên master node icinga2-master1.localdomain cho client icinga2-client1.localdomain
[email protected]:~# icinga2 pki ticket --cn icinga2-client1.localdomain
01337f92ce0f5137e9d2130ffec49f5d64320014
[email protected]:~# vim /etc/icinga2/conf.d/api-users.conf

object ApiUser "client-pki-ticket" {
  password = "01337f92ce0f5137e9d2130ffec49f5d64320014" 
  permissions = [ "actions/generate-ticket" ]
}

[email protected]:~# systemctl restart icinga2

Nhận ticket trên master node icinga2-master1.localdomain với curl:

[email protected]:~# curl -k -s -u client-pki-ticket:01337f92ce0f5137e9d2130ffec49f5d64320014 -H 'Accept: application/json' -X POST 'https://icinga2-master1.localdomain:5665/v1/actions/generate-ticket' -d '{ "cn": "icinga2-client1.localdomain" }'

{"results":[{"code":200.0,"status":"Generated PKI ticket '01337f92ce0f5137e9d2130ffec49f5d64320014' for common name 'icinga2-client1.localdomain'.","ticket":"01337f92ce0f5137e9d2130ffec49f5d64320014"}]}

Lưu ý: nên save lại cái mã ticket để lát nữa còn sài nhé "01337f92ce0f5137e9d2130ffec49f5d64320014"

7.2 Client/Satellite Linux Setup

  • Các bước:
    • Enable the api feature.
    • Create a certificate signing request (CSR) for the local node.
    • Request a signed certificate with the provided ticket number on the master node.
    • Allow to verify the master’s certificate.
    • Store the signed client certificate and ca.crt in /etc/icinga2/pki.
    • Update the zones.conf file with the new zone hierarchy.
    • Update /etc/icinga2/features-enabled/api.conf (accept_config, accept_commands) and constants.conf.
[email protected]:~# icinga2 node wizard
Welcome to the Icinga 2 Setup Wizard!

We'll guide you through all required configuration details.



Please specify if this is a satellite setup ('n' installs a master setup) [Y/n]: 
Starting the Node setup routine...
Please specify the common name (CN) [icinga2-client1.localdomain]: 
Please specify the master endpoint(s) this node should connect to:
Master Common Name (CN from your master setup): icinga2-master1.localdomain
Do you want to establish a connection to the master from this node? [Y/n]: 
Please fill out the master connection information:
Master endpoint host (Your master's IP address or FQDN): 10.0.1.102
Master endpoint port [5665]: 
Add more master endpoints? [y/N]: 
Please specify the master connection for CSR auto-signing (defaults to master endpoint host):
Host [10.0.1.102]: 
Port [5665]: 
information/base: Writing private key to '/etc/icinga2/pki/icinga2-client1.localdomain.key'.
information/base: Writing X509 certificate to '/etc/icinga2/pki/icinga2-client1.localdomain.crt'.
information/cli: Fetching public certificate from master (10.0.1.102, 5665):

Certificate information:

 Subject:     CN = icinga2-master1.localdomain
 Issuer:      CN = Icinga CA
 Valid From:  Aug 28 16:45:23 2017 GMT
 Valid Until: Aug 24 16:45:23 2032 GMT
 Fingerprint: 5A D5 E0 FE 1A 83 B7 B8 BF B1 8F 41 AC BF AE AB 52 06 1A 46 

Is this information correct? [y/N]: y
information/cli: Received trusted master certificate.

Please specify the request ticket generated on your Icinga 2 master.
 (Hint: # icinga2 pki ticket --cn 'icinga2-client1.localdomain'): 01337f92ce0f5137e9d2130ffec49f5d64320014
information/cli: Requesting certificate with ticket '01337f92ce0f5137e9d2130ffec49f5d64320014'.

information/cli: Created backup file '/etc/icinga2/pki/icinga2-client1.localdomain.crt.orig'.
information/cli: Writing signed certificate to file '/etc/icinga2/pki/icinga2-client1.localdomain.crt'.
information/cli: Writing CA certificate to file '/etc/icinga2/pki/ca.crt'.
Please specify the API bind host/port (optional):
Bind Host []: 
Bind Port []: 
Accept config from master? [y/N]: y
Accept commands from master? [y/N]: y
information/cli: Disabling the Notification feature.
Disabling feature notification. Make sure to restart Icinga 2 for these changes to take effect.
information/cli: Enabling the Apilistener feature.
Enabling feature api. Make sure to restart Icinga 2 for these changes to take effect.
information/cli: Created backup file '/etc/icinga2/features-available/api.conf.orig'.
information/cli: Generating local zones.conf.
information/cli: Dumping config items to file '/etc/icinga2/zones.conf'.
information/cli: Created backup file '/etc/icinga2/zones.conf.orig'.
information/cli: Updating constants.conf.
information/cli: Created backup file '/etc/icinga2/constants.conf.orig'.
information/cli: Updating constants file '/etc/icinga2/constants.conf'.
information/cli: Updating constants file '/etc/icinga2/constants.conf'.
Done.

Now restart your Icinga 2 daemon to finish the installation!

[email protected]:~# systemctl restart icinga2

Update thông tin service trên node master

[email protected]:~# icinga2 node update-config
Warning: CLI command 'node update-config' is DEPRECATED! Please read the Changelog.

information/cli: Updating node configuration for 
Node 'icinga2-client1.localdomain' (last seen: Tue Aug 29 09:50:58 2017)
    * Host 'icinga2-client1.localdomain'
        * Service 'apt'
        * Service 'disk'
        * Service 'disk /'
        * Service 'http'
        * Service 'icinga'
        * Service 'load'
        * Service 'ping4'
        * Service 'ping6'
        * Service 'procs'
        * Service 'ssh'
        * Service 'swap'
        * Service 'users'
information/cli: Adding host 'icinga2-client1.localdomain' to the repository.
information/cli: Dumping changelog items to file '/var/lib/icinga2/repository/changes/1503975062.082587-Host-48bedacfcdf50cf6db9232ebe6650a55f34b80df128227aef15b210aacf25182.change'
information/cli: Dumping changelog items to file '/var/lib/icinga2/repository/changes/1503975062.083129-Service-5009a047a11fbd680bb40d2f23cd3fcd626ac2d672c38e16f53bd622c3961534.change'
information/cli: Dumping changelog items to file '/var/lib/icinga2/repository/changes/1503975062.083353-Service-1044dec7206e8d7c9fbb4ae8f766668406d2567fc7fc1a160a9d4700fcf8f8e9.change'
information/cli: Dumping changelog items to file '/var/lib/icinga2/repository/changes/1503975062.083591-Service-6a29594f8e9a9bd6e6c13fdd4a19c333b3f5cf35377811c8671a1a271d7364ae.change'
information/cli: Dumping changelog items to file '/var/lib/icinga2/repository/changes/1503975062.083824-Service-e0603c499aae47eb89343ad0ef3178e044c62e70ae2309b35591d1d49a3211ec.change'
information/cli: Dumping changelog items to file '/var/lib/icinga2/repository/changes/1503975062.084033-Service-2eb9c534258d20f7c437141670d7c09d7afbab65b2ac9cd2034be27b122cbb41.change'
information/cli: Dumping changelog items to file '/var/lib/icinga2/repository/changes/1503975062.084254-Service-0cf67fc72b3c86c7a454f6d86b43ed245a8e491d0e5288d4da8c7ff43a7bcdb0.change'
information/cli: Dumping changelog items to file '/var/lib/icinga2/repository/changes/1503975062.084460-Service-571605952ba28ee6740b5a9b50f1e76393f1e4cdaf3115438bcdeddf8e473065.change'
information/cli: Dumping changelog items to file '/var/lib/icinga2/repository/changes/1503975062.084683-Service-d7535967c0481dbeb28afe542a40e2f0687f4fc5b5fc5abafacbd4c24ff0d9cf.change'
information/cli: Dumping changelog items to file '/var/lib/icinga2/repository/changes/1503975062.084887-Service-277d2f898036fa83a8f790fd6680e3c89e2cceaa4921a17b6ccb6c8f464ebb97.change'
information/cli: Dumping changelog items to file '/var/lib/icinga2/repository/changes/1503975062.085116-Service-7f5a55cf3f88be936fb9440249cb449f3067ccee4b525d0027dc9278a29c32c1.change'
information/cli: Dumping changelog items to file '/var/lib/icinga2/repository/changes/1503975062.085320-Service-da47c2f450a4f9d538d86d600d55149afd39d6672fdd1f30c68ad5be21cadad8.change'
information/cli: Dumping changelog items to file '/var/lib/icinga2/repository/changes/1503975062.086238-Service-7dfb4cf67742cb0660305e56ef816c53fcec892cae7f6ee39b75f34e659d672c.change'
information/cli: Adding endpoint 'icinga2-client1.localdomain' to the repository.
information/cli: Dumping changelog items to file '/var/lib/icinga2/repository/changes/1503975062.086503-Endpoint-48bedacfcdf50cf6db9232ebe6650a55f34b80df128227aef15b210aacf25182.change'
information/cli: Adding zone 'icinga2-client1.localdomain' to the repository.
information/cli: Dumping changelog items to file '/var/lib/icinga2/repository/changes/1503975062.087605-Zone-48bedacfcdf50cf6db9232ebe6650a55f34b80df128227aef15b210aacf25182.change'
information/cli: Committing node configuration.
Changes to be committed:

Adding host 'icinga2-client1.localdomain'
    check_command = "cluster-zone"
    import = [ "satellite-host" ]
Adding service 'apt'
    check_command = "dummy"
    host_name = "icinga2-client1.localdomain"
    import = [ "satellite-service" ]
    zone = "icinga2-client1.localdomain"
Adding service 'disk'
    check_command = "dummy"
    host_name = "icinga2-client1.localdomain"
    import = [ "satellite-service" ]
    zone = "icinga2-client1.localdomain"
Adding service 'disk /'
    check_command = "dummy"
    host_name = "icinga2-client1.localdomain"
    import = [ "satellite-service" ]
    zone = "icinga2-client1.localdomain"
Adding service 'http'
    check_command = "dummy"
    host_name = "icinga2-client1.localdomain"
    import = [ "satellite-service" ]
    zone = "icinga2-client1.localdomain"
Adding service 'icinga'
    check_command = "dummy"
    host_name = "icinga2-client1.localdomain"
    import = [ "satellite-service" ]
    zone = "icinga2-client1.localdomain"
Adding service 'load'
    check_command = "dummy"
    host_name = "icinga2-client1.localdomain"
    import = [ "satellite-service" ]
    zone = "icinga2-client1.localdomain"
Adding service 'ping4'
    check_command = "dummy"
    host_name = "icinga2-client1.localdomain"
    import = [ "satellite-service" ]
    zone = "icinga2-client1.localdomain"
Adding service 'ping6'
    check_command = "dummy"
    host_name = "icinga2-client1.localdomain"
    import = [ "satellite-service" ]
    zone = "icinga2-client1.localdomain"
Adding service 'procs'
    check_command = "dummy"
    host_name = "icinga2-client1.localdomain"
    import = [ "satellite-service" ]
    zone = "icinga2-client1.localdomain"
Adding service 'ssh'
    check_command = "dummy"
    host_name = "icinga2-client1.localdomain"
    import = [ "satellite-service" ]
    zone = "icinga2-client1.localdomain"
Adding service 'swap'
    check_command = "dummy"
    host_name = "icinga2-client1.localdomain"
    import = [ "satellite-service" ]
    zone = "icinga2-client1.localdomain"
Adding service 'users'
    check_command = "dummy"
    host_name = "icinga2-client1.localdomain"
    import = [ "satellite-service" ]
    zone = "icinga2-client1.localdomain"
Adding endpoint 'icinga2-client1.localdomain'
Adding zone 'icinga2-client1.localdomain'
    endpoints = [ "icinga2-client1.localdomain" ]
    parent = "icinga2-master1.localdomain"

information/cli: Writing config object 'icinga2-client1.localdomain' to file '/etc/icinga2/repository.d/hosts/icinga2-client1.localdomain.conf'
information/cli: Writing config object 'apt' to file '/etc/icinga2/repository.d/hosts/icinga2-client1.localdomain/apt.conf'
information/cli: Writing config object 'disk' to file '/etc/icinga2/repository.d/hosts/icinga2-client1.localdomain/disk.conf'
information/cli: Writing config object 'disk /' to file '/etc/icinga2/repository.d/hosts/icinga2-client1.localdomain/disk %2F.conf'
information/cli: Writing config object 'http' to file '/etc/icinga2/repository.d/hosts/icinga2-client1.localdomain/http.conf'
information/cli: Writing config object 'icinga' to file '/etc/icinga2/repository.d/hosts/icinga2-client1.localdomain/icinga.conf'
information/cli: Writing config object 'load' to file '/etc/icinga2/repository.d/hosts/icinga2-client1.localdomain/load.conf'
information/cli: Writing config object 'ping4' to file '/etc/icinga2/repository.d/hosts/icinga2-client1.localdomain/ping4.conf'
information/cli: Writing config object 'ping6' to file '/etc/icinga2/repository.d/hosts/icinga2-client1.localdomain/ping6.conf'
information/cli: Writing config object 'procs' to file '/etc/icinga2/repository.d/hosts/icinga2-client1.localdomain/procs.conf'
information/cli: Writing config object 'ssh' to file '/etc/icinga2/repository.d/hosts/icinga2-client1.localdomain/ssh.conf'
information/cli: Writing config object 'swap' to file '/etc/icinga2/repository.d/hosts/icinga2-client1.localdomain/swap.conf'
information/cli: Writing config object 'users' to file '/etc/icinga2/repository.d/hosts/icinga2-client1.localdomain/users.conf'
information/cli: Writing config object 'icinga2-client1.localdomain' to file '/etc/icinga2/repository.d/endpoints/icinga2-client1.localdomain.conf'
information/cli: Writing config object 'icinga2-client1.localdomain' to file '/etc/icinga2/repository.d/zones/icinga2-client1.localdomain.conf'
Make sure to reload Icinga 2 for these changes to take effect.

[email protected]:~# /etc/init.d/icinga2 restart
[ ok ] Restarting icinga2 (via systemctl): icinga2.service.

Ta có thể liệt kê các node được monitor

[email protected]:~# icinga2 node list
Warning: CLI command 'node list' is DEPRECATED! Please read the Changelog.

Node 'icinga2-client1.localdomain' (last seen: Tue Aug 29 10:03:58 2017)
    * Host 'icinga2-client1.localdomain'
        * Service 'apt'
        * Service 'disk'
        * Service 'disk /'
        * Service 'http'
        * Service 'icinga'
        * Service 'load'
        * Service 'ping4'
        * Service 'ping6'
        * Service 'procs'
        * Service 'ssh'
        * Service 'swap'
        * Service 'users'

All Rights Reserved