AlmaLinux 9 総合ガイド 第9章

第9章: サーバーサービスの構築と管理


9.1 本章の概要

この章では、AlmaLinux 9 上における主要なサーバーサービスを網羅的に構築・運用する手順とベストプラクティスを解説します。Web サーバー(Apache/Nginx)からデータベース(MariaDB/PostgreSQL)、メール(Postfix/Dovecot)、FTP(vsftpd)、DNS(BIND)まで、初心者~中級者が現場で即活用できるように、以下のポイントを押さえて丁寧に導きます。

💡 前提条件:
  • AlmaLinux 9 の最小インストールまたは GUI/CLI インストール環境
  • root または sudo 権限のあるユーザー
  • ネットワーク設定、ホスト名・DNS 解決、時刻同期(chrony)済み
  • SELinux が enforcing、firewalld が有効化済み

本章を学ぶことで、以下のような運用環境を手に入れられます。

  • HTTP/HTTPS サービスの安全かつ効率的な配信(dnf によるモジュール管理を含む)
  • データベースの初期セキュア化とユーザー権限設定によるアクセス制御
  • メール送受信基盤の構築と SPF/DKIM/DMARC によるなりすまし対策
  • FTP サーバーの chroot 制限や FTPS 設定による安全なファイル転送
  • BIND を使ったゾーン管理、キャッシュ DNS サーバー構築による名前解決高速化
  • systemd ユニットファイルのカスタマイズ、ログ監視(journalctl/Fail2Ban)との連携で運用性向上
  • tuned プロファイル/チューニングツールによるパフォーマンス最適化
  • HAProxy/Keepalived/Pacemaker を用いたロードバランスとフェイルオーバー構成

章の流れとしては、まず各サービスの“何を”提供するかを理解し、次に“なぜ”必要なのか背景と注意点を解説します。最後に“どうやって”インストール~基本設定~運用管理までのハンズオン手順を示し、章末にはモジュールや関連ツールの応用例、トラブルシューティングのコツも掲載します。

セキュリティ設定(SELinux コンテキスト、firewalld のゾーン/サービス設定)やログ監視・アラート、定期的なアップデート戦略も随所で取り上げ、AlmaLinux 9 を採用するメリットを最大化する設計思想を提供します。

9.2 Web サーバー (Apache & Nginx)

AlmaLinux9 上で Web サーバーを構築する際、もっとも広く利用される Apache HTTP ServerNginx について解説します。各サーバーの特徴やモジュール選定、セキュリティ設定(SELinux・firewalld)、パフォーマンスチューニング、SSL/TLS(HTTP/2・TLS 1.3対応)、リバースプロキシ/ロードバランサー設定まで、初心者~中級者が現場で即実装できるレベルで詳細に説明します。

💡 補足:本節の手順はすべて root または sudo 権限ユーザーで実行してください。SELinux はデフォルトで enforcing、firewalld は有効化済みとします。

9.2.1 Apache HTTP Server

Apache はモジュール拡張性に優れ、.htaccess や多彩な MPM(マルチプロセッシングモジュール)で動作特性を細かく制御できます。静的コンテンツ配信から動的モジュール(PHP, Python via mod_wsgi など)、プロキシ/キャッシュまで幅広い用途に対応可能です。

インストールと基本起動

# 実行ユーザー: sudo 権限ユーザー
# 目的: Apache HTTP Server のインストールと起動確認
# 期待結果: httpd サービスが自動起動設定され、ポート 80 で待ち受け開始

sudo dnf install httpd -y           # dnf で Apache パッケージをインストール
sudo systemctl enable httpd         # OS 起動時に httpd を自動起動する設定
sudo systemctl start httpd          # Apache サービスを起動
sudo firewall-cmd --add-service=http --permanent  # firewalld で HTTP を許可
sudo firewall-cmd --reload          # 設定を反映
  • /etc/httpd/conf/httpd.conf でグローバル設定
  • /etc/httpd/conf.modules.d/ でモジュール読み込み制御
  • /etc/httpd/conf.d/ 配下に個別バーチャルホストを定義

SELinux コンテキスト設定

# 目的: 外部ディレクトリをドキュメントルートに使う際の SELinux 設定
# 期待結果: Apache が指定ディレクトリを正常に配信可能に

sudo semanage fcontext -a -t httpd_sys_content_t '/srv/www/example(/.*)?'  # コンテキストを定義
sudo restorecon -Rv /srv/www/example                                    # コンテキストを適用

MPM とパフォーマンスチューニング

AlmaLinux9 ではデフォルトで event MPM が有効です。大規模な同時接続数に強い一方、PHP-FPM 等の外部プロセス連携を推奨します。

# /etc/httpd/conf.modules.d/00-mpm.conf の例
# 目的: MPM モジュールの切り替えとチューニング
# 期待結果: event MPM で最大接続数を調整

#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so   # Prefork を無効化
LoadModule mpm_event_module modules/mod_mpm_event.so        # Event を有効化


    StartServers             2    # 起動時サーバープロセス数
    MinSpareThreads         25    # 最小アイドルスレッド数
    MaxSpareThreads         75    # 最大アイドルスレッド数
    ThreadLimit            64    # スレッド数上限
    ThreadsPerChild        25    # プロセスあたりスレッド数
    MaxRequestWorkers     150    # 最大同時リクエスト数
    MaxConnectionsPerChild  0    # プロセス再生成までの接続数

注意:MPM 切り替え後は依存モジュール(mod_php 等)が動作しない場合があります。PHP は php-fpmmod_proxy_fcgi で連携してください。

VirtualHost & HTTP/2 設定

# /etc/httpd/conf.d/vhost.conf の例
# 実行ユーザー: sudo 権限ユーザー
# 目的: HTTP/2 対応バーチャルホスト定義
# 期待結果: ポート 443 で HTTP/2 と TLS 1.3 を利用可能に

LoadModule http2_module modules/mod_http2.so                   # HTTP/2 モジュールを読み込む

<VirtualHost *:443>                                            # HTTPS 用バーチャルホスト
    ServerName   www.example.com                               # サイトのホスト名
    DocumentRoot /var/www/html/example                          # ドキュメントルート
    Protocols h2 http/1.1                                      # HTTP/2 と HTTP/1.1 を有効化

    SSLEngine on                                               # SSL/TLS を有効化
    SSLCertificateFile    /etc/pki/tls/certs/server.crt       # 証明書ファイルパス
    SSLCertificateKeyFile /etc/pki/tls/private/server.key     # 秘密鍵ファイルパス
    SSLProtocol           all -SSLv3                          # SSLv3 を無効化
    SSLCipherSuite        HIGH:!aNULL:!MD5                    # 強力な暗号スイート選定
</VirtualHost>

Let’s Encrypt で無料証明書取得

# 実行ユーザー: sudo 権限ユーザー
# 目的: certbot で証明書を自動取得・更新
# 期待結果: /etc/letsencrypt 以下に証明書が配置される

sudo dnf install certbot python3-certbot-apache -y   # certbot と Apache プラグインをインストール
sudo certbot --apache --agree-tos --redirect -d www.example.com -m admin@example.com  # 証明書取得・設定

9.2.2 Nginx

Nginx はイベント駆動アーキテクチャに基づく高性能 Web サーバー/リバースプロキシです。軽量ながらロードバランサーやキャッシュ機能を内蔵し、大規模サイトでも実績があります。

インストールと基本起動

