Rev 520 | Rev 526 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log
#!/bin/sh
# $Id: alcasar.sh 522 2011-03-29 20:00:46Z richard $
# alcasar.sh
# by Franck BOUIJOUX, Pascal LEVANT and Richard REY
# This script is distributed under the Gnu General Public License (GPL)
# Install script for ALCASAR (a secured and authenticated Internet access control captive portal)
# Script d'installation d'ALCASAR (Application Libre pour le Contrôle d'Accès Sécurisé et Authentifié au Réseau)
# ALCASAR is based on a stripped Mandriva (LSB) with the following open source softwares :
# ALCASAR est architecturé autour d'une distribution Linux Mandriva minimaliste et les logiciels libres suivants :
# Coovachilli (a fork of chillispot), freeradius, mysql, apache, netfilter, squid, dansguardian, mondo, mindi, dialupadmin, awstat, ntpd, openssl, dnsmasq, havp, libclamav and firewalleyes
# Options :
# -i or --install
# -u or --uninstall
# Functions :
# testing : Tests de connectivité et de téléchargement avant installation
# init : Installation des RPM et des scripts
# network : Paramètrage du réseau
# gestion : Installation de l'interface de gestion
# AC : Initialisation de l'autorité de certification. Création des certificats
# init_db : Création de la base 'radius' sur le serveur MySql
# param_radius : Configuration du serveur d'authentification FreeRadius
# param_web_radius: Configuration de l'interface de gestion de FreeRadius (dialupadmin)
# param_chilli : Configuration du daemon 'coova-chilli' et de la page d'authentification
# param_squid : Configuration du proxy squid en mode 'cache'
# param_dansguardian : Configuration de l'analyseur de contenu DansGuardian
# antivirus : Installation havp + libclamav
# firewall : Mise en place des règles du parefeu et de l'interface WEB FirewallEyes
# param_awstats : Configuration de l'interface des statistiques de consultation WEB
# dnsmasq : Configuration du serveur de noms et du serveur dhcp de secours
# BL : Configuration de la BlackList
# cron : Mise en place des exports de logs (+ chiffrement)
# post_install : Finalisation environnement ( CA, bannières, rotatoin logs, ...)
VERSION=`cat VERSION`
DATE=`date '+%d %B %Y - %Hh%M'`
DATE_SHORT=`date '+%d/%m/%Y'`
# ******* Files parameters - paramètres fichiers *********
DIR_INSTALL=`pwd` # répertoire d'installation
DIR_CONF="$DIR_INSTALL/conf" # répertoire d'installation contenant les fichiers de configuration
DIR_SCRIPTS="$DIR_INSTALL/scripts" # répertoire d'installation contenant les scripts
DIR_SAVE="/var/Save" # répertoire de sauvegarde (ISO, backup, etc.)
DIR_WEB="/var/www/html" # répertoire racine APACHE
DIR_ACC="$DIR_WEB/acc" # répertoire du centre de gestion 'ALCASAR Control Center'
DIR_DEST_BIN="/usr/local/bin" # répertoire des scripts
DIR_DEST_SBIN="/usr/local/sbin" # répertoire des scripts d'admin
DIR_DEST_ETC="/usr/local/etc" # répertoire des fichiers de conf
FIC_PARAM="/root/ALCASAR-parameters.txt" # fichier texte résumant les paramètres d'installation
FIC_PASSWD="/root/ALCASAR-passwords.txt" # fichier texte contenant les mots de passe et secrets partagés
# ******* DBMS parameters - paramètres SGBD ********
DB_RADIUS="radius" # nom de la base de données utilisée par le serveur FreeRadius
DB_USER="radius" # nom de l'utilisateur de la base de données
# ******* Network parameters - paramètres réseau *******
HOSTNAME="alcasar" #
DOMAIN="localdomain" # domaine local
EXTIF="eth0" # ETH0 est l'interface connectée à Internet (Box FAI)
INTIF="eth1" # ETH1 est l'interface connectée au réseau local de consultation
CUSTOM_PRIVATE_NETWORK_MASK="192.168.182.0/24" # adresse du réseau de consultation proposée par défaut
SQUID_PORT="3128" # Port d'écoute du proxy Squid
# ****** Paths - chemin des commandes *******
SED="/bin/sed -i"
# ****** Alcasar needed RPMS - paquetages nécessaires au fonctionnement d'Alcasar ******
PACKAGES="freeradius freeradius-mysql freeradius-ldap freeradius-web apache-mpm-prefork apache-mod_ssl apache-mod_php squid dansguardian postfix MySQL logwatch ntp awstats mondo cdrecord buffer vim-enhanced bind-utils wget arpscan ulogd openssh-server php-xml pam_ccreds rng-utils lsb-release dnsmasq sudo cronie-anacron pciutils clamav pm-fallback-policy"
# ****************** End of global parameters *********************
header_install ()
{
clear
echo "-----------------------------------------------------------------------------"
echo " ALCASAR V$VERSION Installation"
echo "Application Libre pour le Contrôle d'Accès Sécurisé et Authentifié au Réseau"
echo "-----------------------------------------------------------------------------"
} # End of header_install ()
##################################################################
## Fonction TESTING ##
## - Test de la connectivité Internet ##
##################################################################
testing ()
{
echo "Tests des paramètres réseau."
echo -n "Network parameters tests : "
# We test the Ethernet links state
for i in $EXTIF $INTIF
do
/sbin/ip link set $i up
sleep 3
if [ "`/usr/sbin/ethtool $i|grep Link|cut -d' ' -f3`" != "yes" ]
then
echo "Échec"
echo "Le lien réseau de la carte $i n'est pas actif."
echo "Réglez ce problème puis relancez ce script."
echo "Failed"
echo "The link state of $i interface id down."
echo "Resolv this problem, then restart this script."
exit 0
fi
echo -n "."
done
# On teste la présence d'un routeur par défaut (Box FAI)
if [ `/sbin/route -n|grep -c ^0.0.0.0` -ne "1" ] ; then
echo "Échec"
echo "Vous n'avez pas configuré l'accès à Internet ou le câble réseau n'est pas sur la bonne carte."
echo "Réglez ce problème puis relancez ce script."
echo "Failed"
echo "You haven't configured Internet access or Internet link is on the wrong Ethernet card"
echo "Resolv this problem, then restart this script."
exit 0
fi
echo -n "."
# On traite le cas où l'interface configurée lors de l'installation est "eth1" au lieu de "eth0" (mystère sur certaines version de BIOS et de VirtualBox)
if [ `/sbin/route -n|grep ^0.0.0.0|grep -c eth1` -eq "1" ] ; then
echo "La configuration des cartes réseau va être corrigée."
echo "The Ethernet card configuration will be corrected."
/etc/init.d/network stop
mv -f /etc/sysconfig/network-scripts/ifcfg-eth1 /etc/sysconfig/network-scripts/ifcfg-eth0
$SED "s?eth1?eth0?g" /etc/sysconfig/network-scripts/ifcfg-eth0
/etc/init.d/network start
echo 0 > /proc/sys/net/ipv4/conf/all/log_martians
sleep 2
echo "Configuration corrigée"
echo "Configuration updated"
sleep 2
echo "Vous pouvez relancer ce script."
echo "You can restart this script."
exit 0
fi
echo -n "."
# On test le lien vers le routeur par default
IP_GW=`ip route list|grep ^default|cut -d" " -f3`
arp_reply=`/usr/sbin/arping -b -I$EXTIF -c1 -w2 $IP_GW|grep response|cut -d" " -f2`
if [[ $(expr $arp_reply) -eq 0 ]]
then
echo "Échec"
echo "Le routeur de site ou la Box Internet ($IP_GW) ne répond pas."
echo "Réglez ce problème puis relancez ce script."
echo "Failed"
echo "The Internet gateway doesn't answered"
echo "Resolv this problem, then restart this script."
exit 0
fi
echo -n "."
# On teste la connectivité Internet
rm -rf /tmp/con_ok.html
/usr/bin/curl www.google.fr -s -o /tmp/con_ok.html
if [ ! -e /tmp/con_ok.html ]
then
echo "La tentative de connexion vers Internet a échoué (google.fr)."
echo "Vérifiez que la carte $EXTIF est bien connectée au routeur du FAI."
echo "Vérifiez la validité des adresses IP des DNS."
echo "The Internet connection try failed (google.fr)."
echo "Please, verify that the $EXTIF card is connected with the Internet gateway."
echo "Verify the DNS IP addresses"
exit 0
fi
rm -rf /tmp/con_ok.html
echo ". : ok"
} # end of testing
##################################################################
## Fonction INIT ##
## - Création du fichier "/root/ALCASAR_parametres.txt" ##
## - Installation et modification des scripts du portail ##
## - Mise à jour système ##
## - Installation des paquetages complémentaires ##
##################################################################
init ()
{
if [ ! "$mode" = "update" ]
then
# On affecte le nom d'organisme
ORGANISME=!
PTN='^[a-zA-Z0-9-]*$'
until [[ $(expr $ORGANISME : $PTN) -gt 0 ]]
do
echo "Entrez le nom de votre organisme : "
echo -n "Enter the name of your organisation : "
read ORGANISME
if [ "$ORGANISME" = "" ]
then
ORGANISME=!
fi
done
fi
# System update
$DIR_SCRIPTS/alcasar-urpmi.sh
if [ "$?" != "0" ]
then
exit 0
fi
# Download of ALCASAR specifics RPM in cache (and test)
echo "Récupération des paquetages complémentaires. Veuillez patienter ..."
echo "Download of complementary packages. Please wait ..."
urpmi --wget --auto $PACKAGES --quiet --test --retry 2
if [ "$?" != "0" ]
then
echo
echo "Une erreur a été détectée lors de la récupération des paquetages complémentaires."
echo "Relancez l'installation ultérieurement."
echo "Si vous rencontrez à nouveau ce problème, modifier la variable MIRRORLIST du fichier 'scripts/alcasar-urpmi.sh'"
echo "An error occurs when downloading complementary packages"
echo "Try an other install later."
echo "If this problem occurs again, change the MIRRORLIST variable in the file 'scripts/alcasar-urpmi.sh'"
exit 0
fi
# update with cached RPM
urpmi --auto $PACKAGES
# On supprime les paquetages, les services et les utilisateurs inutiles
for rm_rpm in shorewall dhcp-server c-icap-server cyrus-sasl distcache-server avahi mandi radeontool
do
/usr/sbin/urpme --auto $rm_rpm --auto-orphans 2>/dev/null
echo -n "."
done
for svc in alsa sound dm atd netfs bootlogd stop-bootlogd
do
/sbin/chkconfig --del $svc
done
for rm_users in avahi-autoipd avahi icapd
do
user=`cat /etc/passwd|grep $rm_users|cut -d":" -f1`
if [ "$user" == "$rm_users" ]
then
/usr/sbin/userdel -f $rm_users
fi
done
# extract the current architecture (i586 ou X64)
fic=`cat /etc/product.id`
ARCH="i586"
old="$IFS"
IFS=","
set $fic
for i in $*
do
if [ "`echo $i|grep arch|cut -d'=' -f1`" == "arch" ]
then
ARCH=`echo $i|cut -d"=" -f2`
fi
done
IFS="$old"
# On installe les RPMs spécifiques à la version
urpmi --no-verify --auto $DIR_CONF/rpms/$ARCH/*.rpm
# On empêche les mises à jour de coova-chilli et freeradius par le biais des dépôts
for rpmskip in coova freeradius
do
echo -n "/^$rpmskip/" >> /etc/urpmi/skip.list
done
# On vide le répertoire temporaire
urpmi --clean
# On crée aléatoirement les mots de passe et les secrets partagés
rm -f $FIC_PASSWD
grubpwd=`cat /dev/urandom | tr -dc [:alnum:] | head -c8` # mot de passe de protection du menu Grub
echo -n "mot de passe de protection du menu de démarrage (GRUB) : " > $FIC_PASSWD
echo "$grubpwd" >> $FIC_PASSWD
md5_grubpwd=`/usr/bin/md5pass $grubpwd`
$SED "/^password.*/d" /boot/grub/menu.lst
$SED "1ipassword --md5 $md5_grubpwd" /boot/grub/menu.lst
mysqlpwd=`cat /dev/urandom | tr -dc [:alnum:] | head -c8` # mot de passe de l'administrateur Mysqld
echo -n "compte et mot de passe de l'administrateur Mysqld : " >> $FIC_PASSWD
echo "root / $mysqlpwd" >> $FIC_PASSWD
radiuspwd=`cat /dev/urandom | tr -dc [:alnum:] | head -c8` # mot de passe de l'utilisateur Mysqld (utilisé par freeradius)
echo -n "compte et mot de passe de l'utilisateur Mysqld : " >> $FIC_PASSWD
echo "$DB_USER / $radiuspwd" >> $FIC_PASSWD
secretuam=`cat /dev/urandom | tr -dc [:alnum:] | head -c8` # secret partagé entre intercept.php et coova-chilli
echo -n "secret partagé entre le script 'intercept.php' et coova-chilli : " >> $FIC_PASSWD
echo "$secretuam" >> $FIC_PASSWD
secretradius=`cat /dev/urandom | tr -dc [:alnum:] | head -c8` # secret partagé entre coova-chilli et FreeRadius
echo -n "secret partagé entre coova-chilli et FreeRadius : " >> $FIC_PASSWD
echo "$secretradius" >> $FIC_PASSWD
chmod 640 $FIC_PASSWD
# On installe les scripts et fichiers de configuration d'ALCASAR
# - dans /usr/local/bin : alcasar-{CA.sh,conf.sh,import-clean.sh,iptables-bypass.sh,iptables.sh,log-clean.sh,log-export.sh,mondo.sh,watchdog.sh}
cp -f $DIR_SCRIPTS/alcasar* $DIR_DEST_BIN/. ; chown root:root $DIR_DEST_BIN/alcasar* ; chmod 740 $DIR_DEST_BIN/alcasar*
# - dans /usr/local/sbin : alcasar-{bl.sh,bypass.sh,dateLog.sh,havp.sh,logout.sh,mysql.sh,nf.sh,profil.sh,uninstall.sh,version-list.sh,load-balancing.sh}
cp -f $DIR_SCRIPTS/sbin/alcasar* $DIR_DEST_SBIN/. ; chown root:root $DIR_DEST_SBIN/alcasar* ; chmod 740 $DIR_DEST_SBIN/alcasar*
# - des fichiers de conf dans /usr/local/etc : alcasar-{bl-categories-enabled,dns-name,ethers,iptables-local.sh,services}
cp -f $DIR_SCRIPTS/etc/alcasar* $DIR_DEST_ETC/. ; chown root:apache $DIR_DEST_ETC/alcasar* ; chmod 660 $DIR_DEST_ETC/alcasar*
$SED "s?^radiussecret.*?radiussecret=\"$secretradius\"?g" $DIR_DEST_SBIN/alcasar-logout.sh
$SED "s?^DB_RADIUS=.*?DB_RADIUS=\"$DB_RADIUS\"?g" $DIR_DEST_SBIN/alcasar-mysql.sh
$SED "s?^DB_USER=.*?DB_USER=\"$DB_USER\"?g" $DIR_DEST_SBIN/alcasar-mysql.sh $DIR_DEST_BIN/alcasar-conf.sh
$SED "s?^radiuspwd=.*?radiuspwd=\"$radiuspwd\"?g" $DIR_DEST_SBIN/alcasar-mysql.sh $DIR_DEST_BIN/alcasar-conf.sh
# On génère le début du fichier récapitulatif
cat <<EOF > $FIC_PARAM
########################################################
## ##
## Fichier récapitulatif des paramètres d'ALCASAR ##
## ##
########################################################
- Date d'installation : $DATE
- Version istallée : $VERSION
- Organisme : $ORGANISME
EOF
chmod o-rwx $FIC_PARAM
} # End of init ()
##################################################################
## Fonction network ##
## - Définition du plan d'adressage du réseau de consultation ##
## (merci à Alexandre Trias pour le calcul de masque et RegEx) ##
## - Nommage DNS du système (portail + nom d'organisme) ##
## - Configuration de l'interface eth1 (réseau de consultation) ##
## - Modification du fichier /etc/hosts ##
## - Configuration du serveur de temps (NTP) ##
## - Renseignement des fichiers hosts.allow et hosts.deny ##
##################################################################
network ()
{
header_install
echo "Par défaut, le plan d'adressage du réseau de consultation est : $CUSTOM_PRIVATE_NETWORK_MASK"
response=0
PTN='^[oOnN]$'
until [[ $(expr $response : $PTN) -gt 0 ]]
do
echo -n "Voulez-vous utiliser ce plan d'adressage (recommandé) (O/n)? : "
read response
done
if [ "$response" = "n" ] || [ "$response" = "N" ]
then
CUSTOM_PRIVATE_NETWORK_MASK="0"
PTN='^\([01]\?[[:digit:]][[:digit:]]\?\|2[0-4][[:digit:]]\|25[0-5]\).\([01]\?[[:digit:]][[:digit:]]\?\|2[0-4][[:digit:]]\|25[0-5]\).\([01]\?[[:digit:]][[:digit:]]\?\|2[0-4][[:digit:]]\|25[0-5]\).\([01]\?[[:digit:]][[:digit:]]\?\|2[0-4][[:digit:]]\|25[0-5]\)/[012]\?[[:digit:]]$'
until [[ $(expr $CUSTOM_PRIVATE_NETWORK_MASK : $PTN) -gt 0 ]]
do
echo -n "Entrez un plan d'adressage au format CIDR (a.b.c.d/xx) : "
read CUSTOM_PRIVATE_NETWORK_MASK
done
fi
# Récupération de la config réseau côté "LAN de consultation"
hostname $HOSTNAME
echo "- Nom du système : $HOSTNAME" >> $FIC_PARAM
PRIVATE_NETWORK=`/bin/ipcalc -n $CUSTOM_PRIVATE_NETWORK_MASK | cut -d"=" -f2` # @ réseau de consultation (ex.: 192.168.182.0)
private_prefix=`/bin/ipcalc -p $CUSTOM_PRIVATE_NETWORK_MASK |cut -d"=" -f2` # prefixe du réseau (ex. 24)
PRIVATE_NETWORK_MASK=$PRIVATE_NETWORK/$private_prefix # @ réseau + masque (x.0.0.0/8 ou x.y.0.0/16 ou x.y.z.0/24)
classe=$((private_prefix/8)); # classe de réseau (ex.: 2=classe B, 3=classe C)
PRIVATE_NETWORK_SHORT=`echo $PRIVATE_NETWORK | cut -d"." -f1-$classe`. # @ compatible hosts.allow et hosts.deny (ex.: 192.168.182.)
PRIVATE_MASK=`/bin/ipcalc -m $PRIVATE_NETWORK_MASK | cut -d"=" -f2` # masque réseau de consultation (ex.: 255.255.255.0)
PRIVATE_BROADCAST=`/bin/ipcalc -b $PRIVATE_NETWORK_MASK | cut -d"=" -f2` # @ broadcast réseau de consultation (ex.: 192.168.182.255)
TMP_MASK=`echo $PRIVATE_NETWORK_MASK|cut -d"/" -f2`; HALF_MASK=`expr $TMP_MASK + 1` # masque du 1/2 réseau de consultation (ex.: 25)
PRIVATE_STAT_IP=$PRIVATE_NETWORK/$HALF_MASK # plage des adresses statiques (ex.: 192.168.182.0/25)
PRIVATE_STAT_MASK=`/bin/ipcalc -m $PRIVATE_STAT_IP/$HALF_MASK | cut -d"=" -f2` # masque des adresses statiques (ex.: 255.255.255.128)
classe_sup=`expr $classe + 1`
classe_sup_sup=`expr $classe + 2`
private_network_ending=`echo $PRIVATE_NETWORK | cut -d"." -f$classe_sup`
private_broadcast_ending=`echo $PRIVATE_BROADCAST | cut -d"." -f$classe_sup`
private_plage=`expr $private_broadcast_ending - $private_network_ending + 1`
private_half_plage=`expr $private_plage / 2`
private_dyn=`expr $private_half_plage + $private_network_ending`
private_dyn_ip_network=`echo $PRIVATE_NETWORK | cut -d"." -f1-$classe`"."$private_dyn"."`echo $PRIVATE_NETWORK | cut -d"." -f$classe_sup_sup-5`
PRIVATE_DYN_IP=`echo $private_dyn_ip_network | cut -d"." -f1-4`/$HALF_MASK # plage des adresses dynamiques (ex.: 192.168.182.128/25)
PRIVATE_DYN_MASK=`/bin/ipcalc -m $PRIVATE_DYN_IP/$HALF_MASK | cut -d"=" -f2` # masque des adresses dynamiques (ex.: 255.255.255.128)
private_dyn_ip_network=`echo $PRIVATE_DYN_IP | cut -d"/" -f1` # plage des adresses dynamiques sans le masque (ex.: 192.168.182.0)
private_dyn_ip_end=`echo $private_dyn_ip_network | cut -d"." -f4` # dernier octet de la plage des adresses dynamiques (ex.: 128)
PRIVATE_DYN_FIRST_IP=`echo $private_dyn_ip_network | cut -d"." -f1-3`"."`expr $private_dyn_ip_end + 1` # 1ère adresse de la plage dynamique (ex.: 192.168.182.129)
private_broadcast_end=`echo $PRIVATE_BROADCAST | cut -d"." -f4`
PRIVATE_DYN_LAST_IP=`echo $PRIVATE_BROADCAST | cut -d"." -f1-3`"."`expr $private_broadcast_end - 1` # dernière adresse de la plage dynamique (ex.: 192.168.182.254)
PRIVATE_IP=`echo $PRIVATE_NETWORK | cut -d"." -f1-3`"."`expr $private_network_end + 1` # @ip du portail (côté réseau de consultation)
# Récupération de la config réseau côté "Internet"
[ -e /etc/sysconfig/network-scripts/default-ifcfg-$EXTIF ] || cp /etc/sysconfig/network-scripts/ifcfg-$EXTIF /etc/sysconfig/network-scripts/default-ifcfg-$EXTIF
EXT_IP=`grep IPADDR /etc/sysconfig/network-scripts/default-ifcfg-$EXTIF|cut -d"=" -f2` # @ip du portail (côté Internet)
[ -e /etc/sysconfig/network.default ] || cp /etc/sysconfig/network /etc/sysconfig/network.default
DNS1=`grep DNS1 /etc/sysconfig/network-scripts/default-ifcfg-$EXTIF|cut -d"=" -f2` # @ip 1er DNS
DNS2=`grep DNS2 /etc/sysconfig/network-scripts/default-ifcfg-$EXTIF|cut -d"=" -f2` # @ip 2ème DNS
DNS1=${DNS1:=208.67.220.220}
DNS2=${DNS2:=208.67.222.222}
EXT_NETMASK=`grep NETMASK /etc/sysconfig/network-scripts/default-ifcfg-$EXTIF|cut -d"=" -f2`
EXT_GATEWAY=`grep GATEWAY /etc/sysconfig/network-scripts/default-ifcfg-$EXTIF|cut -d"=" -f2`
echo "- Adresse IP 'côté Internet' ($EXTIF) : $EXT_IP / $EXT_NETMASK" >> $FIC_PARAM
echo "- Serveurs DNS renseignés : $DNS1 et $DNS2" >> $FIC_PARAM
echo "- Routeur de sortie : $EXT_GATEWAY" >> $FIC_PARAM
# Configuration réseau
cat <<EOF > /etc/sysconfig/network
NETWORKING=yes
HOSTNAME="$HOSTNAME"
FORWARD_IPV4=true
EOF
# Modif /etc/hosts
[ -e /etc/hosts.default ] || cp /etc/hosts /etc/hosts.default
cat <<EOF > /etc/hosts
127.0.0.1 localhost
$PRIVATE_IP $HOSTNAME
EOF
echo "- Adresse IP 'côté réseau de consultation' ($INTIF) : $PRIVATE_IP / $PRIVATE_NETWORK_MASK" >> $FIC_PARAM
echo " - plage d'adresses statiques : $PRIVATE_STAT_IP" >> $FIC_PARAM
echo " - plage d'adresses dynamiques (via DHCP) : $PRIVATE_DYN_IP" >> $FIC_PARAM
# Configuration de l'interface eth0 (Internet)
cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-$EXTIF
DEVICE=$EXTIF
BOOTPROTO=static
IPADDR=$EXT_IP
NETMASK=$EXT_NETMASK
GATEWAY=$EXT_GATEWAY
DNS1=127.0.0.1
ONBOOT=yes
METRIC=10
NOZEROCONF=yes
MII_NOT_SUPPORTED=yes
IPV6INIT=no
IPV6TO4INIT=no
ACCOUNTING=no
USERCTL=no
EOF
# Configuration de l'interface eth1 (réseau de consultation)
cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-$INTIF
DEVICE=$INTIF
BOOTPROTO=static
IPADDR=$PRIVATE_IP
NETMASK=$PRIVATE_MASK
ONBOOT=yes
METRIC=10
NOZEROCONF=yes
MII_NOT_SUPPORTED=yes
IPV6INIT=no
IPV6TO4INIT=no
ACCOUNTING=no
USERCTL=no
EOF
# Mise à l'heure du serveur
[ -e /etc/ntp/step-tickers.default ] || cp /etc/ntp/step-tickers /etc/ntp/step-tickers.default
cat <<EOF > /etc/ntp/step-tickers
0.fr.pool.ntp.org # adapt to your country
1.fr.pool.ntp.org
2.fr.pool.ntp.org
EOF
# Configuration du serveur de temps (sur lui même)
[ -e /etc/ntp.conf.default ] || cp /etc/ntp.conf /etc/ntp.conf.default
cat <<EOF > /etc/ntp.conf
server 0.fr.pool.ntp.org # adapt to your country
server 1.fr.pool.ntp.org
server 2.fr.pool.ntp.org
server 127.127.1.0 # local clock si NTP internet indisponible ...
fudge 127.127.1.0 stratum 10
restrict $PRIVATE_NETWORK mask $PRIVATE_MASK nomodify notrap
restrict 127.0.0.1
driftfile /var/lib/ntp/drift
logfile /var/log/ntp.log
EOF
chown -R ntp:ntp /var/lib/ntp
# Renseignement des fichiers hosts.allow et hosts.deny
[ -e /etc/hosts.allow.default ] || cp /etc/hosts.allow /etc/hosts.allow.default
cat <<EOF > /etc/hosts.allow
ALL: LOCAL, 127.0.0.1, localhost, $PRIVATE_IP
sshd: $PRIVATE_NETWORK_SHORT
ntpd: $PRIVATE_NETWORK_SHORT
EOF
[ -e /etc/host.deny.default ] || cp /etc/hosts.deny /etc/hosts.deny.default
cat <<EOF > /etc/hosts.deny
ALL: ALL: spawn ( /bin/echo "service %d demandé par %c" | /bin/mail -s "Tentative d'accès au service %d par %c REFUSE !!!" security ) &
EOF
} # End of network ()
##################################################################
## Fonction gestion ##
## - installation du centre de gestion ##
## - configuration du serveur web (Apache) ##
## - définition du 1er comptes de gestion ##
## - sécurisation des accès ##
##################################################################
gestion()
{
# Suppression des CGI et des pages WEB installés par défaut
rm -rf /var/www/cgi-bin/*
[ -d $DIR_WEB ] && rm -rf $DIR_WEB
mkdir $DIR_WEB
# Copie et configuration des fichiers du centre de gestion
cp -rf $DIR_INSTALL/web/* $DIR_WEB/
echo "$VERSION du $DATE" > $DIR_WEB/VERSION
$SED "s?99/99/9999?$DATE_SHORT?g" $DIR_ACC/menu.php
$SED "s?\$DB_RADIUS = .*?\$DB_RADIUS = \"$DB_RADIUS\"\;?g" $DIR_ACC/phpsysinfo/includes/xml/portail.php
$SED "s?\$DB_USER = .*?\$DB_USER = \"$DB_USER\"\;?g" $DIR_ACC/phpsysinfo/includes/xml/portail.php
$SED "s?\$radiuspwd = .*?\$radiuspwd = \"$radiuspwd\"\;?g" $DIR_ACC/phpsysinfo/includes/xml/portail.php
$SED "s?^\$private_ip =.*?\$private_ip = \"$PRIVATE_IP\";?g" $DIR_WEB/index.php
$SED "s?\$hostname =.*?\$hostname = \"$HOSTNAME\";?g" $DIR_WEB/index.php
chmod 640 $DIR_ACC/phpsysinfo/includes/xml/portail.php
chown -R apache:apache $DIR_WEB/*
for i in ISO base logs/firewall logs/httpd logs/squid ;
do
[ -d $DIR_SAVE/$i ] || mkdir -p $DIR_SAVE/$i
done
chown -R root:apache $DIR_SAVE
# Configuration et sécurisation php
[ -e /etc/php.ini.default ] || cp /etc/php.ini /etc/php.ini.default
$SED "s?^upload_max_filesize.*?upload_max_filesize = 100M?g" /etc/php.ini
$SED "s?^post_max_size.*?post_max_size = 100M?g" /etc/php.ini
$SED "s?^html_errors.*?html_errors = Off?g" /etc/php.ini
$SED "s?^expose_php.*?expose_php = Off?g" /etc/php.ini
# Configuration et sécurisation Apache
[ -e /etc/httpd/conf/httpd.conf.default ] || cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.default
$SED "s?^#ServerName.*?ServerName $PRIVATE_IP?g" /etc/httpd/conf/httpd.conf
$SED "s?^Listen.*?Listen $PRIVATE_IP:80?g" /etc/httpd/conf/httpd.conf
$SED "s?^ServerTokens.*?ServerTokens Prod?g" /etc/httpd/conf/httpd.conf
$SED "s?^ServerSignature.*?ServerSignature Off?g" /etc/httpd/conf/httpd.conf
$SED "s?^#ErrorDocument 404 /missing.html.*?ErrorDocument 404 /index.html?g" /etc/httpd/conf/httpd.conf
FIC_MOD_SSL=`find /etc/httpd/modules.d/ -type f -name *mod_ssl.conf`
$SED "s?^Listen.*?Listen $PRIVATE_IP:443?g" $FIC_MOD_SSL # On écoute en SSL que sur INTIF
$SED "s?background-color.*?background-color: #EFEFEF; }?g" /var/www/error/include/top.html
[ -e /var/www/error/include/bottom.html.default ] || mv /var/www/error/include/bottom.html /var/www/error/include/bottom.html.default
cat <<EOF > /var/www/error/include/bottom.html
</body>
</html>
EOF
echo "- URL d'accès au centre de gestion : https://$PRIVATE_IP" >> $FIC_PARAM
echo " ou https://alcasar" >> $FIC_PARAM
# Définition du premier compte lié au profil 'admin'
header_install
if [ "$mode" = "install" ]
then
header_install
echo "Pour administrer Alcasar via le centre de gestion WEB, trois profils de comptes ont été définis :"
echo " - le profil 'admin' capable de réaliser toutes les opérations"
echo " - le profil 'backup' lié uniquement aux fonctions d'archivage"
echo " - le profil 'manager' lié uniquement aux fonctions de gestion des usagers"
echo ""
echo "Définissez le premier compte du profil 'admin' :"
echo
echo -n "Nom : "
read admin_portail
echo "- Nom du premier compte lié au profil 'admin' : $admin_portail" >> $FIC_PARAM
# Création du fichier de clés de ce compte dans le profil "admin"
[ -d $DIR_DEST_ETC/digest ] && rm -rf $DIR_DEST_ETC/digest
mkdir -p $DIR_DEST_ETC/digest
chmod 755 $DIR_DEST_ETC/digest
until [ -s $DIR_DEST_ETC/digest/key_admin ]
do
/usr/sbin/htdigest -c $DIR_DEST_ETC/digest/key_admin $HOSTNAME $admin_portail
done
$DIR_DEST_SBIN/alcasar-profil.sh --list
else # version < 2.1
if ([ $MAJ_RUNNING_VERSION -lt 2 ] || ([ $MAJ_RUNNING_VERSION -eq 2 ] && [ $MIN_RUNNING_VERSION -lt 1 ]))
then
echo "Cette mise à jour nécessite de redéfinir le premier compte d'administration du portail"
echo
echo -n "Nom : "
read admin_portail
echo "- Nom du premier compte lié au profil 'admin' : $admin_portail" >> $FIC_PARAM
[ -d $DIR_DEST_ETC/digest ] && rm -rf $DIR_DEST_ETC/digest
mkdir -p $DIR_DEST_ETC/digest
chmod 755 $DIR_DEST_ETC/digest
until [ -s $DIR_DEST_ETC/digest/key_admin ]
do
/usr/sbin/htdigest -c $DIR_DEST_ETC/digest/key_admin $HOSTNAME $admin_portail
done
$DIR_DEST_SBIN/alcasar-profil.sh --list
fi
fi
# synchronisation horaire
ntpd -q -g &
# Sécurisation du centre
rm -f /etc/httpd/conf/webapps.d/*
cat <<EOF > /etc/httpd/conf/webapps.d/alcasar.conf
<Directory $DIR_ACC>
SSLRequireSSL
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.1
Allow from $PRIVATE_NETWORK_MASK
# Allow from $SRC_ADMIN
require valid-user
AuthType digest
AuthName $HOSTNAME
BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On
AuthUserFile $DIR_DEST_ETC/digest/key_all
ErrorDocument 404 https://$PRIVATE_IP/
</Directory>
<Directory $DIR_ACC/admin>
SSLRequireSSL
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.1
Allow from $PRIVATE_NETWORK_MASK
# Allow from $SRC_ADMIN
require valid-user
AuthType digest
AuthName $HOSTNAME
BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On
AuthUserFile $DIR_DEST_ETC/digest/key_admin
ErrorDocument 404 https://$PRIVATE_IP/
</Directory>
<Directory $DIR_ACC/manager>
SSLRequireSSL
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.1
Allow from $PRIVATE_NETWORK_MASK
# Allow from $SRC_ADMIN
require valid-user
AuthType digest
AuthName $HOSTNAME
BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On
AuthUserFile $DIR_DEST_ETC/digest/key_manager
ErrorDocument 404 https://$PRIVATE_IP/
</Directory>
<Directory $DIR_ACC/backup>
SSLRequireSSL
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.1
Allow from $PRIVATE_NETWORK_MASK
# Allow from $SRC_ADMIN
require valid-user
AuthType digest
AuthName $HOSTNAME
BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On
AuthUserFile $DIR_DEST_ETC/digest/key_backup
ErrorDocument 404 https://$PRIVATE_IP/
</Directory>
Alias /save/ "$DIR_SAVE/"
<Directory $DIR_SAVE>
SSLRequireSSL
Options Indexes
Order deny,allow
Deny from all
Allow from 127.0.0.1
Allow from $PRIVATE_NETWORK_MASK
# Allow from $SRC_ADMIN
require valid-user
AuthType digest
AuthName $HOSTNAME
AuthUserFile $DIR_DEST_ETC/digest/key_backup
ErrorDocument 404 https://$PRIVATE_IP/
ReadmeName /readmeSave.html
</Directory>
EOF
} # End of gestion ()
##########################################################################################
## Fonction AC() ##
## - Création d'une Autorité de Certification et du certificat serveur pour apache ##
##########################################################################################
AC ()
{
$SED "s?ifcfg-eth.?ifcfg-$INTIF?g" $DIR_DEST_BIN/alcasar-CA.sh
$DIR_DEST_BIN/alcasar-CA.sh
FIC_VIRTUAL_SSL=`find /etc/httpd/conf -type f -name *default_ssl*`
[ -e /etc/httpd/conf/vhosts-ssl.default ] || cp $FIC_VIRTUAL_SSL /etc/httpd/conf/vhosts-ssl.default
$SED "s?localhost.crt?alcasar.crt?g" $FIC_VIRTUAL_SSL
$SED "s?localhost.key?alcasar.key?g" $FIC_VIRTUAL_SSL
chown -R root:apache /etc/pki
chmod -R 750 /etc/pki
} # End AC ()
##########################################################################################
## Fonction init_db() ##
## - Initialisation de la base Mysql ##
## - Affectation du mot de passe de l'administrateur (root) ##
## - Suppression des bases et des utilisateurs superflus ##
## - Création de la base 'radius' ##
## - Installation du schéma de cette base ##
## - Import des tables de comptabilité (mtotacct, totacct) et info_usagers (userinfo) ##
## ces table proviennent de 'dialupadmin' (paquetage freeradius-web) ##
##########################################################################################
init_db ()
{
mkdir -p /var/lib/mysql/.tmp
chown mysql:mysql /var/lib/mysql/.tmp
[ -e /etc/my.cnf.rpmnew ] && mv /etc/my.cnf.rpmnew /etc/my.cnf # prend en compte les migrations de MySQL
[ -e /etc/my.cnf.default ] || cp /etc/my.cnf /etc/my.cnf.default
$SED "s?^#bind-address.*?bind-address=127.0.0.1?g" /etc/my.cnf
/etc/init.d/mysqld start
sleep 4
mysqladmin -u root password $mysqlpwd
MYSQL="/usr/bin/mysql -uroot -p$mysqlpwd --exec"
# On supprime les tables d'exemple
$MYSQL="DROP DATABASE IF EXISTS test;DROP DATABASE IF EXISTS tmp;CONNECT mysql;DELETE from user where user='';FLUSH PRIVILEGES;"
# On crée la base 'radius'
$MYSQL="CREATE DATABASE IF NOT EXISTS $DB_RADIUS;GRANT ALL ON $DB_RADIUS.* TO $DB_USER@localhost IDENTIFIED BY '$radiuspwd';FLUSH PRIVILEGES"
# Ajout d'une base vierge
mysql -u$DB_USER -p$radiuspwd $DB_RADIUS < $DIR_CONF/radiusd-db-vierge.sql
} # End init_db ()
##########################################################################
## Fonction param_radius ##
## - Paramètrage des fichiers de configuration FreeRadius ##
## - Affectation du secret partagé entre coova-chilli et freeradius ##
## - Modification de fichier de conf pour l'accès à Mysql ##
##########################################################################
param_radius ()
{
cp -f $DIR_CONF/radiusd-db-vierge.sql /etc/raddb/
chown -R radius:radius /etc/raddb
[ -e /etc/raddb/radiusd.conf.default ] || cp /etc/raddb/radiusd.conf /etc/raddb/radiusd.conf.default
# paramètrage radius.conf
$SED "s?^[\t ]*#[\t ]*user =.*?user = radius?g" /etc/raddb/radiusd.conf
$SED "s?^[\t ]*#[\t ]*group =.*?group = radius?g" /etc/raddb/radiusd.conf
$SED "s?^[\t ]*status_server =.*?status_server = no?g" /etc/raddb/radiusd.conf
# suppression de la fonction proxy
$SED "s?^[\t ]*proxy_requests.*?proxy_requests = no?g" /etc/raddb/radiusd.conf
$SED "s?^[\t ]*\$INCLUDE proxy.conf.*?#\$INCLUDE proxy.conf?g" /etc/raddb/radiusd.conf
# écoute sur loopback uniquement (à modifier plus tard pour l'EAP)
$SED "s?^[\t ]*ipaddr =.*?ipaddr = 127.0.0.1?g" /etc/raddb/radiusd.conf
# prise en compte du module SQL et des compteurs SQL
$SED "s?^[\t ]*#[\t ]*\$INCLUDE sql.conf.*?\$INCLUDE sql.conf?g" /etc/raddb/radiusd.conf
$SED "s?^[\t ]*#[\t ]*\$INCLUDE sql/mysql/counter.conf?\$INCLUDE sql/mysql/counter.conf?g" /etc/raddb/radiusd.conf
$SED "s?^[\t ]*\$INCLUDE policy.conf?#\$INCLUDE policy.conf?g" /etc/raddb/radiusd.conf
# purge du répertoire des serveurs virtuels et copie du fichier de configuration d'Alcasar
rm -f /etc/raddb/sites-enabled/*
cp $DIR_CONF/alcasar-radius /etc/raddb/sites-available/alcasar
chown radius:apache /etc/raddb/sites-available/alcasar /etc/raddb/modules/ldap # droits rw pour apache (module ldap)
chmod 660 /etc/raddb/sites-available/alcasar /etc/raddb/modules/ldap
chgrp apache /etc/raddb /etc/raddb/sites-available /etc/raddb/modules
ln -s /etc/raddb/sites-available/alcasar /etc/raddb/sites-enabled/alcasar
# Inutile dans notre fonctionnement mais les liens sont recréés par un update de radius ... donc forcé en tant que fichier à 'vide'
touch /etc/raddb/sites-enabled/{inner-tunnel,control-socket,default}
# configuration du fichier client.conf (127.0.0.1 suffit mais on laisse le deuxième client pour la future gestion de l'EAP)
[ -e /etc/raddb/clients.conf.default ] || cp -f /etc/raddb/clients.conf /etc/raddb/clients.conf.default
cat << EOF > /etc/raddb/clients.conf
client 127.0.0.1 {
secret = $secretradius
shortname = localhost
}
EOF
# modif sql.conf
[ -e /etc/raddb/sql.conf.default ] || cp /etc/raddb/sql.conf /etc/raddb/sql.conf.default
$SED "s?^[\t ]*login =.*?login = \"$DB_USER\"?g" /etc/raddb/sql.conf
$SED "s?^[\t ]*password =.*?password = \"$radiuspwd\"?g" /etc/raddb/sql.conf
$SED "s?^[\t ]*radius_db =.*?radius_db = \"$DB_RADIUS\"?g" /etc/raddb/sql.conf
$SED "s?^[\t ]*sqltrace =.*?sqltrace = no?g" /etc/raddb/sql.conf
# modif dialup.conf
[ -e /etc/raddb/sql/mysql/dialup.conf.default ] || cp /etc/raddb/sql/mysql/dialup.conf /etc/raddb/sql/mysql/dialup.conf.default
cp -f $DIR_CONF/dialup.conf /etc/raddb/sql/mysql/dialup.conf
} # End param_radius ()
##########################################################################
## Fonction param_web_radius ##
## - Import, modification et paramètrage de l'interface "dialupadmin" ##
## - Création du lien vers la page de changement de mot de passe ##
##########################################################################
param_web_radius ()
{
# copie de l'interface d'origine dans la structure Alcasar
[ -d /usr/share/freeradius-web ] && cp -rf /usr/share/freeradius-web/* $DIR_ACC/manager/
rm -f $DIR_ACC/manager/index.html $DIR_ACC/manager/readme
rm -f $DIR_ACC/manager/htdocs/about.html $DIR_ACC/manager/htdocs/index.html $DIR_ACC/manager/htdocs/content.html
# copie des fichiers modifiés
cp -rf $DIR_INSTALL/web/acc/manager/* $DIR_ACC/manager/
chown -R apache:apache $DIR_ACC/manager/
# Modification des fichiers de configuration
[ -e /etc/freeradius-web/admin.conf.default ] || cp /etc/freeradius-web/admin.conf /etc/freeradius-web/admin.conf.default
$SED "s?^general_domain:.*?general_domain: $DOMAIN?g" /etc/freeradius-web/admin.conf
$SED "s?^sql_username:.*?sql_username: $DB_USER?g" /etc/freeradius-web/admin.conf
$SED "s?^sql_password:.*?sql_password: $radiuspwd?g" /etc/freeradius-web/admin.conf
$SED "s?^sql_debug:.*?sql_debug: false?g" /etc/freeradius-web/admin.conf
$SED "s?^sql_usergroup_table: .*?sql_usergroup_table: radusergroup?g" /etc/freeradius-web/admin.conf
$SED "s?^sql_password_attribute:.*?sql_password_attribute: Crypt-Password?g" /etc/freeradius-web/admin.conf
$SED "s?^general_finger_type.*?# general_finger_type: snmp?g" /etc/freeradius-web/admin.conf
$SED "s?^general_stats_use_totacct.*?general_stats_use_totacct: yes?g" /etc/freeradius-web/admin.conf
[ -e /etc/freeradius-web/config.php.default ] || cp /etc/freeradius-web/config.php /etc/freeradius-web/config.php.default
cp -f $DIR_CONF/freeradiusweb-config.php /etc/freeradius-web/config.php
cat <<EOF > /etc/freeradius-web/naslist.conf
nas1_name: alcasar.%{general_domain}
nas1_model: Portail captif
nas1_ip: $PRIVATE_IP
nas1_port_num: 0
nas1_community: public
EOF
# Modification des attributs visibles lors de la création d'un usager ou d'un groupe
[ -e /etc/freeradius-web/user_edit.attrs.default ] || mv /etc/freeradius-web/user_edit.attrs /etc/freeradius-web/user_edit.attrs.default
cp -f $DIR_CONF/user_edit.attrs /etc/freeradius-web/user_edit.attrs
# Ajout du mappage des attributs chillispot
[ -e /etc/freeradius-web/sql.attrmap.default ] || mv /etc/freeradius-web/sql.attrmap /etc/freeradius-web/sql.attrmap.default
cp -f $DIR_CONF/sql.attrmap /etc/freeradius-web/sql.attrmap
# Modification des attributs visibles sur les pages des statistiques (suppression NAS_IP et NAS_port)
[ -e /etc/freeradius-web/sql.attrs.default ] || cp /etc/freeradius-web/sql.attrs /etc/freeradius-web/user_edit.attrs.default
$SED "s?^NASIPAddress.*?NASIPAddress\tNas IP Address\tno?g" /etc/freeradius-web/sql.attrs
$SED "s?^NASPortId.*?NASPortId\tNas Port\tno?g" /etc/freeradius-web/sql.attrs
chown -R apache:apache /etc/freeradius-web
# Ajout de l'alias vers la page de "changement de mot de passe usager"
cat <<EOF >> /etc/httpd/conf/webapps.d/alcasar.conf
<Directory $DIR_WEB/pass>
SSLRequireSSL
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.1
Allow from $PRIVATE_NETWORK_MASK
ErrorDocument 404 https://$PRIVATE_IP
</Directory>
EOF
echo "- URL pour le changement du mot de passe usager : https://$PRIVATE_IP/pass/" >> $FIC_PARAM
} # End of param_web_radius ()
##########################################################################################
## Fonction param_chilli ##
## - Paramètrage du fichier d'initialisation et de configuration de coova-chilli ##
## - Paramètrage de la page d'authentification (intercept.php) ##
##########################################################################################
param_chilli ()
{
# modification du fichier d'initialisation
[ -e /etc/init.d/chilli.default ] || cp /etc/init.d/chilli /etc/init.d/chilli.default
# configuration d'eth1 (utile pour dnsmasq))
$SED "s?ifconfig.*?ifconfig \$HS_LANIF $PRIVATE_IP?g" /etc/init.d/chilli
# ajout de la fonction 'status' (utile pour la gestion du process)
$SED "/^.*functions/i. /etc/init.d/functions" /etc/init.d/chilli
$SED "/^[\t ]*stop)/i\ status)\n status chilli\n RETVAL=$?\n ;;\n" /etc/init.d/chilli
# insertion d'une tempo sur le 'restart' pour permettre à tun0 d'être libérée
$SED "/^[\t ]*\$0 start/i\ sleep 2" /etc/init.d/chilli
# suppression des fonctions 'writeconfig' et 'radiusconfig'
$SED "/writeconfig/d" /etc/init.d/chilli
$SED "/radiusconfig/d" /etc/init.d/chilli
# suppression de warning disgracieux
$SED "s?which start-stop-daemon?which start-stop-daemon 2>/dev/null?g" /etc/init.d/chilli
# création du fichier de conf
[ -e /etc/chilli.conf.default ] || cp /etc/chilli.conf /etc/chilli.conf.default
cat <<EOF > /etc/chilli.conf
# coova config for ALCASAR
cmdsocket /var/run/chilli.sock
unixipc chilli.eth1.ipc
pidfile /var/run/chilli.eth1.pid
net $PRIVATE_NETWORK_MASK
dynip $PRIVATE_DYN_IP
statip $PRIVATE_STAT_IP
domain localdomain
dns1 $PRIVATE_IP
dns2 $PRIVATE_IP
uamlisten $PRIVATE_IP
uamport 3990
dhcpif $INTIF
ethers $DIR_DEST_ETC/alcasar-ethers
uamanyip
macallowlocal
locationname $HOSTNAME
radiusserver1 127.0.0.1
radiusserver2 127.0.0.1
radiussecret $secretradius
radiusauthport 1812
radiusacctport 1813
uamserver https://$HOSTNAME/intercept.php
radiusnasid $HOSTNAME
papalwaysok
uamsecret $secretuam
coaport 3799
include $DIR_DEST_ETC/alcasar-uamallowed
include $DIR_DEST_ETC/alcasar-uamdomain
include $DIR_DEST_ETC/alcasar-macallowed
EOF
# Pour la fonctionnalité de DHCP statique, le fichier alcasar-ethers a été copié précédemment dans /usr/local/etc
# création des fichiers de sites, d'urls et d'adresses MAC de confiance
echo -e "uamallowed=\"\"" > $DIR_DEST_ETC/alcasar-uamallowed
echo -e "uamdomain=\"\"" > $DIR_DEST_ETC/alcasar-uamdomain
touch $DIR_DEST_ETC/alcasar-macallowed
chown root:apache $DIR_DEST_ETC/alcasar-*
chmod 660 $DIR_DEST_ETC/alcasar-*
echo "- URL de deconnexion du portail : http://alcasar:3990/logoff" >> $FIC_PARAM
# Configuration des fichier WEB d'interception (secret partagé avec coova-chilli et nom d'organisme)
$SED "s?^\$uamsecret =.*?\$uamsecret = \"$secretuam\";?g" $DIR_WEB/intercept.php $DIR_WEB/intercept.php.old
$SED "s?^\$userpassword=1.*?\$userpassword=1;?g" $DIR_WEB/intercept.php $DIR_WEB/intercept.php.old
$SED "s?^\$organisme = .*?\$organisme = \"$ORGANISME\";?g" $DIR_WEB/intercept.php $DIR_WEB/intercept.php.old $DIR_WEB/status.php
} # End of param_chilli ()
##########################################################
## Fonction param_squid ##
## - Paramètrage du proxy 'squid' en mode 'cache' ##
## - Initialisation de la base de données ##
##########################################################
param_squid ()
{
# paramètrage de Squid (connecté en série derrière Dansguardian)
[ -e /etc/squid/squid.conf.default ] || cp /etc/squid/squid.conf /etc/squid/squid.conf.default
# suppression des références 'localnet', 'icp', 'htcp' et 'always_direct'
$SED "/^acl localnet/d" /etc/squid/squid.conf
$SED "/^icp_access allow localnet/d" /etc/squid/squid.conf
$SED "/^icp_port 3130/d" /etc/squid/squid.conf
$SED "/^http_access allow localnet/d" /etc/squid/squid.conf
$SED "/^htcp_access allow localnet/d" /etc/squid/squid.conf
$SED "/^always_direct allow localnet/d" /etc/squid/squid.conf
# mode 'proxy transparent local'
$SED "s?^http_port.*?http_port 127.0.0.1:$SQUID_PORT transparent?g" /etc/squid/squid.conf
# emplacement et formatage standard des logs
echo '#logformat common %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %>Hs %<st %Ss:%Sh' >> /etc/squid/squid.conf
echo '#logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %>Hs %<st "%{Referer}>h" "%{User-Ag' >> /etc/squid/squid.conf
echo "access_log /var/log/squid/access.log" >> /etc/squid/squid.conf
# compatibilité des logs avec awstats
echo "emulate_httpd_log on" >> /etc/squid/squid.conf
# pour éviter les message d'erreur lors des changement d'état des interfaces réseaux
$SED "s?^SQUID_AUTO_RELOAD.*?SQUID_AUTO_RELOAD=no?g" /etc/sysconfig/squid
# Initialisation du cache de Squid
/usr/sbin/squid -z
} # End of param_squid ()
##################################################################
## Fonction param_dansguardian ##
## - Paramètrage du gestionnaire de contenu Dansguardian ##
## - Copie de la blacklist de toulouse ##
##################################################################
param_dansguardian ()
{
DIR_DG="/etc/dansguardian"
mkdir /var/dansguardian
chown dansguardian /var/dansguardian
[ -e $DIR_DG/dansguardian.conf.default ] || cp $DIR_DG/dansguardian.conf $DIR_DG/dansguardian.conf.default
# Le filtrage est désactivé par défaut
$SED "s/^reportinglevel =.*/reportinglevel = -1/g" $DIR_DG/dansguardian.conf
# la page d'interception est en français
$SED "s?^language =.*?language = french?g" $DIR_DG/dansguardian.conf
# on limite l'écoute de Dansguardian côté LAN
$SED "s?^filterip.*?filterip = $PRIVATE_IP?g" $DIR_DG/dansguardian.conf
# on chaîne Dansguardian au proxy antivirus HAVP
$SED "s?^proxyport.*?proxyport = 8090?g" $DIR_DG/dansguardian.conf
# on remplace la page d'interception (template)
cp -f $DIR_CONF/template.html /usr/share/dansguardian/languages/ukenglish/
cp -f $DIR_CONF/template-fr.html /usr/share/dansguardian/languages/french/template.html
# on ne loggue que les deny (pour le reste, on a squid)
$SED "s?^loglevel =.*?loglevel = 1?g" $DIR_DG/dansguardian.conf
# on désactive par défaut le controle de contenu des pages html
$SED "s?^weightedphrasemode =.*?weightedphrasemode = 0?g" $DIR_DG/dansguardian.conf
cp $DIR_DG/lists/bannedphraselist $DIR_DG/lists/bannedphraselist.default
$SED "s?^[^#]?#&?g" $DIR_DG/lists/bannedphraselist # (on commente ce qui ne l'est pas)
# on désactive par défaut le contrôle d'URL par expressions régulières
cp $DIR_DG/lists/bannedregexpurllist $DIR_DG/lists/bannedregexpurllist.default
$SED "s?^[^#]?#&?g" $DIR_DG/lists/bannedregexpurllist # (on commente ce qui ne l'est pas)
# on désactive par défaut le contrôle de téléchargement de fichiers
[ -e $DIR_DG/dansguardianf1.conf.default ] || cp $DIR_DG/dansguardianf1.conf $DIR_DG/dansguardianf1.conf.default
$SED "s?^blockdownloads =.*?blockdownloads = off?g" $DIR_DG/dansguardianf1.conf
[ -e $DIR_DG/lists/bannedextensionlist.default ] || mv $DIR_DG/lists/bannedextensionlist $DIR_DG/lists/bannedextensionlist.default
[ -e $DIR_DG/lists/bannedmimetypelist.default ] || mv $DIR_DG/lists/bannedmimetypelist $DIR_DG/lists/bannedmimetypelist.default
touch $DIR_DG/lists/bannedextensionlist
touch $DIR_DG/lists/bannedmimetypelist
# 'Safesearch' regex actualisation
$SED "s?images?search?g" $DIR_DG/lists/urlregexplist
# empty LAN IP list that won't be WEB filtered
[ -e $DIR_DG/lists/exceptioniplist.default ] || mv $DIR_DG/lists/exceptioniplist $DIR_DG/lists/exceptioniplist.default
touch $DIR_DG/lists/exceptioniplist
# Keep a copy of URL & domain filter configuration files
[ -e $DIR_DG/lists/bannedsitelist.default ] || mv $DIR_DG/lists/bannedsitelist $DIR_DG/lists/bannedsitelist.default
[ -e $DIR_DG/lists/bannedurllist.default ] || mv $DIR_DG/lists/bannedurllist $DIR_DG/lists/bannedurllist.default
} # End of param_dansguardian ()
##################################################################
## Fonction antivirus ##
## - configuration havp + libclamav ##
##################################################################
antivirus ()
{
# création de l'usager 'havp'
havp_exist=`grep havp /etc/passwd|wc -l`
if [ "$havp_exist" == "1" ]
then
userdel -r havp 2>/dev/null
fi
groupadd -f havp
useradd -M -g havp havp
mkdir -p /var/tmp/havp /var/log/havp
chown -R havp /var/tmp/havp /var/log/havp /var/run/havp
$SED "/$HAVP_BIN -c $HAVP_CONFIG/i chown -R havp:havp \/var\/tmp\/havp" /etc/init.d/havp
# configuration d'HAVP
[ -e /etc/havp/havp.config.default ] || cp /etc/havp/havp.config /etc/havp/havp.config.default
$SED "/^REMOVETHISLINE/d" /etc/havp/havp.config
$SED "s?^# PARENTPROXY.*?PARENTPROXY 127.0.0.1?g" /etc/havp/havp.config
$SED "s?^# PARENTPORT.*?PARENTPORT 3128?g" /etc/havp/havp.config
$SED "s?^# PORT.*?PORT 8090?g" /etc/havp/havp.config
$SED "s?^# BIND_ADDRESS.*?BIND_ADDRESS 127.0.0.1?g" /etc/havp/havp.config
$SED "s?^ENABLECLAMLIB.*?ENABLECLAMLIB true?g" /etc/havp/havp.config
$SED "s?^# LOG_OKS.*?LOG_OKS false?g" /etc/havp/havp.config
# remplacement du fichier d'initialisation
[ -e /etc/init.d/havp.default ] || cp /etc/init.d/havp /etc/init.d/havp.default
cp -f $DIR_CONF/havp-init /etc/init.d/havp
# on remplace la page d'interception (template)
cp -f $DIR_CONF/virus-fr.html /etc/havp/templates/fr/virus.html
cp -f $DIR_CONF/virus-en.html /etc/havp/templates/en/virus.html
# automatisation de la mise à jour de la base antivirale (toutes les 2 heures)
$SED "s?^Checks.*?Checks 12?g" /etc/freshclam.conf
$SED "s?^NotifyClamd.*?# NotifyClamd /etc/clamd.conf?g" /etc/freshclam.conf
}
##################################################################################
## Fonction firewall ##
## - adaptation des scripts du parefeu ##
## - mise en place des règles et sauvegarde pour un lancement automatique ##
##################################################################################
firewall ()
{
$SED "s?^EXTIF=.*?EXTIF=\"$EXTIF\"?g" $DIR_DEST_BIN/alcasar-iptables.sh $DIR_DEST_BIN/alcasar-iptables-bypass.sh
$SED "s?^INTIF=.*?INTIF=\"$INTIF\"?g" $DIR_DEST_BIN/alcasar-iptables.sh $DIR_DEST_BIN/alcasar-iptables-bypass.sh
$SED "s?^PRIVATE_NETWORK_MASK=.*?PRIVATE_NETWORK_MASK=\"$PRIVATE_NETWORK_MASK\"?g" $DIR_DEST_BIN/alcasar-iptables.sh $DIR_DEST_BIN/alcasar-iptables-bypass.sh
$SED "s?^PRIVATE_IP=.*?PRIVATE_IP=\"$PRIVATE_IP\"?g" $DIR_DEST_BIN/alcasar-iptables.sh $DIR_DEST_BIN/alcasar-iptables-bypass.sh
$SED "s?^DNSSERVERS=.*?DNSSERVERS=\"$DNS1,$DNS2\"?g" $DIR_DEST_BIN/alcasar-iptables.sh
chmod o+r $DIR_DEST_BIN/alcasar-iptables.sh #lecture possible pour apache (interface php du filtrage réseau)
# création du fichier d'exception au filtrage
touch $DIR_DEST_ETC/alcasar-filter-exceptions
# le script $DIR_DEST_BIN/alcasar-iptables.sh est lancé à la fin (pour ne pas perturber une mise à jour via ssh)
} # End of firewall ()
##################################################################################
## param_ulogd function ##
## - Ulog config for multi-log files ##
##################################################################################
param_ulogd ()
{
# Three instances of ulogd (three different logfiles)
[ -d /var/log/firewall ] || mkdir -p /var/log/firewall
nl=1
for log_type in tracability ssh ext-access
do
[ -e /var/log/firewall/$log_type.log ] || touch /var/log/firewall/$log_type.log
cp -f /etc/ulogd.conf /etc/ulogd-$log_type.conf
$SED "s?^nlgroup=.*?nlgroup=$nl?g" /etc/ulogd-$log_type.conf
$SED '/OPRINT/,$d' /etc/ulogd-$log_type.conf
cat << EOF >> /etc/ulogd-$log_type.conf
[LOGEMU]
file="/var/log/firewall/$log_type.log"
sync=1
EOF
nl=`expr $nl + 1`
done
chown -R root:apache /var/log/firewall
chmod 750 /var/log/firewall
chmod 640 /var/log/firewall/*
[ -e /etc/init.d/ulogd.default ] || cp /etc/init.d/ulogd /etc/init.d/ulogd.default
cp -f $DIR_CONF/ulogd-init /etc/init.d/ulogd
} # End of param_ulogd ()
##################################################################################
## Fonction param_awstats ##
## - configuration de l'interface des logs de consultation WEB (AWSTAT) ##
##################################################################################
param_awstats()
{
cp -rf /usr/share/awstats/www/ $DIR_ACC/awstats/
chown -R apache:apache $DIR_ACC/awstats
cp /etc/awstats/awstats.conf /etc/awstats/awstats.conf.default
$SED "s?^LogFile=.*?LogFile=\"/var/log/squid/access.log\"?g" /etc/awstats/awstats.conf
$SED "s?^LogFormat=.*?LogFormat=4?g" /etc/awstats/awstats.conf
$SED "s?^SiteDomain=.*?SiteDomain=\"$HOSTNAME\"?g" /etc/awstats/awstats.conf
$SED "s?^HostAliases=.*?HostAliases=\"$PRIVATE_IP\"?g" /etc/awstats/awstats.conf
$SED "s?^DNSLookup=.*?DNSLookup=0?g" /etc/awstats/awstats.conf
$SED "s?^DirData=.*?DirData=\"/var/lib/awstats\"?g" /etc/awstats/awstats.conf
$SED "s?^DirIcons=.*?DirIcons=\"/acc/awstats/icon\"?g" /etc/awstats/awstats.conf
$SED "s?^StyleSheet=.*?StyleSheet=\"/css/style.css\"?g" /etc/awstats/awstats.conf
$SED "s?^BuildReportFormat=.*?BuildReportFormat=xhtml?g" /etc/awstats/awstats.conf
$SED "s?^UseFramesWhenCGI=.*?UseFramesWhenCGI=0?g" /etc/awstats/awstats.conf
cat <<EOF >> /etc/httpd/conf/webapps.d/alcasar.conf
<Directory $DIR_ACC/awstats>
SSLRequireSSL
Options ExecCGI
AddHandler cgi-script .pl
DirectoryIndex awstats.pl
Order deny,allow
Deny from all
Allow from 127.0.0.1
Allow from $PRIVATE_NETWORK_MASK
require valid-user
AuthType digest
AuthName $HOSTNAME
BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On
AuthUserFile $DIR_DEST_ETC/digest/key_admin
ErrorDocument 404 https://$PRIVATE_IP/
</Directory>
SetEnv PERL5LIB /usr/share/awstats/lib:/usr/share/awstats/plugins
EOF
} # End of param_awstats ()
##########################################################
## Fonction param_dnsmasq ##
##########################################################
param_dnsmasq ()
{
[ -d /var/log/dnsmasq ] || mkdir /var/log/dnsmasq
$SED "s?^DHCP_LEASE=.*?DHCP_LEASE=/var/log/dnsmasq/lease.log?g" /etc/sysconfig/dnsmasq # fichier contenant les baux
[ -e /etc/dnsmasq.conf.default ] || cp /etc/dnsmasq.conf /etc/dnsmasq.conf.default
# 1st dnsmasq listen on udp 53 ("dnsmasq - forward"). It's used as dhcp server only if bypass is on.
cat << EOF > /etc/dnsmasq.conf
# Configuration file for "dnsmasq in forward mode"
conf-file=$DIR_DEST_ETC/alcasar-dns-name # zone de definition de noms DNS locaux
listen-address=$PRIVATE_IP
listen-address=127.0.0.1
no-dhcp-interface=$INTIF
bind-interfaces
cache-size=256
domain=$DOMAIN
domain-needed
expand-hosts
bogus-priv
filterwin2k
server=$DNS1
server=$DNS2
# le servive DHCP est configuré mais n'est exploité que pour le "bypass"
dhcp-range=$PRIVATE_DYN_FIRST_IP,$PRIVATE_DYN_LAST_IP,$PRIVATE_MASK,12h
#dhcp-option=3,1.2.3.4
#dhcp-option=option:router,1.2.3.4
#dhcp-option=42,0.0.0.0
#dhcp-option=option:ntp-server,192.168.0.4,10.10.0.5
# Exemple de configuration statique : <@MAC>,<name>,<@IP>,<MASK>,<ttl bail>
#dhcp-host=11:22:33:44:55:66,ssic-test,192.168.182.20,255.255.255.0,45m
EOF
# 2nd dnsmasq listen on udp 54 ("dnsmasq with blackhole")
cat << EOF > /etc/dnsmasq-blackhole.conf
# Configuration file for "dnsmasq with blackhole"
# Inclusion de la blacklist <domains> de Toulouse dans la configuration
conf-dir=$DIR_DEST_ETC/alcasar-dnsfilter-enabled
conf-file=$DIR_DEST_ETC/alcasar-dns-name # zone de definition de noms DNS locaux
listen-address=$PRIVATE_IP
port=54
no-dhcp-interface=$INTIF
bind-interfaces
cache-size=256
domain=$DOMAIN
domain-needed
expand-hosts
bogus-priv
filterwin2k
server=$DNS1
server=$DNS2
EOF
# On crée le fichier de résolution locale
cat << EOF > $DIR_DEST_ETC/alcasar-dns-name
# Here you can define your local domain name
# use the /etc/hosts file to define your hosts name
local=/$DOMAIN/
EOF
# On modifie le fichier d'initialisattion (lancement et arret de la deuxième instance)
[ -e /etc/init.d/dnsmasq.default ] || cp /etc/init.d/dnsmasq /etc/init.d/dnsmasq.default
$SED "/daemon/a \$dnsmasq -C /etc/dnsmasq-blackhole.conf \$OPTIONS" /etc/init.d/dnsmasq
$SED "/killproc \$DAEMON_NAME/a killproc \$DAEMON_NAME" /etc/init.d/dnsmasq
} # End dnsmasq
##########################################################
## Fonction BL (BlackList) ##
##########################################################
BL ()
{
# on copie par défaut la BL de toulouse embarqués dans l'archive d'ALCASAR
rm -rf /etc/dansguardian/lists/blacklists
tar zxf $DIR_CONF/blacklists.tar.gz --directory=/etc/dansguardian/lists/ 2>&1 >/dev/null
cp -f $DIR_CONF/VERSION-BL $DIR_ACC/
chown apache:apache $DIR_ACC/VERSION-BL
# on crée le répertoire de la BL secondaire
mkdir /etc/dansguardian/lists/blacklists/ossi
touch /etc/dansguardian/lists/blacklists/ossi/domains
touch /etc/dansguardian/lists/blacklists/ossi/urls
# On crée les fichiers vides de sites ou d'URL réhabilités
[ -e /etc/dansguardian/lists/exceptionsitelist.default ] || mv /etc/dansguardian/lists/exceptionsitelist /etc/dansguardian/lists/exceptionsitelist.default
[ -e /etc/dansguardian/lists/exceptionurllist.default ] || mv /etc/dansguardian/lists/exceptionurllist /etc/dansguardian/lists/exceptionurllist.default
touch /etc/dansguardian/lists/exceptionsitelist
touch /etc/dansguardian/lists/exceptionurllist
# On crée la configuration de base du filtrage de domaine et d'URL pour Dansguardian
cat <<EOF > /etc/dansguardian/lists/bannedurllist
# Dansguardian filter config for ALCASAR
EOF
cat <<EOF > /etc/dansguardian/lists/bannedsitelist
# Dansguardian domain filter config for ALCASAR
# block all sites except those in the exceptionsitelist --> liste blanche (désactivée)
#**
# block all SSL and CONNECT tunnels
**s
# block all SSL and CONNECT tunnels specified only as an IP
*ips
# block all sites specified only by an IP
*ip
EOF
chown -R dansguardian:apache /etc/dansguardian/
chmod -R g+rw /etc/dansguardian
# On crée la structure du DNS-blackhole :
mkdir $DIR_DEST_ETC/{alcasar-dnsfilter-available,alcasar-dnsfilter-enabled}
chown -R 770 $DIR_DEST_ETC/{alcasar-dnsfilter-available,alcasar-dnsfilter-enabled}
chown -R root:apache $DIR_DEST_ETC/{alcasar-dnsfilter-available,alcasar-dnsfilter-enabled}
# On fait pointer le black-hole sur une page interne
$SED "s?^IP_RETOUR=.*?IP_RETOUR=\"$PRIVATE_IP\"?g" $DIR_DEST_SBIN/alcasar-bl.sh
# On récupère la dernière version de la BL Toulouse
$DIR_DEST_SBIN/alcasar-bl.sh --download
}
##########################################################
## Fonction cron ##
## - Mise en place des différents fichiers de cron ##
##########################################################
cron ()
{
# Modif du fichier 'crontab' pour passer les cron à minuit au lieu de 04h00
[ -e /etc/crontab.default ] || cp /etc/crontab /etc/crontab.default
cat <<EOF > /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root nice -n 19 run-parts --report /etc/cron.hourly
02 0 * * * root nice -n 19 run-parts --report /etc/cron.daily
22 0 * * 0 root nice -n 19 run-parts --report /etc/cron.weekly
42 0 1 * * root nice -n 19 run-parts --report /etc/cron.monthly
EOF
[ -e /etc/anacrontab.default ] || cp /etc/anacrontab /etc/anacrontab.default
cat <<EOF >> /etc/anacrontab
7 10 cron.logExport nice /etc/cron.d/export_log
7 15 cron.logClean nice /etc/cron.d/clean_log
7 20 cron.importClean nice /etc/cron.d/clean_import
EOF
# suppression des fichiers de logs de plus d'un an (tous les lundi à 4h30)
cat <<EOF > /etc/cron.d/clean_log
30 4 * * 1 root $DIR_DEST_BIN/alcasar-log-clean.sh
EOF
# export de la base des usagers (tous les lundi à 4h45)
cat <<EOF > /etc/cron.d/mysql
45 4 * * 1 root $DIR_DEST_SBIN/alcasar-mysql.sh -dump
EOF
# export des log squid, firewall et apache (tous les lundi à 5h00)
cat <<EOF > /etc/cron.d/export_log
#!/bin/sh
00 5 * * 1 root $DIR_DEST_BIN/alcasar-log-export.sh
EOF
# mise à jour des stats de consultation WEB toutes les 30' ## existe en double pour le daily sans l'@IP
# sans mèl ( > /dev/null 2>&1)
cat << EOF > /etc/cron.d/awstats
*/30 * * * * root $DIR_ACC/awstats/awstats.pl -config=localhost -update >/dev/null 2>&1
EOF
# suppression des fichiers de mots de passe lors d'imports massifs par fichier de plus de 24h
cat << EOF > /etc/cron.d/clean_import
30 * * * * root $DIR_DEST_BIN/alcasar-import-clean.sh
EOF
# mise à jour des stats de connexion (accounting). Scripts provenant de "dialupadmin" (rpm freeradius-web) (cf. wiki.freeradius.org/Dialup_admin).
# on écrase le crontab d'origine installé par le RPM "freeradius-web" (bug remonté à qa.mandriva.com : 46739).
# 'tot_stats' (tout les jours à 01h01) : aggrégat des connexions journalières par usager (renseigne la table 'totacct')
# 'monthly_tot_stat' (tous les jours à 01h05) : aggrégat des connexions mensuelles par usager (renseigne la table 'mtotacct')
# 'truncate_raddact' (tous les 1er du mois à 01h10) : supprime les entrées journalisées plus vieilles que '$back_days' jours (défini ci-après)
# 'clean_radacct' (tous les 1er du mois à 01h15) : ferme les session ouvertes de plus de '$back_days' jours (défini ci-après)
$SED "s?^\$back_days.*?\$back_days = 365;?g" /usr/bin/truncate_radacct
$SED "s?^\$back_days.*?\$back_days = 30;?g" /usr/bin/clean_radacct
rm -f /etc/cron.daily/freeradius-web
rm -f /etc/cron.monthly/freeradius-web
cat << EOF > /etc/cron.d/freeradius-web
1 1 * * * root /usr/bin/tot_stats > /dev/null 2>&1
5 1 * * * root /usr/bin/monthly_tot_stats > /dev/null 2>&1
10 1 1 * * root /usr/bin/truncate_radacct > /dev/null 2>&1
15 1 1 * * root /usr/bin/clean_radacct > /dev/null 2>&1
EOF
# activation du "chien de garde" (watchdog) toutes les 3'
cat << EOF > /etc/cron.d/watchdog
*/3 * * * * root $DIR_DEST_BIN/alcasar-watchdog.sh > /dev/null 2>&1
EOF
# suppression des crons usagers
rm -f /var/spool/cron/*
} # End cron
##################################################################
## Fonction post_install ##
## - Modification des bannières (locales et ssh) et des prompts ##
## - Installation de la structure de chiffrement pour root ##
## - Mise en place du sudoers et de la sécurité sur les fichiers##
## - Mise en place du la rotation des logs ##
## - Configuration dans le cas d'une mise à jour ##
##################################################################
post_install()
{
# adaptation du script "chien de garde" (watchdog)
$SED "s?^EXTIF=.*?EXTIF=\"$EXTIF\"?g" $DIR_DEST_BIN/alcasar-watchdog.sh
$SED "s?^INTIF=.*?INTIF=\"$INTIF\"?g" $DIR_DEST_BIN/alcasar-watchdog.sh
$SED "s?^PRIVATE_IP=.*?PRIVATE_IP=\"$PRIVATE_IP\"?g" $DIR_DEST_BIN/alcasar-watchdog.sh
# création de la bannière locale
[ -e /etc/mandriva-release.default ] || cp /etc/mandriva-release /etc/mandriva-release.default
cat <<EOF > /etc/mandriva-release
Bienvenue sur $HOSTNAME
EOF
# création de la bannière SSH
cp /etc/mandriva-release /etc/ssh/alcasar-banner-ssh
chmod 644 /etc/ssh/alcasar-banner-ssh ; chown root:root /etc/ssh/alcasar-banner-ssh
[ -e /etc/ssh/sshd_config.default ] || cp /etc/ssh/sshd_config /etc/ssh/sshd_config.default
$SED "s?^Banner.*?Banner /etc/ssh/alcasar-banner-ssh?g" /etc/ssh/sshd_config
$SED "s?^#Banner.*?Banner /etc/ssh/alcasar-banner-ssh?g" /etc/ssh/sshd_config
# sshd écoute côté LAN
$SED "s?^#ListenAddress 0\.0\.0\.0?ListenAddress $PRIVATE_IP?g" /etc/ssh/sshd_config
# sshd n'est pas lancé automatiquement au démarrage
/sbin/chkconfig --del sshd
# Coloration des prompts
[ -e /etc/bashrc.default ] || cp /etc/bashrc /etc/bashrc.default
cp -f $DIR_CONF/bashrc /etc/. ; chmod 644 /etc/bashrc ; chown root:root /etc/bashrc
# Droits d'exécution pour utilisateur apache et sysadmin
[ -e /etc/sudoers.default ] || cp /etc/sudoers /etc/sudoers.default
cp -f $DIR_CONF/sudoers /etc/. ; chmod 440 /etc/sudoers ; chown root:root /etc/sudoers
$SED "s?^Host_Alias.*?Host_Alias LAN_ORG=$PRIVATE_NETWORK_MASK,localhost #réseau de l'organisme?g" /etc/sudoers
# prise en compte de la rotation des logs sur 1 an (concerne mysql, httpd, dansguardian, squid, radiusd, ulogd)
cp -f $DIR_CONF/logrotate.d/* /etc/logrotate.d/
chmod 644 /etc/logrotate.d/*
# processus lancés par défaut au démarrage
for i in ntpd iptables ulogd dnsmasq squid chilli httpd radiusd mysqld dansguardian havp freshclam
do
/sbin/chkconfig --add $i
done
# pour éviter les alertes de dépendance avec le service 'netfs'.
$SED "s?^# Required-Start.*?# Required-Start: \$local_fs \$network?g" /etc/init.d/mysqld
$SED "s?^# Required-Stop.*?# Required-Stop: \$local_fs \$network?g" /etc/init.d/mysqld
# On affecte le niveau de sécurité du système : type "fileserver"
$SED "s?BASE_LEVEL=.*?BASE_LEVEL=fileserver?g" /etc/security/msec/security.conf
# On supprime la vérification du mode promiscious des interfaces réseaux ( nombreuses alertes sur eth1 dûes à Tun0 )
$SED "s?CHECK_PROMISC=.*?CHECK_PROMISC=no?g" /etc/security/msec/level.fileserver
# On supprime les log_martians
$SED "s?^ENABLE_LOG_STRANGE_PACKETS=.*?ENABLE_LOG_STRANGE_PACKETS=no?g" /etc/security/msec/level.fileserver
# On supprime la gestion du <CTRL>+<ALT>+<SUPPR> et des Magic SysReq Keys
$SED "s?^ALLOW_REBOOT=.*?ALLOW_REBOOT=no?g" /etc/security/msec/level.fileserver
# On mets en place la sécurité sur les fichiers
# des modif par rapport à radius update
cat <<EOF > /etc/security/msec/perm.local
/var/log/firewall/ root.apache 750
/var/log/firewall/* root.apache 640
/etc/security/msec/perm.local root.root 640
/etc/security/msec/level.local root.root 640
/etc/freeradius-web root.apache 750
/etc/freeradius-web/admin.conf root.apache 640
/etc/freeradius-web/config.php root.apache 640
/etc/raddb/dictionnary root.radius 640
/etc/raddb/ldap.attrmap root.radius 640
/etc/raddb/hints root.radius 640
/etc/raddb/huntgroups root.radius 640
/etc/raddb/attrs.access_reject root.radius 640
/etc/raddb/attrs.accounting_response root.radius 640
/etc/raddb/acct_users root.radius 640
/etc/raddb/preproxy_users root.radius 640
/etc/raddb/modules/ldap radius.apache 660
/etc/raddb/sites-available/alcasar radius.apache 660
/etc/pki/* root.apache 750
EOF
/usr/sbin/msec
# modification /etc/inittab
[ -e /etc/inittab.default ] || cp /etc/inittab /etc/inittab.default
# On ne garde que 3 terminaux
$SED "s?^4.*?#&?g" /etc/inittab
$SED "s?^5.*?#&?g" /etc/inittab
$SED "s?^6.*?#&?g" /etc/inittab
# On limite le temps d'attente de grub (3s) et on change la résolution d'écran
$SED "s?^timeout.*?timeout 3?g" /boot/grub/menu.lst
$SED "s?^kernel.*?& vga=791?g" /boot/grub/menu.lst
# dans le cas d'une mise à jour, on charge la conf d'une version précédente
if [ "$mode" = "update" ]
then
$DIR_DEST_BIN/alcasar-conf.sh --load
fi
chown -R root:apache $DIR_DEST_ETC/*
chmod -R 660 $DIR_DEST_ETC/*
chmod ug+x $DIR_DEST_ETC/digest $DIR_DEST_ETC/alcasar-dnsfilter*
cd $DIR_INSTALL
echo ""
echo "#############################################################################"
echo "# Fin d'installation d'ALCASAR #"
echo "# #"
echo "# Application Libre pour le Contrôle Authentifié et Sécurisé #"
echo "# des Accès au Réseau ( ALCASAR ) #"
echo "# #"
echo "#############################################################################"
echo
echo "- ALCASAR sera fonctionnel après redémarrage du système"
echo
echo "- Lisez attentivement la documentation d'exploitation"
echo
echo "- L'interface de gestion est consultable à partir de n'importe quel poste"
echo " situé sur le réseau de consultation à l'URL http://alcasar"
echo " ou à l'URL http://$PRIVATE_IP"
echo
echo " Appuyez sur 'Entrée' pour continuer"
read a
# On applique les règles de filtrage (et on les sauvegarde)
sh $DIR_DEST_BIN/alcasar-iptables.sh
sleep 2
clear
reboot
} # End post_install ()
#################################
# Boucle principale du script #
#################################
usage="Usage: alcasar.sh {-i or --install} | {-u or --uninstall}"
nb_args=$#
args=$1
if [ $nb_args -eq 0 ]
then
nb_args=1
args="-h"
fi
case $args in
-\? | -h* | --h*)
echo "$usage"
exit 0
;;
-i | --install)
header_install
testing
# On teste la présence d'une version déjà installée
if [ -e $DIR_WEB/VERSION ]
then
actual_version=`cat $DIR_WEB/VERSION`
echo -n "La version "; echo -n $actual_version ; echo " d'ALCASAR est déjà installée";
echo -n "ALCASAR Version "; echo -n $actual_version ; echo " is already installed";
response=0
PTN='^[oOnNyY]$'
until [[ $(expr $response : $PTN) -gt 0 ]]
do
echo "Voulez-vous effectuer une mise à jour (O/n)? ";
echo -n "Do you want to update (Y/n)?";
read response
done
if [ "$response" = "o" ] || [ "$response" = "O" ] || [ "$response" = "y" ] || [ "$response" = "Y" ]
then
RUNNING_VERSION=`cat $DIR_WEB/VERSION|cut -d" " -f1`
MAJ_RUNNING_VERSION=`echo $RUNNING_VERSION|cut -d"." -f1`
MIN_RUNNING_VERSION=`echo $RUNNING_VERSION|cut -d"." -f2|cut -c1`
UPD_RUNNING_VERSION=`echo $RUNNING_VERSION|cut -d"." -f3`
# On crée le fichier de conf de la version actuelle
chmod u+x $DIR_SCRIPTS/alcasar-conf.sh
$DIR_SCRIPTS/alcasar-conf.sh --create
fi
# On désinstalle la version actuelle
$DIR_SCRIPTS/sbin/alcasar-uninstall.sh
fi
if [ -e /tmp/alcasar-conf.tar.gz ]
then
echo "#### Installation avec mise à jour ####"
echo "#### Installation with update ####"
# On récupère le nom d'organisme à partir de fichier de conf
tar -xvf /tmp/alcasar-conf.tar.gz conf/organisme
ORGANISME=`cat $DIR_CONF/organisme`
mode="update"
else
mode="install"
fi
for func in init network gestion AC init_db param_radius param_web_radius param_chilli param_squid param_dansguardian antivirus firewall param_ulogd param_awstats param_dnsmasq BL cron post_install
do
$func
# echo "*** 'debug' : end of function $func ***"; read a
done
;;
-u | --uninstall)
if [ ! -e $DIR_DEST_SBIN/alcasar-uninstall.sh ]
then
echo "Aucune version d'ALCASAR n'a été trouvée.";
exit 0
fi
response=0
PTN='^[oOnN]$'
until [[ $(expr $response : $PTN) -gt 0 ]]
do
echo -n "Voulez-vous créer le fichier de conf de la version actuelle (0/n)? "
read response
done
if [ "$reponse" = "o" ] || [ "$reponse" = "O" ]
then
$DIR_SCRIPT/alcasar-conf.sh --create
else
rm -f /tmp/alcasar-conf*
fi
# On désinstalle la version actuelle
$DIR_SCRIPTS/sbin/alcasar-uninstall.sh
;;
*)
echo "Argument inconnu :$1";
echo "Unknown argument :$1";
echo "$usage"
exit 1
;;
esac
# end of script