Partilhar via


Rodar segredos no Azure Stack Hub

Este artigo fornece orientações para realizar a rotação de segredos, para ajudar a manter uma comunicação segura com os recursos e serviços de infraestrutura do Azure Stack Hub.

Descrição Geral

O Azure Stack Hub utiliza segredos para manter uma comunicação segura com recursos e serviços de infraestrutura. Para manter a integridade da infraestrutura do Azure Stack Hub, os operadores precisam da capacidade de rodar segredos em frequências consistentes com os requisitos de segurança da organização.

Quando os segredos estão prestes a expirar, são gerados os seguintes alertas no portal do administrador. A conclusão da rotação de segredos resolverá estes alertas:

  • Expiração da palavra-passe da conta de serviço pendente
  • Expiração do certificado interno pendente
  • Expiração do certificado externo pendente

Aviso

Existem duas fases de alertas acionadas no portal do administrador antes da expiração:

  • 90 dias antes da expiração é gerado um alerta de aviso.
  • 30 dias antes da expiração, é gerado um alerta crítico.

É fundamental que conclua a rotação de segredos se receber estas notificações. Se não o fizer, pode causar a perda de cargas de trabalho e a possível reimplementação do Azure Stack Hub às suas próprias custas!

Para obter mais informações sobre monitorização e remediação de alertas, veja Monitorizar o estado de funcionamento e os alertas no Azure Stack Hub.

Nota

Os ambientes do Azure Stack Hub em versões anteriores a 1811 podem ver alertas para expirações de segredos ou certificados internos pendentes. Estes alertas são imprecisos e devem ser ignorados sem executar a rotação de segredos internos. Os alertas de expiração de segredos internos imprecisos são um problema conhecido que é resolvido em 1811. Os segredos internos não expiram, a menos que o ambiente esteja ativo há dois anos.

Pré-requisitos

  1. É altamente recomendado que esteja a executar uma versão suportada do Azure Stack Hub e que aplique a correção mais recente disponível para a versão do Azure Stack Hub que a sua instância está a executar. Por exemplo, se estiver a executar o 2008, certifique-se de que instalou a correção mais recente disponível para o 2008.

    Importante

    Para versões anteriores a 1811:

    • Se a rotação de segredos já tiver sido efetuada, tem de atualizar para a versão 1811 ou posterior antes de efetuar novamente a rotação de segredos. A Rotação de Segredos tem de ser executada através do Ponto Final Privilegiado e requer credenciais do Operador do Azure Stack Hub. Se não souber se a rotação de segredos foi executada no seu ambiente, atualize para o 1811 antes de efetuar a rotação de segredos.
    • Não precisa de rodar segredos para adicionar certificados de anfitrião de extensão. Deve seguir as instruções no artigo Preparar o anfitrião de extensões para o Azure Stack Hub para adicionar certificados de anfitrião de extensão.
  2. Notifique os utilizadores das operações de manutenção planeada. Agende janelas de manutenção normais, tanto quanto possível, durante o horário comercial. As operações de manutenção podem afetar as cargas de trabalho do utilizador e as operações do portal.

  3. Gerar pedidos de assinatura de certificados para o Azure Stack Hub.

  4. Preparar certificados PKI do Azure Stack Hub.

  5. Durante a rotação de segredos, os operadores podem reparar que os alertas são abertos e fechados automaticamente. Este comportamento está previsto e os alertas podem ser ignorados. Os operadores podem verificar a validade destes alertas com o cmdlet Do PowerShell Test-AzureStack. Para os operadores, utilizar o System Center Operations Manager para monitorizar os sistemas do Azure Stack Hub, colocar um sistema no modo de manutenção impedirá que estes alertas cheguem aos respetivos sistemas ITSM. No entanto, os alertas continuarão a surgir se o sistema do Azure Stack Hub ficar inacessível.

Rodar segredos externos

Importante

Rotação de segredos externos para:

Esta secção abrange a rotação de certificados utilizados para proteger serviços direcionados para o exterior. Estes certificados são fornecidos pelo Operador do Azure Stack Hub para os seguintes serviços:

  • Portal do administrador
  • Portal público
  • Administrador do Azure Resource Manager
  • Global Azure Resource Manager
  • Key Vault de Administrador
  • Key Vault
  • Anfitrião da Extensão Administração
  • ACS (incluindo armazenamento de blobs, tabelas e filas)
  • ADFS1
  • Gráfico1
  • Container Registry2