# 実行ユーザー: sudo 権限ユーザー
# 目的: Nginx のインストールと起動確認
# 期待結果: nginx サービスが自動起動設定され、ポート 80 で待ち受け開始

sudo dnf install nginx -y            # dnf で Nginx をインストール
sudo systemctl enable nginx          # OS 起動時に nginx を自動起動する設定
sudo systemctl start nginx           # Nginx サービスを起動
sudo firewall-cmd --add-service=http --permanent  # firewalld で HTTP を許可
sudo firewall-cmd --reload           # 設定を反映

SELinux ブール値設定

# 目的: Nginx がユーザーホーム配下やポート 8080 を扱えるようにする
# 期待結果: SELinux が適切に緩和され、nginx が正常動作

sudo setsebool -P httpd_enable_homedirs on   # ホームディレクトリ公開を許可
sudo setsebool -P httpd_unified on           # 統一ドメイン許可を有効化
sudo semanage port -a -t http_port_t -p tcp 8080  # TCP8080 を HTTP ポートに追加

基本サーバーブロック設定

# /etc/nginx/conf.d/example.conf の例
# 実行ユーザー: sudo 権限ユーザー
# 目的: 静的コンテンツ配信用サーバーブロック
# 期待結果: www.example.com が /usr/share/nginx/html/example を配信

server {
    listen       80;                             # HTTP ポート 80 を Listen
    server_name  www.example.com;                 # サイトのホスト名を設定
    root         /usr/share/nginx/html/example;   # ドキュメントルートを指定

    location / {
        index  index.html index.htm;              # インデックスファイル指定
    }
}

パフォーマンスチューニング & キャッシュ

gzip 圧縮やプロキシキャッシュで転送効率を向上させます。

# /etc/nginx/nginx.conf のチューニング例
# 目的: ワーカープロセス数・接続数、gzip 圧縮、プロキシキャッシュを設定
# 期待結果: 高負荷時にもスループットを維持

user  nginx;                                  # worker が実行するユーザー
worker_processes auto;                        # CPU コア数に合わせて自動設定
error_log  /var/log/nginx/error.log warn;     # エラーログ出力先とログレベル
pid        /var/run/nginx.pid;                # プロセス ID ファイル

events {
    worker_connections 1024;                  # 1 ワーカープロセスあたりの最大接続数
    multi_accept on;                          # 接続待機中に一度に複数 accept
}

http {
    include       /etc/nginx/mime.types;      # MIME タイプ定義読込
    default_type  application/octet-stream;   # デフォルト MIME タイプ

    sendfile        on;                       # sendfile で高速転送
    tcp_nopush      on;                       # パケット結合を有効化
    tcp_nodelay     on;                       # パケット遅延を無効化

    keepalive_timeout 65;                     # Keep-Alive タイムアウト秒
    gzip              on;                     # gzip 圧縮を有効化
    gzip_types        text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;  # 圧縮対象 MIME

    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=cache_zone:10m max_size=1g inactive=60m use_temp_path=off;  # プロキシキャッシュ定義
}

SSL/TLS & HTTP/2 設定

# /etc/nginx/conf.d/example-ssl.conf の例
# 実行ユーザー: sudo 権限ユーザー
# 目的: HTTPS(TLS1.3)と HTTP/2 対応
# 期待結果: ポート 443 で高速かつ安全な通信を実現

server {
    listen              443 ssl http2;                     # HTTPS と HTTP/2 を有効化
    server_name         www.example.com;                   # サイトのホスト名

    ssl_certificate     /etc/letsencrypt/live/www.example.com/fullchain.pem;   # 証明書
    ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;     # 秘密鍵
    ssl_protocols       TLSv1.2 TLSv1.3;                  # TLS バージョン指定
    ssl_ciphers         HIGH:!aNULL:!MD5;                 # 強力暗号スイート指定
    ssl_prefer_server_ciphers on;                         # サーバー優先暗号指定

    root                /usr/share/nginx/html/example;    # ドキュメントルート
    index               index.html index.htm;             # インデックスファイル

    location / {
        try_files $uri $uri/ =404;                       # ファイル存在チェック
    }
}
💡 補足:Let’s Encrypt 証明書の自動更新は certbot renew --quiet を Cron または systemd timer で実行すると便利です。

9.3 データベースサーバー (MariaDB & PostgreSQL)

データベースはアプリケーションの中核を担う重要コンポーネントです。本節では、AlmaLinux 9 標準リポジトリからインストールできる MariaDB 10.5 系PostgreSQL 13 系 を例に、初期セキュリティ設定から運用管理、パフォーマンスチューニング、高可用性構成までを解説します。

💡 前提条件:

  • root または sudo 権限ユーザー
  • SELinux enforcing、firewalld 有効化済み
  • 最小限のネットワーク/時刻同期設定完了

9.3.1 MariaDB (10.5 系)

MariaDB は MySQL 互換の軽量かつ高性能な RDBMS です。mysql_secure_installation による初期セキュア化、/etc/my.cnf.d/ でのチューニング、SELinux 設定、バックアップ・レプリケーションまで幅広く扱います。

インストールと初期セキュリティ設定

# 実行ユーザー: sudo 権限ユーザー
# 目的: MariaDB 10.5 のインストールと初期セキュリティ設定
# 期待結果: root パスワード設定と匿名アカウント削除が完了

sudo dnf install mariadb-server -y           # MariaDB サーバーパッケージをインストール
sudo systemctl enable mariadb                 # OS 起動時に MariaDB を自動起動設定
sudo systemctl start mariadb                  # MariaDB サービスを起動
sudo mysql_secure_installation                # root パスワード設定・匿名ユーザー削除等を実行
  • /etc/my.cnf.d/mariadb-server.cnf でサーバー設定を追加
  • /var/lib/mysql がデフォルトデータディレクトリ
  • ✅ Unix ソケット認証がデフォルトで有効
注意:初期パスワードは必ず強力なものに変更し、SSH ログインとは別管理にしてください。

基本操作 (データベース/ユーザー作成)

# 実行ユーザー: MariaDB root ユーザー
# 目的: サンプル DB/ユーザー作成と権限付与
# 期待結果: myapp データベースと myuser ユーザーが作成される

# MariaDB シェルにログイン
mysql -u root -p                             # root 権限で MariaDB シェルへ接続

# データベース作成
CREATE DATABASE myapp;                       # myapp データベースを作成

# ユーザー作成と権限付与
CREATE USER 'myuser'@'%' IDENTIFIED BY 'securePass123';  # myuser を任意ホストから接続可で作成
GRANT ALL PRIVILEGES ON myapp.* TO 'myuser'@'%';         # myapp に対して全権限を付与
FLUSH PRIVILEGES;                             # 権限情報をリロード

EXIT;                                         # MariaDB シェルを終了

SELinux コンテキスト設定

# 目的: データディレクトリをカスタムパスに変更する場合の SELinux 設定
# 期待結果: MariaDB が新ディレクトリを読み書き可能になる

sudo semanage fcontext -a -t mysqld_db_t '/data/mysql(/.*)?'  # SELinux タイプを定義
sudo restorecon -Rv /data/mysql                              # 新設定を適用

パフォーマンスチューニング

/etc/my.cnf.d/mariadb-server.cnf に主要パラメータを設定し、InnoDB バッファプールや接続数を最適化します。

