クライアントSSL証明書または基本認証で認証する

クライアントSSL証明書または基本認証で認証する

セキュリティ上の理由から、Web アプリケーションの認証は SSL クライアント証明書に移行する必要があります。ユーザー名/パスワードまたは SSL のいずれかを使用してログインできるようにする必要があります。さらに、イントラネットのユーザーは追加の認証なしでアプリを使用できるようにする必要があります。

公式ドキュメントに従ってこのシナリオを実装しようとしましたが、成功しませんでした。

現在の設定は次のとおりです

<Directory /opt/app/system/html>
    RedirectMatch permanent ^/$ /exec/login.pl
    Options -Indexes +FollowSymLinks
    SSLVerifyClient optional
    SSLVerifyDepth  2
    SSLRequire      %{SSL_CLIENT_I_DN_O} eq "Company_O"
    SSLOptions      +FakeBasicAuth

    Satisfy     any

    AuthType Basic
    AuthName "Zugriffsschutz"
    AuthBasicProvider file
    AuthUserFile /etc/apache2/htaccess/iapp.passwd
    require valid-user

    Order allow,deny
    Allow from 10.20.0.0/255.255.0.0
    Allow from 10.144.100
</Directory>

この構成では、クライアント証明書は要求されません。基本認証構成を削除すると、SSL クライアント認証は正常に機能します。

答え1

この質問は 3 か月前の質問なので、私の回答は OP には必要ないかもしれませんが、この構成を希望する人には役立つかもしれません。

質問には apache-2.4 のタグが付けられていますが、設定は 2.2 に適したもののように見えます。Apache 2.4 ドキュメントの多くの例自体が 2.4 に適していないように見えるため、これはまったく驚くべきことではありません。

2.2 ではこのような構成が機能していましたが (「Allow from」は機能しませんでした)、2.4 用に書き直す必要がありました。ドキュメントではすぐには明らかにならなかったいくつかの要素が必要であることがわかりました。

これについては保証しません。これはテストなしの構成ファイルに基づいています。+StrictRequire必要ない場合もありますSSLOptions。これなしで試したことはありません。ただし、この方法では動作します。

実際のところ、SSLOptions行はまったく必要ないかもしれません。オプションはおそらく使用されていないでしょう。ここでの設定では、が証明書に見つかる+FakeBasicAuthとすぐにアクセスが許可されます。私の理解では、 は (単独で) とともに使用され、 で定義されたユーザー リストに証明書の DN が見つかり、適切なパスワードも見つかった場合にアクセスが許可されます。私のシステムはそのようには動作しませんし、OP もそのようにしたくなかったのではないかと思います。Company_O+FakeBasicAuthRequire valid-userAuthUserFile

<Directory /opt/app/system/html>
    RedirectMatch permanent ^/$ /exec/login.pl
    Options -Indexes +FollowSymLinks

    # Anything which matches a Require rule will let us in

    # Make server ask for client certificate, but not insist on it
    SSLVerifyClient optional
    SSLVerifyDepth  2
    SSLOptions      +FakeBasicAuth +StrictRequire

    # Client with appropriate client certificate is OK
    <RequireAll>
        Require ssl-verify-client
        # Correction: eq is integer comparison, string comparison requires ==
        # Require expr %{SSL_CLIENT_I_DN_O} eq "Company_O"
        Require expr %{SSL_CLIENT_I_DN_O} == "Company_O"
    </RequireAll>

    # Set up basic (username/password) authentication
    AuthType Basic
    AuthName "Zugriffsschutz"
    AuthBasicProvider file
    AuthUserFile /etc/apache2/htaccess/iapp.passwd

    # User which is acceptable to basic authentication is OK
    Require valid-user

    # Access from these addresses is OK
    Require ip 10.20.0.0/255.255.0.0
    Require ip 10.144.100
</Directory>

私は持っています

<Directory />
    ...
    Require all denied
    ...
</Directory>

別の設定ファイルでは、それがレシピの重要な部分である可能性があります。

これを動作させるのに時間がかかったのは、ビットRequire expr %{SSL_CLIENT自体が単独で動作するように見えたが、最終的にはそれがRequire ssl-verify-client必要であることに気付いたからだ(認証プロバイダ

答え2

@yitzchok-lavi の回答は非常に役立ちましたが、(私のように) ネットワーク外のクライアントやクライアント証明書のないクライアントに表示される基本認証ポップアップを回避したい場合は、ディレクティブをセクションRequire valid-user内に配置する必要がありますRequireAll。また、OP の質問では、これがすでに構成のどこかに存在していることが示唆されていますが、完全を期すために、誰かがこの質問に遭遇した場合に備えて、ディレクティブもSSLCACertificateFile必要です (どの CA クライアント証明書を検証するかを定義するため)。

私が使用する構成スニペット:

<Directory /opt/app/system/html>
    RedirectMatch permanent ^/$ /exec/login.pl
    Options -Indexes +FollowSymLinks

    # Anything which matches a Require rule will let us in

    # Make server ask for client certificate, but not insist on it
    SSLVerifyClient optional
    SSLVerifyDepth  2
    SSLOptions      +FakeBasicAuth +StrictRequire
    # client certs will be verified against this CA
    SSLCACertificateFile /etc/apache2/ssl/iapp-ca.pem

    # Client with appropriate client certificate is OK
    <RequireAll>
        Require ssl-verify-client
        Require expr %{SSL_CLIENT_I_DN_O} == "Company_O"
        # User which is acceptable to basic authentication is OK
        Require valid-user
    </RequireAll>

    # Set up basic (username/password) authentication
    AuthType Basic
    AuthName "Zugriffsschutz"
    AuthBasicProvider file
    AuthUserFile /etc/apache2/htaccess/iapp.passwd

    # Access from these addresses is OK
    Require ip 10.20.0.0/255.255.0.0
    Require ip 10.144.100
</Directory>

関連情報