Passage sous Alpine 3.20, optimisation de l'image, ajout multi build stages, retrait de configuration obsolètes et corrections de bug.
This commit is contained in:
parent
45358bcd75
commit
faea3b5703
112
Dockerfile
112
Dockerfile
@ -1,77 +1,89 @@
|
||||
FROM ubuntu:22.04
|
||||
FROM alpine:3.20.0 AS monosphere-builder
|
||||
#~The open Monosphere Project~
|
||||
#Version : 1.0
|
||||
#Version : 0.5.3
|
||||
#Autor : Siphonight :)
|
||||
|
||||
#Defining variables and build settings
|
||||
WORKDIR /
|
||||
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"
|
||||
ARG MONOSPHERE_VERSION="0.5.3 Alpha"
|
||||
|
||||
|
||||
#Preparations
|
||||
#Updating and installing required dependencies ;
|
||||
#reation and configuration of the Monosphere scripts directory ;
|
||||
RUN apt update -y && apt upgrade -y && \
|
||||
apt install -y ssh gawk anacron git make gcc sudo && \
|
||||
mkdir /root/scripts && \
|
||||
mkdir /root/scripts/users
|
||||
#Defining build settings
|
||||
WORKDIR /
|
||||
USER root
|
||||
|
||||
|
||||
#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
|
||||
#Updating and installing required dependencies
|
||||
RUN apk add make git gcc alpine-sdk && \
|
||||
addgroup root abuild && \
|
||||
mkdir -p /var/cache/distfiles && \
|
||||
chmod a+w /var/cache/distfiles
|
||||
|
||||
|
||||
#Installing OVH-ttyrec
|
||||
RUN cd /root/ && \
|
||||
git clone https://github.com/ovh/ovh-ttyrec.git && \
|
||||
cd /root/ovh-ttyrec && \
|
||||
./configure && make && \
|
||||
./configure && \
|
||||
make && \
|
||||
make install
|
||||
|
||||
|
||||
#Disabling default Ubuntu MOTD
|
||||
RUN rm -rf /etc/update-motd.d/*
|
||||
#Starting bastion configurations
|
||||
#Configuring monosphere ssh banner
|
||||
ADD monosphere_banner.txt /root/scripts/
|
||||
RUN echo "Monosphere version is $MONOSPHERE_VERSION" >> /root/scripts/monosphere_banner.txt
|
||||
|
||||
|
||||
#Port exposition
|
||||
#==============final container==============#
|
||||
FROM alpine:3.20.0
|
||||
|
||||
|
||||
#Defining build settings
|
||||
WORKDIR /
|
||||
USER root
|
||||
|
||||
|
||||
#Preparations
|
||||
#Updating and installing required dependencies
|
||||
RUN apk add openssh-server openssh-client sudo openrc bash && \
|
||||
apk --no-cache add shadow
|
||||
|
||||
|
||||
#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 authorized_servers.txt /opt/public/servers/
|
||||
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
|
||||
|
||||
|
||||
#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
|
||||
|
||||
|
||||
#Issuing start entrypoint
|
||||
CMD ["/bin/bash", "/root/scripts/entrypoint.sh"]
|
||||
CMD ["/bin/sh", "/root/scripts/entrypoint.sh"]
|
||||
|
||||
32
README.md
32
README.md
@ -1,8 +1,11 @@
|
||||
# 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)
|
||||
- [Fonctionnalités du bastion](#fonctionnalités-du-bastion)
|
||||
- [Pourquoi choisir ce bastion ?](#pourquoi-choisir-ce-bastion)
|
||||
- [Objectifs des mises à jour](#objectifs-des-mises-à-jour)
|
||||
- [Installation](#installation)
|
||||
- [Utilisation](#utilisation)
|
||||
@ -23,15 +26,29 @@ Le projet Monosphere Bastion est un bastion SSH simple et sécurisé basé sur U
|
||||
- [Sécurisation](#sécurisation)
|
||||
- [License](#license)
|
||||
|
||||
## 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 (le support pour la connexion automatisée en mot de passe est prévu.)
|
||||
- Sessions enregistrées et visionnables par les utilisateurs internes du bastion.
|
||||
- Support pour l'execution de scripts personalisés au lancement du conteneur.
|
||||
|
||||
## Pourquoi choisir ce bastion ?
|
||||
- Le bastion Monosphere est entièrement écrit en bash avec un code lisible et facilement compréhensible.
|
||||
- Cette charatéristique lui permet de rester très personnalisable et accessible tout en gardant 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, seulement le support du protocole SSH classique.
|
||||
- Il est de ce fait parfait pour de petits et moyens projets, comme pour des homelab par exemple.
|
||||
|
||||
## Objectifs des mises à jour
|
||||
Ci dessous une liste non exaustive 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 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é.
|
||||
- [ ] Ajouter un système de mise à jour automatique dans le conteneur, évitant ainsi les redéploiements.
|
||||
- [x] Ajouter un support pour des ports autres que 22 sur les machines distantes.
|
||||
- [X] Réduire le nombre de layers dans le Dockerfile.
|
||||
- [x] Changer l'image de base pour Ubuntu 22.04.
|
||||
- [x] Changer l'image de base pour Debian Bookworm Slim (merci à @Ouafax pour l'idée).
|
||||
- [x] Optimisation de l'image par un buil multi stage (merci à @Ouafax pour l'idée).
|
||||
- [x] Ajouter le support pour différents utilisateurs distants.
|
||||
- [x] Intégration de ttyrec pour la sauvegarde des sessions effectuées sur le bastion.
|
||||
|
||||
@ -252,7 +269,7 @@ Ce fichier devra avoir la syntaxe suivante pour chacune de ses lignes :
|
||||
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.
|
||||
- **<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. 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 "bastion" aura de ce fait pour mot de passe "bastion").
|
||||
- **<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.
|
||||
|
||||
|
||||
@ -405,7 +422,6 @@ La configuration du serveur SSH est définie dans le fichier **sshd_config**. Vo
|
||||
- **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.
|
||||
|
||||
|
||||
|
||||
@ -1,2 +1 @@
|
||||
USERNAME;BASTION_LIMITED;PASSWORD/0;USEKEYS/0
|
||||
bastion;1;bastion;0
|
||||
bastion;0;bastion;0
|
||||
@ -1,8 +1,4 @@
|
||||
#!/bin/bash
|
||||
hostname "${HOSTNAME}"
|
||||
echo "Monosphere anacron scheduler is starting..."
|
||||
service anacron start
|
||||
echo "Monosphere anacron scheduler is successfully started"
|
||||
|
||||
echo "Monosphere sshd service daemon is verifying its configuration..."
|
||||
echo "Port ${PORT}" >> /etc/ssh/sshd_config
|
||||
@ -20,18 +16,6 @@ fi
|
||||
sshd -t
|
||||
echo "Monosphere sshd service daemon configuration verified"
|
||||
|
||||
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
|
||||
chmod 700 /opt/custom/scripts/*.sh
|
||||
@ -46,7 +30,7 @@ echo "Monosphere public directory successfully configured"
|
||||
#User accounts creation step
|
||||
|
||||
if ! grep -q "bastionuser" /etc/group; then
|
||||
groupadd bastionuser
|
||||
addgroup bastionuser
|
||||
fi
|
||||
|
||||
if [ ! -f "/root/scripts/users/bastion_users.txt" ]; then
|
||||
@ -69,11 +53,13 @@ else
|
||||
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
|
||||
echo "$user ALL=(ALL) NOPASSWD: /bin/ls*" | sudo EDITOR='tee -a' visudo
|
||||
fi
|
||||
|
||||
if [ "$password" != "0" ]; then
|
||||
echo "$user:$password" | chpasswd
|
||||
else
|
||||
echo "$user:$user" | chpasswd
|
||||
fi
|
||||
|
||||
if [ "$setkeys" -eq "1" ]; then
|
||||
@ -87,6 +73,11 @@ else
|
||||
fi
|
||||
echo "Monosphere user creation is finished"
|
||||
|
||||
echo "Monosphere sshd service daemon is starting..."
|
||||
rc-status
|
||||
rc-service sshd start
|
||||
echo "Monosphere sshd service daemon is successfully started"
|
||||
|
||||
echo "Monosphere bastion is successfully started"
|
||||
|
||||
# Keep the container running
|
||||
|
||||
@ -35,11 +35,11 @@ fi
|
||||
selected_server="${server_map[$choice]}"
|
||||
echo "Connexion à $selected_server..."
|
||||
if [ -z "$server_authkey" ]; then
|
||||
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)"
|
||||
ttyrec -z --"$(echo "$selected_server" | cut -d ' ' -f 1)"-"$(echo "$selected_server" | cut -d ' ' -f 3)"-- -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
|
||||
cp -a /"$AUTHORIZED_SERVERS_PATH"/"$(echo "$selected_server" | cut -d ' ' -f 4)" /home/"$(whoami)"/"$(echo "$selected_server" | cut -d ' ' -f 4)"
|
||||
cp /"$AUTHORIZED_SERVERS_PATH"/"$(echo "$selected_server" | cut -d ' ' -f 4)" /home/"$(whoami)"/"$(echo "$selected_server" | cut -d ' ' -f 4)"
|
||||
chown "$(whoami)":"$(whoami)" /home/"$(whoami)"/"$(echo "$selected_server" | cut -d ' ' -f 4)"
|
||||
chmod 600 /home/"$(whoami)"/"$(echo "$selected_server" | cut -d ' ' -f 4)"
|
||||
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)"
|
||||
ttyrec -z --"$(echo "$selected_server" | cut -d ' ' -f 1)"-"$(echo "$selected_server" | cut -d ' ' -f 3)"-- -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)"
|
||||
rm -rf /home/"${CONNECTED_USER:?}"/"$(echo "$selected_server" | cut -d ' ' -f 4)"
|
||||
fi
|
||||
|
||||
@ -1,20 +0,0 @@
|
||||
#!/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
|
||||
|
||||
@ -83,7 +83,6 @@ ChallengeResponseAuthentication no
|
||||
# If you just want the PAM account and session checks to run without
|
||||
# PAM authentication, then enable this but set PasswordAuthentication
|
||||
# and ChallengeResponseAuthentication to 'no'.
|
||||
UsePAM yes
|
||||
|
||||
#AllowAgentForwarding yes
|
||||
#AllowTcpForwarding yes
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user