[mysqld]                                # MariaDB サーバー全体設定開始
innodb_buffer_pool_size = 1G            # InnoDB バッファプールを 1GB に設定
innodb_log_file_size    = 256M          # トランザクションログファイルを 256MB に設定
max_connections         = 200           # 最大同時接続数を 200 に設定
query_cache_type        = 0             # クエリキャッシュを無効化(InnoDB 推奨)
slow_query_log          = 1             # スロークエリログを有効化
slow_query_log_file     = /var/log/mariadb/slow.log  # スロークエリログ出力先
💡 補足:バッファプールサイズは物理メモリの 60~70% 程度に設定し、スロークエリログでインデックス最適化のヒントを得ましょう。

バックアップとリストア

# 目的: mysqldump でフルバックアップを取得・リストア
# 期待結果: /backup/mysql-full.sql にバックアップが保存され、リストア可能

# フルバックアップ取得
mysqldump --all-databases --single-transaction --quick --lock-tables=false \
    > /backup/mysql-full.sql                 # データを /backup/mysql-full.sql に出力

# リストア実行
mysql -u root -p < /backup/mysql-full.sql    # バックアップファイルを MariaDB に投入

レプリケーション構成 (簡易マスター/スレーブ)

MySQL 標準レプリケーションを用い、マスターログをスレーブに複製する構成例です。

# マスター側 my.cnf に設定追加
[mysqld]
server-id       = 1                             # サーバー識別子を 1 に設定
log-bin         = mariadb-bin                  # バイナリログを有効化
binlog_format   = ROW                           # 行ベースレプリログフォーマット

# スレーブ側 my.cnf に設定追加
[mysqld]
server-id       = 2                             # サーバー識別子を 2 に設定
relay-log       = mariadb-relay-bin             # リレーログを指定

# スレーブへのレプリ設定 (マスターで取得したログ位置を使用)
CHANGE MASTER TO
  MASTER_HOST='master.example.com',             # マスターのホスト名
  MASTER_USER='repl',                           # レプリケーション専用ユーザー
  MASTER_PASSWORD='replPass',                   # レプリユーザーのパスワード
  MASTER_LOG_FILE='mariadb-bin.000001',         # マスターのバイナリログファイル
  MASTER_LOG_POS=  107;                         # マスターのログ位置

START SLAVE;                                     # スレーブレプリ開始

9.3.2 PostgreSQL (13 系)

PostgreSQL は ACID 準拠で高い信頼性を誇る RDBMS です。拡張性に優れ、JSON 型サポートやパーティショニング、並列クエリ処理など先進機能が豊富です。

インストールと初期化

# 実行ユーザー: sudo 権限ユーザー
# 目的: PostgreSQL 13 のインストールとデータベース初期化
# 期待結果: psql コマンドで DB 操作可能に

sudo dnf install postgresql-server -y        # PostgreSQL サーバーパッケージをインストール
sudo postgresql-setup --initdb               # データディレクトリを初期化
sudo systemctl enable postgresql             # OS 起動時に PostgreSQL を自動起動設定
sudo systemctl start postgresql              # PostgreSQL サービスを起動
注意:初回起動前に /var/lib/pgsql/data/pg_hba.conf で認証方式を確認し、必要に応じて md5scram-sha-256 に変更してください。

基本操作 (データベース/ユーザー作成)

# 実行ユーザー: postgres ユーザー
# 目的: サンプル DB/ロール作成と権限付与
# 期待結果: mydb データベースと myrole ロールが作成される

sudo -i -u postgres psql                     # postgres ユーザーで psql シェル起動

# データベース作成
CREATE DATABASE mydb;                         # mydb データベースを作成

# ロール作成と権限付与
CREATE ROLE myrole WITH LOGIN PASSWORD 'PgPass!234';  # myrole ロールを作成
GRANT ALL PRIVILEGES ON DATABASE mydb TO myrole;      # mydb への全権限を付与

\q                                            # psql シェルを終了

パフォーマンスチューニング

/var/lib/pgsql/data/postgresql.conf でワーカープロセス数や共有バッファ、WAL 設定を調整します。

# メイン設定ファイル: postgresql.conf
shared_buffers = 512MB                     # 共有バッファを 512MB に設定
work_mem        = 16MB                      # 各クエリワーカーのメモリ上限を設定
maintenance_work_mem = 128MB                # メンテナンス作業用メモリを設定
wal_level       = replica                   # レプリ用 WAL レベルを設定
max_wal_senders = 3                         # 最大 WAL 送信プロセス数を設定
max_connections = 100                       # 最大同時接続数を設定
💡 補足:共有バッファは物理メモリの 25% 程度、WAL 間隔は checkpoint_timeout で 5~10 分に設定すると I/O 負荷が安定します。

バックアップと PITR

# 目的: pg_dump でバックアップ、WAL アーカイブで PITR 準備
# 期待結果: フルバックアップと WAL ファイルが取得される

# フルバックアップ取得
sudo -u postgres pg_dumpall > /backup/pg-full.sql   # 全データベースを /backup/pg-full.sql にバックアップ

# WAL アーカイブ設定 (postgresql.conf)
archive_mode = on                                  # アーカイブを有効化
archive_command = 'cp %p /backup/wal/%f'           # WAL ファイルを指定先にコピー

# リストア例 (フルバックアップ)
psql -f /backup/pg-full.sql                        # バックアップファイルをリストア

ストリーミングレプリケーション

マスター/スタンバイ構成を組み、WAL をリアルタイム転送します。

# マスター側 postgresql.conf
listen_addresses = '*'                             # 全インターフェイスで待受
wal_level = replica                                # レプリ用 WAL レベル
max_wal_senders = 3                                # WAL 送信プロセス数
wal_keep_size = '1GB'                              # WAL キープサイズ

# スタンバイ側 recovery.conf(PostgreSQL13 では standby.signal ファイルで動作)
primary_conninfo = 'host=master.example.com port=5432 user=replicator password=repPass'  # 接続情報

# スタンバイ起動
systemctl start postgresql                       # スタンバイを起動

9.4 メールサーバー (Postfix & Dovecot)

メールサーバーは、ユーザー間の電子メール送受信を担う中核コンポーネントです。本節では、MTA(Mail Transfer Agent)として広く使われる Postfix と、MDA/IMAP/POP3 を提供する Dovecot の構築から、TLS・SMTP認証、SPF/DKIM/DMARC によるなりすまし防止まで、初心者でも実運用可能なレベルで詳細に解説します。

💡 前提条件:

  • AlmaLinux 9 がインストール済み。
  • root または sudo 権限ユーザー。
  • ホスト名、DNS 逆引き、時刻同期(chrony)が適切に設定済み。
  • SELinux が enforcing、firewalld が有効化済み。

9.4.1 Postfix (MTA)

Postfix は高性能かつ安全性に優れた MTA です。SMTP (port 25) によるメール転送の他、SMTP AUTH (port 587) や SMTPS (port 465) による認証・暗号化をサポートし、スパムリレー防止機能を備えています。

インストールと基本設定

# 実行ユーザー: sudo 権限ユーザー
# 目的: Postfix のインストールとサービス起動
# 期待結果: SMTP (25), Submission (587) が起動し、外部ホストから接続可能

