Subversion Repositories ALCASAR

Rev

Rev 3243 | Details | Compare with Previous | Last modification | View Log

Rev Author Line No. Line
672 richard 1
#!/bin/bash
2454 tom.houday 2
#  $Id: alcasar.sh 3244 2025-01-29 12:21:27Z rexy $
1 root 3
 
2969 rexy 4
# ALCASAR is a Free and open source NAC (Network Access Controler) created by Franck BOUIJOUX (3abtux), Pascal LEVANT and Richard REY (Rexy)
3230 rexy 5
# ALCASAR is based on a stripped Mageia (LSB) with the following open source softwares Coovachilli, freeradius, mariaDB, apache, php, netfilter, e2guardian, ntpd, openssl, unbound, gammu, Ulog, fail2ban, vnstat, wkhtml2pdf, ipt_NETFLOW, NFsen and NFdump
2969 rexy 6
# contact : info@alcasar.net
959 franck 7
 
1 root 8
# Install script for ALCASAR (a secured and authenticated Internet access control captive portal)
2969 rexy 9
# This script is distributed under the Gnu General Public License (GPLV3)
2466 richard 10
 
1 root 11
# Options :
376 franck 12
#       -i or --install
13
#       -u or --uninstall
14
# Functions :
2990 rexy 15
#	system_testing	: Free space test and mageia version test
16
#	network_testing	: Internet connectivity tests
1221 richard 17
#	init			: Installation of RPM and scripts
18
#	network			: Network parameters
2552 rexy 19
#	ACC				: ALCASAR Control Center installation
20
#	CA				: Certification Authority initialization
1837 richard 21
#	time_server		: NTPd configuration
1221 richard 22
#	init_db			: Initilization of radius database managed with MariaDB
2421 richard 23
#	freeradius		: FreeRadius initialisation
2990 rexy 24
#	chilli			: Coovachilli initialisation (+authentication page)
2521 armand.ito 25
#	e2guardian		: E2Guardian filtering HTTP proxy configuration
2990 rexy 26
#	ulogd			: Log system in userland (match NFLOG target of iptables)
2775 rexy 27
#	nfsen			: Configuration of Netflow grapher (nfsen) & netflow collector (nfcapd)
2688 lucas.echa 28
#	unbound			: Name server configuration
2990 rexy 29
#	vnstat			: Little network stat daemon
2688 lucas.echa 30
#	BL				: Adaptation of Toulouse University BlackList : split into 3 BL (for unbound, for e2guardian and for Netfilter)
1266 richard 31
#	cron			: Logs export + watchdog + connexion statistics
1389 richard 32
#	fail2ban		: Fail2ban IDS installation and configuration
33
#	gammu_smsd		: Autoregister addon via SMS (gammu-smsd)
2969 rexy 34
#	msec			: Mageia security package configuration
2304 tom.houday 35
#	letsencrypt		: Let's Encrypt client
2990 rexy 36
#	mail_service	: Mail service for email authentification method
2552 rexy 37
#	post_install	: Security, log rotation, etc.
1 root 38
 
2499 tom.houday 39
DEBUG_ALCASAR='off'; export DEBUG_ALCASAR	# Debug mode = wait (hit key) after each function
1 root 40
DATE=`date '+%d %B %Y - %Hh%M'`
41
DATE_SHORT=`date '+%d/%m/%Y'`
595 richard 42
Lang=`echo $LANG|cut -c 1-2`
3219 rexy 43
export LC_ALL=C		 					# switch to default language
1362 richard 44
mode="install"
1 root 45
# ******* Files parameters - paramètres fichiers *********
2552 rexy 46
DIR_INSTALL=`pwd`						# current directory
1015 richard 47
DIR_CONF="$DIR_INSTALL/conf"			# install directory (with conf files)
48
DIR_SCRIPTS="$DIR_INSTALL/scripts"		# install directory (with script files)
2552 rexy 49
DIR_BLACKLIST="$DIR_INSTALL/blacklist"	# install directory (with blacklist files)
50
DIR_SAVE="/var/Save"					# backup directory (traceability_log, user_db, security_log)
3230 rexy 51
DIR_WEB="/var/www/html"					# directory of Apache
3197 rexy 52
DIR_E2G="/etc/e2guardian"				# directory of E2Guardian
2552 rexy 53
DIR_ACC="$DIR_WEB/acc"					# directory of the 'ALCASAR Control Center'
1015 richard 54
DIR_DEST_BIN="/usr/local/bin"			# directory of ALCASAR scripts
55
DIR_DEST_ETC="/usr/local/etc"			# directory of ALCASAR conf files
2688 lucas.echa 56
DIR_DEST_SHARE="/usr/local/share"		# directory of share files used by ALCASAR (unbound for instance)
2552 rexy 57
CONF_FILE="$DIR_DEST_ETC/alcasar.conf"	# central ALCASAR conf file
1015 richard 58
PASSWD_FILE="/root/ALCASAR-passwords.txt"	# text file with the passwords and shared secrets
1 root 59
# ******* DBMS parameters - paramètres SGBD ********
2552 rexy 60
DB_RADIUS="radius"						# database name used by FreeRadius server
61
DB_USER="radius"						# user name allows to request the users database
62
DB_GAMMU="gammu"						# database name used by Gammu-smsd
1 root 63
# ******* Network parameters - paramètres réseau *******
2552 rexy 64
HOSTNAME="alcasar"						# default hostname
3238 rexy 65
DOMAIN="lan"							# default local domain
2736 rexy 66
EXTIF=''								# EXTIF is connected to the ISP broadband modem/router (In France : Box-FAI)
67
INTIF=''								# INTIF is connected to the consultation network
1148 crox53 68
MTU="1500"
1243 richard 69
DEFAULT_PRIVATE_IP_MASK="192.168.182.1/24"	# Default ALCASAR IP address
1 root 70
# ****** Paths - chemin des commandes *******
71
SED="/bin/sed -i"
72
# ****************** End of global parameters *********************
73
 
2724 rexy 74
license()
959 franck 75
{
76
	if [ $Lang == "fr" ]
1538 richard 77
	then
3190 rexy 78
		echo "                   *******************************"
79
		echo "                   **** Licence d'utilisation ****"
80
		echo "                   *******************************"
81
		echo
82
		echo "ALCASAR est un logiciel libre"
83
		echo
84
		echo "Avant de l'installer, vous devez accepter les termes de sa licence 'GPL-V3'"
85
		echo "Le descriptif de cette licence est disponible dans le fichier 'GPL-3.0.txt'"
86
		echo "Une traduction française est disponible dans le fichier 'GPL-3.0.fr.txt'."
87
		echo
88
		echo "Les objectifs de cette licence sont de garantir à l'utilisateur :"
89
		echo "- La liberté d'exécuter le logiciel, pour n'importe quel usage ;"
90
		echo "- La liberté d'étudier et d'adapter le logiciel à ses besoins ;"
91
		echo "- La liberté de redistribuer des copies ;"
92
		echo "- L'obligation de faire bénéficier à la communauté les versions modifiées."
93
		echo
1538 richard 94
	else
3190 rexy 95
		echo "                   *******************************"
96
		echo "                   ****      User License     ****"
97
		echo "                   *******************************"
98
		echo
99
		echo "ALCASAR is an open source software"
100
		echo
101
		echo "Before install it, you must understand and accept the license 'GPL-V3'"
102
		echo "you can read this license in the file 'GPL-3.0.txt'"
103
		echo
104
		echo "The goals of this license are :"
105
		echo "- the freedom of using the software ;"
106
		echo "- the freedom of studying et adapting it for its own uses ;"
107
		echo "- the freedom of redistributing copies of it ;"
108
		echo "- the compulsory of giving the modify versions to the community"
109
		echo
959 franck 110
	fi
1538 richard 111
	response=0
2760 lucas.echa 112
	PTN='^[oOyYnN]?$'
113
	until [[ "$response" =~ $PTN ]]
1538 richard 114
	do
115
		if [ $Lang == "fr" ]
1563 franck 116
			then echo -n "Acceptez-vous les termes de cette licence (O/n)? : "
1538 richard 117
			else echo -n "Do you accept the terms of this license (Y/n)? : "
118
		fi
119
		read response
120
	done
121
	if [ "$response" = "n" ] || [ "$response" = "N" ]
122
	then
123
		exit 1
124
	fi
2724 rexy 125
} # End of license()
959 franck 126
 
2724 rexy 127
header_install()
1 root 128
{
129
	clear
130
	echo "-----------------------------------------------------------------------------"
460 richard 131
	echo "                     ALCASAR V$VERSION Installation"
1 root 132
	echo "Application Libre pour le Contrôle d'Accès Sécurisé et Authentifié au Réseau"
133
	echo "-----------------------------------------------------------------------------"
2724 rexy 134
} # End of header_install()
1 root 135
 
2552 rexy 136
########################################################
2990 rexy 137
##                  "system_testing"                  ##
3190 rexy 138
## - Test distribution version                        ##
2552 rexy 139
## - Test ALCASAR version (if already installed)      ##
140
## - Test free space on /var  (>10G)                  ##
141
## - Test Internet access                             ##
142
########################################################
2990 rexy 143
system_testing()
29 richard 144
{
1529 richard 145
# Test of Mageia version
3043 rexy 146
# extract the current Mageia version and hardware architecture (X86_64)
3190 rexy 147
	fic="/etc/product.id"
148
	DISTRIBUTION_NAME=`cat $fic|cut -d"," -f2|cut -d"=" -f2`
149
	DISTRIBUTION_VERSION=`cat $fic|cut -d"," -f4|cut -d"=" -f2`
150
	DISTRIBUTION_ARCH=`cat $fic|cut -d"," -f7|cut -d"=" -f2`
151
	if [ "$DISTRIBUTION_ARCH" != "x86_64" ]
2149 richard 152
		then
153
		if [ $Lang == "fr" ]
2669 tom.houday 154
			then echo "Votre architecture matérielle doit être en 64bits"
155
			else echo "You hardware architecture must be 64bits"
2149 richard 156
		fi
2482 lucas.echa 157
		exit 1
2149 richard 158
	fi
3190 rexy 159
	if [[("$DISTRIBUTION_NAME" != "Mageia" ) || (( "$DISTRIBUTION_VERSION" != "8" ) && ( "$DISTRIBUTION_VERSION" != "9" ))]]
2688 lucas.echa 160
	then
2669 tom.houday 161
		if [ -e /var/tmp/alcasar-conf.tar.gz ] # update
162
			then
163
			echo
164
			if [ $Lang == "fr" ]
165
				then
166
				echo "La mise à jour automatique d'ALCASAR ne peut pas être réalisée."
167
				echo "1 - Effectuez une sauvegarde des fichiers de traçabilité et de la base des usagers via l'ACC"
3077 rexy 168
				echo "2 - Installez Linux-Mageia 8 et ALCASAR (cf. doc d'installation)"
2669 tom.houday 169
				echo "3 - Importez votre base des usagers"
170
			else
171
				echo "The automatic update of ALCASAR can't be performed."
172
				echo "1 - Save your traceability files and the user database"
3077 rexy 173
				echo "2 - Install Linux-Mageia 8 & ALCASAR (cf. installation doc)"
2669 tom.houday 174
				echo "3 - Import your users database"
175
			fi
176
		else
177
			if [ $Lang == "fr" ]
178
				then echo "L'installation d'ALCASAR ne peut pas être réalisée."
179
				else echo "The installation of ALCASAR can't be performed."
180
			fi
181
		fi
182
		echo
183
		if [ $Lang == "fr" ]
3077 rexy 184
			then echo "Le système d'exploitation doit être remplacé (Mageia8)"
185
			else echo "The OS must be replaced (Mageia8)"
2669 tom.houday 186
		fi
2688 lucas.echa 187
		exit 1
2669 tom.houday 188
	fi
189
 
1362 richard 190
# Test if ALCASAR is already installed
191
	if [ -e $CONF_FILE ]
192
	then
2396 tom.houday 193
		current_version=`grep ^VERSION= $CONF_FILE | cut -d"=" -f2`
1342 richard 194
		if [ $Lang == "fr" ]
2669 tom.houday 195
			then echo "La version $current_version d'ALCASAR est déjà installée"
196
			else echo "ALCASAR version $current_version is already installed"
1342 richard 197
		fi
1362 richard 198
		response=0
2458 richard 199
		PTN='^[12]$'
2760 lucas.echa 200
		until [[ "$response" =~ $PTN ]]
1362 richard 201
		do
202
			if [ $Lang == "fr" ]
2669 tom.houday 203
				then echo -n "Tapez '1' pour une mise à jour; Tapez '2' pour une réinstallation : "
204
				else echo -n "Hit '1' for an update; Hit '2' for a reinstallation : "
2499 tom.houday 205
			fi
1362 richard 206
			read response
207
		done
2458 richard 208
		if [ "$response" = "2" ]
1362 richard 209
		then
2560 rexy 210
			rm -f /var/tmp/alcasar-conf*
1362 richard 211
		else
2870 rexy 212
# Create the archive of conf files
3206 rexy 213
			$DIR_DEST_BIN/alcasar-conf.sh --create
2970 rexy 214
# avoid lack of local DNS resolution when unbound is updated (alcasar <= V5.3)
215
			local_unbound_unit=`ls /etc/systemd/system/unbound* 2>/dev/null | wc -w`
216
			if [ $local_unbound_unit -ne 4 ]; then
217
				cp -f /lib/systemd/system/unbound*.service /etc/systemd/system/
218
			fi
1362 richard 219
			mode="update"
220
		fi
3180 rexy 221
	else
222
		license
1529 richard 223
	fi
2847 rexy 224
# Free /var (when updating) and test free space
225
	[ -d /var/log/netflow ] && rm -rf /var/log/netflow  # remove old porttracker RRD database
226
	journalctl -q --vacuum-files 1  # remove previous journal logs
2771 rexy 227
	free_space=`df -BG --output=avail /var|tail -1|tr -d '[:space:]G'`
228
	if [ $free_space -lt 10 ]
1529 richard 229
		then
2771 rexy 230
		if [ $Lang == "fr" ]
2847 rexy 231
			then echo "Espace disponible insuffisant sur /var ($free_space Go au lieu de 10 Go au minimum)"
2771 rexy 232
			else echo "not enough free space on /var ($free_space GB instead of at least 10 GB)"
1529 richard 233
		fi
2771 rexy 234
	exit 0
1529 richard 235
	fi
2990 rexy 236
} # End of system_testing
2669 tom.houday 237
 
2870 rexy 238
########################################################
2990 rexy 239
##                   "network_testing"                ##
240
## - Internet access test                             ##
2870 rexy 241
########################################################
2990 rexy 242
network_testing()
2870 rexy 243
{
2669 tom.houday 244
# Detect external/internal interfaces
245
	if [ -z "$EXTIF" ]; then
3112 rexy 246
		GwListSorted=$(/usr/sbin/ip r list | grep default | cut -d" " -f5 | uniq )
247
		nb_gw=$(echo $GwListSorted | wc -w)
248
		if [ $nb_gw -eq 0 ]; then
2669 tom.houday 249
			if [ "$Lang" == 'fr' ]
2771 rexy 250
				then echo "Aucune passerelle par défaut configurée"
251
				else echo "No default gateway configured"
2669 tom.houday 252
			fi
253
			exit 1
3112 rexy 254
		elif [ $nb_gw -eq 1 ]; then
255
			EXTIF="$GwListSorted"
256
		else
257
			if [ "$Lang" == 'fr' ]
258
				then echo -n "Erreur : Plusieurs interfaces ont une passerelle par défaut ( "
259
				else echo -n "Error : Several interfaces have a default gateway ( "
260
			fi
261
				echo "$GwListSorted" | tr "\n" " "
262
				echo ")"
263
			exit 1
2669 tom.houday 264
		fi
265
	fi
266
	if [ "$Lang" == 'fr' ]
267
		then echo "Interface externe (Internet) utilisée : $EXTIF"
268
		else echo "External interface (Internet) used: $EXTIF"
269
	fi
270
 
271
	if [ -z "$INTIF" ]; then
3112 rexy 272
		IntifListSorted=$(/usr/sbin/ip -br link show | cut -d' ' -f1 | grep -v "^\(lo\|tun0\|$EXTIF\)\$" | uniq | sort)
273
		IntifCount=$(echo "$IntifListSorted" | wc -w)
274
		if [ $IntifCount -eq 0 ]; then
2669 tom.houday 275
			if [ "$Lang" == 'fr' ]
276
				then echo "Aucune interface de disponible pour le réseau interne"
277
				else echo "No interface available for the internal network"
278
			fi
279
			exit 1
3112 rexy 280
		elif [ $IntifCount -eq 1 ]; then
281
			INTIF="$IntifListSorted"
2669 tom.houday 282
		else
3112 rexy 283
			IntifPreferred=$(echo "$IntifListSorted" | head -1 | cut -d' ' -f1)
2669 tom.houday 284
			if [ "$Lang" == 'fr' ]
3112 rexy 285
				then echo 'Liste des interfaces disponibles pour le réseau interne :'
286
				else echo 'List of available interfaces for internal network:'
2669 tom.houday 287
			fi
3112 rexy 288
			echo "$IntifListSorted"
2669 tom.houday 289
			response=''
290
			while true; do
291
				if [ "$Lang" == 'fr' ]
3112 rexy 292
					then echo -n "Choix de l'interface interne ? [$IntifPreferred] "
293
					else echo -n "Choice of internal interface ? [$IntifPreferred] "
2669 tom.houday 294
				fi
295
				read response
3112 rexy 296
				[ -z "$response" ] && response="$IntifPreferred"
2669 tom.houday 297
 
298
				# Check if interface exist
3112 rexy 299
				if [ "$(echo "$IntifListSorted" | grep -c "^$response\$")" -eq 1 ]; then
2669 tom.houday 300
					INTIF="$response"
301
					break
302
				else
303
					if [ "$Lang" == 'fr' ]
304
						then echo "Interface \"$response\" introuvable"
305
						else echo "Interface \"$response\" not found"
306
					fi
307
				fi
308
			done
309
		fi
310
	fi
311
	if [ "$Lang" == 'fr' ]
312
		then echo "Interface interne utilisée : $INTIF"
313
		else echo "Internal interface used: $INTIF"
314
	fi
315
 
2290 richard 316
	if [ $Lang == "fr" ]
317
		then echo -n "Tests des paramètres réseau : "
2549 tom.houday 318
		else echo -n "Network parameters tests: "
2290 richard 319
	fi
320
# Remove conf file if NIC is not plugged (ie : GSM/WIFI/Bt dongles)
2688 lucas.echa 321
	cd /etc/sysconfig/network-scripts/ || { echo "Unable to find /etc/sysconfig/network-scripts directory"; exit 1; }
2290 richard 322
	IF_INTERFACES=`ls ifcfg-*|cut -d"-" -f2|grep -v "^lo"|cut -d"*" -f1`
2282 richard 323
	for i in $IF_INTERFACES
324
	do
2688 lucas.echa 325
		if [ "$(/usr/sbin/ip link | grep -c " $i:")" -eq 0 ]; then
2282 richard 326
			rm -f ifcfg-$i
2454 tom.houday 327
 
2282 richard 328
			if [ $Lang == "fr" ]
329
				then echo "Suppression : ifcfg-$i"
2549 tom.houday 330
				else echo "Deleting: ifcfg-$i"
2282 richard 331
			fi
332
		fi
333
	done
2688 lucas.echa 334
	cd $DIR_INSTALL || { echo "Unable to find $DIR_INSTALL directory"; exit 1; }
2290 richard 335
	echo -n "."
2454 tom.houday 336
# Test Ethernet NIC links state
2669 tom.houday 337
	interfacesDown=$(/usr/sbin/ip -br link | grep "^\($EXTIF\|$INTIF\) " | grep 'NO-CARRIER' | cut -d' ' -f1)
338
	if [ ! -z "$interfacesDown" ]; then
339
		for i in $interfacesDown; do
340
			if [ $Lang == "fr" ]
341
			then
342
				echo -e "\nÉchec"
343
				echo "Le lien réseau de la carte $i n'est pas actif."
344
				echo "Assurez-vous que cette carte est bien connectée à un équipement (commutateur, A.P., etc.)"
345
			else
346
				echo -e "\nFailed"
347
				echo "The link state of $i interface is down."
348
				echo "Make sure that this network card is connected to a switch or an A.P."
349
			fi
350
		done
351
		exit 1
352
	fi
1471 richard 353
	echo -n "."
354
# Test EXTIF config files
2681 tom.houday 355
	PUBLIC_IP_MASK=`/usr/sbin/ip addr show $EXTIF | grep '^\s*inet\s' | awk '{ print $2 }'`
356
	PUBLIC_IP=`echo $PUBLIC_IP_MASK | cut -d'/' -f1`
2981 rexy 357
	PUBLIC_GATEWAY=`/usr/sbin/ip route list | awk -v EXTIF="$EXTIF" '(/ via / && $5 == EXTIF) {print $3}' | head -n 1`
2688 lucas.echa 358
	if [ "$(echo $PUBLIC_IP|wc -c)" -lt 7 ] || [ "$(echo $PUBLIC_GATEWAY|wc -c)" -lt 7 ]
1471 richard 359
	then
784 richard 360
		if [ $Lang == "fr" ]
2454 tom.houday 361
		then
2669 tom.houday 362
			echo -e "\nÉchec"
784 richard 363
			echo "La carte réseau connectée à Internet ($EXTIF) n'est pas correctement configurée."
364
			echo "Renseignez les champs suivants dans le fichier '/etc/sysconfig/network-scripts/ifcfg-$EXTIF' :"
1362 richard 365
			echo "Appliquez les changements : 'systemctl restart network'"
784 richard 366
		else
2669 tom.houday 367
			echo -e "\nFailed"
784 richard 368
			echo "The Internet connected network card ($EXTIF) isn't well configured."
369
			echo "The folowing parametres must be set in the file '/etc/sysconfig/network-scripts/ifcfg-$EXTIF' :"
2669 tom.houday 370
			echo "Apply the new configuration: 'systemctl restart network'"
784 richard 371
		fi
830 richard 372
		echo "DEVICE=$EXTIF"
784 richard 373
		echo "IPADDR="
374
		echo "NETMASK="
375
		echo "GATEWAY="
376
		echo "DNS1="
377
		echo "DNS2="
830 richard 378
		echo "ONBOOT=yes"
2669 tom.houday 379
		exit 1
784 richard 380
	fi
381
	echo -n "."
2290 richard 382
# Test if default GW is alive
3214 rexy 383
	arp_reply=`/usr/sbin/arping -b -I$EXTIF -c1 -w2 $PUBLIC_GATEWAY|grep response|cut -d" " -f2`
2688 lucas.echa 384
	if [ "$(expr $arp_reply)" -eq 0 ]
2454 tom.houday 385
		then
595 richard 386
		if [ $Lang == "fr" ]
2454 tom.houday 387
		then
2669 tom.houday 388
			echo -e "\nÉchec"
2290 richard 389
			echo "Le routeur de sortie ou la Box Internet ($PUBLIC_GATEWAY) ne répond pas."
595 richard 390
			echo "Réglez ce problème puis relancez ce script."
391
		else
2669 tom.houday 392
			echo -e "\nFailed"
2290 richard 393
			echo "The Internet gateway or the ISP equipment ($PUBLIC_GATEWAY) doesn't answered."
595 richard 394
			echo "Resolv this problem, then restart this script."
395
		fi
2669 tom.houday 396
		exit 1
308 richard 397
	fi
398
	echo -n "."
2290 richard 399
# Test Internet connectivity
2669 tom.houday 400
	domainTested='www.google.com'
401
	/usr/bin/curl -s --head "$domainTested" &>/dev/null
402
	if [ $? -ne 0 ]; then
595 richard 403
		if [ $Lang == "fr" ]
2454 tom.houday 404
		then
2669 tom.houday 405
			echo -e "\nLa tentative de connexion vers Internet a échoué ($domainTested)."
595 richard 406
			echo "Vérifiez que la carte $EXTIF est bien connectée au routeur du FAI."
407
			echo "Vérifiez la validité des adresses IP des DNS."
408
		else
2669 tom.houday 409
			echo -e "\nThe Internet connection try failed ($domainTested)."
595 richard 410
			echo "Please, verify that the $EXTIF card is connected with the Internet gateway."
411
			echo "Verify the DNS IP addresses"
412
		fi
2669 tom.houday 413
		exit 1
29 richard 414
	fi
308 richard 415
	echo ". : ok"
2990 rexy 416
} # End of network_testing()
302 richard 417
 
