O blog da AWS

Disponibilizando na nuvem uma aplicação desktop Windows com integração smart card – Amazon AppStream 2.0

Por Ariane Vieira, arquiteta de soluções na AWS.

Introdução:

Durante sua jornada de cloud, muitas organizações passam a rever suas aplicações legadas traçando estratégias de modernização e migração para nuvem, ou até mesmo criando novas aplicações para já rodarem em ambiente de nuvem de forma nativa.

Mas, e quando uma organização possui aplicações legadas em desktop e que, seja por motivos estratégicos ou técnicos, ainda será mantida na mesma versão? Um dos requisitos que mapeamos com nossos clientes é em relação a virtualização de aplicações que necessitam acessar o USB local para, por exemplo, conectar-se a um token de assinatura digital ou um smart card para atender um fluxo de assinatura de documentos.

Nesse blogpost vamos mostrar como é possível utilizar o Amazon AppStream 2.0 para virtualizar aplicações desktop e aproveitar os benefícios de um serviço gerenciado pela AWS, possibilitando ofertar seu software de forma segura, escalável e sem necessidade de refatorar suas aplicações, mesmo que elas necessitem acessar dispositivos locais.

O AppStream 2.0 é um serviço de streaming de aplicações gerenciado pela AWS que permite que aplicações desktop funcionem de forma transparente através de um web browser compatível com HTML5 ou através de um cliente dedicado, permitindo que seus usuários possam acessá-las de forma rápida a partir de qualquer lugar.

Na figura 1 é apresentado a visão geral de como os componentes e funcionalidades principais do AppStream e como eles interagem entre si. Antes de seguir com a leitura desse blogpost é importante que você compreenda o papel de cada um deles, pois nos próximos parágrafos vamos realizar a configuração dos mesmos.

Figura 1: Visão geral funcionamento Amazon AppStream 2.0

Componentes:

  • Image Builder: é o nome dado a instância que é criada a partir de uma imagem base fornecida pelo AppStream podendo escolher entre diferentes configurações de sistema operacional, memória, cpu e configurações gráficas. Essa instância será utilizada para instalar, configurar e testar sua aplicação.
  • Image: gerada a partir do image builder, contém as aplicações e configurações de sistema necessários e habilitadas para serem disponibilizada para seus usuários. Toda imagem criada fica disponível no Image Registry.
  • Fleet: também chamado de ´instâncias de streaming´, é o conjunto de instâncias que, a partir de uma imagem criada anteriormente, efetivamente executa as aplicações e as disponibiliza para os usuários finais e cada usuário será direcionado a uma instância que pertence a esse fleet.

O AppStream 2.0 atualmente oferece três opções de inicialização do fleet: Always-On, On-Demand e Elastic. A escolha do tipo de fleet influencia no tempo de inicialização da sessão para o usuário final, no custo e, no caso do tipo Elastic, dos recursos disponíveis e no processo disponibilizar a aplicação. Nesse blogpost,  os recursos e processos que serão utilizados se aplicam para os tipos Always-On e On-Demand. Consulte a documentação para validar qual o melhor fleet para seu caso de uso.

  • Stack: consiste no conjunto de fleet e das configurações relacionadas ao ambiente que será entregue para o cliente final, como usuários, permissões de acesso, tipo de storage a ser utilizado e se haverá persistência de dados. Também é possível customizar o logo que será exibido na tela quando seu cliente final realizar login no AppStream.

Diagrama de integração entre AppStream e aplicação de exemplo

Neste blog utilizamos uma aplicação desktop de exemplo para ilustrar o uso e configurações do AppStream. A aplicação realiza uma chamada no banco de dados para carregar alguns itens na tela. Essa aplicação também possui a opção de assinatura digital que, para efeitos de demonstração, ao ser selecionada carrega o certificado digital e assina uma frase de teste.

Na figura abaixo é apresentado a integração entre a aplicação exemplo e o AppStream:

Figura 2: integração entre a aplicação exemplo e o AppStream