sudo dnf install postfix -y             # Postfix パッケージをインストール
sudo systemctl enable postfix           # OS 起動時に postfix を自動起動設定
sudo systemctl start postfix            # Postfix サービスを起動
sudo firewall-cmd --add-service=smtp --permanent   # port 25 を許可
sudo firewall-cmd --add-service=submission --permanent   # port 587 を許可
sudo firewall-cmd --reload              # ファイアウォール設定を反映
  • /etc/postfix/main.cf で共通設定
  • /etc/postfix/master.cf でサービス動作定義
  • /var/spool/postfix がキュー/ワークディレクトリ
注意:リレー設定を誤るとオープンリレー化し、スパム送信の踏み台になります。必ず mynetworkssmtpd_recipient_restrictions を適切に設定してください。

SMTP 認証 (SASL) と TLS 設定

# 実行ユーザー: sudo 権限ユーザー
# 目的: SMTP AUTH & TLS を有効化し、認証付き送信を可能に
# 期待結果: port 587 で STARTTLS/AUTH LOGIN が動作

# Postfix に SASL (Dovecot) と TLS を設定
postconf -e 'smtpd_tls_cert_file=/etc/pki/tls/certs/mail.crt'        # 証明書ファイル指定
postconf -e 'smtpd_tls_key_file=/etc/pki/tls/private/mail.key'      # 秘密鍵ファイル指定
postconf -e 'smtpd_use_tls=yes'                                      # TLS を有効化
postconf -e 'smtpd_tls_auth_only=yes'                                # AUTH 前に TLS 必須化
postconf -e 'smtpd_sasl_type=dovecot'                                # SASL バックエンドに Dovecot 指定
postconf -e 'smtpd_sasl_path=private/auth'                           # Dovecot ソケットパス
postconf -e 'smtpd_sasl_auth_enable=yes'                             # SMTP AUTH を有効化
postconf -e 'smtpd_recipient_restrictions=permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination'  # 受信制限
postconf -e 'mynetworks=127.0.0.0/8'                                 # ローカルネットワーク定義
postconf -e 'inet_interfaces=all'                                    # すべてのインターフェイスで待受
postconf -e 'inet_protocols=ipv4'                                    # IPv4 のみ利用
systemctl restart postfix                                           # 設定反映のため再起動

9.4.2 Dovecot (IMAP/POP3)

Dovecot は安全かつ高速な IMAP/POP3 サーバーです。メールユーザーの認証・メールボックス管理を担い、Postfix と連携して SMTP AUTH を実現します。

インストールとサービス起動

# 実行ユーザー: sudo 権限ユーザー
# 目的: Dovecot のインストールと自動起動設定
# 期待結果: IMAP (143), IMAPS (993), POP3 (110), POP3S (995) が待ち受け開始

sudo dnf install dovecot -y            # Dovecot パッケージをインストール
sudo systemctl enable dovecot          # OS 起動時に dovecot 自動起動設定
sudo systemctl start dovecot           # Dovecot サービスを起動
sudo firewall-cmd --add-service=imap --permanent    # port 143 を許可
sudo firewall-cmd --add-service=imaps --permanent   # port 993 を許可
sudo firewall-cmd --add-service=pop3 --permanent    # port 110 を許可
sudo firewall-cmd --add-service=pop3s --permanent   # port 995 を許可
sudo firewall-cmd --reload             # ファイアウォール設定を反映
  • /etc/dovecot/dovecot.conf がメイン設定ファイル
  • /etc/dovecot/conf.d/10-auth.conf で認証方式設定
  • /etc/dovecot/conf.d/10-mail.conf でメールボックス形式設定

認証とメールボックス設定

# 実行ユーザー: sudo 権限ユーザー
# 目的: Dovecot で SMTP AUTH と Maildir 形式を設定
# 期待結果: ユーザーが Maildir を利用し、Postfix で認証可能に

# 10-auth.conf を編集
sed -i 's/^#disable_plaintext_auth = yes/disable_plaintext_auth = yes/' /etc/dovecot/conf.d/10-auth.conf   # 平文認証を禁止
sed -i 's/^#auth_mechanisms = plain/auth_mechanisms = plain login/' /etc/dovecot/conf.d/10-auth.conf         # 認証メカニズム設定
# 10-mail.conf を編集
postconf -e 'mail_location=maildir:~/Maildir'    # 各ユーザのホーム下に Maildir 形式を指定
# Dovecot と Postfix の連携用ソケット作成確認
grep -R "unix_listener auth" -n /etc/dovecot/conf.d     # ソケット定義を検証
systemctl restart dovecot                                # 設定反映のため再起動
注意:SELinux によって Maildir の書き込みが阻害される場合、semanage fcontextrestorecondovecot_mail_t を設定してください。

9.4.3 SPF, DKIM, DMARC 設定

なりすましメール対策として、DNS レコードで送信者の正当性を検証する SPF、電子署名による検証の DKIM、受信ポリシーを示す DMARC を順に設定します。

SPF レコード設定

# 目的: DNS に SPF レコードを追加し、送信元 IP を制限
# 期待結果: example.com ドメインからの正当な送信元が検証される

# DNS 管理画面で以下 TXT レコードを追加
# example.com. IN TXT "v=spf1 mx ip4:203.0.113.10 include:spf.protection.example.net ~all"

DKIM(OpenDKIM)設定

# 実行ユーザー: sudo 権限ユーザー
# 目的: OpenDKIM インストールと Postfix 連携設定
# 期待結果: 送信メールに DKIM 署名が付与される

sudo dnf install opendkim -y                          # OpenDKIM をインストール
sudo mkdir -p /etc/opendkim/keys/example.com          # キー用ディレクトリ作成
opendkim-genkey -D /etc/opendkim/keys/example.com -d example.com -s default  # 鍵ペア生成
sudo chown -R opendkim:opendkim /etc/opendkim/keys     # 所有者を opendkim に設定

# /etc/opendkim.conf に以下を追記
echo "Domain                  example.com"   >> /etc/opendkim.conf    # 署名対象ドメイン
echo "KeyFile                 /etc/opendkim/keys/example.com/default.private" >> /etc/opendkim.conf  # 秘密鍵パス
echo "Selector                default"        >> /etc/opendkim.conf    # セレクタ名
echo "Socket                  inet:8891@localhost" >> /etc/opendkim.conf  # ソケット設定

# Postfix に milter を追加
postconf -e 'smtpd_milters=inet:localhost:8891'   # 受信時に DKIM 検証
postconf -e 'non_smtpd_milters=inet:localhost:8891'  # 送信時にも DKIM
systemctl enable opendkim                         # 起動時有効化
systemctl start opendkim                          # OpenDKIM を起動
systemctl restart postfix                         # Postfix に設定を反映

DMARC レコード設定

# 目的: DNS に DMARC レコードを追加し、受信者にポリシー通知
# 期待結果: SPF/DKIM 検証失敗時の処理が定義される

# DNS 管理画面で以下 TXT レコードを追加
# _dmarc.example.com. IN TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com; ruf=mailto:dmarc-feedback@example.com; pct=100"

9.5 FTP サーバー (vsftpd)

安全かつ効率的なファイル転送サービスを提供する FTP サーバーとして、AlmaLinux 9 標準リポジトリの vsftpd を使った構築方法を解説します。匿名 FTP の禁止、ローカルユーザーの chroot 制限、FTPS(TLS)による暗号化通信、パッシブモード設定、さらには仮想ユーザー認証まで、初心者でも実運用できるレベルの詳細手順を示します。

💡 前提条件:

  • AlmaLinux 9 がインストール済み
  • root または sudo 権限ユーザー
  • SELinux enforcing、firewalld 有効化済み
  • ホスト名、DNS、時刻同期(chrony)設定済み