2552 rexy 418
#######################################################################
2990 rexy 419
##                             "init"                                ##
2552 rexy 420
## - Creation of ALCASAR conf file "/usr/local/etc/alcasar.conf      ##
421
## - Creation of random password for GRUB, mariadb (admin and user)  ##
422
#######################################################################
2724 rexy 423
init()
302 richard 424
{
527 richard 425
	if [ "$mode" != "update" ]
302 richard 426
	then
427
# On affecte le nom d'organisme
597 richard 428
		header_install
302 richard 429
		ORGANISME=!
430
		PTN='^[a-zA-Z0-9-]*$'
2760 lucas.echa 431
		until [[ "$ORGANISME" =~ $PTN ]]
2454 tom.houday 432
		do
595 richard 433
			if [ $Lang == "fr" ]
2454 tom.houday 434
				then echo -n "Entrez le nom de votre organisme : "
597 richard 435
				else echo -n "Enter the name of your organism : "
595 richard 436
			fi
330 franck 437
			read ORGANISME
613 richard 438
			if [ "$ORGANISME" == "" ]
2688 lucas.echa 439
			then
330 franck 440
				ORGANISME=!
441
			fi
442
		done
302 richard 443
	fi
1 root 444
# On crée aléatoirement les mots de passe et les secrets partagés
2419 richard 445
# We create random passwords and shared secrets
628 richard 446
	rm -f $PASSWD_FILE
2419 richard 447
	echo "#####  ALCASAR ($ORGANISME) security passwords  #####" > $PASSWD_FILE
2688 lucas.echa 448
	grub2pwd=`cat /dev/urandom | tr -dc '[:alnum:]' | head -c8`
2454 tom.houday 449
	pbkdf2=`( echo $grub2pwd ; echo $grub2pwd ) | \
450
		LC_ALL=C /usr/bin/grub2-mkpasswd-pbkdf2 | \
451
		grep -v '[eE]nter password:' | \
452
		sed -e "s/PBKDF2 hash of your password is //"`
3222 rexy 453
	[ -e /etc/grub.d/default-40_custom ]  || cp /etc/grub.d/40_custom /etc/grub.d/default-40_custom
454
	echo "set superusers=\"root\"" >> /etc/grub.d/40_custom
455
	echo "password_pbkdf2 root $pbkdf2" >> /etc/grub.d/40_custom
2419 richard 456
	echo "# Login name and password to protect GRUB2 boot menu (!!!qwerty keyboard) : " > $PASSWD_FILE
2454 tom.houday 457
	echo "GRUB2_user=root" >> $PASSWD_FILE
458
	echo "GRUB2_password=$grub2pwd" >> $PASSWD_FILE
2688 lucas.echa 459
	mysqlpwd=`cat /dev/urandom | tr -dc '[:alnum:]' | head -c16`
2419 richard 460
	echo "# Login name and Password of MariaDB administrator:" >> $PASSWD_FILE
2412 tom.houday 461
	echo "db_root=$mysqlpwd" >> $PASSWD_FILE
2688 lucas.echa 462
	radiuspwd=`cat /dev/urandom | tr -dc '[:alnum:]' | head -c16`
2419 richard 463
	echo "# Login name and password of MariaDB user:" >> $PASSWD_FILE
2421 richard 464
	echo "db_user=$DB_USER" >> $PASSWD_FILE
465
	echo "db_password=$radiuspwd" >> $PASSWD_FILE
2688 lucas.echa 466
	secretuam=`cat /dev/urandom | tr -dc '[:alnum:]' | head -c16`
2412 tom.houday 467
	echo "# Shared secret between the script 'intercept.php' and coova-chilli:" >> $PASSWD_FILE
468
	echo "secret_uam=$secretuam" >> $PASSWD_FILE
2688 lucas.echa 469
	secretradius=`cat /dev/urandom | tr -dc '[:alnum:]' | head -c16`
2412 tom.houday 470
	echo "# Shared secret between coova-chilli and FreeRadius:" >> $PASSWD_FILE
471
	echo "secret_radius=$secretradius" >> $PASSWD_FILE
3135 rexy 472
	csrfkey=`cat /dev/urandom | tr -dc '[:alnum:]' | head -c16`
473
	echo "# Key used to create CSRF-tokens in several ACC forms" >> $PASSWD_FILE
474
	echo "csrf_key=$csrfkey" >> $PASSWD_FILE
628 richard 475
	chmod 640 $PASSWD_FILE
1828 richard 476
#  copy scripts in in /usr/local/bin
2664 tom.houday 477
	cp -fr $DIR_SCRIPTS/alcasar* $DIR_DEST_BIN/. ; chown -R root:root $DIR_DEST_BIN/alcasar* ; chmod -R 740 $DIR_DEST_BIN/alcasar*
1828 richard 478
#  copy conf files in /usr/local/etc
1954 richard 479
	cp -f $DIR_CONF/etc/alcasar* $DIR_DEST_ETC/. ; chown -R root:apache $DIR_DEST_ETC ; chmod 770 $DIR_DEST_ETC ; chmod 660 $DIR_DEST_ETC/alcasar*
1828 richard 480
	$SED "s?^DB_RADIUS=.*?DB_RADIUS=\"$DB_RADIUS\"?g" $DIR_DEST_BIN/alcasar-mysql.sh
3222 rexy 481
# generate main conf file
628 richard 482
	cat <<EOF > $CONF_FILE
612 richard 483
##########################################
484
##                                      ##
485
##          ALCASAR Parameters          ##
486
##                                      ##
487
##########################################
1 root 488
 
612 richard 489
INSTALL_DATE=$DATE
490
VERSION=$VERSION
491
ORGANISM=$ORGANISME
492
EOF
628 richard 493
	chmod o-rwx $CONF_FILE
2724 rexy 494
} # End of init()
1 root 495
 
2552 rexy 496
#########################################################
2990 rexy 497
##                     "network"                       ##
2552 rexy 498
## - Define the several network address                ##
499
## - Define the DNS naming                             ##
500
## - INTIF parameters (consultation network)           ##
501
## - Write "/etc/hosts" file                           ##
502
## - write "hosts.allow" & "hosts.deny" files          ##
503
#########################################################
2724 rexy 504
network()
1 root 505
{
506
	header_install
636 richard 507
	if [ "$mode" != "update" ]
508
		then
509
		if [ $Lang == "fr" ]
510
			then echo "Par défaut, l'adresse IP d'ALCASAR sur le réseau de consultation est : $DEFAULT_PRIVATE_IP_MASK"
511
			else echo "The default ALCASAR IP address on consultation network is : $DEFAULT_PRIVATE_IP_MASK"
512
		fi
513
		response=0
2760 lucas.echa 514
		PTN='^[oOyYnN]?$'
515
		until [[ "$response" =~ $PTN ]]
1 root 516
		do
595 richard 517
			if [ $Lang == "fr" ]
659 richard 518
				then echo -n "Voulez-vous utiliser cette adresse et ce plan d'adressage (recommandé) (O/n)? : "
618 richard 519
				else echo -n "Do you want to use this IP address and this IP addressing plan (recommanded) (Y/n)? : "
595 richard 520
			fi
1 root 521
			read response
522
		done
636 richard 523
		if [ "$response" = "n" ] || [ "$response" = "N" ]
524
		then
525
			PRIVATE_IP_MASK="0"
526
			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:]]$'
2760 lucas.echa 527
			until [[ $(expr "$PRIVATE_IP_MASK" : $PTN) -gt 0 ]]
1 root 528
			do
595 richard 529
				if [ $Lang == "fr" ]
597 richard 530
					then echo -n "Entrez l'adresse IP d'ALCASAR au format CIDR (a.b.c.d/xx) : "
531
					else echo -n "Enter ALCASAR IP address in CIDR format (a.b.c.d/xx) : "
595 richard 532
				fi
597 richard 533
				read PRIVATE_IP_MASK
1 root 534
			done
636 richard 535
		else
2688 lucas.echa 536
			PRIVATE_IP_MASK=$DEFAULT_PRIVATE_IP_MASK
636 richard 537
		fi
595 richard 538
	else
2834 rexy 539
		PRIVATE_IP_MASK=`grep ^PRIVATE_IP= /var/tmp/conf/etc/alcasar.conf|cut -d"=" -f2`
540
		rm -rf /var/tmp/conf
1 root 541
	fi
861 richard 542
# Define LAN side global parameters
1740 richard 543
	hostnamectl set-hostname $HOSTNAME.$DOMAIN
977 richard 544
	PRIVATE_NETWORK=`/bin/ipcalc -n $PRIVATE_IP_MASK | cut -d"=" -f2`				# private network address (ie.: 192.168.182.0)
1499 richard 545
	private_network_ending=`echo $PRIVATE_NETWORK | cut -d"." -f4`					# last octet of LAN address
977 richard 546
	PRIVATE_NETMASK=`/bin/ipcalc -m $PRIVATE_IP_MASK | cut -d"=" -f2`				# private network mask (ie.: 255.255.255.0)
1499 richard 547
	PRIVATE_PREFIX=`/bin/ipcalc -p $PRIVATE_IP_MASK |cut -d"=" -f2`					# network prefix (ie. 24)
977 richard 548
	PRIVATE_IP=`echo $PRIVATE_IP_MASK | cut -d"/" -f1`						# ALCASAR private ip address (consultation LAN side)
1499 richard 549
	if [ $PRIVATE_IP == $PRIVATE_NETWORK ]								# when entering network address instead of ip address
2688 lucas.echa 550
	then
2454 tom.houday 551
		PRIVATE_IP=`echo $PRIVATE_NETWORK | cut -d"." -f1-3`"."`expr $private_network_ending + 1`
1499 richard 552
		PRIVATE_IP_MASK=`echo $PRIVATE_IP/$PRIVATE_PREFIX`
2454 tom.houday 553
	fi
1499 richard 554
	private_ip_ending=`echo $PRIVATE_IP | cut -d"." -f4`						# last octet of LAN address
555
	PRIVATE_SECOND_IP=`echo $PRIVATE_IP | cut -d"." -f1-3`"."`expr $private_ip_ending + 1`		# second network address (ex.: 192.168.182.2)
3244 rexy 556
	PRIVATE_LAST_IP=`echo $PRIVATE_BROADCAST | cut -d"." -f1-3`"."`expr $private_broadcast_ending - 1`	# last network address (ex.: 192.168.182.254)
977 richard 557
	PRIVATE_NETWORK_MASK=$PRIVATE_NETWORK/$PRIVATE_PREFIX						# ie.: 192.168.182.0/24
1499 richard 558
	classe=$((PRIVATE_PREFIX/8))									# ie.: 2=classe B, 3=classe C
977 richard 559
	PRIVATE_NETWORK_SHORT=`echo $PRIVATE_NETWORK | cut -d"." -f1-$classe`.				# compatibility with hosts.allow et hosts.deny (ie.: 192.168.182.)
1828 richard 560
	PRIVATE_MAC=`/usr/sbin/ip link show $INTIF | grep ether | cut -d" " -f6| sed 's/:/-/g'| awk '{print toupper($0)}'` 	# MAC address of INTIF
841 richard 561
# Define Internet parameters
2809 rexy 562
	DNS1=`cat /etc/sysconfig/network-scripts/ifcfg-$EXTIF | grep '^DNS1='| cut -d"=" -f2`	# 1st DNS server
563
	DNS2=`cat /etc/sysconfig/network-scripts/ifcfg-$EXTIF | grep '^DNS2=' | cut -d"=" -f2`	# 2nd DNS server
2870 rexy 564
	DNS1=${DNS1:=208.67.220.220}
70 franck 565
	DNS2=${DNS2:=208.67.222.222}
1499 richard 566
	PUBLIC_NETMASK=`/bin/ipcalc -m $PUBLIC_IP_MASK | cut -d"=" -f2`
1052 richard 567
	PUBLIC_PREFIX=`/bin/ipcalc -p $PUBLIC_IP $PUBLIC_NETMASK|cut -d"=" -f2`
1069 richard 568
	PUBLIC_NETWORK=`/bin/ipcalc -n $PUBLIC_IP/$PUBLIC_PREFIX|cut -d"=" -f2`
2552 rexy 569
# Write network parameters in the conf file
2737 rexy 570
	echo "HOSTNAME=$HOSTNAME" >> $CONF_FILE
571
	echo "DOMAIN=$DOMAIN" >> $CONF_FILE
1469 richard 572
	echo "EXTIF=$EXTIF" >> $CONF_FILE
573
	echo "INTIF=$INTIF" >> $CONF_FILE
2770 rexy 574
# Retrieve NIC name of other consultation LAN
2282 richard 575
	INTERFACES=`/usr/sbin/ip link|grep '^[[:digit:]]:'|grep -v "^lo\|$EXTIF\|tun0"|cut -d " " -f2|tr -d ":"`
576
	for i in $INTERFACES
577
	do
578
		SUB=`echo ${i:0:2}`
579
		if [ $SUB = "wl" ]
580
			then WIFIF=$i
2454 tom.houday 581
		elif [ "$i" != "$INTIF" ] && [ $SUB != "ww" ]
2282 richard 582
			then LANIF=$i
583
		fi
584
	done
585
	if [ -n "$WIFIF" ]
586
		then echo "WIFIF=$WIFIF" >> $CONF_FILE
587
	elif [ -n "$LANIF" ]
588
		then echo "LANIF=$LANIF" >> $CONF_FILE
589
	fi
2552 rexy 590
	IP_SETTING=`grep BOOTPROTO /etc/sysconfig/network-scripts/ifcfg-$EXTIF|cut -d"=" -f2` # test static or dynamic
1499 richard 591
	if [ $IP_SETTING == "dhcp" ]
2688 lucas.echa 592
	then
2947 rexy 593
		DHCP_DNS_servers=`cat /var/lib/dhclient/dhclient--$EXTIF.lease |grep domain-name-servers|sed -n "1 p"| rev|cut -d" " -f1|rev|tr -d ';'`
594
		DNS1=`echo $DHCP_DNS_servers | cut -d"," -f1`
595
		DNS2=`echo $DHCP_DNS_servers | cut -d"," -f2`
1499 richard 596
		echo "PUBLIC_IP=dhcp" >> $CONF_FILE
1585 richard 597
		echo "GW=dhcp" >> $CONF_FILE
1499 richard 598
	else
599
		echo "PUBLIC_IP=$PUBLIC_IP/$PUBLIC_PREFIX" >> $CONF_FILE
1585 richard 600
		echo "GW=$PUBLIC_GATEWAY" >> $CONF_FILE
1499 richard 601
	fi
1587 richard 602
	echo "DNS1=$DNS1" >> $CONF_FILE
603
	echo "DNS2=$DNS2" >> $CONF_FILE
2956 rexy 604
	echo "PROXY=off" >> $CONF_FILE
605
	echo "PROXY_IP=\"192.168.0.100:80\"" >> $CONF_FILE
606
	echo "PUBLIC_WEIGHT=1" >> $CONF_FILE
994 franck 607
	echo "PUBLIC_MTU=$MTU" >> $CONF_FILE
628 richard 608
	echo "PRIVATE_IP=$PRIVATE_IP_MASK" >> $CONF_FILE
1484 richard 609
	echo "DHCP=on" >> $CONF_FILE
2708 tom.houday 610
	echo "EXT_DHCP_IP=" >> $CONF_FILE
611
	echo "RELAY_DHCP_IP=" >> $CONF_FILE
612
	echo "RELAY_DHCP_PORT=" >> $CONF_FILE
2709 tom.houday 613
	echo "INT_DNS_DOMAIN=" >> $CONF_FILE
614
	echo "INT_DNS_IP=" >> $CONF_FILE
1610 franck 615
	echo "INT_DNS_ACTIVE=off" >> $CONF_FILE
1499 richard 616
# network default
597 richard 617
	[ -e /etc/sysconfig/network.default ] || cp /etc/sysconfig/network /etc/sysconfig/network.default
1 root 618
	cat <<EOF > /etc/sysconfig/network
619
NETWORKING=yes
620
FORWARD_IPV4=true
621
EOF
2552 rexy 622
# write "/etc/hosts"
1 root 623
	[ -e /etc/hosts.default ] || cp /etc/hosts /etc/hosts.default
624
	cat <<EOF > /etc/hosts
503 richard 625
127.0.0.1	localhost
2558 rexy 626
$PRIVATE_IP	$HOSTNAME
1 root 627
EOF
2552 rexy 628
# write EXTIF (Internet) config
1499 richard 629
	[ -e /etc/sysconfig/network-scripts/default-ifcfg-$EXTIF ] || cp /etc/sysconfig/network-scripts/ifcfg-$EXTIF /etc/sysconfig/network-scripts/default-ifcfg-$EXTIF
630
	if [ $IP_SETTING == "dhcp" ]
2688 lucas.echa 631
	then
1499 richard 632
		cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-$EXTIF
14 richard 633
DEVICE=$EXTIF
1585 richard 634
BOOTPROTO=dhcp
635
DNS1=127.0.0.1
636
PEERDNS=no
637
RESOLV_MODS=yes
638
ONBOOT=yes
1613 franck 639
NOZEROCONF=yes
1585 richard 640
METRIC=10
641
MII_NOT_SUPPORTED=yes
642
IPV6INIT=no
643
IPV6TO4INIT=no
644
ACCOUNTING=no
645
USERCTL=no
646
MTU=$MTU
647
EOF
2688 lucas.echa 648
	else
1585 richard 649
		cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-$EXTIF
650
DEVICE=$EXTIF
14 richard 651
BOOTPROTO=static
597 richard 652
IPADDR=$PUBLIC_IP
653
NETMASK=$PUBLIC_NETMASK
654
GATEWAY=$PUBLIC_GATEWAY
2870 rexy 655
DNS1=$DNS1
656
DNS2=$DNS2
1499 richard 657
RESOLV_MODS=yes
14 richard 658
ONBOOT=yes
659
METRIC=10
1610 franck 660
NOZEROCONF=yes
14 richard 661
MII_NOT_SUPPORTED=yes
662
IPV6INIT=no
663
IPV6TO4INIT=no
664
ACCOUNTING=no
665
USERCTL=no
994 franck 666
MTU=$MTU
14 richard 667
EOF
1499 richard 668
	fi
