SSLとZabbixを活用した安全で便利な監視環境構築ガイド

目次

はじめに

本書の目的

本書は、Zabbixを用いたSSL証明書の設定と監視方法をわかりやすくまとめたガイドです。Zabbix 7.0の導入から、自己署名証明書の作成、ApacheのSSL設定、証明書の有効期限監視まで、実務で使える手順を中心に解説します。テスト環境での確認例を交えて説明しますので、初めて扱う方でも取り組みやすい構成です。

想定読者

  • Zabbixをこれから導入する管理者
  • SSL証明書の監視を始めたい運用担当者
  • Linuxサーバーの基本操作に抵抗がない方

本書で扱う主な項目

  • Zabbix 7.0の概要と新機能
  • MySQLなどのデータベース準備
  • SELinuxとファイアウォール設定
  • 自己署名証明書の作成とApacheでの運用
  • 証明書有効期限の監視スクリプトとZabbix連携
  • Zabbix Proxyの冗長化(HA)とエージェント2による監視
  • LinuxサーバーへのZabbixインストール手順

読み進め方

各章は手順と設定例を中心に構成しています。まずは本章で目的と範囲を確認し、実際に作業する際はバックアップを取りながら進めてください。必要なコマンドや設定ファイルは章ごとに示しますので、順番に読み進めると理解が深まります。

Zabbix 7.0の新機能と概要

概要

Zabbix 7.0は監視の幅を広げつつ、運用の安全性を高める機能が追加されました。本章では主な変更点と、管理画面を安全に運用するためのポイントを分かりやすく説明します。

主な新機能

  • ブラウザベースのシナリオ監視:ログインやフォーム送信など、実際の操作を順番に検証します。たとえばログイン→ダッシュボード遷移→データ表示の一連動作を監視できます。
  • プロキシの冗長化と負荷分散:複数のプロキシで負荷を分散し、1台障害でも監視を継続できます。大規模環境での可用性が向上します。
  • 多要素認証(MFA):ワンタイムパスワードやセキュリティキーを用いることで、管理者アカウントの安全性を高めます。
  • その他:パフォーマンス改善やAPI強化、UIの使い勝手向上などが含まれます。

管理画面のSSLの重要性

管理画面は機密情報を扱います。通信を暗号化するSSL/TLSは必須です。自己署名証明書でも暗号化は可能ですが、運用環境ではCA発行証明書を推奨します。SSLはログイン情報やAPIトークンを守ります。

運用時の注意点

  • 本番導入前にステージングで新機能を検証してください。
  • データベースや設定のバックアップを定期実施してください。
  • 証明書の有効期限監視や管理者アクセス制限を設定してください。

次章以降で、データベース準備やSSL設定など、具体的な手順を順を追って説明します。

データベース(MySQL)の準備

概要

Zabbixが正しく動作するには、文字セットutf8mb4のデータベースが必要です。インポート時に関数やプロシージャを作成するため、MySQLの設定log_bin_trust_function_creatorsを一時的に1にしてからインポートし、完了後に0に戻します。

手順(要点)

  1. MySQLにrootでログインします。
    例: sudo mysql -uroot -p

  2. データベースとユーザーを作成します(例):
    CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
    CREATE USER ‘zabbix’@’localhost’ IDENTIFIED BY ‘パスワード’;
    GRANT ALL PRIVILEGES ON zabbix.* TO ‘zabbix’@’localhost’;
    FLUSH PRIVILEGES;

  3. 関数作成制限を緩めます:
    SET GLOBAL log_bin_trust_function_creators = 1;
    —これは再起動で戻るので永続化する場合は設定ファイルを編集してください。

  4. スキーマをインポートします(例: ZabbixのSQLファイル):
    zcat /path/to/zabbix-7.0.sql.gz | mysql -uzabbix -p zabbix
    または: mysql -uroot -p zabbix < /path/to/schema.sql

  5. インポート後に元に戻します:
    SET GLOBAL log_bin_trust_function_creators = 0;

