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 emarconi.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> </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
- Documentazione ufficiale di SQUID
- http://wiki.squid-cache.org/ConfigExamples/Authenticate/WindowsActiveDirectory
- http://wiki.bitbinary.com/index.php/Active_Directory_Integrated_Squid_Proxy
- http://acksyn.org/?p=491
- https://serverfault.com/questions/66556/getting-squid-to-authenticate-with-kerberos-and-windows-2008-2003-7-xp
- https://plone.lucidsolutions.co.nz/web/http/web-proxy-auto-discovery-protocol-wpad-support-using-nginx
- https://wiki.debian.org/DebianEdu/HowTo/SquidGuard
- http://www.shallalist.de/helpers.html
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 }