2552 rexy 669
# write INTIF (consultation LAN) in normal mode
2868 rexy 670
cp -f /etc/sysconfig/network-scripts/ifcfg-$INTIF /etc/sysconfig/network-scripts/default-ifcfg-$INTIF
841 richard 671
	cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-$INTIF
672
DEVICE=$INTIF
673
BOOTPROTO=static
674
ONBOOT=yes
675
NOZEROCONF=yes
676
MII_NOT_SUPPORTED=yes
677
IPV6INIT=no
678
IPV6TO4INIT=no
679
ACCOUNTING=no
680
USERCTL=no
681
EOF
2552 rexy 682
# write INTIF in bypass mode (see "alcasar-bypass.sh")
1554 richard 683
	cat <<EOF > /etc/sysconfig/network-scripts/bypass-ifcfg-$INTIF
1 root 684
DEVICE=$INTIF
685
BOOTPROTO=static
686
IPADDR=$PRIVATE_IP
604 richard 687
NETMASK=$PRIVATE_NETMASK
1 root 688
ONBOOT=yes
689
METRIC=10
690
NOZEROCONF=yes
691
MII_NOT_SUPPORTED=yes
14 richard 692
IPV6INIT=no
693
IPV6TO4INIT=no
694
ACCOUNTING=no
695
USERCTL=no
1 root 696
EOF
2282 richard 697
######### Config WIFIF (consultation WIFI) ou LANIF (consultation LAN) in normal mode #################
698
	if [ -n "$WIFIF" ] && [ "$WIFIF" != "$INTIF" ]
699
	then
700
		cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-$WIFIF
701
DEVICE=$WIFIF
702
BOOTPROTO=static
703
ONBOOT=yes
704
NOZEROCONF=yes
705
MII_NOT_SUPPORTED=yes
706
IPV6INIT=no
707
IPV6TO4INIT=no
708
ACCOUNTING=no
709
USERCTL=no
710
EOF
711
	elif [ -n "$LANIF" ]
712
	then
713
		cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-$LANIF
714
DEVICE=$LANIF
715
BOOTPROTO=static
716
ONBOOT=yes
717
NOZEROCONF=yes
718
MII_NOT_SUPPORTED=yes
719
IPV6INIT=no
720
IPV6TO4INIT=no
721
ACCOUNTING=no
722
USERCTL=no
723
EOF
724
	fi
2552 rexy 725
# write hosts.allow & hosts.deny
1 root 726
	[ -e /etc/hosts.allow.default ]  || cp /etc/hosts.allow /etc/hosts.allow.default
727
	cat <<EOF > /etc/hosts.allow
728
ALL: LOCAL, 127.0.0.1, localhost, $PRIVATE_IP
604 richard 729
sshd: ALL
1 root 730
ntpd: $PRIVATE_NETWORK_SHORT
731
EOF
732
	[ -e /etc/host.deny.default ]  || cp /etc/hosts.deny /etc/hosts.deny.default
733
	cat <<EOF > /etc/hosts.deny
734
ALL: ALL: spawn ( /bin/echo "service %d demandé par %c" | /bin/mail -s "Tentative d'accès au service %d par %c REFUSE !!!" security ) &
735
EOF
790 richard 736
	chmod o+r $DIR_DEST_BIN/alcasar-iptables.sh #lecture possible pour apache (interface php du filtrage réseau)
860 richard 737
# create the ip_blocked file with a first line (LAN between ALCASAR and the Internet GW)
1069 richard 738
	echo "#$PUBLIC_NETWORK/$PUBLIC_PREFIX LAN-ALCASAR-BOX" > $DIR_DEST_ETC/alcasar-ip-blocked
790 richard 739
# load conntrack ftp module
740
	[ -e /etc/modprobe.preload.default ] || cp /etc/modprobe.preload /etc/modprobe.preload.default
1705 richard 741
	echo "nf_conntrack_ftp" >>  /etc/modprobe.preload
1159 crox53 742
# load ipt_NETFLOW module
743
	echo "ipt_NETFLOW" >>  /etc/modprobe.preload
1513 richard 744
# modify iptables service files (start with "alcasar-iptables.sh" and stop with flush)
2937 rexy 745
	cp /lib/systemd/system/iptables.service /etc/systemd/system/iptables.service
746
	$SED 's/ExecStart=\/usr\/libexec\/iptables.init start/ExecStart=\/usr\/local\/bin\/alcasar-iptables.sh/' /etc/systemd/system/iptables.service
2688 lucas.echa 747
	[ -e /usr/libexec/iptables.init.default ] || cp /usr/libexec/iptables.init /usr/libexec/iptables.init.default
748
	$SED "s?\[ -f \$IPTABLES_CONFIG \] .*?#&?" /usr/libexec/iptables.init # comment the test (flush all rules & policies)
2956 rexy 749
# create the alcasar-network unit
750
	cat << EOF > /etc/systemd/system/alcasar-network.service
751
#  This file is part of systemd.
2454 tom.houday 752
#
2956 rexy 753
#  systemd is free software; you can redistribute it and/or modify it
754
#  under the terms of the GNU General Public License as published by
755
#  the Free Software Foundation; either version 2 of the License, or
756
#  (at your option) any later version.
757
 
758
# This unit starts alcasar-network.sh script.
759
[Unit]
760
Description=alcasar-network.sh execution
761
After=network.target iptables.service
762
 
763
[Service]
764
Type=oneshot
765
RemainAfterExit=yes
766
ExecStart=$DIR_DEST_BIN/alcasar-network.sh
767
ExecStop=$DIR_DEST_BIN/alcasar-network.sh
768
TimeoutSec=0
769
 
770
[Install]
771
WantedBy=multi-user.target
772
EOF
773
	/usr/bin/systemctl daemon-reload
774
 
775
# the script "$DIR_DEST_BIN/alcasar-iptables.sh" is started at the end of this script in order not to cut network flow in case of using ssh
2724 rexy 776
} # End of network()
1 root 777
 
