最近一部の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はモジュールで入れること。
# 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とかで二段階認証やると、アクセスのたびに入力しなきゃいけなくて面倒だし、フィッシングのリスクもあるし。