Menu Chiudi

Pillola #44: Squid come Proxy server integrato con dominio Windows 2008 R2 e autenticazione Kerberos

Installazione sistema operativo

  • Si proceda ad un’installazione standard di Debian 6.
  • La configurazione di rete non riuscirà ad ottenere l’indirizzo dhcp:

Utilizzare questa configurazione IP manuale: Indirizzo IP: 192.168.0.237 Subnet mask: 255.255.255.0 Gateway: 192.168.0.243 DNS: 192.168.0.102

  • Si imposti proxy come nome macchina e marconi.loc come dominio
  • si imposti la password dell’utente root;

si imposti l’utente tuxadmin e la relativa password;

  • nel selettore di pacchetti “tasksel” si selezioni solamente il sistema standard;

dopo aver installato grub nel master boot record, l’installazione è ultimata.

  • Configurazione della rete

Verificare il contenuto di /etc/network/interfaces

auto eth0
iface eth0 inet static
   address 192.168.0.237
   netmask 255.255.255.0
   gateway 192.168.0.243

L’eventuale riga allow-hotplug va eliminata o commentata. Essendo l’interfaccia eth0 sempre presente nel sistema, non occorre consentire l’attivazione a caldo.

Verificare che in /etc/hosts sia presente una riga del tipo

127.0.0.1		proxy.marconi.loc	  proxy
192.168.0.237	proxy.marconi.loc	  proxy

Verificare il contenuto di /etc/resolv.conf

search marconi.loc
domain marconi.loc
nameserver 192.168.0.102
  • Aggiornamento del sistema
apt-get update
apt-get dist-upgrade
apt-get clean
  • Rimozione di exim4
/etc/init.d/exim4 stop
apt-get purge exim4-base exim4-config exim4-daemon-light
apt-get --purge autoremove
apt-get clean

Installazione del servizio di aggiornamento dell’ora NTP

  • Dare apt-get install ntp;
  • Effettuare una copia di backup di /etc/ntp.conf e scriverne una nuova versione contenente solo queste righe:
driftfile /var/lib/ntp/ntp.drift
server ntp1.inrim.it
server ntp2.inrim.it
restrict 127.0.0.1
restrict ::1
  • Configurazione dell’accesso SSH

Aggiungere un gruppo di utenti per l’accesso ssh addgroup sshusers

  • Aggiungere l’utente locale al gruppo

usermod -a -G sshusers tuxadmin

  • Operare le seguenti modifiche a /etc/ssh/sshd_config
ListenAddress 192.168.0.237
StrictModes yes
AllowGroups sshusers
PermitRootLogin no

Immissione del server in dominio

  • Installo i pacchetti necessari
apt-get install samba krb5-user winbind
  • Copio i file di configurazione smb.conf, krb5.conf e nsswitch.conf

(vedi appendice con file di configurazione)

  • Riavvio i servizi con:
/etc/init.d/samba restart
/etc/init.d/winbind restart
  • Immetto la macchina in dominio con:
net ads join -U Administrator
net ads testjoin
  • Testo il servizio kerberos e inizializzo il ticket per Administrator
kinit administrator@MARCONI.LOC
klist
  • Creo il file keytab per la macchina
net ads keytab create -U Administrator
net ads add HTTP -U Administrator

Installazione del proxy

Installazione di squid

  • Installo i pacchetti essenziali
apt-get install squid3 ldap-utils
  • Consento all’utente di squid di accedere al file keytab
chgrp proxy /etc/krb5.keytab
chmod 640 /etc/krb5.keytab
  • Consentire all’utente proxy la lettura di /var/run/samba/winbindd_privileged.
usermod -a -G winbindd_priv proxy
  • reboot
  • wbinfo -u dovrebbe restituire la lista degli utenti

Configurazione degli autenticatori

  • Configurazione minimale di squid con il solo autenticatore kerberos per test
  • Configurazione minimale di squid con il solo autenticatore NTLM per test
  • Configurazione autenticazione basic LDAP

Configurare l’account esistente in AD “ubuntu” per fornire a squid l’interrogazione di AD L’account “ubuntu” presente nella ns struttura, non ha scadenza password e non può effettuare logon interattivi.

  • Creare un file con la password per l’accesso LDAP di squid e impostarne permessi sicuri

(sostituire squidpass con la password dell’account “ubuntu”)

echo 'squidpass' > /etc/squid3/ldappass.txt
chmod 640 /etc/squid3/ldappass.txt
chgrp proxy /etc/squid3/ldappass.txt
  • Configurazione minimale di squid con il solo autenticatore LDAP per test

