Une petite histoire addictive avec les permissions du répertoire spécifié par expdp (pour les débutants)

Bonjour. Mon nom est hrkii123.

Cette entrée est l'article du 18e jour du calendrier de l'Avent JPOUG 2019.

Le premier message de Qiita est le Calendrier de l'Avent JPOUG 2019.

Calendrier de l'Avent JPOUG 2019 https://adventar.org/calendars/4154

introduction

Cette fois, je suis accro à l'utilitaire expdp de datapump.

Un jour. Nous avons conçu autour de la base de données avec l'exigence que les utilisateurs du système d'exploitation, les utilisateurs de la base de données, les répertoires du système d'exploitation, etc. soient séparés pour chaque équipe de développement afin que les données ne puissent pas être référencées les unes par rapport aux autres. Parmi eux, une commande a été passée pour préparer un répertoire OS à exporter par datapump pour chaque équipe afin qu'elles ne puissent pas se référer aux fichiers de vidage de l'autre.

Je pensais que ce serait facile à contrôler avec les autorisations d'un tel répertoire OS. (Ce n'était pas si facile.)

J'ai donc résumé le contenu de vérification que j'ai essayé de différentes manières.

Diagramme schématique

Exportez le schéma user_A vers / var / work / Adir avec datapump. Après l'exportation, seuls les utilisateurs Aadmin peuvent accéder aux fichiers de vidage sous / var / work / Adir, et les utilisateurs Badmin ne peuvent pas y accéder. L'accès est possible en définissant les autorisations du répertoire OS. En outre, bien que non illustré sur la figure, la base de données a utilisé l'environnement 12.1 RAC. (Parce que j'avais une machine virtuelle ..)

無題のプレゼンテーション (3).png

Créez un utilisateur DB "user_A" et un objet d'annuaire "dirA" pour vérification. Accordez les privilèges nécessaires à l'utilisateur de base de données "user_A".

create user user_A identified by welcome1;
CREATE DIRECTORY dirA AS '/var/work/Adir';
grant create session,resource,unlimited tablespace to user_A;
grant read, write on directory dirA to user_A;

Maintenant, expdp peut-il être exécuté dans cet état?

/u01/app/oracle/product/12.1.0/dbhome_1/bin/expdp user_A/welcome1@testdb directory=dirA dumpfile=expdp_A.log schemas=user_A

Une erreur s'est produite comme indiqué dans la sortie ci-dessous.

ORA-39002: invalid operation
ORA-39070: Unable to open the log file.
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation

L'erreur ci-dessus est générée lorsque les autorisations du répertoire du système d'exploitation ne sont pas appropriées.

Le répertoire OS spécifié dans l'objet d'annuaire est le propriétaire Aadmin et le propre groupe Aadmin. Les fichiers de vidage exportés par les spécifications de la pompe de données appartiennent à oracle et appartiennent à asmadmin. En d'autres termes, pour exécuter le vidage de données, il est nécessaire d'autoriser l'accès de l'utilisateur oracle et du groupe asmadmin. Si les autorisations du répertoire du système d'exploitation sont 777, vous n'avez à vous soucier de rien, mais dans ce cas, l'utilisateur oracle n'appartient pas au groupe Aadmin, vous ne pouvez donc pas accéder au répertoire du système d'exploitation.

Pour contourner ce problème, nous ajouterons cette fois Aadmin aux groupes secondaires d'utilisateurs oracle et grid.

id oracle
uid=54321(oracle) gid=54321(oinstall)groups=54321(oinstall),54322(dba),1101(oper),1102(backupdba),1103(dgdba),1104(kmdba),1201(asmdba),54323(Aadmin)

id grid
uid=1100(grid) gid=54321(oinstall)groups=54321(oinstall),1200(asmadmin),1201(asmdba),1202(asmoper),54323(Aadmin)

Va-t-il réussir cette fois?

ORA-39002: invalid operation
ORA-39070: Unable to open the log file.
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation

Il est ressorti à nouveau. Cette erreur! !! Je devrais pouvoir accéder au répertoire OS,

À propos, si vous modifiez l'autorisation du répertoire du système d'exploitation en 777, cela fonctionne normalement.

$ /u01/app/oracle/product/12.1.0/dbhome_1/bin/expdp user_A/welcome1@testdb directory=dirA 
dumpfile=expdp_A.log schemas=user_A

Export: Release 12.1.0.2.0 - Production on Sun Dec 15 03:53:01 2019

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Advanced Analytics and Real Application Testing options
Starting "USER_A"."SYS_EXPORT_SCHEMA_01":  user_A/********@testdb directory=dirA dumpfile=expdp_A.log schemas=user_A
Estimate in progress using BLOCKS method...
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 0 KB
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Master table "USER_A"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for USER_A.SYS_EXPORT_SCHEMA_01 is:
  /var/work/Adir/expdp_A.log
Job "USER_A"."SYS_EXPORT_SCHEMA_01" successfully completed at Sun Dec 15 03:53:42 2019 elapsed 0 00:00:38

[oracle@node1 ~]$

Comment as-tu fait ça après tout

Lors de l'ajout d'un groupe secondaire d'utilisateurs oracle, grid dans un environnement RAC, il est nécessaire de rendre le clusterware conscient! Il sera reconnu en redémarrant le clusterware après avoir ajouté le groupe. Vous pouvez vérifier si le clusterware est conscient qu'un groupe d'utilisateurs a été ajouté en vérifiant le processus pmon.

Après avoir redémarré CRS

ps -ef | grep pmon
    grid     14417     1  0 05:37 ?        00:00:00 asm_pmon_+ASM1
    oracle   15136     1  0 05:37 ?        00:00:00 ora_pmon_ctestdb1
    grid     15143     1  0 05:37 ?        00:00:00 mdb_pmon_-MGMTDB
    oracle   30528 27106  0 06:06 pts/1    00:00:00 grep pmon

cat /proc/14417/status |grep Groups

Groupes: 1200 1201 1202 54321 54323 ★ 54323 (Aadmin) est reconnu

cat /proc/15136/status |grep Groups

Groupes: 1101 1102 1103 1104 1201 54321 54322 54323 ★ 54323 (Aadmin) est reconnu

Maintenant expdp est enfin possible.

$ /u01/app/oracle/product/12.1.0/dbhome_1/bin/expdp user_A/welcome1@testdb directory=dirA dumpfile=expdp_A.log schemas=user_A

Export: Release 12.1.0.2.0 - Production on Sun Dec 15 05:58:12 2019

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Advanced Analytics and Real Application Testing options
Starting "USER_A"."SYS_EXPORT_SCHEMA_01":  user_A/********@testdb directory=dirA dumpfile=expdp_A.log schemas=user_A
Estimate in progress using BLOCKS method...
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 0 KB
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Master table "USER_A"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for USER_A.SYS_EXPORT_SCHEMA_01 is:
  /var/work/Adir/expdp_A.log
Job "USER_A"."SYS_EXPORT_SCHEMA_01" successfully completed at Sun Dec 15 05:58:36 2019 elapsed 0 00:00:23

Nous avons également un contrôle d'accès que nous voulions réaliser.

$ id
uid=54323(Badmin) gid=54324(Badmin) groups=54324(Badmin)
$ cd /var/work/Adir/
-bash: cd: /var/work/Adir/: Permission denied
$ ls -l /var/work/Adir/
ls: cannot open directory /var/work/Adir/: Permission denied

C'est tout.

Restez à l'écoute pour l'article sur le 19ème jour du Calendrier de l'Avent JPOUG 2019 ~

Recommended Posts

Une petite histoire addictive avec les permissions du répertoire spécifié par expdp (pour les débutants)
[Pour les débutants chez AtCoder] Parlez de la quantité de calcul que vous voulez connaître approximativement
Déploiement Heroku de la première application Django à laquelle les débutants sont accros
[Pour les débutants] Je veux obtenir l'index d'un élément qui satisfait une certaine expression conditionnelle
L'histoire de l'adresse IPv6 que je souhaite conserver au minimum
L'histoire de Django créant une bibliothèque qui pourrait être un peu plus utile
Comment faire un Raspberry Pi qui parle les tweets d'un utilisateur spécifié
Une histoire qui réduit l'effort de fonctionnement / maintenance
Un script python qui obtient le nombre de travaux pour une condition spécifiée sur Indeed.com
Une histoire à laquelle j'étais accro chez np.where
[Linux] Principes de base de la configuration des autorisations par chmod pour les débutants
Le problème Zip 4 Gbyte est une histoire du passé
Une histoire qui a analysé la livraison de Nico Nama.
Comment extraire les conditions (acquérir tous les éléments du Groupe qui remplissent les conditions) pour Groupe par Groupe
J'ai réfléchi un peu car Trace Plot du paramètre de stan est difficile à voir
[Python] Programmation pour trouver le nombre de a dans une chaîne de caractères qui se répète un nombre spécifié de fois.
Python> __init __. Py> Requis pour gérer le répertoire spécifié en tant que package (un fichier vide est acceptable)
Une histoire à laquelle j'étais accro en spécifiant nil comme argument de fonction dans Go
L'histoire de la création d'un canal VIP dans le chatwork en interne
[Ubuntu] Comment supprimer tout le contenu du répertoire
L'histoire de la définition de la clé privée à 600 avec chmod
Y a-t-il un secret dans la fréquence des nombres de rapport de circonférence?
L'histoire quand j'étais accro à Caused by SSLError ("Impossible de se connecter à l'URL HTTPS car le module SSL n'est pas disponible.")
Une histoire sur l'écriture d'AWS Lambda et de devenir un peu accro aux valeurs par défaut des arguments Python
Une histoire qui a vérifié si le nombre de coronas augmente vraiment rapidement chez les jeunes
Hypothèse / Vérification (176) Comment créer un manuel plus simple que "Le manuel le plus simple pour les ordinateurs quantiques"
[Python] Comment utiliser l'instruction for. Une méthode d'extraction en spécifiant une plage ou des conditions.
L'histoire selon laquelle la version de python 3.7.7 n'était pas adaptée à Heroku
L'histoire de la création d'un pilote standard pour db avec python.
L'histoire de la création d'un site qui répertorie les dates de sortie des livres
[Pour les débutants] Fonction récursive (Facile à comprendre la tour de Hanoi!)
[python] Une note que j'ai commencé à comprendre le comportement de matplotlib.pyplot
L'histoire de la création d'un module qui ignore le courrier avec python
[Python] Un programme qui fait pivoter le contenu de la liste vers la gauche
L'histoire de la recherche d'un magasin BOT (AI LINE BOT) pour Go To EAT dans la préfecture de Chiba (1)
Une histoire accro aux pipelines Azure
Django super introduction par les débutants Python! Partie 2 J'ai essayé d'utiliser les fonctions pratiques du modèle
Une histoire d'essayer d'améliorer le processus de test d'un système vieux de 20 ans écrit en C
Créez un bot qui publie sur Slack le nombre de personnes positives pour le nouveau virus corona à Tokyo
L'histoire de l'exportation d'un programme
Une histoire sur la création d'un programme qui augmentera le nombre d'abonnés Instagram de 0 à 700 en une semaine
Une histoire qui visualise le présent de Qiita avec Qiita API + Elasticsearch + Kibana
[Python] Un programme qui calcule le nombre de chaussettes jumelées
[Exemple d'amélioration de Python] Quel est le site d'apprentissage recommandé pour les débutants en Python?
L'histoire du développement d'une application WEB qui génère automatiquement des copies de capture [MeCab]
Comment créer un wrapper qui préserve la signature de la fonction à envelopper
Explication d'approche pour que les débutants soient dans le top 1,5% (0,83732) dans Kaggle Titanic_1
Qu'est-ce qu'une bibliothèque en langage C? Quelles informations sont ouvertes au public?
L'histoire de la création d'un package qui accélère le fonctionnement de Juman (Juman ++) & KNP
J'ai essayé de vérifier le résultat du test A / B avec le test du chi carré
Explication d'approche pour que les débutants soient dans le top 1,5% (0,83732) dans Kaggle Titanic_2
Comment obtenir le "nom" d'un champ dont la valeur est limitée par l'attribut choice dans le modèle Django
J'ai créé un script pour vérifier si l'anglais est entré dans la position spécifiée du fichier JSON en Python.
J'ai essayé de confirmer si l'estimation impartiale de l'écart-type était vraiment impartiale en "jetant des pièces 10 000 fois"
L'histoire d'essayer de reconnecter le client
L'histoire de la mise en place de MeCab dans Ubuntu 16.04