Subversion Repositories ALCASAR

Rev

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