Instalando a aplicação e habilitando a leitura do smart card

1- Criando a imagem builder

  1. Na console, acesse o Amazon AppStream
  2. No menu lateral esquerdo, escolha Images
  3. Na tela que abrir, acesse a aba Image Builder e clique em Launch Image Builder.
  4. No menu seguinte, escolha o tipo de instância e as configurações que deseja utilizar como base para instalar sua aplicação.

Para a aplicação de exemplo desse blogpost, foi utilizado uma instância Windows Server 2019 – General Purpose, utilizando uma subnet privada da VPC que vamos criar o AppStream e mantendo o acesso default a internet desabilitado. Caso tenha alguma dúvida, consulte a documentação para criar e configurar um image buider.

2- Instalando a aplicação

Assim que o Image Builder estiver com status ‘Running’

  1. Selecione-o e clique em ‘Connect’
  2. Escolha o tipo de usuário ‘Administrador’. Note que existem três tipos de usuário e cada um deles possui papéis diferentes que serão utilizados durante a instalação da sua aplicação, sendo eles:
    • Administrador: para instalar e criar a imagem da sua aplicação e/ou realizar tarefas que necessitem de acesso de administrador local na máquina.
    • Template: para criar as configurações default da aplicação e do Windows.
    • Teste: para abrir sua aplicação e validar se todas as configurações foram aplicadas corretamente.
  3. Instale sua aplicação e as dependências necessárias da mesma forma que você instalaria no seu ambiente on-premise (via powershell, batch, instalador, etc).
    Para este exemplo, será instalado no Image Builder o executável da aplicação e o driver/middleware – disponibilizado no site do próprio fabricante – do token ou smart card para permitir a assinatura digital de forma compatível com o ICP-Brasil. Este passo se faz necessário pois estamos redirecionando o acesso do token USB como um todo para a instância do AppStream, assim como faríamos caso estivéssemos instalando este dispositivo em um computador novo.

Nota: certifique-se que sua aplicação possa ser acessada por outros usuários além do administrador, pois nos próximos passos vamos trocar o perfil do usuário para realizar os testes.

3 – Permitir leitura USB smart card

Por razões de segurança, o AppStream só irá reconhecer os dispositivos USB que tenham sidos qualificados como fontes confiáveis.  Para qualificar um dispositivo USB é necessário criar um arquivo declarando uma string filtro com as informações referente ao dispositivo. Essa string deve possuir o seguinte formato ‘Name, Base Class, SubClass, Protocol, VID, PID, Support Autoshared, Skip Reset’, sendo esses campos:

  • Name: nome default do dispositivo, mas você pode atribuir o nome que desejar.
  • Base Class, SubClass, Protocol: informações sobre as funcionalidades do USB conforme estabelecido nos códigos padrão da classe USB (para utilizar na string de qualificação é preciso converter os códigos para base decimal).
  • Vendor ID (VID): identificador único referente ao fabricante do dispositivo (também em base decimal).
  • Product ID (PID): identificador único referente ao modelo do dispositivo (também em base decimal).
  • Support Autoshared: 0 ou 1, indica se deve compartilhar o USB com o AppStream por padrão sempre que uma sessão iniciar ou se deve selecionar no momento de uso, sendo 1 para compartilhamento automático.
  • Skip Reset: 0 ou 1, indica se o USB deve ser resetado ao iniciar uma sessão no AppStream.

Para mais detalhes sobre cada campo, você pode consultar a documentação aqui.

*Nota: embora usualmente os identificadores dos dispositivos USB (código da classe, PID e VID) são exibidos em formato hexadecimal, o AppStream trabalha com a representação em base decimal.

  1. Qualificando o dispositivo USB

Caso você não tenha certeza da string a ser utilizada, você pode utilizar o AppStream Client para consultar a string sugerida. Para isso:

  1. Instale o AppStream Client e conecte o dispositivo a ser qualificado na porta USB em seu computador
  2. Abra o diretório ‘C:\Users\<logged-in-user>\AppData\Local\AppStreamClient’
  3. Dê um duplo clique em dcvusblist.exe.
  4. Identifique o nome do dispositivo na lista apresentada e copie a string correspondente.

