
Bastillion v5.2.0
Bastillion oferece uma maneira limpa e baseada em navegador para gerenciar o acesso SSH em todos os seus sistemas — como um host bastion com um painel amigável.
Bastillion
Uma ferramenta moderna e baseada na web para console SSH e gestão de chaves SSH.
O Bastillion oferece uma forma limpa e baseada em navegador para gerir o acesso SSH em todos os seus sistemas — como um bastion host com um painel amigável. Ele faz duas coisas:
-
Terminal SSH baseado na web — uma vez que um host esteja registado, utilizadores autorizados podem abrir uma ou mais sessões de terminal em direto para o mesmo diretamente a partir do navegador, com comandos opcionalmente transmitidos em simultâneo para todas as sessões abertas (pense nos painéis sincronizados do tmux, mas para uma frota de hosts remotos em vez de painéis locais).
-
Gestão de chaves SSH — o Bastillion detém o seu próprio par de chaves SSH e envia/roda chaves públicas para os hosts que registar, para que utilizadores individuais nunca precisem de deter ou gerir chaves de longa duração para esses sistemas.
- Inicie sessão com autenticação de dois fatores (Authy ou Google Authenticator)
- Gira e distribui chaves públicas SSH, e desativa/roda-as centralmente
- Lança shells web multi-sessão seguras e partilha comandos entre sessões
- Grava todas as sessões e reproduz-as a pedido — evidência pronta para auditoria em qualquer framework de conformidade
- Agrupa sistemas em Perfis e controla exatamente quem pode aceder a quê
- Guarda e reexecuta Scripts Compostos em toda uma frota de uma só vez
- Empilha TLS/SSL sobre SSH para proteção extra

Três sessões SSH reais e independentes — um comando, escrito uma vez, executado em todo o lado.
Conteúdos
- Como Funciona
- Novidades
- Licenciamento
- Opções de Instalação
- Pré-requisitos
- Transferir e Executar
- Compilar a partir do Código-Fonte
- TLS / HTTPS
- Configuração
- Mais Capturas de Ecrã
- Licença
Como Funciona
O Bastillion posiciona-se entre os seus utilizadores e os sistemas que precisam de alcançar, atuando como um terceiro de confiança em vez de um simples cofre de palavras-passe. Aqui está todo o ciclo de vida, de ponta a ponta.
1. O Bastillion gera o seu próprio par de chaves SSH
No primeiro arranque, antes de qualquer outra coisa, o Bastillion gera um par de chaves Ed25519 para si — esta é a única chave que alguma vez é enviada para os seus hosts. É apresentada no output da consola e está sempre visível em Definições.
2. Registe um sistema
Um administrador adiciona um host em Gerir → Sistemas (utilizador, host, porta e o caminho para o
ficheiro authorized_keys desse host). O Bastillion autentica uma vez com uma palavra-passe ou
frase-passe que fornece, e depois envia a sua própria chave pública para o authorized_keys desse host.
A partir daí, liga-se usando essa chave — sem palavras-passe armazenadas, nunca. O estado muda para
Sucesso no momento em que a chave está no lugar.

3. Agrupe sistemas em Perfis, atribua Utilizadores
Os sistemas são agrupados em Perfis nomeados — pense em "Produção", "Staging", "Camada de Base de Dados". Os utilizadores são depois ligados a perfis em Gerir → Utilizadores, que é a única coisa que controla quem pode aceder a quê. Revogue uma atribuição de perfil e esse acesso desaparece imediatamente, sem necessidade de rotação de chaves.

4. Abra terminais — e transmita para todos eles em simultâneo
Os utilizadores atribuídos abrem Secure Shell → Terminais, escolhem um ou mais sistemas e obtêm terminais em direto, redimensionáveis e baseados em xterm no navegador, lado a lado. Escreva uma vez e o texto vai para todos os terminais marcados como ativos — a mesma tecla, o mesmo comando, o mesmo formato de output, em tantos hosts quantos selecionar.

5. Rode ou revogue chaves centralmente
Como todos os hosts confiam na mesma chave de aplicação (não uma chave por utilizador), desativá-la uma vez em Gerir Chaves SSH revoga o acesso em todo o lado imediatamente — sem necessidade de tocar nos sistemas de destino manualmente, sem procurar qual servidor tem qual chave obsoleta.