9.5.1 基本インストールと chroot 制限

# 実行ユーザー: sudo 権限ユーザー
# 目的: vsftpd のインストールと基本設定
# 期待結果: FTP サーバが起動し、ローカルユーザーが chroot 制限される

sudo dnf install vsftpd -y                     # vsftpd パッケージをインストール
sudo systemctl enable vsftpd                   # vsftpd サービスを起動時に有効化
sudo systemctl start vsftpd                    # vsftpd サービスを起動
sudo firewall-cmd --add-service=ftp --permanent   # FTP (port 21) を許可
sudo firewall-cmd --reload                     # ファイアウォール設定を反映

# /etc/vsftpd/vsftpd.conf の設定例
anonymous_enable=NO          # 匿名ログインを禁止
local_enable=YES             # ローカルユーザーのログインを許可
write_enable=YES             # ファイルのアップロード/書き込みを許可
chroot_local_user=YES        # ローカルユーザーをホームディレクトリに chroot 制限
allow_writeable_chroot=YES   # chroot 内での書き込みを許可
user_sub_token=$USER         # ユーザーディレクトリ名にユーザー名を使用
local_root=/home/$USER/ftp   # ローカルユーザーの FTP ホームを設定
注意:vsftpd.conf の設定変更後は sudo systemctl restart vsftpd で必ず再起動してください。設定ミスがあるとサービスが起動しません。

SELinux 設定

# 目的: ホームディレクトリを chroot で利用できるように SELinux を緩和
# 期待結果: vsftpd がユーザーホーム配下を読み書き可能に

sudo setsebool -P ftp_home_dir on             # ホームディレクトリでの FTP 公開を許可
sudo setsebool -P allow_ftpd_full_access on   # vsftpd の全書き込みアクセスを許可

9.5.2 FTPS (SSL/TLS) 設定

通信の盗聴を防ぐため、TLS を利用した FTPS を設定します。自己署名証明書の作成例と vsftpd.conf での有効化手順を示します。

# 実行ユーザー: sudo 権限ユーザー
# 目的: OpenSSL で自己署名証明書を作成し、FTPS を有効化
# 期待結果: /etc/pki/tls/certs/vsftpd.pem と秘密鍵が生成され、TLS 接続が可能になる

sudo dnf install openssl -y                   # OpenSSL をインストール
sudo mkdir -p /etc/pki/tls/{certs,private}     # 証明書ディレクトリを作成
sudo openssl req -x509 -nodes -days 365 \
  -newkey rsa:2048 \
  -keyout /etc/pki/tls/private/vsftpd.pem \
  -out /etc/pki/tls/certs/vsftpd.pem \
  -subj "/C=JP/ST=Tokyo/L=Chiyoda/O=Example/OU=IT/CN=ftp.example.com"  # 証明書と秘鍵を生成

# /etc/vsftpd/vsftpd.conf に以下を追記
ssl_enable=YES                 # SSL/TLS を有効化
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem       # 証明書ファイルのパス
rsa_private_key_file=/etc/pki/tls/private/vsftpd.pem  # 秘密鍵ファイルのパス
ssl_tlsv1=YES                  # TLSv1 を有効化
ssl_sslv2=NO                   # SSLv2 を無効化
ssl_sslv3=NO                   # SSLv3 を無効化
allow_anon_ssl=NO              # 匿名ユーザーの SSL 接続を禁止
force_local_data_ssl=YES       # データ接続に TLS を強制
force_local_logins_ssl=YES     # ログイン接続に TLS を強制

# パッシブモードとポート範囲の設定
pasv_enable=YES                # パッシブモードを有効化
pasv_min_port=40000            # パッシブモード最小ポート番号
pasv_max_port=40100            # パッシブモード最大ポート番号

sudo firewall-cmd --add-port=40000-40100/tcp --permanent   # パッシブモード用ポートを許可
sudo firewall-cmd --reload                     # ファイアウォール設定を反映
注意:自己署名証明書は試験環境のみ使用し、本番環境では Let’s Encrypt や社内 CA が発行する証明書を利用してください。

9.5.3 仮想ユーザー認証とパフォーマンスチューニング

システムユーザーを使用せず、独立した仮想ユーザーで FTP アクセスを管理する方法を示します。また、大量接続時のチューニングポイントを解説します。

# 目的: PAM と db4 を使って仮想ユーザー認証を設定
# 期待結果: /etc/vsftpd/virtusers.db に仮想ユーザー情報が配置され、ログイン可能

sudo dnf install db4-utils -y                    # db4 ユーティリティをインストール
printf "ftpuser\nsecurePass123\n" > /etc/vsftpd/virtusers   # 仮想ユーザー名とパスワードをファイル化
sudo db_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db  # DB ハッシュを生成
rm -f /etc/vsftpd/virtusers                       # 平文ファイルを削除

# PAM 設定ファイル /etc/pam.d/vsftpd-virtual の例
cat << 'EOF' | sudo tee /etc/pam.d/vsftpd-virtual  # PAM 認証設定を作成
auth    required  pam_userdb.so db=/etc/vsftpd/virtusers   # 仮想ユーザー認証を有効化
account required  pam_userdb.so db=/etc/vsftpd/virtusers   # アカウント管理を有効化
EOF

sudo systemctl restart vsftpd                    # 設定を反映して再起動

# vsftpd.conf に仮想ユーザー設定を追加
guest_enable=YES              # 仮想ユーザーをゲストユーザーとして扱う
guest_username=ftp            # ゲストユーザーにマッピングするローカルユーザー
virtual_use_local_privs=YES   # ローカルユーザーの権限を使用
user_config_dir=/etc/vsftpd/vconf  # ユーザー別設定ディレクトリを指定

# 多数接続時のパフォーマンスチューニング例
max_clients=50                # 同時接続数の上限を 50 に設定
max_per_ip=5                  # IP ごとの最大接続数を 5 に制限

9.6 DNS サーバー (BIND)

DNS はドメイン名と IP アドレスを対応付けるシステムで、ネットワークサービスの根幹を担います。本節では、AlmaLinux 9 標準パッケージの BIND を使ったマスター/スレーブ/キャッシュ DNS サーバーの構築、ゾーン設定、DNSSEC、SELinux 対応、ロギング、高度なビュー設定までを、初心者~中級者向けに徹底解説します。

💡 前提条件:

  • root または sudo 権限ユーザー
  • SELinux enforcing、firewalld 有効化済み
  • ポート 53 (TCP/UDP) がファイアウォールで許可済み
  • AlmaLinux 9 の最小インストール環境

9.6.1 インストールと基本設定

# 実行ユーザー: sudo 権限ユーザー
# 目的: BIND (named) のインストールとファイアウォール/SELinux 設定
# 期待結果: named サービスがポート 53 で待ち受け可能になる

sudo dnf install bind bind-utils -y             # BIND とユーティリティをインストール
sudo systemctl enable named --now               # named を自動起動設定し、即時起動
sudo firewall-cmd --add-service=dns --permanent # firewalld で DNS (TCP/UDP 53) を許可
sudo firewall-cmd --reload                      # ファイアウォール設定を反映
sudo semanage port -a -t named_port_t -p tcp 53 # SELinux に TCP 53 ポートを追加
sudo semanage port -a -t named_port_t -p udp 53 # SELinux に UDP 53 ポートを追加
  • /etc/named.conf がメイン設定ファイル
  • ✅ ゾーンファイルは /var/named/ 配下に配置
  • rndc コマンドで named の管理が可能