Figura 3: listagem dispositivos USB no AppStream client

Conforme ilustrado na figura 2, o leitor de smart card que estamos utilizando é representado pela string USBSmartCardReader,11,0,0,2278,13367,0,0. No entanto, nesse exemplo queremos permitir a qualificação de quaisquer dispositivos de smart card, independente do fornecedor e que seja solicitado para habilitar o compartilhamento do smart card no momento de uso. Para atender a esses requisitos, vamos alterar a string de filtro para:

    • USBSmartCardReader,11,0,0,*,*,0,0.
  1. Com a string mapeada, acesse novamente o Image Builder com perfil administrador
  2. Abra o Notepad como administrador
  3. Salve a string sobrescrevendo o arquivo usbtxt’ no diretório ‘C:\ProgramData\Amazon\Photon\DCV’, conforme ilustrado na figura 3.
  4. Desconecte-se e reinicie novamente o Image Builder para que as mudanças sejam refletidas.

Figura 4: string filtro para qualificação USB de leitura de smart card

4- Iniciando criação da Imagem

Com as configurações acima finalizadas e o Image Builder reiniciado, conecte novamente como Administrador e:

  1. Abra o ´Image Assistant´
  2. Para cada aplicação que desejar disponibilizar, clique em + Add App
  3. Selecione a aplicação
  4. Confirme as configurações e clique em Next.

Para as próximas abas, siga os passos descritos em tela e caso fique com alguma dúvida durante o processo, consulte a página da documentação aqui.


Figura 5: Imagem recém criada e disponível para ser utilizada pelas Stacks e Fleets.

Dicas:

  • Para evitar custos desnecessários, após finalizar a criação da imagem da sua aplicação certifique-se de parar a instância utilizada como image builder. Confira essa e outras dicas na documentação de boas práticas.
  • Conforme mencionando na documentação, é necessário utilizar o AppStream 2.0 Client para compartilhar dispositivos USB. Sendo assim, para testar sua aplicação com o uso do USB antes de gerar sua imagem, conecte-se no Image Builder via AppStream 2.0 Client da seguinte maneira:  selecione seu imagem builder e clique em ´Action  → Create Streaming URL´, abra o AppStream 2.0 Client e cole a URL gerada.
  • Você pode criar scripts para executarem ações personalizadas quando seu usuário final iniciar ou encerrar uma sessão. Essa etapa não será abordada nesse blogpost, mas caso sua aplicação necessite de alguma configuração extra para funcionamento, como realizar um mapeamento de pasta na rede, você pode criar scripts de sessão que serão executados de forma dinâmica para aplicar essas configurações em tempo de início e/ou fim da sessão de cada usuário. Confira a documentação para maiores detalhes sobre o fluxo de execução, funcionamento e requisitos.

5- Criando o Fleet

Para criar o fleet, siga preenchendo as configurações indicadas nas telas, atentando-se a alguns conceitos das sessões:

  1. Detalhes da sessão do usuário: define o comportamento que as sessões terão e irá influenciar no comportamento de Auto Scaling das instâncias.
    • Duração máxima: tempo que uma sessão pode ficar ativa.
    • Timeout: tempo máximo que uma sessão pode ficar ativa após o usuário desconectar utilizando a opção ´Desconectar´ (se utilizar a opção ´Encerrar sessão´, a regra de timeout não será aplicada). Caso o usuário tentar se reconectar a instância dentro do período de timeout, ele será direcionado para a mesma sessão que estava logado anteriormente.
    • Idle: tempo máximo permitido para uma sessão ficar ativa quando o usuário fica ocioso, isto para de fornecer entrada de mouse ou do teclado. Caso atinja o limite, o usuário será desconectado automaticamente. Nota: download, upload, entrada e saída de áudio não são considerados atividades do usuário.

