По работе пришлось в течение некоторого времени разбираться с СУБД IBM DB2. Т.к. система коммерческая, то в интернете не так много информации на русском языке, поэтому решил описать некоторые особенности работы этой СУБД.
Начнем со входной точки в СУБД. В SQL SERVER конечной точкой является экземпляр (instance), в котором конечно могут быть отдельные базы данных, но конфигурация и модель безопасности единая для всего экземпляра. В DB2 же точка входа выглядит так — экземпляр (который соответствует конкретному порту) — база данных. При этом конфигурация есть и для целиком экземпляра, и для отдельной базы данных.
Посмотреть конфигурацию экземпляра можно либо с помощью db2-команды:
Где будут указаны параметры, их значение и расшифровка. Возможен также сокращенный вариант:
Либо с помощью запроса:
Из важных параметров можно отметить:
Посмотреть настройки конкретной базы можно так:
Либо примерно таким же запросом, как и ранее:
Большим отличием DB2 от других СУБД является модель аутентификации. Здесь нет внутренних пользователей, как в SQL Server или MySQL. Вся аутентификация производится внешними по отношению к СУБД средствами (динамически подгружаемыми плагинами) — средствами операционной системы либо внешними плагинами (Kerberos,GSS API). Тип аутентификации задается в параметре AUTHENTICATION конфигурации менеджера БД. По умолчанию выставлено значение SERVER — имя пользователя и пароль передается в открытом виде и данная пара проверяется на правильность средствами операционной системы. Если имя пользователя и пароль верны, то проверяется наличие привилегии CONNECT у пользователя или групп, в которые он входит (в т.ч. специальная группа PUBLIC, куда входят все авторизованные пользователи). Данные привилегии можно посмотреть в таблице SYSCAT.DBAUTH:
Большой ошибкой при настройке является включение типа аутентификации CLIENT. В этом случае DB2 доверяет проведение аутентификации подключаемому клиенту и если у PUBLIC есть привилегия CONNECT, то любой пользователь сможет подключиться к БД и получит доступ ко всем данным, которые есть у PUBLIC. Имя пользователя при этом берется из операционной системы. То есть если мы подключаемся через Data Studio пользователем Administrator, то будут предоставлены все привилегии, которые есть у данного пользователя. И в этом случае нет разницы, с какого компьютера был произведен доступ. Данный тип аутентификации рекомендуется включать только тогда, когда есть защищенный канал между сервером и клиентом, и другие клиенты не смогут подключиться к СУБД.
Привилегии уровня конкретного экземпляра прописываются в конфигурации менеджера БД. Это следующие привилегии:
Задаются данные привилегии с помощью указания группы, куда будет входить пользователь. В dbmcfg это соответственно параметры SYSADM_GROUP, SYSCTRL_GROUP, SYSMAINT_GROUP и SYSMON_GROUP.
Далее есть привилегии конкретной базы данных. Это такие привилегии, как доступ к базе данных (CONNECTAUTH), создание таблиц (CREATETABAUTH), создание подпрограмм (EXTERNALROUTINEAUTH) и тд. Данные привилегии можно просмотреть в представлении SYSCAT.DBAUTH
И наконец привилегии доступа к конкретным данным — таблицам, подпрограммам и тд. Здесь все довольно тривиально, но тоже с некоторыми особенностями.
Привилегии доступа к таблицам можно просмотреть в представлении SYSCAT.TABAUTH. Тип выданной привилегии хранится в отдельных колонках, в зависимости от самой привилегии (SELECTAUTH,DELETEAUTH и тд). При выдачи привилегии с помощью команды GRANT для привилегий REFERENCES и UPDATE можно также указать имена колонок, на которые будут распространяться данные привилегии. В этом случае информацию об этом можно посмотреть в представлении SYSCAT.COLAUTH
Привилегии подпрограмм (функций, процедур и методов) можно посмотреть в SYSCAT.ROUTINEAUTH. Здесь не совсем все тривиально, в зависимости от полей SPECIFICNAME и TYPENAME привилегии могут быть выданы на все подпрограммы заданной схемы.
Если читателям понравится статья, то готов рассказать по поводу защиты данных в DB2 с помощью Label-Based Access Control
Точка входа
Начнем со входной точки в СУБД. В SQL SERVER конечной точкой является экземпляр (instance), в котором конечно могут быть отдельные базы данных, но конфигурация и модель безопасности единая для всего экземпляра. В DB2 же точка входа выглядит так — экземпляр (который соответствует конкретному порту) — база данных. При этом конфигурация есть и для целиком экземпляра, и для отдельной базы данных.
Посмотреть конфигурацию экземпляра можно либо с помощью db2-команды:
get database manager configuration
Database Manager Configuration
Node type = Enterprise Server Edition with local and remote clients
Database manager configuration release level = 0x0b00
CPU speed (millisec/instruction) (CPUSPEED) = 2.912790e-07
Communications bandwidth (MB/sec) (COMM_BANDWIDTH) = 1.000000e+02
Max number of concurrently active databases (NUMDB) = 8
Federated Database System Support (FEDERATED) = YES
Transaction processor monitor name (TP_MON_NAME) =
Default charge-back account (DFT_ACCOUNT_STR) =
Java Development Kit installation path (JDK_PATH) = /home/db2inst1/sqllib/java/jdk32
Diagnostic error capture level (DIAGLEVEL) = 3
Notify Level (NOTIFYLEVEL) = 3
Diagnostic data directory path (DIAGPATH) = /home/db2inst1/sqllib/db2dump
Default database monitor switches
Buffer pool (DFT_MON_BUFPOOL) = OFF
Где будут указаны параметры, их значение и расшифровка. Возможен также сокращенный вариант:
get dbm cfg
Либо с помощью запроса:
select name, value from sysibmadm.dbmcfg
Из важных параметров можно отметить:
- тип аутентификации (AUTHENTICATION)
- путь по умолчанию для создания новых БД (DFTDBPATH)
- обнаружение сервера по сети (DISCOVER)
Посмотреть настройки конкретной базы можно так:
connect to sample (sample - имя бд)
get database manager configuration
Либо примерно таким же запросом, как и ранее:
select name, value from sysibmadm.dbcfg
Аутентификация
Большим отличием DB2 от других СУБД является модель аутентификации. Здесь нет внутренних пользователей, как в SQL Server или MySQL. Вся аутентификация производится внешними по отношению к СУБД средствами (динамически подгружаемыми плагинами) — средствами операционной системы либо внешними плагинами (Kerberos,GSS API). Тип аутентификации задается в параметре AUTHENTICATION конфигурации менеджера БД. По умолчанию выставлено значение SERVER — имя пользователя и пароль передается в открытом виде и данная пара проверяется на правильность средствами операционной системы. Если имя пользователя и пароль верны, то проверяется наличие привилегии CONNECT у пользователя или групп, в которые он входит (в т.ч. специальная группа PUBLIC, куда входят все авторизованные пользователи). Данные привилегии можно посмотреть в таблице SYSCAT.DBAUTH:
select GRANTEE from SYSCAT.DBAUTH where CONNECTAUTH = 'Y'
Большой ошибкой при настройке является включение типа аутентификации CLIENT. В этом случае DB2 доверяет проведение аутентификации подключаемому клиенту и если у PUBLIC есть привилегия CONNECT, то любой пользователь сможет подключиться к БД и получит доступ ко всем данным, которые есть у PUBLIC. Имя пользователя при этом берется из операционной системы. То есть если мы подключаемся через Data Studio пользователем Administrator, то будут предоставлены все привилегии, которые есть у данного пользователя. И в этом случае нет разницы, с какого компьютера был произведен доступ. Данный тип аутентификации рекомендуется включать только тогда, когда есть защищенный канал между сервером и клиентом, и другие клиенты не смогут подключиться к СУБД.
Авторизация
Привилегии уровня конкретного экземпляра прописываются в конфигурации менеджера БД. Это следующие привилегии:
- SYSADM
- SYSCTRL
- SYSMAINT
- SYSMON
Задаются данные привилегии с помощью указания группы, куда будет входить пользователь. В dbmcfg это соответственно параметры SYSADM_GROUP, SYSCTRL_GROUP, SYSMAINT_GROUP и SYSMON_GROUP.
Далее есть привилегии конкретной базы данных. Это такие привилегии, как доступ к базе данных (CONNECTAUTH), создание таблиц (CREATETABAUTH), создание подпрограмм (EXTERNALROUTINEAUTH) и тд. Данные привилегии можно просмотреть в представлении SYSCAT.DBAUTH
И наконец привилегии доступа к конкретным данным — таблицам, подпрограммам и тд. Здесь все довольно тривиально, но тоже с некоторыми особенностями.
Привилегии доступа к таблицам можно просмотреть в представлении SYSCAT.TABAUTH. Тип выданной привилегии хранится в отдельных колонках, в зависимости от самой привилегии (SELECTAUTH,DELETEAUTH и тд). При выдачи привилегии с помощью команды GRANT для привилегий REFERENCES и UPDATE можно также указать имена колонок, на которые будут распространяться данные привилегии. В этом случае информацию об этом можно посмотреть в представлении SYSCAT.COLAUTH
Привилегии подпрограмм (функций, процедур и методов) можно посмотреть в SYSCAT.ROUTINEAUTH. Здесь не совсем все тривиально, в зависимости от полей SPECIFICNAME и TYPENAME привилегии могут быть выданы на все подпрограммы заданной схемы.
Если читателям понравится статья, то готов рассказать по поводу защиты данных в DB2 с помощью Label-Based Access Control