Modo de interceptação de SQUID usando autenticação externa e ICAP com adapter_send_username não funcionando

1

Meu objetivo é filtrar transparentemente URLs HTTP e HTTPS com base em um nome de usuário obtido por meio de um tipo de acl externo.

Estou executando o Squid 3.5.23 no modo de interceptação, depois de pesquisar, parece que você pode usar o external_acl_type com o modo de interceptação (posso estar errado) e retornar OK user = testuser como parte da resposta OK / ERR e O SQUID usará esse nome de usuário como o usuário autenticado.

Eu escrevi um script Python simples que lê stdin e, em seguida, escrevo imediatamente OK user = testuser de volta ao stdout para SQUID.

SSL peek, splice e bump estão funcionando e, para http_access, se a solicitação não for uma porta SSL, ela usa a autenticação externa simples que usa% DST em vez de SNI. Em seguida, se a porta for SSL, ela permite, mas, usando o ssl-bump, ele consulta a autenticação externa SSL que transmite o SNI.

Ambas as ACLs externas respondem apenas com OK user = testuser, e posso ver isso funcionando nos logs que eu criei.

O problema surge quando o servidor ICAP é contatado.

Em algumas das solicitações registradas, posso ver que o IP e o nome do usuário aparecem nos cabeçalhos ICAP e, em alguns, não são enviados.

Não consegui determinar um padrão de porque algumas solicitações ICAP têm os cabeçalhos, e outras não e não tenho certeza se isso é uma configuração incorreta, bug ou não suportado em geral.

Quando o pedido ICAP é enviado, antes ou depois da autenticação externa?

Estou fazendo algo errado ou apenas tentando fazer algo que realmente não funciona?

Aqui está o que eu acredito que as partes relevantes da minha configuração são.

    external_acl_type ssl_external negative_ttl=0 %SRC %PORT %METHOD %ssl::>sni %PATH /etc/webscreen/auth/webscreen.py
    external_acl_type plain_external negative_ttl=0 %SRC %PORT %METHOD %DST %PATH /etc/webscreen/auth/webscreen.py

    acl ssl_webscreen external ssl_external
    acl plain_webscreen external plain_external

    acl SSL_ports port 443

    acl step1 at_step SslBump1
    acl step2 at_step SslBump2
    acl step3 at_step SslBump3

    http_access allow !SSL_ports plain_webscreen
    http_access allow SSL_ports localnet
    http_access deny all

    ssl_bump peek step1 all
    ssl_bump splice step2 ssl_webscreen
    ssl_bump bump all

    icap_enable on
    icap_service_failure_limit -1
    icap_preview_enable on
    icap_preview_size 1024
    icap_persistent_connections on
    adaptation_send_client_ip on
    adaptation_send_username on
    icap_service webscreen1 reqmod_precache icap://127.0.0.1:1344/reqmod bypass=0
    icap_service webscreen2 respmod_precache icap://127.0.0.1:1344/respmod bypass=0
    adaptation_access webscreen1 allow all
    adaptation_access webscreen2 allow all

como pedido nos comentários, aqui é webscreen.py

#!/usr/bin/env python
import sys, time, datetime, os

log_file = "/etc/squid/webscreen/webscreen.log"

def main ():

        while (1):
                inline = sys.stdin.readline()
                logEntry (10, "New proxy request "+inline)
                sys.stdout.write("OK user=webscreen\n")
                sys.stdout.flush()


def logEntry(logmessagelevel, logmessage):

        global log_file
        # Get timestamp as human readable format
        now = datetime.datetime.now()
        timestamp = now.strftime("%Y-%m-%d %H:%M:%s")

        # open file to apptend
        logfile = open(log_file, 'a')
        logfile.write(timestamp+" "+str(logmessagelevel)+" "+logmessage+"\n")
        logfile.close()
        return



if __name__ == '__main__':
        main()
    
por Steve 21.06.2017 / 18:45

0 respostas