Tribulations d'un ingénieur système

Aller au contenu | Aller au menu | Aller à la recherche

mercredi 31 mai 2017

Proxy Squid avec authentification pure Kerberos et SquidGuard (1/3)

Cette page d'écrit l'installation d'un proxy filtrant et authentifiant.

Ce Squid n'utilisera pas NTLM, il n'y aura donc pas d'installation de Samba ou de Wins. Ce mécanisme (NTLM), bien que moins consommateur de CPU, peut générer des problèmes de résolution de noms lié à Wins, ainsi que des latences dans les échanges d'authentifications. Le protocole NTLMv1 pose également des problèmes de sécurité et ne doit plus être employé, au profit de NTLMv2 ou Kerberos.

Choix de l'OS :
Le paquet Squid disponible dans les versions de Redhat (y compris Rehat 7) ne contient pas le module “ext_kerberos_ldap_group_acl”, il faudra donc préférer la distribution Debian. Notons toutefois que la seule différence entre “ext_kerberos_ldap_group_acl” et “ext_ldap_group_acl” est l'obligation de disposer d'un utilisateur capable d’interroger le Ldap AD et le login/password de cet utilisateur sera visible en clair dans la configuration du squid.conf. Si ce point n'est pas un problème, vous pouvez choisir n'importe quelle distribution.

Dimensionnement du serveur :
Si Kerberos est plus sécurisé et plus stable que NTLM, il est en revanche plus gourmand en CPU.
Chaque requête HTTP nécessite le contrôle du ticket Kerberos client. Quand un process “negotiate_kerberos_auth” est déjà occupé, le contrôle est effectué par le processus suivant. Le nombre de contrôle “negotiate_kerberos_auth” maximum est défini par le champ “auth_param negotiate children 10” du fichier /etc/squid3/squid.conf.
CPU : Une seule page de plusieurs dizaine d'objets peut consommer jusqu'à la moitié d'un CPU de 3 GHz. En cas de saturation CPU, le chargement de la page sera ralentit. Compter en moyenne 1 CPU pour quatre navigation active d'utilisateur.
Mémoire : compter 8 Mo de ram par processus “negotiate_kerberos_auth” et autant par processus SquidGuard. 400Mo pour Squid.

Pour une utilisation normale d'internet dans un parc de 250 utilisateurs, il faut au minimum 1 CPU 3GHz et 1 Go de RAM. Ces valeurs sont doublé pour plus de confort.

Dans la configuration ci-dessous, le serveur Suid s'apelle "serversquid", le domaine Active Directory "mondomaine.local", les contrôleurs de domaines Active Directory porte également le rôle DNS et ont l'IP 192.168.1.2 et 192.168.1.3


Kerberos
Configurer la résolution DNS : Fichier /etc/resolv.conf

search mondomaine.local
nameserver 192.168.1.2
nameserver 192.168.1.3

Configurer la synchronisation NTP (indispensable pour le fonctionnement de Kerberos) Les serveurs de temps doivent être les contrôleurs de domaine Kerberos.
Configurer la ligne “Server” du fichier /etc/ntp.conf

server mondomaine.local
systemctl restart ntp
systemctl enable ntp
Installation des paquets Kerberos et Squid :
apt-get install krb5-user libkrb53 libsasl2-modules-gssapi-mit libsasl2-modules squid3 msktutil 

Configurer Kerberos (exemple avec le client Bouvard) :

cp /etc/krb5.conf /etc/krb5.conf.default
vim /etc/krb5.conf

Fichier /etc/krb5.conf :

[libdefaults]
default_realm = MONDOMAINE.LOCAL
dns_lookup_kdc = no
dns_lookup_realm = no
ticket_lifetime = 24h
default_keytab_name = /etc/squid3/squid.keytab
; For Windows 2008 (Server) 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
[realms]
BOUVARD.AD = {
kdc = serveur-ad-1.mondomaine.local
kdc = serveur-ad-2.mondomaine.local
admin_server = server-ad-1.mondomaine.local
default_domain = mondomaine.local
}
;
[domain_realm]
.mondomaine.local = MONDOMAINE.LOCAL
mondomaine.local = MONDOMAINE.LOCAL

Initialiser la connexion avec le contrôleur de domaine en tant qu'administrateur :

kinit administrator
Password for administrator@MONDOMAINE.LOCAL:

Enregistrer la VM dans Active Directory pour obtenir son ticket Kerberos :

