パスワードが不明なユーザにログインする方法

本ページではパスワードが不明な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], [], [], [], [], [], [], [], [], [], [], []が発生するので注意してください。

★ORACLE案件承ります