클라이언트 SSL 인증서 또는 기본 인증으로 인증

클라이언트 SSL 인증서 또는 기본 인증으로 인증

보안상의 이유로 웹 애플리케이션에 대한 인증을 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아마도 옵션이 사용되지 않을 것입니다. 여기에 있는 구성에서는 인증서에서 가 발견되는 즉시 Company_O액세스가 허용됩니다. 내가 이해한 대로 는 (단독) +FakeBasicAuth과 함께 사용되며 Require valid-user인증서의 DN이 AuthUserFile적절한 비밀번호와 함께 에 정의된 사용자 목록에 있는 경우 액세스가 허용됩니다. 내 시스템은 그런 식으로 작동하지 않으며 OP도 그렇게하고 싶지 않은 것 같습니다.

<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그것도 필요하다는 것을 깨달았습니다(참조http://httpd.apache.org/docs/2.4/mod/mod_ssl.html#authzproviders)

답변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>

관련 정보