Definindo o cabeçalho com base no certificado do cliente

5

Eu tenho o Apache rodando como um proxy reverso para um servidor interno. Os usuários que acessam o proxy são obrigados a usar certificados de cliente. No servidor interno, existe um aplicativo da Web que pode usar um cabeçalho HTTP para autenticar usuários. Eu gostaria de ter o proxy fornecer esse cabeçalho com base no certificado de cliente.

O valor do cabeçalho é o ID do usuário. O ideal seria ter um ID de usuário de mapeamento de arquivo de texto para certificado. Por mais que eu saiba, preciso de RewriteMap para os cabeçalhos.

# Somehow lookup USERID given SSL_CLIENT_S_DN
RequestHeader set X-User-ID %{USERID}

Gostaria de evitar que um monte de SetEnvIf s exigisse que o servidor reiniciasse, por exemplo:

SetEnvIf SSL_CLIENT_S_DN [User 1's SSL_CLIENT_S_DN] USERID=12
SetEnvIf SSL_CLIENT_S_DN [User 2's SSL_CLIENT_S_DN] USERID=34
SetEnvIf SSL_CLIENT_S_DN [User 3's SSL_CLIENT_S_DN] USERID=56
...

Existe uma boa maneira de evitar que os usuários precisem essencialmente autenticar duas vezes?

    
por Matthew Jacobs 18.12.2014 / 20:26

1 resposta

0

Acho que entendo o que você precisa, mas, por favor, corrija-me se estiver errado. Isso requer uma abordagem em três etapas.

Você usa um RewriteCond com um RewriteMap para mapear o SSL_CLIENT_S_DN para um USERID , um RewriteRule para definir uma variável de ambiente e uma diretiva RequestHeader para definir um cabeçalho com base no ambiente variável. Isso deve fazer com que o cabeçalho seja passado para o servidor interno normalmente.

Algo como:

RewriteEngine On
# Define a RewriteMap for DN to user id
RewriteMap dntouserid "txt:/path/to/dntouserid.txt"
# Test if we have something in the map for a the current DN
RewriteCond  ${dntouserid:%{SSL:SSL_CLIENT_S_DN}} (.+)
# Set environment variable based on that mapping. %1 comes from the RewriteCond
RewriteRule ^ - [E=MYUSER:%1]
# Set header to that environment variable
RequestHeader set X-User-ID %{MYUSER}e

E o seu mapa contém linhas como:

DN_OF_USER1 12
DN_OF_USER2 34
DN_OF_USER3 56

Se o DN contiver espaços, você terá que usar um programa externo para fazer o mapa, em vez de um arquivo de texto simples (pode funcionar para outros tipos de mapa, mas eu mesmo não tentei).

    
por 09.10.2016 / 11:08