diff --git a/README.md b/README.md index a9148e1..fdab82f 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ Nota: En determinadas versiones, las actualizaciones a partir de los repositorio #### Inicialización de configuración GPG -Como un requisito de nuestra plataforma, todos los desarrolladores deberán contar, por lo menos, con una clave GPG, que se utilizará para firmar o decifrar archivos, correos u otros. Esto se hará con el uso del comando gpgp que ya debió ser instalado con la ejecución de bin/boostrap.sh. +Como un requisito de nuestra plataforma, todos los desarrolladores deberán contar, por lo menos, con una clave GPG, que se utilizará para firmar o decifrar archivos, correos u otros. Esto se hará con el uso del comando gpg (previamente instalado con la ejecución de bin/boostrap.sh). En este paso estableceremos la configuración por defecto de GPG: diff --git a/bin/bootstrap.sh b/bin/bootstrap.sh index c9ff08d..27f69bc 100755 --- a/bin/bootstrap.sh +++ b/bin/bootstrap.sh @@ -56,6 +56,8 @@ install() { local DIALOG_PACKAGE=dialog local SOPS_PACKAGE=sops local GNUPG_PACKAGE=gnupg + local SQLITE_COMMAND=sqlite3 + local SQLITE_PACKAGE="$SQLITE_COMMAND libsqlite3-dev" # Load base bash library source $BIN_PATH/$LIBRARY/base.lib @@ -101,6 +103,13 @@ install() { os_pkgs_install $DIALOG_PACKAGE fi + # Install sqlite3 from OS Packages + command_installed $SQLITE_COMMAND + if [ $? -ne 0 ] + then + os_pkgs_install $SQLITE_PACKAGE + fi + # Install python from OS Packages command_installed $PYTHON_PACKAGE if [ $? -ne 0 ] diff --git a/bin/config/devspath.dat b/bin/config/devspath.dat new file mode 100644 index 0000000..2abc48c --- /dev/null +++ b/bin/config/devspath.dat @@ -0,0 +1 @@ +devs diff --git a/bin/config/gpg.backup b/bin/config/gpg.backup new file mode 100644 index 0000000..d010e2a --- /dev/null +++ b/bin/config/gpg.backup @@ -0,0 +1 @@ +secure/backups diff --git a/bin/config/packages.dat b/bin/config/packages.dat new file mode 100644 index 0000000..0ec9d37 --- /dev/null +++ b/bin/config/packages.dat @@ -0,0 +1,17 @@ +gh +gnupg2 +iftop +imagemagick +iperf +jq +lsof +mutt +net-tools +nmap +paperkey +pipx +python3-pip +python3-gitlab +remmina +terminator +wireshark diff --git a/bin/gpg_backup.sh b/bin/gpg_backup.sh new file mode 100755 index 0000000..2bba6d2 --- /dev/null +++ b/bin/gpg_backup.sh @@ -0,0 +1,129 @@ +#!/bin/bash +# +# gpg_backup.sh +# Modified: 2024/12/09 10:27:00 +# Derechos de Autor (C) [2024] [Mauro Rosero P. ] +# +# Este programa es software libre: usted puede redistribuirlo y/o modificarlo +# bajo los términos de la Licencia Pública Affero General de GNU tal como +# lo publica la Free Software Foundation, ya sea la versión 3 de la licencia, +# o (a su elección) cualquier versión posterior. +# +# Este programa se distribuye con la esperanza de que sea útil, +# pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de +# COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte la +# Licencia Pública Affero General de GNU para obtener más detalles. +# +# Debería haber recibido una copia de la Licencia Pública Affero General +# junto con este programa. Si no la recibió, consulte . + +DEVSPATH=devs +BIN_HOME=$HOME/$DEVSPATH +BIN_MESG=bin/msg +BIN_LIBS=bin/lib + +# CHECK SHELL LANGUAGE +BIN_LANG=${LANG:0:2} + +# LOAD BASE BASH LIBRARY +source $BIN_HOME/$BIN_LIBS/base.lib +#baselib_test + +# LOAD CONSOLE BASH LIBRARY +source $BIN_HOME/$BIN_LIBS/console.lib +#consolelib_test + +# LOAD SQLITE3 BASH LIBRARY +source $BIN_HOME/$BIN_LIBS/sqlite.lib +#sqlitelib_test + +# LOAD GPG BASH LIBRARY +source $BIN_HOME/$BIN_LIBS/gpg.lib +#gpglib_test + +# Load head messages +load_messages $BIN_HOME $BIN_MESG $BIN_LANG "head" + +# Load gpg messages +load_messages $BIN_HOME $BIN_MESG $BIN_LANG "gpg" + + + +########### MAIN PROGRAM ########### + +# Set program title +title="$head_000 $head_002" +apps_title="${gpmsg_001}" + +# Check if dialog is not installed, exited! +command_installed "dialog" +if [ $? -ne 0 ] +then + display_devstools_header "${gpmsg_001}" + echo "${head_001}" + exit 200 +fi + +# Check if os is valid! +get_osname +if [ "${os_name}" == "${head_unknow}" ] +then + dialog_error_box "${head_error}" "${head_os_error}" + exit 3 +fi + +# Backup de claves GPG +dialog_yesno "${gpmsg_105}" +case ${result} in + 0) + gpg_backup "PASSWORD" "$DB_GPG_PATH/$DB_GPG_FILE" "$BIN_HOME/$GPG_CONFIG_PATH" "$DATEBAK" + rc=$? + case $rc in + 0) + dialog_error_box "${head_info}" "${gpmsg_106}" + clear + exit 0 + ;; + 10) + dialog_error_box "${head_error}" "${gpmsg_107}" + clear + exit $rc + ;; + 11) + dialog_error_box "${head_error}" "${gpmsg_108}" + clear + exit $rc + ;; + 13) + dialog_error_box "${head_error}" "${gpmsg_109}" + clear + exit $rc + ;; + 14) + dialog_error_box "${head_error}" "${gpmsg_111}" + clear + exit $rc + ;; + 15) + dialog_error_box "${head_error}" "${gpmsg_112}" + clear + exit $rc + ;; + 18) + dialog_error_box "${head_error}" "${gpmsg_110}" + clear + exit $rc + ;; + *) + dialog_error_box "${head_error}" "${head_op_error} (${rc})" + exi $rc + ;; + esac + ;; + *) + dialog_error_box "${head_error}" "${head_op_error}" + ;; +esac + +# End Main Program +clear diff --git a/bin/lib/gpg.lib b/bin/lib/gpg.lib index 90b8871..bf39176 100644 --- a/bin/lib/gpg.lib +++ b/bin/lib/gpg.lib @@ -17,15 +17,20 @@ # Debería haber recibido una copia de la Licencia Pública Affero General # junto con este programa. Si no la recibió, consulte . -GPG_DEFAULT_PATH=~/.gnupg -GPG_CFG_PATH=bin/config +GPG_DEFAULT_PATH=$HOME/.gnupg +GPG_CONFIG_PATH=bin/config GPG_TEMPLATE=gpg.config GPG_CONFIG=gpg.conf +GPG_BACKUP_CFG=gpg.backup GPG_SUBKEY_ID="" +GPG_REVOKE_FILES="*.rev" + +DB_GPG_PATH=$HOME/.gnupg +DB_GPG_FILE=$USER.db DB_GPG_SUBKEYS_KEY="subkey_id" DB_GPG_SUBKEYS="GPG_SUBKEYS" -DF_GPG_SUBKEYS="${DB_GPG_SUBKEYS}.sql" -REVOKE_FILES="*.rev" +SQL_GPG_SUBKEYS="${DB_GPG_SUBKEYS}.sql" + # Test library function gpglib_test() { @@ -36,42 +41,127 @@ function gpglib_test() { # Set gpg environment function gpg_setting() { - local BIN_CONFIG=$1 - local GPG_PATH=$2 - local LOCAL_BACKUP=$3 - local TIMESTAMP=$4 + local BIN_CONFIG=$1 + local GPG_PATH=$2 + local LOCAL_BACKUP=$3 + local TIMESTAMP=$4 - # Check if gpg directory path exists - if [ ! -d "${GPG_PATH}" ] - then - # Create gpg directory path - mkdir -p ${GPG_PATH} - if [ $? -ne 0 ]; then - return 2 - fi + # Check if gpg directory path exists + if [ ! -d "${GPG_PATH}" ] + then + # Create gpg directory path + mkdir -p ${GPG_PATH} + if [ $? -ne 0 ]; then + return 2 fi + fi - # Check if gpg template file exists - if [ ! -f "${BIN_CONFIG}/${GPG_CFG_PATH}/${GPG_TEMPLATE}" ] - then - return 1 - fi + # Check if gpg template file exists + if [ ! -f "${BIN_CONFIG}/${GPG_CFG_PATH}/${GPG_TEMPLATE}" ] + then + return 1 + fi - if [ -d "${LOCAL_BACKUP}" ] + if [ -d "${LOCAL_BACKUP}" ] + then + if [ -f "${GPG_PATH}/${GPG_CONFIG}" ] then - if [ -f "${GPG_PATH}/${GPG_CONFIG}" ] - then - # Destination file backup - local BACKUP_FILE="${LOCAL_BACKUP}/gpg${TIMESTAMP}.bak" - cp -f "${GPG_PATH}/${GPG_CONFIG}" "${BACKUP_FILE}" - if [ $? -ne 0 ]; then - return 3 - fi + # Destination file backup + local BACKUP_FILE="${LOCAL_BACKUP}/gpg_${TIMESTAMP}.bak" + cp -f "${GPG_PATH}/${GPG_CONFIG}" "${BACKUP_FILE}" + if [ $? -ne 0 ]; then + return 3 fi fi + fi - # Copia el archivo de plantilla al destino - cp -f "${BIN_CONFIG}/${GPG_CFG_PATH}/${GPG_TEMPLATE}" "${GPG_PATH}/${GPG_CONFIG}" - return $? + # Copia el archivo de plantilla al destino + cp -f "${BIN_CONFIG}/${GPG_CFG_PATH}/${GPG_TEMPLATE}" "${GPG_PATH}/${GPG_CONFIG}" + return $? + +} + +# Local backup of gpp keys +function gpg_backup() { + + local ZPASSWORD=$1 + local DB_BACKUP=$2 + local BIN_CONFIG=$3 + local TIMESTAMP=$4 + local rc=0 + + # Check if backup configuration file exists + if [ ! -f $BIN_CONFIG/$GPG_BACKUP_CFG ] + then + return 10 + fi + + local LOCAL_BACKUP=$HOME/$(cat < $BIN_CONFIG/$GPG_BACKUP_CFG) + + # Check if backup path exist + if [ -z "$LOCAL_BACKUP" ]; then + return 11 + fi + + if [ ! -d "${LOCAL_BACKUP}" ] + then + mkdir -p "${LOCAL_BACKUP}" + rc=$? + if [ $rc -ne 0 ]; then + return $rc + fi + fi + + # Verificar que la contraseña no este en blanco + if [ -z "${ZPASSWORD}" ]; then + return 13 + fi + + # Exportar el anillo de claves GPG a un archivo de respaldo temporal + local TMP_PATH=$(mktemp -d) + local TMP_FILE="gpg.bak" + gpg --export-options backup -o "${TMP_PATH}/${TMP_FILE}" --export + rc=$? + if [ $rc -ne 0 ]; then + rm -rf "${tmp_path}" + return $rc + fi + + # Dump GPG_SUBKEYS table to SQL + local TMP_DB_DUMP="${SQL_GPG_SUBKEYS}" + local DB_DUMP="${TMP_PATH}/${TMP_DB_DUMP}" + sqlite_dump "${DB_BACKUP}" "${DB_DUMP}" "${DB_GPG_SUBKEYS}" + rc=$? + if [ ${rc} -ne 0 ] + then + rm -rf "${TMP_PATH}" + return $rc + fi + + # Copiar los archivos de revocación + local REVOKE_PATH="${GNUPGHOME:-$GPG_DEFAULT_PATH}/openpgp-revocs.d" + cp -rf "${REVOKE_PATH}"/${GPG_REVOKE_FILES} "${TMP_PATH}/" + rc=$? + if [ $rc -ne 0 ] + then + rm -rf "${TMP_PATH}" + return $rc + fi + + # Cambiar el directorio de trabajo a la carpeta temporal para poder hacer el empaquetamiento zip + cd "${TMP_PATH}" + + # Comprimir el archivo de respaldo en un archivo ZIP protegido con contraseña + BACKUP_FILE="${LOCAL_BACKUP}/gpg_${USER}_${TIMESTAMP}" + zip -r -P "${ZPASSWORD}" $BACKUP_FILE * + rc=$? + if [ $rc -ne 0 ] + then + rm -rf "${TMP_PATH}" + return $rc + fi + + rm -rf "${TMP_PATH}" + return 0 } diff --git a/bin/lib/sqlite.lib b/bin/lib/sqlite.lib new file mode 100644 index 0000000..c3c9368 --- /dev/null +++ b/bin/lib/sqlite.lib @@ -0,0 +1,95 @@ +#!/bin/bash +# +# Library: sqlite.lib +# Modified: 2024/12/09 08:20:00 +# Derechos de Autor (C) [2024] [Mauro Rosero P. ] +# +# Este programa es software libre: usted puede redistribuirlo y/o modificarlo +# bajo los términos de la Licencia Pública Affero General de GNU tal como +# lo publica la Free Software Foundation, ya sea la versión 3 de la licencia, +# o (a su elección) cualquier versión posterior. +# +# Este programa se distribuye con la esperanza de que sea útil, +# pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de +# COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte la +# Licencia Pública Affero General de GNU para obtener más detalles. +# +# Debería haber recibido una copia de la Licencia Pública Affero General +# junto con este programa. Si no la recibió, consulte . + + +DB_LOADED=1 +DB_PATH=dbfiles +DB_USER=${USER}.db + +# Test library +function sqlitelib_test() { + echo "Sqlite Library loaded!" + exit 1 +} + +# Export selected sqlite tables +# Arguments: +# $1: Database file +# $2: Dump tables file +# $3...: Tables list to dump +# Example Use: +# sqlite_export "my_database.db" "output.sql" "table1" "table2" +# To export all tables, use: +# sqlite_export "my_database.db" "output.sql" + +function sqlite_dump() { + + local DATABASE=$1 + local DUMP_FILE=$2 + + shift 2 + local TABLES_LIST=("$@") + local rc=0 + + # Check if database exists + if [ -z "$DATABASE" ]; then + return 18 + fi + + if [ ! -f "$DATABASE" ]; then + return 14 + fi + + # Check not blank dump file name + if [ -z "$DUMP_FILE" ]; then + return 15 + fi + + if [ ${#TABLES_LIST[@]} -eq 0 ] + then + # If no tables are provided, dump all tables + sqlite3 "$DATABASE" .dump > $DUMP_FILE + rc=$? + if [ $rc -gt 1 ]; then + return $rc + else + return 0 + fi + fi + + # Reset dump file + > $DUMP_FILE + + for TABLE in "${TABLES_LIST[@]}" + do + # Check if table exists + EXIST=$(sqlite3 $DATABASE "SELECT name FROM sqlite_master WHERE type='table' AND name='$TABLE';") + + if [ "$EXIST" == "$TABLE" ]; then + sqlite3 "$DATABASE" .dump "$TABLE" >> "$DUMP_FILE" + rc=$? + if [ $rc -gt 1 ]; then + return $rc + fi + fi + done + + return 0 + +} diff --git a/bin/msg/gpg.es b/bin/msg/gpg.es index d07d3ad..39dcf2d 100644 --- a/bin/msg/gpg.es +++ b/bin/msg/gpg.es @@ -13,8 +13,17 @@ gpmsg_000="INICIALIZAR GPG" - +gpmsg_001="BACKUP GPG" gpmsg_101="Desea inicializar la configuración de GPG?" gpmsg_102="Inicialización de configuración GPG completada!" gpmsg_103="Plantilla de configuración GPG no existe!" +gpmsg_104="Desea realizar una copia de seguridad de GPG?" +gpmsg_105="Desea realizar copia de seguridad de las claves GPG?" +gpmsg_106="Copia de seguridad de claves GPG completada!" +gpmsg_107="Archivo de configuración GPG no fue encontrado!" +gpmsg_108="Carpeta de copia de seguridad local no existe" +gpmsg_109="Contraseña para encriptación del archivo ZIP no fue suministrada" +gpmsg_110="Base de Datos SQLITE3 no fue suministrada" +gpmsg_111="Archivo de Base de Datos SQLITE3 no existe!" +gpmsg_112="Carpeta temporal de Backup no fue suministrada"