Inhaltsverzeichnis
Oracle SPfile bearbeiten und wiederherstellen
09/2013
Die Datenbank holt beim Start die Informationen über Ihre Parameter aus dem SPFile (der binären init.ora).
Das SPFile liegt meist unter $ORALCE_HOME/dbs oder %ORACLE_HOME%\database:
SQL> show parameter spfile NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ spfile string %ORACLE_HOME%\DATABASE\SPFILE% ORACLE_SID%.ORA
In einer Cluster Umgebung kann das SPfile auch auf einer ASM Platte liegen.
Parameter aus dem SPfile anzeigen
Parameter aus dem SPFile per Console auslesen:
cd $ORALCE_HOME/dbs strings spfileGPI.ora | grep compatible *.compatible=19.0.0.0.0
Parameter per SQL*Plus anzeigen:
SYS@GPI-?>SHOW parameter compatible NAME TYPE VALUE ------------------------------------ --------------------------------- -------------- compatible string 19.0.0.0.0
Alle Parameter auslesen per SQL mit ⇒ https://github.com/gpipperr/OraPowerShell/blob/master/Ora_SQLPlus_SQLcL_sql_scripts/init.sql
Parameter im SPfile anpassen/anlegen
mit alter system set <parameter>=<values> comment='Mein Commentar zu dieser Änderung' scope=spfile|both|memory sid='*' wird eine DB Parameter angepasst.
Der Kommentar ist optional und darf max VARCHAR2(255 BYTE) sein, d.h je nach eingestellten Zeichensatz auf Umlaute achten bzw. auf diese selbigen ganz verzichten.
sys:sql> ALTER SYSTEM SET SEC_MAX_FAILED_LOGIN_ATTEMPTS=30 COMMENT='GPI 17.02.2021 angepasst - Anwender können sich das Passwort nicht merken' SCOPE=spfile sid='*'; sys:sql> startup force sys:sql>SELECT NAME,VALUE,UPDATE_COMMENT FROM v$parameter WHERE NAME=LOWER('SEC_MAX_FAILED_LOGIN_ATTEMPTS'); Instance Parameter VALUE UPDATE_COMMENT -------------------- -------------------- ---------------------------------------- sec_max_failed_login_attempts 30 GPI 17.02.2021 angepasst - Anwender können sich das Passwort nicht merken
Wie sieht dann aber der Kommentar im SPfile aus?
.. *.sec_max_failed_login_attempts=30#GPI 17.02.2021 angepasst - Anwender k�nnen sich das Passwort nicht merken ..
Text Version erzeugen:
SYS@GPI-?>CREATE pfile='d:\temp\initOraGPI.log' FROM spfile; File created.
Auch hier ist die # der Trenner:
*.sec_max_failed_login_attempts=30#GPI 17.02.2021 angepasst - Anwender k�nnen sich das Passwort nicht merken
Aber nun ist der Umlaut noch schlimmer, am besten wohl auf Umlaute verzichten .-).
Ungewollte Potentiale
Und was passiert wenn wir das hier optimieren?
Wir können mal etwas längers als Kommentar verwenden, 256 Zeichen für den Anfang, oder z.b, nur die # etc.
shutdown IMMEDIATE startup nomount pfile='d:\temp\initOraGPI.log'
Ist der Kommentar zu lang wird abgeschnitten, Mehrere # nach einander werden ignoriert, Leerzeichen nach dem Hash # werden mit genommen, DB startet, auf den ersten Blick wohl sicher.
XSS?
Aber das wäre ein schöner Easter Egg Platz für eine XXS Attacke auf die Webbasierten Überwachungsools!
# in die init.ora eingetragen: *.sec_max_failed_login_attempts=30#<script>alert("XSS Hack over init.ora , I got you");</script> # oder über die kommentar Funtion per SQL hinterlegen SYS@GPI-?>select NAME,VALUE,UPDATE_COMMENT 2 from v$parameter 3 where NAME=lower('SEC_MAX_FAILED_LOGIN_ATTEMPTS'); Instance Parameter Value ---------------------------------------- -------------------- UPDATE_COMMENT ------------------------------------------------------------------- sec_max_failed_login_attempts 30 <script>alert("XSS Hack over init.ora , I got you");</script>
Zugegeben; der Angreifer muss schon ein Admin sein um das zu setzen, daher ist das wohl eher ungefährlich … solange alle Cloud Tools auch mit sowas umgehen können .-) und die Admin Oberfläche gegen XXS auch an ALLEN Stellen geschützt ist.
Parameter aus dem SPfile entfernen
Über alter system reset <parameter> scope=spfile sid='*' kann ein Parameter aus dem SPFile entfernt werden:
ALTER system reset fal_server scope=spfile sid='*'; -- Aber nur wenn der Parameter dort auch exisiert! ERROR at line 1: ORA-32010: cannot find entry TO DELETE IN SPFILE
SPfile wieder herstellen
Wird dort ein falscher Wert eingetragen, kann die DB nicht mehr starten.
Damit immer eine Kopie der letzten Version dieser Datei im Textformat vorliegt, wurde bei jedem Backup eine Sicherung davon angelegt.
rman>SQL "create pfile=''D:\oracle\recovery_area\<MYSID>\pfile\ini_<MYSID>.ora'' from spfile";
Wenn diese nicht vorliegt, den bestehenden SPFILE als Text auslesen und die Parameter per Hand in das init.ora Format bringen.
cd $ORALCE_HOME/dbs #eine alte Konfig vorher sichern!! mv initGPI.ora initGPI.ora_bck #text Datei erzeugen strings spfileGPI.ora > initGPI.ora #Manuell anpassen und hübschen, Werte prüfen etc. vi initGPI.ora
Ablauf:
- DB mit der Textversion starten
- Falls DB nicht startet, weil der Parameter Fehler bereits kopiert wurde, Fehler in der Textdatei bereinigen
- Neue SP Datei anlegen
Starten der DB mit
cmd>SET ORACLE_SID=<SID der DB , wo der SPFILE fehlt> cmd>sqlplus "/ as sysdba" sqlplus>startup pfile='D:\oracle\recovery_area\<MYSID>\pfile\ini_<MYSID>.ora' sqlplus>CREATE spfile FROM pfile='D:\oracle\recovery_area\<MYSID>\pfile\ini_<MYSID>.ora'; sqlplus>shutdown IMMEDIATE sqlplus>startup
oder aus Autobackup restaurieren, zuvor die DB mit einer neuen minimal Konfiguration starten, bzw. mit der init.ora aus dem Backup:
10G Syntax:
RMAN>CONNECT target / RMAN>startup nomount RMAN> SET DBID <mydbid>; RMAN> RUN { SET CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO 'D:\oracle\recovery_area\<MYSID>\backupset\<MYSID>_%F';; RESTORE SPFILE FROM AUTOBACKUP; }