Installazione di Negotiate wrapper per integrare NTLM e Kerberos

apt-get install build-essential linux-headers-$(uname -r)

cd /usr/local/src/
wget "http://downloads.sourceforge.net/project/squidkerbauth/negotiate_wrapper/negotiate_wrapper-1.0.1/negotiate_wrapper-1.0.1.tar.gz"

tar -xvzf negotiate_wrapper-1.0.1.tar.gz
cd negotiate_wrapper-1.0.1/

./configure
make
make install

rm negotiate_wrapper-1.0.1.tar.gz
  • Configurazione minimale di squid con tutti gli autenticatori (senza gestione gruppi) per test
cd /etc/squid3
cp squid.conf.nogrp squid.conf
squid3 -k reconfigure
/etc/init.d/squid3 restart
  • Installazione wbinfo-groups aggiornato per supporto kerberos
cd /usr/lib/squid3
mv wbinfo_group.pl wbinfo_group.pl.1
wget http://mirror.catn.com/pub/squid/source/squid-3.1/helpers/external_acl/wbinfo_group/wbinfo_group.pl

Modificare la seguente riga (riga 52) di wb_info_group.pl per non indicare il dominio nel nome utente:
# RIGA ORIGINALE --> $user = "$tmpuser[1]\\$tmpuser[0]";
$user = "$tmpuser[0]";

chmod 755 wbinfo_group.pl

Test dell’helper wbinfo-groups echo Nicola.Ferrari@MARCONI.LOC GLInternetSempre | /usr/lib/squid3/wbinfo_group.pl -K -d

 

  • Inserisco queste righe in /etc/crontab per rinfrescare l’appartenenza ai gruppi ogni 5 minuti
# Rinfresco appartenenza ai gruppi studenti ogni minuto
* * * * * getent group GLInternetStudenti

# Rinfresco giornaliero gruppo GLInternetSempre
30 6    * * *   root    getent group GLInternetSempre
  • Consentire l’accesso a siti intranet anche senza autorizzazione a livello gruppo
cd /etc/squid3
touch sitiintranet.txt
chmod 640 *.txt
chgrp proxy *.txt

In sitiintranet.txt deve essere presente almeno una riga del tipo .dominio.ext

 

Distribuzione del file wpad.dat per auto-configurazione dei browser

  • Installazione di apache2 per ospitare il file wpad.dat
apt-get install apache2
  • Abilitazione del tipo di file per wpad

Aggiungere la seguente riga a /etc/apache2/apache.conf, subito di seguito a DefaultType text/plain

AddType application/x-ns-proxy-autoconfig .dat
  • Configurazione del sito per wpad

in /etc/apache2/sites-available/wpad

<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/wpad

        <Directory /var/www/wpad>
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>
cd ../sites-enabled
ln -s ../sites-available/wpad
rm default

 

  • Configurazione del file wpad
mkdir -p /var/www/wpad
# nano /var/www/wpad.dat

function FindProxyForURL(url, host){
if (
isInNet(host, "192.168.0.0", "255.255.0.0") ||
isInNet(host, "10.0.0.0", "255.255.255.0") ||
isPlainHostName(host) ||
localHostOrDomainIs(host, "127.0.0.1") ||
dnsDomainIs(host, ".marconi.loc") ||
dnsDomainIs(host, ".marconirovereto.it")
)

return "DIRECT";

else

return "PROXY proxy.marconi.loc:8080";
}
  • Riavviare i servizi

/etc/init.d/apache2 restart

 

VBScript per la pulizia del gruppo GLInternetStudenti

Sul domain controller microsoft predispongo uno script .vbs:

Const ADS_PROPERTY_CLEAR = 1 
 
Set objGroup = GetObject _
  ("LDAP://cn=GLInternetStudenti,ou=GruppiInternet,ou=Utenti,dc=marconi,dc=loc") 
 
objGroup.PutEx ADS_PROPERTY_CLEAR, "member", 0
 
objGroup.SetInfo
Set objGroup = GetObject _
  ("LDAP://cn=GLNoInternet,ou=GruppiInternet,ou=Utenti,dc=marconi,dc=loc") 
 
objGroup.PutEx ADS_PROPERTY_CLEAR, "member", 0
 
objGroup.SetInfo

e ne pianifico l’esecuzione quando necessario.

 

Installazione del logger W3PERL

apt-get install flydraw apache2-utils php5
wget http://www.w3perl.com/download/w3perl_3.15_all.deb
dpkg-i w3perl_3.15_all.deb