9.6.2 マスターゾーンの設定

マスター DNS サーバーでは、自ドメインの正式なゾーンデータを公開します。/etc/named.conf にゾーン定義を追加し、/var/named/example.com.zone にゾーンファイルを作成します。

# /etc/named.conf にゾーン設定を追加
zone "example.com" IN { # ゾーン名とクラスを指定
    type master;        # マスターゾーンとして定義
    file "example.com.zone"; # ゾーンファイルパスを指定
    allow-update { none; };  # 動的更新を無効化
}; # ゾーン定義終了

# ゾーンファイル example.com.zone の例
$TTL 86400          # デフォルト TTL を 86400 秒 (24h) に設定
@   IN SOA ns1.example.com. root.example.com. ( # SOA レコード開始
    2025051001     # シリアル番号 (YYYYMMDDnn)
    3600           # リフレッシュ間隔 (秒)
    1800           # リトライ間隔 (秒)
    604800         # 有効期限 (秒)
    86400          # 最小 TTL (秒)
)                 # SOA レコード終了
@   IN NS  ns1.example.com. # NS レコードを定義
ns1 IN A   192.168.10.10     # ns1 の A レコード
www IN A   192.168.10.20     # www の A レコード
@   IN MX  10 mail.example.com. # メールサーバー優先順を設定
mail IN A   192.168.10.30     # mail ホストの A レコード
# ゾーン構文チェックと反映
sudo named-checkzone example.com /var/named/example.com.zone # ゾーンファイルの構文を検証
sudo rndc reload example.com                                 # ゾーンをリロード
sudo systemctl restart named                                  # named サービス再起動

9.6.3 スレーブゾーンの設定

スレーブ DNS サーバーでは、マスターからゾーンデータを転送して冗長化を実現します。/etc/named.conf に以下を追加します。

# /etc/named.conf にスレーブ定義を追加
zone "example.com" IN {           # ゾーン名とクラスを指定
    type slave;                   # スレーブゾーンとして定義
    file "slaves/example.com.zone"; # スレーブ用ファイルパスを指定
    masters { 192.168.10.10; };   # マスター DNS の IP を指定
    allow-update { none; };       # 動的更新を無効化
}; # スレーブゾーン定義終了

# スレーブでの反映確認
sudo rndc reload example.com      # スレーブでゾーンをリロード
sudo rndc status                  # named サービスの状態を表示

9.6.4 キャッシュ DNS サーバー設定

キャッシュ専用 DNS サーバーは再帰問い合わせを受け、他の DNS サーバーから取得した結果をキャッシュします。/etc/named.conf の options セクションに以下を追加します。

# キャッシュサーバー用 options 設定例
options {                               # options ブロック開始
    recursion yes;                      # 再帰問い合わせを許可
    allow-query { any; };               # 全クライアントのクエリを許可
    forwarders {                        # フォワーダー設定開始
        8.8.8.8;                        # Google DNS
        8.8.4.4;                        # Google DNS
    }; # フォワーダー設定終了
}; # options ブロック終了

# 設定反映
sudo systemctl restart named           # named を再起動して反映

9.6.5 DNSSEC の設定

DNSSEC を導入すると、ゾーンデータの改ざん検出が可能になります。以下は基本的なゾーン署名手順です。

# TSIG キー生成 (ゾーン転送用)
sudo dnssec-keygen -a HMAC-SHA256 -b 256 -n USER transfer-key # TSIG キーを生成

# ゾーン署名鍵 (ZSK/KSK) の生成
sudo dnssec-keygen -a RSASHA256 -b 2048 -n ZONE example.com    # ゾーン署名鍵を生成

# ゾーン署名
sudo dnssec-signzone \
    -A \                                                    # 自動アルゴ式選択
    -3 $(head -c 100 /dev/random | sha1sum | cut -d" " -f1) \ # NSEC3 salt
    -N INCREMENT \                                          # シリアル自動更新
    -o example.com \                                        # ゾーン名を指定
    -t /var/named/example.com.zone                          # ゾーンファイルを署名

# Trust Anchor としてクライアントに配布する場合は example.com.zone.key を使用

9.6.6 ロギングと ACL、高度なビュー設定

ログを整理し、ACL や views 機能でアクセス制御・応答内容を使い分けることで、運用性とセキュリティを強化できます。

# ロギング設定例 (named.conf)
logging { # ログ設定ブロック開始
    channel default_syslog { # チャンネル定義
        syslog daemon;       # syslog daemon ファシリティを使用
        severity info;       # ログレベルを info に設定
    }; # チャンネル定義終了
    category default { default_syslog; }; # 全カテゴリを default_syslog に割当
}; # ログ設定終了

# 内部/外部で応答を分けるビュー設定例
view "internal" {                              # internal ビュー開始
    match-clients { 192.168.0.0/16; };         # 内部ネットワークをマッチ
    recursion yes;                             # 再帰問い合わせを許可
    zone "internal.example.com" IN {           # 内部用ゾーン定義
        type master;                           # マスターゾーン
        file "internal.example.com.zone";      # ゾーンファイル
    }; # ゾーン定義終了
}; # internal ビュー終了

# ACL 定義例: 転送を信頼ネットワークに限定
acl "trusted" { 192.168.10.0/24; };            # 信頼ネットワーク定義
options {                                     # options ブロック開始
    allow-transfer { trusted; };              # ゾーントランスファーを trusted のみに許可
}; # options ブロック終了

9.7 高度な運用管理

本章では、AlmaLinux 9 環境におけるシステム運用の高度化手法を紹介します。カスタム systemd ユニットやタイマー、ログ管理とセキュリティ連携、可用性・負荷分散構成までを網羅し、運用性・信頼性・拡張性を最大化します。

💡 前提条件:

  • root または sudo 権限ユーザー
  • firewalld・SELinux(enforcing) が有効化済み
  • chrony による時刻同期済み
  • 基本的な systemd/journalctl の操作知識

9.7.1 Systemd ユニットファイルとタイマー

標準サービスを拡張・カスタマイズしたり、定期実行タスクを systemd タイマーで管理する方法を解説します。ユニットのオーバーライドや依存関係設定で可搬性と理解性を高めましょう。

[Unit] # ユニット定義セクション開始
Description=MyApp カスタムサービス # サービスの説明を記載
After=network.target # network.target 起動後に MyApp を起動

[Service] # サービス実行セクション開始
Type=simple # プロセス駆動型サービスとして実行
User=myappuser # MyApp を実行するシステムユーザー
Group=myappgroup # 実行グループを指定
ExecStart=/usr/local/bin/myapp --config /etc/myapp/config.yaml # サービス起動コマンド
Restart=on-failure # 失敗時に自動再起動

[Install] # インストールセクション開始
WantedBy=multi-user.target # マルチユーザーターゲット起動時に有効化
  • /etc/systemd/system/myapp.service に配置
  • systemctl daemon-reload でユニットを再読み込み
  • systemctl enable myapp で起動時有効化

定期実行タスク (Timer ユニット)

cron の代替として systemd タイマーを使うメリットは、依存関係やログの一元管理ができることです。

[Unit] # タイマー用ユニットセクション開始
Description=MyApp 日次バックアップタイマー # タイマーユニットの説明

