#!/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 - Remplacer la ligne n" echo "i - Inserer apres la ligne n (0 = debut)" echo "d - 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 , i , d , 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