msktutil -c -b "CN=COMPUTERS" -s HTTP/serversquid.mondomaine.local -k /etc/squid3/squid.keytab --computer-name SERVERSQUID --upn HTTP/serversquid.mondomaine.local --server server-ad-1.mondomaine.local --verbose --enctypes 28

Ajouter le code suivant dans le fichier /etc/cron.d/kerb5-renew pour renouveler périodiquement le ticket Kerberos du serveur proxy

0 */12 * * * root /usr/sbin/msktutil --auto-update --verbose --computer-name SERVERSQUID -k /etc/squid3/squid.keytab | /usr/bin/logger -t msktutil

Détruiser la connexion Administrateur au domaine Bouvard.ad :

kdestroy

Autoriser Squid a lire le fichier Kerberos :

chgrp proxy /etc/squid3/squid.keytab
chmod g+r /etc/squid3/squid.keytab

Créer le fichier /etc/default/squid3 pour indiquer a Squid ou trouver le fichier Kerberos :

KRB5_KTNAME=/etc/squid3/squid.keytab
export KRB5_KTNAME


Squid

Configuration de Squid

cp /etc/squid3/squid.conf /etc/squid3/squid.conf.default
vim /etc/squid3/squid.conf

Fichier /etc/squid3/squid.conf

visible_hostname serversquid.mondomaine.local
http_port 3128
hierarchy_stoplist cgi-bin ?
coredump_dir /var/spool/squid3
cache_mgr informatique@mondomaine.com
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
logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %>Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
access_log syslog:local5.debug combined
access_log /var/log/squid3/access.log combined
#redirect_program /usr/bin/squidGuard -c /etc/squidguard/squidGuard.conf
auth_param negotiate program /usr/lib/squid3/negotiate_kerberos_auth -r -s HTTP/serversquid.mondomaine.local@MONDOMAINE.LOCAL
auth_param negotiate children 50
auth_param negotiate keep_alive on
external_acl_type ldap_group_infra %LOGIN /usr/lib/squid3/ext_kerberos_ldap_group_acl -a -g GG-User-INFRA-Internet@ -D MONDOMAINE.LOCAL
external_acl_type ldap_group_pcphysique %LOGIN /usr/lib/squid3/ext_kerberos_ldap_group_acl -a -g GG-User-PCPhysique-Internet@ -D MONDOMAINE.LOCAL
#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 from_srv_prod       src 192.168.1.0/24
acl from_poste_vdi      src 192.168.2.0/24
acl from_poste_physique src 192.168.3.0/24
acl to_srv_prod         dst 192.168.1.0/24
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 20-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
acl WHITELIST dstdomain "/etc/squid3/whitelist.txt"
acl AUTHENTICATED proxy_auth REQUIRED
acl LDAP_GROUP_CHECK_VDI external ldap_group_infra
#acl LDAP_GROUP_CHECK_PHYS external ldap_group_pcphysique
#acl http proto http
#acl port_80 port 80
#acl port_443 port 443
http_access allow manager localhost
http_access allow to_srv_prod
http_access deny !Safe_ports
# Autorise
#   les users non authentifie
#   from_srv_prod from_poste_vdi from_poste_physique
#   a la WHITELIST site http
http_access allow from_srv_prod WHITELIST
http_access allow from_poste_vdi WHITELIST
http_access allow from_poste_physique WHITELIST
# Autorise
#   les users authentifie
#   from_srv_prod from_poste_vdi from_poste_physique
#   a l'internet sauf blacklist
http_access allow AUTHENTICATED from_srv_prod LDAP_GROUP_CHECK_VDI
http_access allow AUTHENTICATED from_poste_vdi LDAP_GROUP_CHECK_VDI
#http_access allow AUTHENTICATED from_poste_physhigh LDAP_GROUP_CHECK_PHYS
# Refuse tout autre connexion
http_access deny all

Créer le fichier /etc/squid3/whitelist.txt contenant les sites accessibles sans authentification :

.mondomaine.com
.mondomaine.local
.docs.google.com
lh4.googleusercontent.com
.perdu.com

Redémarrer Squid et ajouter le démarrage automatique :
systemctl restart squid3
systemctl enable squid3

Pour effectuer un test en local :

kinit monlogin
/usr/lib/squid3/negotiate_kerberos_auth_test serversquid.mondomaine.local | awk '{sub(/Token:/,"YR"); print $0}END{print "QQ"}' | /usr/lib/squid3/negotiate_kerberos_auth -r -s HTTP/serversquid.mondomaine.local@MONDOMAINE.LOCAL

