最近一部のhttpサーバをApacheからOpenLiteSpeedに変更した。ただ、問題があり、Apacheにはあるクライアント認証の機能がOpenLiteSpeedにはない。
さんざん迷った挙句、Apacheでreverse proxyを使用し、そこでクライアント認証することにした。「全部Apacheで良いじゃないか」という感じもするが、どうもApache+mpm_event+php-fmpの構成では、まれにプチフリするのが気になってしょうがない。設定が悪い気がするが、再現性がなく調査もできない。
案ずるより産むがやすし、動かしてみたら、とても軽快になった。reverse proxy分重くなるかと思ったが、杞憂であった。
以下、OpenLiteSpeedのadmin consoleをクライアント認証に設定する例。
前提
クライアント証明書は以下
・CA証明書:/opt/myCA/cacert.pem
・証明書失効リスト:/opt/myCA/crl.pem
Admin ConsoleはSSLなしで動作させ、localhost(127.0.0.1)以外は接続させない。(Admin ConsoleをSSLありのデフォルトの状態で動作させたい場合は、Apache設定のコメントを参照のほど。reverse proxyでSSLのエラーを無視させればちゃんとつないでくれる。)
以下はOpenLiteSpeedのAdmin configの設定。設定後、restart。
vi /usr/local/lsws/admin/conf/admin_config.conf
---
enableCoreDump 1
sessionTimeout 3600
errorlog $SERVER_ROOT/admin/logs/error.log {
useServer 0
logLevel INFO
rollingSize 10M
}
accesslog $SERVER_ROOT/admin/logs/access.log {
useServer 0
rollingSize 10M
keepDays 90
}
# 以下のセクションを追加
accessControl {
allow 127.0.0.1
}
# 以下のセクションを変更
listener adminListener {
# addressとsecureの2行を変更
address 127.0.0.1:7080
secure 0
#keyFile $SERVER_ROOT/admin/conf/webadmin.key
#certFile $SERVER_ROOT/admin/conf/webadmin.crt
#clientVerify 0
}
---
systemctl restart lsws
Apach設定
Apacheでhttps://yourdomain.net:8000/にアクセスするとOpenLiteSpeedの管理コンソール(http://127.0.0.1:7080/)にアクセスする設定。ブラウザにクライアント認証の証明書が入っていないとはじかれる。SSLはLetsencryptで取得。
mod_proxy mod_proxy_httpはモジュールで入れること。
xxxxxxxxxx
# Apacheのバーチャルホストの設定に以下を追加
<IfModule mod_ssl.c>
<VirtualHost _default_:8000>
ServerName yourdomain.net
DocumentRoot /var/www/
ErrorLog ${APACHE_LOG_DIR}/lsws/proxy_error.log
CustomLog ${APACHE_LOG_DIR}/lsws/proxy_access.log common
# Proxy設定
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:7080/
ProxyPassReverse / http://127.0.0.1:7080/
# AdminConsoleをデフォルトのまま(SSLで)使用するなら以下
#SSLProxyEngine On
#SSLProxyCheckPeerCN off
#SSLProxyCheckPeerName off
#ProxyPass / https://127.0.0.1:7080/
#ProxyPassReverse / https://127.0.0.1:7080/
# クライアント証明書関係
SSLEngine on
SSLCACertificateFile /opt/myCA/cacert.pem
SSLCARevocationFile /opt/myCA/crl.pem
SSLCARevocationCheck chain
SSLVerifyClient require
SSLVerifyDepth 1
# SSL
SSLOptions +StdEnvVars
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/yourdomain.net/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.net/privkey.pem
</VirtualHost>
</IfModule>
サイトへのアクセスも楽で、パスコンが盗まれたら失効すれば良いし、クライアント認証の良さは他のセキュリティには代えがたい。Google Authenticatorとかで二段階認証やると、アクセスのたびに入力しなきゃいけなくて面倒だし、フィッシングのリスクもあるし。