パスワードが不明なユーザにログインする方法
本ページではパスワードが不明なORACLEユーザにログインする方法を記載します。 (厳密には一時的にパスワードを変更した上で接続後、元のパスワードに戻す方法です)。 ORACLEのパスワードはSYS.USER$のpasswordカラムから取得できますがこの値は不可逆なロジックで暗号化されたものであり 元のパスワードの値を知ることはできません。しかしながら、パスワード変更DDL構文でパスワード値にこの暗号化後の値を指定できる構文が用意されており これを利用することでパスワードを元の値にセットしなおすことが可能です。
方法
「暗号化されたパスワード値」にはSYS.USER$のPASSWORD列の値を指定します。alter user &1 identified by values '<暗号化されたパスワード値>';
応用
以下のスクリプトはパスワードを指定せずに任意のユーザにログインする動作が実現できます。(一時的にパスワードが変更されるのでご注意ください)su.sql
set echo off whenever sqlerror exit column password new_value pw select password from sys.user$ where name = upper( '&1' ) / alter user &1 identified by tmppwd; connect &1/tmppwd alter user &1 identified by values '&pw'; show user whenever sqlerror continue実行例
J:\>sqlplus / as sysdba @su test SQL*Plus: Release 11.2.0.1.0 Production on 月 11月 3 16:40:06 2014 Copyright (c) 1982, 2010, Oracle. All rights reserved. Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options に接続されました。 16:40:07 SYS@ORCL112 > set echo off 旧 3: where name = upper( '&1' ) 新 3: where name = upper( 'test' ) PASSWORD ------------------------------------------------------------ 7A0F2B316C212D67 経過: 00:00:00.00 旧 1: alter user &1 identified by tmppwd 新 1: alter user test identified by tmppwd ユーザーが変更されました。 経過: 00:00:00.04 接続されました。 16:40:07 TEST@ORCL112 > set timing on 16:40:07 TEST@ORCL112 > set time on 16:40:07 TEST@ORCL112 > alter user &1 identified by values '&pw'; 旧 1: alter user &1 identified by values '&pw' 新 1: alter user test identified by values '7A0F2B316C212D67' ユーザーが変更されました。 経過: 00:00:00.03 16:40:07 TEST@ORCL112 > show user ユーザーは"TEST"です。
注意
・上記構文はマニュアルに記載がなくORACLE社のサポートが受けられないと思われるため本番環境での使用は基本避けてください。
・10.2まではDBA_USERS.PASSWORDでもUSER$.PASSWORDと同じ値が表示されるのでこちらに変えることもできます。11g以降はセキュリティ対策の一環として値がNULLで表示されるので利用できません。
・なお、パスワード値を指定せずに実行してしまうとORA-00600: 内部エラー・コード, 引数: [kzsviver:1], [], [], [], [], [], [], [], [], [], [], []が発生するので注意してください。