CentOS Stream 9へのOpenVPNインストール:SELinuxを活用したエンタープライズ級のセキュリティ

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

はじめに:なぜCentOS Stream 9とOpenVPNを選ぶのか?

CentOS 7が正式にサポート終了(EOL)を迎えて以来、私は50人のリモートスタッフを抱えるチームのVPN基盤として、CentOS Stream 9で6ヶ月間の運用試験を行ってきました。その結果は非常に印象的でした。稼働率99.9%を維持し、アイドル時のメモリ消費量は200MB未満、そして最新のセキュリティパッチとの互換性も完璧です。

本番環境向けのVPN構築は、単にパッケージをインストールするだけでは不十分です。証明書認証、ファイアウォール管理、そしSELinuxの設定に細心の注意を払う必要があります。多くの管理者はトラブルを避けるためにSELinuxを無効(disable)にしがちですが、それはおすすめしません。この記事では、OpenVPNとSELinuxを「共存」させるための正しい設定方法を解説します。

クイックスタート:5分でOpenVPNをインストール

もし急ぎで予備のVPNサーバーが必要な場合は、コミュニティが提供しているスクリプトを利用するのが最適です。Angristan氏のスクリプトはGitHubで2万以上のスターを獲得しており、非常に信頼性が高くクリーンです。

curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh
chmod +x openvpn-install.sh
sudo ./openvpn-install.sh

スクリプトを実行すると、IPアドレス、プロトコル(UDPを推奨)、DNSについて自動的に質問されます。Easy-RSAの処理からクライアント用の .ovpn ファイルの出力まで、すべて自動で行われます。より詳細な企業向けカスタマイズを行いたい場合は、以下の手動手順に進みましょう。

ステップ1:環境準備とパッケージのインストール

CentOS Stream 9のデフォルトリポジトリにはOpenVPNが含まれていません。インストール前にEPEL(Extra Packages for Enterprise Linux)リポジトリを有効にする必要があります。この手順をスキップすると、インストールコマンドで No package available エラーが発生します。

sudo dnf install epel-release -y
sudo dnf update -y
sudo dnf install openvpn easy-rsa -y

ステップ2:Easy-RSAによるPKIの初期化

OpenVPNはセキュリティを高めるため、通常のパスワードではなくデジタル証明書を使用して認証を行います。ここではEasy-RSAを使って独自の認証局(CA)を構築します。管理を容易にするため、ディレクトリを /etc/openvpn/easy-rsa に作成します。

mkdir -p /etc/openvpn/easy-rsa
cp -r /usr/share/easy-rsa/3/* /etc/openvpn/easy-rsa/
cd /etc/openvpn/easy-rsa

./easyrsa init-pki
./easyrsa build-ca nopass

次に、サーバー用証明書とDiffie-Hellman(DH)パラメータを生成します。注意:gen-dh のプロセスは、CPUの性能によって数分かかる場合があります。

./easyrsa gen-req server nopass
./easyrsa sign-req server server
./easyrsa gen-dh
openvpn --genkey --secret ta.key

ta.key (TLS-Auth) は追加の保護レイヤーです。これにより、サーバーは不正なパケットを即座に拒否できるようになり、DoS攻撃やポートスキャンに対して効果的な防御を実現します。

ステップ3:OpenVPNサーバーの設定

生成した重要な証明書ファイルをOpenVPNの実行ディレクトリに移動します。

cp pki/ca.crt pki/issued/server.crt pki/private/server.key pki/dh.pem ta.key /etc/openvpn/server/

設定ファイル /etc/openvpn/server/server.conf を作成します。ここでは AES-256-GCM 暗号化を使用します。これは現代的な暗号化規格であり、AES-NI命令セットをサポートするCPUでは処理速度が向上します。

port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh.pem
auth SHA512
tls-auth ta.key 0
topology subnet
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
keepalive 10 120
cipher AES-256-GCM
user nobody
group nobody
persist-key
persist-tun
verb 3

ステップ4:ネットワークとファイアウォールの設定

クライアントがVPN経由でインターネットにアクセスできるようにするには、IPフォワーディングを有効にする必要があります。CentOS 7から9に移行した際、この1行を忘れて午前中を丸ごと無駄にしたことがあります。

echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-openvpn.conf
sudo sysctl -p /etc/sysctl.d/99-openvpn.conf

次に、ポート1194を開放し、FirewalldでNAT(マスカレード)機能を有効にします。

sudo firewall-cmd --permanent --add-port=1194/udp
sudo firewall-cmd --permanent --add-masquerade
sudo firewall-cmd --reload

ステップ5:SELinuxへの対応 — 無効化せず、正しく理解する

このままOpenVPNを起動すると、Permission denied エラーが発生します。リスクの高い setenforce 0 を使う代わりに、設定ファイルに正しいコンテキストを割り当てましょう。これには10秒もかかりませんが、サーバーの安全性は格段に向上します。

sudo chcon -R -t openvpn_etc_t /etc/openvpn/server/
sudo restorecon -Rv /etc/openvpn/server/

起動と動作確認

サービスを有効化し、システム起動時に自動実行されるようにします。

sudo systemctl enable --now openvpn-server@server

systemctl status openvpn-server@server コマンドで状態を確認します。active (running) が緑色で表示されていれば、サーバーの準備は完了です。

現場からの実践的なアドバイス

1. TCPではなくUDPを優先する

VPNでTCPを使用すると「TCP Meltdown」現象が発生しやすくなります。パケットロスが発生した際、再送メカニズムが重複して速度が極端に低下するためです。UDPであれば遅延(レイテンシ)が大幅に抑えられ、オンライン会議やリモートワークに適しています。

2. クライアント証明書の厳格な管理

1つの証明書を複数人で使い回さないでください。従業員が退職した際、その人の証明書だけを失効(revoke)させることで、会社全体の接続を止めることなく安全にアクセスを遮断できます。

3. リアルタイムログの監視

接続に関する問題はすべて /etc/openvpn/server/openvpn-status.log に記録されます。クライアントでエラーが出た場合は、まずこのログを確認して、証明書の不一致なのかファイアウォールによるブロックなのかを特定しましょう。

CentOS Stream 9とOpenVPNは、企業にとって強力な組み合わせです。SELinuxに少し注意を払うだけで、ライセンス費用ゼロで高度に保護されたVPNシステムを構築できます。

Share: