apache

apache 特定IPアドレス以外からのアクセスにクライアント認証をかける

公開していない管理サーバなどにアクセス制限したいときがあると思います。
その対応策の1つとして

  • 社内(内部)IPアドレスからはクライアント認証なしでアクセスOK
  • 社外(外部)からはクライアント証明書をもっている端末(ブラウザ)のみアクセスOK

の制限をapacheでかけてみます。

※nginxでの設定は こちらの記事 をご参照ください。

手順

事前確認

mod_ssl モジュールが組み込まれているか確認します。

# httpd -M | grep ssl
 ssl_module (shared) ・・・この行があること
Syntax OK
#


組み込まれていない場合はインストールします。

# yum install -y mod_ssl
# 
# 
### mod_sslが組み込まれてない場合は起動時に以下のようなエラーが出ます。
# /etc/init.d/httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd: Syntax error on line 12 of /etc/httpd/conf.d/test.conf:
Invalid command 'SSLEngine', perhaps misspelled or defined by a module not included in the server configuration
                                                           [FAILED]
#

クライアント証明書作成

長くなるのでここでは割愛させていただきますmm
例えば 参考:クライアント用証明書 を実施して作成します。

apache設定ファイル修正

以下のように設定します。(必要部分のみ抜粋)

$ cat test.conf
NameVirtualHost *:443

<VirtualHost *:443>

〜〜
    # SSL有効化
    SSLEngine on

    # サーバ証明書配置
    SSLCertificateFile /etc/httpd/conf.d/crt/hogehoge.com.crt
    SSLCertificateKeyFile /etc/httpd/conf.d/crt/hogehoge.com.key
    # 中間証明書配置
    SSLCertificateChainFile /etc/httpd/conf.d/crt/hogehoge.com.pem

    # クライアント認証設定
    # クライアント証明書作成の際に使用したCA証明書
    SSLCACertificateFile /etc/httpd/conf.d/crt/cacert.pem

    # クライアント証明書の検証を有効化
    SSLVerifyClient optional
    # 証明書の階層をたどる深さ(中間証明書があると2らしい)。
    SSLVerifyDepth 1

    <Location />
    SSLRequire \
        # 許可IPは正規表現での範囲指定も可能
        (%{REMOTE_ADDR} =~ m/^10\.100\.100\.101$/) or \
        (%{REMOTE_ADDR} =~ m/^10\.200\.200\.10[1-9]$/) or \

        # クライアント認証結果OK
        (%{SSL_CLIENT_VERIFY} eq "SUCCESS")
    </Location>
</VirtualHost>
$


なおapache2.4から SSLRequire ディレクティブが非推奨となっているため以下のように Require expr へ置き換えたほうが良いと思います。

<Location />
  Require expr \
    # or は || に置き換え (なくても一応動きはしましたが...)
    (%{REMOTE_ADDR} =~ m/^10\.100\.100\.101$/) || \
    (%{REMOTE_ADDR} =~ m/^10\.200\.200\.10[1-9]$/) || \

    # eq は == に置き換え(文字列比較は == 、eqは数値比較)
    (%{SSL_CLIENT_VERIFY} == "SUCCESS")
</Location>

動作確認

参考:プライベート認証局を登録(インポート)する の手順でブラウザにクライアント証明書をインポートします。(Chromeは証明書をPCにダウンロードして証明書をダブルクリックしてポチポチすればいけます)

インポート後、当該サイトにアクセスすると

とクライアント証明書の選択画面になるので適切な証明書を選択してください。
証明書を持っていない場合や異なる証明書を選択した場合は 403 Forbidden となります。

参考

クライアント認証をIPによっては不要にする | ハックノート
mod_ssl – Apache HTTP Server Version 2.4

タイトルとURLをコピーしました