Applica l'isolamento della memoria dell'utente finale con Deep Data Security
Questa guida mostra come applicare l'isolamento dell'utente finale per un'applicazione Oracle AI Agent Memory con OCI IAM e Oracle Deep Data Security.
Avvertenza: solo l'ambiente di apprendimento. Non distribuire questo esempio alla produzione.
L'applicazione utilizza il server di sviluppo Flask, un archivio di sessioni in-memory, segreti dei file di ambiente e gestione semplificata del ciclo di vita dei token. Gli script di impostazione del database modificano le impostazioni e i privilegi del provider di identità a livello di database. Utilizza solo utenti monouso e un Oracle Autonomous AI Database isolato e non di produzione.
Questa guida crea un'applicazione Web volutamente piccola:
- Gli utenti si collegano con il flusso del codice di autorizzazione OAuth 2.0 di OCI IAM.
- Nella pagina sono elencati solo i ricordi visibili all'utente che ha eseguito l'accesso.
- Un modulo aggiunge una memoria ed espone il relativo target
username. Alice può memorizzare una memoria per Alice, ma Oracle AI Database rifiuta il tentativo di Alice di archiviarne una per Bob.
Il percorso non mette a confronto Alice e Bob. Passa il token dell'utente finale a Oracle AI Database, dove Oracle Deep Data Security applica il criterio della riga personale della memoria dell'agente.
Questa guida illustra una distribuzione. Per la funzione di sicurezza completa, inclusi tutti i criteri, i principal, le funzioni di amministrazione, le API del contesto di runtime, le tempistiche di auditing e revoca, vedere Deep Data Security API and security reference.
In questa guida potrai:
- registrare una risorsa di database e un'applicazione Web in un dominio di Identity IAM OCI;
- aggiungere la richiesta del token
groupdi OCI IAM utilizzata per attivare i ruoli dati del database; - configurare account separati di database security-administrator, Schema-owner e Application-pool;
- creare un'area di memorizzazione della memoria agente e concedere il proprio criterio di riga a un gruppo IAM OCI;
- eseguire l'applicazione Web e verificare l'isolamento dell'utente applicato al database.
Comprendere la catena di fiducia
Il browser e l'applicazione utilizzano due token di accesso OAuth diversi:
- Il token utente finale identifica Alice o Bob e include i gruppi IAM dell'utente.
- Il token di accesso al database, ottenuto dall'applicazione riservata tramite le credenziali client, dimostra che l'applicazione può accedere alla risorsa del database.
Oracle AI Database convalida entrambi i token prima di collegare il contesto di sicurezza dell'utente finale.
Oracle documenta questo modello a due token in Comprendere il flusso di autenticazione e i prerequisiti e l'intero ciclo di vita in Contesto di sicurezza dell'utente finale.
Prerequisiti
È necessario:
- una versione isolata di Oracle Autonomous AI Database che supporta Oracle Deep Data Security;
- un dominio di Identity OCI IAM nella stessa tenancy, con l'autorizzazione per gestire applicazioni, utenti, gruppi e richieste di risarcimento personalizzate;
- un account security-administrator del database esistente, normalmente
ADMINsu Autonomous AI Database; - SQL*Plus su
PATHe una configurazione del wallet o della connessione TLS di Autonomous AI Database; - Python 3.10 a 3.14,
uve questo repository.
Oracle Deep Data Security è un'autorizzazione con filtro applicata al database. Vedere Che cos'è Oracle Deep Data Security.
Configurare il dominio di Identity IAM OCI
Eseguire tutte le operazioni IAM OCI in un unico dominio di Identity. Registrare il relativo URL dominio, ad esempio https://idcs-<id>.identity.oraclecloud.com:443.
L'autorevole procedura guidata Oracle è Configura OCI IAM per l'accesso mediato dall'applicazione. I valori nell'esempio seguente corrispondono al file di ambiente di esempio fornito con questa guida.
Registra la risorsa di database
In Dominio di identità > Applicazioni integrate:
- Aggiungere un'applicazione riservata denominata
OracleDB. - Configura come server risorse:
- Audience principale:
OracleDB - Ambito:
DB_ACCESS_SCOPE
- Audience principale:
- Configurare il client e consentire le credenziali client.
- Attivalo.
- Registrare i relativi ID applicazione, ID client e segreto client.
L'ambito del database completamente qualificato è l'audience concatenata al nome dell'ambito:
OracleDBDB_ACCESS_SCOPE
Seguire Registrare il database in OCI IAM per le etichette della console corrente e le descrizioni dei campi.
Registra l'applicazione Web
Aggiungere una seconda applicazione riservata denominata OracleAgentMemoryWeb:
- Abilitare Applica privilegi come autorizzazione.
- Configura come server risorse:
- Audience principale:
OracleAgentMemoryWeb - Ambito:
APP_ACCESS_SCOPE - Durata del token di accesso:
3600secondi per questo esercizio
- Audience principale:
- Configurare un client con le autorizzazioni riportate di seguito.
- Codice di autorizzazione
- Credenziali client
- Aggiungi questo URL di reindirizzamento esatto:
http://127.0.0.1:8000/auth/callback - In Risorse client, concedere l'accesso a entrambi gli elementi riportati di seguito.
OracleDBDB_ACCESS_SCOPEOracleAgentMemoryWebAPP_ACCESS_SCOPE
- Attivare l'applicazione e registrare i relativi ID client e segreto client.
L'applicazione utilizza il codice di autorizzazione con state e PKCE S256. IAM OCI documenta la configurazione client richiesta in Registrare l'applicazione in IAM OCI e fornisce un esempio di codice di autorizzazione PKCE.
Aggiungi richiesta di risarcimento di gruppo
Oracle AI Database attiva i ruoli dati mappati esternamente dalla richiesta group del token dell'utente finale. Le richieste personalizzate IAM OCI vengono configurate tramite l'API REST del dominio di identità, non la console.
In qualità di amministratore del dominio di Identity, scaricare un token di accesso personale di breve durata in grado di richiamare le API del dominio di Identity. Quindi eseguire:
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
}'
Una richiesta riuscita restituisce HTTP 201. Non creare un duplicato se il dominio ha già questa richiesta. Vedere Configura richieste di risarcimento personalizzate per informazioni di gruppo in OCI IAM.
Creare Alice, Bob e il gruppo di applicazioni
- Creare un gruppo denominato
ORACLEAGENTMEMORY_USERS. - Creare gli utenti di test
aliceebob. - Assegnare entrambi gli utenti a
ORACLEAGENTMEMORY_USERS. - Assegnare il gruppo a
OracleAgentMemoryWeb.
Il database mapperà in seguito questo nome di gruppo a un ruolo dati. I nomi dei gruppi vengono confrontati senza distinzione tra maiuscole e minuscole, ma utilizzano la stessa ortografia durante l'impostazione. Vedere Crea utenti e assegna gruppi in IAM OCI.
Preparare l'ambiente
Scaricare l'applicazione Web completa deepsec_oci_iam_webapp.zip. L'archivio contiene inoltre script di impostazione e ispezione del database standalone di proprietà di questo esempio. Non importano o impacchettano script dalla suite di test SDK.
Estrarre l'archivio, immettere la relativa directory di progetto e creare file di ambiente di configurazione e runtime locali:
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))"
Inserire il valore generato in OAM_WEB_SECRET_KEY e popolare ogni segnaposto richiesto in entrambi i file. Entrambi i nomi dei file vengono ignorati da Git.
La directory database_scripts contiene:
| File | Responsabilità |
|---|---|
_common.sh |
Applicazione di supporto privata che carica .deepsec.env, convalida i valori richiesti, verifica la presenza di SQL*Plus ed esporta TNS_ADMIN quando configurato. Non eseguire direttamente il programma. |
db_ociiam_setup.sh |
Abilita l'autenticazione esterna IAM OCI per Autonomous AI Database di destinazione e sostituisce OCI_IAM_DOMAIN_DB_CRED$. |
db_deepsec_user_setup.sh |
Crea gli utenti schema-owner e app-pool e concede le liste di inclusione dei privilegi documentati. |
db_list_all_data_roles.sh |
Esegue un'ispezione in sola lettura dei ruoli di Deep Data Security, dei mapping IAM, delle concessioni di dati, dei predicati, degli oggetti protetti, degli utenti finali e delle identità delle applicazioni. |
.deepsec.env viene utilizzato solo dall'impostazione del database. Include le password amministratore della sicurezza e proprietario dello schema. .deepsec.runtime.env viene caricato dal processo Flask ed esclude intenzionalmente entrambe le password con privilegi. Non esportare il file di installazione nella shell che avvia l'applicazione Web. Per utilizzare percorsi diversi, impostare OAM_DEEPSEC_ENV_FILE per l'impostazione o OAM_WEB_ENV_FILE per il processo Web.
I valori IAM importanti vengono mappati come indicato di seguito.
| Variabile d'ambiente | Valore IAM OCI |
|---|---|
OAM_DEEPSEC_OCI_DB_APP_ID |
ID applicazione dell'applicazione di database |
OAM_DEEPSEC_OCI_DB_CLIENT_ID |
ID client dell'applicazione di database |
OAM_DEEPSEC_OCI_DB_CLIENT_SECRET |
Segreto client dell'applicazione di database |
OAM_WEB_OCI_CLIENT_ID |
ID client dell'applicazione Web |
OAM_WEB_OCI_CLIENT_SECRET |
Segreto client dell'applicazione Web |
OAM_WEB_OCI_END_USER_SCOPE |
OracleAgentMemoryWebAPP_ACCESS_SCOPE |
OAM_WEB_OCI_DATABASE_ACCESS_SCOPE |
OracleDBDB_ACCESS_SCOPE |
OAM_DEEPSEC_CONFIG_DIR è necessario solo quando il DSN è un alias TNS il cui tnsnames.ora non è altrimenti individuabile. La posizione e la password del wallet sono facoltative quando sqlnet.ora e il DSN forniscono già tutto ciò di cui ha bisogno python-oracledb. Per le opzioni di connessione ad Autonomous AI Database, vedere Connetti le applicazioni Python con un wallet.
Configurare anche un provider di incorporamento. L'applicazione elenca e aggiunge solo le memorie, ma la memoria agente crea ancora incorporamenti quando memorizza il contenuto della memoria. Il modello utilizza come esempio un modello compatibile con OpenAI; sostituire il modello, la base API, la chiave e la dimensione con i valori del provider.
Configurare i tre account di database
Avvertenza: i comandi di questa sezione modificano le impostazioni di autenticazione esterna e i privilegi dell'account a livello di database. Prima ispezionare gli script. Non eseguirli in un database condiviso o di produzione.
Utilizzare tre utenti distinti del database:
| Responsabilità | Account di esempio | Lavoro consentito |
|---|---|---|
| Amministratore della sicurezza | ADMIN |
Abilita l'integrazione IAM OCI e crea, concede, revoca, elenca e rimuove i ruoli dati e le autorizzazioni dati. Non viene mai utilizzato per le richieste web. |
| Proprietario schema gestito | OAM_SCHEMA_OWNER |
Crea tabelle di memoria agente, indici, procedure e job scheduler. Utilizzato solo per le operazioni del ciclo di vita dello schema. |
| Utente DB applicazione | OAM_APP_DB_USER |
Apre le sessioni e collega i contesti di sicurezza dell'utente finale. Non riceve privilegi ordinari SELECT, INSERT, UPDATE o DELETE. |
Questa separazione fa sì che una richiesta senza un contesto utente finale valido non venga chiusa. La guida alla configurazione del database di Oracle consiglia CREATE SESSION e CREATE END USER SECURITY CONTEXT per l'account connection pool. Vedere Configurare il database per l'integrazione IAM.
L'esempio utilizza l'account Autonomous AI Database ADMIN per l'impostazione. Un account di amministratore della sicurezza personalizzato deve essere in grado di creare e modificare i due utenti del database e concedere i privilegi di sistema elencati. Poiché le tabelle di memoria agente appartengono a uno schema separato, l'amministrazione dei criteri richiede CREATE ANY DATA GRANT, DROP ANY DATA GRANT e ADMINISTER ANY DATA GRANT anziché solo CREATE DATA GRANT nello schema dell'amministratore. Inoltre, deve essere autorizzato a creare ed eliminare i ruoli dati utilizzati dai criteri.
Abilita convalida token IAM OCI
Esamina ed esegui
bash database_scripts/db_ociiam_setup.sh
Lo script si connette come amministratore della sicurezza e:
- chiama
DBMS_CLOUD_ADMIN.ENABLE_EXTERNAL_AUTHENTICATIONcon l'ID dell'applicazione di database e l'URL del dominio di identità; - crea la credenziale
OCI_IAM_DOMAIN_DB_CRED$cifrata con l'ID client e il segreto dell'applicazione di database; - stampa i parametri del provider di identità risultanti.
Può essere attivo un solo provider di identità esterno. Lo script di esempio utilizza force => TRUE per aggiornare i parametri IAM OCI, che possono interrompere un'altra configurazione di autenticazione esterna. Oracle documenta le chiamate esatte di Autonomous Database in Configura database per integrazione IAM.
Creare il proprietario e gli utenti del pool
Esamina ed esegui
bash database_scripts/db_deepsec_user_setup.sh
Lo script non modifica ADMIN. Crea il proprietario e gli utenti del pool di applicazioni 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
Il proprietario riceve la quota nella tablespace Autonomous AI Database DATA. L'utente del pool non riceve privilegi diretti sulle tabelle del proprietario. Per mantenere l'esempio focalizzato sulle istruzioni richieste, lo script non controlla gli utenti esistenti né ispeziona i privilegi correnti. Utilizzare i nomi dei nuovi account; lo script si interrompe se un utente esiste già o se un'altra istruzione SQL non riesce.
Creare il criterio negozio e riga personale
Installare l'ambiente di esempio standalone:
uv sync
Eseguire quindi il programma di installazione:
uv run python scripts/setup_memory.py
Questo comando è intenzionalmente distruttivo solo per OAM_WEB_MEMORY_STORE_ID. La proprietà:
- si connette come proprietario dello schema per ricreare lo schema di memoria dell'agente;
- si connette come amministratore della sicurezza per aggiungere il criterio della propria riga e concederlo a
ORACLEAGENTMEMORY_USERS.
Le chiamate di amministrazione Aggiungi e Concedi sono idempotenti. La loro riesecuzione sostituisce le stesse definizioni e assegnazioni dei criteri gestiti e il nuovo tentativo di riparare le DDL gestite parziali lasciate da un tentativo interrotto.
Il criterio crea un ruolo dati mappato esternamente per il gruppo IAM OCI e le concessioni dati il cui predicato riga confronta i valori user_id memorizzati con ORA_END_USER_CONTEXT.username. Oracle documenta la sintassi del mapping in CREATE DATA ROLE e l'autorizzazione riga in CREATE DATA Grants.
Controllare il risultato:
bash database_scripts/db_list_all_data_roles.sh
È necessario visualizzare il ruolo mappato su IAM, le autorizzazioni dei dati della memoria agente e le relative tabelle proprietario-schema protette. Questo script di ispezione esegue solo query sulle viste catalogo e non crea, modifica o rimuove oggetti di Deep Data Security.
Usa un modello di incorporamento nel database con Deep Sec
Questa sezione si applica quando l'applicazione utilizza OracleDBEmbedder con il provider="database" predefinito e un modello di incorporamento memorizzato in Oracle AI Database, in genere un modello ONNX importato come DMUSER.DOC_MODEL. In questa configurazione, l'incorporamento diretto utilizza l'operatore SQL VECTOR_EMBEDDING di Oracle, pertanto il modello richiede il privilegio SELECT ON MINING MODEL descritto di seguito.
OracleDBEmbedder supporta anche i provider remoti tramite DBMS_VECTOR_CHAIN.UTL_TO_EMBEDDING, ad esempio provider="openai". Tali configurazioni richiamano ancora la richiesta di incorporamento da Oracle AI Database, ma non accedono a un modello di mining residente nel database; le istruzioni SELECT ON MINING MODEL riportate in questa sezione non sono applicabili. Le operazioni della memoria agente devono comunque essere eseguite all'interno di un file OracleMemoryEndUserSecurityContext.
Un criterio di memoria agente concede l'accesso alle tabelle di memoria agente. Non concede l'accesso a un modello di incorporamento di Oracle AI Database. Il modello deve disporre del proprio privilegio di database: SELECT ON MINING MODEL.
Non concedere tale privilegio all'utente del pool di applicazioni. Durante una richiesta, Deep Sec autorizza l'utente tramite il ruolo dati mappato dal gruppo IAM OCI, non tramite i normali privilegi dell'utente del pool. Un privilegio concesso solo all'utente del pool non è pertanto disponibile mentre è attivo un contesto di sicurezza dell'utente finale.
Creare un ruolo dati mappato per ogni gruppo IAM che deve utilizzare il modello. Assegnare a tale ruolo dati un ruolo di database normale che dispone dell'accesso al modello. Eseguire l'istruzione SQL seguente come amministratore della sicurezza del database o un altro account autorizzato a creare ruoli e concedere l'accesso al modello. Sostituire i nomi di esempio con i nomi dell'applicazione:
-- 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;
L'applicazione utilizza quindi lo stesso nome di gruppo quando concede i criteri di memoria 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() trova il ruolo esistente mappato a YOUR_IAM_GROUP e aggiunge le autorizzazioni dei dati della tabella di memoria agente allo stesso ruolo. Non crea un secondo ruolo. In fase di runtime, un utente il cui token IAM OCI contiene YOUR_IAM_GROUP può accedere sia alle righe di memoria agente consentite che a DMUSER.DOC_MODEL.
Se l'applicazione ha già chiamato grant_agent_memory_policies() prima dell'impostazione del modello, la memoria agente ha già creato il ruolo dati mappato. Non creare un altro ruolo mappato per lo stesso gruppo. Trova il ruolo esistente e concedi invece il ruolo di modello ordinario:
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>;
Conservare ogni operazione OracleDBEmbedder runtime all'interno di OracleMemoryEndUserSecurityContext. Non utilizzare il proprietario dello schema, una connessione amministratore separata o una connessione senza un contesto di sicurezza dell'utente finale per eseguire incorporamenti per una richiesta utente. Ciò bypasserebbe il limite di autorizzazione di Deep Sec.
Comprendere l'applicazione
Il progetto scaricabile, deepsec_oci_iam_webapp.zip, contiene gli script completi dell'applicazione Web e del database. I pezzi chiave dell'applicazione sono volutamente piccoli.
Avvio e completamento di OAuth
L'instradamento di login crea valori casuali state e PKCE. Solo l'ID di sessione opaco viene inserito in un cookie HttpOnly, SameSite=Lax; i token rimangono nell'archivio di sessione demo 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,
)
Il callback confronta state in tempo costante e scambia il codice con lo stesso URI di reindirizzamento e verificatore PKCE. L'applicazione ottiene separatamente un token di accesso al database:
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
IAM OCI documenta entrambe le richieste di token in Convalidare la configurazione IAM OCI.
Ambito di ogni operazione di memoria agente
L'applicazione combina entrambi i token in un contesto di sicurezza dell'utente finale python-oracledb. Quindi definisce ogni inizializzazione e operazione del negozio con 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],
)
L'area di memorizzazione runtime utilizza SchemaPolicy.NO_CHECK perché la creazione, la convalida, gli aggiornamenti e la ricreazione dello schema appartengono al percorso di impostazione del proprietario dello schema. L'SDK rifiuta un altro criterio di schema mentre il contesto dell'utente finale è attivo e rifiuta le operazioni successive in questa area di memorizzazione runtime protetta quando non è attivo alcun contesto. Le funzioni di amministrazione della sicurezza rifiutano anche le connessioni che portano un contesto utente finale.
Per ogni operazione del database di memoria dell'agente, context manager:
- acquisisce una connessione fisica dal pool di applicazioni;
- allega e verifica il contesto di sicurezza previsto per l'utente finale;
- esegue SQL con tale identità;
- cancella e verifica il contesto prima di restituire la connessione.
L'account di database del pool non dispone dei privilegi della tabella di fallback. L'API del payload python-oracledb è documentata in Creazione del payload del contesto di sicurezza dell'utente finale. L'API Deep Data Security e il riferimento alla sicurezza spiegano il contratto completo del manager del contesto.
Lascia che il database decida
Il percorso inoltra il nome utente inviato invariato. Recupera e sanifica gli errori del database, ma non contiene alcuna diramazione di autorizzazione 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 sfugge al contenuto di memoria visualizzato. Le eccezioni del database raw, le risposte OAuth, i token e i valori sottomessi non vengono mai visualizzati.
Eseguire e verificare l'applicazione
Avviare il server di sviluppo Flask:
uv run python run.py
Aprire http://127.0.0.1:8000.
Verificare il limite di autorizzazione:
- Accedi come Alice.
- Aggiungere
Alice's first memorycon il nome utente precompilatoalice. - Verificare che la memoria venga visualizzata in Memorie visibili.
- Aggiungere
Alice tries to write for Bobma modificare il nome utente inbob. - Confermare che Oracle AI Database nega l'operazione.
- Uscire, accedere come Bob e confermare che la memoria di Alice non è visibile.
- Aggiungere una memoria come Bob, accedere nuovamente come Alice e confermare che la memoria di Bob non è visibile.
Ciò dimostra due controlli indipendenti:
SELECTrestituisce solo le righe il cuiuser_idcorrisponde all'identità effettiva.INSERTnon può creare una riga il cuiuser_idappartiene a un'altra identità.
Per le operazioni di produzione, configurare Oracle Unified Auditing per le azioni di amministrazione Deep Sec e di contesto di sicurezza dell'utente finale che l'organizzazione deve mantenere. Inoltre, tenere conto del contratto relativo al tempo di revoca documentato: viene eseguito il commit della revoca dei criteri SDK prima che vengano restituite le chiamate di amministrazione, mentre la rimozione di un utente da un gruppo IAM OCI non riscrive un token di accesso già emesso. Vedere Deep Data Security per le linee guida di auditing, il funzionamento della scadenza del token e i collegamenti alla documentazione Oracle Deep Sec e OCI IAM corrispondente.
Se il login riesce ma il database nega ogni operazione, esaminare il token dell'utente finale e verificare che group contenga ORACLEAGENTMEMORY_USERS. La risoluzione dei problemi di accesso e privilegio Deep Data Security di Oracle descrive inoltre come un amministratore può ispezionare i ruoli dati attivi.
Cosa richiede ancora la produzione
Avvertenza: il completamento di questa guida non rende l'esempio pronto per la produzione.
Prima di adattare il design, sostituire o aggiungere almeno:
- un server WSGI di produzione dietro TLS, configurazione proxy sicura e cookie sicuri;
- un archivio di sessione crittografato durevole sul lato server con controlli di scadenza, rotazione, propagazione del logout e concorrenza;
- un archivio segreto gestito invece di file dotenv;
- comportamento refresh-token o reauthentication, gestione della revoca dei token e scadenza clock-skew-aware;
- limitazione di frequenza, timeout delle richieste, log di audit senza token o contenuti utente e monitoraggio operativo;
- CSRF specifico della distribuzione, politica di sicurezza dei contenuti, intestazioni di sicurezza, vincoli di input e gestione degli errori;
- procedure di migrazione e di modifica delle politiche che non utilizzano
RECREATE; - identità di distribuzione separate e limiti di rete per amministrazione, migrazione degli schemi e runtime;
- test ad alta concorrenza, cancellazione, eliminazione del contesto e cambio di identità per la configurazione effettiva di server e pool.
Mantenere invariante la memoria di base: l'account del pool runtime non dispone di privilegi DML della tabella diretta e ogni richiesta di memoria agente viene eseguita all'interno di un file OracleMemoryEndUserSecurityContext verificato.