1Aplicável ao utilizar os Serviços Federados do Active Directory (ADFS).

2Aplicável ao utilizar Azure Container Registry (ACR).

Preparação

Antes da rotação de segredos externos:

  1. Execute o cmdlet do Test-AzureStack PowerShell com o -group SecretRotationReadiness parâmetro para confirmar que todas as saídas de teste estão em bom estado de funcionamento antes de rodar segredos.

  2. Preparar um novo conjunto de certificados externos de substituição:

    • O novo conjunto tem de corresponder às especificações de certificado descritas nos requisitos de certificado PKI do Azure Stack Hub.

    • Gere um pedido de assinatura de certificado (CSR) para submeter à Autoridade de Certificação (AC). Utilize os passos descritos em Gerar pedidos de assinatura de certificados e prepare-os para utilização no ambiente do Azure Stack Hub com os passos em Preparar certificados PKI. O Azure Stack Hub suporta a rotação de segredos para certificados externos de uma nova Autoridade de Certificação (AC) nos seguintes contextos:

      Rodar a partir da AC Rodar para AC Suporte da versão do Azure Stack Hub
      Self-Signed Grandes Empresas 1903 & posterior
      Self-Signed Self-Signed Não suportado
      Self-Signed Público* 1803 & posterior
      Grandes Empresas Grandes Empresas 1803 & posterior; 1803-1903 se a MESMA AC empresarial utilizada na implementação
      Grandes Empresas Self-Signed Não suportado
      Grandes Empresas Público* 1803 & posterior
      Público* Grandes Empresas 1903 & posterior
      Público* Self-Signed Não suportado
      Público* Público* 1803 & posterior

      *Parte do Programa de Raiz Fidedigna do Windows.

    • Certifique-se de que valida os certificados que prepara com os passos descritos em Validar Certificados PKI

    • Certifique-se de que não existem carateres especiais na palavra-passe, como, por exemplo$, ,*,#,@or)".

    • Certifique-se de que a encriptação PFX é TripleDES-SHA1. Se tiver um problema, veja Corrigir problemas comuns com certificados PKI do Azure Stack Hub.

  3. Armazene uma cópia de segurança nos certificados utilizados para rotação numa localização segura de cópia de segurança. Se a rotação for executada e, em seguida, falhar, substitua os certificados na partilha de ficheiros pelas cópias de segurança antes de executar novamente a rotação. Mantenha cópias de segurança na localização segura da cópia de segurança.

  4. Crie uma partilha de ficheiros à qual pode aceder a partir das VMs do ERCS. A partilha de ficheiros tem de ser legível e gravável para a identidade do CloudAdmin .

  5. Abra uma consola ISE do PowerShell a partir de um computador onde tenha acesso à partilha de ficheiros. Navegue para a partilha de ficheiros, onde cria diretórios para colocar os seus certificados externos.

  6. Crie uma pasta na partilha de ficheiros com o nome Certificates. Dentro da pasta certificados, crie uma subpasta com o nome AAD ou ADFS, consoante o fornecedor de identidade que o Hub utiliza. Por exemplo, .\Certificates\AAD ou .\Certificates\ADFS. Nenhuma outra pasta além da pasta de certificados e da subpasta do fornecedor de identidade deve ser criada aqui.

  7. Copie o novo conjunto de certificados externos de substituição criado no passo 2 para a pasta .\Certificates\<IdentityProvider> criada no passo 6. Conforme mencionado acima, a subpasta do fornecedor de identidade tem de ser AAD ou ADFS. Certifique-se de que os nomes alternativos do requerente (SANs) dos certificados externos de substituição seguem o cert.<regionName>.<externalFQDN> formato especificado nos requisitos de certificados de infraestrutura de chave pública (PKI) do Azure Stack Hub.

    Eis um exemplo de uma estrutura de pastas para o Fornecedor de identidades do Microsoft Entra:

        <ShareName>
            │
            └───Certificates
                  └───AAD
                      ├───ACSBlob
                      │       <CertName>.pfx
                      │
                      ├───ACSQueue
                      │       <CertName>.pfx
                      │
                      ├───ACSTable
                      │       <CertName>.pfx
                      │
                      ├───Admin Extension Host
                      │       <CertName>.pfx
                      │
                      ├───Admin Portal
                      │       <CertName>.pfx
                      │
                      ├───ARM Admin
                      │       <CertName>.pfx
                      │
                      ├───ARM Public
                      │       <CertName>.pfx
                      │
                      ├───Container Registry*
                      │       <CertName>.pfx
                      │
                      ├───KeyVault
                      │       <CertName>.pfx
                      │
                      ├───KeyVaultInternal
                      │       <CertName>.pfx
                      │
                      ├───Public Extension Host
                      │       <CertName>.pfx
                      │
                      └───Public Portal
                              <CertName>.pfx
    

*Aplicável ao utilizar Azure Container Registry (ACR) para Microsoft Entra ID e ADFS.

Nota

Se estiver a rodar certificados externos do Container Registry, tem de criar manualmente uma Container Registry subpasta na subpasta do fornecedor de identidade. Além disso, tem de armazenar o certificado .pfx correspondente nesta subpasta criada manualmente.

Rotação

Conclua os seguintes passos para rodar segredos externos:

  1. Utilize o seguinte script do PowerShell para rodar os segredos. O script requer acesso a uma sessão do Privileged EndPoint (PEP). O PEP é acedido através de uma sessão remota do PowerShell na máquina virtual (VM) que aloja o PEP. Se estiver a utilizar um sistema integrado, existem três instâncias do PEP, cada uma em execução dentro de uma VM (Prefix-ERCS01, Prefix-ERCS02 ou Prefix-ERCS03) em anfitriões diferentes. O script realiza os passos seguintes:

    • Cria uma Sessão do PowerShell com o ponto final Privilegiado com a conta CloudAdmin e armazena a sessão como uma variável. Esta variável é utilizada como um parâmetro no próximo passo.

    • Executa Invoke-Command, transmitindo a variável de sessão PEP como o -Session parâmetro.

    • É executada Start-SecretRotation na sessão PEP com os seguintes parâmetros. Para obter mais informações, veja a referência Start-SecretRotation :

      Parâmetro Variável Descrição
      -PfxFilesPath $CertSharePath O caminho de rede para a pasta raiz dos certificados, conforme discutido no passo 6 da secção Preparação, por exemplo \\<IPAddress>\<ShareName>\Certificates.
      -PathAccessCredential $CertShareCreds O objeto PSCredential para credenciais para a partilha.
      -CertificatePassword $CertPassword Uma cadeia segura da palavra-passe utilizada para todos os ficheiros de certificado pfx criados.
    # Create a PEP session
    winrm s winrm/config/client '@{TrustedHosts= "<IP_address_of_ERCS>"}'
    $PEPCreds = Get-Credential
    $PEPSession = New-PSSession -ComputerName <IP_address_of_ERCS_Machine> -Credential $PEPCreds -ConfigurationName "PrivilegedEndpoint" -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US)
    
    # Run secret rotation
    $CertPassword = ConvertTo-SecureString '<Cert_Password>' -AsPlainText -Force
    $CertShareCreds = Get-Credential
    $CertSharePath = "<Network_Path_Of_CertShare>"
    Invoke-Command -Session $PEPsession -ScriptBlock {
        param($CertSharePath, $CertPassword, $CertShareCreds )
        Start-SecretRotation -PfxFilesPath $CertSharePath -PathAccessCredential $CertShareCreds -CertificatePassword $CertPassword
    } -ArgumentList ($CertSharePath, $CertPassword, $CertShareCreds)
    Remove-PSSession -Session $PEPSession
    
  2. A rotação de segredos externos demora aproximadamente uma hora. Após a conclusão com êxito, a consola apresentará uma ActionPlanInstanceID ... CurrentStatus: Completed mensagem, seguida de Action plan finished with status: 'Completed'. Remova os certificados da partilha criada na secção Preparação e armazene-os na respetiva localização de cópia de segurança segura.

    Nota

    Se a rotação de segredos falhar, siga as instruções na mensagem de erro e execute novamente Start-SecretRotation com o -ReRun parâmetro .

    Start-SecretRotation -ReRun
    

    Contacte o suporte se ocorrer falhas de rotação de segredos repetidas.

  3. Opcionalmente, para confirmar que todos os certificados externos foram rodados, execute a ferramenta de validação Test-AzureStack com o seguinte script:

    Test-AzureStack -Include AzsExternalCertificates -DetailedResults -debug
    