2763 rexy 778
##################################################################
2990 rexy 779
##                           "CA"                               ##
3230 rexy 780
## - Creating the CA and the server certificate (httpd)         ##
2763 rexy 781
##################################################################
782
CA()
783
{
784
	$DIR_DEST_BIN/alcasar-CA.sh
2814 rexy 785
	chmod 755 /etc/pki/
2801 rexy 786
	chown root:apache /etc/pki/CA; chmod 750 /etc/pki/CA
2821 rexy 787
	chown root:apache /etc/pki/CA/alcasar-ca.crt; chmod 640 /etc/pki/CA/alcasar-ca.crt
2811 rexy 788
	chown root:root /etc/pki/CA/private; chmod 700 /etc/pki/CA/private
789
	chmod 600 /etc/pki/CA/private/*
790
	chown -R root:apache /etc/pki/tls/private; chmod 750 /etc/pki/tls/private
791
	chmod 640 /etc/pki/tls/private/*
3170 rexy 792
	chmod 644 /etc/pki/tls/certs/*
2763 rexy 793
} # End of CA()
794
 
2990 rexy 795
######################################################
796
##                       "ACC"                      ##
797
## - copy ALCASAR Control Center (ACC) files        ##
3230 rexy 798
## - configuration of the web server (Apache)       ##
2990 rexy 799
## - creation of the first ACC admin account        ##
800
## - secure the ACC access                          ##
801
######################################################
2724 rexy 802
ACC()
1 root 803
{
804
	[ -d $DIR_WEB ] && rm -rf $DIR_WEB
805
	mkdir $DIR_WEB
1833 richard 806
# Copy & adapt ACC files
316 richard 807
	cp -rf $DIR_INSTALL/web/* $DIR_WEB/
3240 rexy 808
	ln $DIR_WEB/images/favicon-48.ico $DIR_WEB/favicon.ico
316 richard 809
	$SED "s?99/99/9999?$DATE_SHORT?g" $DIR_ACC/menu.php
2815 rexy 810
	$SED "s?\$DB_RADIUS = .*?\$DB_RADIUS = \"$DB_RADIUS\"\;?g" $DIR_ACC/welcome.php
811
	$SED "s?\$DB_USER = .*?\$DB_USER = \"$DB_USER\"\;?g" $DIR_ACC/welcome.php
812
	$SED "s?\$radiuspwd = .*?\$radiuspwd = \"$radiuspwd\"\;?g" $DIR_ACC/welcome.php
3135 rexy 813
	$SED "s?^\$csrf_key = .*?\$csrf_key = \"$csrfkey\"\;?g" $DIR_ACC/manager/htdocs/activity.php
5 franck 814
	chown -R apache:apache $DIR_WEB/*
1833 richard 815
# copy & adapt "freeradius-web" files
816
	cp -rf $DIR_CONF/freeradius-web/ /etc/
817
	[ -e /etc/freeradius-web/admin.conf.default ] || cp /etc/freeradius-web/admin.conf /etc/freeradius-web/admin.conf.default
818
	$SED "s?^general_domain:.*?general_domain: $DOMAIN?g" /etc/freeradius-web/admin.conf
819
	$SED "s?^sql_username:.*?sql_username: $DB_USER?g" /etc/freeradius-web/admin.conf
820
	$SED "s?^sql_password:.*?sql_password: $radiuspwd?g" /etc/freeradius-web/admin.conf
821
	cat <<EOF > /etc/freeradius-web/naslist.conf
822
nas1_name: alcasar-$ORGANISME
823
nas1_model: Network Access Controler
824
nas1_ip: $PRIVATE_IP
825
nas1_port_num: 0
826
nas1_community: public
827
EOF
828
	chown -R apache:apache /etc/freeradius-web/
829
# create the log & backup structure :
1489 richard 830
# - base = users database
831
# - archive = tarball of "base + http firewall + netflow"
1833 richard 832
# - security = watchdog log
2829 rexy 833
# - conf_file = archive conf file (usefull in updating process)
2887 rexy 834
	for i in base archive security activity_report iot_captures;
1 root 835
	do
836
		[ -d $DIR_SAVE/$i ] || mkdir -p $DIR_SAVE/$i
837
	done
5 franck 838
	chown -R root:apache $DIR_SAVE
1833 richard 839
# Configuring & securing php
2937 rexy 840
	[ -e /etc/php.d/05_date.ini.default ] || cp /etc/php.d/05_date.ini /etc/php.d/05_date.ini.default
2887 rexy 841
	timezone=`timedatectl show --property=Timezone|cut -d"=" -f2`
842
	$SED "s?^;date.timezone =.*?date.timezone = $timezone?g" /etc/php.d/05_date.ini
71 richard 843
	[ -e /etc/php.ini.default ] || cp /etc/php.ini /etc/php.ini.default
411 richard 844
	$SED "s?^upload_max_filesize.*?upload_max_filesize = 100M?g" /etc/php.ini
845
	$SED "s?^post_max_size.*?post_max_size = 100M?g" /etc/php.ini
2397 tom.houday 846
	$SED "s?^display_errors.*?display_errors = Off?" /etc/php.ini
847
	$SED "s?^display_startup_errors.*?display_startup_errors = Off?" /etc/php.ini
71 richard 848
	$SED "s?^html_errors.*?html_errors = Off?g" /etc/php.ini
849
	$SED "s?^expose_php.*?expose_php = Off?g" /etc/php.ini
2397 tom.houday 850
	$SED "s?^allow_url_fopen.*?allow_url_fopen = Off?" /etc/php.ini
3230 rexy 851
# Configuring & securing Apache
790 richard 852
	rm -rf /var/www/cgi-bin/* /var/www/perl/* /var/www/icons/README* /var/www/error/README*
3230 rexy 853
	[ -e /etc/httpd/conf/httpd.conf.default ] || cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.default
854
	$SED "s?^#ServerName.*?ServerName $HOSTNAME.$DOMAIN?g" /etc/httpd/conf/httpd.conf
855
	$SED "s?^Listen.*?Listen $PRIVATE_IP:80?g" /etc/httpd/conf/httpd.conf
856
	$SED "s?Options Indexes.*?Options -Indexes?g" /etc/httpd/conf/httpd.conf
857
	echo "ServerTokens Prod" >> /etc/httpd/conf/httpd.conf
858
	echo "ServerSignature Off" >> /etc/httpd/conf/httpd.conf
859
	[ -e /etc/httpd/conf/modules.d/00_base.conf.default ] || cp /etc/httpd/conf/modules.d/00_base.conf /etc/httpd/conf/modules.d/00_base.conf.default
860
	$SED "s?^LoadModule authn_anon_module.*?#LoadModule authn_anon_module modules/mod_authn_anon.so?g" /etc/httpd/conf/modules.d/00_base.conf
861
	$SED "s?^LoadModule status_module.*?#LoadModule status_module modules/mod_status.so?g" /etc/httpd/conf/modules.d/00_base.conf
862
	$SED "s?^LoadModule info_module.*?#LoadModule info_module modules/mod_info.so?g" /etc/httpd/conf/modules.d/00_base.conf
863
	$SED "s?^LoadModule imagemap_module.*?#LoadModule imagemap_module modules/mod_imagemap.so?g" /etc/httpd/conf/modules.d/00_base.conf
3240 rexy 864
	$SED "s?^#LoadModule rewrite_module.*?LoadModule rewrite_module modules/mod_rewrite.so?g" /etc/httpd/conf/modules.d/00_base.conf
3230 rexy 865
	$SED "s?^LoadModule speling_module.*?#LoadModule speling_module modules/mod_speling.so?g" /etc/httpd/conf/modules.d/00_base.conf
866
	[ -e /etc/httpd/conf/conf.d/ssl.conf.default ] || cp /etc/httpd/conf/conf.d/ssl.conf /etc/httpd/conf/conf.d/ssl.conf.default
867
	echo "Listen $PRIVATE_IP:443" > /etc/httpd/conf/conf.d/ssl.conf # Listen only on INTIF
868
	echo "SSLProtocol all -SSLv2 -SSLv3" >> /etc/httpd/conf/conf.d/ssl.conf  # exclude vulnerable protocols
869
	echo "SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS" >> /etc/httpd/conf/conf.d/ssl.conf # Define the cipher suite
870
	echo "SSLHonorCipherOrder on" >> /etc/httpd/conf/conf.d/ssl.conf # The Browser must respect the order of the cipher suite
871
	echo "SSLPassPhraseDialog  builtin" >> /etc/httpd/conf/conf.d/ssl.conf # in case of passphrase the dialog will be perform on stdin
872
	echo "SSLSessionCache \"shmcb:/run/httpd/ssl_scache(512000)\"" >> /etc/httpd/conf/conf.d/ssl.conf # default cache size
873
	echo "SSLSessionCacheTimeout 300" >> /etc/httpd/conf/conf.d/ssl.conf # default cache time in seconds
874
# Error page management
875
	[ -e /etc/httpd/conf/conf.d/multilang-errordoc.conf.default ] || cp /etc/httpd/conf/conf.d/multilang-errordoc.conf /etc/httpd/conf/conf.d/multilang-errordoc.conf.default
876
	cat <<EOF > /etc/httpd/conf/conf.d/multilang-errordoc.conf
877
Alias /error/ "/var/www/html/"
878
<Directory "/usr/share/httpd/error">
879
    AllowOverride None
880
    Options IncludesNoExec
881
    AddOutputFilter Includes html
882
    AddHandler type-map var
883
    Require all granted
884
    LanguagePriority en cs de es fr it ja ko nl pl pt-br ro sv tr
885
    ForceLanguagePriority Prefer Fallback
886
</Directory>
887
ErrorDocument 400 /error/error.php?error=400
888
ErrorDocument 401 /error/error.php?error=401
889
ErrorDocument 403 /error/error.php?error=403
890
ErrorDocument 404 /error/index.php
891
ErrorDocument 405 /error/error.php?error=405
892
ErrorDocument 408 /error/error.php?error=408
893
ErrorDocument 410 /error/error.php?error=410
894
ErrorDocument 411 /error/error.php?error=411
895
ErrorDocument 412 /error/error.php?error=412
896
ErrorDocument 413 /error/error.php?error=413
897
ErrorDocument 414 /error/error.php?error=414
898
ErrorDocument 415 /error/error.php?error=415
899
ErrorDocument 500 /error/error.php?error=500
900
ErrorDocument 501 /error/error.php?error=501
901
ErrorDocument 502 /error/error.php?error=502
902
ErrorDocument 503 /error/error.php?error=503
903
ErrorDocument 506 /error/error.php?error=506
904
EOF
905
	[ -e /usr/share/httpd/error/include/top.html.default ] || cp /usr/share/httpd/error/include/top.html /usr/share/httpd/error/include/top.html.default
906
	$SED "s?background-color.*?background-color: #EFEFEF; }?g" /usr/share/httpd/error/include/top.html
907
	[ -e /usr/share/httpd/error/include/bottom.html.default ] || cp /usr/share/httpd/error/include/bottom.html /usr/share/httpd/error/include/bottom.html.default
908
	cat <<EOF > /usr/share/httpd/error/include/bottom.html
909
</body>
910
</html>
911
EOF
912
# ACC partitioning
913
	rm -f /etc/httpd/conf/vhosts.d/alcasar*
914
	cat <<EOF > /etc/httpd/conf/vhosts.d/alcasar.conf
915
<Directory $DIR_WEB>
916
        AllowOverride None
917
        Order deny,allow
918
        Deny from all
919
        Allow from 127.0.0.1
920
        Allow from $PRIVATE_NETWORK_MASK
921
        ErrorDocument 404 https://$HOSTNAME.$DOMAIN/
922
</Directory>
923
<Directory $DIR_WEB/certs>
924
        AddType application/x-x509-ca-cert crt
925
</Directory>
926
<Directory $DIR_ACC>
927
        SSLRequireSSL
928
        AllowOverride None
929
        Order deny,allow
930
        Deny from all
931
        Allow from 127.0.0.1
932
        Allow from $PRIVATE_NETWORK_MASK
933
        require valid-user
934
        AuthType digest
935
        AuthName "ALCASAR Control Center (ACC)"
936
        AuthDigestDomain $HOSTNAME.$DOMAIN
937
        BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On
938
        AuthUserFile $DIR_DEST_ETC/digest/key_all
939
        ErrorDocument 404 https://$HOSTNAME.$DOMAIN/
940
</Directory>
941
<Directory $DIR_ACC/admin>
942
        SSLRequireSSL
943
        AllowOverride None
944
        Order deny,allow
945
        Deny from all
946
        Allow from 127.0.0.1
947
        Allow from $PRIVATE_NETWORK_MASK
948
        require valid-user
949
        AuthType digest
950
        AuthName "ALCASAR Control Center (ACC)"
951
        AuthDigestDomain $HOSTNAME.$DOMAIN
952
        BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On
953
        AuthUserFile $DIR_DEST_ETC/digest/key_admin
954
        ErrorDocument 404 https://$HOSTNAME.$DOMAIN/
955
</Directory>
956
<Directory $DIR_ACC/manager>
957
        SSLRequireSSL
958
        AllowOverride None
959
        Order deny,allow
960
        Deny from all
961
        Allow from 127.0.0.1
962
        Allow from $PRIVATE_NETWORK_MASK
963
        require valid-user
964
        AuthType digest
965
        AuthName "ALCASAR Control Center (ACC)"
966
        AuthDigestDomain $HOSTNAME.$DOMAIN
967
        BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On
968
        AuthUserFile $DIR_DEST_ETC/digest/key_manager
969
        ErrorDocument 404 https://$HOSTNAME.$DOMAIN/
970
</Directory>
3240 rexy 971
<Directory $DIR_ACC/manager/nfsen>
972
        AllowOverride None
973
        <IfModule mod_rewrite.c>
974
                RewriteEngine On
975
                RewriteCond %{REQUEST_FILENAME} !-f
976
                RewriteCond %{REQUEST_FILENAME} !-d
977
                RewriteRule ^api/(.*)$ backend/index.php?request=$1 [QSA,NC,L]
978
                RewriteRule ^$ frontend [L]
979
        </IfModule>
980
</Directory>
3230 rexy 981
<Directory $DIR_ACC/backup>
982
        SSLRequireSSL
983
        AllowOverride None
984
        Order deny,allow
985
        Deny from all
986
        Allow from 127.0.0.1
987
        Allow from $PRIVATE_NETWORK_MASK
988
        require valid-user
989
        AuthType digest
990
        AuthName "ALCASAR Control Center (ACC)"
991
        AuthDigestDomain $HOSTNAME.$DOMAIN
992
        BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On
993
        AuthUserFile $DIR_DEST_ETC/digest/key_backup
994
        ErrorDocument 404 https://$HOSTNAME.$DOMAIN/
995
</Directory>
996
Alias /save/ "$DIR_SAVE/"
997
<Directory $DIR_SAVE>
998
        SSLRequireSSL
999
        Options Indexes
1000
        Order deny,allow
1001
        Deny from all
1002
        Allow from 127.0.0.1
1003
        Allow from $PRIVATE_NETWORK_MASK
1004
        require valid-user
1005
        AuthType digest
1006
        AuthName "ALCASAR Control Center (ACC)"
1007
        AuthDigestDomain $HOSTNAME.$DOMAIN
1008
        AuthUserFile $DIR_DEST_ETC/digest/key_backup
1009
        ErrorDocument 404 https://$HOSTNAME.$DOMAIN/
1010
</Directory>
1011
EOF
2552 rexy 1012
# Creation of the first account (in 'admin' profile)
2293 tom.houday 1013
	if [ "$mode" = "install" ]
2688 lucas.echa 1014
	then
1015
		header_install
1268 richard 1016
# Creation of keys file for the admin account ("admin")
2688 lucas.echa 1017
		[ -d $DIR_DEST_ETC/digest ] && rm -rf $DIR_DEST_ETC/digest
1018
		mkdir -p $DIR_DEST_ETC/digest
1019
		chmod 755 $DIR_DEST_ETC/digest
2737 rexy 1020
		if [ $Lang == "fr" ]
2760 lucas.echa 1021
			then echo "Création du premier compte administrateur : "
1022
			else echo "Creation of the first admin account : "
2737 rexy 1023
		fi
2688 lucas.echa 1024
		until [ -s $DIR_DEST_ETC/digest/key_admin ]
1025
		do
1026
			$DIR_DEST_BIN/alcasar-profil.sh --add admin
1027
		done
2293 tom.houday 1028
	fi
2818 rexy 1029
# Creation of ACC certs links
1030
	[ -d /var/www/html/certs ] || mkdir /var/www/html/certs
1031
	ln -s /etc/pki/CA/alcasar-ca.crt /var/www/html/certs/certificat_alcasar_ca.crt
3230 rexy 1032
# Run Apache after coova (in order waiting tun0 to be up)
1033
	cp /lib/systemd/system/httpd.service /etc/systemd/system/httpd.service
1034
	$SED "s?^After=.*?After=network.target remote-fs.target nss-lookup.target chilli.service?g" /etc/systemd/system/httpd.service
2293 tom.houday 1035
	# Log file for ACC access imputability
2887 rexy 1036
	[ -e $DIR_SAVE/security/acc_access.log ] || touch $DIR_SAVE/security/acc_access.log
1037
	chown root:apache $DIR_SAVE/security/acc_access.log
1038
	chmod 664 $DIR_SAVE/security/acc_access.log
2724 rexy 1039
} # End of ACC()
1 root 1040
 
2552 rexy 1041
#############################################################
2990 rexy 1042
##                     "time_server"                       ##
2552 rexy 1043
## - Configuring NTP server                                ##
1044
#############################################################
2724 rexy 1045
time_server()
1837 richard 1046
{
3192 rexy 1047
[ -e /etc/ntp.conf.default ] || cp /etc/ntp.conf /etc/ntp.conf.default
1048
$SED "s?^pool.*?pool fr.pool.ntp.org iburst?g" /etc/ntp.conf
3193 rexy 1049
echo "interface ignore wildcard" >> /etc/ntp.conf
1050
echo "interface listen lo" >> /etc/ntp.conf
3197 rexy 1051
echo "interface listen tun0" >> /etc/ntp.conf
1837 richard 1052
# Synchronize now
3192 rexy 1053
	ntpdate fr.pool.ntp.org &
3193 rexy 1054
sleep 2 # wait for time server responce
2724 rexy 1055
} # End of time_server()
1837 richard 1056
 
2541 rexy 1057
#####################################################################
2990 rexy 1058
##                           "init_db"                             ##
2541 rexy 1059
## - Mysql initialization                                          ##
1060
## - Set admin (root) password                                     ##
1061
## - Remove unused users & databases                               ##
1062
## - Radius database creation                                      ##
1063
## - Copy of accounting tables (mtotacct, totacct) & userinfo      ##
1064
#####################################################################
2724 rexy 1065
init_db()
1 root 1066
{
2688 lucas.echa 1067
	if [ "`systemctl is-active mysqld`" == "active" ]
1990 richard 1068
	then
1069
		systemctl stop mysqld
1070
	fi
1355 richard 1071
	rm -rf /var/lib/mysql # to be sure that there is no former installation
1 root 1072
	[ -e /etc/my.cnf.default ] || cp /etc/my.cnf /etc/my.cnf.default
1355 richard 1073
	$SED "s?^tmpdir.*?tmpdir=/tmp?g" /etc/my.cnf
1979 richard 1074
	$SED "s?^port.*?#&?g" /etc/my.cnf # we use unix socket only
1980 richard 1075
	$SED "s?^;collation_server =.*?collation_server = utf8_unicode_ci?g" /etc/my.cnf
1076
	$SED "s?^;character_set_server =.*?character_set_server = utf8?g" /etc/my.cnf  # accentuated user names are allowed
2591 rexy 1077
	[ -e /etc/my.cnf.d/feedback.cnf ] && $SED "s?^plugin-load.*?#&?g" /etc/my.cnf.d/feedback.cnf # remove the feedback plugin (ALCASAR doesn't report anything !)
2724 rexy 1078
	[ -e /etc/my.cnf.d/auth_gssapi.cnf ] && $SED "s?^plugin-load.*?#&?g" /etc/my.cnf.d/auth_gssapi.cnf # remove GSS plugin (ALCASAR doesn't use Kerberos)
2416 richard 1079
	/usr/sbin/mysqld-prepare-db-dir > /dev/null 2>&1
1080
	/usr/bin/systemctl set-environment MYSQLD_OPTS="--skip-grant-tables --skip-networking"
1081
	/usr/bin/systemctl start mysqld
1963 richard 1082
	nb_round=1
1981 richard 1083
	while [ ! -S /var/lib/mysql/mysql.sock ] && [ $nb_round -lt 10 ] # we wait until mariadb is on
1963 richard 1084
	do
1085
		nb_round=`expr $nb_round + 1`
1086
		sleep 2
1087
	done
1981 richard 1088
	if [ ! -S /var/lib/mysql/mysql.sock ]
1963 richard 1089
	then
1981 richard 1090
		echo "Problème : la base données 'MariaDB' ne s'est pas lancée !"
1963 richard 1091
		exit
1955 richard 1092
	fi
1355 richard 1093
# Secure the server
2688 lucas.echa 1094
	/usr/bin/mysql --execute "GRANT ALL PRIVILEGES ON *.* TO root@'localhost' IDENTIFIED BY '$mysqlpwd';"
2416 richard 1095
	MYSQL="/usr/bin/mysql -uroot -p$mysqlpwd --execute"
2688 lucas.echa 1096
	$MYSQL "DROP DATABASE IF EXISTS test;DROP DATABASE IF EXISTS tmp;"
1097
	$MYSQL "CONNECT mysql;DELETE from user where User='';DELETE FROM user WHERE User='root' AND Host NOT IN ('localhost','127.0.0.1','::1');FLUSH PRIVILEGES;"
615 richard 1098
# Create 'radius' database
2688 lucas.echa 1099
	$MYSQL "CREATE DATABASE IF NOT EXISTS $DB_RADIUS;GRANT ALL ON $DB_RADIUS.* TO $DB_USER@localhost IDENTIFIED BY '$radiuspwd';FLUSH PRIVILEGES;"
615 richard 1100
# Add an empty radius database structure
2688 lucas.echa 1101
	/usr/bin/mysql -u$DB_USER -p$radiuspwd $DB_RADIUS < $DIR_CONF/empty-radiusd-db.sql
615 richard 1102
# modify the start script in order to close accounting connexion when the system is comming down or up
2937 rexy 1103
	cp /lib/systemd/system/mysqld.service /etc/systemd/system/mysqld.service
1104
	$SED "/^ExecStart=/a ExecStop=$DIR_DEST_BIN/alcasar-mysql.sh -acct_stop" /etc/systemd/system/mysqld.service
1105
	$SED "/^ExecStop=/a ExecStartPost=$DIR_DEST_BIN/alcasar-mysql.sh -acct_stop" /etc/systemd/system/mysqld.service
2416 richard 1106
	/usr/bin/systemctl unset-environment MYSQLD_OPTS
1574 richard 1107
	/usr/bin/systemctl daemon-reload
2724 rexy 1108
} # End of init_db()
1 root 1109
 
2423 richard 1110
###################################################################
2990 rexy 1111
##                           "freeradius"                        ##
2423 richard 1112
## - Set the configuration files                                 ##
1113
## - Set the shared secret between coova-chilli and freeradius   ##
1114
## - Adapt the Mysql conf file and counters                      ##
1115
###################################################################
2724 rexy 1116
freeradius()
1 root 1117
{
1800 richard 1118
	cp -f $DIR_CONF/empty-radiusd-db.sql /etc/raddb/
1 root 1119
	chown -R radius:radius /etc/raddb
1120
	[ -e /etc/raddb/radiusd.conf.default ] || cp /etc/raddb/radiusd.conf /etc/raddb/radiusd.conf.default
2420 richard 1121
# Set radius global parameters (radius.conf)
1 root 1122
	$SED "s?^[\t ]*#[\t ]*user =.*?user = radius?g" /etc/raddb/radiusd.conf
1123
	$SED "s?^[\t ]*#[\t ]*group =.*?group = radius?g" /etc/raddb/radiusd.conf
1124
	$SED "s?^[\t ]*status_server =.*?status_server = no?g" /etc/raddb/radiusd.conf
2420 richard 1125
	$SED "s?^[\t ]*proxy_requests.*?proxy_requests = no?g" /etc/raddb/radiusd.conf # remove the proxy function
1126
	$SED "s?^[\t ]*\$INCLUDE proxy.conf.*?#\$INCLUDE proxy.conf?g" /etc/raddb/radiusd.conf # remove the proxy function
2728 rexy 1127
# Add ALCASAR & Coovachilli dictionaries
1128
	[ -e /etc/raddb/dictionary.default ] || cp /etc/raddb/dictionary /etc/raddb/dictionary.default
2730 rexy 1129
	cp $DIR_CONF/radius/dictionary.alcasar /etc/raddb/
1130
	echo '$INCLUDE dictionary.alcasar' > /etc/raddb/dictionary
1131
	cp /usr/share/doc/coova-chilli/dictionary.coovachilli /etc/raddb/
1132
	echo '$INCLUDE dictionary.coovachilli' >> /etc/raddb/dictionary
2420 richard 1133
# Set "client.conf" to describe radius clients (coova on 127.0.0.1)
1 root 1134
	[ -e /etc/raddb/clients.conf.default ] || cp -f /etc/raddb/clients.conf /etc/raddb/clients.conf.default
1135
	cat << EOF > /etc/raddb/clients.conf
2438 richard 1136
client localhost {
1137
	ipaddr = 127.0.0.1
1 root 1138
	secret = $secretradius
2438 richard 1139
	shortname = chilli
2454 tom.houday 1140
	nas_type = other
1 root 1141
}
1142
EOF
2758 rexy 1143
# Set Virtual server
1144
    # Remvoveing all except "alcasar virtual site")
1145
	# INFO : To enable 802.1X, add the "innser-tunnel" virtual server (link in sites-enabled)  Change the firewall rules to allow "radius" extern connections.
2467 richard 1146
	cp $DIR_CONF/radius/alcasar /etc/raddb/sites-available/alcasar
1147
	cp $DIR_CONF/radius/alcasar-with-ldap /etc/raddb/sites-available/alcasar-with-ldap
1148
	chown radius:apache /etc/raddb/sites-available/alcasar*
1149
	chmod 660 /etc/raddb/sites-available/alcasar*
2758 rexy 1150
	rm -f /etc/raddb/sites-enabled/*
2420 richard 1151
	ln -s /etc/raddb/sites-available/alcasar /etc/raddb/sites-enabled/alcasar
2454 tom.houday 1152
# Set modules
2728 rexy 1153
	# Add custom LDAP "available module"
2758 rexy 1154
	# INFO : To enable 802.1X, add the "eap" module and verify access to the keys (/etc/pki/tls/private/radius.pem). Change the firewall rules to allow "radius" extern connections.
2465 richard 1155
	cp -f $DIR_CONF/radius/ldap-alcasar /etc/raddb/mods-available/
1156
	chown -R radius:radius /etc/raddb/mods-available/ldap-alcasar
2728 rexy 1157
	# Set only usefull modules for ALCASAR (! the module 'ldap-alcasar' is enabled only via ACC)
2454 tom.houday 1158
	rm -rf  /etc/raddb/mods-enabled/*
2615 tom.houday 1159
	for mods in sql sqlcounter attr_filter expiration logintime pap expr always
2454 tom.houday 1160
	do
1161
		ln -s /etc/raddb/mods-available/$mods /etc/raddb/mods-enabled/$mods
1162
	done
2758 rexy 1163
# Configure SQL module
2420 richard 1164
	[ -e /etc/raddb/mods-available/sql.default ] || cp /etc/raddb/mods-available/sql /etc/raddb/mods-available/sql.default
2423 richard 1165
	$SED "s?^[\t ]*driver =.*?driver = \"rlm_sql_mysql\"?g" /etc/raddb/mods-available/sql
1166
	$SED "s?^[\t ]*dialect =.*?dialect = \"mysql\"?g" /etc/raddb/mods-available/sql
2420 richard 1167
	$SED "s?^[\t ]*radius_db =.*?radius_db = \"$DB_RADIUS\"?g" /etc/raddb/mods-available/sql
2423 richard 1168
	$SED "s?^#[\t ]*server =.*?server = \"localhost\"?g" /etc/raddb/mods-available/sql
1169
	$SED "s?^#[\t ]*port =.*?port = \"3306\"?g" /etc/raddb/mods-available/sql
1170
	$SED "s?^#[\t ]*login =.*?login = \"$DB_USER\"?g" /etc/raddb/mods-available/sql
1171
	$SED "s?^#[\t ]*password =.*?password = \"$radiuspwd\"?g" /etc/raddb/mods-available/sql
2758 rexy 1172
	# no TLS encryption on 127.0.0.1
2763 rexy 1173
	$SED "s?^[\t ]*ca_file =.*?#&?g" /etc/raddb/mods-available/sql
1174
	$SED "s?^[\t ]*ca_path =.*?#&?g" /etc/raddb/mods-available/sql
1175
	$SED "s?^[\t ]*certificate_file =.*?#&?g" /etc/raddb/mods-available/sql
1176
	$SED "s?^[\t ]*private_key_file =.*?#&?g" /etc/raddb/mods-available/sql
1177
	$SED "s?^[\t ]*cipher =.*?#&?g" /etc/raddb/mods-available/sql
1178
	$SED "s?^[\t ]*tls_required =.*?tls_required = no?g" /etc/raddb/mods-available/sql
2454 tom.houday 1179
# queries.conf modifications : case sensitive for username, check simultaneous use, patch on 'postauth' table, etc.
2420 richard 1180
	[ -e /etc/raddb/mods-config/sql/main/mysql/queries.conf.default ] || cp /etc/raddb/mods-config/sql/main/mysql/queries.conf /etc/raddb/mods-config/sql/main/mysql/queries.conf.default
1181
	cp -f $DIR_CONF/radius/queries.conf /etc/raddb/mods-config/sql/main/mysql/queries.conf
1182
	chown -R radius:radius /etc/raddb/mods-config/sql/main/mysql/queries.conf
2421 richard 1183
# sqlcounter modifications
2470 richard 1184
	[ -e /etc/raddb/mods-available/sqlcounter.default ] || cp /etc/raddb/mods-available/sqlcounter /etc/raddb/mods-available/sqlcounter.default
1185
	cp -f $DIR_CONF/radius/sqlcounter /etc/raddb/mods-available/sqlcounter
1186
	chown -R radius:radius /etc/raddb/mods-available/sqlcounter
2421 richard 1187
# make certain that mysql is up before freeradius start
2937 rexy 1188
	cp /lib/systemd/system/radiusd.service /etc/systemd/system/radiusd.service
1189
	$SED "s?^After=.*?After=syslog.target network.target mysqld.service?g" /etc/systemd/system/radiusd.service
1574 richard 1190
	/usr/bin/systemctl daemon-reload
2597 tom.houday 1191
# Allow apache to change some conf files (ie : ldap on/off)
1192
	chgrp apache /etc/raddb /etc/raddb/sites-available /etc/raddb/mods-available
2770 rexy 1193
	chmod 750 /etc/raddb /etc/raddb/sites-available /etc/raddb/mods-available
2724 rexy 1194
} # End of freeradius()
1 root 1195
 
2423 richard 1196
#############################################################################
2990 rexy 1197
##                                "chilli"                                 ##
2423 richard 1198
## - Creation of the conf file and init file (systemd) for coova-chilli    ##
1199
## - Adapt the authentication web page (intercept.php)                     ##
1200
#############################################################################
2724 rexy 1201
chilli()
1 root 1202
{
1370 richard 1203
# chilli unit for systemd
2937 rexy 1204
	cat << EOF > /etc/systemd/system/chilli.service
1372 richard 1205
#  This file is part of systemd.
1206
#
1207
#  systemd is free software; you can redistribute it and/or modify it
1208
#  under the terms of the GNU General Public License as published by
1209
#  the Free Software Foundation; either version 2 of the License, or
1210
#  (at your option) any later version.
2771 rexy 1211
 
1212
# This unit launches coova-chilli a captive portal
1370 richard 1213
[Unit]
1214
Description=chilli is a captive portal daemon
1215
After=network.target
1216
 
1217
[Service]
1379 richard 1218
Type=forking
1370 richard 1219
ExecStart=/usr/libexec/chilli start
1220
ExecStop=/usr/libexec/chilli stop
1221
ExecReload=/usr/libexec/chilli reload
2775 rexy 1222
PIDFile=/run/chilli.pid
1370 richard 1223
 
1224
[Install]
1225
WantedBy=multi-user.target
1226
EOF
799 richard 1227
# init file creation
1370 richard 1228
	[ -e /etc/init.d/chilli.default ] || mv /etc/init.d/chilli /etc/init.d/chilli.default
1801 richard 1229
	cat <<EOF > /etc/init.d/chilli
799 richard 1230
#!/bin/sh
1231
#
1232
# chilli CoovaChilli init
1233
#
1234
# chkconfig: 2345 65 35
1235
# description: CoovaChilli
1236
### BEGIN INIT INFO
1237
# Provides:       chilli
2454 tom.houday 1238
# Required-Start: network
1239
# Should-Start:
799 richard 1240
# Required-Stop:  network
2454 tom.houday 1241
# Should-Stop:
799 richard 1242
# Default-Start:  2 3 5
1243
# Default-Stop:
1244
# Description:    CoovaChilli access controller
1245
### END INIT INFO
1246
 
1247
[ -f /usr/sbin/chilli ] || exit 0
1248
. /etc/init.d/functions
1249
CONFIG=/etc/chilli.conf
2775 rexy 1250
pidfile=/run/chilli.pid
799 richard 1251
[ -f \$CONFIG ] || {
2394 tom.houday 1252
	echo "\$CONFIG Not found"
1253
	exit 0
799 richard 1254
}
2882 rexy 1255
current_users_file="/tmp/current_users.txt"	# file containing active users
799 richard 1256
RETVAL=0
1257
prog="chilli"
1258
case \$1 in
2394 tom.houday 1259
	start)
2454 tom.houday 1260
		if [ -f \$pidfile ] ; then
2394 tom.houday 1261
			gprintf "chilli is already running"
1262
		else
1263
			gprintf "Starting \$prog: "
2884 rexy 1264
			echo '' > \$current_users_file && chown root:apache \$current_users_file && chmod 660 \$current_users_file
2775 rexy 1265
			rm -f /run/chilli* # cleaning
2394 tom.houday 1266
			/usr/sbin/modprobe tun >/dev/null 2>&1
1267
			echo 1 > /proc/sys/net/ipv4/ip_forward
1268
			[ -e /dev/net/tun ] || {
2454 tom.houday 1269
				(cd /dev;
1270
				mkdir net;
1271
				cd net;
2394 tom.houday 1272
				mknod tun c 10 200)
1273
			}
1274
			ifconfig $INTIF 0.0.0.0
1275
			/usr/sbin/ethtool -K $INTIF gro off
1276
			daemon /usr/sbin/chilli -c \$CONFIG --pidfile=\$pidfile &
1277
			RETVAL=\$?
1278
		fi
1279
		;;
799 richard 1280
 
2394 tom.houday 1281
	reload)
1282
		killall -HUP chilli
1283
		;;
799 richard 1284
 
2394 tom.houday 1285
	restart)
1286
		\$0 stop
1287
		sleep 2
1288
		\$0 start
1289
		;;
799 richard 1290
 
2394 tom.houday 1291
	status)
1292
		status chilli
1293
		RETVAL=0
1294
		;;
1295
 
1296
	stop)
2454 tom.houday 1297
		if [ -f \$pidfile ] ; then
2394 tom.houday 1298
			gprintf "Shutting down \$prog: "
1299
			killproc /usr/sbin/chilli
1300
			RETVAL=\$?
1301
			[ \$RETVAL = 0 ] && rm -f \$pidfile
1302
			[ -e \$current_users_file ] && rm -f \$current_users_file
2454 tom.houday 1303
		else
2394 tom.houday 1304
			gprintf "chilli is not running"
1305
		fi
1306
		;;
1307
 
1308
	*)
1309
		echo "Usage: \$0 {start|stop|restart|reload|status}"
1310
		exit 1
799 richard 1311
esac
1312
echo
1313
EOF
2324 tom.houday 1314
	chmod a+x /etc/init.d/chilli
1315
	ln -s /etc/init.d/chilli /usr/libexec/chilli
799 richard 1316
# conf file creation
346 richard 1317
	[ -e /etc/chilli.conf.default ] || cp /etc/chilli.conf /etc/chilli.conf.default
2016 raphael.pi 1318
	#NTP Option configuration for DHCP
2032 richard 1319
	#DHCP Options : rfc2132
1320
		#dhcp option value will be convert in hexa.
1321
		#NTP option (or 'option 42') is like :
2454 tom.houday 1322
		#
2032 richard 1323
		#    Code   Len         Address 1               Address 2
1324
		#   +-----+-----+-----+-----+-----+-----+-----+-----+--
1325
		#   |  42 |  n  |  a1 |  a2 |  a3 |  a4 |  a1 |  a2 |  ...
1326
		#   +-----+-----+-----+-----+-----+-----+-----+-----+--
1327
		#
1328
		#Code : 42 => 2a
1329
		#Len : 4 => 04
2688 lucas.echa 1330
	PRIVATE_IP_HEXA=$(printf "%02x\n" "$(echo $PRIVATE_IP | cut -d'.' -f1)")$(printf "%02x\n" "$(echo $PRIVATE_IP | cut -d'.' -f2)")$(printf "%02x\n" "$(echo $PRIVATE_IP | cut -d'.' -f3)")$(printf "%02x\n" "$(echo $PRIVATE_IP | cut -d'.' -f4)")
346 richard 1331
	cat <<EOF > /etc/chilli.conf
1332
# coova config for ALCASAR
2775 rexy 1333
cmdsocket	/run/chilli.sock
1336 richard 1334
unixipc		chilli.$INTIF.ipc
2775 rexy 1335
pidfile		/run/chilli.pid
346 richard 1336
net		$PRIVATE_NETWORK_MASK
595 richard 1337
dhcpif		$INTIF
841 richard 1338
ethers		$DIR_DEST_ETC/alcasar-ethers
861 richard 1339
#nodynip
865 richard 1340
#statip
1341
dynip		$PRIVATE_NETWORK_MASK
1249 richard 1342
domain		$DOMAIN
355 richard 1343
dns1		$PRIVATE_IP
1344
dns2		$PRIVATE_IP
346 richard 1345
uamlisten	$PRIVATE_IP
503 richard 1346
uamport		3990
2370 tom.houday 1347
uamuiport	3991
837 richard 1348
macauth
1349
macpasswd	password
1697 richard 1350
strictmacauth
1243 richard 1351
locationname	$HOSTNAME.$DOMAIN
346 richard 1352
radiusserver1	127.0.0.1
1353
radiusserver2	127.0.0.1
1354
radiussecret	$secretradius
1355
radiusauthport	1812
1356
radiusacctport	1813
2818 rexy 1357
uamserver	http://$HOSTNAME.$DOMAIN/intercept.php
2374 tom.houday 1358
redirurl
1243 richard 1359
radiusnasid	$HOSTNAME.$DOMAIN
346 richard 1360
uamsecret	$secretuam
1249 richard 1361
uamallowed	$HOSTNAME,$HOSTNAME.$DOMAIN
346 richard 1362
coaport		3799
1379 richard 1363
conup		$DIR_DEST_BIN/alcasar-conup.sh
1364
condown		$DIR_DEST_BIN/alcasar-condown.sh
2594 tom.houday 1365
macup		$DIR_DEST_BIN/alcasar-macup.sh
503 richard 1366
include		$DIR_DEST_ETC/alcasar-uamallowed
1367
include		$DIR_DEST_ETC/alcasar-uamdomain
2016 raphael.pi 1368
dhcpopt		2a04$PRIVATE_IP_HEXA
1613 franck 1369
#dhcpgateway		none
1370
#dhcprelayagent		none
1610 franck 1371
#dhcpgatewayport	none
2234 richard 1372
sslkeyfile	/etc/pki/tls/private/alcasar.key
1373
sslcertfile	/etc/pki/tls/certs/alcasar.crt
2922 rexy 1374
sslcafile	/etc/pki/tls/certs/server-chain.pem
2818 rexy 1375
#redirssl
1376
#uamuissl
346 richard 1377
EOF
2274 richard 1378
# create files for "DHCP static ip" and "DHCP static ip info". Reserve the second IP address for INTIF (the first one is for tun0)
977 richard 1379
	echo "$PRIVATE_MAC $PRIVATE_SECOND_IP" > $DIR_DEST_ETC/alcasar-ethers
2274 richard 1380
	echo "$PRIVATE_MAC $PRIVATE_SECOND_IP" > $DIR_DEST_ETC/alcasar-ethers-info
840 richard 1381
# create files for trusted domains and urls
1148 crox53 1382
	touch $DIR_DEST_ETC/alcasar-uamallowed $DIR_DEST_ETC/alcasar-uamdomain
503 richard 1383
	chown root:apache $DIR_DEST_ETC/alcasar-*
1384
	chmod 660 $DIR_DEST_ETC/alcasar-*
847 richard 1385
# Configuration des fichier WEB d'interception (secret partagé avec coova-chilli)
526 stephane 1386
	$SED "s?^\$uamsecret =.*?\$uamsecret = \"$secretuam\";?g" $DIR_WEB/intercept.php
796 richard 1387
# user 'chilli' creation (in order to run conup/off and up/down scripts
2396 tom.houday 1388
	chilli_exist=`grep -c ^chilli: /etc/passwd`
796 richard 1389
	if [ "$chilli_exist" == "1" ]
1390
	then
2454 tom.houday 1391
		userdel -r chilli 2>/dev/null
796 richard 1392
	fi
1393
	groupadd -f chilli
1394
	useradd -r -g chilli -s /bin/false -c "system user for coova-chilli" chilli
2724 rexy 1395
}  # End of chilli()
1349 richard 1396
 
2541 rexy 1397
################################################################
2990 rexy 1398
##                        "e2guardian"                        ##
3193 rexy 1399
## - Set the parameters of this HTTP proxy (as controler)     ##
2541 rexy 1400
################################################################
2724 rexy 1401
e2guardian()
1 root 1402
{
2758 rexy 1403
# Adapt systemd unit
2937 rexy 1404
	cp /lib/systemd/system/e2guardian.service /etc/systemd/system/e2guardian.service
1405
	$SED "s?^ExecStart=.*?ExecStart=/usr/sbin/e2guardian -c /etc/e2guardian/e2guardian.conf?g" /etc/systemd/system/e2guardian.service
3177 rexy 1406
	$SED "s?^After=.*?After=network-online.target chilli.service?g" /etc/systemd/system/e2guardian.service
1407
	$SED "/^PIDFile=/d" /etc/systemd/system/e2guardian.service
1408
 
2937 rexy 1409
# Adapt the main conf file
3197 rexy 1410
	[ -e $DIR_E2G/e2guardian.conf.default ] || cp $DIR_E2G/e2guardian.conf $DIR_E2G/e2guardian.conf.default
1293 richard 1411
# French deny HTML page
3197 rexy 1412
	$SED "s?^language =.*?language = 'french'?g" $DIR_E2G/e2guardian.conf
3200 rexy 1413
# Listen & loop prevention on loopback
3197 rexy 1414
	$SED "s?^#checkip = 127.0.0.1.*?checkip = 127.0.0.1?g" $DIR_E2G/e2guardian.conf
3238 rexy 1415
# 2 filtergroups (8080 & 8081)
3197 rexy 1416
	$SED "s?^#filtergroups =.*?filtergroups = 2?g" $DIR_E2G/e2guardian.conf
3193 rexy 1417
# Listen on LAN only
3197 rexy 1418
	$SED "s?^#filterip =.*?filterip = $PRIVATE_IP?g" $DIR_E2G/e2guardian.conf
3193 rexy 1419
# Listen on 8080 (group1 : BL users on HTTP)
3238 rexy 1420
	$SED "s?^#filterports = 8080:8081.*?filterports = 8080:8081?g" $DIR_E2G/e2guardian.conf
3193 rexy 1421
# Listen on 8081 (group2 : previously AV users --> to be redefine)
3197 rexy 1422
#	$SED "/^filterip = $PRIVATE_IP/a filterip = $PRIVATE_IP" $DIR_E2G/e2guardian.conf
1423
	$SED "s?^#filterports = 8081.*?filterports = 8081?g" $DIR_E2G/e2guardian.conf
3193 rexy 1424
# for now we don't listen transparently on 8443 (HTTPS) (only in future version)
3197 rexy 1425
	$SED "s?^transparenthttpsport =.*?#transparenthttpsport = 8443?g" $DIR_E2G/e2guardian.conf
1293 richard 1426
# Don't log
3197 rexy 1427
	$SED "s?^loglevel =.*?loglevel = 0?g" $DIR_E2G/e2guardian.conf
2775 rexy 1428
# Disable HTML content control (weighted & banned)
3197 rexy 1429
	$SED "s?^weightedphrasemode =.*?weightedphrasemode = 0?g" $DIR_E2G/e2guardian.conf
2840 rexy 1430
# Enable authport plugin
3197 rexy 1431
	$SED "s?^#authplugin = '/etc/e2guardian/authplugins/port.conf'?authplugin = '/etc/e2guardian/authplugins/port.conf'?g" $DIR_E2G/e2guardian.conf
1432
	$SED "s?^#mapauthtoports =.*?mapauthtoports = off?g" $DIR_E2G/e2guardian.conf
3193 rexy 1433
	# !!! Set Max RAM cache to 10Mb (for antimalware/EDR)
3197 rexy 1434
	#$SED "s?^maxcontentramcachescansize =.*?maxcontentramcachescansize = 10240?g" $DIR_E2G/e2guardian.conf
3193 rexy 1435
	# !!! Set Max file size cache to 20Mb (for antimalware/EDR)
3197 rexy 1436
	#$SED "s?^maxcontentfilecachescansize =.*?maxcontentfilecachescansize = 20480?g" $DIR_E2G/e2guardian.conf
2841 rexy 1437
 
2867 rexy 1438
# copy & adapt HTML templates
2866 rexy 1439
	cp $DIR_CONF/alcasar-e2g-fr.html /usr/share/e2guardian/languages/french/alcasar-e2g.html
1440
	cp $DIR_CONF/alcasar-e2g-en.html /usr/share/e2guardian/languages/ukenglish/alcasar-e2g.html
2867 rexy 1441
	$SED "s?\/\/[a-z.]*\/?\/\/$HOSTNAME.$DOMAIN\/?g" /usr/share/e2guardian/languages/french/alcasar-e2g.html
1442
	$SED "s?\/\/[a-z.]*\/?\/\/$HOSTNAME.$DOMAIN\/?g" /usr/share/e2guardian/languages/ukenglish/alcasar-e2g.html
2866 rexy 1443
 
3193 rexy 1444
###### ALCASAR filtering for group1 (blacklisted_users) ####
1445
# Adapt group1 conf file
3197 rexy 1446
	[ -e $DIR_E2G/e2guardianf1.conf.default ] || cp $DIR_E2G/e2guardianf1.conf $DIR_E2G/e2guardianf1.conf.default
3200 rexy 1447
	$SED "s?^#reportinglevel =.*?reportinglevel = 3?g" $DIR_E2G/e2guardianf1.conf
1448
	$SED "s?^#groupname =.*?groupname = 'blacklisted_users'?g" $DIR_E2G/e2guardianf1.conf
1449
	$SED "s?^#htmltemplate =.*?htmltemplate = 'alcasar-e2g.html'?g" $DIR_E2G/e2guardianf1.conf
1450
	$SED "s?^\.Define LISTDIR.*?\.Define LISTDIR <$DIR_E2G/lists/group1>?g" $DIR_E2G/e2guardianf1.conf
3197 rexy 1451
	DIR_E2G_GROUP1="$DIR_E2G/lists/group1"
1452
	cp -r $DIR_E2G/lists/example.group $DIR_E2G_GROUP1
3243 rexy 1453
 
2840 rexy 1454
# RAZ bannedphraselist
3197 rexy 1455
	$SED "s?^[^#]?#&?g" $DIR_E2G_GROUP1/bannedphraselist # (comment what is not)
2519 rexy 1456
# Disable URL control with regex
3197 rexy 1457
	$SED "s?^[^#]?#&?g" $DIR_E2G_GROUP1/bannedregexpurllist # (comment what is not)
2758 rexy 1458
# Dont filtering files by extension or mime-type (empty list)
3197 rexy 1459
	> $DIR_E2G_GROUP1/bannedextensionlist
1460
	> $DIR_E2G_GROUP1/bannedmimetypelist
2758 rexy 1461
# Creation of ALCASAR banned site list
3197 rexy 1462
	cat <<EOF > $DIR_E2G_GROUP1/greysitelist
2775 rexy 1463
# E2guardian filter config for ALCASAR
1464
# In ALCASAR E2guardian filters only URLs (domains are filtered with unbound)
2758 rexy 1465
# block all SSL and CONNECT tunnels
1466
**s
1467
# block all SSL and CONNECT tunnels specified only as an IP
1468
*ips
1469
# block all sites specified only by an IP
1470
*ip
1471
EOF
3195 rexy 1472
# Creation of file for banned URLs (filled later with Toulouse BL --> see BL function)
3197 rexy 1473
	cat <<EOF > $DIR_E2G_GROUP1/bannedurllist
3193 rexy 1474
# E2guardian URL filter config for ALCASAR
2758 rexy 1475
EOF
3195 rexy 1476
# Creation of files for rehabilited domains
3197 rexy 1477
	> $DIR_E2G_GROUP1/exceptionsitelist
3195 rexy 1478
# Creation of files for rehabilited IP
3243 rexy 1479
	[ -e $DIR_E2G_GROUP1/exceptionsiteiplist.default ] || mv $DIR_E2G_GROUP1/exceptionsiteiplist $DIR_E2G_GROUP1/exceptionsiteiplist.default
1480
	> $DIR_E2G_GROUP1/exceptionsiteiplist
2758 rexy 1481
# Add Bing to the safesearch url regext list (parental control)
3197 rexy 1482
	cat <<EOF >> $DIR_E2G_GROUP1/urlregexplist
2758 rexy 1483
# Bing - add 'adlt=strict'
1484
#"(^http://[0-9a-z]+\.bing\.[a-z]+[-/%.0-9a-z]*\?)(.*)"->"\1\2&adlt=strict"
1485
EOF
3243 rexy 1486
# 'Safesearch' regex actualisation
3197 rexy 1487
	$SED "s?images?search?g" $DIR_E2G_GROUP1/urlregexplist
1488
	# change the google safesearch ("safe=strict" instead of "safe=vss")
1489
	$SED "s?safe=vss?safe=strict?g" $DIR_E2G_GROUP1/urlregexplist
3243 rexy 1490
	chown -R e2guardian:root $DIR_E2G_GROUP1
1491
	chmod -R 660 $DIR_E2G_GROUP1
1492
	###### ALCASAR filtering for group2 (previously av_users) ####
3193 rexy 1493
# Create & adapt group2 conf file (av + av_wl)
3197 rexy 1494
	cp $DIR_E2G/e2guardianf1.conf.default $DIR_E2G/e2guardianf2.conf
1495
	$SED "s?^#reportinglevel =.*?reportinglevel = 3?g" $DIR_E2G/e2guardianf2.conf
1496
	$SED "s?^#groupname =.*?groupname = 'antimalware + whitelested users'?g" $DIR_E2G/e2guardianf2.conf
2841 rexy 1497
 
2775 rexy 1498
# create log folder
3193 rexy 1499
	mkdir -p /var/log/e2guardian
2775 rexy 1500
	chown -R e2guardian /etc/e2guardian /var/log/e2guardian
2724 rexy 1501
} # End of e2guardian()
1 root 1502
 
2724 rexy 1503
##############################################################
2990 rexy 1504
##                        "ulogd"                           ##
2724 rexy 1505
## - Ulog config for multi-log files                        ##
1506
##############################################################
1507
ulogd()
476 richard 1508
{
1509
# Three instances of ulogd (three different logfiles)
1510
	[ -d /var/log/firewall ] || mkdir -p /var/log/firewall
478 richard 1511
	nl=1
1358 richard 1512
	for log_type in traceability ssh ext-access
478 richard 1513
	do
2937 rexy 1514
		cp -f /lib/systemd/system/ulogd.service /etc/systemd/system/ulogd-$log_type.service
1369 richard 1515
		[ -e /var/log/firewall/$log_type.log ] || echo "" > /var/log/firewall/$log_type.log
1375 richard 1516
		cp -f $DIR_CONF/ulogd-sample.conf /etc/ulogd-$log_type.conf
1704 richard 1517
		$SED "s?^group=.*?group=$nl?g" /etc/ulogd-$log_type.conf
478 richard 1518
		cat << EOF >> /etc/ulogd-$log_type.conf
1452 richard 1519
[emu1]
478 richard 1520
file="/var/log/firewall/$log_type.log"
1521
sync=1
1522
EOF
2938 rexy 1523
		$SED "s?^ExecStart=.*?ExecStart=/usr/sbin/ulogd -c /etc/ulogd-$log_type.conf $ULOGD_OPTIONS?g" /etc/systemd/system/ulogd-$log_type.service
478 richard 1524
		nl=`expr $nl + 1`
1525
	done
476 richard 1526
	chown -R root:apache /var/log/firewall
1527
	chmod 750 /var/log/firewall
1528
	chmod 640 /var/log/firewall/*
2724 rexy 1529
}  # End of ulogd()
476 richard 1530
 
1159 crox53 1531
##########################################################
2990 rexy 1532
##                     "nfsen"                          ##
2771 rexy 1533
## - configure NetFlow collector (nfcapd)               ##
1534
## - configure NetFlow grapher (nfsen-ng)               ##
1159 crox53 1535
##########################################################
1389 richard 1536
nfsen()
1 root 1537
{
2772 rexy 1538
	groupadd -f nfcapd
2868 rexy 1539
	id -u nfcapd >/dev/null 2>&1 || useradd -r -g nfcapd -s /bin/false -c "system user for nfcapd" nfcapd
2771 rexy 1540
# nfcapd unit for systemd
2937 rexy 1541
	cat << EOF > /etc/systemd/system/nfcapd.service
1372 richard 1542
#  This file is part of systemd.
1543
#
1544
#  systemd is free software; you can redistribute it and/or modify it
1545
#  under the terms of the GNU General Public License as published by
1546
#  the Free Software Foundation; either version 2 of the License, or
1547
#  (at your option) any later version.
1548
 
2771 rexy 1549
# This unit launches nfcapd (a Netflow collector).
1372 richard 1550
[Unit]
2771 rexy 1551
Description=Netflow Capture Daemon
1552
After=network-online.target iptables.service
1372 richard 1553
 
1554
[Service]
3079 rexy 1555
Type=simple
3242 rexy 1556
ExecStartPre=/bin/mkdir -p /run/nfcapd
1557
ExecStartPre=/bin/chown nfcapd:nfcapd /run/nfcapd
2771 rexy 1558
PIDFile=/run/nfcapd/nfcapd.pid
3240 rexy 1559
ExecStart=/usr/bin/nfcapd -D -b 127.0.0.1 -p 2055 -u nfcapd -g nfcapd -B 200000 -t 300 -S 1 -z -P /run/nfcapd/nfcapd.pid -I alcasar_netflow -w /var/log/nfsen/profiles-data/live/alcasar_netflow
2771 rexy 1560
ExecReload=/bin/kill -HUP $MAINPID
1372 richard 1561
 
1562
[Install]
1563
WantedBy=multi-user.target
1564
EOF
2825 rexy 1565
    [ -d /var/log/nfsen/profiles-data/live/alcasar_netflow ] || mkdir -p /var/log/nfsen/profiles-data/live/alcasar_netflow
3240 rexy 1566
    touch /var/log/nfsen/profiles-data/live/alcasar_netflow/.nfstat
3242 rexy 1567
    chown -R nfcapd:nfcapd /var/log/nfsen
3240 rexy 1568
# nfsen-ng
1569
 
1570
 
1571
 
2724 rexy 1572
} # End of nfsen()
1 root 1573
 
2552 rexy 1574
###########################################################
2990 rexy 1575
##                       "vnstat"                        ##
2809 rexy 1576
## - Initialization of vnstat and vnstat-dashboard       ##
2552 rexy 1577
###########################################################
2724 rexy 1578
vnstat()
1541 richard 1579
{
2990 rexy 1580
# vnstat
2933 rexy 1581
	[ -e /etc/vnstat.conf.default ] || cp /etc/vnstat.conf /etc/vnstat.conf.default
2589 rexy 1582
	$SED "s?^Interface.*?Interface \"$EXTIF\"?g" /etc/vnstat.conf
2688 lucas.echa 1583
	$SED "s?^DatabaseDir.*?DatabaseDir /var/log/vnstat?g" /etc/vnstat.conf
2933 rexy 1584
	$SED "s?^MaxBandwidth.*?MaxBandwidth 10000?g" /etc/vnstat.conf
2990 rexy 1585
# vnstat-dashboard
2933 rexy 1586
	$SED "s?^\$thisInterface.*?\$thisInterface = \"$EXTIF\";?" $DIR_ACC/manager/vnstat/index.php
2937 rexy 1587
	cp /lib/systemd/system/vnstat.service /etc/systemd/system/vnstat.service
3077 rexy 1588
	$SED "s?^ReadWritePaths=.*?ReadWritePaths=/var/log?g" /etc/systemd/system/vnstat.service
2724 rexy 1589
} # End of vnstat()
2281 tom.houday 1590
 
2724 rexy 1591
#########################################################
2990 rexy 1592
##                     "unbound"                       ##
2724 rexy 1593
## - create the conf files for 4 unbound services      ##
1594
## - create the systemd files for 4 unbound services   ##
1595
#########################################################
2688 lucas.echa 1596
unbound ()
1597
{
1598
	[ -d /etc/unbound/conf.d ] || mkdir -p /etc/unbound/conf.d
1599
	[ -d /etc/unbound/conf.d/common ] || mkdir /etc/unbound/conf.d/common
1600
	[ -d /etc/unbound/conf.d/common/local-forward ] || mkdir /etc/unbound/conf.d/common/local-forward
1601
	[ -d /etc/unbound/conf.d/common/local-dns ] || mkdir /etc/unbound/conf.d/common/local-dns
1602
	[ -d /etc/unbound/conf.d/forward ] || mkdir /etc/unbound/conf.d/forward
1603
	[ -d /etc/unbound/conf.d/blacklist ] || mkdir /etc/unbound/conf.d/blacklist
1604
	[ -d /etc/unbound/conf.d/whitelist ] || mkdir /etc/unbound/conf.d/whitelist
1605
	[ -d /etc/unbound/conf.d/blackhole ] || mkdir /etc/unbound/conf.d/blackhole
2833 rexy 1606
	[ -d /var/log/unbound ] || mkdir /var/log/unbound
1607
	chown unbound:unbound /var/log/unbound
2688 lucas.echa 1608
	[ -e /etc/unbound/unbound.conf.default ] || cp /etc/unbound/unbound.conf /etc/unbound/unbound.conf.default
1609
 
2724 rexy 1610
# Forward zone configuration file for all unbound dns servers
2688 lucas.echa 1611
	cat << EOF > /etc/unbound/conf.d/common/forward-zone.conf
1612
forward-zone:
1613
	name: "."
1614
	forward-addr: $DNS1
1615
	forward-addr: $DNS2
1472 richard 1616
EOF
1617
 
2724 rexy 1618
# Custom configuration file for manual DNS configuration
2688 lucas.echa 1619
	cat << EOF > /etc/unbound/conf.d/common/local-forward/custom.conf
1620
## Ajouter un bloc pour chaque nom de domaine géré par un autre seveur DNS
1621
## Add one block for each domain name managed by an other DNS server
1622
##
1623
## Example:
1624
##
1625
## server:
1626
##     local-zone: "<your_domain>." transparent
1627
## forward-zone:
1628
##     name: "<your_domain>."
1629
##     forward-addr: <@IP_domain_server>
1630
##
2558 rexy 1631
EOF
1632
 
2724 rexy 1633
# Configuration file of ALCASAR main domains for $INTIF
2688 lucas.echa 1634
	cat << EOF > /etc/unbound/conf.d/common/local-dns/${INTIF}.conf
1635
server:
1636
	local-data: "$HOSTNAME.$DOMAIN A $PRIVATE_IP"
2831 rexy 1637
	local-data-ptr: "$PRIVATE_IP $HOSTNAME.$DOMAIN"
2688 lucas.echa 1638
EOF
1639
 
2724 rexy 1640
# Configuration file for lo of forward unbound
2688 lucas.echa 1641
	cat << EOF > /etc/unbound/conf.d/forward/iface.lo.conf
1642
server:
1643
	interface: 127.0.0.1@53
1644
	access-control-view: 127.0.0.1/8 lo
1645
view:
1646
	name: "lo"
2864 rexy 1647
	local-data: "$HOSTNAME A 127.0.0.1"
2688 lucas.echa 1648
	local-data: "$HOSTNAME.$DOMAIN A 127.0.0.1"
2864 rexy 1649
	local-data-ptr: "127.0.0.1 $HOSTNAME.$DOMAIN"
2688 lucas.echa 1650
	view-first: yes
1651
EOF
1652
 
2724 rexy 1653
# Configuration file for $INTIF of forward unbound
2688 lucas.echa 1654
	cat << EOF > /etc/unbound/conf.d/forward/iface.${INTIF}.conf
1655
server:
1656
	interface: ${PRIVATE_IP}@53
1657
	access-control-view: $PRIVATE_NETWORK_MASK $INTIF
1658
view:
1659
	name: "$INTIF"
1660
	view-first: yes
1661
EOF
1662
 
2831 rexy 1663
# Configuration file for main unbound
2688 lucas.echa 1664
	cat << EOF > /etc/unbound/unbound.conf
1665
server:
1666
	verbosity: 1
1667
	hide-version: yes
1668
	hide-identity: yes
1669
	do-ip6: no
1670
	include: /etc/unbound/conf.d/common/forward-zone.conf
1671
	include: /etc/unbound/conf.d/common/local-forward/*
1672
	include: /etc/unbound/conf.d/common/local-dns/*
1673
	include: /etc/unbound/conf.d/forward/*
1674
EOF
1675
 
2724 rexy 1676
# Configuration file for $INTIF of blacklist unbound
2688 lucas.echa 1677
	cat << EOF > /etc/unbound/conf.d/blacklist/iface.${INTIF}.conf
1678
server:
1679
	interface: ${PRIVATE_IP}@54
1680
	access-control: $PRIVATE_IP_MASK allow
1681
	access-control-tag: $PRIVATE_IP_MASK "blacklist"
1682
	access-control-tag-action: $PRIVATE_IP_MASK "blacklist" redirect
1683
	access-control-tag-data: $PRIVATE_IP_MASK "blacklist" "A $PRIVATE_IP"
1684
EOF
1685
 
2724 rexy 1686
# Configuration file for blacklist unbound
2688 lucas.echa 1687
	cat << EOF > /etc/unbound/unbound-blacklist.conf
1688
server:
1689
	verbosity: 1
1690
	hide-version: yes
1691
	hide-identity: yes
1692
	do-ip6: no
1693
	logfile: "/var/log/unbound/unbound-blacklist.log"
1694
	chroot: ""
1695
	define-tag: "blacklist"
1696
	log-local-actions: yes
1697
	include: /etc/unbound/conf.d/common/forward-zone.conf
1698
	include: /etc/unbound/conf.d/common/local-forward/*
1699
	include: /etc/unbound/conf.d/common/local-dns/*
1700
	include: /etc/unbound/conf.d/blacklist/*
1701
	include: /usr/local/share/unbound-bl-enabled/*
1702
EOF
1703
 
2724 rexy 1704
# Configuration file for $INTIF of whitelist unbound
2688 lucas.echa 1705
	cat << EOF > /etc/unbound/conf.d/whitelist/iface.${INTIF}.conf
1706
server:
1707
	interface: ${PRIVATE_IP}@55
1708
	access-control: $PRIVATE_IP_MASK allow
1709
	access-control-tag: $PRIVATE_IP_MASK "whitelist"
1710
	access-control-tag-action: $PRIVATE_IP_MASK "whitelist" redirect
1711
	access-control-tag-data: $PRIVATE_IP_MASK "whitelist" "A $PRIVATE_IP"
1712
EOF
1713
 
2724 rexy 1714
# Configuration file for whitelist unbound
2688 lucas.echa 1715
	cat << EOF > /etc/unbound/unbound-whitelist.conf
1716
server:
3099 rexy 1717
	module-config: "ipset validator iterator"
2688 lucas.echa 1718
	verbosity: 1
1719
	hide-version: yes
1720
	hide-identity: yes
1721
	do-ip6: no
1722
	do-not-query-localhost: no
1723
	define-tag: "whitelist"
1724
	local-zone: "." transparent
1725
	local-zone-tag: "." "whitelist"
3099 rexy 1726
	include: /etc/unbound/conf.d/common/forward-zone.conf
2861 rexy 1727
	include: /etc/unbound/conf.d/common/local-forward/*
1728
	include: /etc/unbound/conf.d/common/local-dns/*
1729
	include: /etc/unbound/conf.d/whitelist/*
2688 lucas.echa 1730
	include: /usr/local/share/unbound-wl-enabled/*
3099 rexy 1731
	username: ""
1732
ipset:
1733
	name-v4: "wl_ip_allowed"
2688 lucas.echa 1734
EOF
1735
 
2724 rexy 1736
# Configuration file for $INTIF of blackhole unbound
2688 lucas.echa 1737
	cat << EOF > /etc/unbound/conf.d/blackhole/iface.${INTIF}.conf
1738
server:
1739
	interface: ${PRIVATE_IP}@56
1740
	access-control-view: $PRIVATE_NETWORK_MASK $INTIF
1741
view:
1742
	name: "$INTIF"
1743
	local-zone: "." redirect
1744
	local-data: ". A $PRIVATE_IP"
1745
EOF
1746
 
2724 rexy 1747
# Configuration file for blackhole unbound
2688 lucas.echa 1748
	cat << EOF > /etc/unbound/unbound-blackhole.conf
1749
server:
1750
	verbosity: 1
1751
	hide-version: yes
1752
	hide-identity: yes
1753
	do-ip6: no
2861 rexy 1754
	include: /etc/unbound/conf.d/common/local-forward/*
1755
	include: /etc/unbound/conf.d/common/local-dns/*
2688 lucas.echa 1756
	include: /etc/unbound/conf.d/blackhole/*
1757
EOF
2937 rexy 1758
	cp /lib/systemd/system/unbound.service /etc/systemd/system/unbound.service
1759
	$SED "s?^ExecStart=.*?ExecStart=/usr/sbin/unbound -d -c /etc/unbound/unbound.conf?g" /etc/systemd/system/unbound.service
1760
	$SED "s?^After=.*?After=syslog.target network-online.target chilli.service?g" /etc/systemd/system/unbound.service
3177 rexy 1761
	$SED "/^PIDFile=/d" /etc/systemd/system/unbound.service
2688 lucas.echa 1762
	for list in blacklist blackhole whitelist
1474 richard 1763
	do
3177 rexy 1764
		cp -f /etc/systemd/system/unbound.service /etc/systemd/system/unbound-$list.service
2937 rexy 1765
		$SED "s?^ExecStart=.*?ExecStart=/usr/sbin/unbound -d -c /etc/unbound/unbound-$list.conf?g" /etc/systemd/system/unbound-$list.service
1474 richard 1766
	done
2724 rexy 1767
} # End of unbound()
2688 lucas.echa 1768
 
2689 lucas.echa 1769
##################################################
2990 rexy 1770
##                   "dhcpd"                    ##
2689 lucas.echa 1771
##################################################
2724 rexy 1772
dhcpd()
2689 lucas.echa 1773
{
1774
	[ -e /etc/dhcpd.conf.default ] || cp /etc/dhcpd.conf /etc/dhcpd.conf.default
1775
	cat <<EOF > /etc/dhcpd.conf
1776
ddns-update-style none;
1777
subnet $PRIVATE_NETWORK netmask $PRIVATE_NETMASK {
1778
	option routers $PRIVATE_IP;
1779
	option subnet-mask $PRIVATE_NETMASK;
1780
	option domain-name-servers $PRIVATE_IP;
1781
	range dynamic-bootp $PRIVATE_SECOND_IP $PRIVATE_LAST_IP;
1782
	default-lease-time 21600;
1783
	max-lease-time 43200;
1784
}
1785
EOF
3238 rexy 1786
chown -R dhcpd:dhcpd /var/lib/dhcpd
2724 rexy 1787
} # End of dhcpd()
2689 lucas.echa 1788
 
2552 rexy 1789
##########################################################
2990 rexy 1790
##                         "BL"                         ##
2769 rexy 1791
## - copy & adapt Toulouse BL to ALCASAR architecture   ##
2688 lucas.echa 1792
##     - domain names for unbound-bl & unbound-wl       ##
2552 rexy 1793
##     - URLs for E²guardian                            ##
1794
##     - IPs for NetFilter                              ##
2769 rexy 1795
## - copy additional BLs (TOR + Ultrasurf + C&C)        ##
2552 rexy 1796
##########################################################
2724 rexy 1797
BL()
308 richard 1798
{
2990 rexy 1799
# copy the Toulouse university BL in order to be adapted to ALCASAR architecture (alcasar-bl.sh -adapt)
3197 rexy 1800
	rm -rf $DIR_E2G/lists/blacklists
1930 richard 1801
	mkdir -p /tmp/blacklists
1938 richard 1802
	cp $DIR_BLACKLIST/blacklists.tar.gz /tmp/blacklists/
2769 rexy 1803
# creation of the additional BL and WL categorie named "ossi" (for domain names & ip only)
3197 rexy 1804
	mkdir -p $DIR_E2G/lists/blacklists/ossi-bl
1805
	touch $DIR_E2G/lists/blacklists/ossi-bl/domains
1957 richard 1806
	echo "ossi-bl" >> $DIR_DEST_ETC/alcasar-bl-categories-enabled
3197 rexy 1807
	mkdir -p $DIR_E2G/lists/blacklists/ossi-wl
1808
	touch $DIR_E2G/lists/blacklists/ossi-wl/domains
1957 richard 1809
	echo "ossi-wl" >> $DIR_DEST_ETC/alcasar-wl-categories-enabled
2769 rexy 1810
# add additional BL files
2770 rexy 1811
	for x in $(ls $DIR_BLACKLIST | grep -v "^blacklists")
1957 richard 1812
	do
3197 rexy 1813
		mkdir $DIR_E2G/lists/blacklists/ossi-bl-$x
1814
		cp $DIR_BLACKLIST/$x  $DIR_E2G/lists/blacklists/ossi-bl-$x/domains
1957 richard 1815
		echo "ossi-bl-$x" >> $DIR_DEST_ETC/alcasar-bl-categories-enabled
1816
	done
3197 rexy 1817
	chown -R e2guardian:apache $DIR_E2G
1957 richard 1818
	chown -R root:apache $DIR_DEST_SHARE
3197 rexy 1819
	chmod -R g+rw $DIR_E2G $DIR_DEST_SHARE
1927 richard 1820
# adapt the Toulouse BL to ALCASAR architecture
1957 richard 1821
	$DIR_DEST_BIN/alcasar-bl.sh --adapt
1925 richard 1822
# enable the default categories
1957 richard 1823
	$DIR_DEST_BIN/alcasar-bl.sh --cat_choice
2560 rexy 1824
	rm -rf /tmp/blacklists
2724 rexy 1825
} # End of BL()
219 jeremy 1826
 
2552 rexy 1827
#######################################################
2990 rexy 1828
##                    "cron"                         ##
2552 rexy 1829
## - write all cron & anacron files                  ##
1830
#######################################################
2724 rexy 1831
cron()
1 root 1832
{
2640 rexy 1833
# 'crontab' with standard cron at midnight instead of 4:0 am (default)
1 root 1834
	[ -e /etc/crontab.default ] || cp /etc/crontab /etc/crontab.default
1835
	cat <<EOF > /etc/crontab
1828 richard 1836
SHELL=/usr/bin/bash
2640 rexy 1837
PATH=/sbin:/bin:/usr/sbin:/usr/bin
1 root 1838
MAILTO=root
1839
HOME=/
1840
 
1841
# run-parts
1842
01 * * * * root nice -n 19 run-parts --report /etc/cron.hourly
1843
02 0 * * * root nice -n 19 run-parts --report /etc/cron.daily
1844
22 0 * * 0 root nice -n 19 run-parts --report /etc/cron.weekly
1845
42 0 1 * * root nice -n 19 run-parts --report /etc/cron.monthly
1846
EOF
1847
	[ -e /etc/anacrontab.default ] || cp /etc/anacrontab /etc/anacrontab.default
1848
	cat <<EOF >> /etc/anacrontab
2454 tom.houday 1849
7	8	cron.MysqlDump		nice /etc/cron.d/alcasar-mysql
1850
7	10	cron.logExport		nice /etc/cron.d/alcasar-archive
1 root 1851
EOF
811 richard 1852
	cat <<EOF > /etc/cron.d/alcasar-mysql
2640 rexy 1853
# Verify, repair and export users database (every monday at 4:45 am)
1828 richard 1854
45 4 * * 1 root $DIR_DEST_BIN/alcasar-mysql.sh --dump
2640 rexy 1855
# Remove users whose expiration date is exceeded for more more than 7 days (every Monday at 4:40 am)
1828 richard 1856
40 4 * * * root $DIR_DEST_BIN/alcasar-mysql.sh --expire_user 2>&1 >/dev/null
1 root 1857
EOF
952 franck 1858
	cat <<EOF > /etc/cron.d/alcasar-archive
2640 rexy 1859
# Archiving logs (traceability & users database) (every Monday at 5:35 am)
952 franck 1860
35 5 * * 1 root $DIR_DEST_BIN/alcasar-archive.sh --now
1861
EOF
2454 tom.houday 1862
	cat <<EOF > /etc/cron.d/alcasar-ticket-clean
2640 rexy 1863
# Remove password files (created when importing users by CSV files) and user's PDF voucher (every hours at 30')
1566 richard 1864
30 * * * *  root $DIR_DEST_BIN/alcasar-ticket-clean.sh
168 franck 1865
EOF
2454 tom.houday 1866
	cat <<EOF > /etc/cron.d/alcasar-distrib-updates
2967 rexy 1867
# Update the system and reboot if needed (everyday at 3:30 am)
1868
30 3 * * *  root /usr/sbin/urpmi --auto-update --auto 2>&1 ; /usr/local/bin/alcasar-daemon.sh -after-update
722 franck 1869
EOF
2454 tom.houday 1870
	cat <<EOF > /etc/cron.d/alcasar-connections-stats
1808 richard 1871
# Connection stats update (accounting). These Perl scripts are from "dialup_admin" (cf. wiki.freeradius.org/Dialup_admin).
2640 rexy 1872
# 'alcasar-tot_stats' : aggregate the daily connections of users and write it in the table 'totacct' (everyday at 1:01 pm)
1873
# 'alcasar-monthly_tot_stat' : aggregate the monthly connections of users and write it in table 'mtotacct' (everyday at 1h05 pm)
1874
# 'alcasar-truncate_raddact' : remove the user' session log older than 365 days (applying French law : "LCEN") (every month, the first at 01:10 pm)
1875
# 'alcasar-clean_radacct' : close the sessions openned for more than 30 days (every month, the first at 01:15 pm)
1876
# 'alcasar-activity_report.sh' : generate an activity report in PDF (every sunday at 5:35 pm)
1808 richard 1877
1 1 * * * root $DIR_DEST_BIN/alcasar-tot_stats > /dev/null 2>&1
1878
5 1 * * * root $DIR_DEST_BIN/alcasar-monthly_tot_stats > /dev/null 2>&1
1879
10 1 1 * * root $DIR_DEST_BIN/alcasar-truncate_radacct > /dev/null 2>&1
1880
15 1 1 * * root $DIR_DEST_BIN/alcasar-clean_radacct > /dev/null 2>&1
2009 raphael.pi 1881
35 5 * * 0 root $DIR_DEST_BIN/alcasar-activity_report.sh > /dev/null 2>&1
1 root 1882
EOF
2454 tom.houday 1883
	cat <<EOF > /etc/cron.d/alcasar-watchdog
2640 rexy 1884
# 'alcasar-watchdog.sh' : run the "watchdog" (every 10')
3099 rexy 1885
# 'alcasar-flush_ipset_wl.sh' : empty the IPSET of the whitelisted IP loaded dynamically with unbound-whitelist hook (every sunday at 0:05 am)
2886 rexy 1886
# 'alcasar-watchdog.sh --disconnect-permanent-users' : disconnect users with attribute "Alcasar-Status-Page-Must-Stay-Open" (daily --> see "cron.daily")
2640 rexy 1887
# 'alcasar-watchdog-hl.sh' : (optionnaly) remove the IP 0.0.0.0 from chilli cache memory
2395 tom.houday 1888
*/10 * * * * root $DIR_DEST_BIN/alcasar-watchdog.sh > /dev/null 2>&1
1905 raphael.pi 1889
 
2886 rexy 1890
@daily root $DIR_DEST_BIN/alcasar-watchdog.sh --disconnect-permanent-users > /dev/null 2>&1
2228 franck 1891
#* * * * * root $DIR_DEST_BIN/alcasar-watchdog-hl.sh > /dev/null 2>&1
1 root 1892
EOF
2454 tom.houday 1893
	cat <<EOF > /etc/cron.d/alcasar-daemon-watchdog
2886 rexy 1894
# start dead daemons (after boot process and every 20')
1851 franck 1895
@reboot root $DIR_DEST_BIN/alcasar-daemon.sh > /dev/null 2>&1
2886 rexy 1896
*/20 * * * * root $DIR_DEST_BIN/alcasar-daemon.sh > /dev/null 2>&1
808 franck 1897
EOF
2454 tom.houday 1898
	cat <<EOF > /etc/cron.d/alcasar-rsync-bl
2769 rexy 1899
# Automatic update the BL (every 12 hours). The enabled categories are listed in '/usr/local/etc/update_cat.conf' (no sync if empty).
1900
 
1874 raphael.pi 1901
EOF
2769 rexy 1902
	cat <<EOF > /etc/cron.d/alcasar-rsync-ossi_bl
1903
# Automatic update the OSSI BLs (every 12 hours) by running the custom update scripts specified in '/usr/local/etc/update_ossi_cat.conf'.
1904
 
1905
EOF
2304 tom.houday 1906
	cat <<EOF > /etc/cron.d/alcasar-letsencrypt
2640 rexy 1907
# Automatic renew the Let's Encrypt certificate (daily --> see "cron.daily")
2304 tom.houday 1908
@daily root $DIR_DEST_BIN/alcasar-letsencrypt.sh --cron > /dev/null 2>&1
1909
EOF
2771 rexy 1910
	cat <<EOF > /etc/cron.d/alcasar-nfcapd-expire
2886 rexy 1911
# Remove netflow files older than one year (daily --> see "cron.daily")
2825 rexy 1912
@daily root /usr/bin/nfexpire -e /var/log/nfsen/profiles-data/live/alcasar_netflow -t 365d
2771 rexy 1913
EOF
1808 richard 1914
# removing the users crons
522 richard 1915
	rm -f /var/spool/cron/*
2724 rexy 1916
} # End of cron()
1 root 1917
 
2867 rexy 1918
########################################################################
2990 rexy 1919
##                              "Fail2Ban"                            ##
2867 rexy 1920
##- Adapt conf file to ALCASAR                                        ##
3231 rexy 1921
##- Secure items : SSH, intercept & ACC brute-Force + evasive + pwd   ##
2867 rexy 1922
########################################################################
1163 crox53 1923
fail2ban()
1924
{
2868 rexy 1925
# adapt fail2ban to Mageia (fedora like) & ALCASAR behaviour
2990 rexy 1926
	[ -e /etc/fail2ban/jail.conf.default ] || cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.conf.default
3191 rexy 1927
	$SED "s?^before =.*?before = paths-mageia.conf?g" /etc/fail2ban/jail.conf
2867 rexy 1928
 
1929
# add 5 jails and their filters
3231 rexy 1930
## sshd : Ban after 5 failed attempts (ie. brute-force). This "jail" uses the default "sshd" f2b filter.
2990 rexy 1931
	cat << EOF > /etc/fail2ban/jail.d/01-alcasar_sshd.conf
2867 rexy 1932
[sshd]
1933
enabled = true
1934
#enabled  = false
3231 rexy 1935
maxretry = 5
2868 rexy 1936
bantime = 3m
3231 rexy 1937
findtime = 3m
2867 rexy 1938
EOF
1939
 
3231 rexy 1940
## alcasar_httpd-auth : Ban after 3 failed attempts on ACC. This "jail" uses the default "apache-auth" f2b filter.
1941
	cat << EOF > /etc/fail2ban/jail.d/02-alcasar_httpd-auth.conf
1942
[apache-auth]
1943
enabled = true
2867 rexy 1944
#enabled  = false
3231 rexy 1945
maxretry = 3
1946
bantime = 3m
1947
findtime = 3m
1948
EOF
2867 rexy 1949
 
1950
## mod-evasive : Ban after 3 failed retrieve page attempts (ie : unknown page)
2990 rexy 1951
	cat << EOF > /etc/fail2ban/jail.d/03-alcasar_mod-evasive.conf
2867 rexy 1952
[alcasar_mod-evasive]
3231 rexy 1953
enabled = true
1954
#enabled = false
2867 rexy 1955
backend = auto
1956
filter = alcasar_mod-evasive
1957
action = iptables-allports[name=alcasar_mod-evasive]
3231 rexy 1958
logpath = /var/log/httpd/access_log
2867 rexy 1959
maxretry = 3
2868 rexy 1960
bantime = 3m
1961
findtime = 3m
2867 rexy 1962
EOF
2990 rexy 1963
	cat << EOF > /etc/fail2ban/filter.d/alcasar_mod-evasive.conf
2867 rexy 1964
[Definition]
1965
failregex =  <HOST> .+\] "[^"]+" 403
1966
ignoreregex =
1967
EOF
1968
 
1969
### alcasar_intercept : ban after 5 failed user login attemps on intercept.php
2990 rexy 1970
	cat << EOF > /etc/fail2ban/jail.d/04-alcasar_intercept.conf
2867 rexy 1971
[alcasar_intercept]
1972
enabled = true
1973
#enabled = false
1974
backend = auto
1975
filter = alcasar_intercept
1976
action = iptables-allports[name=alcasar_intercept]
3231 rexy 1977
logpath = /var/log/httpd/access_log
2867 rexy 1978
maxretry = 5
2868 rexy 1979
bantime = 3m
1980
findtime = 3m
1981
EOF
2990 rexy 1982
	cat << EOF > /etc/fail2ban/filter.d/alcasar_intercept.conf
2867 rexy 1983
[Definition]
1984
failregex = <HOST> .* \"GET \/intercept\.php\?res=failed\&reason=reject
1985
ignoreregex =
1986
EOF
1987
 
1988
## alcasar_change-pwd : ban after 5 failed user change password attempts
2990 rexy 1989
	cat << EOF > /etc/fail2ban/jail.d/05-alcasar_change-pwd.conf
2867 rexy 1990
[alcasar_change-pwd]
1991
enabled = true
1992
#enabled = false
1993
backend = auto
1994
filter = alcasar_change-pwd
1995
action = iptables-allports[name=alcasar_change-pwd]
3231 rexy 1996
logpath = /var/log/httpd/access_log
2867 rexy 1997
maxretry = 5
2868 rexy 1998
bantime = 3m
1999
findtime = 3m
2867 rexy 2000
EOF
2990 rexy 2001
	cat << EOF > /etc/fail2ban/filter.d/alcasar_change-pwd.conf
2867 rexy 2002
[Definition]
2003
failregex = <HOST> .* \"POST \/password\.php
2004
ignoreregex =
2005
EOF
2006
 
2840 rexy 2007
# allow reading of 2 log files (fail2ban & watchdog).
2744 rexy 2008
	[ -e /var/log/fail2ban.log ] || /usr/bin/touch /var/log/fail2ban.log
2887 rexy 2009
	[ -e $DIR_SAVE/security/watchdog.log ] || /usr/bin/touch $DIR_SAVE/security/watchdog.log
1165 crox53 2010
	chmod 644 /var/log/fail2ban.log
2887 rexy 2011
	chmod 644 $DIR_SAVE/security/watchdog.log
1418 richard 2012
	/usr/bin/touch /var/log/auth.log
1515 richard 2013
# fail2ban unit
2990 rexy 2014
	cp /lib/systemd/system/fail2ban.service /etc/systemd/system/fail2ban.service
2015
	$SED '/ExecStart=/a\ExecStop=/usr/bin/fail2ban-client stop' /etc/systemd/system/fail2ban.service
2016
	$SED '/Type=/a\PIDFile=/run/fail2ban/fail2ban.pid' /etc/systemd/system/fail2ban.service
3230 rexy 2017
	$SED '/After=*/c After=syslog.target network.target httpd.service' /etc/systemd/system/fail2ban.service
2724 rexy 2018
} # End of fail2ban()
1163 crox53 2019
 