注意点

  • 文字セットは必ずutf8mb4にします。絵文字や一部記号を含むデータでも問題が起きません。
  • バイナリログやレプリケーションを使う場合は、log_bin_trust_function_creatorsの変更に注意してください。安全のため、インポート完了後は元に戻すことをおすすめします。

SELinux設定

概要

SELinuxが有効な環境では、Apache(httpd)が外部データベースに接続する動作がデフォルトで制限されます。本章では、ZabbixがMySQL等に接続できるように、SELinuxのブール値を設定する手順をわかりやすく説明します。

やること

  1. SELinuxの稼働確認
  2. httpd_can_network_connect_dbブールの有効化(永続化)
  3. 動作確認と簡単なトラブルシュート

手順(例)

  • SELinuxの状態確認:
sestatus
getenforce
  • 現在のブール確認:
getsebool httpd_can_network_connect_db
  • 一時的に有効化(再起動で戻る):
setsebool httpd_can_network_connect_db on
  • 永続的に有効化(推奨):
setsebool -P httpd_can_network_connect_db on

※httpdが一般的なネットワーク接続も行う場合は、httpd_can_network_connectを有効にすることを検討してください。

動作確認

  • ブール値がonになっているか再確認し、Zabbixからデータベースに接続できるかをアプリケーション側で確認します。

トラブルシュート

  • 接続できない場合はSELinuxの拒否ログを確認します:
ausearch -m avc -ts today | audit2why
  • 必要に応じてaudit2allowで原因を分析し、カスタムポリシーを作成しますが、まずはブール値の利用で対応するのが安全です。

注意点

過度に多くのブールを有効にするとセキュリティが緩みます。変更は最小限にし、ログを確認して影響を把握してください。

自己署名SSL証明書の作成

概要

本番ではLet’s Encryptなどの正規認証局発行の証明書を推奨します。テストや内部向けに自己署名証明書を使う場合は以下の手順で作成します。

前提

  • 標準的な保存先例:/etc/pki/tls/private(秘密鍵)、/etc/pki/tls/certs(証明書)
  • ホスト名(Common Name: CN)はアクセス時に使うFQDNを指定してください(例: example.com)。

証明書作成手順(例)

1) 秘密鍵を作成
openssl genpkey -algorithm RSA -out /etc/pki/tls/private/server.key -pkeyopt rsa_keygen_bits:2048

2) 自己署名証明書を作成(有効期限30年)
openssl req -new -x509 -days 10950 -key /etc/pki/tls/private/server.key -out /etc/pki/tls/certs/server.crt \
-subj “/C=JP/ST=Tokyo/L=Chiyoda/O=Example Corp/CN=example.com”

Cは国コード、CNは必ず設定してください。都道府県や市区町村は任意です。

ファイルの配置と権限

  • 所有者と権限例:
  • 秘密鍵: root:root 600
  • 証明書: root:root 644

例:
chown root:root /etc/pki/tls/private/server.key /etc/pki/tls/certs/server.crt
chmod 600 /etc/pki/tls/private/server.key
chmod 644 /etc/pki/tls/certs/server.crt
必要に応じてApacheやZabbixが読めるようグループを調整してください。

SELinux環境での注意

標準ディレクトリに置いた場合はrestoreconで既定のコンテキストを適用します。
restorecon -Rv /etc/pki/tls
カスタムディレクトリを使う場合はfcontextを登録してからrestoreconします。
semanage fcontext -a -t cert_t ‘/etc/zabbix/ssl(/.*)?’
restorecon -Rv /etc/zabbix/ssl

次はApache httpdでのSSL設定に移ります。

Apache httpdのSSL設定

前提

自己署名証明書(第5章)と秘密鍵が /etc/pki/tls/certs/zabbix.crt /etc/pki/tls/private/zabbix.key にある想定です。ドメイン名は example.example.local に置き換えてください。

手順(パッケージ導入)

  • RHEL/CentOS: sudo yum install -y mod_ssl
  • Debian/Ubuntu: sudo apt install -y apache2 openssl && sudo a2enmod ssl

SSL仮想ホスト設定例

/etc/httpd/conf.d/zabbix-ssl.conf(または /etc/apache2/sites-available/zabbix-ssl.conf)を作成し、次を記載します。

