Содержание

Squid

Аутентификация

Kerberos

На сервере AD создаем пользователя squid и kerberos тикет для него:

ktpass  -princ HTTP/proxy.domain.com@DOMAIN.COM -mapuser squid@DOMAIN.COM -crypto rc4-hmac-nt -pass "password" -ptype KRB5_NT_PRINCIPAL -out C:\proxy.keytab

где proxy.domain.com - fqdn имя сервера squid, доступное на сервере и клиенте.

Перемещаем тикет proxy.keytab на сервер squid в /etc/squid.

Меням привилегиии на него:

sudo chown proxy:proxy /etc/squid/proxy.keytab
sudo chmod 440 /etc/squid/proxy.keytab

На сервере squid устанавливаем kerberos клиент:

sudo apt-get install krb5-user

Редактируем /etc/krb5.conf:

[logging]
    default = FILE:/var/log/krb5.log

[libdefaults]
    default_realm = DOMAIN.COM
    kdc_timesync = 1
    ccache_type = 4
    forwardable = true
    proxiable = true

    default_tgs_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
    default_tkt_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
    permitted_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5

[realms]
    DOMAIN.COM = {
        kdc = domain.com
        admin_server = domain.com
        default_domain = DOMAIN.COM
    }

[domain_realm]
    .domain.com = DOMAIN.COM
    domain.com = DOMAIN.COM

Проверяем keytab:

sudo kinit -V -k -t /etc/squid/proxy.keytab HTTP/proxy.domain.com

должно быть:

Authenticated to Kerberos v5

Добавляем при запуске squid переменные в /etc/default/squid:

echo export KRB5_KTNAME=\"/etc/squid/proxy.keytab\" | sudo tee -a /etc/default/squid
echo export KRB5RCACHETYPE=none | sudo tee -a /etc/default/squid

Добавляем в squid доступ пользователей по аутентификации через kerberos:

auth_param negotiate program /usr/lib/squid/negotiate_kerberos_auth
auth_param negotiate children 10
auth_param negotiate keep_alive on

acl auth proxy_auth REQUIRED

http_access deny !auth
http_access allow auth
http_access deny all

Для детального лога /var/log/squid/cache.log о проблемах аутентифакции, меняем:

auth_param negotiate program /usr/lib/squid/negotiate_kerberos_auth -d

Устанавливаем msktutil:

sudo apt-get install msktutil

http://wiki.squid-cache.org/ConfigExamples/Authenticate/Kerberos
http://www.theadmin.ru/linux/squid/proksi-server-squid-v-active-directory-s-kerberos-autentifikaciej/
http://forum.ixbt.com/topic.cgi?id=76:10320
http://manpages.org/negotiate_kerberos_auth/8

Basic

Используем с помощью bind пользователя в AD:

auth_param basic program /usr/lib/squid/basic_ldap_auth -R -b "dc=dmain,dc=com" -D "cn=squid,ou=service,dc=domain,dc=com" -W /etc/squid/squid.pwd -f sAMAccountName=%s -h domain.com
auth_param basic children 20
auth_param basic realm Squid AD

acl auth proxy_auth REQUIRED

http_access deny !auth
http_access allow auth
http_access deny all

Проверяем basic_ldap_auth:

sudo /usr/lib/squid/basic_ldap_auth -R -b "dc=domain,dc=com" -D "cn=squid,ou=service,dc=domain,dc=com" -W /etc/squid/squid.pwd -f sAMAccountName=%s -h domain.com
login pass
OK

Хелперы

ext_ldap_group_acl

Для проверки пользователей на принадлежности к группе в squid.conf через ldap добавляем:

#Groups
external_acl_type ldap_users ipv4 ttl=600 negative_ttl=600 children-max=30 protocol=3.0 %LOGIN /usr/lib/squid/ext_ldap_group_acl -P -R -K -b "dc=domain,dc=com" -D squid@domain.com -W "/etc/squid/squid.pwd" -f "(&(sAMAccountName=%u)(|(memberOf=CN=%g,OU=SERVICE,DC=domain,DC=com)(memberOf=CN=%g,OU=GROUPS,DC=domain,DC=com)))" -h  domain.com

