If you want to use Oracle file watcher, you need to Create a Credential. As there a password needs to be stored in the database, Oracle tries to save it in a secure way. But as the password must be decrypted for the purpose to login on the file watchers agent side, it is not safe at all:
The credentials are stored with
DBMS_SCHEDULER.CREATE_CREDENTIAL
. Here an example:exec DBMS_SCHEDULER.CREATE_CREDENTIAL(
credential_name => 'local_credential',
username => 'oracle', password => 'welcome1');
exec DBMS_SCHEDULER.CREATE_CREDENTIAL(
credential_name => 'local_credential2',
username => 'oracle2', password => 'welcome1');
It's quite easy to see the values again:
select o.object_name credential_name, username, password
FROM SYS.SCHEDULER$_CREDENTIAL c, DBA_OBJECTS o
WHERE c.obj# = o.object_id;
CREDENTIAL_NAME USERNAME PASSWORD
------------------ -------- ------------------------------------
LOCAL_CREDENTIAL oracle BWVYxxK0fiEGAmtiKXULyfXXgjULdvHNLg==
LOCAL_CREDENTIAL2 oracle2 BWyCCRtd8F0zAVYl44IhvVcJ2i8wNUniDQ==
At least the password is somehow encrypted, and even the password was welcome1 for both credentials, the encrypted string is not identical.
Nothing to blame here, but I mentioned, the password can be decrypted. So let's do so:
SELECT u.name CREDENTIAL_OWNER, O.NAME CREDENTIAL_NAME, C.USERNAME,
DBMS_ISCHED.GET_CREDENTIAL_PASSWORD(O.NAME, u.name) pwd
FROM SYS.SCHEDULER$_CREDENTIAL C, SYS.OBJ$ O, SYS.USER$ U
WHERE U.USER# = O.OWNER#
AND C.OBJ# = O.OBJ# ;
CREDENTIAL_OWNER CREDENTIAL_NAME USERNAME PWD
---------------- -------------------- -------- --------
SYS LOCAL_CREDENTIAL oracle welcome1
SYS LOCAL_CREDENTIAL2 oracle2 welcome1
Can you see it? It's there. Try it at home!
I don't blame anyone here. It's hard to store anything really safe in case you need to decrypt it also.
But don't expect your password save, if you store it with
DBMS_SCHEDULER.CREATE_CREDENTIAL
. Maybe it's slightly to easy to use
DBMS_ISCHED.GET_CREDENTIAL_PASSWORD
(ok, only SYS
can do so) but even it might be slightly more difficult in the future, the basic problem will still exist.
1 Kommentar:
Nice reading Martin. Problem with credentials is that whatever we think of as a solution, it can still be broken. dbms_isched can only be executed by sysdba.
Maybe ssh key's can help but than again, the passphrase has to be given somewhere, somehow.
For now, we must protect access where we can. Don't show more than needed.
Kommentar veröffentlichen