[Timer] # タイマー実行設定セクション開始
OnCalendar=daily # 毎日 00:00 に実行
Persistent=true # 実行漏れがあれば次回起動時に即実行

[Install] # インストールセクション開始
WantedBy=timers.target # timers.target に紐付け
  • /etc/systemd/system/myapp-backup.timer に配置
  • systemctl enable --now myapp-backup.timer で即時有効化
  • systemctl list-timers でスケジュールを確認

9.7.2 ログ管理とセキュリティ連携

journalctl や logrotate、Fail2Ban でログを効率的に管理し、異常検知を自動化します。監査ログには auditd を組み合わせ、SELinux イベントも収集しましょう。

永続化された Journal 設定

# 目的: journald のログ永続化設定
# 期待結果: /var/log/journal 以下にバイナリログが保存される

sudo mkdir -p /var/log/journal # 永続化ディレクトリを作成
sudo sed -i 's/^#Storage=auto/Storage=persistent/' /etc/systemd/journald.conf # 永続化を有効化
sudo systemctl restart systemd-journald # 設定を反映して journald を再起動

logrotate でファイルログ管理

大容量ログを定期ローテーションし、ディスク容量を抑制します。

# 目的: /var/log/myapp/*.log を週次でローテート
# 期待結果: 4 世代までログを保持し、圧縮する

