企業向けNacosセキュリティ構築の実践:CentOS 7での堅牢なセキュリティ対策
金融テクノロジー企業とのプロジェクトで、マイクロサービスアーキテクチャのアップグレードを支援していた際、技術責任者からこうした質問を受けた。「私たちの設定センターとレジストリはNacos上で稼働しているが、等級保護レベル3をクリアするためには、Nacosのセキュリティ対策はどうすればよいか?」という問いは非常に現実的であり、Nacosはマイクロサービス環境のコアコンポーネントであり、そのセキュリティが損なわれればシステム全体に深刻な影響を与える可能性がある。
多くのチームでは権限認証のみを有効化して安全が確保されたと判断するが、実際には多数の脆弱性が見つかることがよくある。真のセキュリティ強化は、認証、権限付与、監査、ネットワーク分離など複数層にわたる防御構造を構築する必要がある。本記事では、最近のプロジェクト経験に基づき、CentOS 7上でNacos 2.0.2を包括的に強化する具体的な手法を紹介する。
1. 環境準備と基本的なセキュリティ設定
1.1 OSレベルでのセキュリティ強化
Nacosのデプロイ前に、CentOS 7のOSを基本的なセキュリティ対策で強化する必要がある。多くのセキュリティ問題はOSの設定に起因する。
ユーザーと権限の分離
rootユーザーによる直接実行は避けるべきである。専用ユーザーを作成することが第一歩である:
# nacosグループとユーザーの作成
groupadd nacos
useradd -r -g nacos -s /bin/false nacos
# アプリケーションディレクトリの作成と権限設定
mkdir -p /opt/nacos
chown -R nacos:nacos /opt/nacos
chmod 750 /opt/nacos
ファイアウォール設定
CentOS 7ではfirewalldがデフォルトで使用される。Nacosのポートアクセスを詳細に制御する:
# ファイアウォールの状態確認
systemctl status firewalld
# 起動していない場合、起動させる
systemctl start firewalld
systemctl enable firewalld
# 必須ポート(8848: Webコンソール、7848: クラスタ通信)の開放
firewall-cmd --permanent --add-port=8848/tcp
firewall-cmd --permanent --add-port=7848/tcp
# IP制限(内部ネットワークからのみアクセスを許可)
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="8848" protocol="tcp" accept'
# 設定の再読み込み
firewall-cmd --reload
SELinuxの設定変更
SELinuxは設定を複雑にするが、本番環境では有効にすることを推奨する。Nacos用のカスタムポリシーを定義する:
# SELinuxのステータス確認
sestatus
# Enforcingモードであれば、Nacos用のポリシーを追加
semanage port -a -t http_port_t -p tcp 8848
semanage port -a -t http_port_t -p tcp 7848
# ディレクトリのコンテキスト設定
semanage fcontext -a -t httpd_sys_content_t "/opt/nacos(/.*)?"
restorecon -Rv /opt/nacos
1.2 Nacosのデプロイモードとセキュリティの考慮
Nacosは単体モード、クラスタモード、Dockerモードの3種類のデプロイ方法をサポートしており、それぞれに異なるセキュリティ上の配慮が必要である。
デプロイモード比較表
| モード | セキュリティの利点 | リスク | 利用シーン |
|---|---|---|---|
| 単体モード | 設定が簡単で保守しやすい | 単一障害点、パフォーマンスのボトルネック | 開発・テスト環境 |
| クラスタモード | 高可用性、負荷分散 | ノード間通信のセキュリティ、同期処理 | 本番環境 |
| Dockerモード | 環境の分離、迅速な展開 | コンテナ逃げ、イメージのセキュリティ | クラウドネイティブ環境 |
注意:本番環境ではクラスタモードを推奨する。3ノード程度でも可用性が大幅に向上する。単体モードは非重要なテスト環境でのみ使用すべきである。
ディレクトリ構成のセキュリティ設計
適切なディレクトリ構造は管理効率を高めるだけでなく、セキュリティ強化にも寄与する:
/opt/nacos/
├── bin/ # 実行ファイル
├── conf/ # 設定ファイル(権限600)
│ ├── application.properties
│ ├── cluster.conf
│ └── nacos-logback.xml
├── data/ # データディレクトリ
│ ├── config-data/
│ └── naming-data/
├── logs/ # ログディレクトリ
│ ├── nacos/
│ └── access_log/
└── plugins/ # プラグインディレクトリ
重要なディレクトリの権限設定:
conf/:chmod 600、nacosユーザーのみアクセス可能logs/:chmod 750、nacosユーザーが書き込み、他は読み取りのみdata/:chmod 700、nacosユーザーのみアクセス可能
2. 認証システムの詳細設定
2.1 認証機能の設定解説
Nacos 2.0.2の内蔵認証システムは非常に洗練されているが、多くのチームは設定を軽視し、各項目の意味を理解せずに有効化している。
主要設定ファイルの詳細
conf/application.propertiesを編集し、以下の設定を重点的に確認する:
# ====== 基本認証設定 ======
# 認証の有効化(本番環境では必須)
nacos.core.auth.enabled=true
# トークンの有効期限(業務要件に応じて調整)
nacos.core.auth.default.token.expire.seconds=7200
nacos.core.auth.default.token.refresh.seconds=300
# トークン秘密鍵(必ず変更すること)
nacos.core.auth.default.token.secret.key=VGhpcyBpcyBhIHNlY3VyZSBrZXkgZm9yIE5hY29zIGF1dGgK
重要:
token.secret.keyは十分な強度を持つBase64エンコード文字列を使用する。推奨長さは32バイト以上。生成方法:openssl rand -base64 32
クラスタ環境での特別設定
複数ノード構成の場合、以下の設定はすべて一致させる必要がある:
# ====== クラスタ認証設定 ======
# サービス間の認証(クラスタでは必須)
nacos.core.auth.server.identity.key=ServerIdentity
nacos.core.auth.server.identity.value=YourClusterSecretValue
# 権限キャッシュ設定
nacos.core.auth.caching.enabled=true
nacos.core.auth.caching.expire.seconds=300
# User-Agentホワイトリスト(慎重に使用)
nacos.core.auth.enable.userAgentAuthWhite=false
一般的な誤解と正しい設定方法
- トークン有効期限の設定が長すぎる
- 不正な例:7日間や30日間
- 正しい例:業務要件に応じて2〜4時間、refresh機構と組み合わせる
- デフォルトの秘密鍵を使用する
- 不正な例:サンプルの鍵や簡単な文字列
- 正しい例:環境ごとに異なる鍵を使用し、定期的にローテーションを行う
- userAgentAuthWhiteを有効にする
- 不正な例:利便性のために有効にする
- 正しい例:本番環境では常に無効化し、セキュリティ回避リスクを避ける