<VirtualHost *:443>
  ServerName example.example.local
  DocumentRoot "/var/www/html"
  SSLEngine on
  SSLCertificateFile /etc/pki/tls/certs/zabbix.crt
  SSLCertificateKeyFile /etc/pki/tls/private/zabbix.key
  <Directory "/var/www/html">
    Require all granted
  </Directory>
</VirtualHost>

ドメイン名とパスを環境に合わせて修正してください。

パーミッションと所有者

秘密鍵はrootのみが読めるようにします。
– sudo chown root:root /etc/pki/tls/private/zabbix.key
– sudo chmod 600 /etc/pki/tls/private/zabbix.key

サイト有効化(Debian系)

  • sudo a2ensite zabbix-ssl.conf

自動起動と起動

  • sudo systemctl enable httpd || sudo systemctl enable apache2
  • sudo systemctl restart httpd || sudo systemctl restart apache2

動作確認

ブラウザで https://example.example.local にアクセスして、証明書が表示されるか確認します。自己署名のため警告が出ますが、証明書情報が作成したものと一致すれば設定完了です。

ファイアウォール設定

概要

firewalldを使ってHTTP(80/tcp)とHTTPS(443/tcp)を開放します。–permanentオプションで設定を永続化し、最後にreloadして反映します。

前提

  • rootまたはsudo権限があること
  • firewalldが稼働していること(systemctl status firewalld)

手順

  1. アクティブなゾーンを確認
    sudo firewall-cmd –get-active-zones
  2. HTTP/HTTPSを永続追加(ゾーン指定が必要なら –zone=ゾーン名 を追加)
    sudo firewall-cmd –permanent –add-service=http
    sudo firewall-cmd –permanent –add-service=https
    ※サービス名ではなくポート指定でも可:
    sudo firewall-cmd –permanent –add-port=80/tcp
    sudo firewall-cmd –permanent –add-port=443/tcp
  3. 設定を反映
    sudo firewall-cmd –reload

動作確認

  • 現在の設定を確認:
    sudo firewall-cmd –list-all
  • ローカルから接続確認:
    curl -I http://localhost
    curl -I https://localhost

補足

  • 必要に応じてソースIPを限定できます(rich ruleを利用)。
  • 設定後も接続できない場合はApacheやSELinuxの設定、ポートリスン状態を確認してください(ss -ltnp)。

Zabbixを使ったSSL証明書有効期限監視とアラート設定

目的

ZabbixでWebサイトやサーバーのSSL証明書の残り日数を監視し、期限切れ前に通知を出す手順を解説します。設定はシンプルで、証明書切れによるサービス停止を未然に防げます。

概要

  • エージェント(またはZabbixサーバー)で証明書の残日数を取得するスクリプトを実行します。
  • 取得した数値をZabbixのアイテムとして登録し、トリガーで閾値を監視します。
  • 通知はActionでメールやSlackなどに送ります。

スクリプト例(エージェント側)

下記はopensslで残日数を算出する一例です。SNIに対応するためホスト名を指定します。

#!/bin/sh
HOST="$1"
PORT=${2:-443}
DAYS=$(echo | openssl s_client -servername "$HOST" -connect "$HOST:$PORT" 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
if [ -z "$DAYS" ]; then echo -1; exit 0; fi
end_date=$(date -d "$DAYS" +%s)
now=$(date +%s)
echo $(( (end_date - now) / 86400 ))

Zabbix側の設定ポイント

  • アイテム: キーは例として web.cert.days[{HOST.CONN}]、タイプはZabbixエージェント(アクティブ)または外部チェック
  • 更新間隔: 1d〜12h程度(サイト重要度に応じて)
  • トリガー: 残日数が30日未満 → WARN、7日未満 → CRITICAL など
    例: {host:web.cert.days.last()}<30

通知とテスト

  • MediaとActionで通知先を登録します。Actionはトリガーの深刻度に応じて作成します。
  • スクリプトを手動実行して数値が取れるか確認します。Zabbix画面で最新データを確認して問題ないか確かめてください。

補足

SNIが必要なサイトや自己署名証明書は接続方法を変える必要があります。監視対象が多い場合は一括登録テンプレートを作成すると管理が楽になります。

Zabbixエージェント側のスクリプト配置

目的

ZabbixサーバーがSSL証明書の有効期限を監視できるよう、エージェント側に証明書期限を返すスクリプトを配置します。スクリプトはZabbixユーザーで実行できるように権限と所有者を設定します。

スクリプト例

以下はホスト名[:ポート]を受け取り、証明書の有効日から残日数を返す簡単なシェルスクリプトです。

#!/bin/bash
# usage: check_cert_expiry.sh hostname[:port]
if [ -z "$1" ]; then
  echo "Usage: $0 host[:port]"
  exit 1
fi
input="$1"
if [[ "$input" == *":"* ]]; then
  host="${input%%:*}"
  port="${input##*:}"
else
  host="$input"
  port=443
fi
enddate=$(echo | openssl s_client -servername "$host" -connect "${host}:${port}" 2>/dev/null \
  | openssl x509 -noout -enddate 2>/dev/null | sed 's/^notAfter=//')
if [ -z "$enddate" ]; then
  echo "ERR"
  exit 2
fi
expiry_epoch=$(date -d "$enddate" +%s)
now=$(date +%s)
echo $(( (expiry_epoch - now) / 86400 ))

配置と権限設定

  1. スクリプトを/etc/zabbixに作成します(例: /etc/zabbix/check_cert_expiry.sh)。
  2. 所有者をZabbixユーザーに設定します:
    sudo chown zabbix:zabbix /etc/zabbix/check_cert_expiry.sh
  3. 実行権限を付与します:
    sudo chmod 755 /etc/zabbix/check_cert_expiry.sh

動作確認

Zabbixユーザーとして実行して確認します:
sudo -u zabbix /etc/zabbix/check_cert_expiry.sh example.com
またはポートを指定:
sudo -u zabbix /etc/zabbix/check_cert_expiry.sh example.com:8443

出力は残日数(整数)か、失敗時はERRを返します。Zabbixのアイテム側ではこの出力を利用して閾値やアラートを作成します。

補足

  • スクリプトはopensslとdateのコマンドを使います。事前にインストールを確認してください。
  • SELinuxを有効にしている場合は、必要に応じてrestoreconでコンテキストを調整してください(例: sudo restorecon -v /etc/zabbix/check_cert_expiry.sh)。

Zabbixエージェント設定ファイルの修正

概要

Zabbixエージェントの設定ファイルにUserParameterを追加し、サーバーがエージェント経由でSSL証明書情報を取得できるようにします。

事前準備

  • スクリプトを/usr/local/binに配置し、実行権限を与えます(例: ssl_cert_check.sh)。
  • 所有者をzabbixにする: sudo chown zabbix:zabbix /usr/local/bin/ssl_cert_check.sh

設定手順

  1. 設定ファイルをバックアップします。
    sudo cp /etc/zabbix/zabbix_agentd.conf /etc/zabbix/zabbix_agentd.conf.bak
  2. 設定ファイルを編集します。
    sudo vi /etc/zabbix/zabbix_agentd.conf
  3. UserParameterセクションに以下を追加します。
    UserParameter=ssl.cert.info[],/usr/local/bin/ssl_cert_check.sh $1 $2
    UserParameter=ssl.cert.days[
    ],/usr/local/bin/ssl_cert_check.sh –days $1 $2
  4. ファイル保存後、エージェントを再起動します。
    sudo systemctl restart zabbix-agent

動作確認

  • ローカルでテスト: sudo -u zabbix /usr/sbin/zabbix_agentd -t ‘ssl.cert.info[example.com,443]’
  • サーバーから: zabbix_get -s エージェントIP -k ‘ssl.cert.info[example.com,443]’

注意点

  • スクリプトは標準出力に値を返す必要があります。Zabbixはその出力を受け取ります。
  • SELinuxを有効にしている場合はコンテキストを確認してください(chconなど)。
  • 権限は最低限にし、実行ユーザーはzabbixにしてください。

Zabbixサーバー側のアイテム追加

概要

ZabbixサーバーでエージェントのUserParameterと紐づけるアイテムを追加します。これにより、定期的に証明書の残存日数を収集して監視できます。

前提

  • エージェント側にUserParameterが正しく登録されていること
  • 対象ホストがZabbixに登録済みであること

アイテム追加手順(GUI)

  1. Zabbixフロントエンドにログインします。
  2. 「設定」→「ホスト」から対象ホストを選択し、「アイテム」タブを開きます。
  3. 「アイテムの作成」をクリックします。
  4. 主な項目を入力します。
  5. 名前: 証明書有効期限(example.com など識別しやすい名前)
  6. タイプ: Zabbix agent(または Zabbix agent (active))
  7. キー: エージェントのUserParameterで定義したキー(例: ssl_cert_expiry[example.com,443])
  8. 情報の種類: 数値(符号なし)
  9. 単位: d(日)
  10. 更新間隔: 1h(例。重要度に応じて調整)
  11. アプリケーション: SSL/証明書
  12. 保存して有効化します。

キーの例と注意点

  • ローカルファイル監視: cert_expiry_file[/etc/ssl/certs/example.crt]
  • ホスト名/ポート監視: ssl_cert_expiry[example.com,443]
  • UserParameterの返却値が日数(整数)であることを確認してください。文字列の場合は前処理が必要です。

テンプレート化と運用

複数ホストで同様の監視を行う場合はテンプレートにアイテムを作り、マクロ({$CERT_HOST}など)で汎用化すると管理が楽になります。更新間隔は頻繁すぎないようにして、監視負荷を抑えてください。

Zabbix Proxy HAの概要

はじめに

Zabbix 7.0では、プロキシの冗長化(HA: High Availability)と負荷分散を簡潔に扱える機能が導入されました。複数のプロキシで監視負荷を分散しつつ、プロキシに障害が発生しても監視継続を目指します。

特長

  • 冗長化により監視の継続性が高まります。例:プロキシの一台が落ちても、他のプロキシが代替します。
  • 負荷分散で負荷の偏りを防ぎます。大量のホストがある環境で効果的です。
  • Zabbixサーバー側でプロキシの状態を管理しやすくなります。

構成例

  • ロードバランサ+複数プロキシ:ロードバランサがトラフィックを振り分けます。
  • 仮想IP方式:一つの仮想IPをフェイルオーバーで切替えます。

HA構築の流れ(簡易)

  1. ネットワークと時刻同期を整備します。
  2. 複数台のプロキシをインストールして同一グループに登録します。
  3. ロードバランサや仮想IPを構成します。
  4. 動作確認と監視項目の調整を行います。

障害時の動作確認ポイント

  • プロキシ停止時に監視データが引き継がれるか確認する。
  • Zabbixサーバーのログとプロキシログで切替発生を確認する。
  • アラートやアイテムの遅延が許容範囲内か確認する。

注意点

時刻同期、設定の一貫性、バックアップを確実に行ってください。小さな構成でまず動作検証を行うと安全です。

Zabbixプロキシ設定

以下では、Zabbixプロキシの基本設定手順と注意点を丁寧に説明します。

設定ファイルと編集

設定ファイルは通常 /etc/zabbix/zabbix_proxy.conf です。テキストエディタで開いて次の項目を確認・編集します。

必須項目(例)

ProxyMode=1
Hostname=proxy-01
Server=192.0.2.10
ServerActive=192.0.2.10:10051

ProxyMode=1 でアクティブモードを有効化します。Hostname は Zabbix サーバーの管理画面で登録するプロキシ名と完全一致させます。Server は受動接続用、ServerActive はプロキシが能動的に接続するサーバーとポートを指定します。

データベース設定(例: MySQL)

DBHost=127.0.0.1
DBName=zabbix_proxy
DBUser=zabbix
DBPassword=your_db_password

事前にデータベースとユーザーを作成し、権限を付与しておいてください。

サービスの有効化と確認

設定後にサービスを再起動して有効化します。

systemctl enable --now zabbix-proxy
journalctl -u zabbix-proxy -f

ログは /var/log/zabbix/zabbix_proxy.log にも出力されます。初回はプロキシがサーバーに登録されるまで少し時間がかかります。

サーバー側設定

Zabbix サーバーの「Administration → Proxies」で同じ Hostname のプロキシを登録します。モードは Active を選択します。監視対象ホストをプロキシに割り当てることを忘れないでください。

トラブルシュートのポイント

  • 時刻同期(ntp/chrony)を確認してください。時刻差が大きいと通信が失敗します。
  • ファイアウォールで TCP 10051(サーバー側)へのアウトバウンドを許可してください。
  • 設定ミスやDB接続エラーはログに詳しく出ますので、ログを確認してください。

Zabbixエージェント2でWebサイト証明書監視

概要

Zabbixエージェント2のweb.certificate.getキーを使うと、HTTPS/TLS証明書の情報を取得して監視できます。リモートのサイトも直接問い合わせられるため、外部証明書の有効期限監視に便利です。

前提

  • Zabbixエージェント2が対象ホストにインストール済み
  • エージェントが外部サイトに接続可能(ファイアウォールやプロキシの確認)

エージェントのアイテム例

  1. マスター(取得)アイテム
  2. キー例: web.certificate.get[“example.com”,443]
  3. タイプ: Zabbix agent (active)
  4. 説明: 証明書情報をJSONで取得します。

  5. 依存アイテム(残日数算出)

  6. データ取得方法: 依存アイテムでJSONからnotAfterを抽出(JSONPath: $.notAfter)
  7. 前処理: JavaScriptを使ってnotAfterをパースし、現在時刻との差を日数で返す。例:
var t = new Date(value).getTime();
var now = Date.now();
var days = Math.floor((t - now)/(1000*60*60*24));
return days;

トリガー例

  • 式: {ホスト名:dependent.item.key.last()}<30
  • 説明: 残日数が30日未満になったらアラート

リモートサイト監視のポイント

  • SNIが必要なホストはホスト名を指定してください(web.certificate.getの第1引数にFQDN)。
  • 接続ポートを変える場合は第2引数で指定(例: 8443)。

注意点

  • 取得する時刻表現はサーバーによって異なるため、JS内で確実にパースできる形式か確認してください。
  • 頻繁にチェックしすぎると外部サーバーへ負荷がかかるため、間隔を適切に設定してください。

LinuxサーバーへのZabbixインストール手順

前提条件

  • MySQL/MariaDBを設定済み(第3章を参照)。
  • OS: RHEL系(CentOS/Rocky/Alma)かDebian系(Ubuntu/Debian)。

リポジトリの追加

  • RHEL系: rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rhel/$(rpm -E %{rhel})/x86_64/zabbix-release-7.0-1.el$(rpm -E %{rhel}).noarch.rpm && dnf clean all
  • Debian系: wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_7.0-1+ubuntu$(lsb_release -rs)_all.deb && dpkg -i zabbix-release_7.0-1+ubuntu$(lsb_release -rs)_all.deb && apt update

パッケージインストール

  • RHEL系: dnf install -y zabbix-server-mysql zabbix-web-mysql zabbix-apache-conf zabbix-agent
  • Debian系: apt install -y zabbix-server-mysql zabbix-frontend-php zabbix-apache-conf zabbix-agent

データベース初期化

1) データベースとユーザーを作成
2) スキーマをインポート: zcat /usr/share/doc/zabbix-sql-scripts/mysql*/create.sql.gz | mysql -u zabbix -p zabbix

設定と起動

  • /etc/zabbix/zabbix_server.conf に DB接続情報を設定
  • systemctl enable –now zabbix-server zabbix-agent httpd(Debian系は apache2)

ファイアウォールと確認

  • ポート: 10051 (Zabbix server), 10050 (agent), 80/443
  • ブラウザで http://<サーバー>/zabbix にアクセスし、初期ユーザー Admin / パスワード zabbix でログインします

以上が基本的なインストール手順です。必要があれば各手順を詳しく説明します。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

目次