lundi 27 février 2012

Outil d'export de tables sans authentification avec liste de filtrage

Voici un cas pratique qui m'a été posé.

Un utilisateur souhaite pouvoir backuper certaines tables via exp.
A priori pas de problème, mais cela veut dire que je doit lui donner le droit d'exporter y compris les objets que je ne souhaite pas lui donner accès.

De plus le ROLE EXP_FULL_DATABASE implique pour moi une faille de sécurtié, n'importe que grant sera bypassé à cause de ce role.

Pour ce faire, je met en place le mécanisme suivant :

  1. Je créé un nouveau compte dédié à l'export
  2. Sur un serveur je met en place un script (voir ci-dessous) qui va supplanter ma commande d'export
  3. J'empêche la lecture du script par les autres utilisateurs
  4. Je met en place les bonnes règles sudo pour que mon utilisateur puisse exporter

Résultat :

  1. L'utilisateur peut exporter
  2. Il ne connait pas le mot de passe
  3. Je peux mettre en place un mechanisme de filtrage pour l'empecher d'exporter certaines tables.




Script d'export :
. /etc/profile.d/oracle.sh
_PARAMETRES=$@
EXCLUDED_TABLES="USERS PASSWORD"
PARFILE=/tmp/$(date '+%Y%d%m%s').par
verif_table()
{
        list_table=$(echo $1 | tr "a-z" "A-Z")
        for table in $EXCLUDED_TABLES
        do
                if ! [ $(echo $list_table | grep $table | wc -l) == "0" ]
                then
                        echo "Table $table forbidden"
                        rm $PARFILE


                        exit 0
                fi
        done
}
for _PARAM in $_PARAMETRES ; do
        case `echo $_PARAM | awk  -F '=' '{printf $1}'` in
                db|DB)
                        sid=$(echo $_PARAM | awk  -F '=' '{printf $2"\n"}')
                ;;
                tables | TABLES )
                        list_table=$(echo $_PARAM | awk  -F '=' '{printf $2"\n"}')
                        verif_table $list_table
                        echo $_PARAM >> $PARFILE
                ;;
                log|LOG)
                        logfile=$(echo $_PARAM | awk  -F '=' '{printf $2"\n"}')
                        chmod o+rw $logfile
                        echo $_PARAM >> $PARFILE
                ;;
                file|FILE)
                        dumpfile=$(echo $_PARAM | awk  -F '=' '{printf $2"\n"}')
                        chmod o+rw $dumpfile
                        echo $_PARAM >> $PARFILE
                ;;
                *)
                        echo $_PARAM >> $PARFILE
                ;;
        esac
done


echo EXPORTER/<password>@$sid | exp parfile=$PARFILE
rm $PARFILE

Extrait du /etc/sudoers :

Runas_Alias DB = oracle
Cmnd_Alias EXPORTER = /usr/local/bin/exporter
final_user ALL=(DB) NOPASSWD: EXPORTER

La commande d'export restera presque la même
Commande normale :
exp system/manager@mydb tables=toto
Nouvelle commande 
EXPORTER db=mydb tables=toto


Aucun commentaire:

Enregistrer un commentaire