2990 rexy 2020
########################################################
2021
##                  "gammu_smsd"                      ##
2022
## - Creating of SMS management database              ##
2023
## - Write the gammu a gammu_smsd conf files          ##
2024
########################################################
1376 richard 2025
gammu_smsd()
2026
{
2601 tom.houday 2027
# Create 'gammu' system user
2028
	groupadd -f gammu_smsd
2868 rexy 2029
	useradd -r -g gammu_smsd -s /bin/false -c "system user for gammu_smsd" gammu_smsd
2601 tom.houday 2030
	usermod -a -G dialout gammu_smsd
2031
 
2032
# Create 'gammu' database
2033
	MYSQL="/usr/bin/mysql -uroot -p$mysqlpwd --execute"
2688 lucas.echa 2034
	$MYSQL "CREATE DATABASE IF NOT EXISTS $DB_GAMMU; GRANT ALL ON $DB_GAMMU.* TO $DB_USER@localhost IDENTIFIED BY '$radiuspwd'; FLUSH PRIVILEGES;"
1376 richard 2035
# Add a gammu database structure
2688 lucas.echa 2036
	/usr/bin/mysql -u$DB_USER -p$radiuspwd $DB_GAMMU < $DIR_CONF/empty-gammu-smsd-db.sql
1376 richard 2037
 
2552 rexy 2038
# Config file for the gammu_smsd daemon & gammu (ttyUSB0 as default com port)
2601 tom.houday 2039
	cat << EOF > /etc/gammurc
2552 rexy 2040
[gammu]
2041
device = /dev/ttyUSB0
2042
connection = at115200
2043
EOF
2044
 
2601 tom.houday 2045
	cat << EOF > /etc/gammu_smsd_conf
1376 richard 2046
[gammu]
2047
port = /dev/ttyUSB0
2048
connection = at115200
2049
 
2050
[smsd]
2051
PIN = 1234
2052
logfile = /var/log/gammu-smsd/gammu-smsd.log
2053
logformat = textall
2054
debuglevel = 0
2055
 
2056
service = sql
2057
driver = native_mysql
2058
user = $DB_USER
2059
password = $radiuspwd
2060
pc = localhost
2061
database = $DB_GAMMU
2062
 
2631 rexy 2063
RunOnReceive = sudo $DIR_DEST_BIN/alcasar-sms.sh --new_sms
1376 richard 2064
 
2065
StatusFrequency = 30
1380 richard 2066
;LoopSleep = 2
1376 richard 2067
 
2068
;ResetFrequency = 300
2069
;HardResetFrequency = 120
2070
 
2454 tom.houday 2071
CheckSecurity = 1
1376 richard 2072
CheckSignal = 1
2073
CheckBattery = 0
2074
EOF
2601 tom.houday 2075
	chmod 755 /etc/gammu_smsd_conf /etc/gammurc
1376 richard 2076
 
2601 tom.houday 2077
# Create the systemd unit
2937 rexy 2078
	cat << EOF > /etc/systemd/system/gammu-smsd.service
2601 tom.houday 2079
[Unit]
2080
Description=SMS daemon for Gammu
2081
Documentation=man:gammu-smsd(1)
3123 rexy 2082
After=network.target mysqld.service
1376 richard 2083
 
2601 tom.houday 2084
[Service]
2085
Type=forking
2775 rexy 2086
ExecStart=/usr/bin/gammu-smsd --config /etc/gammu_smsd_conf --user=gammu_smsd --group=gammu_smsd --pid=/run/gammu-smsd.pid --daemon
2601 tom.houday 2087
ExecReload=/bin/kill -HUP $MAINPID
2775 rexy 2088
ExecStopPost=/bin/rm -f /run/gammu-smsd.pid
2089
PIDFile=/run/gammu-smsd.pid
2601 tom.houday 2090
 
2091
[Install]
2092
WantedBy=multi-user.target
2093
EOF
2094
 
2314 richard 2095
# Log folder for gammu-smsd
2772 rexy 2096
	[ -d /var/log/gammu-smsd ] || mkdir /var/log/gammu-smsd
2601 tom.houday 2097
	chmod 755 /var/log/gammu-smsd
1376 richard 2098
 
2552 rexy 2099
# Udev rule for Modeswitch (switch from "mass_storage" mode to "ttyUSB" modem) needed with some Huawei MODEM (idVendor: 12d1)
2100
# normally not needed now since modeswitch is managed by udev (see Mageia RPM)
2542 rexy 2101
#cat << EOF > /lib/udev/rules.d/66-huawei.rules
2102
#KERNEL=="ttyUSB0",ATTRS{idVendor}=="12d1",RUN+="$DIR_DEST_BIN/alcasar-sms.sh --mode"
2103
#EOF
2552 rexy 2104
# Udev rule for fixing the enumeration of ttyUSB port on some MODEM (when they switch randomly the order of their ports at boot time)
2105
# example : http://hintshop.ludvig.co.nz/show/persistent-names-usb-serial-devices/
2106
 
2724 rexy 2107
} # End of gammu_smsd()
1376 richard 2108
 
