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 :
- Je créé un nouveau compte dédié à l'export
- Sur un serveur je met en place un script (voir ci-dessous) qui va supplanter ma commande d'export
- J'empêche la lecture du script par les autres utilisateurs
- Je met en place les bonnes règles sudo pour que mon utilisateur puisse exporter
Résultat :
- L'utilisateur peut exporter
- Il ne connait pas le mot de passe
- 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