Rodar segredos internos

Os segredos internos incluem certificados, palavras-passe, cadeias seguras e chaves utilizadas pela infraestrutura do Azure Stack Hub sem a intervenção do Operador do Azure Stack Hub. A rotação de segredos interna só será necessária se suspeitar que um foi comprometido ou se tiver recebido um alerta de expiração.

As implementações anteriores a 1811 podem ver alertas para expirações pendentes de certificados internos ou segredos. Estes alertas são imprecisos e devem ser ignorados e são um problema conhecido resolvido em 1811.

Conclua os seguintes passos para rodar segredos internos:

  1. Execute o seguinte script do PowerShell. Aviso para rotação de segredo interno, a secção "Executar Rotação secreta" utiliza apenas o -Internal parâmetro para o cmdlet Start-SecretRotation:

    # Create a PEP Session
    winrm s winrm/config/client '@{TrustedHosts= "<IP_address_of_ERCS>"}'
    $PEPCreds = Get-Credential
    $PEPSession = New-PSSession -ComputerName <IP_address_of_ERCS_Machine> -Credential $PEPCreds -ConfigurationName "PrivilegedEndpoint" -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US)
    
    # Run Secret Rotation
    Invoke-Command -Session $PEPSession -ScriptBlock {
        Start-SecretRotation -Internal
    }
    Remove-PSSession -Session $PEPSession
    

    Nota

    As versões anteriores a 1811 não necessitam do -Internal sinalizador.

  2. Após a conclusão com êxito, a consola apresentará uma ActionPlanInstanceID ... CurrentStatus: Completed mensagem, seguida de Action plan finished with status: 'Completed'.

    Nota

    Se a rotação de segredos falhar, siga as instruções na mensagem de erro e volte a executar Start-SecretRotation com os parâmetros -Internal e -ReRun.

    Start-SecretRotation -Internal -ReRun
    

    Contacte o suporte se ocorrer falhas de rotação de segredos repetidas.

Rodar certificado de raiz do Azure Stack Hub

O certificado de raiz do Azure Stack Hub é aprovisionado durante a implementação com uma expiração de cinco anos. A partir do 2108, a rotação de segredos internos também roda o certificado de raiz. O alerta de expiração do segredo padrão identifica a expiração do certificado de raiz e gera alertas em 90 (aviso) e 30 dias (críticos).

Para rodar o certificado de raiz, tem de atualizar o sistema para o 2108 e efetuar a rotação de segredos internos.

O fragmento de código seguinte utiliza o Ponto Final Privilegiado para listar a data de expiração do certificado de raiz:

$pep = New-PSSession -ComputerName <ip address> -ConfigurationName PrivilegedEndpoint -Credential $cred -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US) 
 
$stampInfo = Invoke-Command -Session $pep -ScriptBlock { Get-AzureStackStampInformation }

$rootCert = $stampInfo.RootCACertificates| Sort-Object -Property NotAfter | Select-Object -Last 1
"The Azure Stack Hub Root Certificate expires on {0}" -f $rootCert.NotAfter.ToString("D") | Write-Host -ForegroundColor Cyan

Atualizar a credencial do BMC

O controlador de gestão do quadro base monitoriza o estado físico dos servidores. Consulte o fornecedor de hardware original do fabricante de equipamento (OEM) para obter instruções para atualizar o nome da conta de utilizador e a palavra-passe do BMC.

Nota