2990 rexy 2109
########################################################
2110
##                      "msec"                        ##
2111
## - Apply the "fileserver" security level            ##
2112
## - remove the "system request" for rebooting        ##
2113
## - Fix several file permissions                     ##
2114
########################################################
2202 richard 2115
msec()
2116
{
2117
 
2118
# Apply fileserver security level
2990 rexy 2119
	[ -e /etc/security/msec/security.conf.default ] || cp /etc/security/msec/security.conf /etc/security/msec/security.conf.default
2120
	echo "BASE_LEVEL=fileserver" > /etc/security/msec/security.conf
2202 richard 2121
 
2203 richard 2122
# Set permissions monitoring and enforcement
2202 richard 2123
cat <<EOF > /etc/security/msec/perm.local
2801 rexy 2124
/var/log/firewall/                      root.apache     750
2202 richard 2125
/var/log/firewall/*                     root.apache     640
2126
/etc/security/msec/perm.local           root.root       640
2127
/etc/security/msec/level.local          root.root       640
2128
/etc/freeradius-web                     root.apache     750
2129
/etc/freeradius-web/admin.conf          root.apache     640
2420 richard 2130
/etc/raddb/client.conf                  radius.radius   640
2131
/etc/raddb/radius.conf                  radius.radius   640
2132
/etc/raddb/mods-available/ldap          radius.apache   660
2202 richard 2133
/etc/raddb/sites-available/alcasar      radius.apache   660
2863 rexy 2134
/etc/pki/CA/                            root.apache     750 force
2135
/etc/pki/CA/*                           root.apache     640 force 
2136
/etc/pki/CA/private/                    root.root       700 force
2137
/etc/pki/CA/private/*                   root.root       600 force
2138
/etc/pki/tls/private/                   root.apache     750 force
2139
/etc/pki/tls/private/*                  root.apache     640 force
2202 richard 2140
EOF
2454 tom.houday 2141
# apply now hourly & daily checks
2990 rexy 2142
	/usr/sbin/msec
2143
	/etc/cron.weekly/msec
2202 richard 2144
 
2724 rexy 2145
} # End of msec()
2202 richard 2146
 
2147
##################################################################
2552 rexy 2148
##                   Fonction "letsencrypt"                     ##
2149
## - Install Let's Encrypt client                               ##
2150
## - Prepare Let's Encrypt ALCASAR configuration file           ##
2304 tom.houday 2151
##################################################################
2152
letsencrypt()
2153
{
3170 rexy 2154
	acmesh_installDir="/opt/acme.sh"
2155
	acmesh_confDir="/usr/local/etc/letsencrypt"
2156
	acmesh_userAgent="ALCASAR"
2990 rexy 2157
# Remove potential old installers
2586 tom.houday 2158
	rm -rf /tmp/acme.sh-*
3170 rexy 2159
	[ -d $acmesh_confDir ] && rm -rf $acmesh_confDir
2990 rexy 2160
# Extract acme.sh
2304 tom.houday 2161
	tar xzf ./conf/letsencrypt-client/acme.sh-*.tar.gz -C /tmp/
2162
	pwdInstall=$(pwd)
3169 rexy 2163
	cd /tmp/acme.sh-* || { echo "Unable to find tmp ACME directory"; exit 1; }
3170 rexy 2164
	mkdir $acmesh_confDir ; chown root:apache $acmesh_confDir ; chmod 440 $acmesh_confDir
2165
	mkdir $acmesh_confDir/{data,certs,ca} ; chown root:apache $acmesh_confDir/{data,certs,ca} ; chmod 440 $acmesh_confDir/{data,certs,ca}
2990 rexy 2166
# Install acme.sh
2304 tom.houday 2167
	./acme.sh --install \
2168
		--home $acmesh_installDir \
2169
		--config-home $acmesh_confDir/data \
2170
		--certhome $acmesh_confDir/certs \
2171
		--accountkey $acmesh_confDir/ca/account.key \
2172
		--accountconf $acmesh_confDir/data/account.conf \
2173
		--useragent $acmesh_userAgent \
2308 tom.houday 2174
		--nocron \
2175
		> /dev/null
2304 tom.houday 2176
	if [ $? -ne 0 ]; then
2177
		echo "Error during installation of Let's Encrypt client (acme.sh)."
2178
	fi
2990 rexy 2179
# Create configuration file
2304 tom.houday 2180
	cat <<EOF > /usr/local/etc/alcasar-letsencrypt
2181
email=
2182
dateIssueRequest=
2183
domainRequest=
2184
challenge=
2185
dateIssued=
2186
dnsapi=
2187
dateNextRenewal=
2188
EOF
2688 lucas.echa 2189
	cd $pwdInstall || { echo "Unable to find $pwdInstall directory"; exit 1; }
2304 tom.houday 2190
	rm -rf /tmp/acme.sh-*
2724 rexy 2191
} # End of letsencrypt()
2304 tom.houday 2192
 
2193
##################################################################
2990 rexy 2194
##                       "mail_service"                         ##
2994 rexy 2195
## - Install Postfix conf for email registration method         ##
2990 rexy 2196
##################################################################
2197
mail_service()
2198
{
3062 rexy 2199
	[ -e /etc/php.d/05_mail.ini.default ] || cp /etc/php.d/05_mail.ini /etc/php.d/05_mail.ini.default
2200
	$SED "s?^mail.add_x_header =.*?mail.add_x_header = Off?g" /etc/php.d/05_mail.ini
3005 rexy 2201
	[ -e /etc/postfix/main.cf.orig ] || cp /etc/postfix/main.cf /etc/postfix/main.cf.orig
3062 rexy 2202
	$SED "s?^inet_protocols =.*?inet_protocols = ipv4?g" /etc/postfix/main.cf
3180 rexy 2203
	$SED "s?^smtp_tls_security_level =.*?smtp_tls_security_level = encrypt?g" /etc/postfix/main.cf
2204
	$SED "s?^smtpd_banner =.*?smtpd_banner = $myhostname ESMTP?g" /etc/postfix/main.cf
2990 rexy 2205
	cat << EOT >> /etc/postfix/main.cf
3070 rexy 2206
smtputf8_enable = no
3062 rexy 2207
smtp_use_tls = yes
2208
smtp_tls_wrappermode = yes
3005 rexy 2209
smtp_sasl_auth_enable = yes
2210
smtp_sasl_security_options = noanonymous
2211
smtp_sasl_password_maps = hash:/etc/postfix/sasl/sasl_passwd
2212
relayhost =
2990 rexy 2213
myhostname = $HOSTNAME.$DOMAIN
2994 rexy 2214
EOT
2990 rexy 2215
	chown -R postfix:postfix /var/lib/postfix
2216
} # end of mail_service
2217
 
2218
##################################################################
2552 rexy 2219
##                    Fonction "post_install"                   ##
2220
## - Modifying banners (locals et ssh) & prompts                ##
2221
## - SSH config                                                 ##
2222
## - sudoers config & files security                            ##
2223
## - log rotate & ANSSI security parameters                     ##
2224
## - Apply former conf in case of an update                     ##
2225
##################################################################
1 root 2226
post_install()
2227
{
3093 rexy 2228
	MAGEIA_VERSION=`cat /etc/lsb-release|grep "DISTRIB_DESCRIPTION"|cut -d"=" -f2|tr -d '"'`
2840 rexy 2229
# change the SSHD options
2195 richard 2230
	cp -f $DIR_CONF/banner /etc/ssh/alcasar-banner-ssh
3093 rexy 2231
	echo " Version $VERSION ($MAGEIA_VERSION)" >> /etc/ssh/alcasar-banner-ssh
5 franck 2232
	chmod 644 /etc/ssh/alcasar-banner-ssh ; chown root:root /etc/ssh/alcasar-banner-ssh
1 root 2233
	[ -e /etc/ssh/sshd_config.default ] || cp /etc/ssh/sshd_config /etc/ssh/sshd_config.default
2234
	$SED "s?^Banner.*?Banner /etc/ssh/alcasar-banner-ssh?g" /etc/ssh/sshd_config
2235
	$SED "s?^#Banner.*?Banner /etc/ssh/alcasar-banner-ssh?g" /etc/ssh/sshd_config
2840 rexy 2236
# sshd listens on EXTIF & INTIF
2237
	$SED "s?^#ListenAddress 0\.0\.0\.0.*?ListenAddress 0\.0\.0\.0?g" /etc/ssh/sshd_config
2238
# sshd authorized certificate for root login
2239
	$SED "s?^PermitRootLogin.*?PermitRootLogin without-password?g" /etc/ssh/sshd_config
2240
	$SED "s?^X11Forwarding.*?#X11Forwarding yes?g" /etc/ssh/sshd_config
2195 richard 2241
# ALCASAR conf file
2818 rexy 2242
	echo "HTTPS_LOGIN=off" >> $CONF_FILE
2409 tom.houday 2243
	echo "HTTPS_CHILLI=off" >> $CONF_FILE
3043 rexy 2244
	echo "SSH_LAN=22" >> $CONF_FILE
2245
	echo "SSH_WAN=0" >> $CONF_FILE
1631 richard 2246
	echo "SSH_ADMIN_FROM=0.0.0.0/0.0.0.0" >> $CONF_FILE
3046 rexy 2247
	echo "INTERLAN=off" >> $CONF_FILE
628 richard 2248
	echo "LDAP=off" >> $CONF_FILE
2447 richard 2249
	echo "LDAP_SERVER=127.0.0.1" >> $CONF_FILE
3238 rexy 2250
	echo "LDAP_BASE=cn=Users;dc=serverad;dc=lan" >> $CONF_FILE
2454 tom.houday 2251
	echo "LDAP_UID=sAMAccountName" >> $CONF_FILE
2252
	echo "LDAP_FILTER=" >> $CONF_FILE
2253
	echo "LDAP_USER=alcasar" >> $CONF_FILE
2254
	echo "LDAP_PASSWORD=" >> $CONF_FILE
2705 tom.houday 2255
	echo "LDAP_SSL=on" >> $CONF_FILE
2256
	echo "LDAP_CERT_REQUIRED=" >> $CONF_FILE
2600 tom.houday 2257
	echo "SMS=off" >> $CONF_FILE
2258
	echo "SMS_NUM=" >> $CONF_FILE
2993 rexy 2259
	echo "MAIL=off" >> $CONF_FILE
2260
	echo "MAIL_TYPE=" >> $CONF_FILE
2261
	echo "MAIL_SMTP_IP=" >> $CONF_FILE
3021 rexy 2262
	echo "MAIL_SMTP_PORT=" >> $CONF_FILE
2993 rexy 2263
	echo "MAIL_ADDR=" >> $CONF_FILE
2264
	echo "MAIL_WHITEDOMAIN=" >> $CONF_FILE
2265
	echo "MAIL_ADMIN=" >> $CONF_FILE
2688 lucas.echa 2266
	echo "BL_PUREIP=on" >> $CONF_FILE
2267
	echo "BL_SAFESEARCH=off" >> $CONF_FILE
2268
	echo "WL_SAFESEARCH=off" >> $CONF_FILE
2770 rexy 2269
	echo "IOT_CAPTURE=off" >> $CONF_FILE
2926 rexy 2270
	echo "WIFI4EU=off" >> $CONF_FILE
2271
	echo "WIFI4EU_CODE=123e4567-e89b-12d3-a456-426655440000" >> $CONF_FILE
2979 rexy 2272
	echo "MULTIWAN=off" >> $CONF_FILE
2195 richard 2273
# Prompt customisation (colors)
1 root 2274
	[ -e /etc/bashrc.default ]  || cp /etc/bashrc /etc/bashrc.default
5 franck 2275
	cp -f $DIR_CONF/bashrc /etc/. ; chmod 644 /etc/bashrc ; chown root:root /etc/bashrc
630 franck 2276
	$SED "s?^ORGANISME.*?ORGANISME=$ORGANISME?g" /etc/bashrc
2941 rexy 2277
	$SED "s?^alias ll=.*?alias ll=\"ls -al --color\"?g" /etc/profile.d/60alias.sh
2195 richard 2278
# sudoers configuration for "apache" & "sysadmin"
1 root 2279
	[ -e /etc/sudoers.default ]  || cp /etc/sudoers /etc/sudoers.default
2850 rexy 2280
	cp -f $DIR_CONF/sudoers /etc/ ; chmod 440 /etc/sudoers ; chown root:root /etc/sudoers
629 richard 2281
	$SED "s?^Host_Alias.*?Host_Alias	LAN_ORG=$PRIVATE_NETWORK/$PRIVATE_NETMASK,localhost		#réseau de l'organisme?g" /etc/sudoers
1543 richard 2282
# Modify some logrotate files (gammu, ulogd)
1 root 2283
	cp -f $DIR_CONF/logrotate.d/* /etc/logrotate.d/
2284
	chmod 644 /etc/logrotate.d/*
2195 richard 2285
# Log compression
706 franck 2286
	$SED "s?^delaycompress.*?#&?g" /etc/logrotate.conf
2287
# actualisation des fichiers logs compressés
3230 rexy 2288
	for dir in firewall e2guardian httpd
706 franck 2289
	do
2688 lucas.echa 2290
		find /var/log/$dir -type f -name "*.log-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]" -exec gzip {} \;
706 franck 2291
	done
2601 tom.houday 2292
	/usr/bin/systemctl daemon-reload
2956 rexy 2293
# processes started at boot time (Systemctl)
3230 rexy 2294
	for i in alcasar-network mysqld httpd ntpd iptables unbound unbound-blacklist unbound-whitelist unbound-blackhole radiusd nfcapd e2guardian ulogd-ssh ulogd-traceability ulogd-ext-access chilli fail2ban vnstat sshd
1221 richard 2295
	do
1574 richard 2296
		/usr/bin/systemctl -q enable $i.service
1221 richard 2297
	done
2454 tom.houday 2298
 
1452 richard 2299
# disable processes at boot time (Systemctl)
2688 lucas.echa 2300
	for i in ulogd gpm dhcpd
1452 richard 2301
	do
1574 richard 2302
		/usr/bin/systemctl -q disable $i.service
1452 richard 2303
	done
2454 tom.houday 2304
 
2864 rexy 2305
# Apply some security rules (some are from French cybersecurity Agency - ANSSI)
1362 richard 2306
# ignore ICMP broadcast (smurf attack)
2307
	echo "net.ipv4.icmp_echo_ignore_broadcasts = 1" > /etc/sysctl.d/alcasar.conf
2308
# ignore ICMP errors bogus
2309
	echo "net.ipv4.icmp_ignore_bogus_error_responses = 1" >> /etc/sysctl.d/alcasar.conf
2310
# remove ICMP redirects responces
2311
	echo "net.ipv4.conf.all.accept_redirects = 0" >> /etc/sysctl.d/alcasar.conf
2312
	echo "net.ipv4.conf.all.send_redirects = 0" >> /etc/sysctl.d/alcasar.conf
2313
# enable SYN Cookies (Syn flood attacks)
2314
	echo "net.ipv4.tcp_syncookies = 1" >> /etc/sysctl.d/alcasar.conf
2315
# enable kernel antispoofing
2316
	echo "net.ipv4.conf.all.rp_filter = 1" >> /etc/sysctl.d/alcasar.conf
2317
# ignore source routing
2318
	echo "net.ipv4.conf.all.accept_source_route = 0" >> /etc/sysctl.d/alcasar.conf
2319
# set conntrack timer to 1h (3600s) instead of 5 weeks
2320
	echo "net.netfilter.nf_conntrack_tcp_timeout_established = 3600" >> /etc/sysctl.d/alcasar.conf
2454 tom.houday 2321
# disable log_martians (ALCASAR is often installed between two private network addresses)
1363 richard 2322
	echo "net.ipv4.conf.all.log_martians = 0" >> /etc/sysctl.d/alcasar.conf
1778 richard 2323
# disable iptables_helpers
2324
	echo "net.netfilter.nf_conntrack_helper = 0" >> /etc/sysctl.d/alcasar.conf
1788 richard 2325
# Switch to the router mode
2326
	echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.d/alcasar.conf
1917 franck 2327
# Remove unused service ipv6
1964 franck 2328
	echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.d/alcasar.conf
2329
	echo "net.ipv6.conf.all.autoconf = 0" >> /etc/sysctl.d/alcasar.conf
2330
	echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.d/alcasar.conf
2331
	echo "net.ipv6.conf.default.autoconf = 0" >> /etc/sysctl.d/alcasar.conf
1003 richard 2332
# switch to multi-users runlevel (instead of x11)
1221 richard 2333
	ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
2864 rexy 2334
# disable Core dump file
2335
	[ -e /etc/security/limits.conf.default ]  || cp /etc/security/limits.conf /etc/security/limits.conf.default
2336
	$SED "/^# End of file.*/i*\tsoft\tcore\t0\n*\thard\tcore\t0" /etc/security/limits.conf
2432 richard 2337
# GRUB2 modifications (Wait time : 3s - ALCASAR entry - VGA=791 - Change the default banner
3222 rexy 2338
	[ -e /etc/default/grub.default ] || cp /etc/default/grub /etc/default/grub.default
2432 richard 2339
	$SED "s?^GRUB_TIMEOUT=.*?GRUB_TIMEOUT=3?g" /etc/default/grub
2433 richard 2340
	$SED "s?^GRUB_DISTRIBUTOR=.*?GRUB_DISTRIBUTOR=ALCASAR?g" /etc/default/grub
2432 richard 2341
	[ -e /etc/mageia-release.default ]  || cp /etc/mageia-release /etc/mageia-release.default
3190 rexy 2342
	vm_vga=`lsmod | grep -c -E "virtio|vmwgfx"` # test if in VM
2454 tom.houday 2343
	if [ $vm_vga == 0 ] # is not a VM
2432 richard 2344
	then
2454 tom.houday 2345
		cp -f $DIR_CONF/banner /etc/mageia-release # ALCASAR ASCII-Art
2346
		echo >> /etc/mageia-release
2347
		$SED "s?^GRUB_CMDLINE_LINUX_DEFAULT=\"?&vga=791 ?" /etc/default/grub
3093 rexy 2348
	else
2349
		echo > /etc/mageia-release
2454 tom.houday 2350
	fi
2351
	if [ $Lang == "fr" ]
2352
	then
3093 rexy 2353
		echo "Bienvenue sur ALCASAR Version $VERSION ($MAGEIA_VERSION)" >> /etc/mageia-release
2688 lucas.echa 2354
		echo "Connectez-vous à l'URL 'https://$HOSTNAME.$DOMAIN/acc'" >> /etc/mageia-release
2454 tom.houday 2355
	else
3093 rexy 2356
		echo "Welcome on ALCASAR Version $VERSION ($MAGEIA_VERSION)" >> /etc/mageia-release
2688 lucas.echa 2357
		echo "Connect to 'https://$HOSTNAME.$DOMAIN/acc'" >> /etc/mageia-release
2454 tom.houday 2358
	fi
2359
	/usr/bin/update-grub2
1221 richard 2360
# Load and apply the previous conf file
2361
	if [ "$mode" = "update" ]
532 richard 2362
	then
2887 rexy 2363
		$DIR_DEST_BIN/alcasar-archive.sh --now # exports current logs in $DIR_SAVE/archive
1221 richard 2364
		$DIR_DEST_BIN/alcasar-conf.sh --load
2365
		PARENT_SCRIPT=`basename $0`
2366
		export PARENT_SCRIPT # to avoid stop&start process during the installation process
2367
		$DIR_DEST_BIN/alcasar-conf.sh --apply
2454 tom.houday 2368
		$DIR_DEST_BIN/alcasar-file-clean.sh # Clean & sort conf files. Add uamallowed domains to the dns-blackhole conf
1221 richard 2369
		$SED "s?^INSTALL_DATE=.*?INSTALL_DATE=$DATE?g" $CONF_FILE
2370
		$SED "s?^VERSION=.*?VERSION=$VERSION?g" $CONF_FILE
532 richard 2371
	fi
2560 rexy 2372
	rm -f /var/tmp/alcasar-conf*
1221 richard 2373
	chown -R root:apache $DIR_DEST_ETC/*
2374
	chmod -R 660 $DIR_DEST_ETC/*
2375
	chmod ug+x $DIR_DEST_ETC/digest
2688 lucas.echa 2376
	cd $DIR_INSTALL || { echo "Unable to find $DIR_INSTALL directory"; exit 1; }
5 franck 2377
	echo ""
1 root 2378
	echo "#############################################################################"
638 richard 2379
	if [ $Lang == "fr" ]
2380
		then
2381
		echo "#                        Fin d'installation d'ALCASAR                       #"
2382
		echo "#                                                                           #"
2383
		echo "#         Application Libre pour le Contrôle Authentifié et Sécurisé        #"
2384
		echo "#                     des Accès au Réseau ( ALCASAR )                       #"
2385
		echo "#                                                                           #"
2386
		echo "#############################################################################"
2387
		echo
2388
		echo "- ALCASAR sera fonctionnel après redémarrage du système"
2389
		echo
2390
		echo "- Lisez attentivement la documentation d'exploitation"
2391
		echo
2688 lucas.echa 2392
		echo "- Le centre de controle d'ALCASAR (ACC) est à l'adresse http://$HOSTNAME.$DOMAIN"
638 richard 2393
		echo
2394
		echo "                   Appuyez sur 'Entrée' pour continuer"
2454 tom.houday 2395
	else
2396 tom.houday 2396
		echo "#                        End of ALCASAR install process                     #"
638 richard 2397
		echo "#                                                                           #"
2398
		echo "#         Application Libre pour le Contrôle Authentifié et Sécurisé        #"
2399
		echo "#                     des Accès au Réseau ( ALCASAR )                       #"
2400
		echo "#                                                                           #"
2401
		echo "#############################################################################"
2402
		echo
2403
		echo "- The system will be rebooted in order to operate ALCASAR"
2404
		echo
2405
		echo "- Read the exploitation documentation"
2406
		echo
2688 lucas.echa 2407
		echo "- The ALCASAR Control Center (ACC) is at http://$HOSTNAME.$DOMAIN"
638 richard 2408
		echo
2409
		echo "                   Hit 'Enter' to continue"
2410
	fi
1782 franck 2411
	sleep 2
2560 rexy 2412
	if [ "$mode" == "install" ] || [ "$DEBUG_ALCASAR" == "on" ]
820 richard 2413
	then
2688 lucas.echa 2414
		read
815 richard 2415
	fi
774 richard 2416
	clear
1 root 2417
	reboot
2724 rexy 2418
} # End of post_install()
1 root 2419
 
2552 rexy 2420
#####################################################################################
2421
#                                   Main Install loop                               #
2422
#####################################################################################
832 richard 2423
dir_exec=`dirname "$0"`
2424
if [ $dir_exec != "." ]
2425
then
2426
	echo "Lancez ce programme depuis le répertoire de l'archive d'ALCASAR"
2427
	echo "Launch this program from the ALCASAR archive directory"
2428
	exit 0
2429
fi
2688 lucas.echa 2430
if [ $EUID -gt 0 ]
2220 richard 2431
then
2688 lucas.echa 2432
	echo "Vous devez être \"root\" pour installer ALCASAR (commande 'su')"
2433
	echo "You must be \"root\" to install ALCASAR ('su' command)"
2220 richard 2434
	exit 0
2435
fi
832 richard 2436
VERSION=`cat $DIR_INSTALL/VERSION`
291 franck 2437
usage="Usage: alcasar.sh {-i or --install} | {-u or --uninstall}"
1 root 2438
nb_args=$#
2439
args=$1
2440
if [ $nb_args -eq 0 ]
2441
then
2442
	nb_args=1
2443
	args="-h"
2444
fi
1062 richard 2445
chmod -R u+x $DIR_SCRIPTS/*
1 root 2446
case $args in
2447
	-\? | -h* | --h*)
2448
		echo "$usage"
2449
		exit 0
2450
		;;
291 franck 2451
	-i | --install)
3180 rexy 2452
		for func in system_testing network_testing
2724 rexy 2453
		do
2454
			header_install
2455
			$func
2456
			if [ $DEBUG_ALCASAR == "on" ]
2457
			then
3179 rexy 2458
				echo "*** 'debug' : end installing function '$func' ***"
2724 rexy 2459
				read
2460
			fi
2461
		done
595 richard 2462
# RPMs install
2941 rexy 2463
		$DIR_SCRIPTS/alcasar-rpm.sh
595 richard 2464
		if [ "$?" != "0" ]
1 root 2465
		then
595 richard 2466
			exit 0
2467
		fi
1249 richard 2468
		if [ -e $CONF_FILE ]
595 richard 2469
		then
2458 richard 2470
# Uninstall or update the running version
2471
			if [ "$mode" == "update" ]
2472
			then
2560 rexy 2473
				$DIR_DEST_BIN/alcasar-uninstall.sh -update
2458 richard 2474
			else
2560 rexy 2475
				$DIR_DEST_BIN/alcasar-uninstall.sh -full
2458 richard 2476
			fi
595 richard 2477
		fi
2847 rexy 2478
		if [ $DEBUG_ALCASAR == "on" ]
2479
		then
2480
			echo "*** 'debug' : end of cleaning ***"
2481
			read
2482
		fi
2980 rexy 2483
# Avoid some RPM automatic updates
2484
		echo "/^kernel/" > /etc/urpmi/skip.list
2485
		echo "/^wkhtmltopdf/" >> /etc/urpmi/skip.list
2486
		echo "/^freeradius/" >> /etc/urpmi/skip.list
3190 rexy 2487
		if [ `grep -E '^exclude=' /etc/dnf/dnf.conf |wc -l` -eq "1" ]; then
3170 rexy 2488
			$SED "s?^exclude=.*?exclude=kernel\* wkhtmltopdf freeradius?g" /etc/dnf/dnf.conf
2980 rexy 2489
		else
3170 rexy 2490
			echo "exclude=kernel* wkhtmltopdf freeradius" >> /etc/dnf/dnf.conf
2980 rexy 2491
		fi
2835 rexy 2492
# Test if conf file
2493
		if [ -e /var/tmp/alcasar-conf.tar.gz ]
595 richard 2494
		then
2826 rexy 2495
# Extract some info from the previous configuration file
2834 rexy 2496
			cd /var/tmp
2497
			tar -xf /var/tmp/alcasar-conf.tar.gz conf/etc/alcasar.conf
2847 rexy 2498
			if [ "$mode" == "install" ] # don't display this if updating a running version
2834 rexy 2499
			then
2500
				header_install
2501
				ORGANISME=`grep ^ORGANISM= conf/etc/alcasar.conf|cut -d"=" -f2`
2502
				PREVIOUS_VERSION=`grep ^VERSION= conf/etc/alcasar.conf|cut -d"=" -f2`
2503
				MAJ_PREVIOUS_VERSION=`echo $PREVIOUS_VERSION|cut -d"." -f1`
2504
				MIN_PREVIOUS_VERSION=`echo $PREVIOUS_VERSION|cut -d"." -f2`
2505
				UPD_PREVIOUS_VERSION=`echo $PREVIOUS_VERSION|cut -d"." -f3|cut -c1`
597 richard 2506
				if [ $Lang == "fr" ]
2834 rexy 2507
					then echo "Le fichier de configuration d'une version $MAJ_PREVIOUS_VERSION.$MIN_PREVIOUS_VERSION.$UPD_PREVIOUS_VERSION a été trouvé";
2956 rexy 2508
					else echo "The configuration file of a version $MAJ_PREVIOUS_VERSION.$MIN_PREVIOUS_VERSION.$UPD_PREVIOUS_VERSION has been found";
597 richard 2509
				fi
2834 rexy 2510
				response=0
2511
				PTN='^[oOnNyY]?$'
2512
				until [[ "$response" =~ $PTN ]]
2513
				do
2514
					if [ $Lang == "fr" ]
2515
						then echo -n "Voulez-vous l'utiliser (O/n)? ";
2516
						else echo -n "Do you want to use it (Y/n)?";
2517
					fi
2518
					read response
2519
					if [ "$response" = "n" ] || [ "$response" = "N" ]
2520
					then
2521
						rm -f /var/tmp/alcasar-conf*
2522
						rm -rf /var/tmp/conf
2523
					fi
2524
				done
2525
			fi
2847 rexy 2526
			cd $DIR_INSTALL
597 richard 2527
		fi
636 richard 2528
# Test if update
2834 rexy 2529
		if [ -e /var/tmp/alcasar-conf.tar.gz ]
597 richard 2530
		then
2531
			if [ $Lang == "fr" ]
2532
				then echo "#### Installation avec mise à jour ####";
2533
				else echo "#### Installation with update     ####";
2534
			fi
5 franck 2535
			mode="update"
1 root 2536
		fi
3170 rexy 2537
		for func in init network CA ACC time_server init_db freeradius chilli e2guardian ulogd nfsen vnstat unbound dhcpd BL cron fail2ban gammu_smsd msec letsencrypt mail_service post_install
5 franck 2538
		do
2539
			$func
2466 richard 2540
			if [ $DEBUG_ALCASAR == "on" ]
2688 lucas.echa 2541
			then
3179 rexy 2542
				echo "*** 'debug' : end installing function '$func' ***"
2688 lucas.echa 2543
				read
2466 richard 2544
			fi
14 richard 2545
		done
5 franck 2546
		;;
291 franck 2547
	-u | --uninstall)
1828 richard 2548
		if [ ! -e $DIR_DEST_BIN/alcasar-uninstall.sh ]
1 root 2549
		then
597 richard 2550
			if [ $Lang == "fr" ]
2551
				then echo "ALCASAR n'est pas installé!";
2552
				else echo "ALCASAR isn't installed!";
2553
			fi
1 root 2554
			exit 0
2555
		fi
5 franck 2556
		response=0
2760 lucas.echa 2557
		PTN='^[oOyYnN]?$'
2558
		until [[ "$response" =~ $PTN ]]
5 franck 2559
		do
597 richard 2560
			if [ $Lang == "fr" ]
2760 lucas.echa 2561
				then echo -n "Voulez-vous créer le fichier de configuration de la version actuelle (O/n)? ";
854 richard 2562
				else echo -n "Do you want to create the running version configuration file (Y/n)? ";
597 richard 2563
			fi
5 franck 2564
			read response
2565
		done
1103 richard 2566
		if [ "$response" = "o" ] || [ "$response" = "O" ] || [ "$response" = "Y" ] || [ "$response" = "y" ]
1 root 2567
		then
3206 rexy 2568
			$DIR_DEST_BIN/alcasar-conf.sh --create
2454 tom.houday 2569
		else
2560 rexy 2570
			rm -f /var/tmp/alcasar-conf*
1 root 2571
		fi
597 richard 2572
# Uninstall the running version
2560 rexy 2573
		$DIR_DEST_BIN/alcasar-uninstall.sh -full
1 root 2574
		;;
2575
	*)
2576
		echo "Argument inconnu :$1";
460 richard 2577
		echo "Unknown argument :$1";
1 root 2578
		echo "$usage"
2579
		exit 1
2580
		;;
2581
esac
10 franck 2582
# end of script