Mover o certificado SSL para as quebras de borda Shibboleth

1

Estamos convertendo um sistema que herdamos: dois servidores Web que executam o IIS e o Shibboleth, atrás de um servidor de balanceamento de carga que executa o HAPROXY. Certs SSL são instalados em cada servidor web e HAPROXY é configurado como passagem.

Queremos substituir o servidor HAPROXY por um nginx em execução e queremos mover o certificado SSL dos servidores da Web para a borda, ou seja, o servidor nginx.

Então, queremos ir a partir disso:

paraisso:

Eestamosquaselá.Háumproblema:Shibboleth.

Criamosumnovoservidor,instalamoseconfiguramosonginx.UsamosoarquivoHOSTSparaapontarevoltarparatestes.Quandoterminarmos,voltaremosausaroDNS.

Passoum,configuramosonginxcomopassagemparaoSSL:

Issofuncionouperfeitamente.

Masquandomovemosocertificadoparaoservidornginx,oShibbolethreclama:
UnabletolocatesatisfiablebearerSubjectConfirmationinassertion

AotentaracessaroconteúdonãoprotegidopeloShibboleth( link ), ele funciona bem - então o certificado está configurado corretamente.

Se apontarmos HOSTS para HAPROXY, autenticarmos e apontar HOSTS para nginx, ele funcionará (confirmado pelos testes do navegador enquanto atende o access.log do nginx). Em outras palavras, assim que o cookie SAML for definido, tudo ficará bem. Então parece que o problema acontece quando o IdP tenta enviar as asserções para ... / Shibboleth.sso / SAML2 / POST (o Fiddler confirma)

Eu ativei o registro DEBUG no Shibboleth, e talvez encontre algo lá, mas ainda não.

Aqui está o nginx.conf :

worker_processes  1;

events {
    worker_connections  1024;
}

http {
  include             mime.types;
  default_type        application/octet-stream;
  sendfile            on;
  keepalive_timeout   65;

  upstream farm {
    server 192.168.1.42:80; # WEB1
    server 192.168.1.43:80; # WEB2
  }

  server {
    listen              80;
    listen              443 default ssl;
    server_name         example.com;

    ssl_certificate         example.com.crt;
    ssl_certificate_key     example.com.key;
    ssl_trusted_certificate example.com.pem;

    location / {
      proxy_pass              http://farm;
      proxy_next_upstream     error timeout invalid_header http_500 http_502 http_503 http_504;
      proxy_set_header        Host            $host;
      proxy_set_header        X-Real-IP       $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }
  }

}

E aqui está o shibboleth2.xml

<SPConfig xmlns="urn:mace:shibboleth:2.0:native:sp:config"
    xmlns:conf="urn:mace:shibboleth:2.0:native:sp:config"
    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
    xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"    
    xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
    clockSkew="180">

    <InProcess logger="native.logger">
        <ISAPI normalizeRequest="true" safeHeaderNames="true">
            <Site id="3" name="example.com"/>
        </ISAPI>
    </InProcess>

    <TCPListener address="192.168.1.42" port="1600" acl="192.168.1.42 192.168.1.43"/> 

    <RequestMapper type="Native">
        <RequestMap>
            <Host name="example.com">
              <Path name="closed" authType="shibboleth" requireSession="true">
              <Path name="open" authType="shibboleth" requireSession="false"/>
            </Host>
        </RequestMap>
    </RequestMapper>

    <ApplicationDefaults entityID="--spEntityId--"
                         REMOTE_USER="eppn persistent-id targeted-id uid"
                         cipherSuites="ECDHE+AESGCM:ECDHE:!aNULL:!eNULL:!LOW:!EXPORT:!RC4:!SHA:!SSLv2"
                         homeURL="https://example.com/closed">

        <Sessions lifetime="28800" timeout="86400" relayState="ss:mem" checkAddress="false" handlerSSL="false" cookieProps="https">
            <SSO entityID="--IdpEntityId--">SAML2 SAML1</SSO>

            <Logout>SAML2 Local</Logout>
            <Handler type="MetadataGenerator" Location="/Metadata" signing="false"/>
            <Handler type="Status" Location="/Status" acl="127.0.0.1 ::1"/>
            <Handler type="Session" Location="/Session" showAttributeValues="true"/>
            <Handler type="DiscoveryFeed" Location="/DiscoFeed"/>
        </Sessions>

        <Errors supportContact="root@localhost"
            helpLocation="/about.html"
            styleSheet="/shibboleth-sp/main.css"
            redirectErrors="/errors/shiberror.html" />

        <MetadataProvider type="XML" path="idp_metadata.xml" />

        <AttributeExtractor type="XML" validate="true" reloadChanges="false" path="attribute-map.xml"/>
        <CredentialResolver type="File" key="file.key" certificate="file.crt"/>
    </ApplicationDefaults>

    <SecurityPolicyProvider type="XML" validate="true" path="security-policy.xml"/>
    <ProtocolProvider type="XML" validate="true" reloadChanges="false" path="protocols.xml"/>
</SPConfig>

Estou perplexo. Você pode ajudar?

    
por biscuit314 20.11.2017 / 17:32

2 respostas

1

O problema foi resolvido modificando shibboleth2.xml , alterando isso:

<InProcess logger="native.logger">
    <ISAPI normalizeRequest="true" safeHeaderNames="true">
        <Site id="3" name="example.com"/>
    </ISAPI>
</InProcess>

para isso:

<InProcess logger="native.logger">
    <ISAPI normalizeRequest="true" safeHeaderNames="true">
        <Site id="3" name="example.com" scheme="https" port="443"/>
    </ISAPI>
</InProcess>

Isso adiciona atributos scheme e port a InProcess\ISAPI\Site

Meu entendimento de Scott Cantor no lista de discussão shibboleth é que isso ocorre porque o IIS não pode virtualizar servidores. Esse recurso foi adicionado ao shibboleth como uma solução alternativa.

    
por 21.11.2017 / 18:17
0

Veja esta página;

link

Essencialmente, o IdP está enviando um entityID com um prefixo https: // (observe o 's'), mas porque os servidores da web do IIS foram configurados (direta ou indiretamente) com um entityID com um prefixo http: // (note a falta de 's').

O link acima se refere a uma solução quando o SP é usado em um servidor Apache (altere a diretiva ServerName para iniciar "https: // ..."). No seu caso com o IIS eu não sei qual seria o equivalente dentro do próprio IIS, mas você poderia tentar alterar a entrada entityID="" no shibboleth2.xml para iniciar https: //

Uma solução alternativa seria usar SSL para o tráfego entre o proxy nginx e os servidores da Web, configurando as ligações do IIS para HTTPS novamente.

    
por 21.11.2017 / 09:55