O seu OEM pode fornecer aplicações de gestão adicionais. Atualizar o nome de utilizador ou palavra-passe de outras aplicações de gestão não tem qualquer efeito no nome de utilizador ou palavra-passe do BMC.

  1. Atualize o BMC nos servidores físicos do Azure Stack Hub ao seguir as instruções do OEM. O nome de utilizador e a palavra-passe de cada BMC no seu ambiente têm de ser os mesmos. Os nomes de utilizador BMC não podem exceder os 16 carateres.
  1. Já não é necessário atualizar as credenciais do BMC nos servidores físicos do Azure Stack Hub ao seguir as instruções do OEM. O nome de utilizador e a palavra-passe de cada BMC no seu ambiente têm de ser iguais e não podem exceder 16 carateres.
  1. Abra um ponto final privilegiado nas sessões do Azure Stack Hub. Para obter instruções, consulte Utilizar o ponto final privilegiado no Azure Stack Hub.

  2. Depois de abrir uma sessão de ponto final com privilégios, execute um dos scripts do PowerShell abaixo, que utilizam Invoke-Command para executar Set-BmcCredential. Se utilizar o parâmetro opcional -BypassBMCUpdate com Set-BMCCredential, as credenciais no BMC não serão atualizadas. Apenas o arquivo de dados interno do Azure Stack Hub é atualizado. Transmita a variável de sessão de ponto final com privilégios como um parâmetro.

    Eis um script do PowerShell de exemplo que irá pedir o nome de utilizador e a palavra-passe:

    # Interactive Version
    $PEPIp = "<Privileged Endpoint IP or Name>" # You can also use the machine name instead of IP here.
    $PEPCreds = Get-Credential "<Domain>\CloudAdmin" -Message "PEP Credentials"
    $NewBmcPwd = Read-Host -Prompt "Enter New BMC password" -AsSecureString
    $NewBmcUser = Read-Host -Prompt "Enter New BMC user name"
    
    $PEPSession = New-PSSession -ComputerName $PEPIp -Credential $PEPCreds -ConfigurationName "PrivilegedEndpoint" -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US)
    
    Invoke-Command -Session $PEPSession -ScriptBlock {
        # Parameter BmcPassword is mandatory, while the BmcUser parameter is optional.
        Set-BmcCredential -BmcPassword $using:NewBmcPwd -BmcUser $using:NewBmcUser
    }
    Remove-PSSession -Session $PEPSession
    

    Também pode codificar o nome de utilizador e a palavra-passe em variáveis, o que pode ser menos seguro:

    # Static Version
    $PEPIp = "<Privileged Endpoint IP or Name>" # You can also use the machine name instead of IP here.
    $PEPUser = "<Privileged Endpoint user for example Domain\CloudAdmin>"
    $PEPPwd = ConvertTo-SecureString '<Privileged Endpoint Password>' -AsPlainText -Force
    $PEPCreds = New-Object System.Management.Automation.PSCredential ($PEPUser, $PEPPwd)
    $NewBmcPwd = ConvertTo-SecureString '<New BMC Password>' -AsPlainText -Force
    $NewBmcUser = "<New BMC User name>"
    
    $PEPSession = New-PSSession -ComputerName $PEPIp -Credential $PEPCreds -ConfigurationName "PrivilegedEndpoint" -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US)
    
    Invoke-Command -Session $PEPSession -ScriptBlock {
        # Parameter BmcPassword is mandatory, while the BmcUser parameter is optional.
        Set-BmcCredential -BmcPassword $using:NewBmcPwd -BmcUser $using:NewBmcUser
    }
    Remove-PSSession -Session $PEPSession
    

Referência: cmdlet Start-SecretRotation

O cmdlet Start-SecretRotation roda os segredos da infraestrutura de um sistema do Azure Stack Hub. Este cmdlet só pode ser executado no ponto final privilegiado do Azure Stack Hub ao utilizar um Invoke-Command bloco de script que passa a sessão PEP no -Session parâmetro. Por predefinição, roda apenas os certificados de todos os pontos finais de infraestrutura de rede externa.

Parâmetro Tipo Necessário Posição Predefinição Description
PfxFilesPath String Falso Com nome Nenhuma O caminho de partilha de ficheiros para a pasta raiz \Certificados que contém todos os certificados de ponto final de rede externos. Apenas é necessário ao rodar segredos externos. O caminho tem de terminar com a pasta \Certificates , por exemplo \\<IPAddress>\<ShareName>\Certificates.
CertificatePassword SecureString Falso Com nome Nenhuma A palavra-passe de todos os certificados fornecidos no -PfXFilesPath. Valor necessário se PfxFilesPath for fornecido quando os segredos externos são rodados.
Internal String Falso Com nome Nenhuma O sinalizador interno tem de ser utilizado sempre que um operador do Azure Stack Hub quiser rodar segredos internos da infraestrutura.
PathAccessCredential PSCredential Falso Com nome Nenhuma A credencial do PowerShell para a partilha de ficheiros do diretório \Certificates que contém todos os certificados de ponto final de rede externos. Apenas é necessário ao rodar segredos externos.
ReRun ParâmetroOpcional Falso Com nome Nenhuma Tem de ser utilizado sempre que a rotação secreta for novamente tentada após uma tentativa falhada.

Syntax

Para rotação de segredos externos

Start-SecretRotation [-PfxFilesPath <string>] [-PathAccessCredential <PSCredential>] [-CertificatePassword <SecureString>]  

Para rotação de segredos internos

Start-SecretRotation [-Internal]  

Para a nova execução da rotação de segredos externos

Start-SecretRotation [-ReRun]

Para a nova execução da rotação de segredos internos

Start-SecretRotation [-ReRun] [-Internal]

Exemplos

Rodar apenas segredos de infraestrutura interna

Este comando tem de ser executado através do ponto final privilegiado do ambiente do Azure Stack Hub.

PS C:\> Start-SecretRotation -Internal

Este comando roda todos os segredos da infraestrutura expostos à rede interna do Azure Stack Hub.

Rodar apenas segredos de infraestrutura externa

# Create a PEP Session
winrm s winrm/config/client '@{TrustedHosts= "<IP_address_of_ERCS>"}'
$PEPCreds = Get-Credential
$PEPSession = New-PSSession -ComputerName <IP_address_of_ERCS> -Credential $PEPCreds -ConfigurationName "PrivilegedEndpoint" -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US)

# Create Credentials for the fileshare
$CertPassword = ConvertTo-SecureString '<CertPasswordHere>' -AsPlainText -Force
$CertShareCreds = Get-Credential
$CertSharePath = "<NetworkPathOfCertShare>"
# Run Secret Rotation
Invoke-Command -Session $PEPsession -ScriptBlock {
    param($CertSharePath, $CertPassword, $CertShareCreds )
    Start-SecretRotation -PfxFilesPath $CertSharePath -PathAccessCredential $CertShareCreds -CertificatePassword $CertPassword
} -ArgumentList ($CertSharePath, $CertPassword, $CertShareCreds)
Remove-PSSession -Session $PEPSession

Este comando roda os certificados TLS utilizados para os pontos finais de infraestrutura de rede externa do Azure Stack Hub.

Rodar segredos de infraestrutura interna e externa (apenas antes de 1811 )

Importante

Este comando aplica-se apenas ao Azure Stack Hub anterior a 1811 , uma vez que a rotação foi dividida para certificados internos e externos.

A partir do 1811+ já não pode rodar certificados internos e externos!

# Create a PEP Session
winrm s winrm/config/client '@{TrustedHosts= "<IP_address_of_ERCS>"}'
$PEPCreds = Get-Credential
$PEPSession = New-PSSession -ComputerName <IP_address_of_ERCS> -Credential $PEPCreds -ConfigurationName "PrivilegedEndpoint" -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US)
# Create Credentials for the fileshare
$CertPassword = ConvertTo-SecureString '<CertPasswordHere>' -AsPlainText -Force
$CertShareCreds = Get-Credential
$CertSharePath = "<NetworkPathOfCertShare>"
# Run Secret Rotation
Invoke-Command -Session $PEPSession -ScriptBlock {
    Start-SecretRotation -PfxFilesPath $using:CertSharePath -PathAccessCredential $using:CertShareCreds -CertificatePassword $using:CertPassword
}
Remove-PSSession -Session $PEPSession

Este comando roda os segredos da infraestrutura expostos à rede interna do Azure Stack Hub e os certificados TLS utilizados para os pontos finais de infraestrutura de rede externa do Azure Stack Hub. Start-SecretRotation rodar todos os segredos gerados por pilha e, como existem certificados fornecidos, os certificados de ponto final externo também serão rodados.

Passos seguintes

Saiba mais sobre a segurança do Azure Stack Hub