Compare commits
No commits in common. "main" and "monosphere-bastion-0.5.1" have entirely different histories.
main
...
monosphere
131
Dockerfile
131
Dockerfile
@ -1,98 +1,77 @@
|
|||||||
FROM alpine:3.20.0 AS monosphere-builder
|
FROM ubuntu:22.04
|
||||||
#~The open Monosphere Project~
|
#~The open Monosphere Project~
|
||||||
|
#Version : 1.0
|
||||||
#Autor : Siphonight :)
|
#Autor : Siphonight :)
|
||||||
|
|
||||||
|
#Defining variables and build settings
|
||||||
#Setting default settings, please change them at run
|
|
||||||
ARG MONOSPHERE_VERSION="3.5.0 Alpha"
|
|
||||||
|
|
||||||
|
|
||||||
#Defining build settings
|
|
||||||
WORKDIR /
|
WORKDIR /
|
||||||
USER root
|
USER root
|
||||||
|
#Setting default settings, please change them at run
|
||||||
|
ENV HOSTNAME="monosphere-bastion"
|
||||||
|
ENV PORT=22
|
||||||
|
ENV PASSWORD_AUTH=1
|
||||||
|
ENV KEY_AUTH=1
|
||||||
|
ARG MONOSPHERE_VERSION="0.5.1 Alpha"
|
||||||
|
|
||||||
|
|
||||||
#Updating and installing required dependencies
|
#Preparations
|
||||||
RUN apk add make=4.4.1-r2 git=2.45.4-r0 gcc=13.2.1_git20240309-r1 alpine-sdk=1.0-r1 && \
|
#Updating and installing required dependencies ;
|
||||||
addgroup root abuild && \
|
#reation and configuration of the Monosphere scripts directory ;
|
||||||
mkdir -p /var/cache/distfiles && \
|
RUN apt update -y && apt upgrade -y && \
|
||||||
chmod a+w /var/cache/distfiles
|
apt install -y ssh gawk anacron git make gcc sudo && \
|
||||||
|
mkdir /root/scripts && \
|
||||||
|
mkdir /root/scripts/users
|
||||||
|
|
||||||
|
|
||||||
|
#Starting bastion configurations
|
||||||
|
#Configuring Failsafe SSH relauncher
|
||||||
|
ADD ssh-launcher.sh /root/scripts/
|
||||||
|
#Configuring monosphere ssh banner
|
||||||
|
ADD monosphere_banner.txt /root/scripts/
|
||||||
|
RUN echo "Monosphere version is $MONOSPHERE_VERSION" >> /root/scripts/monosphere_banner.txt
|
||||||
|
#Adding the entrypoint file to the configuration
|
||||||
|
ADD entrypoint.sh /root/scripts/
|
||||||
|
#Adding the server menu script files
|
||||||
|
#Preparing the custom scripts directory
|
||||||
|
#RUN mkdir -p /opt/custom/scripts
|
||||||
|
ADD authorized_servers.txt /opt/public/servers/
|
||||||
|
ADD server_menu.sh /opt/public/scripts/
|
||||||
|
#Adding the server custom ssh configuration file
|
||||||
|
ADD sshd_config /root/scripts/
|
||||||
|
|
||||||
|
|
||||||
|
#Configuring anacrontab scheduler ;
|
||||||
|
#Changing SSHD moduli ;
|
||||||
|
#Backuping the SSHD config file ;
|
||||||
|
#Adding the config file of SSHD ;
|
||||||
|
#Activating scripts ;
|
||||||
|
RUN echo "#---Bastion configurations ! CHANGE AT YOUR OWN RISK !---" >> /etc/anacrontab && \
|
||||||
|
echo "5 5 sshrelauncher bash /root/scripts/ssh-launcher.sh" >> /etc/anacrontab && \
|
||||||
|
awk '$5 >= 3071' /etc/ssh/moduli > /etc/ssh/moduli.tmp && \
|
||||||
|
mv /etc/ssh/moduli.tmp /etc/ssh/moduli && \
|
||||||
|
cp -r /etc/ssh/sshd_config /etc/ssh/sshd_config.backup && \
|
||||||
|
rm -rf /etc/ssh/sshd_config && \
|
||||||
|
cp -r /root/scripts/sshd_config /etc/ssh/ && \
|
||||||
|
chmod 644 /etc/ssh/sshd_config && \
|
||||||
|
chown -R root:root /root/scripts && \
|
||||||
|
chmod 700 /root/scripts/*.sh
|
||||||
|
|
||||||
|
|
||||||
#Installing OVH-ttyrec
|
#Installing OVH-ttyrec
|
||||||
RUN cd /root/ && \
|
RUN cd /root/ && \
|
||||||
git clone https://github.com/ovh/ovh-ttyrec.git && \
|
git clone https://github.com/ovh/ovh-ttyrec.git && \
|
||||||
cd /root/ovh-ttyrec && \
|
cd /root/ovh-ttyrec && \
|
||||||
./configure && \
|
./configure && make && \
|
||||||
make && \
|
|
||||||
make install
|
make install
|
||||||
|
|
||||||
|
|
||||||
#Starting bastion configurations
|
#Disabling default Ubuntu MOTD
|
||||||
#Configuring monosphere ssh banner
|
RUN rm -rf /etc/update-motd.d/*
|
||||||
ADD monosphere_banner.txt /root/scripts/
|
|
||||||
RUN echo "Monosphere version is $MONOSPHERE_VERSION" >> /root/scripts/monosphere_banner.txt
|
|
||||||
|
|
||||||
|
|
||||||
#==============final container==============#
|
#Port exposition
|
||||||
FROM alpine:3.20.0
|
|
||||||
|
|
||||||
#Setting default settings, please change them at run
|
|
||||||
ENV HOSTNAME="monosphere-bastion"
|
|
||||||
ENV PORT=22
|
|
||||||
ENV PASSWORD_AUTH=1
|
|
||||||
ENV KEY_AUTH=1
|
|
||||||
|
|
||||||
|
|
||||||
#Defining build settings
|
|
||||||
WORKDIR /
|
|
||||||
USER root
|
|
||||||
|
|
||||||
|
|
||||||
#Preparations
|
|
||||||
#Updating and installing required dependencies
|
|
||||||
RUN apk add openssh-server=9.7_p1-r5 openssh-client=9.7_p1-r5 openrc=0.54-r1 bash=5.2.26-r0 sshpass=1.10-r0 gawk=5.3.0-r1 && \
|
|
||||||
apk --no-cache add shadow=4.15.1-r0
|
|
||||||
|
|
||||||
|
|
||||||
#Ensuring that the SSH server will be able to run without issues on container launch
|
|
||||||
RUN rc-update add sshd && \
|
|
||||||
mkdir -p /run/openrc && \
|
|
||||||
touch /run/openrc/softlevel
|
|
||||||
|
|
||||||
#Copying from build and adding default configuration files
|
|
||||||
COPY --from=monosphere-builder /root/scripts/monosphere_banner.txt /root/scripts/monosphere_banner.txt
|
|
||||||
ADD entrypoint.sh /root/scripts/
|
|
||||||
ADD server_menu.sh /opt/public/scripts/
|
|
||||||
ADD admin_menu.sh /opt/public/scripts/
|
|
||||||
ADD authorized_servers.txt /opt/public/servers/
|
|
||||||
ADD admin_rights.txt /opt/public/rights/
|
|
||||||
ADD transfer_rights.txt /opt/public/rights/
|
|
||||||
ADD bastion_users.txt /root/scripts/users/
|
|
||||||
ADD sshd_config /etc/ssh/
|
|
||||||
|
|
||||||
|
|
||||||
#Copying TTYREC utility from build
|
|
||||||
COPY --from=monosphere-builder /usr/local/bin/ttyplay /usr/local/bin/ttyplay
|
|
||||||
COPY --from=monosphere-builder /usr/local/bin/ttyrec /usr/local/bin/ttyrec
|
|
||||||
COPY --from=monosphere-builder /usr/local/bin/ttytime /usr/local/bin/ttytime
|
|
||||||
|
|
||||||
|
|
||||||
#Creating transfer logs directory
|
|
||||||
RUN mkdir -p /var/log/monosphere && \
|
|
||||||
touch /var/log/monosphere/transfers.log && \
|
|
||||||
chmod 777 /var/log/monosphere && \
|
|
||||||
chmod 666 /var/log/monosphere/transfers.log
|
|
||||||
|
|
||||||
#Activating scripts ;
|
|
||||||
RUN chmod 644 /etc/ssh/sshd_config && \
|
|
||||||
chown -R root:root /root/scripts && \
|
|
||||||
chmod 700 /root/scripts/*.sh
|
|
||||||
|
|
||||||
|
|
||||||
#Default port exposition
|
|
||||||
EXPOSE $PORT
|
EXPOSE $PORT
|
||||||
|
|
||||||
|
|
||||||
#Issuing start entrypoint
|
#Issuing start entrypoint
|
||||||
CMD ["/bin/sh", "/root/scripts/entrypoint.sh"]
|
CMD ["/bin/bash", "/root/scripts/entrypoint.sh"]
|
||||||
807
README.md
807
README.md
@ -1,129 +1,64 @@
|
|||||||
# Monosphere Bastion
|
# Monosphere Bastion
|
||||||
|
Le projet Monosphere Bastion est un bastion SSH simple et sécurisé basé sur Ubuntu 22.04. Il offre une interface de menu permettant aux utilisateurs autorisés de se connecter à différents serveurs.
|
||||||
Le projet Monosphere Bastion est un bastion SSH simple et sécurisé basé sur Alpine en version 3.20.0.
|
|
||||||
Il offre une interface de menu permettant aux utilisateurs autorisés de se connecter à différents serveurs.
|
|
||||||
|
|
||||||
## Sommaire
|
## Sommaire
|
||||||
|
- [Sommaire](#sommaire)
|
||||||
- [Monosphere Bastion](#monosphere-bastion)
|
- [Objectifs des mises à jour](#objectifs-des-mises-à-jour)
|
||||||
- [Sommaire](#sommaire)
|
- [Installation](#installation)
|
||||||
- [Fonctionnalités du bastion](#fonctionnalités-du-bastion)
|
- [Utilisation](#utilisation)
|
||||||
- [Pourquoi choisir ce bastion ?](#pourquoi-choisir-ce-bastion-)
|
- [Lancement et mise en service](#lancement-et-mise-en-service)
|
||||||
- [Objectifs des mises à jour](#objectifs-des-mises-à-jour)
|
- [Utilisation de l'interface de connexion](#utilisation-de-linterface-de-connexion)
|
||||||
- [Fonctionnement des versions](#fonctionnement-des-versions)
|
- [Utilisation avec l'option JumpHost](#utilisation-avec-loption-jumphost)
|
||||||
- [Mise en place](#mise-en-place)
|
- [Personnalisation](#personnalisation)
|
||||||
- [Création ou téléchargement du bastion](#création-ou-téléchargement-du-bastion)
|
- [Utilisateurs autorisés et serveurs](#utilisateurs-autorisés-et-serveurs)
|
||||||
- [Lancement et mise en service](#lancement-et-mise-en-service)
|
- [Ajout d'utilisateurs](#ajout-dutilisateurs)
|
||||||
- [Valeurs et configurations par défaut](#valeurs-et-configurations-par-défaut)
|
- [Avec le répertoire de configuration des utilisateurs "/root/scripts/users/" et le fichier "bastion_users.txt".](#avec-le-répertoire-de-configuration-des-utilisateurs-rootscriptsusers-et-le-fichier-bastion_userstxt)
|
||||||
- [Personnalisation](#personnalisation)
|
- [Par l'ajout des utilisateurs avec la commande adduser et usermod.](#par-lajout-des-utilisateurs-avec-la-commande-adduser-et-usermod)
|
||||||
- [Configuration des utilisateurs, administrateurs et serveurs](#configuration-des-utilisateurs-administrateurs-et-serveurs)
|
- [Les clés SSH](#les-clés-ssh)
|
||||||
- [Ajout d'administrateurs](#ajout-dadministrateurs)
|
- [Ajout de serveurs](#ajout-de-serveurs)
|
||||||
- [Ajout d'utilisateurs](#ajout-dutilisateurs)
|
|
||||||
- [Configuration de la connexion par clés SSH pour les utilisateurs et administrateurs](#configuration-de-la-connexion-par-clés-ssh-pour-les-utilisateurs-et-administrateurs)
|
|
||||||
- [Ajout de serveurs distants dans la configuration](#ajout-de-serveurs-distants-dans-la-configuration)
|
|
||||||
- [Configuration des accès aux hotes distants](#configuration-des-accès-aux-hotes-distants)
|
|
||||||
- [Transfert de fichiers (non-interactif)](#transfert-de-fichiers-non-interactif)
|
|
||||||
- [Scripts personnalisés](#scripts-personnalisés)
|
|
||||||
- [Configuration SSH](#configuration-ssh)
|
|
||||||
- [Fichiers](#fichiers)
|
|
||||||
- [Administration du bastion](#administration-du-bastion)
|
|
||||||
- [Audit des sessions](#audit-des-sessions)
|
- [Audit des sessions](#audit-des-sessions)
|
||||||
- [Modification des accès aux hotes distants](#modification-des-accès-aux-hotes-distants)
|
- [Scripts personnalisés](#scripts-personnalisés)
|
||||||
- [Modification des privilèges d'administration](#modification-des-privilèges-dadministration)
|
- [Configuration SSH](#configuration-ssh)
|
||||||
- [Gestion des droits de transfert](#gestion-des-droits-de-transfert)
|
- [Fichiers](#fichiers)
|
||||||
- [Codes d'erreurs lors du lancement du bastion](#codes-derreurs-lors-du-lancement-du-bastion)
|
- [Sécurisation](#sécurisation)
|
||||||
- [License](#license)
|
- [License](#license)
|
||||||
- [Remerciements](#remerciements)
|
|
||||||
|
|
||||||
## Fonctionnalités du bastion
|
|
||||||
|
|
||||||
Voici une liste des différentes fonctionnalités déjà en place sur le bastion Monosphere :
|
|
||||||
|
|
||||||
- Création et configuration automatisée du bastion au lancement (ce conteneur est entièrement stateless, signifiant qu'il peut être redéployé sans souci, les configurations de ce dernier étant sous forme de fichiers).
|
|
||||||
- Support des utilisateurs de connexion multiples pour les hôtes distants.
|
|
||||||
- Support pour la connexion par clés SSH et mots de passe sur les hôtes distants.
|
|
||||||
- Sessions enregistrées et visionnables par les administrateurs du bastion ayant les autorisation appropriées.
|
|
||||||
- Support pour l'execution de scripts personalisés au lancement du conteneur.
|
|
||||||
- Recherche possible par nom de serveur distant dans la liste des serveurs du menu de connexion (pratique pour les grandes flottes).
|
|
||||||
- Transfert de fichiers en une commande vers les serveurs distants via `push_file`/`retrieve_file` (non-interactif, sans stockage intermédiaire).
|
|
||||||
- Contrôle des droits de transfert par serveur, gérable par les administrateurs en temps réel.
|
|
||||||
- Journalisation complète de tous les transferts (utilisateur, serveur, fichier, taille, statut).
|
|
||||||
|
|
||||||
## Pourquoi choisir ce bastion ?
|
|
||||||
|
|
||||||
- Le bastion Monosphere est entièrement écrit en bash avec un code lisible et facilement compréhensible.
|
|
||||||
- Cette caratéristique lui permet de rester très personnalisable et accessible tout en conservant sa robustesse et ses fonctionnalités.
|
|
||||||
- L'image a été optimisée afin de n'utiliser que le strict nécessaire pour le bon fonctionnement du bastion, en prenant des paquets reconnus et audités.
|
|
||||||
- Il est facilement scalable, il est possible de déployer plusieurs conteneurs du bastion Monosphere avec les mêmes fichiers de configuration afin de créer une forme de "cluster" de bastions Monosphere. (Une fonctionnalité plus avancée de clustering est actuellement en cours de développement)
|
|
||||||
- Sa prise en main est de plus très simple, tout les détails des configurations possibles se trouvant dans cette documentation.
|
|
||||||
- Enfin ce bastion est très léger, facilement administrable et ne nécessite pas d'applicatif complémentaire, autre que le support du protocole SSH.
|
|
||||||
- Il est de ce fait parfait pour de petits et moyens projets, comme pour des homelabs par exemple.
|
|
||||||
|
|
||||||
## Objectifs des mises à jour
|
## Objectifs des mises à jour
|
||||||
|
Ci dessous une liste non exaustive des objectifs des prochaines mises à jour du projet:
|
||||||
Ci-dessous une liste non exhaustive des objectifs des prochaines mises à jour du projet:
|
- [X] Ajouter le support pour une clé SSH par serveur.
|
||||||
|
- [ ] Ajouter le support pour un serveur LDAP.
|
||||||
- [x] Ajouter le transfert de fichiers non-interactif au travers du bastion (`push_file`/`retrieve_file`).
|
- [X] Ajouter un système de création d'utilisateurs automatique et sécurisé lors du déploiement à partir d'une liste donnée user:mot_de_passe_chiffré.
|
||||||
- [x] Ajouter une option de recherche d'hôtes distants dans la liste des serveurs.
|
|
||||||
- [ ] Ajouter une option sous forme de variable d'environnement pour fournir au bastion les clés d'hôtes des machines distantes. (avec un mode confiance, strict ou test par exemple)
|
|
||||||
- [ ] Ajouter le support pour un serveur LDAP. (Objectif sur le long terme)
|
|
||||||
- [ ] Ajouter un système de mise à jour automatique dans le conteneur, évitant ainsi les redéploiements.
|
- [ ] Ajouter un système de mise à jour automatique dans le conteneur, évitant ainsi les redéploiements.
|
||||||
- [x] Ajouter la possibilité de revenir dans le menu des serveurs après une déconnexion d'une machine distante.
|
- [x] Ajouter un support pour des ports autres que 22 sur les machines distantes.
|
||||||
- [ ] Ajouter un système de cluster avec master/slave et synchronisation entre les nodes.
|
- [X] Réduire le nombre de layers dans le Dockerfile.
|
||||||
- [ ] Ajouter une option de gestion des droits de transfert par groupes d'utilisateurs.
|
- [x] Changer l'image de base pour Ubuntu 22.04.
|
||||||
- [ ] Support du chiffrement de bout en bout pour les transferts de fichiers sensibles.
|
- [x] Ajouter le support pour différents utilisateurs distants.
|
||||||
- [x] Améliorer le système de journalisation du déploiement du bastion, avec les erreurs de déploiement affichées lors de la connexion des utilisateurs internes.
|
- [x] Intégration de ttyrec pour la sauvegarde des sessions effectuées sur le bastion.
|
||||||
- [x] Ajouter un menu d'administration et de gestion lors de la connexion des utilisateurs internes du bastion.
|
|
||||||
- [x] Créer des rôles administrateur/inspecteur avec des droits différents au sein du bastion.
|
|
||||||
|
|
||||||
Corrections de la version 3.5.0 :
|
## Installation
|
||||||
|
Pour installer Monosphere Bastion, clonez ce dépôt et construisez l'image Docker en utilisant le fichier Dockerfile fourni.
|
||||||
- [x] Correction de la récursion infinie dans le visionnage des sessions (`sessions_viewer`).
|
|
||||||
- [x] Correction du filtre utilisateur dans le menu d'administration (typo `user_map` → `users_map`, `user_counter` → `users_counter`).
|
|
||||||
|
|
||||||
Veuillez signaler tout problème rencontré en envoyant un email à l'adresse "**<crossghostmansiphonight@gmail.com>**", détaillant le problème ainsi que le contexte entourant le constat de ce dernier.
|
|
||||||
|
|
||||||
## Fonctionnement des versions
|
|
||||||
|
|
||||||
Le bastion Monosphere étant en constante évolution, des changements fréquents sont à prévoirs sur ce projet.
|
|
||||||
Les modifications apportées incrémentent ou non le numéro de version. Ci dessous un exemple :
|
|
||||||
|
|
||||||
| **Version majeure** | **Version mineure** | **Correctifs** |
|
|
||||||
|---|---|---|
|
|
||||||
| 0 | 5 | 3 |
|
|
||||||
| La version majeure est de 0. Cette dernière n'est incrémentée que lorsqu'une fonctionnalité ou un patch créant des changements cassants est ajoutée. Lorsque vous devrez faire une mise à jour d'une version majeure à une autre, un guide de mise à jour pour vos configurations sera mis à disposition. | La version mineure est 5. Elle est incrémentée a chaque ajout de mise à jour non cassante qui ajoute des capacités et/ou fonctionnalités au bastion. Une mise à jour d'une version mineure à l'autre ne nécessite pas de modifications dans vos configurations existantes. | La version du correctif est 3. Cette dernière est incrémentée à chaque patch ou amélioration non cassante qui n'ajoute pas de nouvelles fonctionnalités mais qui améliore ou corrige celles qui sont déjà en place. Une mise à jour d'une version de correctif à une autre peut se faire sans risque et sans modification des configurations existantes. |
|
|
||||||
|
|
||||||
**La façon la plus sure à l'heure actuelle pour effectuer une mise à jour est de redéployer le conteneur du bastion.**
|
|
||||||
|
|
||||||
## Mise en place
|
|
||||||
|
|
||||||
### Création ou téléchargement du bastion
|
|
||||||
|
|
||||||
Pour installer et utiliser le Monosphere Bastion, plusieurs approches sont possibles :
|
|
||||||
|
|
||||||
- Vous pouvez cloner ce dépôt et construire l'image Docker en utilisant le fichier Dockerfile fourni.
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://gitea.cloudyfy.fr/Siphonight/monosphere-bastion.git
|
git clone https://gitea.cloudyfy.fr/Siphonight/monosphere-bastion.git
|
||||||
cd monosphere-bastion
|
cd monosphere-bastion
|
||||||
docker build -t siphonight/monosphere-bastion .
|
docker build -t monosphere-bastion .
|
||||||
```
|
```
|
||||||
|
|
||||||
- Vous pouvez également télécharger directement l'image depuis docker hub :
|
Vous pouvez également télécharger directement l'image depuis docker hub :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker pull siphonight/monosphere-bastion:<version_choisie>
|
docker pull siphonight/monosphere-bastion:<version_choisie>
|
||||||
```
|
```
|
||||||
|
|
||||||
### Lancement et mise en service
|
## Utilisation
|
||||||
|
|
||||||
Pour lancer un conteneur Monosphere Bastion avec la configuration par défaut, exécutez la commande suivante :
|
### Lancement et mise en service
|
||||||
|
Pour lancer un conteneur Monosphere Bastion, exécutez la commande suivante :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker run -d -p 22:22 --name monosphere-bastion siphonight/monosphere-bastion:latest
|
docker run -d -p 22:22 --name monosphere-bastion monosphere-bastion:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
Vous pouvez également personnaliser les variables d'environnement et les configurations lors de l'exécution du conteneur :
|
Vous pouvez également personnaliser les variables d'environnement lors de l'exécution du conteneur :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker run -d -p 22:22 \
|
docker run -d -p 22:22 \
|
||||||
@ -134,44 +69,39 @@ docker run -d -p 22:22 \
|
|||||||
-v /datasets/monosphere-bastion/servers:/opt/public/servers \
|
-v /datasets/monosphere-bastion/servers:/opt/public/servers \
|
||||||
-v /datasets/monosphere-bastion/custom-scripts:/opt/custom/scripts \
|
-v /datasets/monosphere-bastion/custom-scripts:/opt/custom/scripts \
|
||||||
-v /datasets/monosphere-bastion/users:/root/scripts/users \
|
-v /datasets/monosphere-bastion/users:/root/scripts/users \
|
||||||
-v /datasets/monosphere-bastion/rights:/opt/public/rights \
|
|
||||||
-v /datasets/monosphere-bastion/logs:/var/log/monosphere \
|
|
||||||
-p "22:22" \
|
-p "22:22" \
|
||||||
--name monosphere-bastion siphonight/monosphere-bastion:latest
|
--name monosphere-bastion monosphere-bastion:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
Il est également possible d'utiliser docker-compose afin de déployer ce conteneur.
|
Il est également possible d'utiliser docker-compose afin de déployer ce conteneur.
|
||||||
|
|
||||||
Ci-dessous un exemple de déploiement possible :
|
Ci dessous un exemple de déploiement possible :
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
|
version: "3.0"
|
||||||
services:
|
services:
|
||||||
monosphere-bastion:
|
monosphere-bastion:
|
||||||
image: siphonight/monosphere-bastion:latest
|
image: siphonight/monosphere-bastion:0.5.0
|
||||||
container_name: monosphere-bastion
|
container_name: monosphere-bastion
|
||||||
environment:
|
environment:
|
||||||
- PORT=22
|
- PORT=22
|
||||||
- PASSWORD_AUTH=1
|
- PASSWORD_AUTH=1
|
||||||
- KEY_AUTH=1
|
- KEY_AUTH=1
|
||||||
- HOSTNAME=monosphere-bastion
|
- HOSTNAME=monosphere-bastion
|
||||||
volumes:
|
volumes:
|
||||||
- /datasets/monosphere-bastion/servers:/opt/public/servers
|
- /datasets/monosphere-bastion/servers:/opt/public/servers
|
||||||
- /datasets/monosphere-bastion/custom-scripts:/opt/custom/scripts
|
- /datasets/monosphere-bastion/custom-scripts:/opt/custom/scripts
|
||||||
- /datasets/monosphere-bastion/users:/root/scripts/users
|
- /datasets/monosphere-bastion/users:/root/scripts/users
|
||||||
- /datasets/monosphere-bastion/rights:/opt/public/rights
|
ports:
|
||||||
- /datasets/monosphere-bastion/logs:/var/log/monosphere
|
- 22:22
|
||||||
ports:
|
restart: unless-stopped
|
||||||
- 22:22
|
|
||||||
restart: unless-stopped
|
|
||||||
```
|
```
|
||||||
|
Dans les exemples de la commande **docker run** et du ficheir docker compose, nous avons défini des variables et des répertoires.
|
||||||
Dans les exemples de la commande **docker run** et du fichier docker compose, nous avons défini des variables et des répertoires.
|
Ci dessous l'explication pour chacun d'entre eux:
|
||||||
Ci-dessous l'explication de chacun d'entre eux:
|
|
||||||
|
|
||||||
| **Variables d'environnements** | Valeurs par défaut | *Description* |
|
| **Variables d'environnements** | Valeurs par défaut | *Description* |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| **PORT** | 22 | *Désigne le port d'écoute du service SSH du bastion.* |
|
| **PORT** | 22 | *Désigne le port d'écoute du service SSH du bastion.* |
|
||||||
| **PASSWORD_AUTH** | 1 | *Activer ou non l'utilisation des mots de passes comme moyen d'authentification sur le bastion (0(non) ou 1(oui)).* **PREFEREZ L'AUTHENTIIFCATION PAR CLES SSH** |
|
| **PASSWORD_AUTH** | 1 | *Activer ou non l'utilisation des mots de passes comme moyen d'authentification sur le bastion (0(non) ou 1(oui)).* |
|
||||||
| **KEY_AUTH** | 1 | *Activer ou non l'utilisation des clés publiques comme moyen d'authentification sur le bastion (0(non) ou 1(oui)).* |
|
| **KEY_AUTH** | 1 | *Activer ou non l'utilisation des clés publiques comme moyen d'authentification sur le bastion (0(non) ou 1(oui)).* |
|
||||||
| **HOSTNAME** | monosphere-bastion | *Nom d'hôte qui sera utilisé dans le conteneur du bastion.* |
|
| **HOSTNAME** | monosphere-bastion | *Nom d'hôte qui sera utilisé dans le conteneur du bastion.* |
|
||||||
|
|
||||||
@ -179,145 +109,210 @@ A noter que mettre la valeur à "1" pour **PASSWORD_AUTH** ne générera pas de
|
|||||||
|
|
||||||
| **Volumes** | fichiers attendus | *Description* |
|
| **Volumes** | fichiers attendus | *Description* |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| **/opt/public/servers** | Le répertoire doit contenir un fichier nommé "**authorized_servers.txt**", contenant les autorisations de connexion et la liste des informations de machines distantes. Si vous utilisez l'authentification par clés privés ou par mots de passe pré-renseignés pour la connexion aux hôtes distants vous devez également ajouter les fichiers de ces dernières dans ce même répertoire. | *Ce fichier est ce qui vas gérer les droits accordés aux comptes sur les différents serveurs distants en temps réel. Une modification du fichier entrainera donc directement une modification au niveau des droits de connexion des utilisateurs, et des serveurs auquels le bastion permettra la connexion.* |
|
| **/opt/public/servers** | Le répertoire doit contenir un fichier nommé "**authorized_servers.txt**", contenant les autorisations de connexion et la liste des informations de machines distantes. La syntaxe est décrite plus bas dans la partie "**Utilisateurs autorisés et serveurs**" | *Ce fichier est ce qui vas gérer les droits accordés aux comptes sur les différents serveurs distants en temps réel. Une modification du fichier entrainera donc directement une modification au niveau des droits de connexion des utilisateurs, et des serveurs* |
|
||||||
| **/opt/custom/scripts** | Ce répertoire doit contenir les scripts personnalisés de l'utilisateur, tous avec l'extension ".sh". Ces derniers seront exécutés avec le compte root au lancement du conteneur. | *Ces scripts peuvent servir à personnaliser plus amplement le conteneur du bastion, en modifiant par exemple la bannière en temps réel ou bien en changeant les paramètres du bastion qui ne sont pas disponibles avec une modification par variables d'environnement ou volumes.* |
|
| **/opt/custom/scripts** | Ce répertoire doit contenir les scripts personnalisés de l'utilisateur, tous avec l'extension ".sh". Ces derniers seront exécutés avec le compte root au lancement du conteneur. | *Ces scripts peuvent servir à personnaliser plus amplement le conteneur du bastion, en modifiant par exemple la bannière en temps réel ou bien en changeant les paramètres du bastion qui ne sont pas disponibles avec une modification par variables d'environnement ou volumes.* |
|
||||||
| **/root/scripts/users** | Un fichier nommé "**bastion_users.txt**" contenant la liste des utilisateurs et de leurs paramètres de configuration. La syntaxe exacte de ce fichier est précisée plus bas dans la section "**Ajout d'utilisateurs**". Si vous activez l'option pour l'authentification par clé, vous devez également placer ici les dossiers aux noms des utilisateurs ajoutés ayant le contenu de leur répertoire "**.ssh**" avec les fichiers des clés publiques de connexion à l'utilisateur. | *Grace à ces paramètres, il est possible d'utiliser ce conteneur bastion de manière 100% stateless, car le redéployer en utilisant la même configuration et les mêmes fichiers permet de répliquer les mêmes comportements.* |
|
| **/root/scripts/users** | Un fichier nommé "**bastion_users.txt**" et contenant la liste des utilisateurs et de leurs paramètres de configuration. La syntaxe exacte de ce fichier est précisée plus bas dans la section "**Ajout d'utilisateurs**". Si vous activez l'option pour l'authentification par clé, vous devez également placer ici les dossiers aux noms des utilisateurs ajoutés ayant le contenu de leur répertoire "**.ssh**" avec les fichiers des clés publiques de connexion à l'utilisateur, mais également les fichiers des clés privées pour la connexion aux serveurs distants, dont l'utilisation est précisée plus bas dans la section "**Ajout d'utilisateurs**" | *Grace à ces paramètres, il est possible d'utiliser ce conteneur bastion de manière 100% stateless, car le redéployer en utilisant la même configuration et les mêmes fichiers permettrait de répliquer les mêmes comportements.* |
|
||||||
| **/opt/public/rights** | Ce répertoire doit contenir les fichiers "**admin_rights.txt**" (droits d'administration) et "**transfer_rights.txt**" (droits de transfert). | *Les droits inscrits dans ces fichiers sont mis à jour en temps réel. Veuillez vous assurer que ces derniers sont corrects et attribués aux utilisateurs et administrateurs souhaités.* |
|
|
||||||
| **/var/log/monosphere** | Le fichier "**transfers.log**" est créé automatiquement. | *Répertoire contenant les logs de transfert de fichiers. Accessible en consultation depuis le menu admin.* |
|
|
||||||
|
|
||||||
A noter que les droits mis sur les fichiers et dossiers configurés dans ces volumes ne sont pas importants, car ces derniers sont adaptés lors du déploiement du conteneur bastion.
|
A noter que les droits mis sur les fichiers et dossiers configurés dans ces volumes ne sont pas importants, car ces derniers seront adaptés lors du déploiement du conteneur bastion.
|
||||||
|
|
||||||
### Valeurs et configurations par défaut
|
|
||||||
|
|
||||||
Les valeurs par défaut ci dessous s'appliquent dans le cas où elles ne sont pas écrasées par des valeurs personalisées définies au lancement du conteneur :
|
### Utilisation de l'interface de connexion
|
||||||
|
Lors de l'utilisation de l'interface terminal, il y a 3 cas dans lesquels l'utilisateur peut se trouver lorsqu'il réussit une connexion au bastion.
|
||||||
|
|
||||||
- "**PORT=22**" (Port par défaut pour la connexion : 22.)
|
En premier, le cas ou un utilisateur a bien un compte enregistré sur le bastion, mais n'a aucun serveur autorisé dans le fichier "**authorized_servers.txt**" à son nom :
|
||||||
- "**KEY_AUTH=1**" (Accès au bastion par clé SSH autorisé.)
|
```text
|
||||||
- "**PASSWORD_AUTH=1**" (Accès au bastion par mot de passe autorisé.)
|
root@ubuntu-test / [255]# ssh test@172.17.0.4
|
||||||
- Utilisateur interne du bastion : **bastion**, avec pour mot de passe "**bastion**"
|
|
||||||
|
|
||||||
L'utilisateur par défaut du bastion est un administrateur ayant tout les privilèges administratifs nommé "**bastion**" avec pour mot de passe "**bastion**".
|
@@@@@@@@@@[Welcome to the Monosphere bastion]@@@@@@@@@@
|
||||||
|
Authorized personnel only is allowed to come here.
|
||||||
|
If you're not authorized personnel, please disconnect
|
||||||
|
from this interface this instant.
|
||||||
|
|
||||||
Une configuration de connexion serveur par defaut pour cet utilisateur est également présente.
|
-------------------------------------------------------
|
||||||
|
Monosphere is logging the current connection.
|
||||||
|
|
||||||
|
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||||
|
|
||||||
|
Monosphere version is 0.4.1 Alpha
|
||||||
|
test@172.17.0.4's password:
|
||||||
|
Vous n'avez pas l'autorisation de vous connecter à un serveur.
|
||||||
|
Connection to 172.17.0.4 closed.
|
||||||
|
```
|
||||||
|
|
||||||
|
Le second cas, l'utilisateur a bien un serveur sur lequel son nom est autorisé, mais une connexion par clé SSH n'a pas été configurée :
|
||||||
|
```text
|
||||||
|
root@ubuntu-test /# ssh test@172.17.0.4
|
||||||
|
|
||||||
|
@@@@@@@@@@[Welcome to the Monosphere bastion]@@@@@@@@@@
|
||||||
|
Authorized personnel only is allowed to come here.
|
||||||
|
If you're not authorized personnel, please disconnect
|
||||||
|
from this interface this instant.
|
||||||
|
|
||||||
|
-------------------------------------------------------
|
||||||
|
Monosphere is logging the current connection.
|
||||||
|
|
||||||
|
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||||
|
|
||||||
|
Monosphere version is 0.4.1 Alpha
|
||||||
|
test@172.17.0.4's password:
|
||||||
|
Veuillez sélectionner un serveur auquel vous connecter :
|
||||||
|
1) test-ubuntu-2 - 172.17.0.6
|
||||||
|
Votre choix (1-1): 1
|
||||||
|
Connexion à 172.17.0.6...
|
||||||
|
The authenticity of host '172.17.0.6 (172.17.0.6)' can't be established.
|
||||||
|
ECDSA key fingerprint is SHA256:EW3Kr7hjEGbKN/w6XdJxn8Ktinoy1PuPdXOY21/003c.
|
||||||
|
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
|
||||||
|
Warning: Permanently added '172.17.0.6' (ECDSA) to the list of known hosts.
|
||||||
|
test@172.17.0.6's password:
|
||||||
|
Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-58-generic x86_64)
|
||||||
|
|
||||||
|
test@test-ubuntu-2:~$
|
||||||
|
```
|
||||||
|
|
||||||
|
Enfin, le cas ou un utilisateur a bien un serveur autorisé et une clé ssh a bien été configurée sur le bastion et sur le serveur de destination :
|
||||||
|
```text
|
||||||
|
root@Alicee:~/.ssh# ssh -p 2336 -i id_rsa siphonight@kaitokid.cloudyfy.fr
|
||||||
|
@@@@@@@@@@[Welcome to the Monosphere bastion@@@@@@@@@@
|
||||||
|
Authorized personnel only is allowed to come here.
|
||||||
|
If you're not authorized personnel, please disconnect
|
||||||
|
from this interface this instant.
|
||||||
|
|
||||||
|
-------------------------------------------------------
|
||||||
|
Monosphere is logging the current connection.
|
||||||
|
|
||||||
|
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||||
|
|
||||||
|
Monosphere version is 0.5.0 Alpha
|
||||||
|
Veuillez sélectionner un serveur auquel vous connecter :
|
||||||
|
1) test-container1 - siphonight 172.19.0.12:22
|
||||||
|
Votre choix (1-1): 1
|
||||||
|
Connexion à 172.19.0.12 22 siphonight test...
|
||||||
|
Welcome to Ubuntu 24.04 LTS (GNU/Linux 5.15.0-105-generic x86_64)
|
||||||
|
|
||||||
|
test@test-ubuntu-2:~$
|
||||||
|
```
|
||||||
|
|
||||||
|
***Depuis la version 0.5.1, les sessions ont désormais un timer d'inactivité. Ce dernier est de 5 minutes et fermera les sessions dépassant une inactivité au delà de ce délai, avec un avertissement 60 secondes avant fermeture. Les sessions ouvertes par les utilisateurs internes au bastion sur le bastion lui même ne sont pas conccernées par ce changement.***
|
||||||
|
|
||||||
|
|
||||||
|
### Utilisation avec l'option JumpHost
|
||||||
|
Enfin, si vous souhaitez par exemple effectuer un transfert de fichiers au travers de la commande **scp**, il est toujours possible de passer par le bastion avec l'option **-J** de la commande **ssh** :
|
||||||
|
```bash
|
||||||
|
ssh -J utilisateur@ip_bastion utilisateur@ip_distante
|
||||||
|
```
|
||||||
|
|
||||||
***A noter que depuis la version 0.5.1, les sessions ont désormais un timer d'inactivité. Ce dernier est de 5 minutes et fermera les sessions dépassant une inactivité au delà de ce délai, avec un avertissement 60 secondes avant fermeture. Les sessions ouvertes par les utilisateurs internes au bastion sur le bastion lui même ne sont pas conccernées par ce changement.***
|
|
||||||
|
|
||||||
## Personnalisation
|
## Personnalisation
|
||||||
|
|
||||||
### Configuration des utilisateurs, administrateurs et serveurs
|
|
||||||
|
|
||||||
#### Ajout d'administrateurs
|
### Utilisateurs autorisés et serveurs
|
||||||
|
Pour définir les utilisateurs autorisés et les serveurs auxquels ils peuvent se connecter, modifiez le fichier **authorized_servers.txt** dans le répertoire **/opt/public/servers/**. Chaque ligne doit contenir l'adresse IP du serveur, le port, le nom personnalisé du server, le nom d'utilisateur de connexion et le nom d'utilisateur, séparés par des espaces :
|
||||||
|
|
||||||
Le bastion Monosphère supporte les utilisateurs ayant des droits d'administration. Ces derniers sont attribués au groupe "**bastionadmin**" lors du déploiement du bastion et auront le menu d'administration affiché à chaque connexion au bastion. (ils peuvent passer sur le menu de connexion aux serveurs depuis ce dernier.)
|
```txt
|
||||||
|
192.168.1.10 22 server1 server_user1 user1,user2 privkey1
|
||||||
|
192.168.1.11 2222 server2 server_user2 user2
|
||||||
|
```
|
||||||
|
L'indication de la clé privée pour la connexion au hôtes distants n'est pas obligatoire mais fortement recommandée. Si vous n'en avez pas besoin vous pouvez ne pas indiquer le nom de la clé privée.
|
||||||
|
|
||||||
***Toute modification du fichier "bastion_users.txt" nécessite un redémarrage du conteneur (ou bien une relance du script entrypoint.sh) pour être appliqués. Cela fait l'objet d'une prochaine mise à jour.***
|
Explication de la construction des lignes du fichier:
|
||||||
|
```txt
|
||||||
Afin de créer un utilisateur avec des droits d'administration, commencez par ajouter la ligne de configuration souhaitée pour votree administrateur dans le fichier "**bastion_users.txt**" en suivant les indications ci dessous :
|
[Adresse_IP] [Port] [Nom_du_serveur/Hostname] [Nom_de_utilisateur_de_connexion] [Usilisateurs_autorisés] [Nom_de_clé_privée_a_utiliser]
|
||||||
|
|
||||||
```text
|
|
||||||
<Nom de l'administrateur>;0;<hash du mot de passe>;<clé SSH>
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Explication des valeurs possibles :
|
Comme montré ci dessus, il est possible de mettre plusieurs noms d'utilisateurs sur un seul et même serveur, dans le cas ou plusieurs utilisateurs sont autorisés à se connecter sur la machine distante et sur le même utilisateur distant.
|
||||||
|
Ces noms d'utilisateurs du bastion doivent bien être séparés par des virgules, comme dans l'exemple.
|
||||||
|
|
||||||
- **Nom de l'administrateur** : Définit le nom de l'administrateur. Ce dernier doit être entièrement en minuscules et peut contenir des carachtères alphanumériques.
|
Si vous souhaitez vous connecter sur la même machine distante mais avec un utilisateur distant différent, créez dans ce cas une nouvelle ligne le référençant. L'ajout de plusieurs noms d'utilisateurs distants sur une seule et même ligne de configuration n'est pas supporté.
|
||||||
- **0** : Permet de donner le statut d'administrateur au compte qu isera généré. Notez que ce n'est pas suffisant pour que l'administrateur ait des privilèges sur le bastion et ses ressources.
|
|
||||||
- **hash du mot de passe** : Champ pour entrer le mot de passe de l'administrateur au format hashé si il en a un. Il est possible de ne pas donner de mot de passe à l'administrateur en mettant "0" à cet endroit. Dans ce cas le mot de passe de cet administrateur sera son nom d'utilisateur. Pour obtenir le hash du mot de passe que vous souhaitez utiliser pour cet utilisateur, lancez la commande ci dessous dans un terminal sous Linux et utilisez son résultat EXACT comme valeur pour ce champ :
|
|
||||||
|
|
||||||
```bash
|
A savoir qu'il est également possible d'utiliser des noms de domaine DNS, mais prenez en compte le fait que la résolution de nom se fera au niveau du bastion et non du client.
|
||||||
echo <mot de passe souhaité> | openssl passwd -6 -stdin
|
|
||||||
```
|
|
||||||
|
|
||||||
Cette commande est importante, le seul format étant accepté pour les hash étant "sha-256" par mesure de sécurité.
|
|
||||||
|
|
||||||
- **clé SSH** : Définit si l'administrateur aura une ou des clés SSH configurées. Mettez la valeur à "1" si vous souhaitez que ce soit le cas, 0 si vous ne le voulez pas. Référez vous à la partie [Configuration de la connexion par clés SSH pour les utilisateurs et administrateurs](#configuration-de-la-connexion-par-clés-ssh-pour-les-utilisateurs-et-administrateurs) pour plus d'informations sur la configuration de cette méthode de connexion au bastion.
|
|
||||||
|
|
||||||
Ci-dessous un exemple de configuration possible d'une ligne du fichier "**bastion_users.txt**", avec un administrateur "**bastion**" ayant pour mot de passe "**bastion**" (ici sous format hashé) et ayant des clés SSH configurées :
|
|
||||||
|
|
||||||
```text
|
|
||||||
bastion;1;$6$Yrq.UgmNczR9x9zA$1FnHkw0dPDckm35jr44bdKgHlNIk8DghA.DCOz4dWQQRyzpQCd802WaRXsmH3VGWLJudEEmzBPXKnH32B8dPI0;1
|
|
||||||
```
|
|
||||||
|
|
||||||
***Il est fortement recommandé de définir un mot de passe fort pour tout les administrateurs du bastion, en particulier lorsque l'authentification par mots de passes est activée. Dans le cas contraire la sécurité de votre bastion pourrait être compromise.***
|
|
||||||
|
|
||||||
Ensuite, attribuez des droits d'administration à l'administrateur nouvellement créé correspondants à votre besoin.
|
|
||||||
|
|
||||||
Pour cela, modifiez le fichier "**admin_rights.txt**", en vous basant sur l'exemple ci dessous :
|
|
||||||
|
|
||||||
```text
|
|
||||||
sessionswatch_admins Visionnage_des_sessions_du_bastion bastion,vieweradmin
|
|
||||||
serverscontrol_admins Administration_des_acces_serveurs bastion
|
|
||||||
adminscontrol_admins Administration_des_privileges bastion
|
|
||||||
```
|
|
||||||
|
|
||||||
Explication des différents droits d'administration disponibles :
|
|
||||||
|
|
||||||
- **sessionswatch_admins** : Ce droit permet aux administrateurs le possédant de lire et visionner les sessions de connexion de tout les utilisateurs et administrateurs du bastion.
|
|
||||||
- **serverscontrol_admins** : Ce droit donne la possibilité de modifier les accès des utilisateurs et administrateurs du bastion aux hôtes distants, ainsi que les méthodes d'authentification et la configuration des serveurs distants.
|
|
||||||
- **adminscontrol_admins** : Ce droit permet de modifier l'attribution des autres droits. Un administrateur possédant ce dernier peut de ce fait gérer les privilèges des autres administrateurs du bastion, *y compris lui même*.
|
|
||||||
- **transfercontrol_admins** : Ce droit permet de gérer les droits de transfert de fichiers des utilisateurs du bastion. Un administrateur possédant ce droit peut éditer le fichier `transfer_rights.txt` pour autoriser ou restreindre les transferts vers les serveurs distants.
|
|
||||||
|
|
||||||
Dans l'exemple ci dessus, l'administrateur "bastion" à le droit de lire les sessions de connexion mais également de modifier les paramètres des connexions et accès aux serveurs distants ainsi que de donner ou de retirer des droits aux autres administrateurs du bastion. L'administrateur "vieweradmin" quant à lui n'a qu'un droit de lecture des sessions du bastion, et ne pourra pas effectuer de modifications.
|
|
||||||
|
|
||||||
#### Ajout d'utilisateurs
|
#### Ajout d'utilisateurs
|
||||||
|
Les utilisateurs configurés sur le bastion peuvent être séparés en 2 types :
|
||||||
|
- Les utilisateurs clients du bastion
|
||||||
|
- Les utilisateurs internes du bastion
|
||||||
|
|
||||||
Les utilisateurs du bastion sont ceux faisant partie du groupe "**bastionuser**", et auront le menu du bastion affiché à chaque connexion au bastion. Ces derniers n'ont donc accès qu'à l'interface de sélection des serveurs.
|
Les utilisateurs clients du bastion sont ceux faisant partie du groupe "**bastionuser**", et auront le menu du bastion affiché lors de chaque connexion au bastion. Ces derniers ne peuvent pas se connecter au bastion directement et n'ont donc accès qu'à l'interface de sélection des serveurs.
|
||||||
|
|
||||||
***Toute modification du fichier "bastion_users.txt" nécessite un redémarrage du conteneur (ou bien une relance du script entrypoint.sh) pour être appliqués. Cela fait l'objet d'une prochaine mise à jour.***
|
Les utilisateurs internes du bastion quant à eux sont capables de se connecter au conteneur bastion directement. Ils ne font pas partie du groupe "**bastionuser**" et ne sont donc pas automatiquement redirigés vers le menu de sélection lors de la connexion (Ils peuvent cependant y accéder en lançant le script du menu).
|
||||||
|
|
||||||
Afin de rendre ce conteneur bastion stateless, il est fortement recommandé d'utiliser la fonctionnalité de création automatique des utilisateurs par fichier et dossier de configuration.
|
***Bien prendre en compte le fait que depuis la version 0.5.1, les utilisateurs marqués comme internes au bastion ont un accès sudo à la commande ttyplay et ls afin de permettre l'audit du bastion et des connexions effectuées.***
|
||||||
Pour cela, il faut modifier le fichier "**bastion_users.txt**" dans le répertoire "/root/scripts/users" en ajoutant une ligne correspondante à notre utilisateur.
|
|
||||||
|
***Toute modification des configurations utilisateur du bastion nécessite un redémarrage du conteneur (ou bien une relance du script entrypoint.sh), sauf dans le cas ou ces dernières sont effectuées dans le conteneur lui même par la commande usermod.***
|
||||||
|
|
||||||
|
***Ajouter les utilisateurs de connexion au fichier **authorized_servers.txt** ne suffit pas à les inscrire sur le bastion. Pour cela, il faut leur créer un compte, ce qui peut être fait de plusieurs manières, dont voici les 2 principales :***
|
||||||
|
|
||||||
|
##### Avec le répertoire de configuration des utilisateurs "**/root/scripts/users/**" et le fichier "**bastion_users.txt**".
|
||||||
|
Afin de rendre ce conteneur bastion "stateless", il est possible d'utiliser la fonctionnalité de création automatique des utilisateurs par fichier et dossier de configuration.
|
||||||
|
Pour cela, il faut placer un fichier nommé "**bastion_users.txt**" dans le répertoire "/root/scripts/users".
|
||||||
|
|
||||||
Ce fichier devra avoir la syntaxe suivante pour chacune de ses lignes :
|
Ce fichier devra avoir la syntaxe suivante pour chacune de ses lignes :
|
||||||
|
|
||||||
```text
|
```text
|
||||||
<Nom de l'utilisateur>;1;<hash du mot de passe>;<clé SSH>
|
<Nom utilisateur>;<type utilisateur>;<mot de passe>;<clé SSH>
|
||||||
```
|
```
|
||||||
|
|
||||||
Explication des valeurs possibles :
|
Explication des valeurs possibles :
|
||||||
|
- **<Nom utilisateur>** : Définit le nom de l'utilisateur. Ce dernier doit être entièrement en minuscules et peut contenir des carachtères alphanumériques.
|
||||||
|
- **<type utilisateur>** : Définit le type de l'utilisateur (si c'est un utilisateur interne ou client du bastion). La valeur 0 signifie que ce derneir sera interne au bastion tandis que la valeur 1 le placera dans le groupe des utilisateurs clients du bastion ("**bastionuser**").
|
||||||
|
- **<mot de passe>** : Champ pour entrer le mot de passe de l'utilisateur si il en a un. Il est possible de ne pas donner de mot de passe à l'utilisateur en mettant "0" à cet endroit.
|
||||||
|
- **<clé SSH>** : Définit si l'utilisateur aura une ou des clés SSH configurées ou non. Mettez la valeur à "1" si vous souhaitez que ce soit le cas, 0 si vous ne le voulez pas.
|
||||||
|
|
||||||
- **Nom de l'utilisateur** : Définit le nom de l'utilisateur. Ce dernier doit être entièrement en minuscules et peut contenir des carachtères alphanumériques.
|
|
||||||
- **1** : Permet de définir le compte comme étant celui d'un utilisateur.
|
|
||||||
- **hash du mot de passe** : Champ pour entrer le mot de passe de l'utilisateur au format hashé si il en a un. Il est possible de ne pas donner de mot de passe à l'utilisateur en mettant "0" à cet endroit. Dans ce cas le mot de passe ce cet utilisateur sera le nom de lui même (par exemple, l'utilisateur sans mot de passe "user1" aura de ce fait pour mot de passe "user1"). Pour obtenir le hash du mot de passe que vous souhaitez utiliser pour cet utilisateur, lancez la commande ci dessous dans un terminal sous Linux et utilisez son résultat EXACT comme valeur pour ce champ :
|
|
||||||
|
|
||||||
```bash
|
|
||||||
echo <mot de passe souhaité> | openssl passwd -6 -stdin
|
|
||||||
```
|
|
||||||
|
|
||||||
Cette commande est importante, le seul format étant accepté pour les hash étant "sha-256" par mesure de sécurité.
|
|
||||||
|
|
||||||
- **clé SSH** : Définit si l'utilisateur aura une ou des clés SSH configurées. Mettez la valeur à "1" si vous souhaitez que ce soit le cas, 0 si vous ne le voulez pas. Référez vous à la partie [Configuration de la connexion par clés SSH pour les utilisateurs et administrateurs](#configuration-de-la-connexion-par-clés-ssh-pour-les-utilisateurs-et-administrateurs) pour plus d'informations sur la configuration de cette méthode de connexion au bastion.
|
|
||||||
|
|
||||||
***Il est fortement recommandé de définir un mot de passe fort pour tout les utilisateurs du bastion, en particulier lorsque l'authentification par mots de passes est activée. Dans le cas contraire la sécurité de votre bastion pourrait être compromise.***
|
|
||||||
|
|
||||||
Ci-dessous un exemple de configuration possible d'une ligne du fichier "**bastion_users.txt**", avec un utilisateur "**user1**" ayant pour mot de passe "**user1**" (ici sous format hashé), étant un utilisateur interne du bastion, et ayant des clés SSH configurées :
|
|
||||||
|
|
||||||
|
Ci dessous un exemple de configuration possible, avec un utilisateur "**bastion**" ayant pour mot de passe "**bastion**", étant un utilisateur interne du bastion, et ayant des clés SSH configurées :
|
||||||
```text
|
```text
|
||||||
user1;1;$6$4XJH/NLhxwLk9YqD$2FmPFK7.rs7taM9VBLwoj6XQ32UJbN/R66Qi3PDLwgQ.3Aa5HZ8MNLU0TuiKLkeVMaZ.j1WpJ/DVlcBuNBzf3.;1
|
bastion;0;bastion;1
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Configuration de la connexion par clés SSH pour les utilisateurs et administrateurs
|
##### Par l'ajout des utilisateurs avec la commande adduser et usermod.
|
||||||
|
|
||||||
Les utilisateurs et administrateurs peuvent avoir des clés SSH de connexion configurées.
|
Exemple :
|
||||||
|
```bash
|
||||||
|
root@monosphere-bastion:/# adduser test
|
||||||
|
Adding user `test' ...
|
||||||
|
Adding new group `test' (1001) ...
|
||||||
|
Adding new user `test' (1001) with group `test' ...
|
||||||
|
Creating home directory `/home/test' ...
|
||||||
|
Copying files from `/etc/skel' ...
|
||||||
|
New password:
|
||||||
|
Retype new password:
|
||||||
|
passwd: password updated successfully
|
||||||
|
Changing the user information for test
|
||||||
|
Enter the new value, or press ENTER for the default
|
||||||
|
Full Name []:
|
||||||
|
Room Number []:
|
||||||
|
Work Phone []:
|
||||||
|
Home Phone []:
|
||||||
|
Other []:
|
||||||
|
Is the information correct? [Y/n] Y
|
||||||
|
```
|
||||||
|
La commande ci dessus a bien ajouté un utilisateur "test" avec le mot de passe qui lui a été défini lors des questions de cette commande.
|
||||||
|
|
||||||
Par le terme "clés SSH" il est sous entendu qu'ils peuvent avoir un fichier "authorized_keys" contenant les clés publiques des futurs clients cherchant à se connecter au bastion sur le dit compte.
|
Puis, si vous souhaitez que ce dernier soit limité à l'accès au serveur distant et non au bastion lui même ajoutez cet utilisateur au groupe "bastionuser" avec la commande usermod.
|
||||||
|
|
||||||
Pour configurer cela, il suffit de placer dans le répertoire "**/root/scripts/users**" (monté dans un volume) un dossier ayant un nom correspondant au compte auquel il est rattaché et contenant les fichiers du répertoire "**.ssh**" de ce dernier.
|
Exemple :
|
||||||
|
```
|
||||||
|
root@monosphere-bastion:/# usermod -aG bastionuser test
|
||||||
|
```
|
||||||
|
|
||||||
Lors du process de déploiement, le contenu de ce répertoire sera copié dans le répertoire "home" de l'utilisateur ou administrateur du bastion et sera utilisé par la suite pour les connexions des clients à ce compte.
|
Cet utilisateur pourra désormais ce connecter au bastion.
|
||||||
|
A noter qu'un utilisateur créé avec cette méthode ne sera pas sauvegardé dans les configurations du bastion et ne persistera de ce fait pas entre les redéploiements.
|
||||||
|
|
||||||
***A noter que pour que cela soit effectif, la connexion par clés SSH doit être autorisée au niveau de la variable "KEY_AUTH", dont la valeur doit être de 1.***
|
##### Les clés SSH
|
||||||
|
|
||||||
#### Ajout de serveurs distants dans la configuration
|
Les utilisateurs peuvent avoir des clés SSH de connexion configurées.
|
||||||
|
|
||||||
Contrairement aux comptes du bastion, il n'est pas nécessaire d'ajouter plus de configurations que ce qui est décrit dans la partie [Configuration des accès aux hotes distants](#configuration-des-accès-aux-hotes-distants) pour les hôtes de destination.
|
Par le terme "clés SSH" il est sous entendu qu'ils peuvent avoir un fichier "authorized_keys" contenant les clés publiques des futurs clients cherchant à se connecter au bastion sur le dit utilisateur.
|
||||||
|
|
||||||
Cependant, il est tout de même plus intéressant de mettre en place des clés ssh ou mots de passes pré-renseignés, car ces derniers permettent une connexion automatique lors de la séléction du serveur dans le menu du bastion. Sans cela, il vous sera demandé d'entrer le mot de passe du compte distant à chaque tentative de connexion.
|
Pour configurer cela, il suffit de placer dans le répertoire "**/root/scripts/users**" un dossier ayant un nom correspondant avec l'utilisateur auquel il est rattaché et contenant les fichiers du répertoire "**.ssh**" de cet utilisateur.
|
||||||
|
|
||||||
Pour générer une clé SSH utilisable pour cette situation, il est recommandé d'utiliser la commande ci dessous (en l'adaptant à votre besoin) :
|
Lors du process de déploiement, le contenu de ce répertoire sera copié dans le répertoire "home" de l'utilisateur du bastion, et sera utilisé par la suite pour les connexions des clients au bastion.
|
||||||
|
|
||||||
|
#### Ajout de serveurs
|
||||||
|
Contrairement aux utilisateurs, il n'est pas nécessaire d'ajouter plus de configurations pour les serveurs de destination.
|
||||||
|
|
||||||
|
Cependant, il est tout de même plus intéressant de mettre en place des clés ssh, car ces dernières permettent une connexion automatique lors de la séléction du serveur dans le menu du bastion. Sans cela, il vous sera demandé d'entrer le mot de passe du compte distant à chaque tentative de connexion.
|
||||||
|
|
||||||
|
Pour générer une clé SSH utilisable pour ce cas, vous pouvez executer la commande ci dessous (en l'adaptant à votre situation) :
|
||||||
```text
|
```text
|
||||||
test@root:~/.ssh$ ssh-keygen -t ed25519
|
test@monosphere-bastion:~/.ssh$ ssh-keygen -t ed25519
|
||||||
Generating public/private ed25519 key pair.
|
Generating public/private ed25519 key pair.
|
||||||
Enter file in which to save the key (/root/.ssh/id_ed25519):
|
Enter file in which to save the key (/root/.ssh/id_ed25519):
|
||||||
Enter passphrase (empty for no passphrase):
|
Enter passphrase (empty for no passphrase):
|
||||||
@ -342,151 +337,17 @@ The key's randomart image is:
|
|||||||
|
|
||||||
Le type de clé recommandé est le "ed25519", mais pour la connexion aux serveurs distants le bastion en lui même n'a pas de restrictions particulières.
|
Le type de clé recommandé est le "ed25519", mais pour la connexion aux serveurs distants le bastion en lui même n'a pas de restrictions particulières.
|
||||||
|
|
||||||
Il vous suffira ensuite d'exécuter la commande **ssh-copy-id utilisateur_distant@ip_serveur_distant** pour transférer la clé publique vers le serveur distant, puis placer le fichier de la clé privée dans le répertoire **/opt/public/servers/** (monté en volume dans le conteneur du bastion).
|
Il vous suffira ensuite d'executer la commande **ssh-copy-id test@ip_serveur_distant** pour transférer la clé publique vers le serveur distant, puis placer le fichier de la clé privée dans le répertoire **/opt/public/servers/** et adapter le ficheir de configuration des connexion distantes "**authorized_servers.txt**" en y ajoutant à la suite des utilisateurs autorisés le nom de la clé privée de connexion ainsi créé.
|
||||||
Enfin, adaptez le fichier de configuration des connexion distantes "**authorized_servers.txt**" en y ajoutant, à la suite des utilisateurs autorisés, le nom de la clé privée de connexion ainsi créé et en précisant la méthode d'authentification en tant que "key".
|
|
||||||
|
|
||||||
Cette dernière sera désormais utilisée par les utilisateurs du bastion inscrits sur la même ligne du fichier "**authorized_servers.txt**" afin de se connecter au serveur et utilisateur distant référencé.
|
***Contrairement aux modifications sur les utilisateurs, il n'est pas nécessaire de redéployer le conteneur du bastion pour les modifications concernant les serveurs.***
|
||||||
|
|
||||||
***Contrairement aux modifications sur les comptes du bastion, il n'est pas nécessaire de redéployer le conteneur du bastion pour les modifications concernant les serveurs distants et leurs accès.***
|
#### Audit des sessions
|
||||||
|
Avec l'intégration de ttyrec (version de OVH compilée depuis le repository git : https://github.com/ovh/ovh-ttyrec), il est désormais possible pour les utilisateurs internes du bastion de visionner les sessions de connexion des utilisateurs.
|
||||||
|
|
||||||
#### Configuration des accès aux hotes distants
|
Pour ce faire, dconnectez vous avec un utilisateur configuré plus haut comme étant interne au bastion :
|
||||||
|
|
||||||
Pour définir les utilisateurs autorisés et les serveurs auxquels ils peuvent se connecter, modifiez le fichier **authorized_servers.txt** dans le répertoire **/opt/public/servers/**.
|
|
||||||
|
|
||||||
Les administrateurs du bastion ayant le droit "serverscontrol_admins" peuvent modifier la configuration des accès sur un bastion en fonctionnement, mais il est également possible de configurer ces derniers avant de déployer le bastion.
|
|
||||||
|
|
||||||
Chaque ligne doit contenir l'adresse IP du serveur, le port, le nom personnalisé du server, le nom d'utilisateur de connexion et le ou les noms d'utilisateurs du bastion, comme dans l'exemple ci dessous :
|
|
||||||
|
|
||||||
```txt
|
|
||||||
192.168.1.10 22 server1 server_user1 user1,user2 key privkey1
|
|
||||||
192.168.1.11 23 server2 server_user2 user1,admin password pass_server2
|
|
||||||
192.168.1.12 2222 server3 server_user3 user2
|
|
||||||
```
|
```
|
||||||
|
root@Example:~# ssh -p 2336 -i /root/.ssh/id_ed25519 bastion@bastion.example.com
|
||||||
|
|
||||||
L'indication de la méthode d'authentification (password/key) n'est pas obligatoire mais fortement recommandée.
|
|
||||||
Par défaut, si aucune option d'authentification n'est configurée, le mot de passe de l'hôte distant sera demandé à l'utilisateur.
|
|
||||||
|
|
||||||
Explication de la construction des lignes du fichier:
|
|
||||||
|
|
||||||
```txt
|
|
||||||
[Adresse_IP] [Port] [Nom_du_serveur/Hostname] [Nom_de_utilisateur_de_connexion] [Usilisateurs_autorisés] [Type_authentification] [Fichier_a_utiliser]
|
|
||||||
```
|
|
||||||
|
|
||||||
Concernant la méthode d'authentification, deux options sont possibles :
|
|
||||||
|
|
||||||
- key : Précise au bastion que l'authentification sur l'hôte distant devra se faire au moyen d'une clé privée SSH précisée dans le fichier indiqué dans l'argument suivant.
|
|
||||||
- password : Précise au bastion que l'authentification sur l'hôte distant devra se faire au moyen d'un mot de passe inscrit dans le fichier indiqué dans l'argument suivant.
|
|
||||||
|
|
||||||
L'argument "Fichier_a_utiliser" indique de ce fait le nom du fichier situé dans le répertoire **/opt/public/servers/** (même répertoire que le script du menu d'authentification) contenant le secret à utiliser pour l'authentification dépendant de la méthode choisie.
|
|
||||||
|
|
||||||
A noter que si la méthode par mot de passe est sélectionnée, Le fichier indiqué devra contenir uniquement le mot de passe, en première ligne du fichier, sans aucune autre ligne complémentaire.
|
|
||||||
|
|
||||||
Comme montré dans l'exemple ci-dessus, il est possible de mettre plusieurs noms d'utilisateurs (ou d'administrateurs) sur un seul et même serveur, dans le cas où plusieurs utilisateurs sont autorisés à se connecter sur la machine distante et sur le même utilisateur distant, avec la même méthode d'authentification.
|
|
||||||
Ces noms d'utilisateurs du bastion doivent bien être séparés par des virgules.
|
|
||||||
|
|
||||||
Si vous souhaitez vous connecter sur la même machine distante mais avec un utilisateur distant différent (ou une méthode d'authentification différente), créez dans ce cas une nouvelle ligne le référençant. L'ajout de plusieurs noms d'utilisateurs distants sur une seule et même ligne de configuration n'est pas supporté.
|
|
||||||
|
|
||||||
A savoir qu'il est également possible d'utiliser des noms de domaine DNS à la place d'une adresse IP, mais prenez en compte le fait que la résolution de nom se fera au niveau du bastion et non du client.
|
|
||||||
|
|
||||||
### Transfert de fichiers (non-interactif)
|
|
||||||
|
|
||||||
Depuis la version 3.5.0, le bastion Monosphere supporte le transfert de fichiers vers les serveurs distants via des commandes SSH non-interactives. Aucun menu interactif n'est nécessaire, le transfert s'effectue directement depuis votre machine en une seule commande.
|
|
||||||
|
|
||||||
#### Prérequis
|
|
||||||
|
|
||||||
- Vous devez être autorisé à vous connecter au serveur distant (présent dans `authorized_servers.txt`).
|
|
||||||
- Vous devez avoir les droits de transfert pour ce serveur (configurés dans `transfer_rights.txt`, ou fichier absent = autorisé).
|
|
||||||
- Le bastion doit avoir accès au serveur distant (clé SSH ou mot de passe préconfiguré dans `authorized_servers.txt`).
|
|
||||||
|
|
||||||
#### Push — Envoyer un fichier vers un serveur distant
|
|
||||||
|
|
||||||
Depuis votre machine locale, envoyez un fichier directement vers un serveur distant à travers le bastion :
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cat application.conf | ssh bastion_admin@bastion 'push_file serveur-prod /etc/app/application.conf'
|
|
||||||
```
|
|
||||||
|
|
||||||
Le fichier est transféré en une étape : il traverse le bastion et atterrit directement sur le serveur cible. Aucun stockage temporaire sur le bastion.
|
|
||||||
|
|
||||||
**Exemple concret :** Envoyer une archive de backup :
|
|
||||||
```bash
|
|
||||||
tar czf - /home/user/documents | ssh admin@bastion 'push_file serveur-backup /backups/documents-$(date +%F).tar.gz'
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Pull — Récupérer un fichier depuis un serveur distant
|
|
||||||
|
|
||||||
```bash
|
|
||||||
ssh bastion_admin@bastion 'retrieve_file serveur-prod /var/log/app/error.log' > error.log
|
|
||||||
```
|
|
||||||
|
|
||||||
Le fichier est lu depuis le serveur distant et écrit sur stdout. Redirigez-le vers un fichier local.
|
|
||||||
|
|
||||||
**Exemple concret :** Récupérer plusieurs fichiers en une passe :
|
|
||||||
```bash
|
|
||||||
for f in access.log error.log audit.log; do
|
|
||||||
ssh admin@bastion "retrieve_file serveur-prod /var/log/nginx/\$f" > "./logs/\$f"
|
|
||||||
done
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Journalisation
|
|
||||||
|
|
||||||
Tous les transferts (push, retrieve) sont horodatés et journalisés dans `/var/log/monosphere/transfers.log` avec l'utilisateur, le serveur cible, le fichier, la taille et le statut. Les administrateurs peuvent consulter ces logs depuis le menu admin (option `logs`).
|
|
||||||
|
|
||||||
### Scripts personnalisés
|
|
||||||
|
|
||||||
Vous pouvez ajouter des scripts personnalisés qui seront exécutés au démarrage du conteneur. Placez vos scripts dans le répertoire **/opt/custom/scripts/**.
|
|
||||||
|
|
||||||
Les droits sur ces derniers sont automatiquement mis à jour lors du déploiement du conteneur.
|
|
||||||
|
|
||||||
### Configuration SSH
|
|
||||||
|
|
||||||
La configuration du serveur SSH est définie dans le fichier **sshd_config**. Vous pouvez personnaliser cette configuration en modifiant ce fichier. N'oubliez pas que certaines options sont spécifiques au bastion et ne doivent pas être modifiées sans une bonne raison.
|
|
||||||
|
|
||||||
Ses options incluent notamment le bloc de configurations ci dessous, gérant le comportement du bastion lors des connexions d'utilisateurs :
|
|
||||||
|
|
||||||
```text
|
|
||||||
[...]
|
|
||||||
#Per user basis settings
|
|
||||||
AllowStreamLocalForwarding no
|
|
||||||
Match Group bastionuser
|
|
||||||
ForceCommand /opt/public/scripts/server_menu.sh
|
|
||||||
X11Forwarding no
|
|
||||||
Match Group bastionadmin
|
|
||||||
ForceCommand /opt/public/scripts/admin_menu.sh
|
|
||||||
X11Forwarding no
|
|
||||||
# End the 'Match' block
|
|
||||||
Match all
|
|
||||||
ForceCommand echo -e "===========================================================\nSorry, you re not part of the bastion s users or administrators and have therefore no access.\nPlease contact your administrator for further informations.\n==========================================================="; exit
|
|
||||||
X11Forwarding no
|
|
||||||
[...]
|
|
||||||
```
|
|
||||||
|
|
||||||
Ne modifiez jamais ces paramètres cela pourrait provoquer des problèmes de sécurité ainsi que de droits d'accès.
|
|
||||||
|
|
||||||
### Fichiers
|
|
||||||
|
|
||||||
- **admin_menu.sh** : Script permettant aux administrateurs d'exercer leurs droits au travers d'un menu controllé en fonction de leurs autorisations sur le bastion.
|
|
||||||
- **admin_rights.txt** : Liste des droits administratifs sur le bastion et ses ressources, exclusive aux administraturs du bastion.
|
|
||||||
- **transfer_rights.txt** : Liste des droits de transfert de fichiers par serveur, permettant de controler quels utilisateurs peuvent transferer des fichiers vers quels serveurs distants.
|
|
||||||
- **authorized_servers.txt** : Liste des utilisateurs autorisés et des serveurs correspondants.
|
|
||||||
- **bastion_users.txt** : Liste servant à générer les utilisateurs et administrateurs du bastion et contenant leurs paramètres de création.
|
|
||||||
- **Dockerfile** : Le fichier Dockerfile pour construire l'image Monosphere Bastion.
|
|
||||||
- **entrypoint.sh** : Le script d'entrée qui configure et démarre les services nécessaires.
|
|
||||||
- **monosphere_banner.txt** : Bannière affichée par Monosphere lors de la connexion SSH.
|
|
||||||
- **server_menu.sh** : Le script principal du bastion qui génère le menu de sélection des serveurs de connexion pour les utilisateurs autorisés.
|
|
||||||
- **sshd_config** : Le fichier de configuration du serveur SSH.
|
|
||||||
|
|
||||||
## Administration du bastion
|
|
||||||
|
|
||||||
### Audit des sessions
|
|
||||||
|
|
||||||
Avec l'intégration de ttyrec (version de OVH compilée depuis le repository git : <https://github.com/ovh/ovh-ttyrec>), il est possible pour les utilisateurs administrateurs du bastion de visionner les sessions de connexion des utilisateurs.
|
|
||||||
|
|
||||||
Pour que les administrateurs puissent consulter les sessions, il faut que le droit "sessionswatch_admins" leur soit attribué. Consultez la partie [Ajout d'administrateurs](#ajout-dadministrateurs) pour plus d'informations.
|
|
||||||
|
|
||||||
Afin de consulter les sessions des utilisateurs, connectez vous au bastion en tant qu'administrateur ayant le droit approprié et sélectionnez l'option **"Visionnage_des_sessions_du_bastion"** :
|
|
||||||
|
|
||||||
```text
|
|
||||||
@@@@@@@@@@[Welcome to the Monosphere bastion]@@@@@@@@@@
|
@@@@@@@@@@[Welcome to the Monosphere bastion]@@@@@@@@@@
|
||||||
Authorized personnel only is allowed to come here.
|
Authorized personnel only is allowed to come here.
|
||||||
If you're not authorized personnel, please disconnect
|
If you're not authorized personnel, please disconnect
|
||||||
@ -497,187 +358,73 @@ Monosphere is logging the current connection.
|
|||||||
|
|
||||||
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||||
|
|
||||||
Monosphere version is 2.0.5 Alpha
|
Monosphere version is 0.5.1 Alpha
|
||||||
Veuillez sélectionner une option d'administration :
|
Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 5.15.0-105-generic x86_64)
|
||||||
1) Visionnage_des_sessions_du_bastion
|
|
||||||
2) Administration_des_acces_serveurs
|
* Documentation: https://help.ubuntu.com
|
||||||
3) Tapez 'servers_access' ou 3 pour vous connecter a un serveur.
|
* Management: https://landscape.canonical.com
|
||||||
4) Tapez 'quit' ou 4 pour vous déconnecter.
|
* Support: https://ubuntu.com/pro
|
||||||
Votre choix (1-4): 1
|
|
||||||
|
This system has been minimized by removing packages and content that are
|
||||||
|
not required on a system that users do not log into.
|
||||||
|
|
||||||
|
To restore this content, you can run the 'unminimize' command.
|
||||||
|
Last login: Sat Jun 15 23:17:56 2024 from 192.168.1.254
|
||||||
|
foret@test-monosphere-bastion:~$
|
||||||
```
|
```
|
||||||
|
|
||||||
Ensuite, sélectionnez l'utilisateur pour lequel vous souhaitez auditer la session :
|
Ensuite, effectuez la commande "sudo ls /home/" afin de lister les dossiers des utilisateurs du bastion, puis "sudo ls /home/<utilisateur à auditer>/" afin de lister toutes les sessions enregistrées par ttyrec pour cet utilisateur.
|
||||||
|
|
||||||
```text
|
|
||||||
Ci dessous les utilisateurs disponibles sur le bastion.
|
|
||||||
Veillez sélectionner celui dont vous souhaitez visionner les accès :
|
|
||||||
1) bastion
|
|
||||||
2) siphonight
|
|
||||||
3) Tapez 'quit' ou 3 pour revenir au menu précédent.
|
|
||||||
Votre choix (1-3): 2
|
|
||||||
```
|
|
||||||
|
|
||||||
Vous serez amené vers une liste des sessions enregistrées de l'utilisateur sélectionné.
|
|
||||||
|
|
||||||
Le nom des sessions suite une nomenclature telle que :
|
Le nom des sessions suite une nomenclature telle que :
|
||||||
|
[date au format ANNEE-MOIS-JOUR.HEURE-MINUTE-SECONDE].[NUMERO IDENTIFIANT LA SESSION].--[ADRESSE IP DU SERVEUR DE CONNEXION]-[UTILISATEUR DE LA CONNEXION DISTANTE]--.ttyrec
|
||||||
|
|
||||||
```text
|
Et enfin, entrez la commande "sudo ttyplay /home/<utilisateur à auditer>/<identification de la session à visionner>.ttyrec" pour voir la session de cet utilisateur.
|
||||||
[ANNEE-MOIS-JOUR].[HEURE-MINUTE-SECONDE].[NUMERO IDENTIFIANT LA SESSION].--[ADRESSE IP DU SERVEUR DE CONNEXION]-[UTILISATEUR DE LA CONNEXION DISTANTE]--.ttyrec
|
|
||||||
|
Ci dessous un exemple de l'utilisation de ces commandes :
|
||||||
```
|
```
|
||||||
|
foret@test-monosphere-bastion:~$ sudo ls /home/
|
||||||
Enfin, sélectionnez la session que vous souhaitez visionner par son numéro indiqué :
|
foret foxy doliprane siphonight
|
||||||
|
foret@test-monosphere-bastion:~$ sudo ls /home/siphonight/
|
||||||
```text
|
2024-06-15.23-55-49.312745.--192.168.1.7-siphonight--.ttyrec
|
||||||
Sélectionnez une session de cet utilisateur que vous souhaitez visionner :
|
foret@test-monosphere-bastion:~$ sudo ttyplay /home/siphonight/2024-06-15.23-55-49.312745.--192.168.1.7-siphonight--.ttyrec
|
||||||
1) 2025-01-18.20-29-26.126316.--test-container1-siphonight--.ttyrec
|
|
||||||
2) 2025-01-19.07-16-58.318869.--sysbox-test-03-siphonight--.ttyrec
|
|
||||||
3) 2025-01-19.07-39-09.070910.--sysbox-test-03-siphonight--.ttyrec
|
|
||||||
4) 2025-01-19.08-01-48.690401.--sysbox-test-03-siphonight--.ttyrec
|
|
||||||
5) 2025-01-19.14-14-25.806138.--sysbox-test-01-siphonight--.ttyrec
|
|
||||||
6) 2025-01-19.14-14-45.815983.--test-container3-siphonight--.ttyrec
|
|
||||||
7) 2025-01-20.13-46-09.384995.--sysbox-test-03-siphonight--.ttyrec
|
|
||||||
8) 2025-01-20.15-33-17.054422.--sysbox-test-03-siphonight--.ttyrec
|
|
||||||
9) 2025-01-20.18-10-51.315600.--sysbox-test-03-siphonight--.ttyrec
|
|
||||||
10) 2025-01-20.18-44-53.584960.--sysbox-test-03-siphonight--.ttyrec
|
|
||||||
11) 2025-01-20.20-18-16.968148.--sysbox-test-03-siphonight--.ttyrec
|
|
||||||
12) 2025-01-20.20-31-27.717670.--sysbox-test-03-siphonight--.ttyrec
|
|
||||||
13) 2025-01-20.20-46-23.355923.--sysbox-test-03-siphonight--.ttyrec
|
|
||||||
14) 2025-01-20.21-28-25.433739.--test-bastion-2-bastion--.ttyrec
|
|
||||||
15) 2025-01-20.21-28-33.026137.--sysbox-test-03-siphonight--.ttyrec
|
|
||||||
16) Tapez 'quit' ou 16 pour vous revenir au choix d'utilisateur.
|
|
||||||
Votre choix (1-16): 11
|
|
||||||
```
|
|
||||||
|
|
||||||
Le visionnage des sessions "tant effectué avec ttyrec, les controles possibles avec cet outils le sont également dans ce cas.
|
|
||||||
|
|
||||||
Ci dessous les controles les plus courants :
|
|
||||||
|
|
||||||
- **+** : Accélerer le déroulement de la session.
|
|
||||||
- **-** : Ralentir le déroulement de la session.
|
|
||||||
|
|
||||||
### Modification des accès aux hotes distants
|
|
||||||
|
|
||||||
Afin de modifier les accès aux serveurs distants sur un bastion en fonctionnement, il faut se connecter avec un administrateur disposant de la permission "serverscontrol_admins".
|
|
||||||
|
|
||||||
Une fois connecté, sélectionnez l'option "Administration_des_acces_serveurs" :
|
|
||||||
|
|
||||||
```text
|
|
||||||
@@@@@@@@@@[Welcome to the Monosphere bastion]@@@@@@@@@@
|
|
||||||
Authorized personnel only is allowed to come here.
|
|
||||||
If you're not authorized personnel, please disconnect
|
|
||||||
from this interface this instant.
|
|
||||||
|
|
||||||
-------------------------------------------------------
|
|
||||||
Monosphere is logging the current connection.
|
|
||||||
|
|
||||||
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
||||||
|
|
||||||
Monosphere version is 2.1.6 Alpha
|
|
||||||
Veuillez sélectionner une option d'administration :
|
|
||||||
1) Visionnage_des_sessions_du_bastion
|
|
||||||
2) Administration_des_acces_serveurs
|
|
||||||
3) Administration_des_privileges
|
|
||||||
4) Tapez 'servers_access' ou 4 pour vous connecter a un serveur.
|
|
||||||
5) Tapez 'quit' ou 5 pour vous déconnecter.
|
|
||||||
Votre choix (1-5): 2
|
|
||||||
```
|
|
||||||
|
|
||||||
Puis, sélectionnez l'option "Modification des droits d'accès aux serveurs." :
|
|
||||||
|
|
||||||
```text
|
|
||||||
Choisissez une option d'administration des serveurs ci dessous :
|
|
||||||
1) Ajout de fichiers clés privées/mots de passes pour l'authentification aux serveurs distants.
|
|
||||||
2) Modification des droits d'accès aux serveurs.
|
|
||||||
3) Tapez 'quit' ou 3 pour revenir au menu précédent.
|
|
||||||
Votre choix (1-3): 2
|
|
||||||
```
|
|
||||||
|
|
||||||
Vous entrerez alors en mode édition au travers de nano du fichier "**authorized_servers.txt**" et pourrez alors ajuster la configuration des accès.
|
|
||||||
|
|
||||||
Veuillez à ce que ce fichier ne comporte pas d'erreurs, ce dernier étant appliqué dès l'instant ou la modification est achevée.
|
|
||||||
|
|
||||||
Référez vous à la partie [Configuration des accès aux hotes distants](#configuration-des-accès-aux-hotes-distants) pour plus d'informations.
|
|
||||||
|
|
||||||
### Modification des privilèges d'administration
|
|
||||||
|
|
||||||
Afin de modifier les privilèges des administrateurs du bastion en cours de fonctionnement, il faut se connecter avec un administrateur disposant de la permission "adminscontrol_admins".
|
|
||||||
|
|
||||||
Une fois connecté, sélectionnez l'option "Administration_des_privileges" :
|
|
||||||
|
|
||||||
```text
|
|
||||||
@@@@@@@@@@[Welcome to the Monosphere bastion]@@@@@@@@@@
|
|
||||||
Authorized personnel only is allowed to come here.
|
|
||||||
If you're not authorized personnel, please disconnect
|
|
||||||
from this interface this instant.
|
|
||||||
|
|
||||||
-------------------------------------------------------
|
|
||||||
Monosphere is logging the current connection.
|
|
||||||
|
|
||||||
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
||||||
|
|
||||||
Monosphere version is 2.1.6 Alpha
|
|
||||||
Veuillez sélectionner une option d'administration :
|
|
||||||
1) Visionnage_des_sessions_du_bastion
|
|
||||||
2) Administration_des_acces_serveurs
|
|
||||||
3) Administration_des_privileges
|
|
||||||
4) Tapez 'servers_access' ou 4 pour vous connecter a un serveur.
|
|
||||||
5) Tapez 'quit' ou 5 pour vous déconnecter.
|
|
||||||
Votre choix (1-5): 3
|
|
||||||
```
|
|
||||||
|
|
||||||
Vous entrerez alors en mode édition au travers de nano du fichier "**admin_rights.txt**" et pourrez alors ajuster la configuration des droits d'administration sur le bastion.
|
|
||||||
|
|
||||||
Veuillez à ce que ce fichier ne comporte pas d'erreurs, ce dernier étant appliqué dès l'instant ou la modification est achevée.
|
|
||||||
|
|
||||||
Référez vous à la partie [Ajout d'administrateurs](#ajout-dadministrateurs) pour plus d'informations.
|
|
||||||
|
|
||||||
### Gestion des droits de transfert
|
|
||||||
|
|
||||||
Depuis la version 3.5.0, il est possible de controler quels utilisateurs peuvent transferer des fichiers vers quels serveurs distants.
|
|
||||||
|
|
||||||
Pour modifier ces droits, connectez-vous avec un administrateur disposant de la permission "transfercontrol_admins" et sélectionnez l'option "Gestion_des_droits_de_transfert" :
|
|
||||||
|
|
||||||
```text
|
|
||||||
@@@@@@@@@@[Welcome to the Monosphere bastion]@@@@@@@@@@
|
|
||||||
[...]
|
[...]
|
||||||
Veuillez sélectionner une option d'administration :
|
|
||||||
1) Gestion_des_droits_de_transfert
|
|
||||||
2) ...
|
|
||||||
Votre choix (1-X): 1
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Le fichier `transfer_rights.txt` se trouve dans `/opt/public/rights/`. Son format est le suivant :
|
### Scripts personnalisés
|
||||||
|
Vous pouvez ajouter des scripts personnalisés qui seront exécutés au démarrage du conteneur. Placez vos scripts dans le répertoire **/opt/custom/scripts/** et assurez-vous qu'ils ont les permissions d'exécution appropriées.
|
||||||
|
|
||||||
```text
|
|
||||||
# Format: nom_serveur user1,user2,...
|
### Configuration SSH
|
||||||
# Les utilisateurs listés peuvent transferer des fichiers vers ces serveurs.
|
La configuration du serveur SSH est définie dans le fichier **sshd_config**. Vous pouvez personnaliser cette configuration en modifiant ce fichier. N'oubliez pas que certaines options sont spécifiques au bastion et ne doivent pas être modifiées sans une bonne raison.
|
||||||
serveur1 alice,bob
|
|
||||||
serveur2 *
|
|
||||||
|
### Fichiers
|
||||||
|
- **Dockerfile** : Le fichier Dockerfile pour construire l'image Monosphere Bastion.
|
||||||
|
- **sshd_config** : Le fichier de configuration du serveur SSH.
|
||||||
|
- **server_menu.sh** : Le script principal du bastion qui génère le menu de sélection du serveur pour les utilisateurs autorisés.
|
||||||
|
- **authorized_servers.txt** : Liste des serveurs autorisés et des serveurs correspondants.
|
||||||
|
- **bastion_users.txt** : Liste servant à créér les utilisateurs du bastion et contenant leurs paramètres de création.
|
||||||
|
- **monosphere_banner.txt** : Bannière affichée par Monosphere lors de la connexion SSH.
|
||||||
|
- **ssh-launcher.sh** : Script exécuté toutes les 5 minutes servant à redémarrer le service ssh en cas de plantage.
|
||||||
|
- **entrypoint.sh** : Le script d'entrée qui configure et démarre les services nécessaires.
|
||||||
|
|
||||||
|
|
||||||
|
## Sécurisation
|
||||||
|
Bien que la configuration de base de Monosphere soit satisfaisante pour la plupart des cas d'utilisation, il est important de noter que des équipements critiques peuvent nécessiter plus d'attention.
|
||||||
|
|
||||||
|
Il est alors possible de renforcer la sécurité de la connexion au bastion et en dehors de plusieurs manières :
|
||||||
|
- Désactiver l'utilisation de l'authentification par mots de passes, et passer par un système de clés SSH uniquement. Exemple de modifications dans le fichier **sshd_config** :
|
||||||
|
```bash
|
||||||
|
PubkeyAuthentication yes
|
||||||
|
[...]
|
||||||
|
PasswordAuthentication no
|
||||||
```
|
```
|
||||||
|
- Limiter les ports de connexion vers les serveurs distants. Exemple avec une limitation sur le port 22 uniquement :
|
||||||
|
```bash
|
||||||
|
PermitOpen *:22
|
||||||
|
```
|
||||||
|
- Protéger l'accès au bastion par un VPN (WireGuard, OpenVPN...).
|
||||||
|
|
||||||
- Si le fichier est vide ou absent, **tous les utilisateurs** autorisés (via `authorized_servers.txt`) peuvent transferer des fichiers (comportement par défaut).
|
|
||||||
- Le caractère `*` permet d'autoriser **tous les utilisateurs** pour un serveur donné.
|
|
||||||
- Les modifications sont appliquées en temps réel, sans redémarrage du conteneur.
|
|
||||||
|
|
||||||
### Codes d'erreurs lors du lancement du bastion
|
|
||||||
|
|
||||||
Si lors du déploiement du bastion vous obtenez des messages indiquant "[ NOOK ] Code XX", veuillez consulter cette section, elle détaille la signification de chacun d'entre eux.
|
|
||||||
|
|
||||||
| **Code d'erreur** | *Description* |
|
|
||||||
|---|---|
|
|
||||||
| Code 01 | Erreur concernant le hash du mot de passe entré dans le fichier de configuration des utilisateurs **"bastion_users.txt"** pour l'utilisateur mentionné. Ce dernier DOIT OBLIGATOIREMENT être un hash du mot de passe au format sha-256, et non le mot de passe en clair, pour des raisons de sécurité. Une autre valeur possible est 0, dans le cas ou vous ne souhaitez pas configurer de mot de passe fort, dans quel cas ce dernier sera défini comme similaire au nom d'utilisateur. Consultez la section [Configuration des utilisateurs, administrateurs et serveurs](#configuration-des-utilisateurs-administrateurs-et-serveurs) pour p lus d'informations. |
|
|
||||||
| Code 02 | Ce code d'erreur indique que les scripts personnalisés ont rencontré une erreur lors de leur exécution. Cette erreur est normale dans le cas ou vous n'avez aucun script personnalisé, et elle peut de ce fait être ignorée. Dans le cas contraire, assurez vous que vos scripts soient corrects et à jour par rapport à la version actuellement utilisée du bastion, ainsi que de leurs bon fonctionnement dans le contexte du lancement de ce dernier. |
|
|
||||||
| Code 03 | Le fichier de configuration sensé se trouver dans le répertoire **"/root/scripts/users/bastion_users.txt"** du conteneur du bastion est abscent. Cela signifie généralement qu'un point de montage dans ce répertoire est mal configuré, car dans le cas ou rien n'est configuré pour ce répertoire, la configuration par défaut prendrait sa place et l'erreur n'apparaitrait pas. Vérifiez vos points de montages impactant le répertoire **"/root/scripts/users"** du bastion, ainsi que la présente du fichier **"bastion_users.txt"** dans ces derniers. |
|
|
||||||
| Code 04 | Lors de l'injection du hash de mot de passe dans la configuration /etc/shadow du bastion. Lors de la génération du bastion, les hash des mots de passes sont tous injectés tels quels dans le fichier /etc/shadow du bastion. Si cette opération échoue, vérifiez les messages venant du système dans les journeaux du conteneur. |
|
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Ce projet est publié sous la licence "Faites ce que vous souhaitez".
|
Ce projet est publié sous la licence "Faites ce que vous souhaitez".
|
||||||
|
|
||||||
## Remerciements
|
|
||||||
|
|
||||||
- Ouafax
|
|
||||||
- KIT!
|
|
||||||
- neutaaaaan
|
|
||||||
- Amadeus
|
|
||||||
- KuroSaru
|
|
||||||
|
|||||||
333
admin_menu.sh
333
admin_menu.sh
@ -1,333 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
if [[ -n ${SSH_ORIGINAL_COMMAND} ]]; then
|
|
||||||
bash /opt/public/scripts/server_menu.sh
|
|
||||||
exit $?
|
|
||||||
fi
|
|
||||||
|
|
||||||
function secure_file_editor() {
|
|
||||||
local file_path="${*}"
|
|
||||||
local -a lines=()
|
|
||||||
local cmd rest line_num new_content modified=0
|
|
||||||
|
|
||||||
if [[ -f ${file_path} ]]; then
|
|
||||||
while IFS= read -r line; do
|
|
||||||
lines+=("${line}")
|
|
||||||
done < "${file_path}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "===== SECURE FILE EDITOR ====="
|
|
||||||
echo "Fichier : ${file_path}"
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
set +H
|
|
||||||
while true; do
|
|
||||||
echo "--- Lignes ${#lines[@]} ---"
|
|
||||||
if [[ ${#lines[@]} -eq 0 ]]; then
|
|
||||||
echo "(fichier vide)"
|
|
||||||
else
|
|
||||||
for i in "${!lines[@]}"; do
|
|
||||||
printf '%3d: %s\n' $((i + 1)) "${lines[${i}]}"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
echo "---------------------------"
|
|
||||||
echo "e <n> <texte> - Remplacer la ligne n"
|
|
||||||
echo "i <n> <texte> - Inserer apres la ligne n (0 = debut)"
|
|
||||||
echo "d <n> - Supprimer la ligne n"
|
|
||||||
echo "wq - Enregistrer et quitter"
|
|
||||||
echo "q! - Quitter sans enregistrer"
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
read -r -p "> " input
|
|
||||||
cmd="${input%% *}"
|
|
||||||
rest="${input#* }"
|
|
||||||
|
|
||||||
case "${cmd}" in
|
|
||||||
e)
|
|
||||||
line_num="${rest%% *}"
|
|
||||||
new_content="${rest#* }"
|
|
||||||
if [[ ${line_num} =~ ^[0-9]+$ ]] && (( line_num >= 1 && line_num <= ${#lines[@]} )); then
|
|
||||||
lines[$((line_num - 1))]="${new_content}"
|
|
||||||
modified=1
|
|
||||||
else
|
|
||||||
echo "Ligne invalide (1-${#lines[@]})."
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
i)
|
|
||||||
line_num="${rest%% *}"
|
|
||||||
new_content="${rest#* }"
|
|
||||||
if [[ ${line_num} =~ ^[0-9]+$ ]] && (( line_num >= 0 && line_num <= ${#lines[@]} )); then
|
|
||||||
lines=("${lines[@]:0:line_num}" "${new_content}" "${lines[@]:line_num}")
|
|
||||||
modified=1
|
|
||||||
else
|
|
||||||
echo "Position invalide (0-${#lines[@]})."
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
d)
|
|
||||||
line_num="${rest}"
|
|
||||||
if [[ ${line_num} =~ ^[0-9]+$ ]] && (( line_num >= 1 && line_num <= ${#lines[@]} )); then
|
|
||||||
unset 'lines[$((line_num - 1))]'
|
|
||||||
lines=("${lines[@]}")
|
|
||||||
modified=1
|
|
||||||
else
|
|
||||||
echo "Ligne invalide (1-${#lines[@]})."
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
wq)
|
|
||||||
if [[ ${modified} -eq 1 ]] || [[ ! -f ${file_path} ]]; then
|
|
||||||
printf '%s\n' "${lines[@]}" > "${file_path}"
|
|
||||||
if [[ ${#lines[@]} -eq 0 ]]; then
|
|
||||||
rm -f "${file_path}"
|
|
||||||
echo "Fichier vide, supprime."
|
|
||||||
else
|
|
||||||
echo "Fichier enregistre (${#lines[@]} lignes)."
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "Aucune modification."
|
|
||||||
fi
|
|
||||||
break
|
|
||||||
;;
|
|
||||||
q|'q!')
|
|
||||||
echo "Abandon."
|
|
||||||
break
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Commandes : e <n> <txt>, i <n> <txt>, d <n>, wq, q!"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
echo ""
|
|
||||||
done
|
|
||||||
echo ""
|
|
||||||
}
|
|
||||||
|
|
||||||
function sessions_viewer() {
|
|
||||||
while true; do
|
|
||||||
echo -e "Ci dessous les utilisateurs disponibles sur le bastion.\nVeillez sélectionner celui dont vous souhaitez visionner les accès :"
|
|
||||||
Available_Users=$(find /home/. -maxdepth 1 -type d | grep -v "\.$" | cut -d "/" -f 4)
|
|
||||||
users_counter=0
|
|
||||||
declare -A users_map
|
|
||||||
while read -r line; do
|
|
||||||
user="${line}"
|
|
||||||
users_map[${users_counter}]="${user}"
|
|
||||||
echo "${users_counter}) ${user}"
|
|
||||||
users_counter=$((users_counter + 1))
|
|
||||||
done <<<"${Available_Users}"
|
|
||||||
|
|
||||||
echo "${users_counter}) Tapez 'quit' ou ${users_counter} pour revenir au menu précédent."
|
|
||||||
|
|
||||||
read -r -p "Votre choix (0-${users_counter}): " choice
|
|
||||||
|
|
||||||
if [[ ${choice} == "quit" ]] || [[ ${choice} == "${users_counter}" ]]; then
|
|
||||||
return
|
|
||||||
elif [[ $(echo "${choice}" | cut -c1-1) == "f" ]]; then
|
|
||||||
filter=$(echo "${choice}" | cut -c2-)
|
|
||||||
echo "=====Résultats du filtre====="
|
|
||||||
for idx in "${!users_map[@]}"; do
|
|
||||||
if [[ ${users_map[${idx}]} == *"${filter}"* ]]; then
|
|
||||||
echo "${idx}) ${users_map[${idx}]}"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
read -r -p "Votre choix (0-${users_counter}) : " choice
|
|
||||||
elif [[ -z ${choice} ]] || [[ -z ${users_map[${choice}]} ]]; then
|
|
||||||
clear
|
|
||||||
echo "Sélection invalide."
|
|
||||||
else
|
|
||||||
local selected_option="${users_map[${choice}]}"
|
|
||||||
while true; do
|
|
||||||
Available_Sessions=$(find /home/"${selected_option}"/. -maxdepth 1 -type f -name "*.ttyrec" | grep -v "\.$" | cut -d "/" -f 5)
|
|
||||||
echo "Sélectionnez une session de cet utilisateur que vous souhaitez visionner :"
|
|
||||||
|
|
||||||
sessions_counter=1
|
|
||||||
declare -A sessions_map
|
|
||||||
while read -r line; do
|
|
||||||
session_name="${line}"
|
|
||||||
sessions_map[${sessions_counter}]="${session_name}"
|
|
||||||
echo "${sessions_counter}) ${session_name}"
|
|
||||||
sessions_counter=$((sessions_counter + 1))
|
|
||||||
done <<<"${Available_Sessions}"
|
|
||||||
|
|
||||||
echo "${sessions_counter}) Tapez 'quit' ou ${sessions_counter} pour revenir au choix d'utilisateur."
|
|
||||||
|
|
||||||
read -r -p "Votre choix (1-${sessions_counter}): " choice
|
|
||||||
if [[ ${choice} == "quit" ]] || [[ ${choice} == "${sessions_counter}" ]]; then
|
|
||||||
break
|
|
||||||
elif [[ -z ${choice} ]] || [[ -z ${sessions_map[${choice}]} ]]; then
|
|
||||||
clear
|
|
||||||
echo "Sélection invalide."
|
|
||||||
else
|
|
||||||
ttyplay /home/"${selected_option}"/"${sessions_map[${choice}]}"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
function servers_access_control() {
|
|
||||||
echo -e "Choisissez une option d'administration des serveurs ci dessous :"
|
|
||||||
echo -e "1) Ajout de fichiers clés privées/mots de passes pour l'authentification aux serveurs distants.\n2) Modification des droits d'accès aux serveurs.\n3) Tapez 'quit' ou 3 pour revenir au menu précédent."
|
|
||||||
|
|
||||||
read -r -p "Votre choix (1-3): " choice
|
|
||||||
|
|
||||||
case "${choice}" in
|
|
||||||
"1")
|
|
||||||
clear
|
|
||||||
Authorization_Files_List=$(find /opt/public/servers/. -type f ! -name 'authorized_servers.txt' | cut -d "/" -f 6)
|
|
||||||
echo -e "Le ficher d'authentification qui sera crée ou modifié sera placé dans le répertoire \"/opt/public/servers/\" du bastion.\nle nom de ce dernier ne doit pas comporter de \"/\", être vide ou être égal à \"authorized_servers.txt\"."
|
|
||||||
echo -e "Ci dessous la liste des fichiers d'authentification existants :\n${Authorization_Files_List}"
|
|
||||||
read -r -p 'Entrez le nom du fichier: ' File_Name
|
|
||||||
|
|
||||||
if [[ $(echo "${File_Name}" | grep -m1 -o "/" | head -1) == "/" ]] || [[ $(echo "${File_Name}" | grep -m1 -o "*" | head -1) == "*" ]] || [[ -z ${File_Name} ]] || [[ ${File_Name} == "authorized_servers.txt" ]]; then
|
|
||||||
echo 'Le nom du fichier ne doit pas contenir les caractères "/" ou "*", être vide ou ce nommer "authorized_servers.txt". Veuillez modifier ce dernier.'
|
|
||||||
else
|
|
||||||
echo "Assurez vous que le fichier créé ou modifié comporte bien uniquement la clé privée ou le mot de passe nécessaire à la connexion."
|
|
||||||
secure_file_editor "/opt/public/servers/${File_Name}"
|
|
||||||
if [[ $(cat "/opt/public/servers/${File_Name}") == "" ]]; then
|
|
||||||
echo "Le fichier modifié \"${File_Name}\" est vide. Ce dernier sera supprimé."
|
|
||||||
rm -rf /opt/public/servers/"${File_Name}"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
"2")
|
|
||||||
clear
|
|
||||||
echo -e "Veuillez bien vérifier la syntaxe de votre configuration avant de valider cette dernière.\nPour plus d'informations, consultez la documentation de Monosphere."
|
|
||||||
secure_file_editor "/opt/public/servers/authorized_servers.txt"
|
|
||||||
;;
|
|
||||||
|
|
||||||
"3" | "quit")
|
|
||||||
main_menu
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
clear
|
|
||||||
echo "Sélection invalide."
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
while true; do
|
|
||||||
servers_access_control
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
function admin_rights_control() {
|
|
||||||
echo -e "Veuillez bien vérifier la syntaxe de votre configuration avant de valider cette dernière.\nPour plus d'informations, consultez la documentation de Monosphere."
|
|
||||||
secure_file_editor "/opt/public/rights/admin_rights.txt"
|
|
||||||
}
|
|
||||||
|
|
||||||
function transfer_rights_control() {
|
|
||||||
echo -e "Editez les droits de transfert de fichiers ci dessous.\nFormat : nom_serveur user1,user2,...\nSi le fichier est vide, les transferts sont refuses pour tous."
|
|
||||||
secure_file_editor "/opt/public/rights/transfer_rights.txt"
|
|
||||||
}
|
|
||||||
|
|
||||||
function main_menu() {
|
|
||||||
clear
|
|
||||||
ADMIN_RIGHTS_PATH="opt/public/rights"
|
|
||||||
ADMIN_RIGHTS_FILE="/${ADMIN_RIGHTS_PATH}/admin_rights.txt"
|
|
||||||
CONNECTED_ADMIN="$(whoami)"
|
|
||||||
|
|
||||||
ADMIN_RIGHTS=$(awk -v user="${CONNECTED_ADMIN}" '
|
|
||||||
{
|
|
||||||
split($3, users, ",");
|
|
||||||
for (i in users) {
|
|
||||||
if (users[i] == user) {
|
|
||||||
print $0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}' "${ADMIN_RIGHTS_FILE}")
|
|
||||||
|
|
||||||
counter=0
|
|
||||||
adminrights_list=()
|
|
||||||
while read -r line; do
|
|
||||||
admin_right=$(echo "${line}" | cut -d ' ' -f 1)
|
|
||||||
admin_right_pretty_name=$(echo "${line}" | cut -d ' ' -f 2)
|
|
||||||
if [[ -n ${admin_right_pretty_name} ]]; then
|
|
||||||
adminrights_list[${counter}]="${admin_right} ${admin_right_pretty_name}"
|
|
||||||
counter=$((counter + 1))
|
|
||||||
fi
|
|
||||||
done <<<"${ADMIN_RIGHTS}"
|
|
||||||
|
|
||||||
if [[ ${counter} -gt 0 ]]; then
|
|
||||||
echo "Veuillez sélectionner une option d'administration :"
|
|
||||||
for ((idx=0; idx<counter; idx++)); do
|
|
||||||
echo "${idx}) $(echo "${adminrights_list[${idx}]}" | cut -d ' ' -f 2-)"
|
|
||||||
done
|
|
||||||
else
|
|
||||||
echo "Vous n'avez aucune autorisation d'administration."
|
|
||||||
fi
|
|
||||||
echo "Vous pouvez cependant vous connecter aux serveurs dont l'accès vous est autorisé."
|
|
||||||
|
|
||||||
local servers_access_idx=${counter}
|
|
||||||
echo "${counter}) Tapez 'servers_access' ou ${counter} pour vous connecter a un serveur."
|
|
||||||
counter=$((counter + 1))
|
|
||||||
local logs_idx=${counter}
|
|
||||||
echo "${counter}) Tapez 'logs' ou ${counter} pour consulter les logs de transfert."
|
|
||||||
counter=$((counter + 1))
|
|
||||||
local quit_idx=${counter}
|
|
||||||
echo "${counter}) Tapez 'quit' ou ${counter} pour vous déconnecter."
|
|
||||||
|
|
||||||
read -r -p "Votre choix (0-${counter}): " choice
|
|
||||||
|
|
||||||
if [[ ${choice} == "servers_access" ]] || [[ ${choice} == "${servers_access_idx}" ]]; then
|
|
||||||
bash /opt/public/scripts/server_menu.sh
|
|
||||||
elif [[ ${choice} == "logs" ]] || [[ ${choice} == "${logs_idx}" ]]; then
|
|
||||||
clear
|
|
||||||
if [[ -f /var/log/monosphere/transfers.log ]]; then
|
|
||||||
cat /var/log/monosphere/transfers.log
|
|
||||||
else
|
|
||||||
echo "Aucun log de transfert disponible."
|
|
||||||
fi
|
|
||||||
read -r -p "Appuyez sur Entree pour continuer..."
|
|
||||||
elif [[ ${choice} == "quit" ]] || [[ ${choice} == "${quit_idx}" ]]; then
|
|
||||||
echo "Déconnexion du bastion."
|
|
||||||
exit 0
|
|
||||||
elif [[ -z ${choice} ]] || [[ -z ${adminrights_list[${choice}]+isset} ]]; then
|
|
||||||
clear
|
|
||||||
echo "Sélection invalide."
|
|
||||||
else
|
|
||||||
local selected_option
|
|
||||||
selected_option="${adminrights_list[${choice}]}"
|
|
||||||
case "$(echo "${selected_option}" | cut -d ' ' -f 1)" in
|
|
||||||
|
|
||||||
"sessionswatch_admins")
|
|
||||||
clear
|
|
||||||
sessions_viewer
|
|
||||||
;;
|
|
||||||
|
|
||||||
"serverscontrol_admins")
|
|
||||||
clear
|
|
||||||
servers_access_control
|
|
||||||
;;
|
|
||||||
#
|
|
||||||
# "usercontrol_admins")
|
|
||||||
#
|
|
||||||
# ;;
|
|
||||||
#
|
|
||||||
"adminscontrol_admins")
|
|
||||||
clear
|
|
||||||
admin_rights_control
|
|
||||||
;;
|
|
||||||
|
|
||||||
"transfercontrol_admins")
|
|
||||||
clear
|
|
||||||
transfer_rights_control
|
|
||||||
;;
|
|
||||||
|
|
||||||
#
|
|
||||||
# "cluster_admins")
|
|
||||||
#
|
|
||||||
# ;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
clear
|
|
||||||
echo -e "Un problème de configuration a été détecté sur \nles options du droit administrateur sélectionné.\nVeuillez contacter votre administrateur."
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
while true; do
|
|
||||||
main_menu
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
main_menu
|
|
||||||
@ -1,4 +0,0 @@
|
|||||||
sessionswatch_admins Visionnage_des_sessions_du_bastion bastion
|
|
||||||
serverscontrol_admins Administration_des_acces_serveurs bastion
|
|
||||||
adminscontrol_admins Administration_des_privileges bastion
|
|
||||||
transfercontrol_admins Gestion_des_droits_de_transfert bastion
|
|
||||||
@ -1 +0,0 @@
|
|||||||
255.255.255.256 22 example-fake-server example-fake-user bastion
|
|
||||||
@ -1 +1,2 @@
|
|||||||
bastion;0;$6$lwJT2jE8uXZhk9.X$1NY4bP7DaBZRb5TL8RC/R0RdV3/pKL2t0JvIEWDxfxMNKi4Ts6zvr5JC7qa15dIbLI.wMDir0FKcjEoxOhNEK1;0
|
USERNAME;BASTION_LIMITED;PASSWORD/0;USEKEYS/0
|
||||||
|
bastion;1;bastion;0
|
||||||
189
entrypoint.sh
189
entrypoint.sh
@ -1,129 +1,94 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
hostname "${HOSTNAME}"
|
||||||
|
echo "Monosphere anacron scheduler is starting..."
|
||||||
|
service anacron start
|
||||||
|
echo "Monosphere anacron scheduler is successfully started"
|
||||||
|
|
||||||
error_msg() {
|
echo "Monosphere sshd service daemon is verifying its configuration..."
|
||||||
# shellcheck disable=SC2154
|
echo "Port ${PORT}" >> /etc/ssh/sshd_config
|
||||||
echo -n "$(date '+%d-%m-%Y||%H:%M:%S') [ NOOK ] "
|
echo "#Last authentication configurations" >> /etc/ssh/sshd_config
|
||||||
echo -e "$@"
|
if [ "${PASSWORD_AUTH}" -eq "1" ]; then
|
||||||
}
|
echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
|
||||||
|
else
|
||||||
good_msg() {
|
echo "PasswordAuthentication no" >> /etc/ssh/sshd_config
|
||||||
echo -n "$(date '+%d-%m-%Y||%H:%M:%S') [ GOOD ] "
|
|
||||||
echo -e "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
info_msg() {
|
|
||||||
echo -n "$(date '+%d-%m-%Y||%H:%M:%S') [ INFO ] "
|
|
||||||
echo -e "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
if ! grep -qo "^Port ${PORT}$" /etc/ssh/sshd_config; then
|
|
||||||
info_msg "Génération de la configuration de SSH pour le bastion Monosphere..."
|
|
||||||
info_msg "Port selectionne pour la connexion SSH : ${PORT}"
|
|
||||||
echo "Port ${PORT}" >>/etc/ssh/sshd_config
|
|
||||||
echo "#Last authentication configurations" >>/etc/ssh/sshd_config
|
|
||||||
if [[ ${PASSWORD_AUTH} -eq "1" ]]; then
|
|
||||||
info_msg "Authentification par mot de passe autorisee."
|
|
||||||
echo "PasswordAuthentication yes" >>/etc/ssh/sshd_config
|
|
||||||
else
|
|
||||||
info_msg "Authentification par mot de passe interdite."
|
|
||||||
echo "PasswordAuthentication no" >>/etc/ssh/sshd_config
|
|
||||||
fi
|
|
||||||
if [[ ${KEY_AUTH} -eq "1" ]]; then
|
|
||||||
info_msg "Authentification par clés privées autorisee."
|
|
||||||
echo "PubkeyAuthentication yes" >>/etc/ssh/sshd_config
|
|
||||||
else
|
|
||||||
info_msg "Authentification par clés privées interdite."
|
|
||||||
echo "PubkeyAuthentication no" >>/etc/ssh/sshd_config
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
if [ "${KEY_AUTH}" -eq "1" ]; then
|
||||||
|
echo "PubkeyAuthentication yes" >> /etc/ssh/sshd_config
|
||||||
|
else
|
||||||
|
echo "PubkeyAuthentication no" >> /etc/ssh/sshd_config
|
||||||
|
fi
|
||||||
|
sshd -t
|
||||||
|
echo "Monosphere sshd service daemon configuration verified"
|
||||||
|
|
||||||
info_msg "Monosphere active et execute les scripts personalisés"
|
echo "Monosphere rsyslog daemon is starting..."
|
||||||
|
service rsyslog start
|
||||||
|
echo "Monosphere rsyslog daemon is successfully started"
|
||||||
|
|
||||||
|
echo "Monosphere auditd daemon is starting..."
|
||||||
|
service auditd start
|
||||||
|
echo "Monosphere auditd daemon is successfully started"
|
||||||
|
|
||||||
|
echo "Monosphere sshd service daemon is starting..."
|
||||||
|
service ssh start
|
||||||
|
echo "Monosphere sshd service daemon is successfully started"
|
||||||
|
|
||||||
|
echo "Monosphere is enabling and executing custom scripts..."
|
||||||
chown -R root:root /opt/custom
|
chown -R root:root /opt/custom
|
||||||
chmod 700 /opt/custom/scripts/*.sh
|
chmod 700 /opt/custom/scripts/*.sh
|
||||||
bash /opt/custom/scripts/*.sh || error_msg "Code 02 : Problème lors de la tentative d'execution de scripts personnalisés.\nConsultez la documentation pour plus d'informations."
|
bash /opt/custom/scripts/*.sh
|
||||||
good_msg "Execution des scripts personalisés terminée."
|
echo "Monosphere custom scripts are successfully enabled"
|
||||||
|
|
||||||
|
echo "Monosphere is configuring public directory..."
|
||||||
|
chown -R root:root /opt/public
|
||||||
|
chmod -R 755 /opt/public
|
||||||
|
echo "Monosphere public directory successfully configured"
|
||||||
|
|
||||||
#User accounts creation step
|
#User accounts creation step
|
||||||
|
|
||||||
info_msg "Création des groupes d'utilisateurs."
|
|
||||||
if ! grep -q "bastionuser" /etc/group; then
|
if ! grep -q "bastionuser" /etc/group; then
|
||||||
addgroup bastionuser
|
groupadd bastionuser
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! grep -q "bastionadmin" /etc/group; then
|
if [ ! -f "/root/scripts/users/bastion_users.txt" ]; then
|
||||||
addgroup bastionadmin
|
echo "No userfile detected, creating default user. Please change the default password for security purposes..."
|
||||||
fi
|
adduser --disabled-password --gecos "" bastion --shell /bin/bash
|
||||||
good_msg "Fin de la création des groupes d'utilisateurs."
|
usermod -aG bastionuser bastion
|
||||||
|
echo bastion:bastion | chpasswd
|
||||||
info_msg "Création des utilisateurs en cours..."
|
|
||||||
userfile=$(cat /root/scripts/users/bastion_users.txt)
|
|
||||||
if [[ -z ${userfile} ]]; then
|
|
||||||
error_msg "Code 03 : Configuration utilisateur introuvable, veuillez vérifier votre configuration.\nConsultez la documentation pour plus d'informations."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
for userinfo in ${userfile}; do
|
|
||||||
user=$(echo "${userinfo}" | cut -d ';' -f 1)
|
|
||||||
is_bastion=$(echo "${userinfo}" | cut -d ';' -f 2)
|
|
||||||
encrypted_password=$(echo "${userinfo}" | cut -d ';' -f 3)
|
|
||||||
setkeys=$(echo "${userinfo}" | cut -d ';' -f 4)
|
|
||||||
|
|
||||||
# shellcheck disable=SC2016
|
|
||||||
if [[ $(echo "${encrypted_password}" | cut -c1-3) != '$6$' ]] && [[ $(echo "${encrypted_password}" | cut -c1-1) != '0' ]]; then
|
|
||||||
error_msg "Code 01 : Problème avec le mot de passe entré pour l'utilisateur \"${user}\".\nConsultez la documentation pour plus d'informations."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
adduser --disabled-password --gecos "" "${user}" --shell /bin/bash
|
|
||||||
|
|
||||||
if [[ ${is_bastion} -eq "1" ]]; then
|
|
||||||
usermod -aG bastionuser "${user}"
|
|
||||||
elif [[ ${is_bastion} -eq "0" ]]; then
|
|
||||||
usermod -aG bastionadmin "${user}"
|
|
||||||
mkdir /home/"${user}"
|
|
||||||
ln -s /opt/public/scripts/server_menu.sh /home/"${user}"/server_menu.sh
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ${encrypted_password} != "0" ]]; then
|
|
||||||
info_msg "Hash de mot de passe trouvé, configuration de ce dernier pour l'utilisateur \"${user}\"."
|
|
||||||
sed -i "s|^${user}:\!|${user}:${encrypted_password}|g" /etc/shadow || error_msg "Code 04 : Problème avec la mise en place du mot de passe utilisateur.\nConsultez la documentation pour plus d'informations."
|
|
||||||
else
|
|
||||||
info_msg "Mot de passe non configuré, ce dernier sera égal au nom de l'utilisateur, comme indiqué dans la documentation."
|
|
||||||
echo "${user}:${user}" | chpasswd
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ${setkeys} -eq "1" ]]; then
|
|
||||||
mkdir -p /home/"${user}"/.ssh
|
|
||||||
chmod 700 /home/"${user}"/.ssh
|
|
||||||
cp -r /root/scripts/users/"${user}"/* /home/"${user}"/.ssh/
|
|
||||||
chown -R "${user}":"${user}" /home/"${user}"/.ssh
|
|
||||||
chmod 600 /home/"${user}"/.ssh/*
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
good_msg "Création des utilisateurs terminée."
|
|
||||||
|
|
||||||
info_msg "Monosphere configure le répertoire public."
|
|
||||||
chown -R root:bastionadmin /opt/public
|
|
||||||
chmod -R 775 /opt/public
|
|
||||||
|
|
||||||
info_msg "Configuration des répertoires de logs et droits."
|
|
||||||
touch /opt/public/rights/transfer_rights.txt
|
|
||||||
mkdir -p /var/log/monosphere
|
|
||||||
chmod 777 /var/log/monosphere
|
|
||||||
touch /var/log/monosphere/transfers.log
|
|
||||||
chmod 666 /var/log/monosphere/transfers.log
|
|
||||||
good_msg "Répertoires configurés."
|
|
||||||
|
|
||||||
info_msg "Démarrage du service SSHD de Monosphere."
|
|
||||||
rc-status
|
|
||||||
rc-service sshd restart
|
|
||||||
|
|
||||||
if sshd -t; then
|
|
||||||
info_msg "Configuration du service SSHD de Monosphere vérifiée et valide."
|
|
||||||
info_msg "Monosphere a bien été configuré et démarré avec succès."
|
|
||||||
else
|
else
|
||||||
info_msg "Configuration du service SSHD de Monosphere invalide\n Veuillez vérifier la configuration et relancer le deploiement."
|
echo "Monosphere is creating the bastion users..."
|
||||||
exit 1
|
userfile=$(cat /root/scripts/users/bastion_users.txt)
|
||||||
|
for userinfo in $userfile; do
|
||||||
|
user=$(echo "$userinfo" | cut -d ';' -f 1)
|
||||||
|
is_bastion=$(echo "$userinfo" | cut -d ';' -f 2)
|
||||||
|
password=$(echo "$userinfo" | cut -d ';' -f 3)
|
||||||
|
setkeys=$(echo "$userinfo" | cut -d ';' -f 4)
|
||||||
|
|
||||||
|
adduser --disabled-password --gecos "" "$user" --shell /bin/bash
|
||||||
|
|
||||||
|
if [ "$is_bastion" -eq "1" ]; then
|
||||||
|
usermod -aG bastionuser "$user"
|
||||||
|
elif [ "$is_bastion" -eq "0" ]; then
|
||||||
|
echo "$user ALL=(ALL) NOPASSWD: /usr/local/bin/ttyplay*" | sudo EDITOR='tee -a' visudo
|
||||||
|
echo "$user ALL=(ALL) NOPASSWD: /usr/bin/ls*" | sudo EDITOR='tee -a' visudo
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$password" != "0" ]; then
|
||||||
|
echo "$user:$password" | chpasswd
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$setkeys" -eq "1" ]; then
|
||||||
|
mkdir -p /home/"$user"/.ssh
|
||||||
|
chmod 700 /home/"$user"/.ssh
|
||||||
|
cp -r /root/scripts/users/"$user"/* /home/"$user"/.ssh/
|
||||||
|
chown -R "$user":"$user" /home/"$user"/.ssh
|
||||||
|
chmod 600 /home/"$user"/.ssh/*
|
||||||
|
fi
|
||||||
|
done
|
||||||
fi
|
fi
|
||||||
|
echo "Monosphere user creation is finished"
|
||||||
|
|
||||||
|
echo "Monosphere bastion is successfully started"
|
||||||
|
|
||||||
# Keep the container running
|
# Keep the container running
|
||||||
tail -f /dev/null
|
tail -f /dev/null
|
||||||
|
echo "Monosphere bastion is successfully started"
|
||||||
252
server_menu.sh
252
server_menu.sh
@ -1,231 +1,45 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
AUTHORIZED_SERVERS_PATH="opt/public/servers"
|
AUTHORIZED_SERVERS_PATH="opt/public/servers"
|
||||||
AUTHORIZED_SERVERS_FILE="/${AUTHORIZED_SERVERS_PATH}/authorized_servers.txt"
|
AUTHORIZED_SERVERS_FILE="/$AUTHORIZED_SERVERS_PATH/authorized_servers.txt"
|
||||||
|
USER_SERVERS=$(grep -w "$(whoami)" $AUTHORIZED_SERVERS_FILE)
|
||||||
CONNECTED_USER="$(whoami)"
|
CONNECTED_USER="$(whoami)"
|
||||||
|
|
||||||
USER_SERVERS=$(awk -v user="${CONNECTED_USER}" '
|
if [ -z "$USER_SERVERS" ]; then
|
||||||
{
|
echo "Vous n'avez pas l'autorisation de vous connecter à un serveur."
|
||||||
split($5, users, ",");
|
exit 1
|
||||||
for (i in users) {
|
|
||||||
if (users[i] == user) {
|
|
||||||
print $0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}' "${AUTHORIZED_SERVERS_FILE}")
|
|
||||||
|
|
||||||
if [[ -z ${USER_SERVERS} ]]; then
|
|
||||||
echo "Vous n'avez pas l'autorisation de vous connecter à un serveur."
|
|
||||||
exit 1
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
TRANSFER_LOG="/var/log/monosphere/transfers.log"
|
echo "Veuillez sélectionner un serveur auquel vous connecter :"
|
||||||
TRANSFER_RIGHTS_FILE="/opt/public/rights/transfer_rights.txt"
|
|
||||||
|
|
||||||
mkdir -p "$(dirname "${TRANSFER_LOG}")" 2>/dev/null
|
counter=1
|
||||||
touch "${TRANSFER_LOG}" 2>/dev/null
|
declare -A server_map
|
||||||
chmod 666 "${TRANSFER_LOG}" 2>/dev/null
|
while read -r line; do
|
||||||
|
ip=$(echo "$line" | cut -d ' ' -f 1)
|
||||||
|
port=$(echo "$line" | cut -d ' ' -f 2)
|
||||||
|
custom_name=$(echo "$line" | cut -d ' ' -f 3)
|
||||||
|
server_user=$(echo "$line" | cut -d ' ' -f 4)
|
||||||
|
server_authkey=$(echo "$line" | cut -d ' ' -f 6)
|
||||||
|
server_map[$counter]="$ip $port $server_user $server_authkey"
|
||||||
|
echo "$counter) $custom_name - $server_user $ip:$port"
|
||||||
|
counter=$((counter + 1))
|
||||||
|
done <<< "$USER_SERVERS"
|
||||||
|
|
||||||
check_transfer_rights() {
|
read -r -p "Votre choix (1-${#server_map[@]}): " choice
|
||||||
local server_name="$1"
|
|
||||||
if [[ ! -f ${TRANSFER_RIGHTS_FILE} ]] || [[ ! -s ${TRANSFER_RIGHTS_FILE} ]]; then
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
local user_allowed
|
|
||||||
user_allowed=$(awk -v server="${server_name}" -v user="${CONNECTED_USER}" '
|
|
||||||
$1 == server {
|
|
||||||
split($2, ulist, ",");
|
|
||||||
for (i in ulist) {
|
|
||||||
if (ulist[i] == user || ulist[i] == "*") { print "yes"; exit; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
' "${TRANSFER_RIGHTS_FILE}")
|
|
||||||
if [[ -z ${user_allowed} ]]; then
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
scp_to_target() {
|
if [ -z "${server_map[$choice]}" ]; then
|
||||||
local src="$1" ip="$2" port="$3" user="$4" dest="$5" authmethod="$6" authfile="$7"
|
echo "Sélection invalide."
|
||||||
if [[ -z ${authmethod} ]]; then
|
exit 1
|
||||||
scp -o StrictHostKeyChecking=accept-new -P "${port}" "${src}" "${user}@${ip}:${dest}" 2>&1
|
|
||||||
elif [[ ${authmethod} == "key" ]] && [[ -f /${AUTHORIZED_SERVERS_PATH}/${authfile} ]]; then
|
|
||||||
scp -o StrictHostKeyChecking=accept-new -i "/${AUTHORIZED_SERVERS_PATH}/${authfile}" -P "${port}" "${src}" "${user}@${ip}:${dest}" 2>&1
|
|
||||||
elif [[ ${authmethod} == "password" ]] && [[ -f /${AUTHORIZED_SERVERS_PATH}/${authfile} ]]; then
|
|
||||||
sshpass -p "$(cat /${AUTHORIZED_SERVERS_PATH}/${authfile})" scp -o StrictHostKeyChecking=accept-new -P "${port}" "${src}" "${user}@${ip}:${dest}" 2>&1
|
|
||||||
else
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
ssh_to_target_cat() {
|
|
||||||
local ip="$1" port="$2" user="$3" path="$4" authmethod="$5" authfile="$6"
|
|
||||||
if [[ -z ${authmethod} ]]; then
|
|
||||||
ssh -T -o StrictHostKeyChecking=accept-new -p "${port}" "${user}@${ip}" "cat '${path}'" < /dev/null
|
|
||||||
elif [[ ${authmethod} == "key" ]] && [[ -f /${AUTHORIZED_SERVERS_PATH}/${authfile} ]]; then
|
|
||||||
ssh -T -o StrictHostKeyChecking=accept-new -i "/${AUTHORIZED_SERVERS_PATH}/${authfile}" -p "${port}" "${user}@${ip}" "cat '${path}'" < /dev/null
|
|
||||||
elif [[ ${authmethod} == "password" ]] && [[ -f /${AUTHORIZED_SERVERS_PATH}/${authfile} ]]; then
|
|
||||||
sshpass -p "$(cat /${AUTHORIZED_SERVERS_PATH}/${authfile})" ssh -T -o StrictHostKeyChecking=accept-new -p "${port}" "${user}@${ip}" "cat '${path}'" < /dev/null
|
|
||||||
else
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
log_transfer() {
|
|
||||||
local action="$1" server="$2" path="$3" size="$4" status="$5"
|
|
||||||
echo "$(date '+%Y-%m-%d %H:%M:%S') USER=${CONNECTED_USER} ACTION=${action} SERVER=${server} FILE=${path} SIZE=${size} STATUS=${status}" >> "${TRANSFER_LOG}"
|
|
||||||
}
|
|
||||||
|
|
||||||
if [[ -n ${SSH_ORIGINAL_COMMAND} ]]; then
|
|
||||||
case "${SSH_ORIGINAL_COMMAND}" in
|
|
||||||
"push_file "*)
|
|
||||||
args="${SSH_ORIGINAL_COMMAND#push_file }"
|
|
||||||
server_name=$(echo "${args}" | cut -d ' ' -f 1)
|
|
||||||
dest_path=$(echo "${args}" | cut -d ' ' -f 2-)
|
|
||||||
if [[ -z ${server_name} ]] || [[ -z ${dest_path} ]]; then
|
|
||||||
echo "Usage: push_file <server_name> <remote_dest_path>"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
server_line=$(echo "${USER_SERVERS}" | awk -v name="${server_name}" '$3 == name {print; exit}')
|
|
||||||
if [[ -z ${server_line} ]]; then
|
|
||||||
echo "Serveur \"${server_name}\" non trouve ou non autorise."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
if ! check_transfer_rights "${server_name}"; then
|
|
||||||
echo "Vous n'avez pas le droit de transferer des fichiers vers ${server_name}."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
srv_ip=$(echo "${server_line}" | cut -d ' ' -f 1)
|
|
||||||
srv_port=$(echo "${server_line}" | cut -d ' ' -f 2)
|
|
||||||
srv_user=$(echo "${server_line}" | cut -d ' ' -f 4)
|
|
||||||
srv_authmethod=$(echo "${server_line}" | cut -d ' ' -f 6)
|
|
||||||
srv_authfile=$(echo "${server_line}" | cut -d ' ' -f 7)
|
|
||||||
tmpfile=$(mktemp /tmp/.push_XXXXXX)
|
|
||||||
cat > "${tmpfile}"
|
|
||||||
file_size=$(stat -c %s "${tmpfile}" 2>/dev/null || stat -f %z "${tmpfile}" 2>/dev/null)
|
|
||||||
scp_to_target "${tmpfile}" "${srv_ip}" "${srv_port}" "${srv_user}" "${dest_path}" "${srv_authmethod}" "${srv_authfile}"
|
|
||||||
exit_code=$?
|
|
||||||
rm -f "${tmpfile}"
|
|
||||||
if [[ ${exit_code} -eq 0 ]]; then
|
|
||||||
log_transfer "push" "${server_name}" "${dest_path}" "${file_size:-0}" "success"
|
|
||||||
else
|
|
||||||
log_transfer "push" "${server_name}" "${dest_path}" "${file_size:-0}" "failed"
|
|
||||||
fi
|
|
||||||
exit ${exit_code}
|
|
||||||
;;
|
|
||||||
"retrieve_file "*)
|
|
||||||
args="${SSH_ORIGINAL_COMMAND#retrieve_file }"
|
|
||||||
server_name=$(echo "${args}" | cut -d ' ' -f 1)
|
|
||||||
remote_path=$(echo "${args}" | cut -d ' ' -f 2-)
|
|
||||||
if [[ -z ${server_name} ]] || [[ -z ${remote_path} ]]; then
|
|
||||||
echo "Usage: retrieve_file <server_name> <remote_path>"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
server_line=$(echo "${USER_SERVERS}" | awk -v name="${server_name}" '$3 == name {print; exit}')
|
|
||||||
if [[ -z ${server_line} ]]; then
|
|
||||||
echo "Serveur \"${server_name}\" non trouve ou non autorise."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
if ! check_transfer_rights "${server_name}"; then
|
|
||||||
echo "Vous n'avez pas le droit de transferer des fichiers vers ${server_name}."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
srv_ip=$(echo "${server_line}" | cut -d ' ' -f 1)
|
|
||||||
srv_port=$(echo "${server_line}" | cut -d ' ' -f 2)
|
|
||||||
srv_user=$(echo "${server_line}" | cut -d ' ' -f 4)
|
|
||||||
srv_authmethod=$(echo "${server_line}" | cut -d ' ' -f 6)
|
|
||||||
srv_authfile=$(echo "${server_line}" | cut -d ' ' -f 7)
|
|
||||||
ssh_to_target_cat "${srv_ip}" "${srv_port}" "${srv_user}" "${remote_path}" "${srv_authmethod}" "${srv_authfile}"
|
|
||||||
exit_code=$?
|
|
||||||
if [[ ${exit_code} -eq 0 ]]; then
|
|
||||||
echo "$(date '+%Y-%m-%d %H:%M:%S') USER=${CONNECTED_USER} ACTION=retrieve SERVER=${server_name} FILE=${remote_path} STATUS=success" >> "${TRANSFER_LOG}"
|
|
||||||
else
|
|
||||||
echo "$(date '+%Y-%m-%d %H:%M:%S') USER=${CONNECTED_USER} ACTION=retrieve SERVER=${server_name} FILE=${remote_path} STATUS=failed" >> "${TRANSFER_LOG}"
|
|
||||||
fi
|
|
||||||
exit ${exit_code}
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Commande non reconnue: ${SSH_ORIGINAL_COMMAND}"
|
|
||||||
echo "Commandes supportees:"
|
|
||||||
echo " push_file <server> <dest_path> - Pousser stdin vers un serveur distant"
|
|
||||||
echo " retrieve_file <server> <src_path> - Recuperer un fichier distant vers stdout"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
function main_menu() {
|
selected_server="${server_map[$choice]}"
|
||||||
if [[ -z $choice ]] || [[ ${choice} == "null" ]]; then
|
echo "Connexion à $selected_server..."
|
||||||
echo "Veuillez sélectionner un serveur auquel vous connecter :"
|
if [ -z "$server_authkey" ]; then
|
||||||
fi
|
ttyrec -z --"$ip"-"$server_user"-- -k 300 --warn-before-kill 60 -- ssh -p "$(echo "$selected_server" | cut -d ' ' -f 2)" "$(echo "$selected_server" | cut -d ' ' -f 3)"@"$(echo "$selected_server" | cut -d ' ' -f 1)"
|
||||||
|
else
|
||||||
counter=0
|
cp -a /"$AUTHORIZED_SERVERS_PATH"/"$(echo "$selected_server" | cut -d ' ' -f 4)" /home/"$(whoami)"/"$(echo "$selected_server" | cut -d ' ' -f 4)"
|
||||||
declare -A server_map
|
chown "$(whoami)":"$(whoami)" /home/"$(whoami)"/"$(echo "$selected_server" | cut -d ' ' -f 4)"
|
||||||
while read -r line; do
|
chmod 600 /home/"$(whoami)"/"$(echo "$selected_server" | cut -d ' ' -f 4)"
|
||||||
ip=$(echo "${line}" | cut -d ' ' -f 1)
|
ttyrec -z --"$ip"-"$server_user"-- -k 300 --warn-before-kill 60 -- ssh -p "$(echo "$selected_server" | cut -d ' ' -f 2)" -i /home/"$(whoami)"/"$(echo "$selected_server" | cut -d ' ' -f 4)" "$(echo "$selected_server" | cut -d ' ' -f 3)"@"$(echo "$selected_server" | cut -d ' ' -f 1)"
|
||||||
port=$(echo "${line}" | cut -d ' ' -f 2)
|
rm -rf /home/"${CONNECTED_USER:?}"/"$(echo "$selected_server" | cut -d ' ' -f 4)"
|
||||||
custom_name=$(echo "${line}" | cut -d ' ' -f 3)
|
fi
|
||||||
server_user=$(echo "${line}" | cut -d ' ' -f 4)
|
|
||||||
server_authmethod=$(echo "${line}" | cut -d ' ' -f 6)
|
|
||||||
server_auth=$(echo "${line}" | cut -d ' ' -f 7)
|
|
||||||
server_map[${counter}]="${ip} ${port} ${server_user} ${server_authmethod} ${server_auth} ${custom_name}"
|
|
||||||
if [[ -z $choice ]] || [[ ${choice} == "null" ]]; then
|
|
||||||
echo "${counter}) ${custom_name} - ${server_user} ${ip}:${port}"
|
|
||||||
fi
|
|
||||||
counter=$((counter + 1))
|
|
||||||
done <<<"${USER_SERVERS}"
|
|
||||||
|
|
||||||
if [[ -z $choice ]] || [[ ${choice} == "null" ]]; then
|
|
||||||
echo "${counter}) Tapez 'quit' ou ${counter} pour vous déconnecter."
|
|
||||||
echo "f) Tapez 'f'<nom de l'hote> pour filtrer les entrées."
|
|
||||||
|
|
||||||
read -r -p "Votre choix (0-${counter}) : " choice
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ${choice} == "quit" ]] || [[ ${choice} == "${counter}" ]]; then
|
|
||||||
echo "Déconnexion du bastion."
|
|
||||||
exit 0
|
|
||||||
elif [[ $(echo "${choice}" | cut -c1-1) == "f" ]]; then
|
|
||||||
filter=$(echo "${choice}" | cut -c2-)
|
|
||||||
find_counter=0
|
|
||||||
echo "=====Résultats du filtre====="
|
|
||||||
for host in $(printf '%s\n' "${server_map[@]}" | tac | cut -d " " -f 6); do
|
|
||||||
if [[ $(echo "${host}" | awk '{print $(NF)}' | grep -m 1 -o "${filter}" | head -1) == $(echo "${filter}") ]]; then
|
|
||||||
echo "${find_counter}) $(echo ${server_map[${find_counter}]} | awk '{print $(NF)}') - $(echo ${server_map[${find_counter}]} | cut -d ' ' -f 3) $(echo ${server_map[${find_counter}]} | cut -d ' ' -f 1):$(echo ${server_map[${find_counter}]} | cut -d ' ' -f 2)"
|
|
||||||
fi
|
|
||||||
find_counter=$((find_counter + 1))
|
|
||||||
done
|
|
||||||
read -r -p "Votre choix (0-${counter}) : " choice
|
|
||||||
elif [[ -z ${choice} ]] || [[ -z ${server_map[${choice}]} ]]; then
|
|
||||||
echo "Sélection invalide."
|
|
||||||
choice="null"
|
|
||||||
else
|
|
||||||
clear
|
|
||||||
local selected_server
|
|
||||||
selected_server="${server_map[${choice}]}"
|
|
||||||
echo "Connexion à $(echo "${selected_server}" | cut -d " " -f -3)..."
|
|
||||||
if [[ -z "$(echo "${selected_server}" | cut -d ' ' -f 4)" ]]; then
|
|
||||||
ttyrec -z --"$(echo "${selected_server}" | cut -d ' ' -f 1)"-"$(echo "${selected_server}" | cut -d ' ' -f 3)"-- -k 300 --warn-before-kill 60 -- ssh -o StrictHostKeyChecking=accept-new -p "$(echo "${selected_server}" | cut -d ' ' -f 2)" "$(echo "${selected_server}" | cut -d ' ' -f 3)"@"$(echo "${selected_server}" | cut -d ' ' -f 1)"
|
|
||||||
elif [[ "$(echo "${selected_server}" | cut -d ' ' -f 4)" == "key" ]] && [[ -f /"${AUTHORIZED_SERVERS_PATH}"/"$(echo "${selected_server}" | cut -d ' ' -f 5)" ]]; then
|
|
||||||
eval "$(ssh-agent)" >/dev/null
|
|
||||||
trap 'kill $SSH_AGENT_PID' EXIT
|
|
||||||
cat /"${AUTHORIZED_SERVERS_PATH}"/"$(echo "${selected_server}" | cut -d ' ' -f 5)" | ssh-add - >/dev/null
|
|
||||||
ttyrec -z --"$(echo "${selected_server}" | cut -d ' ' -f 1)"-"$(echo "${selected_server}" | cut -d ' ' -f 3)"-- -k 300 --warn-before-kill 60 -- ssh -o StrictHostKeyChecking=accept-new -p "$(echo "${selected_server}" | cut -d ' ' -f 2)" "$(echo "${selected_server}" | cut -d ' ' -f 3)"@"$(echo "${selected_server}" | cut -d ' ' -f 1)"
|
|
||||||
ssh-add -D >/dev/null
|
|
||||||
elif [[ "$(echo "${selected_server}" | cut -d ' ' -f 4)" == "password" ]] && [[ -f /"${AUTHORIZED_SERVERS_PATH}"/"$(echo "${selected_server}" | cut -d ' ' -f 5)" ]]; then
|
|
||||||
local ssh_password
|
|
||||||
ssh_password=$(cat /"${AUTHORIZED_SERVERS_PATH}"/"$(echo "${selected_server}" | cut -d ' ' -f 5)")
|
|
||||||
ttyrec -z --"$(echo "${selected_server}" | cut -d ' ' -f 1)"-"$(echo "${selected_server}" | cut -d ' ' -f 3)"-- -k 300 --warn-before-kill 60 -- sshpass -p "${ssh_password}" ssh -o StrictHostKeyChecking=accept-new -p "$(echo "${selected_server}" | cut -d ' ' -f 2)" "$(echo "${selected_server}" | cut -d ' ' -f 3)"@"$(echo "${selected_server}" | cut -d ' ' -f 1)"
|
|
||||||
unset ssh_password
|
|
||||||
else
|
|
||||||
echo -e "Un problème de configuration a été détecté sur \nles options de connexion à l'hôte selectionné.\nVeuillez contacter votre administrateur."
|
|
||||||
fi
|
|
||||||
choice="null"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
while true; do
|
|
||||||
main_menu
|
|
||||||
clear
|
|
||||||
done
|
|
||||||
|
|||||||
20
ssh-launcher.sh
Normal file
20
ssh-launcher.sh
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Vérifier si le service SSH est en cours d'exécution
|
||||||
|
ssh_pid=$(pgrep sshd)
|
||||||
|
|
||||||
|
if [ ! -z "$ssh_pid" ]; then
|
||||||
|
echo "Le service SSH est en cours d'exécution."
|
||||||
|
else
|
||||||
|
echo "Le service SSH n'est pas en cours d'exécution. Tentative de démarrage..."
|
||||||
|
sudo service ssh start
|
||||||
|
|
||||||
|
# Vérifier à nouveau si SSH est en cours d'exécution
|
||||||
|
ssh_pid=$(pgrep sshd)
|
||||||
|
if [ ! -z "$ssh_pid" ]; then
|
||||||
|
echo "Le service SSH a été démarré avec succès."
|
||||||
|
else
|
||||||
|
echo "Échec du démarrage du service SSH. Veuillez vérifier les logs pour plus de détails."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
18
sshd_config
18
sshd_config
@ -83,6 +83,7 @@ ChallengeResponseAuthentication no
|
|||||||
# If you just want the PAM account and session checks to run without
|
# If you just want the PAM account and session checks to run without
|
||||||
# PAM authentication, then enable this but set PasswordAuthentication
|
# PAM authentication, then enable this but set PasswordAuthentication
|
||||||
# and ChallengeResponseAuthentication to 'no'.
|
# and ChallengeResponseAuthentication to 'no'.
|
||||||
|
UsePAM yes
|
||||||
|
|
||||||
#AllowAgentForwarding yes
|
#AllowAgentForwarding yes
|
||||||
#AllowTcpForwarding yes
|
#AllowTcpForwarding yes
|
||||||
@ -126,18 +127,15 @@ AcceptEnv LANG LC_*
|
|||||||
|
|
||||||
#Order by preference
|
#Order by preference
|
||||||
HostKey /etc/ssh/ssh_host_ed25519_key
|
HostKey /etc/ssh/ssh_host_ed25519_key
|
||||||
|
HostKey /etc/ssh/ssh_host_ecdsa_key
|
||||||
HostKey /etc/ssh/ssh_host_rsa_key
|
HostKey /etc/ssh/ssh_host_rsa_key
|
||||||
|
|
||||||
#Logging
|
#Logging
|
||||||
SyslogFacility AUTH
|
|
||||||
LogLevel VERBOSE
|
LogLevel VERBOSE
|
||||||
|
|
||||||
#Authentication settings
|
#Authentication settings
|
||||||
PermitRootLogin no
|
PermitRootLogin no
|
||||||
MaxAuthTries 6
|
MaxAuthTries 6
|
||||||
MaxSessions 6
|
|
||||||
MaxStartups 4:50:8
|
|
||||||
PerSourceMaxStartups 2
|
|
||||||
PermitEmptyPasswords no
|
PermitEmptyPasswords no
|
||||||
|
|
||||||
#Forwaring settings
|
#Forwaring settings
|
||||||
@ -153,25 +151,23 @@ Banner /root/scripts/monosphere_banner.txt
|
|||||||
Subsystem sftp /usr/lib/ssh/sftp-server -f AUTHPRIV -l INFO
|
Subsystem sftp /usr/lib/ssh/sftp-server -f AUTHPRIV -l INFO
|
||||||
|
|
||||||
#Kex accepted protocols
|
#Kex accepted protocols
|
||||||
kexalgorithms sntrup761x25519-sha512@openssh.com,curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512
|
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
|
||||||
|
|
||||||
#Accepted ciphers
|
#Accepted ciphers
|
||||||
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
|
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
|
||||||
|
|
||||||
#Accepted MACs
|
#Accepted MACs
|
||||||
MACs umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com
|
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com
|
||||||
|
|
||||||
|
#Accepted public key types
|
||||||
|
#PubkeyAcceptedKeyTypes sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,sk-ssh-ed25519-cert-v01@openssh.com,sk-ecdsa-sha2-nistp256@openssh.com
|
||||||
|
|
||||||
#Per user basis settings
|
#Per user basis settings
|
||||||
AllowStreamLocalForwarding no
|
AllowStreamLocalForwarding no
|
||||||
Match Group bastionuser
|
Match Group bastionuser
|
||||||
ForceCommand /opt/public/scripts/server_menu.sh
|
ForceCommand /opt/public/scripts/server_menu.sh
|
||||||
X11Forwarding no
|
X11Forwarding no
|
||||||
Match Group bastionadmin
|
|
||||||
ForceCommand /opt/public/scripts/admin_menu.sh
|
|
||||||
X11Forwarding no
|
|
||||||
# End the 'Match' block
|
# End the 'Match' block
|
||||||
Match all
|
Match all
|
||||||
ForceCommand echo -e "===========================================================\nSorry, you re not part of the bastion s users or administrators and have therefore no access.\nPlease contact your administrator for further informations.\n==========================================================="; exit
|
|
||||||
X11Forwarding no
|
|
||||||
|
|
||||||
#Used port number
|
#Used port number
|
||||||
|
|||||||
@ -1,4 +0,0 @@
|
|||||||
# Format: server_custom_name user1,user2,...
|
|
||||||
# Les utilisateurs listés peuvent transferer des fichiers vers ces serveurs.
|
|
||||||
# Si le fichier n'existe pas, tous les utilisateurs autorises (via authorized_servers.txt) peuvent transferer.
|
|
||||||
# example-fake-server bastion
|
|
||||||
Loading…
x
Reference in New Issue
Block a user