Quando for criar as regras de Auto Scaling, considere que uma instância pode estar com o status pendente, em uso, liberada. Sendo assim, o tempo utilizado como parâmetro para tempo máximo que a sessão fica ativa após o usuário desconectar, pode influenciar na quantidade de capacity máximo que você irá cadastrar, pois durante esse período essa instância pode ´concorrer´ com os usuários de fato ativos em seu ambiente.

  1. Capacidade de Fleet: indica a quantidade máxima e mínima de instâncias de streaming que o AppStream provisionará para você. Lembre-se que, para cada usuário será criado uma instância de streaming, portanto a documentação recomenda que seja considerado como capacidade máxima o número de usuários durante o pico de uso da sua aplicação.
  2. Auto Scaling: indica a quantidade de instâncias a serem adicionadas ou removidas conforme demanda do ambiente. Uma das recomendações sugeridas para otimizar o provisionamento dos recursos é combinar mais de um tipo de estratégia de auto scaling e criar políticas mais precisas conforme seu caso de uso, como configurar uma regra para alterar o número mínimo de instancias ativas durante o horário de pico de uso da sua aplicação e diminuir o número mínimo de instancias durante horários fora de horário comercial.

6- Criando a Stack

Será nessa etapa que você irá definir o fleet e configurar o que será permitido durante as sessões de streaming, como:

  • Permissão para realizar download, copiar e colar entre a área de transferência do AppStream e da máquina local do usuário
  • Definir o storage onde os arquivos salvos pelos usuários serão armazenados
  • Definir persistência de dados ao iniciar uma sessão
  • Personalizar tela com o logo da sua empresa

Para criar o stack, acesse a opção ´Stack´ no menu da console e siga com as instruções da tela.

7- Acessando e testando a aplicação

Com a stack criada, você pode gerenciar os usuários que terão acesso a suas aplicações através de:

  • Integração com o SAML 2.0: permite utilizar outros identity providers que utilizam o padrão SAML 2.0, como o AWS IAM Identity Center (sucessor do AWS Single Sign-On), Active Directory Federation (AD FS), Google, Okta, etc.
  • Integração com o Microsoft Active Directory para login e, se necessário, controle de permissões a dispositivos na rede, por exemplo impressoras.
  • Usuários AppStream: gerenciamento simplificado, sendo necessário criar um usuário com e-mail e senha. Para isso, na console, clique em´User Pool → Create User´ e uma vez que o usuário tenha sido criado, clique em ´Actions  →  Assign Stack´.

Figura 6: usuário de teste criado através do AppStream 2.0 User Pool.

Com as configurações finalizadas, sua aplicação estará pronta para ser utilizada. No exemplo abaixo você pode conferir a aplicação de teste sendo disponibilizada através do AppStream 2.0 Client e reconhecendo o smart card que configuramos nos passos anteriores.

Próximos passos

Nesse blogpost foi apresentando uma alternativa para realizar a migração de aplicações desktop Windows para a nuvem de modo que não sejam perdidas funcionalidades que necessitem de dispositivos locais como o USB mantendo a experiencia de uso da sua aplicação para os usuários.

Caso você tenha alguma aplicação desktop e queira avaliar essas e outras funcionalidades junto a sua aplicação, você pode consultar a documentação Começando em 10 passos e iniciar os primeiros testes com sua aplicação e o Amazon AppStream 2.0.

Referência:

Para a aplicação de teste, foi criado um banco de dados com os dados públicos do PAN 2007, contendo locais de prova, modalidades desportivas e capacidade de público.


Sobre a autora

Ariane Vieira trabalha com TI há 8 anos e atualmente é arquiteta de soluções na AWS com o foco em GovTechs, onde atua apoiando os clientes em suas diversas fases de adoção da nuvem, passando por projetos de migração de dados, modernização e otimização de custos, sempre buscando as melhores práticas. Anteriormente trabalhou no setor financeiro em projetos de inovação em canais digitais para o contato com os clientes, adquirindo experiencia em sistemas distribuídos, de mensageira em ambientes on-premises e realizando migrações para AWS.