Для проверки запустим:

/usr/lib/squid/ext_ldap_group_acl -P -R -K -b "dc=domain,dc=com" -D squid@domain.com -W "/etc/squid/squid.pwd" -f "(&(sAMAccountName=%u)(|(memberOf=CN=%g,OU=SERVICE,DC=domain,DC=com)(memberOf=CN=%g,OU=GROUPS,DC=domain,DC=com)))" -h  domain.com

на запрос вводить логин и группу для проверки (через пробел), пример:

user group1
OK 
user group2
ERR 

ext_kerberos_ldap_group_acl

Для проверки пользователей на принадлежности к группе в через kerberos устанавливаем:

apt install libsasl2-modules-gssapi-mit

и добавлем в squid.conf:

#Groups
external_acl_type ldap_users ipv4 ttl=600 negative_ttl=600 children-max=30 protocol=3.0 %LOGIN /usr/lib/squid/ext_kerberos_ldap_group_acl -a -l "(&(sAMAccountName=%u)(|(memberOf=CN=%g,OU=SERVICE,DC=domain,DC=com)(memberOf=CN=%g,OU=GROUPS,DC=domain,DC=com)))" -D DOMAIN.COM

Для проверки запустим:

export KRB5_KTNAME=/etc/squid/proxy.keytab
/usr/lib/squid/ext_kerberos_ldap_group_acl -a -i -l "(&(sAMAccountName=%u)(|(memberOf=CN=%g,OU=SERVICE,DC=domain,DC=com)(memberOf=CN=%g,OU=GROUPS,DC=domain,DC=com)))" -D DOMAIN.COM

на запрос вводить логин и группу для проверки (через пробел), пример:

user group1
OK 
user group2
ERR 

Каскадирование прокси

Выходить в интернет через прокси (192.168.10.112):

cache_peer 192.168.10.112 parent 3128 0 proxy-only no-query no-digest no-netdb-exchange default
never_direct allow all

http://www.ignix.ru/book/addons/kaskadnyi_squid

Очистка кэша

По умолчанию кэш лежит в /var/squid/cache/ иначе в директории указаной в опции cache_dir.

Останавливаем squid и удаляем кэш:

