Ограничение количества пользователей в файле паролей

В документации к Oracle указано, что имеется ограничение на количество пользователей включаемых в файл паролей. Оно зависит от размера блока операционной системы и кратно четырём. Так, например, для блока размером в 512 байт количество пользователей, которые могут храниться в файле паролей равно четырём. Попробуем на примере проверить так ли это на самом деле. Постепенно будем добавлять в файл паролей новых пользователей и посмотрим, что произойдёт.

Два пользователя SYS и USER1 в файле паролей у нас уже есть. Добавляем остальных:

SQL> grant sysdba to user2 identified by pass;     

Grant succeeded.

SQL> grant sysdba to user3 identified by pass;

Grant succeeded.

SQL> grant sysdba to user4 identified by pass;

Grant succeeded.

SQL> grant sysdba to user5 identified by pass;

grant sysdba to user5 identified by pass
*
ERROR at line 1:
ORA-01996: GRANT failed: password file
'/u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapworcl' is full

При включении пользователя USER5 вышла ошибка, сигнализирующая о том, что файл паролей полон. Вроде все, так как и описано в документации. Правда, с пользователем SYS это уже будет 5 пользователей, но всё равно это уже ближе к истине. Так почему же именно такое количество пользователей может находиться в файле паролей по умолчанию и как можно расширить этот предел? Попробуем разобраться в этом на примерах.

Вновь создаваемый файл паролей по умолчанию всегда имеет определённый размер 1536 байт. Почему именно такой размер, а не другой? Попробуем разделить это число на 512. Получиться 3. Значит, файл паролей условно можно разделить на три блока по 512 байт. Вроде многовато места будет для хранения только 5 пользователей. Заглянем внутрь файла. Для начала выведем первые 512 байт файла:

[oracle@ora11g dbs]$ xxd -l 512 orapworcl

0000000: 0000 0000 0002 0000 0200 0000 5d5c 5b5a  ............]\[Z
0000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000050: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000060: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000070: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000080: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000090: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000a0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000b0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000c0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000f0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000100: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000110: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000120: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000130: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000140: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000150: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000160: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000170: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000180: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000190: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00001a0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00001b0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00001c0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00001d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00001e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00001f0: 0000 0000 0000 0000 0000 0000 0000 0000  ................

Как видно это блок почти пуст, добавленных пользователей здесь нет. Поэтому заглянем во второй блок:

[oracle@ora11g dbs]$ xxd -s 512 -l 512 orapworcl

0000200: 4f52 4143 4c45 2052 656d 6f74 6520 5061  ORACLE Remote Pa
0000210: 7373 776f 7264 2066 696c 6500 0000 1b00  ssword file.....
0000220: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000230: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000240: 0100 0000 0000 0000 0000 0000 0000 0000  ................
0000250: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000260: 494e 5445 524e 414c 0000 0000 0000 0000  INTERNAL........
0000270: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000280: 0800 0000 3933 3645 3435 3532 3241 3642  ....936E45522A6B
0000290: 3937 3833 0000 0000 0000 0000 0000 0000  9783............
00002a0: 0000 0000 1000 0000 1f6a a782 7f29 eb49  .........j...).I
00002b0: 87eb a03e 49e3 7285 c1ab 9f2b 884d 2e79  ...>I.r....+.M.y
00002c0: e0c2 e4f4 a8a4 d100 5359 5300 0000 0000  ........SYS.....
00002d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00002e0: 0000 0000 0000 0000 0300 0000 3836 4331  ............86C1
00002f0: 3534 3034 4331 4142 3230 4130 0000 0000  5404C1AB20A0....
0000300: 0000 0000 0000 0000 0000 0000 1000 0000  ................
0000310: 1f41 78c1 a301 dd68 176b 2daf 02f8 fbd3  .Ax....h.k-.....
0000320: 5c25 29c0 75ad ed6e 5e16 b3e7 4810 0500  \%).u..n^...H...
0000330: 0000 0000 0000 0000 0000 0000 5553 4552  ............USER
0000340: 3100 0000 0000 0000 0000 0000 0000 0000  1...............
0000350: 0000 0000 0000 0000 0000 0000 0500 0000  ................
0000360: 4238 4345 4646 4342 4138 3835 3139 3435  B8CEFFCBA8851945
0000370: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000380: 1000 0000 1b23 4ba7 ff77 1857 0845 7072  .....#K..w.W.Epr
0000390: d2e0 4b00 243f 663c 276e b2ae df8f 1ca6  ..K.$?f<'n......
00003a0: 51b3 ce00 0000 0000 0000 0000 0000 0000  Q...............
00003b0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00003c0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00003d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00003e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00003f0: 0000 0000 0000 0000 0000 0000 0000 0000  ................