cat << 'EOF' | sudo tee /etc/logrotate.d/myapp  # myapp 用 logrotate 設定を作成
/var/log/myapp/*.log { # 対象ログファイル
    weekly # 週次でローテーション
    rotate 4 # バックアップ世代数を 4 に設定
    compress # 古いログを gzip 圧縮
    missingok # ログがなくてもエラーにしない
    notifempty # 空ファイルはローテーションしない
    create 0640 myappuser myappgroup # 新ログ作成時のパーミッション
}
EOF

Fail2Ban 連携で不正アクセス防止

認証ログを監視し、指定回数失敗した IP を自動でブロックします。

# 目的: sshd と myapp の Jail を設定
# 期待結果: 5 回失敗した IP を 1 時間ブロック

sudo dnf install fail2ban -y # Fail2Ban をインストール

# /etc/fail2ban/jail.local に設定追加
cat << 'EOF' | sudo tee /etc/fail2ban/jail.local
[sshd] # SSHD 用 Jail 定義
enabled = true # Jail を有効化
port = ssh # SSH ポートを指定
filter = sshd # フィルタを sshd に設定
logpath = /var/log/secure # SSH ログパスを指定
maxretry = 5 # 失敗回数上限を 5 回
bantime = 3600 # ブロック時間を 3600 秒に設定

[myapp-auth] # MyApp 認証ログ用 Jail
enabled = true # Jail を有効化
port = http,https # ポート 80/443 を監視
filter = myapp-auth # カスタムフィルタ名
logpath = /var/log/myapp/auth.log # 認証ログパスを指定
maxretry = 3 # 失敗回数上限を 3 回
bantime = 7200 # ブロック時間を 7200 秒に設定
EOF

sudo systemctl enable --now fail2ban # Fail2Ban を即時有効化

9.7.3 可用性と負荷分散

HAProxy、Keepalived、Pacemaker/Corosync による冗長化とロードバランス構成を解説します。サービス停止時のフェイルオーバーや水平スケールを実現し、ダウンタイムを最小化します。

HAProxy でのレイヤー4/7 負荷分散

# 目的: HTTP と TCP 両方を負荷分散
# 期待結果: backend プールへラウンドロビンで転送

sudo dnf install haproxy -y # HAProxy をインストール

cat << 'EOF' | sudo tee /etc/haproxy/haproxy.cfg # HAProxy 設定を作成
global # グローバル設定
    log /dev/log local0 # ログ出力先を指定
    maxconn 2000 # 最大同時接続を設定

defaults # デフォルト設定
    mode http # HTTP モードをデフォルトに設定
    timeout connect 5s # 接続タイムアウトを 5 秒に設定
    timeout client  50s # クライアントタイムアウトを 50 秒に設定
    timeout server  50s # サーバータイムアウトを 50 秒に設定

frontend http_front # HTTP フロントエンド定義
    bind *:80 # 全インターフェイス:80 で待受
    default_backend http_back # デフォルトバックエンドを指定

backend http_back # HTTP バックエンド定義
    balance roundrobin # ラウンドロビン方式で負荷分散
    server web01 192.168.10.11:80 check # web01 をヘルスチェック有効で追加
    server web02 192.168.10.12:80 check # web02 をヘルスチェック有効で追加

frontend tcp_front # TCP フロントエンド定義
    bind *:3306 # MySQL 用 TCP:3306 で待受
    default_backend tcp_back # デフォルトバックエンドを指定

backend tcp_back # TCP バックエンド定義
    mode tcp # TCP モードを指定
    balance leastconn # 最小接続数優先方式
    server db01 192.168.10.21:3306 check # db01 をヘルスチェック有効で追加
    server db02 192.168.10.22:3306 check # db02 をヘルスチェック有効で追加
EOF

sudo systemctl enable --now haproxy # HAProxy を即時有効化

Keepalived での VRRP 冗長化

# 目的: 仮想 IP を冗長化し、フェイルオーバーを実現
# 期待結果: マスター障害時にバックアップが仮想 IP を引き継ぐ

sudo dnf install keepalived -y # Keepalived をインストール

cat << 'EOF' | sudo tee /etc/keepalived/keepalived.conf # Keepalived 設定を作成
vrrp_instance VI_1 { # VRRP インスタンス定義
    state MASTER # マスターノード設定 (BACKUP on second)
    interface eth0 # VRRP を動作させるインターフェイス
    virtual_router_id 51 # VRID を任意設定
    priority 100 # マスターは高いプライオリティ
    authentication { # 認証設定
        auth_type PASS # パスワード認証方式
        auth_pass secret123 # 認証パスワードを設定
    }
    virtual_ipaddress { # 仮想 IP 定義
        192.168.10.100/24 # フェイルオーバー用仮想 IP
    }
}
EOF

sudo systemctl enable --now keepalived # Keepalived を即時有効化

Pacemaker & Corosync でのクラスタ構築

# 目的: Pacemaker/Corosync クラスタのインストールと基本設定
# 期待結果: 2 ノードクラスタが形成され、リソース管理が可能

sudo dnf install pacemaker corosync pcs fence-agents-all -y # クラスタパッケージをインストール

# ユーザー認証設定
sudo passwd hacluster # hacluster ユーザーのパスワードを設定
sudo pcs cluster auth node1.example.com node2.example.com -u hacluster -p yourpass # ノード間認証

# クラスタ構成開始
sudo pcs cluster setup --name mycluster node1.example.com node2.example.com # クラスタをセットアップ
sudo pcs cluster start --all # すべてのノードでクラスタを起動
sudo pcs cluster enable --all # 自動起動設定

# リソース追加例: VIP と Apache
sudo pcs resource create ClusterIP ocf:heartbeat:IPaddr2 ip=192.168.10.200 cidr_netmask=24 op monitor interval=30s # 仮想 IP リソース
sudo pcs resource create WebServer systemd:httpd op monitor interval=1min # Apache サービスリソース
sudo pcs constraint colocation add WebServer with ClusterIP INFINITY # リソースをコロケーション
sudo pcs constraint order ClusterIP then WebServer # 起動順序を設定
EOF

9.8 学習のまとめ

本章では、AlmaLinux9 上で主要なサーバーサービスをゼロから構築し、運用するための知見を総括しました。dnf を用いたパッケージ管理から始まり、SELinuxfirewalld といった セキュリティ設定 を組み込んだ実践手順を通じて、サービスの可用性・性能・安全性を高める方法を学びました。

  • Web サーバー(Apache/Nginx)
    モジュール構成やMPM、イベント駆動モデルによるパフォーマンスチューニング、HTTP/2・TLS1.3 対応、Let’s Encrypt 自動更新まで、実稼働レベルの最適化手法を習得。
  • データベース(MariaDB/PostgreSQL)
    mysql_secure_installationpostgresql-setup による初期セキュア化、InnoDB バッファプール・shared_buffers 調整、バックアップ(mysqldump/pg_dumpall)と PITR、ストリーミングレプリケーション構築まで網羅。
  • メール(Postfix/Dovecot)
    SMTP AUTH と TLS 強制、SPF/DKIM/DMARC によるなりすまし防止、Maildir 形式の安全な受信基盤を実装し、スパム対策の基礎を確立。
  • FTP(vsftpd)
    匿名禁止、ローカルユーザーの chroot 制限、FTPS(SSL/TLS)設定、仮想ユーザー認証によるアクセス管理と、パッシブモード最適化で安全・効率的なファイル転送を実現。
  • DNS(BIND)
    マスター/スレーブ/キャッシュの各モード、ゾーンファイル管理、DNSSEC によるゾーン署名、ACL・views 機能で内部外部応答を分離する高度設定まで網羅。
  • 高度な運用管理
    systemd ユニット&タイマーで cron タスクを統合、永続化 journal と logrotate でログを最適管理、Fail2Ban 連携による不正アクセス防御、HAProxy/Keepalived/Pacemaker で可用性・負荷分散を構築。
💡 次のステップ:
  • AlmaLinux9 の長期サポートスケジュールを確認し、セキュリティパッチ適用計画を策定
  • Prometheus/Grafana や Zabbix で各種メトリクス監視を導入
  • Ansible/Chef/Puppet による構成管理で再現性と保守性を向上
注意:
本ガイドの設定例はサンプル構成です。実運用ではネットワークポリシー、ユーザー権限、ログ保管ポリシーなどを追加検討し、組織のセキュリティ要件に合わせて最適化してください。

以上を踏まえ、AlmaLinux9 環境のサーバー基盤を自信を持って設計・運用できるスキルが身につきました。今後は本節で紹介したベストプラクティスを継続的にレビュー・改善し、堅牢かつ高性能なインフラ運用を実践してください。

さらなる学習リソース

以下では、本ガイドで扱った各種コンポーネントや運用手法をさらに深掘りできる、公式情報から専門書籍・オンラインコースまで幅広いリソースを厳選してご紹介します。各リンク先には実践的な設定例やトラブルシューティング、内部アーキテクチャ解説などが豊富に掲載されており、専門書を凌駕するレベルの知見が得られます。

  • AlmaLinux プロジェクト公式ドキュメント
    https://wiki.almalinux.org/
    AlmaLinux Community がメンテナンスする公式 Wiki。RHEL 由来の最新パッケージ情報やリリースノート、移行ガイドなどを網羅しています。
  • Red Hat Enterprise Linux 9 ドキュメント
    https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/
    RHEL 9 の公式ガイド。SELinux、firewalld、systemd、Podman/Buildah、Performance Co-Pilot(PCP)など、AlmaLinux と共通の深層設定・運用ノウハウが豊富です。
  • O’Reilly — “Linux Administration: A Beginner’s Guide”
    by Wale Soyinka
    Linux サーバー運用の基礎からネットワークサービス構築、セキュリティ対策までを解説。各種デーモンの内部動作やトラブルシュートの章が特に詳細です。
  • O’Reilly — “The Linux Programming Interface”
    by Michael Kerrisk
    Linux カーネル API や systemd/journalctl/cgroups などの内部構造をプログラミング視点で解説。高度な運用管理で役立つ深い知識が得られます。
  • Apache HTTP Server ドキュメント
    https://httpd.apache.org/docs/2.4/
    モジュール開発ガイドから MPM・イベントモデルの詳細設定、セキュリティベストプラクティスまで網羅。公式FAQも実運用での課題解決に役立ちます。
  • Nginx ドキュメント
    https://nginx.org/en/docs/
    イベント駆動アーキテクチャの原理解説、ストリーミング/キャッシュ/ロードバランサー機能の深層設定例が充実しています。
  • MariaDB Knowledge Base
    https://mariadb.com/kb/en/
    InnoDB チューニング、レプリケーション、バックアップ、セキュリティ機能など、公式FAQ・チュートリアル形式で詳細に解説。
  • PostgreSQL ドキュメント
    https://www.postgresql.org/docs/13/
    JSON 型やパーティショニング、並列クエリ、ストリーミングレプリケーション、WAL アーカイブなど、先進機能の内部動作を丁寧に説明。
  • Postfix ドキュメント
    http://www.postfix.org/documentation.html
    SMTP トランザクションフロー、MILTER API、SASL/TLS 統合の実装詳細まで記載。デバッグガイドも充実。
  • Dovecot ドキュメント
    https://doc.dovecot.org/
    Maildir/Mailbox フォーマット解析、プラグイン開発ガイド、認証バックエンド(LDAP、SQL)連携例など高度なカスタマイズ方法。
  • vsftpd ドキュメント
    https://security.appspot.com/vsftpd/vsftpd_conf.html
    設定オプションの全リファレンスとセキュリティ設計指南。仮想ユーザー/PAM 連携、TLS パフォーマンス調整の詳細が記載されています。
  • BIND 9 ドキュメント
    https://bind9.readthedocs.io/
    DNSSEC、TSIG、views、ACL、統計情報(rndc stats)など、高度機能の設定例と設計原則が詳述されています。
  • systemd ドキュメント
    https://www.freedesktop.org/software/systemd/man/
    ユニットファイル構文、依存関係、タイマー、cgroups 統合など、最新の systemd 機能を網羅的に解説。
  • firewalld ドキュメント
    https://firewalld.org/documentation/
    ゾーン設計、rich language、direct インターフェイス、IPv6 サポートなど高度設定、バックエンド(nftables)解説も掲載。
  • HAProxy ドキュメント
    https://www.haproxy.org/#docs
    レイヤー4/7 設定、ヘルスチェック、SSL/TLS 統合、パフォーマンスチューニングパラメータ解説が詳細です。
  • Keepalived ドキュメント
    https://www.keepalived.org/documentation.html
    VRRP、LVS、ヘルスチェックスクリプト、通知スクリプト例まで包括的に解説。
  • Pacemaker & Corosync ドキュメント
    https://clusterlabs.org/documentation/
    リソースエージェント開発、STONITH、フェンシング、クロスサイトクラスタリングなどエンタープライズ向け設計原則。
  • オンライン講座 — Linux Foundation
    https://training.linuxfoundation.org/
    LFCS/LFCE 認定コース、ネットワークサービス構築、セキュリティ、コンテナ運用など実践的演習付きプログラム。
  • オンライン講座 — Red Hat Training
    https://www.redhat.com/en/services/training-and-certification
    RHCSA/RHCE 認定コース、Ansible 自動化、セキュリティ、OpenShift 運用など、RHEL ベース環境に特化した公式トレーニング。