---
# System prepended metadata

title: "\n        Devoir - ASD - M2 IDL\n    "

---

<center>
    <h1>
        Devoir - ASD - M2 IDL
    </h1>
</center>

<center>
    <small>NICOLAI Guillaume, VIZCAINO Yohan</small>
</center>

### Pré-installation

Dans un premier temps il va falloir télécharger l'image ISO d'installation de CentOS 8
```bash=
cd /tmp
BASE="http://mirrors.ircam.fr/pub/CentOS/8-stream/isos/x86_64"
wget $BASE/CentOS-Stream-8-x86_64-latest-boot.iso
```

Dans Virtual box, lors de la création de la machine virtuelle, il faut sélectionner le fichier ISO précédemment téléchargé.

Lors de la phase pour allouer la mémoire vive, il est conseillé de prendre 4096Mo afin d'éviter tout soucis lors de l'installation.

Lors de la phase Virtual Hard Disk, il faut créer un disque dynamique de 40Go

Après la création, il faut aller dans les Configurations de la machine créée.

Dans l'onglet réseau, activer les adapter 2 et 3, choississez le mode d'accès réseau: Réseau interne et les nommer respectivement intnet et intnet2.

### Installation : 

Dans Réseau et nom d'hote, activez simplement la config réseau Ethernet(enp0s3), ceci devrait vous donner accès au réseau ethernet.

Dans la partie Selection des logiciels, choississez le mode Installation minimale/Standard.

Dans la partie Mot de passe administrateur, renseignez votre mot de passe (ici root).

Dans Cible d'installation, il faut créer des partitions sur le disque existant, pour cela:

   1. Choisissez la configuration de stockage personnalisé.
   2. Remplacez le choix LVM par partition standard.
   3. Créez (avec +) les partitions : 
*     Une partition primaire pour la racine (/) de 25G avec l'étiquette root
*     Une partition primaire pour le SWAP de 2G
*     Une partition primaire pour /home pour le reste (13G)


A la fin de l'installation, les contraintes (2) et (3) sont respectés, en effet, l'environnement possède un mot de passe classique (root) et l'accès internet doit fonctionner.

### Configuration générale

Afin de respecter des contraintes futures, les 4 premières lignes permettent de mettre en place le nom de domaine de notre serveur.
La création des fichiers ci-après permet de créer une configuration permanente du réseau sans passer par une fenêtre graphique (du type nmtui-edit) afin de pouvoir l'automatiser complètement.
Dans ses fichiers, il faut préciser les différents paramètres réseaux comme implémenté ci-dessous.


```bash=
hostnamectl set-hostname srv.asr.fr
echo "10.0.2.15 srv srv.asr.fr" >> /etc/hosts
echo "192.168.10.1 srv srv.asr.fr" >> /etc/hosts
echo "192.168.20.1 srv srv.asr.fr" >> /etc/hosts

cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-enp0s8
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=enp0s8
DEVICE=enp0s8
ONBOOT=yes
IPADDR=192.168.10.1
NETMASK=255.255.255.0
GATEWAY=10.0.2.15
EOF

cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-enp0s9
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=enp0s9
DEVICE=enp0s9
ONBOOT=yes
IPADDR=192.168.20.1
NETMASK=255.255.255.0
GATEWAY=10.0.2.15
EOF
```
Pour une application immédiate (mais non pérenne) :

```bash=
systemctl --now disable NetworkManager
ifconfig enp0s8 192.168.10.1/24
ifconfig enp0s9 192.168.20.1/24
```

### Création d'utilisateurs locaux

Afin de créer des utilisateurs sur notre machine, nous allons utiliser les commandes suivantes qui vont nous permettre de définir les différents utilisateurs ainsi que leurs mots de passe.

```bash=
# Définition des utilisateurs
useradd yohan
useradd guillaume
useradd massat


# Création des mots de passes
passwd yohan # Puis taper le mot de passe
passwd guillaume # Puis taper le mot de passe
passwd massat # puis taper le mot de passe
```