sudo service squid stop
sudo rm -rf /var/cache/squid/*

создаем новый кэш и запускаем squid:

sudo squid -z
sudo service squid start

Очистка определенного сайта

На примере www.domain.com:

squidclient -h 127.0.0.1 -m PURGE http://www.domain.com

Delay pools

Ограничение шири на канала на пользователя 1024kbps, со списком исключений по домену (noslowspeed.acl):

acl noslowspeed dstdomain "/etc/squid/noslowspeed.acl"

delay_pools 2
delay_class 1 1
delay_class 2 4

delay_access 1 allow noslowspeed
delay_access 1 deny all
delay_access 2 allow all

delay_parameters 1 -1/-1
delay_parameters 2 -1/-1 -1/-1 -1/-1 128000/128000 #1024kbps = *1000/8

http://www.k-max.name/linux/squid-nastrojka-delay-pools/

http://www.squid-cache.org/Doc/config/delay_parameters/

SSLBump

http://habrahabr.ru/post/168515/
https://habrahabr.ru/post/267851/
http://wiki.squid-cache.org/Features/SslBump

SquidClamav

http://squidclamav.darold.net/
http://www.server-world.info/en/note?os=Ubuntu_12.04&p=squid&f=2

Логирование

Просмотр лога в реальном времени и удобочитаемой датой:

perl -p -e 's{^([\d]+\.[\d]+)(.*$)}{localtime($1).$2}e'

Преобразование времени с помощью awk:

awk -F. -v OFS=. '{if($1!=p)t=strftime("%F %T",p=$1);$1=t;print}'

Cache Manager

По умолчанию в squid.conf задан как:

http_access allow localhost manager
http_access deny manager

Задать пароль 'secret' на все операции с менеджером кэша:

cachemgr_passwd password secret all

http://wiki.squid-cache.org/Features/CacheManager
http://www.squid-cache.org/Doc/config/cachemgr_passwd/

Доступ к кэшу через cgi скрипт:

sudo apt install squid-cgi

Для доступа к cgi через web (http://proxy.domain.com/cachemgr) необходимо настроить web сервер.

Настройка nginx:

Настройка nginx:

Должен быть установлен fcgiwrap и настроен на работу через сокет.

server {
  listen 80;

  server_name proxy proxy.domain.com;

  location ~ ^/cachemgr {
    fastcgi_index cachemgr.cgi;
    gzip off;
    root /usr/lib/cgi-bin;
    fastcgi_pass  unix:/var/run/fcgiwrap.socket;
    include /etc/nginx/fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root/cachemgr.cgi;
  }

  location = /favicon.ico {
    log_not_found off;
  }

}

Настройка apache2:

Настройка apache2:

Должен быть подключен cgi.

ScriptAlias /cachemgr "/usr/lib/cgi-bin/cachemgr.cgi"

<Location /cachemgr>
        Options ExecCGI FollowSymLinks
        AllowOverride All
        Require all granted
</Location>

Docker

entrypoint.sh

entrypoint.sh

#!/usr/bin/bash
 
chown proxy /proc/self/fd/1
/usr/sbin/squid -f /etc/squid/squid.conf -NYCd 1

Dockerfile

Dockerfile

FROM ubuntu
 
ARG DEBIAN_FRONTEND=noninteractive
 
ENV KRB5_KTNAME "/etc/squid/proxy.keytab"
ENV KRB5RCACHETYPE none
 
COPY entrypoint.sh /entrypoint.sh
 
RUN set -x \
  && apt-get update \
  && apt-get install -y krb5-user squid squid-langpack \
  && rm -rf /var/lib/apt/lists/*
 
EXPOSE 3128
 
ENTRYPOINT ["/usr/bin/bash","/entrypoint.sh"]

docker-compose.yaml

docker-compose.yaml

version: '3.7'
volumes:
  squid:
    driver_opts:
      type: none
      device: ${VOLPATH-/data/docker/proxy}/squid
      o: bind
  log:
    driver_opts:
      type: none
      device: ${VOLPATH-/data/docker/proxy}/log
      o: bind

services:
  proxy:
    image: proxy
    build: .
    hostname: proxy.domain.com
    volumes:
    - squid:/etc/squid:ro
    - log:/var/log/squid:rw
    - ${VOLPATH-/data/docker/proxy}/etc/krb5.conf:/etc/krb5.conf:ro
    ports:
    - mode: host
      protocol: tcp
      published: 3128
      target: 3128
    restart: on-failure:3
    deploy:
      replicas: 1
      resources:
        limits:
          memory: 1g
      restart_policy:
        condition: on-failure

read.txt

read.txt

Варианты запуска

#docker
docker build -t proxy .
docker run -p3128:3128 -d \
 -v /data/docker/proxy/squid:/etc/squid \
 -v /data/docker/proxy/etc/krb5.conf:/etc/krb5.conf \
 --hostname proxy.domain.com \
 --restart on-failure:3 \
 --name proxy proxy
 
#docker-compose
docker-compose up -d
 
#swarm
docker build -t proxy .
docker stack deploy --compose-file docker-compose.yaml proxy

squidclient

Инструмент командной строки для выполнения web запросов и отправки запросов менеджеру кэша Squid.

Установка:

sudo apt install squidclient

Ошибки

ERROR: Negotiate Authentication validating user. Error returned 'BH gss_accept_sec_context() failed: Unspecified GSS failure. Minor code may provide more information. '

Помогает отключение кэша ответов:

KRB5RCACHETYPE =none

http://forum.ixbt.com/topic.cgi?id=76:10320

redirect_program

adzapper

redirect_program /usr/bin/adzapper.wrapper
redirect_children 30