CentOS Stream 9におけるRedisの「正解」構成:SELinuxによるセキュリティと実戦的なパフォーマンス最適化

CentOS tutorial - IT technology blog
CentOS tutorial - IT technology blog

なぜCentOS Stream 9でRedisなのか?

CentOS 7(EOL済み)からCentOS Stream 9へシステムを移行する際、よくある間違いを目にします。多くのエンジニアがいわゆる「とりあえずインストール」の状態で、インストール後にポートを開けるだけで運用を始めてしまいます。この方法は検証環境(Lab)であれば問題ありません。しかし、RHEL/CentOSのような厳格な環境の本番サーバー(Production)では、SELinuxやFirewalldのセキュリティの壁に即座にぶつかることになります。

Redis (Remote Dictionary Server) は、通常1ms未満という極めて低いレイテンシにより、キャッシュサーバーとして不動の選択肢となっています。CentOS Stream 9でスムーズに動作させるためには、より体系的なアプローチが必要です. 目標は単に「動く」ことではなく、「安全に動く」ことです。

デプロイ手法の比較

コマンドを打ち込む前に、実際のプロジェクトから導き出した3つのアプローチを比較してみましょう:

1. ソースコードからのインストール

  • メリット: 最新のRedis 7.2+を即座に利用でき、コンパイルオプションを細かくカスタマイズ可能。
  • デメリット: アップデート管理が煩雑で、systemdとの自動統合が行われない。

2. Dockerによるデプロイ

  • メリット: 環境の隔離が容易で、一瞬でデプロイ可能。
  • デメリット: 設定により5〜10%程度のネットワークオーバーヘッドが発生する。また、Docker経由でのRedis Cluster管理は複雑になりがち。

3. AppStreamからのインストール(推奨)

  • メリット: 非常に安定しており、Red Hatによって最適化されている。dnfによるアップデートが容易で、SELinuxポリシーも組み込み済み。
  • デメリット: バージョンが本家より数ヶ月遅れることがある。

私の選択: 長期的な安定性が必要なシステムには、AppStreamを優先します。これにより、将来のメンテナンス(保守)が大幅に楽になります。

本番環境向けRedis構築ステップ

ステップ1:公式リポジトリからのインストール

CentOS Stream 9では、Redisはデフォルトのリポジトリで提供されています。以下のコマンドを実行するだけです:

sudo dnf makecache
sudo dnf install redis -y

インストール後、バージョンを確認してください。リポジトリの更新時期によりますが、通常はRedis 6.2または7.0がインストールされます:

redis-server --version

ステップ2:最適化とセキュリティ設定

設定ファイル /etc/redis/redis.conf を開きます。デフォルトのままにせず、以下のパラメータを変更しましょう:

sudo vi /etc/redis/redis.conf
  • アクセスセキュリティ: 他のアプリケーションサーバーからRedisを呼び出す必要がある場合は、bind 127.0.0.1 をサーバーのプライベートIPに変更します。ファイアウォールがない状態でここを空欄にすることは絶対に避けてください。
  • パスワードの設定: requirepass の行を探します。32文字以上の長いパスワードを設定してください。Redisは毎秒15万リクエストを処理できるため、短いパスワードはブルートフォース攻撃で容易に突破されます。
  • メモリ制限: Redisがリソースを使い果たしてシステムがハングアップ(OOM)するのを防ぎます。
    maxmemory 2gb # サーバーの搭載RAMに合わせて調整
    maxmemory-policy allkeys-lru

ステップ3:SELinuxの「飼い慣らし」

安易に setenforce 0 を実行してはいけません。SELinuxを無効化するのは、システムセキュリティに対する無責任な行為です。デフォルトポートを変更する場合(例:6380)、SELinuxにその旨を伝えます:

# 管理ツールが未インストールの場合はインストール
sudo dnf install policycoreutils-python-utils -y
sudo semanage port -a -t redis_port_t -p tcp 6380

ダンプファイル(RDB)の保存先ディレクトリを変更した場合は、新しいディレクトリのコンテキストを更新します:

sudo chcon -Rt svirt_sandbox_file_t /var/lib/redis_custom

ステップ4:Firewalldの適切な設定

CentOS Stream 9はデフォルトですべてのインバウンド接続をブロックします。ポートを全世界に開放してはいけません。rich-rules を使用して、アプリケーションサーバーのIPのみにアクセスを許可します:

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.50" port protocol="tcp" port="6379" accept'
sudo firewall-cmd --reload

この方法により、万が一パスワードが漏洩しても、外部からRedisポートに接続されるのを防げます。

実践的な課題:Transparent Huge Pages (THP) と Overcommit の修正

Redisのログ(journalctl -u redis)を確認すると、THPに関する警告が表示されることがあります。このLinuxカーネル機能は大きなメモリ管理には役立ちますが、Redisにとっては深刻な遅延(レイテンシスパイク)の原因となります。

マシン起動時にTHPを完全に無効化するサービスを作成しましょう:

sudo vi /etc/systemd/system/disable-thp.service

ファイルの内容:

[Unit]
Description=Disable Transparent Huge Pages (THP)

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'

[Install]
WantedBy=multi-user.target

同時に、/etc/sysctl.confvm.overcommit_memory = 1 を追加し、Redisが仮想メモリ不足エラーを起こさずにディスクへのデータ保存(fork)を行えるようにします。

有効化と動作確認

いよいよ成果を確認する時です:

sudo systemctl enable --now redis disable-thp.service
sudo redis-cli -a Your_Password ping

結果として PONG が返ってくれば、システムは毎秒数万のリクエストを処理する準備が整っています。

実戦的なまとめ

CentOS Stream 9でのRedis構築自体は難しくありません。難しいのは、エンタープライズ環境でいかに安全に共存させるかです。SELinuxやFirewalldのルール遵守には追加で10分ほどの設定時間がかかりますが、それによって予期せぬリスクからデータを守ることができます。システムの最適化、ぜひ成功させてください!

Share: