Imponha o isolamento de memória do usuário final com Deep Data Security
Este guia mostra como impor o isolamento do usuário final para um aplicativo Oracle AI Agent Memory com o OCI IAM e o Oracle Deep Data Security.
Aviso: Somente ambiente de aprendizagem. Não implante este exemplo na produção.
O aplicativo usa o servidor de desenvolvimento do Flask, um armazenamento de sessão na memória, segredos de arquivo de ambiente e tratamento simplificado do ciclo de vida do token. Os scripts de configuração do banco de dados modificam as definições e os privilégios do provedor de identidade em todo o banco de dados. Use apenas usuários descartáveis e um Oracle Autonomous AI Database isolado e não relacionado à produção.
Este guia cria um aplicativo web deliberadamente pequeno:
- Os usuários acessam o fluxo do Código de Autorização OAuth 2.0 do OCI IAM.
- A página lista apenas as memórias visíveis para o usuário conectado.
- Um formulário adiciona uma memória e expõe seu destino
username. Alice pode armazenar uma memória para ela, mas o Oracle AI Database rejeita a tentativa de Alice de armazená-la para Bob.
A rota não compara Alice e o próprio Bob. Ele passa o token do usuário final para o Oracle AI Database, onde o Oracle Deep Data Security impõe a política de linha própria do Agent Memory.
Este guia demonstra uma implantação. Para obter o recurso de segurança completo, incluindo todas as políticas, principais, função de administração, API de contexto de runtime, auditoria e tempo de revogação suportados, consulte a Referência de segurança e API de Segurança de Dados Profunda.
Neste guia, você irá:
- registrar um recurso de banco de dados e um aplicativo Web em um domínio de identidades do IAM do OCI;
- adicionar a reivindicação de token do
groupdo OCI IAM usada para ativar atribuições de dados do banco de dados; - configurar contas separadas de banco de dados security-administrator, schema-owner e application-pool;
- criar um armazenamento de Memória do Agente e conceder sua política de linha própria a um grupo do OCI IAM;
- executar o aplicativo web e verificar o isolamento do usuário imposto pelo banco de dados.
Entenda a cadeia de confiança
O browser e o aplicativo usam dois tokens de acesso OAuth diferentes:
- O token do usuário final identifica Alice ou Bob e inclui os grupos do IAM do usuário.
- O token database-access, obtido pelo aplicativo confidencial por meio de Credenciais do Cliente, prova que o aplicativo pode acessar o recurso do banco de dados.
O Oracle AI Database valida os dois tokens antes de anexar o contexto de segurança do usuário final.
A Oracle documenta esse modelo de dois tokens em Entender Fluxo de Autenticação e Pré-requisitos e o ciclo de vida completo em Contexto de Segurança do Usuário Final.
Pré-requisitos
Você precisa:
- uma versão isolada do Oracle Autonomous AI Database que suporta o Oracle Deep Data Security;
- um domínio de identidades do IAM do OCI no mesmo tenancy, com permissão para gerenciar aplicativos, usuários, grupos e reivindicações personalizadas;
- uma conta de administrador de segurança de banco de dados existente, normalmente
ADMINno Autonomous AI Database; - SQL*Plus em
PATHe uma wallet do Autonomous AI Database ou configuração de conexão TLS; - Python 3.10 a 3.14,
uve este repositório.
O Oracle Deep Data Security é uma autorização detalhada imposta pelo banco de dados. Consulte O que é Oracle Deep Data Security.
Configurar o domínio de identidades do OCI IAM
Faça todo o trabalho do OCI IAM em um domínio de identidades. Registre seu URL de Domínio, por exemplo, https://idcs-<id>.identity.oraclecloud.com:443.
O passo a passo autorizado da Oracle é Configurar o OCI IAM para Acesso Mediado por Aplicativos. Os valores no exemplo a seguir correspondem ao arquivo de ambiente de exemplo fornecido com este guia.
Registrar o recurso de banco de dados
Em Domínio de identidades > Aplicativos integrados:
- Adicione um Aplicativo Confidencial chamado
OracleDB. - Configure-o como um servidor de recursos:
- Público-alvo principal:
OracleDB - Escopo:
DB_ACCESS_SCOPE
- Público-alvo principal:
- Configure-o como um cliente e permita Credenciais do Cliente.
- Ative-a.
- Registre seu ID do Aplicativo, seu ID do Cliente e seu Segredo do cliente.
O escopo do banco de dados totalmente qualificado é o público concatenado com o nome do escopo:
OracleDBDB_ACCESS_SCOPE
Siga Registrar o Banco de Dados no OCI IAM para obter os labels da Console e as descrições de campo atuais.
Registrar o aplicativo web
Adicione um segundo Aplicativo Confidencial chamado OracleAgentMemoryWeb:
- Ative Impor concessões como autorização.
- Configure-o como um servidor de recursos:
- Público-alvo principal:
OracleAgentMemoryWeb - Escopo:
APP_ACCESS_SCOPE - Vida útil do token de acesso:
3600segundos para este exercício
- Público-alvo principal:
- Configure-o como um cliente com estas concessões:
- Código de Autorização
- Credenciais do Cliente
- Adicione esta URL de redirecionamento exata:
http://127.0.0.1:8000/auth/callback - Em recursos do cliente, conceda acesso a ambos:
OracleDBDB_ACCESS_SCOPEOracleAgentMemoryWebAPP_ACCESS_SCOPE
- Ative o aplicativo e registre seu ID do Cliente e seu Segredo do cliente.
O aplicativo usa o Código de Autorização com state e PKCE S256. O OCI IAM documenta a configuração de cliente necessária em Registrar o Aplicativo no OCI IAM e fornece um exemplo de Código de Autorização PKCE.
Adicionar a reivindicação do grupo
O Oracle AI Database ativa atribuições de dados mapeadas externamente da reivindicação group do token do usuário final. As reivindicações personalizadas do OCI IAM são configuradas por meio da API REST de domínio de identidades, não da Console.
Como Administrador de Domínio de Identidades, faça download de um token de acesso pessoal de curta duração que possa chamar APIs de domínio de identidades. Depois, execute:
export OCI_IAM_DOMAIN_URL='https://<identity-domain-host>:443'
export OCI_IAM_ADMIN_TOKEN='<short-lived-personal-access-token>'
curl --fail-with-body \
-X POST "$OCI_IAM_DOMAIN_URL/admin/v1/CustomClaims" \
-H "Authorization: Bearer $OCI_IAM_ADMIN_TOKEN" \
-H "Content-Type: application/scim+json" \
-d '{
"schemas": [
"urn:ietf:params:scim:schemas:oracle:idcs:CustomClaim"
],
"name": "group",
"value": "$user.groups.*.display",
"expression": true,
"mode": "always",
"tokenType": "AT",
"allScopes": true
}'
Uma solicitação bem-sucedida retorna HTTP 201. Não crie uma duplicata se o domínio já tiver essa reivindicação. Consulte Configurar Reivindicações Personalizadas para Informações de Grupo no OCI IAM.
Criar Alice, Bob e o grupo de aplicativos
- Crie um grupo chamado
ORACLEAGENTMEMORY_USERS. - Crie usuários de teste
aliceebob. - Atribua ambos os usuários a
ORACLEAGENTMEMORY_USERS. - Atribua o grupo a
OracleAgentMemoryWeb.
Posteriormente, o banco de dados mapeará esse nome de grupo para uma atribuição de dados. Os nomes de grupo são comparados sem distinção entre maiúsculas e minúsculas, mas usam a mesma grafia em toda a configuração. Consulte Criar Usuários e Designar Grupos no OCI IAM.
Preparar o ambiente
Faça download do aplicativo Web completo, deepsec_oci_iam_webapp.zip. O arquivo também contém scripts de inspeção e configuração de banco de dados independentes pertencentes a este exemplo. Eles não importam nem empacotam scripts do conjunto de testes do SDK.
Extraia o arquivo compactado, informe seu diretório de projeto e crie arquivos de ambiente de configuração e tempo de execução locais:
unzip deepsec_oci_iam_webapp.zip
cd deepsec_oci_iam_webapp
cp deepsec.env.example .deepsec.env
cp deepsec.runtime.env.example .deepsec.runtime.env
python -c "import secrets; print(secrets.token_hex(32))"
Coloque o valor gerado em OAM_WEB_SECRET_KEY e preencha cada espaço reservado necessário em ambos os arquivos. Ambos os nomes de arquivos são ignorados pelo Git.
O diretório database_scripts contém:
| Arquivo | Responsabilidade |
|---|---|
_common.sh |
O auxiliar privado que carrega .deepsec.env, valida valores obrigatórios, verifica o SQL*Plus e exporta TNS_ADMIN quando configurado. Não os execute diretamente. |
db_ociiam_setup.sh |
Ativa a autenticação externa do OCI IAM para o Autonomous AI Database de destino e substitui o OCI_IAM_DOMAIN_DB_CRED$. |
db_deepsec_user_setup.sh |
Cria o proprietário do esquema e os usuários do pool de aplicativos e concede suas listas de permissões de privilégios documentados. |
db_list_all_data_roles.sh |
Executa inspeção somente leitura de atribuições de Segurança de Dados Profunda, mapeamentos do IAM, concessões de dados, predicados, objetos protegidos, usuários finais e identidades de aplicativos. |
.deepsec.env é usado somente pela configuração do banco de dados. Inclui as senhas do administrador de segurança e do proprietário do esquema. .deepsec.runtime.env é carregado pelo processo do Flask e exclui intencionalmente ambas as senhas privilegiadas. Não exporte o arquivo de configuração para o shell que inicia o aplicativo Web. Para usar caminhos diferentes, defina OAM_DEEPSEC_ENV_FILE para configuração ou OAM_WEB_ENV_FILE para o processo Web.
Os valores importantes do IAM são mapeados da seguinte forma:
| Variável do ambiente | Valor do OCI IAM |
|---|---|
OAM_DEEPSEC_OCI_DB_APP_ID |
ID do Aplicativo do aplicativo de banco de dados |
OAM_DEEPSEC_OCI_DB_CLIENT_ID |
ID do Cliente do aplicativo de banco de dados |
OAM_DEEPSEC_OCI_DB_CLIENT_SECRET |
Segredo do cliente do aplicativo de banco de dados |
OAM_WEB_OCI_CLIENT_ID |
ID do Cliente do aplicativo Web |
OAM_WEB_OCI_CLIENT_SECRET |
Segredo do cliente do aplicativo Web |
OAM_WEB_OCI_END_USER_SCOPE |
OracleAgentMemoryWebAPP_ACCESS_SCOPE |
OAM_WEB_OCI_DATABASE_ACCESS_SCOPE |
OracleDBDB_ACCESS_SCOPE |
OAM_DEEPSEC_CONFIG_DIR é necessário somente quando o DSN é um alias TNS cujo tnsnames.ora não é detectável. A localização e a senha da wallet são opcionais quando sqlnet.ora e o DSN já fornecem tudo o que o python-oracledb precisa. Para obter opções de conexão do Autonomous AI Database, consulte Connect Python Applications with a Wallet.
Configure também um profissional de saúde de incorporação. O aplicativo apenas lista e adiciona memórias, mas a Memória do Agente ainda cria incorporações quando armazena o conteúdo da memória. O modelo usa um modelo compatível com OpenAI como exemplo; substitua o modelo, a base da API, a chave e a dimensão pelos valores do seu provedor.
Configurar as três contas de banco de dados
Aviso: Os comandos desta seção alteram as definições de autenticação externa e os privilégios de conta em todo o banco de dados. Inspecione os scripts primeiro. Não execute-os em um banco de dados compartilhado ou de produção.
Use três usuários distintos de banco de dados:
| Responsabilidade | Exemplo de conta | Trabalho permitido |
|---|---|---|
| Administrador de segurança | ADMIN |
Permite a integração do OCI IAM e cria, concede, revoga, lista e remove atribuições de dados e concessões de dados. Nunca é usado para solicitações da web. |
| Proprietário do esquema gerenciado | OAM_SCHEMA_OWNER |
Cria tabelas de Memória do Agente, índices, procedimentos e jobs do scheduler. Ele é usado apenas para operações do ciclo de vida do esquema. |
| Usuário do Banco de Dados do Aplicativo | OAM_APP_DB_USER |
Abre sessões e anexa contextos de segurança do usuário final. Ele não recebe privilégios SELECT, INSERT, UPDATE ou DELETE comuns. |
Esta separação faz uma solicitação sem que um contexto de usuário final válido falhe fechado. O guia de configuração do banco de dados da Oracle recomenda CREATE SESSION e CREATE END USER SECURITY CONTEXT para a conta do pool de conexões; consulte Configurar o Banco de Dados para Integração do Serviço IAM.
O exemplo usa a conta ADMIN do Autonomous AI Database para configuração. Uma conta personalizada de administrador de segurança deve ser capaz de criar e alterar os dois usuários do banco de dados e conceder seus privilégios de sistema listados. Como as tabelas da Memória do Agente pertencem a um esquema separado, a administração de políticas requer CREATE ANY DATA GRANT, DROP ANY DATA GRANT e ADMINISTER ANY DATA GRANT, em vez de apenas CREATE DATA GRANT no próprio esquema do administrador. Ele também deve estar autorizado a criar e eliminar as atribuições de dados usadas pelas políticas.
Ativar validação de token do OCI IAM
Revise e execute:
bash database_scripts/db_ociiam_setup.sh
O script se conecta como o administrador de segurança e:
- chama
DBMS_CLOUD_ADMIN.ENABLE_EXTERNAL_AUTHENTICATIONcom o ID do aplicativo de banco de dados e o URL do domínio de identidade; - cria a credencial
OCI_IAM_DOMAIN_DB_CRED$criptografada com o ID de cliente e o segredo do aplicativo de banco de dados; - imprime os parâmetros do provedor de identidade resultante.
Somente um provedor de identidades externo pode estar ativo. O exemplo de script usa force => TRUE para atualizar os parâmetros do OCI IAM, que podem interromper outra configuração de autenticação externa. O sistema Oracle documenta as chamadas exatas do Autonomous Database em Configurar o Banco de Dados para Integração do Serviço IAM.
Criar o proprietário e os usuários do pool
Revise e execute:
bash database_scripts/db_deepsec_user_setup.sh
O script não altera ADMIN. Ele cria o proprietário e os usuários do pool de aplicativos e concede:
-- Managed-schema owner
CREATE SESSION, CREATE TABLE, CREATE SEQUENCE,
CREATE VIEW, CREATE PROCEDURE, CREATE JOB
-- Runtime application pool
CREATE SESSION, CREATE END USER SECURITY CONTEXT
O proprietário recebe cota no tablespace DATA do Autonomous AI Database. O usuário do pool não recebe privilégios diretos nas tabelas do proprietário. Para manter o exemplo focado nas instruções necessárias, o script não verifica usuários existentes nem inspeciona seus privilégios atuais. Use novos nomes de conta; o script será interrompido se o usuário já existir ou outra instrução SQL falhar.
Criar a política de armazenamento e de linha própria
Instale o ambiente de exemplo independente:
uv sync
Em seguida, execute o programa de definição:
uv run python scripts/setup_memory.py
Este comando só é intencionalmente destrutivo para OAM_WEB_MEMORY_STORE_ID. Ele:
- se conecta como proprietário do esquema para recriar o esquema da Memória do Agente;
- se conecta como administrador de segurança para adicionar a política de linha própria e concedê-la a
ORACLEAGENTMEMORY_USERS.
As chamadas de administração de adição e concessão são idempotentes. A reexecução deles substitui as mesmas definições e designações de política gerenciadas e a repetição repara a DDL gerenciada parcial deixada por uma tentativa interrompida.
A política cria uma atribuição de dados mapeada externamente para o grupo do OCI IAM e concessões de dados cujo predicado de linha compara valores user_id armazenados com ORA_END_USER_CONTEXT.username. O sistema Oracle documenta a sintaxe de mapeamento em CREATE DATA ROLE e autorização de linha em CREATE DATA Grants.
Inspecione o resultado:
bash database_scripts/db_list_all_data_roles.sh
Você deverá ver a atribuição mapeada pelo IAM, as concessões de dados de Memória do Agente e suas tabelas protegidas de esquema do proprietário. Este script de inspeção consulta apenas as exibições do catálogo; ele não cria, altera nem remove objetos de Segurança de Dados Profundos.
Use um modelo de incorporação no banco de dados com Deep Sec
Esta seção se aplica quando o aplicativo usa OracleDBEmbedder com o provider="database" padrão e um modelo de incorporação armazenado no Oracle AI Database, geralmente um modelo ONNX importado, como DMUSER.DOC_MODEL. Nesta configuração, a incorporação direta usa o operador SQL VECTOR_EMBEDDING da Oracle, de modo que o modelo requer o privilégio SELECT ON MINING MODEL descrito abaixo.
O OracleDBEmbedder também suporta provedores remotos por meio do DBMS_VECTOR_CHAIN.UTL_TO_EMBEDDING, por exemplo, com provider="openai". Essas configurações ainda chamam a solicitação de incorporação do Oracle AI Database, mas não acessam um modelo de mineração residente no banco de dados; as instruções SELECT ON MINING MODEL nesta seção não se aplicam. As operações de Memória do Agente ainda devem ser executadas em um OracleMemoryEndUserSecurityContext.
Uma política de Memória do Agente concede acesso às tabelas de Memória do Agente. Ele não concede acesso a um modelo de incorporação do Oracle AI Database. O modelo precisa de seu próprio privilégio de banco de dados: SELECT ON MINING MODEL.
Não conceda esse privilégio ao usuário do pool de aplicativos. Durante uma solicitação, a Deep Sec autoriza o usuário por meio da atribuição de dados mapeada do grupo do OCI IAM, não por meio dos privilégios normais do usuário do pool. Portanto, um privilégio concedido apenas ao usuário do pool está indisponível enquanto um contexto de segurança de usuário final está ativo.
Crie uma atribuição de dados mapeada para cada grupo do IAM que precise usar o modelo. Atribua a essa atribuição de dados uma atribuição de banco de dados normal que tenha acesso ao modelo. Execute o SQL a seguir como administrador de segurança do banco de dados ou outra conta autorizada a criar atribuições e conceder acesso ao modelo. Substitua os nomes de exemplo pelos nomes de seu aplicativo:
-- This must exactly match the OCI IAM group passed to OciGroupPrincipal.
CREATE DATA ROLE APP_MEMORY_USERS_DATA_ROLE
MAPPED TO 'IAM_OAUTH_GROUP=YOUR_IAM_GROUP';
-- This ordinary database role carries access to one embedding model.
CREATE ROLE APP_DOC_MODEL_ROLE;
GRANT SELECT ON MINING MODEL YOUR_USER.DOC_MODEL
TO APP_DOC_MODEL_ROLE;
-- Give model access to the IAM group's Deep Sec data role.
GRANT APP_DOC_MODEL_ROLE TO APP_MEMORY_USERS_DATA_ROLE;
Em seguida, o aplicativo usa o mesmo nome de grupo quando concede políticas de Memória do Agente:
grant_agent_memory_policies(
admin_connection,
owner_schema="OAM_SCHEMA_OWNER",
memory_store_id="MEMORY",
principals=[OciGroupPrincipal("YOUR_IAM_GROUP")],
policies=[UserOwnRowsDeepDataSecurityPolicy()],
)
grant_agent_memory_policies() localiza a atribuição existente mapeada para YOUR_IAM_GROUP e adiciona as concessões de dados da tabela Memória do Agente a essa mesma atribuição. Ele não cria uma segunda atribuição. No runtime, um usuário cujo token do OCI IAM contenha YOUR_IAM_GROUP pode acessar as linhas permitidas da Memória do Agente e DMUSER.DOC_MODEL.
Se o aplicativo já tiver chamado grant_agent_memory_policies() antes da configuração deste modelo, a Memória do Agente já terá criado a atribuição de dados mapeados. Não crie outra função mapeada para o mesmo grupo. Localize a atribuição existente e conceda a atribuição de modelo comum a ela:
SELECT data_role
FROM sys.dba_data_roles
WHERE UPPER(mapped_to) = UPPER('IAM_OAUTH_GROUP=YOUR_IAM_GROUP');
GRANT APP_DOC_MODEL_ROLE TO <DATA_ROLE_RETURNED_BY_THE_QUERY>;
Mantenha cada operação de runtime OracleDBEmbedder dentro de OracleMemoryEndUserSecurityContext. Não use o proprietário do esquema, uma conexão de administrador separada ou uma conexão sem um contexto de segurança de usuário final para executar incorporações para uma solicitação de usuário. Isso contornaria o limite de autorização da Deep Sec.
Compreender o aplicativo
O projeto para download, deepsec_oci_iam_webapp.zip, contém o aplicativo web completo e scripts de banco de dados. As principais peças de aplicação são deliberadamente pequenas.
Iniciar e concluir OAuth
A rota de log-in cria valores aleatórios state e PKCE. Somente o ID da sessão opaca é colocado em um cookie HttpOnly, SameSite=Lax; os tokens permanecem no armazenamento da sessão de demonstração process-local.
def start_authorization(config: RuntimeConfig) -> AuthorizationRequest:
"""Build a state-bound Authorization Code request with PKCE."""
state = secrets.token_urlsafe(32)
code_verifier = secrets.token_urlsafe(64)
challenge = (
base64.urlsafe_b64encode(hashlib.sha256(code_verifier.encode()).digest())
.rstrip(b"=")
.decode("ascii")
)
query = urllib.parse.urlencode(
{
"client_id": config.oauth_client_id,
"response_type": "code",
"redirect_uri": config.redirect_uri,
"scope": config.end_user_scope,
"state": state,
"code_challenge": challenge,
"code_challenge_method": "S256",
}
)
return AuthorizationRequest(
url=f"{config.domain_url}/oauth2/v1/authorize?{query}",
state=state,
code_verifier=code_verifier,
)
def exchange_authorization_code(
config: RuntimeConfig,
code: str,
code_verifier: str,
) -> EndUserToken:
"""Exchange one browser authorization code for an end-user token."""
payload = _token_request(
config,
{
"grant_type": "authorization_code",
"code": code,
"redirect_uri": config.redirect_uri,
"code_verifier": code_verifier,
},
)
access_token, expires_at = _required_access_token(payload)
return EndUserToken(
access_token=access_token,
username=_display_username(access_token),
expires_at=expires_at,
)
O callback compara state em tempo constante e troca o código com o mesmo URI de redirecionamento e verificador PKCE. O aplicativo obtém separadamente um token de acesso ao banco de dados:
def get(self, config: RuntimeConfig) -> str:
"""Return a current database-access token."""
with self._lock:
if self._token is not None and time.time() < self._expires_at - 60:
return self._token
payload = _token_request(
config,
{
"grant_type": "client_credentials",
"scope": config.database_access_scope,
},
)
self._token, self._expires_at = _required_access_token(payload)
return self._token
O OCI IAM documenta as duas solicitações de token em Validar a Configuração do OCI IAM.
Escopo de cada operação de Memória do Agente
O aplicativo combina ambos os tokens em um contexto de segurança de usuário final python-oracledb. Em seguida, ele faz o escopo de cada inicialização e operação de armazenamento com OracleMemoryEndUserSecurityContext:
def list_visible_memories(
config: RuntimeConfig,
pool: Any,
user_context: Any,
) -> list[Any]:
"""List rows visible to the effective OCI IAM end user."""
with OracleMemoryEndUserSecurityContext(user_context):
store = create_runtime_store(config, pool)
return store.list("memory", limit=100)
def add_memory(
config: RuntimeConfig,
pool: Any,
user_context: Any,
content: str,
target_username: str,
) -> None:
"""Attempt to insert a row for the username supplied by the browser."""
with OracleMemoryEndUserSecurityContext(user_context):
store = create_runtime_store(config, pool)
store.add(
contents=[content],
record_type="memory",
user_ids=[target_username],
)
O armazenamento de runtime usa SchemaPolicy.NO_CHECK porque a criação, validação, upgrades e recriação do esquema pertencem ao caminho de configuração do proprietário do esquema. O SDK rejeita outra política de esquema enquanto o contexto do usuário final está ativo e rejeita operações posteriores neste armazenamento de runtime protegido quando nenhum contexto está ativo. As funções de administração de segurança também rejeitam conexões que carregam um contexto de usuário final.
Para cada operação do banco de dados de Memória do Agente, o gerenciador de contexto:
- adquire uma conexão física do pool de aplicativos;
- anexa e verifica o contexto de segurança do usuário final pretendido;
- executa o SQL sob essa identidade;
- limpa e verifica o contexto antes de retornar a conexão.
A conta de banco de dados do pool não tem privilégios de tabela de fallback. A API de carga útil de python-oracledb está documentada em Criação de Carga Útil de Contexto de Segurança do Usuário Final. A Referência de segurança e API de Segurança de Dados Profundos explica o contrato completo do gerente de contexto.
Deixe o banco de dados decidir
A rota encaminha o nome de usuário enviado inalterado. Ele captura e higieniza erros de banco de dados, mas não contém ramificação de autorização username == signed_in_user:
@web.route("/", methods=["GET", "POST"])
def index() -> Response | tuple[str, int]:
"""Show visible memories and let the user attempt one insert."""
config, pool, _ = _extensions()
_, session = _session()
if session is None or session.end_user_token is None:
return render_template("index.html", session=None, memories=[])
message = None
status = 200
try:
user_context = _security_context(config, session)
if request.method == "POST":
if not hmac.compare_digest(
request.form.get("csrf_token", ""),
session.csrf_token,
):
return render_template("error.html", message="The form expired."), 400
content = request.form.get("content", "").strip()
target_username = request.form.get("username", "").strip()
if not content or not target_username:
message = "Content and username are required."
status = 400
elif len(content) > 4000 or len(target_username) > 255:
message = "The submitted memory is too large."
status = 400
else:
try:
add_memory(
config,
pool,
user_context,
content,
target_username,
)
message = "Memory added."
except oracledb.DatabaseError:
#Keep listing permitted rows after the deliberately denied write.
message = "Oracle AI Database denied this operation for the effective end user."
status = 403
memories = list_visible_memories(config, pool, user_context)
except oracledb.DatabaseError:
#Never expose raw database errors, token contents, or submitted values.
message = "Oracle AI Database denied this operation for the effective end user."
memories = []
status = 403
except OAuthError:
message = "The login session expired. Sign in again."
memories = []
status = 401
return (
render_template(
"index.html",
session=session,
memories=memories,
message=message,
),
status,
)
Jinja escapa do conteúdo de memória exibido. Exceções de banco de dados bruto, respostas OAuth, tokens e valores enviados nunca são renderizados.
Executar e verificar o aplicativo
Inicie o servidor de desenvolvimento Flask:
uv run python run.py
Abra http://127.0.0.1:8000.
Verifique o limite de autorização:
- Entre como Alice.
- Adicione
Alice's first memorycom o nome de usuário preenchidoalice. - Confirme se a memória aparece em Memórias visíveis.
- Adicione
Alice tries to write for Bob, mas altere o nome de usuário parabob. - Confirme se o Oracle AI Database nega a operação.
- Desconecte-se, entre como Bob e confirme que a memória de Alice não está visível.
- Adicione uma memória como Bob, entre novamente como Alice e confirme que a memória de Bob não está visível.
Isso demonstra dois controles independentes:
SELECTretorna somente linhas cujauser_idcorresponde à identidade efetiva.INSERTnão pode criar uma linha cujauser_idpertença a outra identidade.
Para operações de produção, configure o Oracle Unified Auditing para a administração de Deep Sec e as ações de contexto de segurança do usuário final que sua organização deve manter. Considere também o contrato de tempo de revogação documentado: a revogação da política do SDK é confirmada antes do retorno da chamada de administração, enquanto a remoção de um usuário de um grupo do OCI IAM não reescreve um token de acesso já emitido. Consulte Deep Data Security para obter orientação de auditoria, comportamento de expiração de token e links para a documentação correspondente do Oracle Deep Sec e do OCI IAM.
Se o log-in for bem-sucedido, mas o banco de dados negar todas as operações, inspecione o token do usuário final e verifique se group contém ORACLEAGENTMEMORY_USERS. A Solução de problemas de privilégios e acesso de Segurança de Dados Profundos da Oracle também descreve como um administrador pode inspecionar atribuições de dados ativas.
O que a produção ainda requer
Aviso: a conclusão deste guia não torna o exemplo pronto para produção.
Antes de adaptar o projeto, substitua ou adicione pelo menos:
- um servidor WSGI de produção por trás do TLS, configuração de proxy confiável e cookies seguros;
- um armazenamento de sessão do lado do servidor criptografado durável com controles de expiração, rotação, propagação de logout e simultaneidade;
- um armazenamento secreto gerenciado em vez de arquivos dotenv;
- comportamento de atualização ou reautenticação, tratamento de revogação de token e expiração com reconhecimento de alteração de relógio;
- limitação de taxa, timeouts de solicitação, registro de auditoria sem tokens ou conteúdo do usuário e monitoramento operacional;
- CSRF específico para implantação, Política de Segurança de Conteúdo, cabeçalhos de segurança, restrições de entrada e tratamento de erros;
- procedimentos de migração e de alteração de políticas que não utilizem
RECREATE; - Identidades de implantação separadas e limites de rede para administração, migração de esquema e tempo de execução;
- testes de alta simultaneidade, cancelamento, limpeza de contexto e troca de identidade para a configuração real do servidor e do pool.
Mantenha a constante principal: a conta do pool de runtime não tem privilégios diretos de DML da tabela, e cada solicitação de Memória do Agente é executada dentro de um OracleMemoryEndUserSecurityContext verificado.