Com base em uma pergunta anterior que fiz , estou tentando trabalhar em uma solução conforme recomendado pela resposta de mustaccio, na qual tenho outro ID para criar meus objetos DDL.
Eu tenho tentado seguir um artigo de desenvolvimento do IBM chamado "Segurança do DB2, Parte 8: Doze melhores práticas de segurança do DB2" em minha tentativa de fazê-lo. Percebi que parece que o artigo foi escrito para o DB2 8.2 na época. Atualmente, estou trabalhando no DB2 9.7 fix pack 4 ESE para LUW. Especificamente, estou no AIX. No momento, estou testando como fazer isso em meu sistema local, que é o Windowx XP SP3 e usando o DB2 9.7 fix pack 4 Express-C para LUW.
Eu tenho minha conta de usuário local (que é o proprietário da instância) chamada db2admin neste caso (não em nossos sistemas AIX). Este ID pertence ao grupo DB2ADMNS. Como é diferente da minha conta do Windows, certifico-me de anexar à instância primeiro e, em seguida, criar meu banco de dados para garantir que db2admin seja concedido DBADM
, SECADM
, DATAACCESS
, ACCESSCTRL
em meu banco de dados.
db2 attach to DB2 user db2admin using ********
db2 create database SECTEST automatic storage yes on 'C:\' dbpath on 'C:\'
using codeset UTF-8 territory US collate using system
Depois disso eu me conecto ao sistema como db2admin
db2 connect to sectest user db2admin using ********
Então, para testar as coisas, certifiquei-me de conceder CONNECT
e SECADM
à minha conta do Windows
db2 grant connect,secadm on database to user myid
E então eu queria configurar minha identidade falsa para criar objetos sob ela. Eu intencionalmente crio esse ID como nove caracteres para ajudar a impedir a conexão com o DB2 a partir da linha de comando, mas ainda o permito por meio de SET SESSION_USER
. Para simplificar, chamei meu ID de bobabob97.
Então eu fiz o seguinte:
db2 grant CREATETAB,IMPLICIT_SCHEMA,BINDADD,CREATE_NOT_FENCED_ROUTINE,
CREATE_EXTERNAL_ROUTINE on database to user bobabob97
db2 grant use of tablespace userspace1 to user bobabob97
Neste ponto, acho que tenho tudo configurado corretamente. Eu explicitamente não concedi bobabob97 CONNECT
no banco de dados porque não quero que ninguém consiga se conectar ao banco de dados com este ID.
Portanto, agora tento mudar para esse ID para criar o teste de criação de meus objetos e possuí-los sob um ID genérico.
db2 set session_user=bobabob97
Mas então recebo o seguinte erro:
DB21034E O comando foi processado como uma instrução SQL porque não era um comando válido do Processador de Linha de Comandos. Durante o processamento SQL, retornou: SQL0552N "DB2ADMIN" não possui privilégio para executar a operação "SET SESSION AUTHORIZATION". SQLSTATE=28000
Então, agora estou intrigado. O ID que estou atualmente conectado ao banco de dados como (db2admin) tem DBADM
, SECADM
, DATAACCESS
,e ACCESSCTRL
no banco de dados (e é claro que contém implicitamente CONNECT
, CREATETAB
, BINDADD
, QUIESCE_CONNECT
, IMPLICIT_SCHEMA
, LOAD
, CREATE_NOT_FENCED_ROUTINE
, e CREATE_EXTERNAL_ROUTINE
). Eu sou essencialmente "deus" no banco de dados. Por que não posso mudar para este ID?
Tentei brincar com GRANT SETSESSIONUSER
, mas sei SECADM
que não pode conceder a si mesmo. O que eu faço aqui?
Ok, acho que realmente descobri como lidar com isso. Eu precisava conceder ao meu
DBADM
,SECADM
a capacidade de transferir para qualquer ID por meio do grupo, não para o ID específico. Desta forma contorno asSECADM
restrições.Como meu ID db2admin está neste grupo, agora ele pode alternar para qualquer ID (a parte pública). Se eu quisesse apenas mudar para esse ID, poderia ter usado:
Então agora eu posso executar
e funciona.
Para voltar só preciso correr