Здесь уже интереснее. Во втором блоке можно обнаружить пользователей SYS и USER1. Нетрудно догадаться так же, что остальные пользователи будут находиться в третьем блоке.

[oracle@ora11g dbs]$ xxd -s -512 orapworcl

0000400: 5553 4552 3200 0000 0000 0000 0000 0000  USER2...........
0000410: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000420: 0500 0000 3331 3633 3444 3530 3144 3342  ....31634D501D3B
0000430: 4244 3331 0000 0000 0000 0000 0000 0000  BD31............
0000440: 0000 0000 1000 0000 1b3c 9fe8 725e 4ea1  .........f
0000460: 7487 c495 5ed1 b800 5553 4552 3300 0000  t...^...USER3...
0000470: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000480: 0000 0000 0000 0000 0500 0000 4235 3734  ............B574
0000490: 3132 3338 3330 4546 3232 3936 0000 0000  123830EF2296....
00004a0: 0000 0000 0000 0000 0000 0000 1000 0000  ................
00004b0: 1bcc fb1f 6184 a10b 6619 2b27 5854 a364  ....a...f.+'XT.d
00004c0: 380c ba30 8c89 18f6 2f29 817b 4ffd 6a00  8..0..../).{O.j.
00004d0: 5553 4552 3400 0000 0000 0000 0000 0000  USER4...........
00004e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00004f0: 0500 0000 3430 3044 4437 4443 3743 4232  ....400DD7DC7CB2
0000500: 3938 3646 0000 0000 0000 0000 0000 0000  986F............
0000510: 0000 0000 1000 0000 1ba4 00b3 152f b1ca  ............./..
0000520: e9b4 c3f6 bc58 f305 f00a 8bb9 b774 e24c  .....X.......t.L
0000530: 4dcd c436 f259 f200 0000 0000 0000 0000  M..6.Y..........
0000540: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000550: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000560: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000570: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000580: 8000 0000 0000 0000 0000 0000 0000 0000  ................
0000590: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00005a0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00005b0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00005c0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00005d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00005e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00005f0: 0000 0000 0000 0000 0000 0000 0000 0000  ................

В последний блок влезли данные только о трёх пользователях. Пользователь USER5 здесь явно не поместился, хотя место для него имеется. Получается, что в документации отражены неверные сведения о четырёх пользователей в 512 байтном блоке? Проясним этот вопрос.

Ясно, что для того чтобы добавить ещё пользователей, придётся расширять файл паролей, то есть создавать его заново. Для этого в утилите ORAPWD есть опция ENTRIES, в которой, задаётся число планируемых пользователей в файле паролей. Попробуем пересоздать файл с этой опцией. В параметре укажем пять пользователей, так четыре пользователя (не считая SYS) у нас уже есть:

[oracle@ora11g dbs]$ orapwd file=orapworcl force=y entries=5

Enter password for SYS:

Посмотрим на размер файла:

[oracle@ora11g dbs]$ ls -l orapworcl

-rw-r-----. 1 oracle oinstall 2048 Янв 32 11:56 orapworcl

Он прибавил в размере. Причём на 512 байт, один блок. Повторим добавление в файл паролей пользователей USER1 – USER4 и попробуем создать и добавить пользователя USER5:

SQL> grant sysdba to user1, user2, user3, user4;

Grant succeeded.

SQL> grant sysdba to user5 identified by pass;

Grant succeeded.

Пользователь добавился. Попробуем добавить ещё одного:

SQL> grant sysdba to user6 identified by pass;

Grant succeeded.

Добавление так же прошло успешно. Почему? Ведь при создании файла было введено ограничение на 5 пользователей. Ответ на это найдём в документации Oracle. В ней сказано, что пользователи будут добавляться в файл паролей до тех пор, пока блок не будет заполнен полностью. Так как выше было выяснено, что в последнем блоке из 512 байт размещается 3 пользователя, в файл паролей можно будет добавить ещё одного пользователя USER7, после чего этот файл потребуется ещё раз пересоздать с новым значением ENTRIES:

SQL> grant sysdba to user7 identified by pass;

Grant succeeded.

SQL> grant sysdba to user8 identified by pass;

Grant succeeded.

Почему в файл паролей добавился пользователь USER8? Ведь по умолчанию в последнем блоке файла паролей помещалось только три пользователя. Оказывается, документация Oracle не соврала. В блоке из 512 байт действительно помещается 4 пользователя, правда только не в самом последнем блоке. Проверим это. Попробуем добавить ещё одного пользователя USER9:

SQL> grant sysdba to user9 identified by pass;

grant sysdba to user9 identified by pass
*
ERROR at line 1:
ORA-01996: GRANT failed: password file
'/u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapworcl' is full

Возникла ошибка. И так, файл паролей, состоящий из 4 блоков по 512 байт, на данный момент времени содержит восемь пользователей. Первый, из них, всегда располагается во втором блоке, четыре других в третьем и три последних пользователя в четвёртом. Такое расположение пользователей в файле паролей следует учитывать при задании опции ENTRIES. В приведённом примере можно задавать любое значение этой опции 6, 7, 8. Результат будет одинаковый. По сути, данная опция служит только для ограничения выделяемого пространства для файла паролей и лишь косвенно влияет на количество пользователей в нём.

Исключение пользователей из файла паролей

Со временем может понадобиться исключить того или иного пользователя из файла паролей. Если пользователь удаляется из системы, Oracle автоматически удаляет его и из файла паролей:

SQL> select * from v$pwfile_users 
 
USERNAME SYSDBA SYSOPER SYSASM
-------- ------ ------- ------
SYS      TRUE   TRUE    FALSE 
USER1    TRUE   FALSE   FALSE 
USER2    TRUE   FALSE   FALSE 
USER3    TRUE   FALSE   FALSE 
USER4    TRUE   FALSE   FALSE 
USER5    TRUE   FALSE   FALSE 
USER6    TRUE   FALSE   FALSE 
USER7    TRUE   FALSE   FALSE 
USER8    TRUE   FALSE   FALSE 

SQL> drop user user8;

User dropped.

SQL> select * from v$pwfile_users WHERE USERNAME = 'USER8'
 
USERNAME SYSDBA SYSOPER SYSASM
-------- ------ ------- ------
 
Выбрано: 0 строк 

Если пользователю нужно только запретить аутентификацию с помощью файла паролей, то для этого достаточно отобрать у него привилегии SYSDBA и SYSOPER Пользователь будет удалён из файла пароля, когда у него не будет ни одной из этих привилегий:

SQL> grant sysoper to user7;

Grant succeeded.

SQL> select * from v$pwfile_users WHERE USERNAME = 'USER7'
 
USERNAME SYSDBA SYSOPER SYSASM
-------- ------ ------- ------
USER7    TRUE   TRUE    FALSE

SQL> revoke sysdba from user7;

Revoke succeeded.

SQL> select * from v$pwfile_users WHERE USERNAME = 'USER7'
 
USERNAME SYSDBA SYSOPER SYSASM
-------- ------ ------- ------
USER7    FALSE  TRUE    FALSE

SQL> revoke sysoper from user7;

Revoke succeeded.
SQL> select * from v$pwfile_users WHERE USERNAME = 'USER7'
 
USERNAME SYSDBA SYSOPER SYSASM
-------- ------ ------- ------
 
Выбрано: 0 строк

Исключение пользователя из файла паролей не изменяет его размер. Информация о нём сохраняется в файле, но пространство им занимаемое становиться доступно для перезаписи другим включаемым пользователям. Продемонстрируем это. В предыдущем примере пользователи USER7 и USER 8 были «исключены» из файла паролей. Причём пользователь USER8 был удалён. В файле паролей эти пользователи находились в четвёртом последнем 512 байтном блоке. Выведем его содержимое:

[oracle@ora11g dbs]$ xxd -s -512 orapworcl

0000600: 5553 4552 3600 0000 0000 0000 0000 0000  USER6...........
0000610: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000620: 0500 0000 3144 3332 4131 3831 3035 3543  ....1D32A181055C
0000630: 3445 4436 0000 0000 0000 0000 0000 0000  4ED6............
0000640: 0000 0000 1000 0000 1b31 6ab3 5d3e 925a  .........1j.]>.Z
0000650: b736 2e69 c8cd 0f53 8d59 42da 3096 21bb  .6.i...S.YB.0.!.
0000660: 4d59 8978 24da fa00 5553 4552 3700 0000  MY.x$...USER7...
0000670: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000680: 0000 0000 0000 0000 0500 0000 3745 4137  ............7EA7
0000690: 3641 3733 4541 3038 3234 3630 0000 0000  6A73EA082460....
00006a0: 0000 0000 0000 0000 0000 0000 1000 0000  ................
00006b0: 1874 c741 6392 1a9e 74fe 3d04 ed19 0550  .t.Ac...t.=....P
00006c0: a382 b987 904f 569b 7b94 4dd5 2bfd 3e00  .....OV.{.M.+.>.
00006d0: 5553 4552 3800 0000 0000 0000 0000 0000  USER8...........
00006e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00006f0: 0500 0000 4235 3237 4446 3346 3844 4132  ....B527DF3F8DA2
0000700: 3341 4632 0000 0000 0000 0000 0000 0000  3AF2............
0000710: 0000 0000 1000 0000 1a34 e3d5 3b84 0a48  .........4..;..H
0000720: 265c c770 0da9 2da9 bba1 a962 35b0 3b0e  &\.p..-....b5.;.
0000730: 8c3a ea2a 4943 6f00 0000 0000 0000 0000  .:.*ICo.........
0000740: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000750: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000760: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000770: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000780: 8000 0000 0000 0000 0000 0000 0000 0000  ................
0000790: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00007a0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00007b0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00007c0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00007d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00007e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00007f0: 0000 0000 0000 0000 0000 0000 0000 0000  ................

Как видно информация о пользователях сохранилась. Таким образом, понятие «исключение из файла паролей» скорее логическое, чем физическое.

Безопасность

Если посмотреть дамп второго блока файла паролей, то среди его содержимого можно найти интересного пользователя INTERNAL. Представление V$PWFILE_USERS его не показывает, но он действительно включён в файл паролей. Данный пользователь применялся в качестве административного пользователя в предыдущих релизах Oracle (до 8.2 версии). Его предназначение в старших релизах Oracle неизвестно.

Почему данный пользователь не виден в представлении V$PWFILE_USERS? Ответ становиться очевиден, если заглянуть в исходный код представления:

SQL> select view_definition from v$fixed_view_definition WHERE view_name LIKE 
'GV$PWFILE_USERS';

VIEW_DEFINITION
------------------------------------------------------------
select inst_id,username,decode(sysdba,1,'TRUE','FALSE'),
decode(sysoper,1,'TRUE','FALSE'),
decode(sysasm,1,'TRUE','FALSE')  from x$kzsrt where valid=1
and username != 'INTERNAL' 

Информация о пользователях, включённых в файл паролей, выводится из динамической таблицы. X$KZSRT. Пользователь INTERNAL отсекается на уровне представления.

Кстати, таким образом можно исключить вывод в представлении V$PWFILE_USERS любого пользователя включённого в файл паролей. Этим могут воспользоваться злоумышленники, оставляющие потайные входы в базу данных. Поэтому стоит время от времени делать запрос непосредственно к таблице X$KZSRT на факт выявления несанкционированных пользователей.

Пользователи, включённые в файл паролей – это пользователя обладающие очень большими возможностями, поэтому не стоит бездумно предоставлять привилегии SYSDBA и SYSOPER каждому пользователю.

Стоит так же ограничивать доступ к файлу паролей и на уровне операционной системы. Даже если файл доступен только для чтения, в нём хранятся хэши паролей, зная которые можно при наличии специальных инструментов получит пароль привилегированных пользователей.

Выводы

Сделаем некоторые выводы из изложенной информации:

  • Аутентификация операционной системой имеет приоритет перед аутентификацией по файлу паролей.
  • Утилита ORAPWD всегда создаёт файл заново. Пользователи, хранившиеся в предыдущем файле, теряются.
  • Включение пользователей в файл паролей, синхронизация паролей при их изменении, удаление пользователей из файлов паролей осуществляется ORACLE автоматически при выполнении соответствующих SQL команд.
  • Пароли пользователей размещённых в файле паролей, начиная с версии 11G, зависят от регистра. Причём на эту зависимость никак не влияет значение параметра SEC_CASE_SENSITIVE_LOGON.
  • Пароли файла паролей можно сделать не зависящим от регистра символов, если при создании файла утилитой ORAPWD использовать опцию IGNORECASE.
  • Опция ENTRIES утилиты ORAPWD влияет только на размер (в 512 байтных блоках) создаваемого файла паролей.
  • В последнем блоке файла паролей размещается три пользователя, а не четыре. Первый пользователь всегда размещается во втором блоке вместе с пользователем SYS. Это следует учитывать при задании опции ENTRIES.
  • При удалении пользователя из файла паролей, место, им занимаемое, не освобождается, но доступно для другого пользователя. Таки образом пользователь физически не удаляется из файла паролей.