# 3LO no Bedrock Managed KB: 5 minutos de setup, 1 decisão irreversível

Em 4 de setembro de 2026 a AWS liberou o user-managed setup (3LO) para SharePoint, OneDrive e Confluence no Amazon Bedrock Managed Knowledge Base: você faz login com a sua própria conta e o data source sai em minutos. O que a documentação diz em letra miúda é que esse caminho não suporta controle de acesso por documento, e que a flag de ACL não muda depois do CreateDataSource. Este é o relato da migração que isso obriga, do protótipo em 3LO para um knowledge base de produção com ENTRA_ID_APP_ONLY, certificado e userContext.

- URL: https://fernando.moretes.com/blog/3lo-no-bedrock-managed-kb-5-minutos-de-setup-1-decisao-irreversivel-amazon-bedro

- Markdown: https://fernando.moretes.com/blog/3lo-no-bedrock-managed-kb-5-minutos-de-setup-1-decisao-irreversivel-amazon-bedro/article.md?lang=pt

- Published: 2026-09-05T10:15:56.145Z

- Category: IA & Agentes

- Tags: bedrock, rag, iam, sharepoint, confluence, governance, oauth

- Reading time: 9 min

- Source: [Amazon Bedrock Managed Knowledge Base introduces user-managed setup for SharePoint, OneDrive, and Confluence data sources](https://aws.amazon.com/about-aws/whats-new/2026/09/amazon-bedrock-managed-knowledge-base-user-managed-setup-sharepoint-onedrive-confluence/)

---

A pergunta que importa nesse anúncio não é "quanto tempo leva para conectar o SharePoint?", é "quem consegue ler o que foi indexado depois que você conectou?". O user-managed setup (3LO) que a AWS liberou em 4 de setembro de 2026 para SharePoint, OneDrive e Confluence no Amazon Bedrock Managed Knowledge Base resolve a primeira pergunta muito bem: você clica em **Sign in**, autoriza com a sua conta corporativa, e o Bedrock cria sozinho o segredo no Secrets Manager com o refresh token. A segunda pergunta é onde eu passei três semanas.

## O que o caminho de cinco minutos realmente troca

A página de setup do SharePoint é explícita e vale ler duas vezes: *user-managed setup does not support document-level access control (ACL)*. Todo conteúdo indexado fica acessível a qualquer pessoa que possa consultar o knowledge base, e as permissões individuais do SharePoint não são aplicadas. A mesma frase aparece na página do Confluence, palavra por palavra.

Isso não é um bug nem uma lacuna temporária, é consequência direta do fluxo. No 3LO o Bedrock guarda um **refresh token delegado**, emitido para você, com quatro permissões: `Sites.Read.All` e `User.Read` no Microsoft Graph, `offline_access` para renovar o token, e `AllSites.Read` na API do SharePoint Online. São permissões *delegated*, herdadas do que a sua conta enxerga. O crawler entra no tenant vestindo a sua identidade e copia tudo o que ela alcança para um índice que não tem noção de quem é quem.

O caminho que suporta ACL é outro: `ENTRA_ID_APP_ONLY` no SharePoint, `ENTRA_APP_ID` no OneDrive, `SERVICE_ACCOUNT` no Google Drive, `BASIC` no Confluence. São permissões **application**, com admin consent, e no caso do SharePoint com ACL exigem `Sites.FullControl.All`, ou `Sites.Selected` com grant `fullcontrol` por site, porque `Sites.Read.All` não basta para ler permissão de item.

A troca, dita sem eufemismo: o 3LO substitui um ticket de duas semanas com o time de identidade por um índice sem fronteira interna. Para um protótipo de wiki pública de engenharia, é um bom negócio. Para o repositório de políticas de crédito, é um incidente esperando a data.

## A jornada: do protótipo em 3LO ao knowledge base de produção

1. **Semana 0, o protótipo nasce no console, sem pedir nada a ninguém**: Um analista com `bedrock:GetDataSourceAuthorizationUrl`, `bedrock:CreateDataSourceToken` e `secretsmanager:CreateSecret` completa o fluxo sozinho. O Bedrock cria o segredo em `arn:aws:secretsmanager:{region}:{account}:secret:bedrock-managedkb-oauth/{prefix}/{connector}/{uuid}` e o data source sai com `authType=MANAGED_OAUTH2`. Nenhum ticket, nenhum tenant ID, nenhuma revisão.

2. **Semana 1, o portão que ninguém leu**: A página do Entra App-Only diz o que trava a jornada inteira: a decisão de habilitar ACL *não pode ser mudada depois que o data source é criado*. E o 3LO não oferece a opção. Ou seja: não existe upgrade in-place de `MANAGED_OAUTH2` para ACL, existe um data source novo e uma reingestão completa.

3. **Semana 2, inventário do que já foi copiado**: Antes de construir o caminho novo, responda o que o antigo já indexou. O crawl seguiu a identidade de quem logou; se essa pessoa é sênior, o alcance é o dela. Liste os sites e espaços incluídos, cruze com a classificação de dados e trate o índice atual como um repositório de cópia, porque é isso que ele é.

4. **Semana 3, app registration e certificado**: Aqui volta o ticket que o 3LO tinha eliminado. Um Global Administrator ou Privileged Role Administrator registra a aplicação single-tenant sem redirect URI, adiciona as permissões **application** e dá admin consent. Você gera um par com `openssl req -x509 -newkey rsa:2048`, sobe o `.cer` para o Entra e o bundle `.p12` para o S3 com SSE. O `.p12` é obrigatório quando há ACL.

5. **Semana 4, segredo, service role e o data source novo**: O segredo leva `clientId` e `certificatePassword`, sempre defina a senha explicitamente; se omitir, o Bedrock abre o bundle usando o client ID como senha. A service role recebe `s3:GetObject` no objeto do certificado com condição `aws:ResourceAccount`, mais `kms:Decrypt` se você usou CMK. O data source sai com `certificateS3Path`, que é exigido no `ENTRA_ID_APP_ONLY` mesmo com ACL desligado.

6. **Semana 5, a aplicação passa a provar quem está perguntando**: O `Retrieve` ganha `userContext.userId` com o e-mail universal do usuário. Sem isso, data sources com ACL devolvem zero resultados, o que é ótimo como fail-safe e péssimo como surpresa em produção. A autenticação continua sendo sua: o Bedrock filtra pela identidade que você afirma, não verifica se ela é verdadeira.

7. **Semana 6, apagar o caminho antigo, inclusive o segredo**: Delete o data source `MANAGED_OAUTH2` e o segredo `bedrock-managedkb-oauth/*` que ficou órfão, ele ainda guarda um refresh token válido. Do lado da Microsoft, revogue desabilitando ou apagando o service principal em **Enterprise applications**; no Atlassian, o grant é por site, então cada `*.atlassian.net` precisa da sua própria revogação.

## As duas fases e o portão imutável entre elas

O 3LO é rápido porque termina em um refresh token delegado; a produção é lenta porque começa em um certificado e em consentimento administrativo. O portão no meio não é uma etapa, é uma decisão que só pode ser tomada uma vez por data source.

### 🧪 Fase 1: Protótipo (3LO, minutos)

- Console Bedrock KB GetDataSourceAuthorizationUrl (frontend)
- Secrets Manager bedrock-managedkb-oauth/.../uuid (security)
- Data source authType=MANAGED_OAUTH2 (data)

### 🔐 Entra ID / Atlassian, consentimento

- Consentimento delegado Sites.Read.All + offline_access (external)
- Admin consent do tenant obrigatório se o tenant restringe apps (external)

### 🚧 O portão imutável

- aclEnabled não muda após CreateDataSource (security)

### 🟧 AWS: Fase 2: Produção (2LO + ACL)

- Entra app registration application perms + Sites.FullControl.All (security)
- Amazon S3 certificate.p12 (SSE) (storage)
- Data source ENTRA_ID_APP_ONLY + ACL (data)
- Managed KB conteúdo + permissões crawladas (ai)
- Retrieve userContext.userId = e-mail (ai)

### 👤 Sua aplicação, autenticação verificada

- App corporativa OIDC valida o usuário final (compute)

### Fluxos

- analista -> signin: 1. Sign in
- signin -> consent: 2. popup OAuth
- consent -> adminconsent: bloqueado sem consent
- signin -> secret3lo: 3. grava refresh token
- secret3lo -> ds3lo: 4. secretArn gerado
- ds3lo -> gate: 5. sem ACL, definitivo
- gate -> dsprod: 6. data source novo + reingestão
- entraapp -> certs3: .p12 (chave privada)
- certs3 -> dsprod: certificateS3Path
- dsprod -> kb: crawl de conteúdo e ACL
- app -> retrieve: identidade já verificada
- retrieve -> kb: filtro pré-retrieval
- kb -> retrieve: verificação em tempo real no source

## Antes e depois, em números que a documentação confirma

- **4**: permissões delegadas concedidas no caminho 3LO. `Sites.Read.All`, `User.Read`, `offline_access` e `AllSites.Read`, leitura de tudo que a conta que logou enxerga, renovável indefinidamente.
- **0**: documentos filtrados por permissão no 3LO. Sem ACL não há `userContext`: quem consulta o knowledge base lê todo o índice, independentemente do que teria acesso no SharePoint.
- **365 dias**: validade padrão do certificado do caminho de produção. Certificado expirado faz todo sync falhar. A rotação vira item de runbook com dono e data, não uma lembrança.

## Identidade: o e-mail é a chave, e não há tradução

Chegar no caminho com ACL resolve menos coisas do que parece, e resolve de um jeito muito específico. O Bedrock Managed Knowledge Base usa **e-mail como identificador universal**: não há resolução de alias nem mapeamento entre provedores de identidade. O `userId` que você passa no `Retrieve` precisa bater exatamente com o e-mail associado àquele usuário em cada data source conectado. Se o seu IdP corporativo emite `fernando.azevedo@empresa.com` e o Confluence guarda `fazevedo@empresa.com`, o match falha em silêncio e o usuário simplesmente não recebe resultado daquela fonte. Silêncio é o pior modo de falha possível num sistema de busca: ninguém abre chamado por resposta incompleta, abre por resposta errada.

Grupos funcionam por outra régua. São identificados como a fonte os representa, nome, ID, o que for, e a associação usuário→grupo vem do crawl. A documentação é direta: **a associação de grupos é tão fresca quanto o último sync**. Mudou permissão entre syncs, o filtro pré-retrieval não sabe. O que salva é a segunda camada: para SharePoint, OneDrive, Google Drive e Confluence existe verificação em tempo real contra a fonte, que pega justamente essa janela. S3 e Custom não têm essa rede, porque o ACL deles vem de arquivo de metadados fornecido por você.

Duas notas que mudam o desenho da aplicação: credenciais do IdP terceiro ficam em cache por até **1 hora**, e mudanças de permissão são eventualmente consistentes, tipicamente em poucos minutos. Então "revoguei o acesso agora" e "o RAG parou de mostrar" não são o mesmo instante. Em ambiente sob BACEN ou LGPD, essa diferença precisa estar escrita no desenho, não descoberta na auditoria.

## Os dois caminhos, lado a lado
| Critério | Protótipo: `MANAGED_OAUTH2` (3LO) | Produção: `ENTRA_ID_APP_ONLY` (2LO) |
| --- | --- | --- |
| Quem autoriza | O próprio usuário, no popup, a menos que o tenant restrinja apps de terceiros, aí volta a exigir admin consent | Global Administrator ou Privileged Role Administrator, com admin consent explícito |
| Credencial armazenada | Refresh token delegado, em segredo criado pelo próprio Bedrock | Certificado `.p12` no S3 mais `clientId`/`certificatePassword` em segredo que você cria |
| Controle de acesso por documento | Não suportado, e a flag não muda depois | Suportado, com filtro pré-retrieval e verificação em tempo real |
| Alcance do crawl | O que a conta que logou enxerga, variável, invisível no console AWS | Todo o tenant com `Sites.Read.All`/`Sites.FullControl.All`, ou site a site com `Sites.Selected` |
| O que quebra | O desligamento de quem autorizou; o token revogado no Entra; conteúdo compartilhado depois do sync, que exige resync | Certificado expirado (todo sync falha); grant per-site esquecido para site novo, que não é retroativo |

## Os modos de falha que só aparecem depois

**O token tem dono, e dono pede demissão.** O refresh token do 3LO pertence a uma pessoa. Quando ela sai da empresa e a conta é desabilitada, o sync para, e o índice continua lá, com o conteúdo que ela alcançava. O caminho de produção não tem esse acoplamento: a aplicação se autentica com certificado, sem login humano nem no crawl nem na consulta.

**Fail closed é bom, mas parece bug.** A retrieval com ACL falha fechada: erro de resolução de grupo, timeout na verificação em tempo real ou erro interno não devolvem o documento. A resposta pode vir com menos resultados que o `maxResults` pedido, e o Bedrock **não** completa com outros documentos. Sua aplicação precisa tratar resposta parcial como normal, e distinguir "zero por ACL" de "zero por relevância", a API sinaliza a falha de resolução justamente para isso.

**Documento sem ACL é documento invisível.** Em data source com ACL habilitado, documento cujas permissões não foram extraídas não vai para ninguém. Ausência é tratada como restrição, não como público. Depois da migração, espere uma queda de recall e investigue antes de culpar o embedding.

**O prefixo do segredo é a sua única alavanca de IAM, e o default é ambíguo.** A página de IAM do 3LO diz que sem prefixo o Bedrock usa `default`; as páginas de conector dizem que o segredo criado usa o prefixo `bedrock-managedkb-oauth`. Não construa policy em cima dessa suposição: informe um **secret name prefix** explícito no sign-in e escreva a policy com `Resource` escopado a ele *antes* de alguém rodar o fluxo. É a diferença entre `secretsmanager:CreateSecret` num caminho previsível e um `Resource: "*"` que ninguém vai revisar depois.

> **O risco não é o 3LO, é o 3LO que ninguém previu:** Duas permissões do Bedrock (`GetDataSourceAuthorizationUrl` e `CreateDataSourceToken`) mais `secretsmanager:CreateSecret` bastam para qualquer pessoa com acesso ao console indexar o SharePoint corporativo num knowledge base sem fronteira interna, sem tocar em nenhum processo de identidade. Se a sua conta de produção já concede essas ações por wildcard num policy de "desenvolvedor Bedrock", você não tem uma feature nova, tem um caminho novo de exfiltração autorizada por engano. Negue `bedrock:CreateDataSourceToken` fora das contas de sandbox antes de discutir arquitetura de RAG.

## Anti-padrões que eu já vi nascer nesse fluxo

- **Promover o protótipo trocando o `authType`**: não existe. A flag de ACL é imutável por data source, então promover significa criar data source novo e reingerir, planeje o custo de reingestão e a janela de índice duplicado.
- **Autorizar o 3LO com a conta do arquiteto**: quanto mais sênior o autorizador, maior o alcance do crawl. Se for usar 3LO, use uma conta com acesso deliberadamente estreito aos sites do escopo.
- **Tratar ACL awareness como autorização**: a própria documentação diz que é filtro, não fronteira de segurança. O Bedrock não autentica o usuário final, ele confia no `userId` que a sua aplicação afirma.
- **Desbloquear apps instalados por usuário no Atlassian "só por um minuto"**: enquanto o toggle está aberto, qualquer usuário autoriza qualquer app OAuth no site inteiro. Peça para o admin autorizar direto.
- **Deixar o segredo do 3LO para trás na limpeza**: o data source apagado não leva o segredo junto, e ele guarda um refresh token que ainda renova.

## Lente Well-Architected sobre a decisão

- **security**: Negue `bedrock:CreateDataSourceToken` em contas de produção por SCP; exija secret name prefix e escope o `Resource` a ele; use `Sites.Selected` em vez de `Sites.FullControl.All` sempre que a lista de sites for conhecida; guarde o `.p12` com SSE-KMS e `kms:Decrypt` restrito à service role.
- **reliability**: Certificado com validade padrão de 365 dias derruba todo sync ao expirar, alarme com 45 dias de antecedência. Grants per-site não são retroativos: site novo sem grant simplesmente não é crawlado, sem erro visível no data source.

## Deixe o protótipo existir, mas em uma conta onde ele não possa crescer

A tentação óbvia depois de ler tudo isso é bloquear o 3LO e pronto. Eu não faria. O atrito que ele remove é real: sem ele, todo experimento de RAG sobre a wiki interna vira um ticket de duas semanas com o time de identidade, e o resultado prático é que ninguém experimenta, ou pior, alguém exporta a wiki para um bucket e faz o RAG por fora, sem crawler, sem sync e sem nenhuma das verificações que a gente acabou de discutir.

O desenho que eu recomendo é topológico, não político. **Uma conta de sandbox** onde `bedrock:GetDataSourceAuthorizationUrl` e `bedrock:CreateDataSourceToken` são permitidas, sem dado classificado e com ciclo de vida curto, o índice inteiro morre em N dias por processo, não por lembrança. **As contas de produção** com essas duas ações negadas por SCP, o que faz o 3LO desaparecer do cardápio sem discussão caso a caso.

O que atravessa essa fronteira não é o data source; é o aprendizado. O protótipo responde as perguntas caras de verdade: quais espaços do Confluence têm conteúdo que resolve dúvida real, qual estratégia de chunking sobrevive a documento de política com 80 páginas, se a busca agêntica com `maxAgentIteration` acima do padrão de 5 muda a resposta o suficiente para pagar o custo. Nada disso depende de ACL. Quando a resposta for "vale", aí sim você abre o ticket com o time de Entra sabendo exatamente quais sites pedir no `Sites.Selected`, e o ticket fica mais curto porque você chega com escopo, não com intenção.

> **O que eu faria na segunda-feira:** Antes de habilitar qualquer coisa, eu rodaria uma busca por `bedrock:*` nos policies da conta de produção, a chance de as duas ações novas já estarem concedidas por wildcard é alta, e nenhuma revisão de IAM feita antes de setembro de 2026 poderia tê-las considerado. Depois eu criaria a conta de sandbox com o SCP invertido, porque bloquear na produção sem oferecer o lugar certo só empurra o problema para fora do meu campo de visão. Aprendi isso da forma cara em plataforma financeira: a decisão de arquitetura que parece de segurança quase sempre é de ergonomia, as pessoas contornam controle inconveniente com criatividade que nenhum policy prevê. E manteria a regra que uso para todo conector novo: se a flag não pode ser mudada depois, ela não é configuração, é design, e design vai para ADR, com o trade-off escrito e assinado antes do `CreateDataSource`.

## Veredito

Use o user-managed setup (3LO) quando as três condições valerem juntas: o conteúdo já é legível por toda a audiência do knowledge base, o índice vive em uma conta sem dado classificado, e existe data de expiração acordada para ele. Fora disso, vá direto para `ENTRA_ID_APP_ONLY` no SharePoint, `ENTRA_APP_ID` no OneDrive ou `BASIC` no Confluence, não porque o 3LO seja mal feito, mas porque a flag de ACL não muda depois do `CreateDataSource` e o desvio de cinco minutos hoje custa uma reingestão completa e um ticket com o time de Entra depois. O anúncio não é sobre autenticação; é sobre onde a fronteira de acesso da sua organização passa a existir, e o 3LO responde que ela passa a não existir dentro do índice. Isso é uma escolha legítima para um protótipo e é uma constatação de auditoria para o resto.

**Rating:** Adote em sandbox, negue em produção

## Referências

- [AWS What's New: Bedrock Managed Knowledge Base introduces user-managed setup for SharePoint, OneDrive, and Confluence (](https://aws.amazon.com/about-aws/whats-new/2026/09/amazon-bedrock-managed-knowledge-base-user-managed-setup-sharepoint-onedrive-confluence/)
- [Amazon Bedrock User Guide: SharePoint user-managed setup (3LO)](https://docs.aws.amazon.com/bedrock/latest/userguide/kb-managed-sharepoint-3lo-setup.html)
- [Amazon Bedrock User Guide: Confluence user-managed setup (3LO)](https://docs.aws.amazon.com/bedrock/latest/userguide/kb-managed-confluence-3lo-setup.html)
- [Amazon Bedrock User Guide: IAM permissions for user-managed setup (3LO)](https://docs.aws.amazon.com/bedrock/latest/userguide/kb-managed-3lo-setup.html)
- [Amazon Bedrock User Guide: Access Control Lists awareness enablement](https://docs.aws.amazon.com/bedrock/latest/userguide/kb-managed-acl.html)
- [Amazon Bedrock User Guide: ACL-aware retrieval on managed knowledge bases (userContext)](https://docs.aws.amazon.com/bedrock/latest/userguide/kb-test-retrieve-acl.html)
- [Amazon Bedrock User Guide: Set up Microsoft Entra ID App-Only authentication for SharePoint](https://docs.aws.amazon.com/bedrock/latest/userguide/kb-managed-sharepoint-entra-setup.html)
- [AWS ML Blog: Build enterprise search for agents with Amazon Bedrock Managed Knowledge Base](https://aws.amazon.com/blogs/machine-learning/build-enterprise-search-for-agents-with-amazon-bedrock-managed-knowledge-base/)