6. Todas as sessões são gravadas — audite e reproduza
Tudo o que é escrito e cada byte devolvido nesses terminais é gravado automaticamente. Os gestores abrem Auditar Sessões, filtram por utilizador ou sistema e reproduzem qualquer sessão — lado a lado para sessões que abrangeram vários hosts, com um filtro de texto para saltar diretamente para as linhas que interessam. O output flui para a página à medida que carrega, por isso até uma sessão que despejou centenas de megabytes de registos é reproduzida sem esforço.
Se precisar de mostrar a um auditor quem executou o quê, onde e quando — esta é essa evidência,
capturada de série. Praticamente todos os frameworks de conformidade têm um requisito de trilho de auditoria
de acesso privilegiado em algum lugar (PCI DSS, HIPAA, SOC 2, ISO 27001 — escolha o seu), e
isto preenche esse requisito sem um produto PAM comercial. As sessões são mantidas durante 90 dias por
predefinição (deleteAuditLogAfter), e a gravação pode ser desativada com
ENABLE_INTERNAL_AUDIT=false — veja Auditoria.

🚀 Novidades
- SSO SAML 2.0 — inicie sessão através de um IdP empresarial (Entra ID, Okta, ADFS e outros) — veja Configuração
- Licenciamento — gratuito até 8 sistemas, com níveis pagos disponíveis em loophole.company/pricing.html (veja Licenciamento abaixo)
- Auditoria e reprodução de sessões, ativadas por predefinição — todas as sessões de terminal são gravadas e podem ser reproduzidas em Auditar Sessões, transmitidas para o navegador para que até sessões enormes carreguem instantaneamente
- Executa como um jar autónomo (
java -jar) com HTTPS de série — veja Transferir e Executar - Atualizado para Java 21, Jetty 12 e Jakarta EE 10
- Suporte total para chaves SSH Ed25519 (predefinição) e Ed448
- Ferramenta de migração v4 → v5 para trazer utilizadores, sistemas, chaves e registos de auditoria de uma instância existente — veja
tools/migrate - Reforçado com um filtro CSRF e cabeçalhos de segurança em toda a aplicação
Licenciamento
O Bastillion funciona sem licença até 8 sistemas registados — suficiente para experimentá-lo a sério antes de comprar. Uma licença aumenta esse limite.
- Compre uma licença em loophole.company/pricing.html
(Starter/Team/Business — com preço por número de sistemas). O pagamento redireciona de volta e transfere um
ficheiro
.licautomaticamente. - Abra o ficheiro
.lice copie o seu conteúdo (uma linha). - Defina-o através da variável de ambiente
LICENSE_KEY: ```bash export LICENSE_KEY=
ou cole-o em licenseKey em BastillionConfig.properties — a variável
de ambiente tem precedência se ambas estiverem definidas.
4. Reinicie o Bastillion. Settings mostra o licenciado, o limite do sistema e a validade, com um
aviso começando 90 dias antes da expiração.
As licenças são anuais e não renovam automaticamente — nenhum cartão fica armazenado. Compre novamente na mesma página de preços quando receber o aviso de expiração.
Opções de Instalação
Grátis: https://github.com/bastillion-io/Bastillion/releases
Pré-requisitos
Java 21 (OpenJDK)```bash
apt-get install openjdk-21-jdk
### Autenticador (para 2FA)
| Aplicativo | Android | iOS |
|--------------|----------|-----|
| **Authy** | [Google Play](https://play.google.com/store/apps/details?id=com.authy.authy) | [iTunes](https://itunes.apple.com/us/app/authy/id494168017) |
| **Google Authenticator** | [Google Play](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2) | [iTunes](https://itunes.apple.com/us/app/google-authenticator/id388497605) |
---
## Download e Execução
Baixe o jar mais recente em [Releases](https://github.com/bastillion-io/Bastillion/releases):```bash
java -jar bastillion-<version>.jar
Acesso no navegador: https://<server-ip>:8443 — veja TLS / HTTPS abaixo para o
certificado autoassinado que o Bastillion gera na primeira execução.
Credenciais padrão:``` username: admin password: changeme
Executa em primeiro plano; para parar, usa Ctrl+C. Para operação em segundo plano/daemon, usa o que a tua plataforma normalmente usa para um processo Java de longa duração — `nohup java -jar ... &`, uma unit do systemd, um contentor, etc.
---
## Compilar a partir do Código-Fonte
Instala o Maven 3+:```bash
apt-get install maven
Build and run (empacota um jar autossuficiente com um servidor Jetty embutido — veja
io.bastillion.Main — e o executa):```bash
mvn package
java -jar target/bastillion-5.0.0-SNAPSHOT.jar
Ou para desenvolvimento local sem reempacotar a cada alteração:```bash
mvn compile exec:java
Listens on https://localhost:8443 por padrão, igual à release baixada acima — veja
TLS / HTTPS abaixo para saber como esse certificado é configurado e como usar
o seu próprio.
TLS / HTTPS
O Bastillion gera seu próprio certificado autoassinado no primeiro início e serve HTTPS —
nada para configurar. Os navegadores mostrarão um aviso uma vez (é autoassinado, não emitido
por uma CA); clique para prosseguir, como faria com qualquer outro appliance self-hosted. O
certificado e sua senha persistem entre reinicializações (keystore/bastillion.p12 em
CONFIG_DIR, senha armazenada da mesma forma criptografada que a senha do
banco de dados).
Use seu próprio certificado assinado por CA em vez do padrão autoassinado — por exemplo, um gratuito do Let's Encrypt:
- Emita o certificado com o certbot (requer um nome DNS real
apontando para este host, e a porta 80 acessível para o desafio HTTP-01): ```bash
sudo certbot certonly --standalone -d bastillion.example.com
This writes fullchain.pem and privkey.pem to
/etc/letsencrypt/live/bastillion.example.com/.
- Convert the cert/key pair to PKCS12, the keystore format Bastillion expects: ```bash
openssl pkcs12 -export
-in /etc/letsencrypt/live/bastillion.example.com/fullchain.pem
-inkey /etc/letsencrypt/live/bastillion.example.com/privkey.pem
-out bastillion.p12 -name bastillion -passout pass:changeit - Aponte o Bastillion para ele e reinicie: ```bash
export KEYSTORE_PATH=/path/to/bastillion.p12
export KEYSTORE_PASSWORD=changeit
Os navegadores agora confiarão na conexão sem aviso. Os certificados Let's Encrypt expiram
a cada 90 dias — certbot renew seguido de reexecutar os passos 2–3 (e um reinício) mantém
isso atualizado; certbot renew --deploy-hook pode automatizar isso.
Atrás de um proxy reverso ou balanceador de carga que já encerra TLS (nginx, Cloud Run, etc.) — desative o HTTPS próprio do Bastillion e deixe-o servir HTTP simples:```bash export TLS_ENABLED=false
Por padrão, usa a porta 8080 neste modo; defina `PORT` para alterá-la.
---
## Configuração
Cada definição abaixo pode ser configurada como uma **variável de ambiente** — pegue o nome da propriedade,
insira um sublinhado antes de cada letra maiúscula e depois coloque tudo em maiúsculas: `licenseKey` →
`LICENSE_KEY`, `dbUser` → `DB_USER`, `sshKeyType` → `SSH_KEY_TYPE`. Esta é a forma recomendada
de configurar o Bastillion, especialmente em contêineres — sem necessidade de montar ou gravar arquivos.
O `BastillionConfig.properties` ainda funciona como alternativa (as variáveis de ambiente sempre têm prioridade se ambas estiverem
definidas), e é onde qualquer valor que o Bastillion gera para você no primeiro início — como uma senha
aleatória do banco de dados — é persistido. Consulte `src/main/resources/BastillionConfig.properties` para a
lista completa de definições e seus valores padrão.
**Consolidando tudo em um único diretório** (por exemplo, um único volume Docker montado):
`CONFIG_DIR` é a definição a ser usada. Tudo o que o Bastillion persiste —
`BastillionConfig.properties`, o keystore TLS autoassinado (`keystore/bastillion.p12`), o
banco de dados H2 e o par de chaves de host SSH (ambos em `keydb/`), e o `bastillion.jceks` — fica
sob ele por padrão, então apontar `CONFIG_DIR` para um único local realoca tudo isso:```bash
export CONFIG_DIR=/data/bastillion/
KEYSTORE_PATH e DB_CONNECTION_URL ainda existem para apontar apenas um deles para um
local diferente por conta própria (um certificado real, um banco de dados remoto) — veja TLS / HTTPS e
a seção "Database Settings" abaixo — mas nenhum deles é necessário apenas para consolidar tudo
em CONFIG_DIR.
O próprio CONFIG_DIR tem como padrão ./config relativo ao diretório de trabalho. Atualizando uma
instância existente que nunca o definiu? Versões mais antigas armazenavam o estado diretamente no diretório
de trabalho em vez de ./config — o Bastillion detecta isso no primeiro início com esta versão
e move para ./config (ou para CONFIG_DIR, se você agora definiu um) automaticamente.
Gerenciamento de Chaves SSH
```bash # Disable key management (append instead of overwrite) export KEY_MANAGEMENT_ENABLED=falseauthorized_keys refresh interval in minutes (no refresh for <=0)
export AUTH_KEYS_REFRESH_INTERVAL=120
Force user key generation and strong passphrases
export FORCE_USER_KEY_GENERATION=false
</details>
<details>
<summary><strong>Par de Chaves SSH Personalizado</strong></summary>
Por padrão, o Bastillion gera seu próprio par de chaves Ed25519 na primeira inicialização. Para usar o seu próprio,
a maneira mais fácil é pela interface: **Configurações → Substituir Chave SSH do Aplicativo**
(apenas contas de administrador) — cole uma chave privada, uma chave pública e uma frase secreta, se houver,
e a alteração entra em vigor imediatamente, sem necessidade de reinicialização.
⚠️ Isso substitui a *única* chave que todos os sistemas registrados confiam. É destinada a uma etapa única
na configuração inicial do Bastillion, **antes** de você registrar qualquer sistema — se você já
tiver sistemas registrados, o Bastillion perde o acesso SSH a todos eles no instante em que você substituir
a chave, a menos que essa chave exata já esteja presente em `authorized_keys` em cada um deles
primeiro. A página de Configurações exige uma caixa de confirmação extra quando você já tem sistemas
registrados, justamente por causa disso.
**Já tem sistemas registrados e precisa rotacionar a chave mesmo assim?** Pré-cadastre a nova chave
através do próprio Bastillion, em vez de editar `authorized_keys` manualmente em todos os lugares:
1. Defina `FORCE_USER_KEY_GENERATION=false` para que **Gerenciar Chaves SSH → Adicionar Chave SSH** permita colar
uma chave pública existente em vez de apenas gerar uma nova.
2. Adicione a nova chave lá em um perfil que cubra todos os seus sistemas e confirme (em
Gerenciar Chaves SSH, ou no status de cada sistema) que ela realmente foi aplicada em todos — lembre-se
de `AUTH_KEYS_REFRESH_INTERVAL`, pois é isso que a distribui.
3. Somente quando tiver certeza de que está em todos os sistemas, substitua a chave do aplicativo em Configurações.
4. Defina `FORCE_USER_KEY_GENERATION` de volta ao valor anterior e, depois de confirmar
que a nova chave do aplicativo foi propagada para todos os sistemas (novamente, atente para
`AUTH_KEYS_REFRESH_INTERVAL`), remova a chave adicionada no passo 2 em Gerenciar Chaves SSH —
ela foi apenas pré-cadastrada ali para pré-popular `authorized_keys` e não é necessária daqui em diante.
Para configurações via script/headless, o mesmo pode ser feito por meio de variáveis de ambiente e uma
reinicialização:```bash
# Regenerate and import SSH keys
export RESET_APPLICATION_SSH_KEY=true
# Private key
export PRIVATE_KEY=/Users/you/.ssh/id_rsa
# Public key
export PUBLIC_KEY=/Users/you/.ssh/id_rsa.pub
# Passphrase (leave blank if none)
export DEFAULT_SSH_PASSPHRASE=myPa$$w0rd
Uma vez registado, pode removê-las — o par de chaves já está armazenado na base de dados.
SSH_KEY_TYPE (rsa, ecdsa, ed25519 ou ed448) só é relevante quando o Bastillion está
a gerar uma nova chave, não quando importa uma — o tipo de uma chave importada é lido a partir
da própria chave:```bash
SSH key type ('rsa', 'ecdsa', 'ed25519', or 'ed448')
Supported options:
rsa - Classic, widely compatible (configurable length, default 4096)
ecdsa - Faster, smaller keys (P-256/384/521 curves)
ed25519 - Default and recommended (≈ RSA-4096, secure and fast)
ed448 - Extra-strong (≈ RSA-8192, slower and less supported)
export SSH_KEY_TYPE=ed25519
</details>
<details>
<summary><strong>Definições da Base de Dados</strong></summary>
Exemplo com H2 incorporado:```bash
export DB_USER=bastillion
export DB_PASSWORD=p@$$w0rd!!
export DB_DRIVER=org.h2.Driver
export DB_CONNECTION_URL=jdbc:h2:file:keydb/bastillion;CIPHER=AES;
Exemplo remoto de H2:```bash export DB_CONNECTION_URL=jdbc:h2:tcp://:/~/bastillion;CIPHER=AES;
</details>
<details>
<summary><strong>Autenticação Externa (LDAP / JAAS)</strong></summary>
Autentique contra um servidor LDAP/Active Directory existente em vez de (ou em conjunto com) senhas
locais. Ative-o:```bash
export JAAS_MODULE=ldap-ol
Configure jaas.conf:```
ldap-ol {
com.sun.security.auth.module.LdapLoginModule SUFFICIENT
userProvider="ldap://hostname:389/ou=example,dc=bastillion,dc=com"
userFilter="(&(uid={USERNAME})(objectClass=inetOrgPerson))"
authzIdentity="{cn}"
useSSL=false
debug=false;
};
Para mapear funções LDAP para perfis Bastillion:```
ldap-ol-with-roles {
org.eclipse.jetty.security.jaas.spi.LdapLoginModule required
debug="false"
useLdaps="false"
contextFactory="com.sun.jndi.ldap.LdapCtxFactory"
hostname="<SERVER>"
port="389"
bindDn="<BIND-DN>"
bindPassword="<BIND-DN PASSWORD>"
authenticationMethod="simple"
forceBindingLogin="true"
userBaseDn="ou=users,dc=bastillion,dc=com"
userRdnAttribute="uid"
userIdAttribute="uid"
userPasswordAttribute="userPassword"
userObjectClass="inetOrgPerson"
roleBaseDn="ou=groups,dc=bastillion,dc=com"
roleNameAttribute="cn"
roleMemberAttribute="member"
roleObjectClass="groupOfNames";
};
Os administradores são adicionados no primeiro login e podem receber perfis de sistema.
Como o mapeamento de funções realmente funciona: cada grupo LDAP ao qual um usuário pertence (conforme roleBaseDn/
roleMemberAttribute acima) se torna um "nome de função" — o valor do atributo roleNameAttribute desse grupo
(cn no exemplo acima). A cada login, o Bastillion compara cada um desses nomes de função, por correspondência exata de texto, com os nomes dos Perfis que você criou
em Gerenciar → Perfis. Uma correspondência atribui o usuário a esse perfil; sem correspondência, sem acesso a
esse perfil. Portanto, se um usuário for membro do grupo LDAP cn=admins,ou=groups,..., você precisará
de um perfil no Bastillion literalmente chamado admins (ignorando maiúsculas/minúsculas — a comparação é
insensível a maiúsculas, mas a grafia não é) para que essa associação signifique algo no Bastillion. Não
existe etapa de mapeamento separada nem interface para isso — os nomes simplesmente precisam coincidir.
Um usuário cujas funções não correspondem a nenhum perfil do Bastillion é rejeitado no login (contas Manager são a
única exceção; elas não são limitadas por perfil). Defina defaultProfileForLdap com um nome de perfil
para atribuir automaticamente todos os usuários LDAP a ele, garantindo que todos possam fazer login independentemente da
correspondência de funções — útil como rede de segurança enquanto você ainda está alinhando os nomes de perfis com
os nomes de grupos do seu diretório:```bash
export DEFAULT_PROFILE_FOR_LDAP=everyone
</details>
<details>
<summary><strong>Logon Único (SAML 2.0)</strong></summary>
Autentique-se contra um provedor de identidade empresarial — Microsoft Entra ID, Okta, ADFS ou qualquer
IdP SAML 2.0 — em vez de (ou em conjunto com) senhas locais ou LDAP. Um botão **Entrar com SSO**
aparece na página de login assim que configurado. Ative-o:```bash
export SAML_BASE_URL=https://bastillion.example.com
export SAML_IDP_METADATA_URL=https://login.microsoftonline.com/<tenant-id>/federationmetadata/2007-06/federationmetadata.xml?appid=<app-id>
Em Entra ID (ou no seu IdP de preferência), registe o Bastillion como uma Aplicação Empresarial / Fornecedor de Serviços com:
- Identificador (Entity ID):
https://bastillion.example.com(ouSAML_SP_ENTITY_IDse definido - ver abaixo) - URL de Resposta (URL do Serviço de Consumidor de Asserções):
https://bastillion.example.com/saml/acs
Sem URL de metadados do IdP à mão? Configure o IdP manualmente nesse caso - todos os três são necessários em conjunto nessa situação:```bash export SAML_IDP_ENTITY_ID=https://sts.windows.net// export SAML_IDP_SSO_URL=https://login.microsoftonline.com//saml2 export SAML_IDP_CERT=
Apenas necessário se o Entity ID registrado no lado do IdP não puder corresponder exatamente a `SAML_BASE_URL`:```bash
export SAML_SP_ENTITY_ID=https://bastillion.example.com
Para mapear claims de grupo/função do Entra para perfis do Bastillion (veja "Como o mapeamento de funções realmente funciona"
abaixo antes de alterar SAML_ROLE_ATTRIBUTE do seu valor padrão):```bash
export SAML_ROLE_ATTRIBUTE=http://schemas.microsoft.com/ws/2008/06/identity/claims/groups
export DEFAULT_PROFILE_FOR_SAML=everyone
Administradores são adicionados no primeiro login SSO e podem receber perfis de sistema.
**Nome de usuário exibido no Bastillion:** o SAML NameID se torna o nome de usuário. O Entra envia
`user.userprincipalname` por padrão, o que é adequado para membros regulares do tenant, mas gera um
UPN de convidado feio como `alice_gmail.com#EXT#@yourtenant.onmicrosoft.com` para convidados B2B (qualquer pessoa
que entre com um e-mail pessoal ou externo adicionado como convidado). Para um nome de usuário mais limpo, vá para
o *Single sign-on* do Enterprise Application → SAML → *Attributes & Claims*, edite **Unique
User Identifier (Name ID)** e altere seu *Source attribute* de `user.userprincipalname`
para `user.mail`.
**Como o mapeamento de funções realmente funciona — mesmo mecanismo do LDAP acima:** `SAML_ROLE_ATTRIBUTE`
nomeia *qual* atributo de asserção carrega os grupos/funções do usuário; quaisquer *valores* que esse
atributo contenha em um determinado login são comparados, **por correspondência exata de texto**, com os nomes dos
Perfis que você criou em **Manage → Profiles**. Um valor que corresponde a um nome de perfil
atribui o usuário a ele; nada mais sobre a declaração importa. Portanto, um perfil do Bastillion deve ser
nomeado exatamente igual à string que a asserção envia — não há etapa de mapeamento separada
nem interface, os nomes apenas precisam coincidir.
Esta é a parte que mais frequentemente confunde as pessoas especificamente com o Entra ID: por padrão,
a declaração de grupo do Entra pode emitir cada grupo como seu **Object ID** (um GUID) em vez de seu nome
de exibição, a menos que a configuração de token do Enterprise Application seja explicitamente definida para emitir **nomes**
de grupo. Se seus perfis do Bastillion forem nomeados como `admins`/`everyone`, mas o Entra estiver
enviando GUIDs, nada jamais corresponderá. Verifique o valor real da declaração em uma asserção autêntica (ou
na configuração de token do Entra para o aplicativo) antes de presumir que o mapeamento está quebrado — geralmente é
isso, não um problema do lado do Bastillion. Três maneiras de corrigir, na ordem do que recomendamos:
1. **Use App Roles do Entra em vez de declarações de grupo (mais limpo).** No registro do aplicativo →
App roles, defina funções com exatamente os valores que você deseja (`admins`, `everyone`, ...) e então
atribua usuários/grupos a essas funções em *Users and groups* do Enterprise Application.
Configure o token SAML para emitir a declaração `roles` e aponte `SAML_ROLE_ATTRIBUTE` para o
URI dessa declaração em vez da declaração de grupos. Você escolhe a string exata que o Entra envia — sem problema
de GUID algum, e é um modelo de autorização mais limpo do que reaproveitar grupos do AD de qualquer forma.
2. **Altere o atributo de origem da declaração de grupos.** Enterprise Application → Single sign-on →
SAML → *Attributes & Claims* → edite a declaração Groups → há um menu suspenso *Source attribute*,
normalmente padronizado para Group ID. Dependendo do seu tenant e se os grupos
são somente na nuvem ou sincronizados do AD local, você pode conseguir alternar para `sAMAccountName`
ou uma opção de nome de exibição — as escolhas exatas variam por tenant e versão do portal do Entra, então verifique
o que é realmente oferecido em vez de presumir um rótulo específico.
3. **Ou não lute contra isso — nomeie o perfil do Bastillion conforme o que o Entra realmente envia.** Se
o Entra insistir em enviar o GUID, crie um perfil do Bastillion literalmente nomeado com esse GUID.
Mais feio, mas exige zero reconfiguração do lado do Entra.
Um usuário cujas declarações não correspondem a nenhum perfil do Bastillion é rejeitado no login (contas **Manager** são
a única exceção; elas não são limitadas por perfil) — exatamente como com LDAP, então
`DEFAULT_PROFILE_FOR_SAML` acima vale a pena definir pelo mesmo motivo que
`DEFAULT_PROFILE_FOR_LDAP`: uma rede de segurança enquanto você ainda está alinhando nomes de perfil com
os valores de declaração do seu IdP.
A verificação de senha de uso único do próprio Bastillion é ignorada para logins SSO — espera-se que o IdP
aplique sua própria política de MFA/Conditional Access. O cadastro inicial de OTP ainda é
oferecido para que usuários SAML tenham uma credencial de fallback local disponível se o SSO for desativado.
**Requisições assinadas e asserções criptografadas:** o Bastillion gera seu próprio certificado de assinatura SAML
automaticamente (autoassinado, da mesma forma que gera seu certificado TLS) na
primeira vez em que é necessário, e assina cada AuthnRequest de saída com ele a partir de então — sem
configuração necessária, e inofensivo mesmo se seu IdP não o verificar. Busque
`https://bastillion.example.com/saml/metadata` para obter esse certificado no formato padrão de
metadados SP e entregue-o ao administrador do seu IdP se eles precisarem verificar as requisições assinadas
do Bastillion, ou criptografar asserções para o Bastillion — a maioria dos IdPs pode importar uma URL de
metadados SP diretamente em vez de colar um certificado bruto. Se preferir usar um par de chaves real (por exemplo,
emitido por CA) em vez do gerado automaticamente, aponte `SAML_SP_KEYSTORE_PATH`/
`SAML_SP_KEYSTORE_PASSWORD` para um keystore PKCS12 que o contenha. Para *exigir* asserções
criptografadas (desativado por padrão — só ative isso quando seu IdP estiver realmente configurado para
criptografar para o certificado do Bastillion, ou todo login começará a falhar):```bash
export SAML_WANT_ENCRYPTED_ASSERTIONS=true
Não suportado atualmente: Single Logout (SLO) — o logout permanece apenas local e não informa o IdP nem qualquer outro aplicativo no qual você tenha feito login por meio da mesma sessão de SSO. O SAML SSO pode ser habilitado juntamente com o LDAP; ambos são avaliados de forma independente e qualquer um deles pode provisionar novos usuários no primeiro login.
Auditoria
A auditoria de sessão é habilitada por padrão: a saída do terminal é armazenada no banco de dados do Bastillion
e pode ser revisada em Audit Sessions (somente contas de gerente). A saída é transmitida para
o navegador, portanto, até mesmo sessões com quantidades muito grandes de saída de terminal podem ser reproduzidas.
O histórico de auditoria é mantido por deleteAuditLogAfter dias (90 por padrão). Desative-o com:```bash
export ENABLE_INTERNAL_AUDIT=false
Existe também um registro de auditoria baseado em arquivo, desabilitado por padrão. Ative-o no **log4j2.xml** removendo os comentários de:
- `io.bastillion.manage.util.SystemAudit`
- `audit-appender`
> https://github.com/bastillion-io/Bastillion/blob/main/src/main/resources/log4j2.xml#L19-L22
</details>
<details>
<summary><strong>Migrando da v4</strong></summary>
Atualizando a partir de uma instalação antiga do Bastillion v4 e quer manter seus usuários, sistemas, perfis,
scripts e (o mais importante) o par de chaves SSH existente da aplicação em vez de começar
do zero? `tools/migrate/` possui uma ferramenta de migração independente exatamente para isso — ela exporta cada
tabela do banco de dados H2 antigo (descriptografando as colunas criptografadas no nível da aplicação com o
keystore da instância ANTIGA) para um arquivo JSON e, em seguida, importa-o em uma nova instância v5 (recriptografando
com o keystore da instância NOVA). Os usuários existentes podem fazer login com suas senhas atuais
imediatamente após — sem redefinições forçadas.```bash
cd tools/migrate
# 1. Export the old database
./migrate.sh export /opt/Bastillion-jetty/jetty/bastillion/WEB-INF/classes/ ~/bastillion-export.json
# 2. Start the new v5 instance once against the config dir you're migrating into, then
# stop it (Ctrl+C) once it's finished booting - this creates the schema, jceks, and
# default admin user.
cd ../..
java -DCONFIG_DIR=/data/bastillion/ -jar target/bastillion-5.0.0-SNAPSHOT.jar
# 3. Import into the new database (full replace of all 12 tables)
cd tools/migrate
./migrate.sh import /data/bastillion/ ~/bastillion-export.json --yes-replace-all-data
# 4. Delete the export file - it contains decrypted secrets
rm ~/bastillion-export.json
Consulte tools/migrate/README.md para obter todos os detalhes — como encontrar o diretório de configuração da sua instalação antiga, o que exatamente é migrado e as notas de segurança sobre o arquivo de exportação em texto simples.
Mais Capturas de Tela
O fluxo de trabalho principal é mostrado em Como Funciona. Expanda um grupo abaixo para explorar o restante da interface.
Autenticação — login e registro de dois fatores
Login
Entre com um nome de usuário e senha, além de um código de acesso OTP opcional.

Configuração de Dois Fatores
Escaneie o código QR com o Authy, Google Authenticator ou outro aplicativo compatível.

Gerenciamento de Acesso — navegação, perfis e usuários
Menu Principal
As ferramentas disponíveis são limitadas às permissões do usuário conectado.

Gerenciar Perfis
Agrupe sistemas em perfis nomeados que controlam o acesso.

Gerenciar Usuários
Crie contas, escolha funções de usuário e conceda acesso aos sistemas por meio de perfis.

Terminais & Automação — inicie sessões e execute scripts salvos
Terminais
Selecione um ou mais sistemas, opcionalmente filtrados por perfil, e abra-os simultaneamente.

Scripts Compostos
Salve um script uma vez e execute-o em todos os terminais selecionados.

Configurações — aparência da conta e autenticação do aplicativo
Configurações do Usuário
Altere sua senha, escolha a aparência da interface e do terminal e gerencie a chave pública que o Bastillion usa para autenticar nos sistemas registrados.

Licença
O Bastillion está disponível sob a Prosperity Public License.
Lista completa de dependências de terceiros e suas licenças em 3rdPartyLicenses.md.
Loophole, LLC — Sean Kavanagh