Menu

Home

Introducció

Un dels problemes que actualment tenim en l'execució de processos en lots és la necessitat de posar la contrasenya en text pla per realitzar diferents accions.

Aquest programari vol donar una solució al problema realitzant una ofuscació amb l'encriptació / desencriptació de les dades confidencials i substituint uns paràmetres establerts pel seu valor real al moment de realitzar la seva execució.

S'ha de diferenciar clarament els conceptes de ofuscació i permisos d'execució dels paràmetres utilizats per un programari en la seva execució:

  • ofuscació. Guarda els paràmetres confidencials de manera organitzada en un arxiu de configuració encriptat i els substitueix en el moment de la seva execució.
  • permisos d'execució. Estableix qui pot executar un programa a nivell de sistema operatiu. Si un usuari pot executar un programari on existeix ofuscació, el programa realizarà la seva tasca per ser executat, realitzant la substitució dels paràmetres ofuscats en el moment de l'execució.

El programari comandamentsSecuritat podrà realitzar l'ofuscació de de variables d'usuaris / contrasenyes / dades confidencials que s'han de substituir en el moment de realitzar l'execució d'un programa.

Només qui tingui permisos per executar el programa, ho podrà executar i realitzar la substitució dels paràmetres encriptats.

Quedarà afectat a la seguretat del sistema els permisos concedits a l'arxiu de configuració, si no es disposen de permisos per llegir el contingut de l'arxiu, no es podrà accedir als valors de les variables encriptades.

Un exemple d'aquesta problemàtica seria:

sqlplus system/contrasenya_system@instancia_oracle @script_executar

En aquest cas, podem veure la contrasenya en text pla i això pot posar en risc el servidor de base de dades.

Per evitar-ho podem utilitzar aquest programari i, com a exemple, transformar la crida a:

pyExecutaCmd sistemes oracle administrador sqlplus %usuari%/%contrasenya%@%instancia% @script_executar

El programa substituirà els valors de les variables %usuari%, %contrasenya% i %instancia% pels valors reals especificats en un arxiu de configuració encriptat en el moment de la seva execució.

En aquest exemple, per la creació de l'arxiu de configuració amb els paràmetres necessaris per l'execució, procedirem a executar:

pyGeneraEntrada -s sistemes -g oracle -e administrador -a sqlplus usuari=system contrasenya:contrasenya_system instancia:instancia_oracle

    -s sistemes: organitza l'entrada a comandaments de sistemes, com a exemple.

    -g oracle: organitza l'entrada de sistemes al grup d'oracle, com a exemple.

    -e administrador: organitzat en sistemes, grup d'oracle i l'entrada correspon a l'administrador, com a exemple.

    -a sqlplus: indica que només el programari SQLPLUS pot realitzar aquesta crida, qualsevol altre no tindrà permís.

Definició de les variables de substitució de l'exemple:

usuari. Usuari de la connexió; com s'ha especificat com usuari=system el valor system no va encriptat, però també es pot especificar com usuari:system, en aquest cas, el valor system s'encriptarà.

contrasenya. Contrasenya de la connexió, també es pot especificar com contrasenya=contrasenya_system, no recomenable per ser una dada confidencial.

instancia. Instància oracle de la connexió, també es pot especificar com instancia=instancia_oracle si no requereix encriptació.

L'arxiu de configuració de l'exemple s'haurà guardat de la següent manera::

[configuracio]
[sistemes]
    [[oracle]]
        [[[administrador]]]
        autoritzats = {CRYPT}xxxxx:{CRYPT}xxxxx,
        usuari = system
        contrasenya = {CRYPT}xxxxx
        instancia = {CRYPT}xxxxx``

Elements de programari

Els components del programari que formen part d'aquest servei està dividit en dos parts:

  • Programes que generen encriptació, aquests programes s'han de guardar en lloc segur i només utilitzar per generar entrades:

    • pyGeneraEntrada.py. Genera una entrada en l'arxiu de configuració.
    • pyEncrypta.py. Mostra l'encriptació d'una variable o programari autoritzat a ser executar.
    • pyActualitzaEmpremtes.py. Programa per realitzar l'arxiu de configuració per una actualització del programari que executa comandaments.
    • pyActualitzaClaus.py. Programa per realitzar un canvi de claus d'encriptació.
  • Programes que desencripten una entrada executar, aquests programes s'han d'instal·lar en els servidors que en fan ús:

    • pyExecutaCmd. Executa un comandament.
    • pyRetornaEntrada. Retorna el valor d'una variable de l'arxiu de configuració.
    • pyEncrypta. Mostra l'encriptació d'una variable o programari autoritzat a ser executar.
    • pyMissatgesError. Mostra la descripció d'un missatge d'error intern del programari.

Opcions de programari

Les opcions disponibles per cadascú del programari s'especifica a continuació.

pyGeneraEntrada.py

usage: pyGeneraEntrada.py: {opcions} {[variable=valor] | [variable:valor] | ...}.

Procés per encriptar els valors de variables a l'arxiu de configuració de manera organitzada a nivell de servei, grup i entrada.

arguments:

    -arguments   Arguments de configuració. Es pot especificar variable=valor [variable:valor] [variable=valor].
                L'assignació amb ':' es per guardar el valor encriptat en l'arxiu de configuració.

arguments opcionals:

-h, --help            show this help message and exit
-c CONFIGURACIO, --configuracio CONFIGURACIO
                    Arxiu amb el contingut de la configuració.
-s SERVEI, --servei SERVEI
                    Servei de provisió de contrasenyes, correspon a una agrupació funcional per gestionar els valors a encriptar.
-g GRUP, --grup GRUP  Grup de contrasenyes d'un mateix servei, correspon a una agrupació funcional per gestionar els valors a encriptar.
-e ENTRADA, --entrada ENTRADA
                    Entrada dins del servei i grup especificat, correspon a una agrupació funcional per gestionar els valors a encriptar.
-k CLAUS, --claus CLAUS
                    Llista de paraules claus autoritzades a realitzar una petició.
-a AUTORITZATS, --autoritzats AUTORITZATS
                    llista del programari autoritzat a realitzar una petició.
-b SCRIPTS, --scripts SCRIPTS
                    Llista dels script autoritzat a executar amb el programari.
-r REFERENCIES, --referencies REFERENCIES
                    Llista de referencies a script autoritzat a executar el programari.
-u USUARI, --usuari USUARI
                    Identificació de l'usuari.
-p CONTRASENYA, --contrasenya CONTRASENYA
                    Contrasenya de l'usuari.
-d, --depuracio       Executa el programari en mode depuració.
-l LOG, --log LOG     Arxiu on guardar el registre de log del programa.
-v, --versio          Retorna la versió del programari.

pyEncrypta.py

usage: pyEncripta.py: {opcions} [valor a encriptar] {| [valor a encriptar] | [valor a encriptar]}.

Procés per retorna el valor encriptat dels arguments especificats.

arguments:

-arguments        Llista de valors a encriptar. valor {[valor] | [valor]}.

arguments opcionals:

-h, --help        show this help message and exit
-p, --programari  Activa l'opció per especificar que els arguments correspon
                a un programari: autoritzat, script o referència.
-v, --versio          Retorna la versió del programari.

pyValidaEncriptacio.py

usage: pyValidaEncriptacio.py: {opcions} [valor valor_encriptat] {| [valor valor_encriptat] | [valor valor_encriptat]}.

Validació sobre la relació entre una cadena en text i una cadena encriptada o entre dos cadenes encriptades.

arguments:

-arguments        Llista de valors a comprovar. {[valor valor_encriptat] | [valor valor_encriptat]}.

arguments opcionals:

-h, --help            show this help message and exit
-k, --publica         Activa l'opció per especificar que els arguments correspon a la clau publica a encriptar per publicar com a variable d'entorn.
-d, --depuracio       Executa el programari en mode depuració.
-l LOG, --log LOG     Arxiu on guardar el registre de log del programa.
-v, --versio          Retorna la versió del programari.

pyMissatgesError.py

usage: pyMissatgesError: codi_error. Retorna el missatge associat al codi d'error.

arguments:

-arguments        Codi d'error a visualitzar el missatge associat.

pyRetornaEntrada.py

usage: pyRetornaEntrada.py: [servei] [grup] [entrada] [autoritzat] [variable].

Procés per retornar el valor d'una variable d'un programa. Opcionalment pot tornar l'usuari amb el paràmetre -u o la contrasenya amb l'opció -p

arguments:

-arguments            Variable a retornar el seu valor. Opcional, també es pot especificar la variable 'usuari' o la variable 'contrasenya' o utilitzar l'opció especifica

arguments opcionals:

-h, --help            show this help message and exit
-c CONFIGURACIO, --configuracio CONFIGURACIO
                    Arxiu amb el contingut de la configuració.
-s SERVEI, --servei SERVEI
                    Servei de provisió de contrasenyes, correspon a una agrupació funcional per gestionar els valors a encriptar.
-g GRUP, --grup GRUP  Grup de contrasenyes d'un mateix servei, correspon a una agrupació funcional per gestionar els valors a encriptar.
-e ENTRADA, --entrada ENTRADA
                    Entrada dins del servei i grup especificat, correspon a una agrupació funcional per gestionar els valors a encriptar.
-k CLAU, --clau CLAU  Paraula clau autoritzada a realitzar la petició.
-u, --usuari          Indicador per retorna la idendificació de l'usuari.
-p, --contrasenya     Indicador per retorna el contingut de la contrasenya de l'usuari.
-d, --depuracio       Executa el programari en mode depuració.
-l LOG, --log LOG     Arxiu on guardar el registre de log del programa.
-v, --versio          Retorna la versió del programari.

pyExecutaCmd

usage: pyExecutaCmd.py: {opcions}.

Procés per executar un programari configurat on s'ha especificat aquells unes variables que s'han de substituir pel seu valor real.

arguments:

-arguments            Arguments per l'execució del programari especificat.

arguments opcionals:

-h, --help            show this help message and exit
-c CONFIGURACIO, --configuracio CONFIGURACIO
                    Arxiu amb el contingut de la configuració.
-s SERVEI, --servei SERVEI
                    Servei de provisió de contrasenyes, correspon a una agrupació funcional per gestionar els valors a encriptar.
-g GRUP, --grup GRUP  Grup de contrasenyes d'un mateix servei, correspon a una agrupació funcional per gestionar els valors a encriptar.
-e ENTRADA, --entrada ENTRADA
                    Entrada dins del servei i grup especificat, correspon a una agrupació funcional per gestionar els valors a encriptar.
-k CLAU, --clau CLAU  Paraula clau autoritzada a realitzar la petició.
-i INDICADOR, --indicador INDICADOR
                    Indicador de variable. S'especifica a l'inici i al final
-d, --depuracio       Executa el programari en mode depuració.
-l LOG, --log LOG     Arxiu on guardar el registre de log del programa.
-v, --versio          Retorna la versió del programari.

pyActualitzaEmpremtes.py

Actualitza les empremtes de programari autoritzat, scrips o referències.

arguments:

-arguments            Arguments de configuració.

arguments opcionals:

-h, --help            show this help message and exit
-c CONFIGURACIO, --configuracio CONFIGURACIO
                    Arxiu amb el contingut de la configuració.
-s SERVEI, --servei SERVEI
                    Servei de provisió de contrasenyes, correspon a una agrupació funcional per gestionar els valors a encriptar.
-g GRUP, --grup GRUP  Grup de contrasenyes d'un mateix servei, correspon a una agrupació funcional per gestionar els valors a encriptar.
-e ENTRADA, --entrada ENTRADA
                    Entrada dins del servei i grup especificat, correspon a una agrupació funcional per gestionar els valors a encriptar.
-a AUTORITZATS, --autoritzats AUTORITZATS
                    Llista del programari autoritzat a realitzar una petició.
-b SCRIPTS, --scripts SCRIPTS
                    Llista dels scripts autoritzat a ser executats amb el programari.
-r REFERENCIES, --referencies REFERENCIES
                    Llista de referencies a script autoritzat a executar el programari.
-d, --depuracio       Executa el programari en mode depuració.
-l LOG, --log LOG     Arxiu on guardar el registre de log del programa.
-v, --versio          Retorna la versió del programari.

pyActualitzaClaus

Actualitza les claus utilitzades per encriptar la informació.

arguments:

-arguments            Arguments de configuració.

arguments opcionals:

-h, --help            show this help message and exit
-c CONFIGURACIO, --configuracio CONFIGURACIO
                    Arxiu amb el contingut de la configuració.
-k PRIVADA_ANTERIOR, --privada_anterior PRIVADA_ANTERIOR
                    Clau del programari utilitzat fins ara. Si no està especificada, s'utilitza l'actual
-p PRIVADA_NOVA, --privada_nova PRIVADA_NOVA
                    Nova clau del programari utilitzat a partir d'ara. Si no està especificada, s'utilitza l'actual
-a PUBLICA_ANTERIOR, --publica_anterior PUBLICA_ANTERIOR
                    Clau en la variable d'entorn COMANDAMENT_SECURITZAT utilitzat fins ara. Si no està especificada, s'utilitza l'actual
-n PUBLICA_NOVA, --publica_nova PUBLICA_NOVA
                    Nova clau en la variable d'entorn COMANDAMENT_SECURITZAT per utilitzat a partir d'ara. Si no està especificada, s'utilitza l'actual
-d, --depuracio       Executa el programari en mode depuració.
-l LOG, --log LOG     Arxiu on guardar el registre de log del programa.
-v, --versio          Retorna la versió del programari.

Elements de seguretat

Per gestionar la seguretat d'execució o accés a una variable encriptada, s'han establerts els següents elements:

  • Arxiu de configuració. Aquí es guarden tots els elements de configuració i variables encriptades organitzades en diferents nivells. L'accés a aquest arxiu marca un punt important en la seguretat del sistema amb combinació amb la resta d'elements de seguretat.
  • Clau. És l'element més feble, s'especifica amb el paràmetre '-k' o '--clau', tant a la definició com també a l'execució de comandaments. Ofereix només ofuscació.
  • Autorització. Correspon a la llista d'aplicacions que al ser executades disposen de permisos per accedir al contingut encriptat. Es pot limitar qui pot executar el comandament.
  • Scripts. Corresponen a la llista de scripts que al ser executades disposen de permisos per accedir al contingut encriptat, en aquest cas, requereix sigui autoritzat també el llenguatge d'execució.
  • Referència. Correspon a la llista de programes que executaran processos autoritzats a accedir al contingut encriptat. Es pot limitar qui executa el script.

La combinació dels diferents elements donen seguretat i rigidesa al sistema:

  • arxiu de configuració. Es l'opció més bàsica on el sistema operatiu dona permisos per accedir i llegir el contingut de l'arxiu de configuració.

    -rw-r----- 1 admin adm 3992 jun 28 13:39 comandaments.ini
    
    En aquest exemple, només l'usuari *admin* o els components del grup *adm* podran realitzar l'execució de les diferents opcions del programari comandamentSecuritats utilitzant l'arxiu de configuració *comandaments.ini*.
    
    Aquest arxiu de configuració conté una empremta perquè no es pugui manipular, la modificació del contingut manualment invalidarà l'arxiu i el programari no l'utilitzarà.
    
  • Clau amb l'arxiu de configuració. S'han de combinar per ofuscar per una part i donar seguretat al contingut.

    • Execució del comandament:

      pyRetornaEntrada -c comandament.ini -p servei grup entrada clauAcces
      

      La seguretat bé donada pels permisos de l'arxiu comandament.ini.

      Per accedir a la contrasenya, es requereix saber la clau d'accés: clauAcces

    • Generació del comandament:

      python pyGeneraEntrada.py -c comandament.ini -s servei -g grup -e entrada -k clauAcces -u anonymous -p prova
      
  • Clau, referencia i l'arxiu de configuració. S'han de combinar per ofuscar i donar més seguretat a l'execució.

    • Execució del comandament:

      script: exemple.sh::

      1
      2
      3
      #!/bin/bash
      pyRetornaEntrada -c comandament.ini -p servei grup entrada clauAcces
      exit $?
      

      Una part de la seguretat bé donada pels permisos de l'arxiu comandament.ini.

      Per accedir a la contrasenya, es requereix saber la clau d'accés: clauAcces.

      Només el script referenciat: exemple.sh, podrà executar el comandament:

      pyRetornaEntrada -c comandament.ini -p servei grup entrada clauAcces`, tot i ser publica la clau d'acces: *clauAcces*
      

      Els permisos d'execució de exemple.sh estaran gestionats pel sistema operatiu.

    • Generació del comandament:

      python pyGeneraEntrada.py -c comandament.ini -s servei -g grup -e entrada -k clauAcces -r exemple.sh -u anonymous -p prova
      
  • Autorització i arxiu de configuraci. Només les aplicacions autoritzades disposen de permisos per accedir a les dades encriptades, l'execució serà depenent dels permisos de l'aplicació.

    • Execució del comandament:

      pyExecutaCmd -c comandaments.ini administracio xdrp windows xfreerdp /admin /clipboard /v:%servidor% /u:%usuari% /p:%contrasenya% /size:1400x1024 /drive:home,/home/my_home
      

      Una part de la seguretat bé donada pels permisos de l'arxiu comandament.ini.

      Només el programari autoritzat: xfreerdp, podrà subsituir les variables especificades: %servidor%, %usuari%, %contrasenya%*, en el moment de la seva execució.

    • Generació del comandament:

      python pyGeneraEntrada.py -c comandament.ini -s administracio -g xdrp -e windows -a xfreerdp servidor:servidor_windows.com usuari:usuari_administrador contrasenya:contrasenya_administrador
      
  • Autorització, referències i arxiu de configuració: Només les aplicacions autoritzades, executades des del programari referenciat, disposen de permisos per accedir a les dades encriptades, l'execució serà depenent dels permisos de l'aplicació de referència.

    • Execució del comandament:

      script: exemple.sh::

      1
      2
      3
      #!/bin/bash
      pyExecutaCmd -c comandaments.ini sistemes xdrp windows xfreerdp /admin /clipboard /v:%servidor% /u:%usuari% /p:%contrasenya% /size:1400x1024 /drive:home,/home/my_home
      exit $?
      

      Una part de la seguretat bé donada pels permisos de l'arxiu comandament.ini.

      Es podrà executar el programari autoritzat: xfreerdp.

      Podrà accedir a les dades encriptades quan sigui executat el script: exemple.sh, on es substituirà les variables especificades: %servidor%, %usuari%, %contrasenya%*, en el moment de la seva execució.

      Els permisos d'execució de exemple.sh estaran gestionats pel sistema operatiu.

    • Generació del comandament:

      python pyGeneraEntrada.py -c comandament.ini -s sistemes -g xdrp -e windows -a xfreerdp -r exemple.sh servidor:servidor_windows.com usuari:usuari_administrador contrasenya:contrasenya_administrador
      
  • Scripts, autorització i arxiu de configuració. Només els scripts amb les aplicacions autoritzades disposen de permisos per accedir a les dades encriptades, l'execució serà depenent dels permisos del script.

    • Execució del comandament:

      script: exemple_1.py::

      1
      2
      3
      4
      5
      6
      7
      8
      #!/usr/bin/env python
      # -*- coding: utf-8 -*-
      import sys
      if __name__ == '__main__':
          print("Argument secret: %s" % sys.argv[1])
      sys.exit(0)
      
      python pyExecutaCmd.py -c comandament.ini scripts python proves python3 exemple_1.py %argument%
      

      Una part de la seguretat bé donada pels permisos de l'arxiu comandament.ini.

      Només es podrà executar els programaris python3 o python.

      L'accés a les dades encriptades només les podrà realitzar el script: exemple_1.py.

      L'execució del script vindrà definida pels permisos del sistema operatiu sobre l'arxiu.

    • Generació del comandament:

      python pyGeneraEntrada.py -c comandament.ini -s scripts -g python -e proves -a python,python3 -s exemple_1.py argument:prova
      
  • Scripts, autorització, referències i arxiu de configuració. Només els scripts amb les aplicacions autoritzades, executades des del programari referenciat, disposen de permisos per accedir a les dades encriptades, l'execució serà depenent dels permisos de l'aplicació de referència.

    • Execució del comandament:

      script: exemple_1.py::

      1
      2
      3
      4
      5
      6
      #!/usr/bin/env python
      # -*- coding: utf-8 -*-
      import sys
      if __name__ == '__main__':
          print("Argument secret: %s" % sys.argv[1])
      sys.exit(0)
      

      script: exemple.sh::

      1
      2
      3
      #!/bin/bash
      python pyExecutaCmd.py -c comandament.ini scripts python complexa python3 exemple_1.py %argument%
      exit $?
      

      ./exemple.sh

      Una part de la seguretat bé donada pels permisos de l'arxiu comandament.ini.

      Només es podrà executar els programaris python3 o python.

      L'accés a les dades encriptades només les podrà realitzar el script: exemple_1.py sempre i quan sigui executat pel procés exemple_1.sh.

      L'execució del script exemple.sh vindrà definida pels permisos del sistema operatiu sobre l'arxiu.

    • Generació del comandament:

      python pyGeneraEntrada.py -c comandament.ini -s scripts -g python -e complexa -a python,python3 -s exemple_1.py -r exemple.sh argument:prova
      

Per salvaguardar el contingut de l'arxiu de configuració, es genera una emprempta amb la informació continguda.

Al carregar l'arxiu de configuració es comprova que l'empremta sigui la vàlida per poder utilitzar-lo.

Tant els programes autoritzats, els scripts o les referències es guarda una emprempta que després validar que no hi hagi cap modificació.

Es per aquest últim motiu que si es modifica o actualitza qualsevol programari, script o referencia, s'ha de regenerar l'empremta. Per això es pot utilitzar el programari pyActualitzaEmpremtes.py, per regenerar l'empreta.

Elements de configuració

Per poder organitzar les diferents entrades per guardar les variables encriptades, es defineixen tres nivells d'organització, aquests són:

  • Servei. Correspon al primer nivell d'organització de les diferents entrades encriptades.
  • Grup. Per cada servei definit, es poden definir grups per a organitzar els serveis.
  • Entrada. Per cada servei definit i per cada grup, es poden definir diferents entrades per organitzar la configuració.

Per cada entrada es poden definir els següents elements de seguretat:

  • Claus d'accés. Es poden definir diferents claus per accedir a una entrada; o també un número que correspondrà al codi d'un procés on el nom haurà de coincidir amb la clau.

    Un exemple seria: >sqlplus `pyRetornaEntrada servei grup entrada`....
    - Autoritzats. Aplicacions que poden accedir a una entrada, per validar aquesta aplicació, al generar l'entrada es calcula un empremta que haurà de coincidir al moment d'executar.

    Com l'exemple anterior seria >pyExecutaCmd.py sistemes oracle administrador sqlplus %usuari%/%contrasenya%@%instancia% @script_executar

    on el programa, en el cas d'estar autoritzat el comandament sqlplus, traduirà les variable especificades.

    Cada aplicació autoritzada es guarda en parelles, el primer element es el programari amb la ruta d'execució i el segon element és l'empremta del programari.

  • Variables. Es podran definir un nombre indefinit de variables de diferents tipus, numeros, cadenes de caracters i llistes.

  • Valors. Correspon al valor assignat a cada variable, aquest pot estar encriptat o en text pla. Els valors encriptats s'iniciarà amb la cadena '{CRYPT}'

    En el moment de definir una variable es podrà realitzar de les següents formes:

    - variable=valor. En aquest cas el contingut es guarda sense encriptar.
    - variable:valor. En aquest cas el contingut es guarda encriptat.
    - variable={CRYPT}xxxxx. En aquest cas el contingut es igual com tal qual donat que ja està encriptat.
    - variable:{CRYPT}xxxxx. En aquest cas el contingut es igual com tal qual donat que ja està encriptat.
    

    Per disposar integritat de l'arxiu de configuració, aquest guarda una empremta dels elements definits, validats pel programa al moment de realitzar qualsevol acció.

    En el cas que l'empremta no sigui vàlida, el programari no s'executarà i retornarà un codi d'error.

Distribució del programari

Per la distribució del programari es procedirà a la generació d'un volum encriptat on contindrà el codi font i serà la base per distribuir i compilar en cada màquina a fi de generar els executables.

Aquest arxiu es guarda al directori distribució i es genera a través del script generaVolumDistribucio.sh.

El volum generat té el nom de distribucio.dump i ha de formar part del control de versions.

El procés executat pel script és el següent::

Compilació del programari

La distribució del programa s'hauria de realitzar havent compilat els diferents programaris; per protegir adequadament, per una part el propi programari i per un altra banda l'arxiu de configuració.

Per realitzar aquesta tasca, s'ha incorporat el comandament generaExecutables.sh.