chown -R root:www-data /var/www
chmod -R 770 /var/www/w3perl/config/
chmod -R 770 /var/www/w3perl/resources/admin/
chmod 660 /var/www/w3perl/resources/admin/locconf
# /etc/apache2/sites-available/w3perl
<VirtualHost *:81>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/w3perl

        <Directory /var/www/w3perl>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

</VirtualHost>

 

cd /etc/nginx/sites-enabled
ln -s ../sites-available/w3perl

Abilitare l'ascolto sulla porta 81. Aggiungere a /etc/apache2/ports.conf la riga
Listen 81
  • In /var/www/w3perl/.htaccess
AuthUserFile /root/.htpasswd
AuthGroupFile /dev/null
AuthName "restricted access for webstat"
AuthType Basic
<Limit GET>
require user webstat
</Limit>
cd /root
htpasswd -c .htpasswd webstat
  • Modificare il file /var/www/w3perl/admin/pass.txt aggiungendo gli ip dai quali amministrare w3perl

127.0.0.1 192.168.7.16

 

  • Creazione del nuovo file di configurazione per W3PERL

Accedere a http://localhost:81/admin

Clone config → Filename: config-marconi.pl → Template: config-example-squid-common.pl
W3Perl output path: /var/www/w3perl/squid/
W3Perl path installation: /var/www/w3perl
W3Perl output URL: /stats/
Your server root directory for HTML: /var/www/w3perl/
Your CGI-BIN path: /usr/lib/cgi-bin/w3perl/
Logfiles path: /var/log/squid3/
Logfile name: access.log
Agent logfile name: cache.log
Fly or Flydraw location (graphic tool): /usr/bin/flydraw


Next

Website server name (including domain name): proxy.marconi.loc
Server port number: 8080
Name of your local server: 127.0.0.1
Local listen port: 8080

Next

User Alias: <bianco>
Skip ipv6 addresses: yes

Next

Language: italian
(in entrambi i campi)

Next

Which scripts: realtime, monthly, yearly
Which stats: host, user, pages, scripts
 
Validate
  • Modifica variabili in /var/www/w3perl/config/config-marconi.pl:
$path = "/var/www/w3perl/squid/";
$pathinit = "/var/www/w3perl/";
$pathserver = "/var/www/w3perl/";
$linkpathserver = "/";
$linkpath_url = "/squid/";
  • Creazione cartelle per deposito statistiche e relativi permessi
mkdir /var/www/w3perl/squid/
touch /var/www/w3perl/squid/index.html
chown -R root:www-data /var/www/w3perl/squid/
chmod -R 775 /var/www/w3perl/squid/
usermod -a -G proxy www-data
  • Copia del file di configurazione per renderlo operativo:
cp /var/www/w3perl/config/config-marconi.pl /usr/lib/cgi-bin/w3perl/
  • Protezione della cartella ammnistrativa di W3PERL
In /var/www/w3perl/.htaccess
AuthUserFile /var/www/w3perl/admin/.htpasswd
AuthGroupFile /dev/null 
AuthName "restricted access for w3perl admin" 
AuthType Basic
<Limit GET>
require user webstat
</Limit>
  • Per creare il secret file do il comando:
htpasswd -c /var/www/w3perl/admin/.htpasswd webstat
  • Inizializzazione delle statistiche e primo debug
/usr/lib/cgi-bin/w3perl/cron-pages.pl -c /usr/lib/cgi-bin/w3perl/config-marconi.pl
  • Le statistiche sono ora accessibili da:
http://proxy.marconi.loc:81/squid/
  • Schedulare statistiche giornaliere automatiche
Aggiungere a crontab per la statistica giornaliera:
01 00 * * * /usr/lib/cgi-bin/w3perl/cron-w3perl.pl -c /usr/lib/cgi-bin/w3perl/config-marconi.pl -e

 

Installazione di squidGuard

Blacklist di siti per categoria

  • Installazione pacchetto
apt-get install squidguard
  • Predisposizione blacklist