### Définition du mécanisme de quotas

Dans un premier temps, nous allons faire un back-up afin formatter la partition disque du /home afin de passer de xfs ext3 en xfs ext4 sans perdre les données. (Il est également possible de directement formatter la partition en ext4 lors de l'installation, mais il est supposé ici qu'elle ne l'est pas)

```bash=
rsync -av /home/ /tmp/home.bkp/
```

Une fois que le back-up est crée, nous allons passer à la partie de formattage de la partition /home pour la passer en ext4.

```bash=
UUID_HOME=$(findmnt /home -o UUID -n)
SRC_HOME=$(findmnt /home -o SOURCE -n)
umount /home
mkfs.ext4 -F -U $UUID_HOME $SRC_HOME
sed -i -e '/home/s/xfs/ext4/' /etc/fstab
mount /home
```

Une fois le disque formatté, on restaure les données préalablement sauvegardé.
Ensuite, nous allons modifier le fichier /etc/fstab afin de créer les quotas grâce aux commandes suivantes:

```bash=
rsync -av /tmp/home.bkp/ /home/
rm -rf /tmp/home.bkp
sed -i -e '/home/{s/defaults *0 0/defaults,usrquota,grpquota 1 2/}' /etc/fstab
mount /home -o remount
```

Nous pouvons vérifier l'existence des quotas, et les activer grâce aux deux commandes suivantes :

```bash=
# Verification existance des quotas
quotacheck  -c -u -g -m -v -a

# Activatation des quotas
quotaon -a
```


### Mise en place du serveur NFS

Dans un premier temps, nous allons devoir installer les librairies rpcbind et nfs-utils.
Ensuite, nous allons devoir activer les daemons correspondants.
Finalement, nous allons modifier le fichier /etc/exports afin d'autoriser les sous-réseaux de 192.168.x.x afin de se connecter en lecture/écriture au répertoire /home.

```bash=
# Installation
dnf -y install rpcbind nfs-utils

# Activation des daemons
systemctl --now enable rpcbind
systemctl --now enable nfs-server

# Mise en place du server
echo "/home  192.168.0.0/16(rw,no_root_squash)" > /etc/exports
exportfs -a
```


### Mise en place du serveur NIS

Dans un premier temps, nous allons devoir installer les librairies ypserv et yp-tools.
Ensuite nous allons définir le nom de domaine de notre serveur NIS et l'ajouter dans le fichier /etc/sysconfig/network.
Nous pouvons désormais activer les daemons liés à ypserv et yp-tools (après installation).

```bash=
# Installation
dnf -y install ypserv yp-tools

# Définition du nom de domaine NIS
ypdomainname nis.asr.fr
echo NISDOMAIN=nis.asr.fr >> /etc/sysconfig/network

# Activation des daemons
systemctl enable --now ypserv ypxfrd yppasswdd nis-domainname
```

Nous allons désormais pouvoir configurer notre serveur NIS en prenant en compte les noms de domaines et en les appliquant sur notre machine.
```bash=
# Configuration du serveur NIS
/usr/lib64/yp/ypinit -m
make -C /var/yp/
```


### Mise en place du DHCP pour les machines des réseaux PV1 et PV2

Installation de la librairie dhcp-server :

```bash=
dnf -y install dhcp-server
```

Par la suite, nous allons ajouter la configuration suivante dans le fichier /etc/dhcp/dhcpd.conf : 

```bash=
cat <<EOF > /etc/dhcp/dhcpd.conf
# configuration du sous-réseau PV1
subnet 192.168.10.0 netmask 255.255.255.0 {
  range 192.168.10.100 192.168.10.200;
  option domain-name-servers  192.168.10.1;
  option domain-name "asr.fr";
  option subnet-mask  255.255.255.0;
  option routers      192.168.10.1;
  default-lease-time  600;
  max-lease-time      7200;

  filename "boot-vm/pxelinux.0";
  next-server 192.168.10.1;
}

# configuration du sous-réseau pv2
subnet 192.168.20.0 netmask 255.255.255.0 {
  range 192.168.20.100 192.168.20.200;
  option domain-name-servers  192.168.20.1;
  option domain-name "asr.fr";
  option subnet-mask  255.255.255.0;
  option routers      192.168.20.1;
  default-lease-time  600;
  max-lease-time      7200;

  filename "boot-vm/pxelinux.0";
  next-server 192.168.20.1;
}
EOF
```

Il faudra par la suite activer le daemon dhcpd.

```bash=
systemctl --now enable dhcpd
systemctl restart dhcpd
```

### Service de routage pour machines du réseau PV1 et PV2

Comme les fois précédentes, il faut tout d'abord installer les librairies iptables-services et dnsmasq.
Il faut également autoriser Linux à re-router les adresses ip.
Afin de modifier la table d'adressage, il faut désactiver le pare-feu de notre machine.


```bash=
dnf -y install iptables-services dnsmasq

# Application immédiate
sysctl -w net.ipv4.ip_forward=1

# Application permanente
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf

# Désactivation du firewall
systemctl --now disable firewalld
```

Nous allons ensuite activer le daemon iptables et configurer notre service de routage grâce aux commandes suivantes:

```bash=
systemctl --now enable iptables

# Annule toutes les règles actuelles
iptables -t filter -F

# Application du routing de packets pour tous les réseaux
iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
iptables -t nat -A POSTROUTING -o enp0s8 -j MASQUERADE
iptables -t nat -A POSTROUTING -o enp0s9 -j MASQUERADE

# Sauvegarde
/usr/libexec/iptables/iptables.init save
```

Nous allons maintenant devoir ajouter la configuration suivante dans le fichier /etc/resolv.conf.
Pour appliquer ses mises à jours nous devons redémarrer notre daemon iptables.

```bash=
# Mise à jour des serveurs DNS de référence
cat <<EOF > /etc/resolv.conf
search home asr.fr
nameserver 192.168.1.1
nameserver 127.0.0.1
EOF

# Redémarrage du daemon
systemctl restart iptables
```

Nous allons finalement devoir ajouter la configuration suivante dans le fichier /etc/hosts, qui permettra de nommer c1, c2 et c3.
Pour finir, nous allons activer le daemon dnsmasq.

```bash=
cat <<FIN >> /etc/hosts
192.168.10.100  c1.asr.fr
192.168.10.101  c2.asr.fr
192.168.20.100  c3.asr.fr  
FIN

systemctl --now enable dnsmasq
```

### Mise en place du service SSH sur le serveur

Lors de l'installation de la machine, nous avons opté pour le mode d'installation : "Installation minimale / Standard", ce mode d'installation prévois par défaut l'installation des systèmes permettant d'obtenir le service SSH sur notre machine.

Donc, celui-ci est déjà existant sur notre machine à ce stade.

### Ajout sur SRV d'une adresse IP

Afin d'ajouter une nouvelle adresse IP à notre carte réseau enp0s3 déjà existante, il faut créer un fichier de configuration dans /etc/sysconfig/network-scripts/. 
Ce fichier devra être nommé tel qu'un fichier déjà préexistant utilisé pour configurer la-dite interface, tout en rajoutant un suffixe à ce dernier (ici :0).
Ainsi, deux fichiers de configuration seront éxécutés pour 1 seule et même interface.

```bash=
cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-enp0s3:0
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=eui64
NAME=enp0s3:0
UUID=80861a3c-658d-4e97-9872-2c3ed2121150
DEVICE=enp0s3:0
ONBOOT=yes
IPADDR=192.168.255.1
PREFIX=24
EOF

# Application immédiate des modifications
systemctl restart NetworkManager 
```

Pour associer un nom à cette nouvelle adresse, il faut ajouter une ligne dans /etc/hosts.
```bash=
echo "192.168.255.1 srv" >> /etc/hosts
```

### Service WEB (port 80 et httpd)

Dans un premier temps (une fois de plus), nous allons installer la librairie httpd.
```bash=
dnf -y install httpd
```

Ensuite nous allons nous déplacer dans le répertoire /var/www/ qui correspond au répertoire racine du site web.

Nous allons devoir créer des répertoires pour chacun des sous-réseaux pour établir un site par sous-réseau.

```bash=
cd /var/www
mkdir pv1
mkdir pv2
mkdir -p pv1/html
mkdir -p pv2/html
```

```bash=
# Création des pages d'accueil de nos sites
echo "<h1>Hello, PV1 network</h1>" > /var/www/pv1/html/index.html
echo "<h2>Hello, PV2 network</h2>" > /var/www/pv2/html/index.html
```

Nous allons maintenant devoir mettre en place les fichiers de configurations relatifs à chaque sous-réseau.
Ensuite, nous allons redémarrer le daemon httpd afin de prendre en compte les nouvelles configurations.

```bash=
# Configuration de PV1
cat <<EOF > /etc/httpd/conf.d/pv1.conf
<VirtualHost 192.168.10.1:80>
  ServerName pv1.asr.fr
  ServerAlias srv.asr.fr
  DocumentRoot /var/www/pv1/html
</VirtualHost>
EOF

# Configuration de PV2
cat <<EOF > /etc/httpd/conf.d/pv2.conf
<VirtualHost 192.168.20.1:80>
  ServerName pv2.asr.fr
  ServerAlias srv.asr.fr
  DocumentRoot /var/www/pv2/html
</VirtualHost>
EOF

# Rédemarrage de httpd
systemctl enable --now httpd
```

### Autorisation SSH seulement via PV1

Afin d'autoriser les autorisations SSH sur le serveur par les machines provenant du réseau PV1 uniquement, il faut utiliser les commandes suivantes : 
```bash=
iptables -A INPUT -p tcp --dport 22 -s 192.168.10.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
```
La première ligne autorise les paquets entrant sur le port 22 (SSH) provenant de l'adresse IP du sous-réseau PV1.
La seconde ligne bloque tous les autres paquets entrant sur le port 22.


### Installation et configuration automatisé des machines clientes

Dans un premier temps, et non des moindres, nous allons installer les librairies tftp-server xinetd et syslinux.
Nous allons ensuite activer les services tftp et xinetd.

```bash=
dnf -y install tftp-server xinetd syslinux
systemctl --now enable tftp
systemctl --now enable xinetd
```
Nous allons créer les répertoires qui vont être mis à disposition de tftp pour permettre le boot automatisé des futurs clients.

Nous allons ensuite nous déplacer dans le répertoire /var/lib/tftpboot/boot-vm.
Nous allons copier l'ensemble des fichiers nécessaire pour le bon fonctionnement du noyau linux dans le répertoire courant.
Pour finir, nous allons télécharger les images qui seront utilisés par la suite pour la création des OS linux.
```bash=
mkdir /var/lib/tftpboot/boot-vm
mkdir /var/lib/tftpboot/boot-vm/pxelinux.cfg

cd /var/lib/tftpboot/boot-vm

cp -v /usr/share/syslinux/pxelinux.0   .
cp -v /usr/share/syslinux/menu.c32     .
cp -v /usr/share/syslinux/ldlinux.c32  .
cp -v /usr/share/syslinux/libutil.c32  .
cp -v /usr/share/syslinux/vesamenu.c32 .
cp -v /usr/share/syslinux/libcom32.c32 .

wget https://mirrors.ircam.fr/pub/CentOS/8-stream/BaseOS/x86_64/os/images/pxeboot/initrd.img
wget https://mirrors.ircam.fr/pub/CentOS/8-stream/BaseOS/x86_64/os/images/pxeboot/vmlinuz
```

Pour la mise en place des menus de sélection des modes de lancement disponibles, nous allons créer le fichier suivant dans /var/lib/tftpboot/boot-vm/pxelinux.cfg/default

```bash=
cat <<FIN > /var/lib/tftpboot/boot-vm/pxelinux.cfg/default
DEFAULT vesamenu.c32
PROMPT 1
TIMEOUT 60
NOESCAPE 1

LABEL Centos Stream 8
  KERNEL vmlinuz
  APPEND initrd=initrd.img ip=dhcp inst.repo=http://mirrors.ircam.fr/pub/CentOS/8-stream/BaseOS/x86_64/os

LABEL Centos Stream 8 Rescue
  KERNEL vmlinuz
  APPEND initrd=initrd.img ip=dhcp inst.repo=http://mirrors.ircam.fr/pub/CentOS/8-stream/BaseOS/x86_64/os rescue

LABEL Centos 8 Kickstart
  MENU DEFAULT
  KERNEL vmlinuz
  APPEND initrd=initrd.img ip=dhcp inst.repo=http://mirrors.ircam.fr/pub/CentOS/8-stream/BaseOS/x86_64/os inst.ks=http://10.0.2.15/config.ks
FIN
```
Afin de mettre à disposition le fichier de configuration anaconda, nous allons nous déplacer dans /var/www/html et créer le fichier de configuration config.ks.
Une fois celui-ci crée, nous allons devoir donner les permissions de lectures à tous les utilisateurs. Ceci permettra donc à une machine qui se connecte sur notre SRV de pouvoir lire la configuration suivante :

```bash=
cd /var/www/html/

cat <<EOF > /var/www/html/config.ks
# Nous acceptons la licence
eula --agreed

# Installation en mode texte et reboot apres installation
text
reboot

# Source de l'installation
url --url=http://mirrors.ircam.fr/pub/CentOS/8-stream/BaseOS/x86_64/os

# Configuration de GRUB
bootloader --append="crashkernel=auto" --location=mbr --boot-drive=sda

# Configuration des partitions
ignoredisk --only-use=sda
zerombr
clearpart --all --initlabel --drives=sda
part / --fstype="xfs" --ondisk=sda --size=3096 --label=ROOT
part swap --fstype="swap" --ondisk=sda --size=512
#part /home --fstype="xfs" --ondisk=sda --label=HOME

# Choix des packages
%packages
@^minimal-environment
kexec-tools
%end

# Clavier, langue et date
keyboard --xlayouts='fr (oss)'
lang fr_FR.UTF-8
timezone Europe/Paris --isUtc --nontp

# Reseau
network  --bootproto=dhcp --device=enp0s3 --ipv6=auto --activate
network  --hostname=localhost.localdomain

# Pas de setup ni de SELinux au premier demarrage
firstboot --disable
selinux --disabled

# Mot de passe et compte utilisateur (le cryptage est possible)
rootpw  root
user --name=etud --password=etud --gecos="Etudiant"

# commandes executees apres l'installation
%post

dnf -y install ypbind rpcbind oddjob-mkhomedir authconfig nfs-utils autofs
authconfig --enablenis --nisdomain=nis.asr.fr --nisserver=10.0.2.15 --updateall
systemctl --now enable autofs

cat <<END >> /etc/auto.master
/home /etc/auto.home
END

cat <<END > /etc/auto.home
*	10.0.2.15:/home/&
END

%end
EOF


# Définition des permissions
chmod a+r config.ks
```

Redémarrer le serveur afin de prendre en compte les modifications.

### Création d'un nouveau client

Pour créer un client, il faut désormais créer une nouvelle machine, avec les configurations physiques adéquats (C1 et C2 doivent appartenir au réseau PV1 et C3 doit appartenir au réseau PV2) puis il suffit juste d'initialiser la machine.