Si le programme retourne une réponse de la forme suivante :
AF oRQwEqADCgEAoQsGCSqGSIb3EgECAg== olikiang
Alors l'authentification Kerberos dans Squid fonctionne correctement

Attention lors de la configuration des navigateurs sur les clients. Il est impératif d'utiliser le nom du serveur. Ne pas utiliser l'IP. Le protocole Kerberos se base sur le nom du serveur dans le processus de validation Kerberos.

mardi 13 septembre 2016

Ramplacer les retours chariot Windows par des retours chariot Linux avec vi ou sed

Comme il semble y avoir trop de réponse dans stackoverflow pour ce problème, et qu'aucune n'est vraiment clair...

Pour remplacer les retours chariot de type Micorsoft Windows / DOS (CR LF) en retour chariot Unix / Linux (LF)

Avec vi :

vi -b fichieramodifier.txt

puis taper

:%s/^M//g

ou ^M est effectué avec Ctrl+V+M

Avec sed :

sed -i s/^M//g backup.sh

ou ^M est effectué avec Ctrl+V+M

vendredi 17 juin 2016

Activer un CPU à chaud dans une VM

Linux n'active pas automatiquement un CPU ajouté à chaud (dans une VM ou sur un serveur physique)

Il existe un script pour activer le nouveau processeur :

https://communities.vmware.com/docs/DOC-10493

Mais comme pour les disques dur, cette opération peut être effectué en une seule ligne de commande :

find /sys/devices/system/cpu/cpu* -name online -exec echo 1 > {} \;

lundi 28 septembre 2015

Déplacer ou réduire un disque dur à chaud avec LMV

Il n'est pas possible de réduire un disque dur dans VMWare, la seule solution pour "réduire" un disque est alors de créer un nouveau disque plus petit et de déplacer les données vers ce nouveau disque.
Et pour effectuer cette opération à chaud, il existe une commande souvent méconnu : pvmove.

Dans le scénario suivant, nous souhaitons déplacer les données d'un disque dur utilisant LVM vers un nouveau disque sans interruption de service.

Le disque des données est /dev/sdb. Le disque cible est /dev/sdc. (Je n'utilise pas de partition sur les disques car toutes modifications de la table des partition nécessite un redémarrage.)

Créer un PV sur le nouveau disque
pvcreate /dev/sdc

Etendre le VG avec le nouveau disque
vgextend vgtest /dev/sdc

Déplacer les LV présent sur le disque source vers le disque cible
pvmove /dev/sdb /dev/sdc

Supprimer le disque source du VG
vgreduce vgtest /dev/sdb

Aucune interruption de service ne sera visible sur les points de montage. Au pire un ralentissement des accès disques.

Il est également possible de spécifier le déplacement d'un seul LV dans pvmove avec l'option -n
Il vous faudra calculer préalablement la taille du disque cible s'il s'agit d'une opération de réduction. Noter bien qu'1 PE est réservé pour les métadata des VG/LV. Il faut donc ajouté 4Mo (taille par défaut des PE) à la somme de la tailles des LV pour connaître la taille du disque cible précise. Sinon on arrondi au Go supérieur pour éviter les surprises, c'est plus simple.

Si vous utilisé les partitions (fdisk), il faudra seulement ajouter la création de la partition cible et la suppression de la partition source. Mais si d'autres partitions existe sur le disque source, vous ne pourrez pas le supprimer tant que toutes les partitions n'auront pas été libérées.

mercredi 14 janvier 2015

Allouer tout l'espace libre à un Logical Volume

J'ai stupéfait un de mes collègues, l'autre jour, avec cette commande. Et après un rapide tour d'horizon, je me suis aperçu que j'étais le seul administrateur Linux à utiliser cette commande pour ne pas avoir à calculer l'espace libre à allouer lors de l'agrandissement ou la création d'un Logical Volume.

Exemple pour allouer tout l'espace disque disponible d'un VG dans un LV (création ou agrandissement) :

lvcreate -l 100%FREE -n lv_data vg_data
lvresize -l +100%FREE /dev/vg_data/lv_data

Il est aussi possible de créer ou d'agrandir un disque avec un pourcentage de l'espace total d'un VG ou d'un LV.

Exemple pour créer deux LV de même taille dans un VG vide :

lvcreate -l 50%VG -n lv_data1 vg_data
lvcreate -l 100%FREE -n lv_data2 vg_data

Exemple pour ajouter 50% d'espace disque en plus sur un LV :

lvresize -l +50%LV /dev/vg_data/lv_data

- page 1 de 2