rm -r /var/lib/squidguard/db/blacklists
wget http://www.shallalist.de/Downloads/shallalist.tar.gz -O /tmp/shallalist.tar.gz
cd /tmp
tar xvfz shallalist.tar.gz
mkdir -p /var/lib/squidguard/db/blacklists
mv BL/* /var/lib/squidguard/db/blacklists
  • Predispongo il file con la whitelist, dove specificare domini leciti, erroneamente bloccati
nano /etc/squid/whitelist-domains
# Domini in whitelist
wanadoo.es
example.com
chmod 644 whitelist-domains
chown proxy:proxy whitelist-domains
cd /var/lib/squidguard/db
mkdir whitelist
cd whitelist
ln -s /etc/squid/whitelist-domains domains
  • Impostare i permessi sul db di squidguard
chown proxy:proxy -R /var/lib/squidguard/db/*
cd /var/lib/squidguard/db
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;
  • Scrivere il file di configurazione squidguard.conf (vedi allegato)
  • Inizializzare il db di squidguard
su - proxy -c "squidGuard -C all"
attendere il completamento del comando.
  • Aggiungere la seguente riga a squid.conf
url_rewrite_program /usr/bin/squidGuard -c /etc/squid/squidGuard.conf
  • Ricaricare la configurazione di squid
squid3 -k reconfigure
  • Testo il servizio con URL:
echo "http://www.rotten.com / - - GET" | squidGuard -d

e apro rotten.com anche da browser per verificare che sia negato.

  • Preparo uno script bash da schedulare per l’aggiornamento delle blacklist.

Nel file /root/shallaupdate.sh

#!/bin/sh
shallalist="http://www.shallalist.de/Downloads/shallalist.tar.gz"

echo "Elimino vecchie BL"
rm -r /var/lib/squidguard/db/blacklists

echo "Scarico nuove BL"
cd /tmp
wget $shallalist -O shallalist.tar.gz

echo "Estraggo le BL"
tar xvfz /tmp/shallalist.tar.gz
mkdir -p /var/lib/squidguard/db/blacklists
mv BL/* /var/lib/squidguard/db/blacklists

echo "Preparo il link per la whitelist"
cd /var/lib/squidguard/db/blacklists
mkdir whitelist
cd whitelist
ln -s /etc/squid/whitelist-domains domains

echo "Imposto i permessi sulle BL"
chown proxy:proxy -R /var/lib/squidguard/db/*
cd /var/lib/squidguard/db
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;

echo "Ricompilo le BL e riavvio i servizi"
su - proxy -c "squidGuard -C all"
squid3 -k reconfigure

echo "Elimino i file temporanei"
rm /tmp/shallalist.tar.gz

exit 1

Imposto i permessi di esecuzione sullo script: chmod 700 /root/shallaupdate.sh

Aggiungo queste righe a /etc/crontab per aggiornare la blacklist ogni martedi’ notte:

# Aggiornamento settimanale Blacklists
01 5    * * 2   root    /root/shallaupdate.sh
  • Rendo disponibile in /var/www il file deny.html specificato come redirezione dei siti negati
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>ITT Marconi Rovereto - sistema di content filtering</title>
</head>

<body>
<div align="center">
<img src="http://www.marconirovereto.it/templates/marconi_red_white/images/style4/logo.png">
<font face=arial,helvetica size=6>
<p>
<b>Oppps, che succede?</b></p>

<font size=3>
<p>L'accesso alla pagina e' stato negato.</p>
<p>Il sito che hai tentato di visitare rientra in una <b>categoria non consentita</b>.</p>
<p>&nbsp</p>
<font size=1>
<p>Visita <a href="http://www.marconirovereto.it" target="_blank">MARCONIROVERETO.IT</a></p>
<p>Questo servizio funziona al 100% con software libero.<p>
</font>
</div>
</body>
</html>

Fonti

APPENDICE: File di configurazione

file /etc/krb5.conf

[libdefaults]
	default_realm = MARCONI.LOC
	
	; for Windows 2008 with AES
	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

# The following krb5.conf variables are only for MIT Kerberos.
	krb4_config = /etc/krb.conf
	krb4_realms = /etc/krb.realms

[realms]
	MARCONI.LOC = {
		kdc = dc02.marconi.loc:88
		admin_server = dc02.marconloc
		default_domain = marconi.loc
	}

[domain_realm]
	.marconi.loc = MARCONI.LOC
	marconi.loc = MARCONI.LOC

[logging]
	kdc = FILE:/var/log/kdc.log
	admin_server = FILE:/var/log/kadmin.log
	default = FILE:/var/log/krb5lib.log

File /etc/nsswitch.conf

passwd:         compat winbind
group:          compat winbind
shadow:         compat winbind

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

File /etc/samba/smb.conf

[global]
workgroup = MARCONI
server string = %h server
security = ads
realm = MARCONI.LOC
encrypt passwords = true
kerberos method = system keytab

# Disabilito tutte le funzioni di master browsing e pdc
dns proxy = no
local master = no
preferred master = no
domain master = no
domain logons = no
time server = no
os level = 0 

socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
winbind separator = +
idmap uid = 10000-20000
idmap gid = 10000-20000
template shell = /bin/bash

winbind uid = 10000-20000
winbind gid = 10000-20000           
winbind use default domain = yes
winbind enum users = yes
winbind enum groups = yes
winbind nested groups = yes
winbind cache time = 30
log file = /var/log/samba/log.%m
max log size = 1000

load printers = no
disable spoolss = yes

File /etc/squid3/squid.conf

### cache manager
cache_mgr assistenza@marconirovereto.it

### negotiate kerberos and ntlm authentication
auth_param negotiate program /usr/local/bin/negotiate_wrapper --ntlm /usr/bin/ntlm_auth --diagnostics --helper-protocol=squid-2.5-ntlmssp --domain=MARCONI --kerberos /usr/lib/squid3/squid_kerb_auth -s GSS_C_NO_NAME
auth_param negotiate children 30
auth_param negotiate keep_alive off

### pure ntlm authentication
auth_param ntlm program /usr/bin/ntlm_auth --diagnostics --helper-protocol=squid-2.5-ntlmssp --domain=MARCONI
auth_param ntlm children 30
auth_param ntlm keep_alive off

### provide basic authentication via ldap for clients not authenticated via kerberos/ntlm
auth_param basic program /usr/lib/squid3/squid_ldap_auth -R -b "ou=utenti,dc=marconi,dc=loc" -D ubuntu@marconi.loc -W /etc/squid3/ldappass.txt -f sAMAccountName=%s -h dc02.marconi.loc
auth_param basic children 30
auth_param basic realm Internet Proxy
auth_param basic credentialsttl 1 minute

### ldap authorisation
external_acl_type nt_group children=30 ttl=60 %LOGIN /usr/lib/squid3/wbinfo_group.pl -K

### acl for proxy auth and ldap authorizations
acl auth proxy_auth REQUIRED
#   aclname             acltype  typename activedirectorygroup
acl GLInternetSempre    external nt_group GLInternetSempre
acl GLInternetStudenti  external nt_group GLInternetStudenti
acl SitiIntranet        dstdomain "/etc/squid3/sitiintranet.txt"

### squid defaults
acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost

### http_access rules

# Obbligo gli utenti ad autenticarsi
http_access deny !auth

# Consento l'accesso ai siti Intranet
http_access allow SitiIntranet

# Consento l'accesso agli utenti autenticati
http_access allow GLInternetStudenti
http_access allow GLInternetSempre

# DO NOT REMOVE THE FOLLOWING LINE
http_access deny all

### logging
access_log /var/log/squid3/access.log common

### squid Debian defaults
http_port 8080
hierarchy_stoplist cgi-bin ?
coredump_dir /var/spool/squid3
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320

# Gestione Header X-Forward
follow_x_forwarded_for allow localhost
request_header_access X-Forwarded-For deny all
request_header_access Via deny all

squidguard.conf

dbhome /var/lib/squidguard/db/blacklists
logdir /var/log/squid3

dest aggressive {
        domainlist      aggressive/domains
        urllist         aggressive/urls
}

dest anonvpn {
        domainlist      anonvpn/domains
        urllist         anonvpn/urls
}

dest drugs {
        domainlist      drugs/domains
        urllist         drugs/urls
}

dest gamble {
        domainlist      gamble/domains
        urllist         gamble/urls
}

dest hacking {
        domainlist      hacking/domains
        urllist         hacking/urls
}

dest porn {
        domainlist      porn/domains
        urllist         porn/urls
}

dest redirector {
        domainlist      redirector/domains
        urllist         redirector/urls
}

dest sex {
        domainlist      sex/education/domains
        urllist         sex/education/urls

        domainlist      sex/lingerie/domains
        urllist         sex/lingerie/urls
}

dest spyware {
        domainlist      spyware/domains
        urllist         spyware/urls
}

dest violence {
        domainlist      violence/domains
        urllist         violence/urls
}

dest warez  {
        domainlist      warez/domains
        urllist         warez/urls
}

dest whitelist  {
        domainlist      whitelist/domains
}


acl {

        default {
                pass whitelist !aggressive !anonvpn !drugs !gamble !hacking !porn !redirector !sex !spyware !violence !warez all
                redirect        http://proxy.marconi.loc/deny.html
}
WordPress Appliance - Powered by TurnKey Linux