[LINUX] Eine kleine süchtig machende Geschichte mit den Berechtigungen des von expdp angegebenen Verzeichnisses (für Anfänger)

Hallo. Ich heiße hrkii123.

Dieser Eintrag ist der Artikel zum 18. Tag des JPOUG-Adventskalenders 2019.

Qiitas erster Beitrag ist JPOUG Adventskalender 2019.

JPOUG Adventskalender 2019 https://adventar.org/calendars/4154

Einführung

Dieses Mal bin ich süchtig nach dem Dienstprogramm expdp von datapump.

Eines Tages. Wir haben die Datenbank mit der Anforderung entworfen, dass Betriebssystembenutzer, DB-Benutzer, Betriebssystemverzeichnisse usw. für jedes Entwicklungsteam getrennt werden müssen, damit Daten nicht voneinander referenziert werden können. Unter anderem wurde der Auftrag erteilt, ein Betriebssystemverzeichnis vorzubereiten, das von datapump für jedes Team exportiert werden soll, damit sie nicht auf die Dump-Dateien des jeweils anderen verweisen können.

Ich dachte, es wäre einfach, mit den Berechtigungen eines solchen Betriebssystemverzeichnisses zu steuern. (Es war nicht so einfach.)

Also habe ich die Überprüfungsinhalte zusammengefasst, die ich auf verschiedene Weise ausprobiert habe.

Schematische Darstellung

Exportieren Sie das user_A-Schema mit datapump nach / var / work / Adir. Nach dem Export können nur Aadmin-Benutzer unter / var / work / Adir auf die Dump-Dateien zugreifen, und Badmin-Benutzer können nicht darauf zugreifen. Der Zugriff ist durch Festlegen der Berechtigungen des Betriebssystemverzeichnisses möglich. Obwohl in der Abbildung nicht dargestellt, verwendete die Datenbank die 12.1-RAC-Umgebung. (Weil ich zufällig eine virtuelle Maschine hatte ..)

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

Erstellen Sie einen DB-Benutzer "user_A" und ein Verzeichnisobjekt "dirA" zur Überprüfung. Gewähren Sie dem DB-Benutzer "user_A" die erforderlichen Berechtigungen.

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;

Kann expdp nun in diesem Zustand ausgeführt werden?

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

Ein Fehler ist aufgetreten, wie in der folgenden Ausgabe gezeigt.

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

Der obige Fehler wird ausgegeben, wenn die Betriebssystemverzeichnisberechtigungen nicht geeignet sind.

Das im Verzeichnisobjekt angegebene Betriebssystemverzeichnis ist der Eigentümer Aadmin und die eigene Gruppe Aadmin. Die von den Datenpumpenspezifikationen exportierten Speicherauszugsdateien gehören Oracle und asmadmin. Mit anderen Worten, um eine Datenpumpe auszuführen, muss der Oracle-Benutzer und die asmadmin-Gruppe den Zugriff zulassen. Wenn die Berechtigung für das Betriebssystemverzeichnis 777 lautet, müssen Sie sich um nichts kümmern. In diesem Fall gehört der Oracle-Benutzer jedoch nicht zur Aadmin-Gruppe, sodass Sie nicht auf das Betriebssystemverzeichnis zugreifen können.

Um dieses Problem zu umgehen, werden wir diesmal Aadmin zu den sekundären Gruppen von Oracle- und Grid-Benutzern hinzufügen.

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)

Wird es diesmal gelingen?

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

Es kam wieder heraus. Dieser Fehler! !! Ich sollte in der Lage sein, auf das Betriebssystemverzeichnis zuzugreifen.

Wenn Sie die Berechtigung des Betriebssystemverzeichnisses in 777 ändern, funktioniert dies übrigens normal.

$ /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 ~]$

Wie hast du es denn gemacht?

Wenn Sie eine sekundäre Gruppe von Oracle-Grid-Benutzern in einer RAC-Umgebung hinzufügen, müssen Sie die Clusterware darauf aufmerksam machen! Dies wird durch einen Neustart der Clusterware nach dem Hinzufügen der Gruppe erkannt. Sie können überprüfen, ob der Clusterware bekannt ist, dass eine Gruppe von Benutzern hinzugefügt wurde, indem Sie den pmon-Prozess überprüfen.

Nach dem Neustart von 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

Gruppen: 1200 1201 1202 54321 54323 ★ 54323 (Aadmin) wird erkannt

cat /proc/15136/status |grep Groups

Gruppen: 1101 1102 1103 1104 1201 54321 54322 54323 ★ 54323 (Aadmin) wird erkannt

Jetzt ist expdp endlich möglich.

$ /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

Wir haben auch eine Zugangskontrolle, die wir erreichen wollten.

$ 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

Das ist es.

Seien Sie gespannt auf den Artikel am 19. Tag des JPOUG-Adventskalenders 2019 ~

Recommended Posts

Eine kleine süchtig machende Geschichte mit den Berechtigungen des von expdp angegebenen Verzeichnisses (für Anfänger)
[AtCoder für Anfänger] Sprechen Sie über den Rechenaufwand, den Sie grob wissen möchten
Heroku-Bereitstellung der ersten Django-App, von der Anfänger abhängig sind
[Für Anfänger] Ich möchte den Index eines Elements erhalten, das einen bestimmten bedingten Ausdruck erfüllt
Die Geschichte der IPv6-Adresse, die ich auf ein Minimum beschränken möchte
Die Geschichte von Django, wie er eine Bibliothek erstellt, die vielleicht etwas nützlicher ist
So erstellen Sie einen Raspberry Pi, der die Tweets eines bestimmten Benutzers spricht
Eine Geschichte, die den Aufwand für Betrieb / Wartung reduziert
Ein Python-Skript, das die Anzahl der Jobs für eine bestimmte Bedingung von Indeed.com abruft
Eine Geschichte, von der ich bei np.where süchtig war
[Linux] Grundlagen der Berechtigungseinstellung von chmod für Anfänger
Zip 4 Gbyte Problem ist eine Geschichte der Vergangenheit
Eine Geschichte, die die Lieferung von Nico Nama analysierte.
So extrahieren Sie Bedingungen (erwerben Sie alle Elemente der Gruppe, die die Bedingungen erfüllen) für Gruppe für Gruppe
Ich dachte ein wenig nach, weil Trace Plot von Stan's Parameter schwer zu sehen ist
[Python] Programmieren, um die Nummer von a in einer Zeichenfolge zu finden, die eine bestimmte Anzahl von Malen wiederholt.
Python> __init __. Py> Erforderlich, um das angegebene Verzeichnis als Paket zu behandeln (leere Datei ist akzeptabel)
Eine Geschichte, nach der ich süchtig war, als ich in Go nil als Funktionsargument angab
Die Geschichte der Einrichtung eines VIP-Kanals im internen Chatwork
[Ubuntu] So löschen Sie den gesamten Inhalt des Verzeichnisses
Die Geschichte, den privaten Schlüssel mit chmod auf 600 zu setzen
Gibt es ein Geheimnis in der Häufigkeit der Umfangszahlen?
Die Geschichte, als ich von Caused by SSLError abhängig war ("Kann keine Verbindung zur HTTPS-URL herstellen, da das SSL-Modul nicht verfügbar ist.")
Eine Geschichte über das Schreiben von AWS Lambda und ein wenig Abhängigkeit von den Standardwerten von Python-Argumenten
Eine Geschichte, die bestätigte, ob die Zahl der Coronas bei jungen Menschen wirklich schnell zunimmt
Hypothese / Verifikation (176) Wie man ein Lehrbuch macht, das einfacher ist als "Das einfachste Lehrbuch für Quantencomputer"
[Python] Verwendung der for-Anweisung. Eine Methode zum Extrahieren durch Angabe eines Bereichs oder von Bedingungen.
Die Geschichte, dass die Version von Python 3.7.7 nicht an Heroku angepasst wurde
Die Geschichte, einen Standardtreiber für db mit Python zu erstellen.
Die Geschichte der Erstellung einer Website, auf der die Veröffentlichungsdaten von Büchern aufgeführt sind
[Für Anfänger] Rekursive Funktion (Der Turm in Hanoi ist leicht zu verstehen!)
[Python] Ein Hinweis, dass ich das Verhalten von matplotlib.pyplot zu verstehen begann
Die Geschichte, ein Modul zu erstellen, das E-Mails mit Python überspringt
[Python] Ein Programm, das den Inhalt der Liste nach links dreht
Die Geschichte, wie ein Geschäft BOT (AI LINE BOT) nach Go To EAT in der Präfektur Chiba durchsucht (1)
Eine Geschichte, die von Azure Pipelines abhängig ist
Django super Einführung von Python-Anfängern! Teil 2 Ich habe versucht, die praktischen Funktionen der Vorlage zu nutzen
Eine Geschichte über den Versuch, den Testprozess eines 20 Jahre alten Systems in C zu verbessern
Erstellen Sie einen Bot, der die Anzahl der Personen, die für das neue Corona-Virus in Tokio positiv sind, an Slack sendet
Die Geschichte des Exportierens eines Programms
Eine Geschichte über das Erstellen eines Programms, mit dem die Anzahl der Instagram-Follower in einer Woche von 0 auf 700 erhöht wird
Eine Geschichte, die die Gegenwart von Qiita mit Qiita API + Elasticsearch + Kibana visualisiert
[Python] Ein Programm, das die Anzahl der gepaarten Socken berechnet
[Beispiel für eine Python-Verbesserung] Was ist die empfohlene Lernseite für Python-Anfänger?
Die Geschichte der Entwicklung einer WEB-Anwendung, die automatisch Fangkopien generiert [MeCab]
So erstellen Sie einen Wrapper, der die Signatur der zu umschließenden Funktion beibehält
Annäherungserklärung für Anfänger, um in Kaggle Titanic_1 unter den besten 1,5% (0,83732) zu sein
Was ist eine C-Sprachbibliothek? Welche Informationen sind für die Öffentlichkeit zugänglich?
Die Geschichte, ein Paket zu erstellen, das den Betrieb von Juman (Juman ++) & KNP beschleunigt
Ich habe versucht, das Ergebnis des A / B-Tests mit dem Chi-Quadrat-Test zu überprüfen
Annäherungserklärung für Anfänger, um in Kaggle Titanic_2 unter den besten 1,5% (0,83732) zu sein
So erhalten Sie den "Namen" eines Feldes, dessen Wert durch das Auswahlattribut im Django-Modell begrenzt ist
Ich habe ein Skript erstellt, um zu überprüfen, ob an der angegebenen Position der JSON-Datei in Python Englisch eingegeben wird.
Ich habe versucht zu bestätigen, ob die unvoreingenommene Schätzung der Standardabweichung wirklich unvoreingenommen ist, indem ich "10.000 Mal Münzen geworfen" habe.
Die Geschichte des Versuchs, den Client wieder zu verbinden
Die Geschichte, MeCab in Ubuntu 16.04 zu setzen