Skip to content

Instantly share code, notes, and snippets.

@lbssousa
Last active March 8, 2019 16:36
Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save lbssousa/5dcc5459b02db8d971ae8984fcd37235 to your computer and use it in GitHub Desktop.
Save lbssousa/5dcc5459b02db8d971ae8984fcd37235 to your computer and use it in GitHub Desktop.
Configurando uma máquina virtual minimalista do Ubuntu 16.04 no VirtualBox para Internet Banking da Caixa Econômica Federal
REQUISITOS
* VirtualBox
* Vagrant
INSTRUÇÕES
1. Crie uma pasta, com o nome que você preferir (exemplo: UbuntuBankingCEF).
2. Salve o arquivo Vagrantfile e o script vagrant-cef na pasta recém-criada.
3. Torne o script executável:
chmod +x vagrant-cef
4. Execute o script:
./vagrant-cef
A primeira execução será um pouco mais demorada, pois a VM será criada
e os softwares necessários (incluindo o Firefox e o módulo de segurança
do banco) serão instalados. Ao final da instalação, o Firefox será
executado automaticamente a partir da VM. Quando a janela do Firefox for
fechada, a VM será automaticamente desligada.
#!/bin/sh
vagrant box update
vagrant up
vagrant ssh -c vbox-internet-banking
vagrant halt
# -*- mode: ruby -*-
# vi: set ft=ruby :
$script = <<ENDSCRIPT
Home="/home/ubuntu"
# Altere os valores abaixo de acordo com o seu banco
Modulo="GBPCEFwr64.deb"
UrlModulo="https://cloud.gastecnologia.com.br/cef/warsaw/install/${Modulo}"
UrlBanco="http://www.caixa.gov.br"
Caminho="/usr/local/bin/warsaw/core"
Script="vbox-internet-banking"
# Atualizando o sistema
apt-get update
apt-get upgrade
# Instalando uma seleção mínima de pacotes para rodar o Firefox
apt-get install -y --no-install-recommends language-pack-pt openssl libnss3-tools xauth firefox firefox-locale-pt
# Configurando a página inicial do Firefox
echo "lockPref(\"browser.startup.homepage\", \"${UrlBanco}\");" >> /etc/firefox/syspref.js
# Criando o script lançador do Firefox
cat >/usr/local/bin/${Script} <<EOF
#!/bin/sh
export LANG="pt_BR.UTF-8"
[ -d "${Home}/.mozilla" ] || firefox -CreateProfile default
[ -x "${Caminho}" ] || (wget -c ${UrlModulo} && sudo apt -y install ./${Modulo} && rm -f ./${Modulo})
${Caminho}
firefox -private-window ${UrlBanco}
loginctl terminate-session \\${XDG_SESSION_ID}
EOF
chmod +x /usr/local/bin/${Script}
# Limpando a instalação
apt-get -y autoremove
apt-get clean
ENDSCRIPT
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/xenial64"
config.vm.provider "virtualbox" do |vb|
vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on", "--draganddrop", "hosttoguest", "--clipboard", "bidirectional"]
end
config.ssh.forward_x11 = true
config.vm.provision :shell, inline: $script
end
@Patola
Copy link

Patola commented Mar 30, 2017

[14:21] [2261] [patola@trololo pasta]% vagrant plugin install vagrant-vbguest
Installing the 'vagrant-vbguest' plugin. This can take a few minutes...
/usr/lib/ruby/2.3.0/rubygems/specification.rb:946:in `all=': undefined method `group_by' for nil:NilClass (NoMethodError)
        from /usr/lib/ruby/vendor_ruby/vagrant/bundler.rb:275:in `with_isolated_gem'
        from /usr/lib/ruby/vendor_ruby/vagrant/bundler.rb:231:in `internal_install'
        from /usr/lib/ruby/vendor_ruby/vagrant/bundler.rb:102:in `install'
        from /usr/lib/ruby/vendor_ruby/vagrant/plugin/manager.rb:62:in `block in install_plugin'
        from /usr/lib/ruby/vendor_ruby/vagrant/plugin/manager.rb:72:in `install_plugin'
        from /usr/share/vagrant/plugins/commands/plugin/action/install_gem.rb:37:in `call'
        from /usr/lib/ruby/vendor_ruby/vagrant/action/warden.rb:34:in `call'
        from /usr/lib/ruby/vendor_ruby/vagrant/action/builder.rb:116:in `call'
        from /usr/lib/ruby/vendor_ruby/vagrant/action/runner.rb:66:in `block in run'
        from /usr/lib/ruby/vendor_ruby/vagrant/util/busy.rb:19:in `busy'
        from /usr/lib/ruby/vendor_ruby/vagrant/action/runner.rb:66:in `run'
        from /usr/share/vagrant/plugins/commands/plugin/command/base.rb:14:in `action'
        from /usr/share/vagrant/plugins/commands/plugin/command/install.rb:32:in `block in execute'
        from /usr/share/vagrant/plugins/commands/plugin/command/install.rb:31:in `each'
        from /usr/share/vagrant/plugins/commands/plugin/command/install.rb:31:in `execute'
        from /usr/share/vagrant/plugins/commands/plugin/command/root.rb:56:in `execute'
        from /usr/lib/ruby/vendor_ruby/vagrant/cli.rb:42:in `execute'
        from /usr/lib/ruby/vendor_ruby/vagrant/environment.rb:268:in `cli'
        from /usr/bin/vagrant:173:in `<main>'

@lbssousa
Copy link
Author

lbssousa commented Mar 30, 2017

Qual versão do Vagrant você tem aí? Aqui no meu openSUSE Tumbleweed, estou com a versão 1.9.1 e o plugin vagrant-vbguest instalou sem problemas.

@Patola
Copy link

Patola commented Mar 30, 2017

1.8.1, padrão dos repositórios do Ubuntu 16.04. Resolvi já, atualizei e funcionou.

@lbssousa
Copy link
Author

Acrescentei uma informação sobre a versão mínima requerida para o Vagrant no leia-me.txt. Obrigado pelo feedback!

@Patola
Copy link

Patola commented Mar 30, 2017

Mais um erro. A instalação do vagrant coloca um servidor de nomes estranho (acho que 10.0.2.3 ou algo do tipo), tive que mudar isso pra funcionar.

@Patola
Copy link

Patola commented Mar 30, 2017

Bom... Rebootando ele coloca o 10.0.2.3 de novo e mesmo eu consertando, ao entrar no site da caixa a senha de internet da caixa não funciona porque o botão "continuar" nunca aparece, só o "limpar". Não funcionou mesmo pra mim, não dá mais pra perder tempo nessa brincadeira. Valeu a tentativa, obrigado pelo gist.

@lbssousa
Copy link
Author

Eu verifiquei os pontos que você relatou aqui. Esse servidor de nome 10.0.2.3 é o que o VirtualBox disponibiliza para a VM em modo NAT. Alterando o adaptador de rede 1 da VM para modo bridge, esse servidor de nome desaparece.

Com relação a não aparecer o botão "continuar", eu consegui reproduzir o problema aqui. Por incrível que pareça, o problema está relacionado ao tamanho da janela do Firefox --- ou, mais precisamente, a responsividade da página do Internet Banking da Caixa tá falhando feio nesse caso. Experimente maximizar a sua janela do VirtualBox e, dentro da VM, pressione [Alt]+[P] e execute "autoxrandr" para redimensionar a área de trabalho. Se preferir, reinicie a VM com a janela do VirtualBox já maximizada, pois ela executa o "autoxrandr" automaticamente na inicialização.

@Patola
Copy link

Patola commented Mar 31, 2017

Valeu. Tentando novamente... Logo posto os resultados! :

@Patola
Copy link

Patola commented Mar 31, 2017

Bom... Mudar pra bridge não adiantou. O vagrant volta pra nat e ainda me xinga:

==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.                                                                                                                                                                                                                                                                  

Command: ["modifyvm", "561c37c3-b9e2-482e-ad72-b5d869158122", "--natpf1", "ssh,tcp,127.0.0.1,2222,,22"]                                                                                                                                                                                                                             

Stderr: VBoxManage: error: A NAT rule of this name already exists                                                                                                                                                                                                                                                                   
VBoxManage: error: Details: code NS_ERROR_INVALID_ARG (0x80070057), component NATEngineWrap, interface INATEngine, callee nsISupports                                                                                                                                                                                               
VBoxManage: error: Context: "AddRedirect(Bstr(strName).raw(), proto, Bstr(strHostIp).raw(), RTStrToUInt16(strHostPort), Bstr(strGuestIp).raw(), RTStrToUInt16(strGuestPort))" at line 1820 of file VBoxManageModifyVM.cpp  

Pior que esse parece ser um problema conhecido: http://serverfault.com/questions/453185/vagrant-virtualbox-dns-10-0-2-3-not-working com duas soluções no serverfault, estou tentando a segunda resposta, adicionar "vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]" no Vagrantfile. Logo relato o resultado. Não achei como fazer PR em gist, tem jeito?

@Patola
Copy link

Patola commented Mar 31, 2017

Com o vb.customize funcionou. Eu clonei o seu repositório, mas fazer pull request em gist é tosco e só dá para o autor (você) fazer. Ficou assim o Vagrantfile:

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Requer o plugin vagrant-vbguest. Se necessário, instale-o com o comando
#
#     vagrant plugin install vagrant-vbguest
#
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/xenial64"
  config.vm.provider "virtualbox" do |vb|
    vb.gui = true
    vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
  end
  config.vm.provision :shell, path: "bootstrap.sh"
  config.vbguest.auto_update = true
end

@lbssousa
Copy link
Author

Bom... Uma coisa que dá pra fazer pra evitar essa aporrinhação do Vagrant é, uma vez criada a VM e alterado o adaptador de rede para modo bridge, simplesmente dar um pé na bunda do Vagrant e inicializar a VM a partir do próprio VirtualBox (mais conveniente ainda é exportar um appliance da VM pronta e criar um atalho para ela na área de trabalho).

De qualquer modo, uma coisa que se pode tentar é acrescentar a seguinte entrada ao arquivo Vagrantfile (alterando os nomes das interfaces de rede conforme o seu caso):

config.vm.network "public_network", bridge: "wlan0, eth0"

PR em Gist eu não conheço, não. Só fork mesmo.

@Patola
Copy link

Patola commented Mar 31, 2017

A propósito: eu costumo usar o banco online sempre colando os números no site da caixa. Já que estamos na onda de modificar defaults do VirtualBox, não seria palatável também habilitar clipboard sharing?

@Patola
Copy link

Patola commented Mar 31, 2017

Recomendo não usar a bridge, não é uma solução tão universal quanto NAT. O ajuste que coloquei acho melhor, porque cobre muito mais casos, e funciona em todos.

@Patola
Copy link

Patola commented Mar 31, 2017

Lembre-se que estamos falando de criação automatizada de algo, se você exigir algo pra ser feito "depois" ou "durante" a tarefa do vagrant, já meio que destrói a utilidade do script... :-/

@lbssousa
Copy link
Author

Tem razão. Vou importar suas modificações aqui. Agora, a respeito do "shared clipboard", confesso que nunca usei aqui, mas se você está acostumado a usá-lo, pode experimentar a configuração descrita aqui: hashicorp/vagrant#4894

Se funcionar pra você, podemos incluir aqui.

@lbssousa
Copy link
Author

lbssousa commented Apr 3, 2017

@Patola, fiz uma grande reestruturação no Gist.

Agora, em vez de executar um gerenciador de janelas dentro da VM, a janela do Firefox dentro da VM é executada no ambiente gráfico do hospedeiro, via "SSH X11 Forwading". Com isso, pode-se eliminar, em princípio, o plugin vagrant-vbguest, garantindo que ele funcione com a versão padrão do Vagrant para o Ubuntu 16.04.

Também incluí um script de conveniência para disparar o Firefox da VM. Ele se encarregará de atualizar a VM (se houver alguma atualização disponível), ligá-la (se estiver desligada), abrir o Firefox da VM (via SSH) e desligar a VM quando o Firefox for fechado.

Eu só não garanto que você consiga colar os números como estava habituado a fazer.

@farribeiro
Copy link

farribeiro commented Apr 5, 2017

@lbssousa, Por que não usar projeto github para visualizar o histórico de alterações. Da última vez que visitei seu git estou tentando compreender sua linha e raciocínio. No momento eu entendi.

Para o meu esquema, de container, está com possibilidade de ter apenas o warsaw mas teria que alterar o browser hospedeiro. E como todo mundo diz que é um câncer, melhor manter da forma que está.

@farribeiro
Copy link

E outra coisa, pelo modelo que está, espanta muitos que tem o conceito de ter uma VM na forma tradicional, com X e WM.

@lbssousa
Copy link
Author

lbssousa commented Apr 7, 2017

@farribeiro, você tem razão. Talvez eu divida este Gist em dois: um com a implementação antiga (Xorg + dwm na VM) e outro com a implementação atual (SSH X11 Forwarding). Só agora eu me toquei que esta última implementação requer um servidor X11 no host, o que não é muito comum para máquinas Windows (teria que instalar o Xming ou o VcXsrv).

@farribeiro
Copy link

farribeiro commented Apr 25, 2017

@lbssousa, dá uma olhada em um novo recurso que poderíamos adicionar aos confinamentos, já coloquei no histórico do wscef... tem algumas coisas faltantes. Como as cadeias ICP-Brasil e outras configurações automáticas

https://gist.github.com/farribeiro/08da23ec20c545d6913a5610584034d3

@danielmenezesbr
Copy link

@lbssousa e @farribeiro, uma dúvida: nessa estratégia do "SSH X11 Forwading" faz sentido instalar o pacote xauth?

@danielmenezesbr
Copy link

@lbssousa, outra possibilidade de implementação seria via VNC. Eu criei um Vagrantfile[1] que é capaz de fazer o provisionamento do ambiente e ao final permite o acesso ao Firefox via VNC. Tenho um outro Vagrantfile[2] que provisiona o ambiente com um Ubuntu Desktop usando o container wscef.

[1] https://github.com/danielmenezesbr/warsaw-ubuntu-headless-vagrant
[2] https://github.com/danielmenezesbr/warsaw-ubuntu-vagrant

@farribeiro
Copy link

farribeiro commented Jun 28, 2017

@danielmenezesbr Eu acredito que fica mais democrático COM X NO CONVIDADO E WINDOW MANAGER

Mas foi opção do Laércio fazer por SSH e acho o Forward mais elegante do que VNC, o xauth é para gerencia de autorização da aplicação remota ser exibida no X do hospedeiro! este projeto já tomou rumos diferente o original com X,

O meu wscef-docker trabalha de maneira semelhante, entretanto não precisa utilizar SSH como protocolo de comunicação entre o host e convidado e carregar um SO operacional completo.

@farribeiro
Copy link

farribeiro commented Jun 28, 2017

@Patola
Copy link

Patola commented Mar 19, 2018

Caras, descobri uma coisa legal.
Uma coisa ruim dos ambientes de desktop é que ele agrupa essa janela do virtualbox como mais uma janela do firefox. É uma merda pra gerenciar.
Pra evitar isso, mude a linha de comando de início do firefox, adicionando --class CaixaEconomica --name CaixaEconomica antes do -private-window e ele não agrupará mais junto. Acaba funcionando como se fosse uma webapp. Super-prático. Já patcheei minha VM e meu fork do script.

@Patola
Copy link

Patola commented Mar 19, 2018

Aliás, melhor ainda, dá pra fazer um .desktop file com isso. Baixei o logo da caixa da net e fiz esse .desktop:

[Desktop Entry]
Version=1.0
Name=Caixa Econômica
Comment=Firefox na Caixa Econômica Federal com a bosta do Warsaw
Exec=/ubuntinho/vagrant-cef -- %u
Icon=/ubuntinho/logocaixa.png
Terminal=false
StartupWMClass=CaixaEconomica
Type=Application
Categories=Network;Banking;
MimeType=x-scheme-handler/tg;

@farribeiro
Copy link

Poderia nos deixar um screenshot para ver como fica a solução?

@farribeiro
Copy link

farribeiro commented May 17, 2018

@Patola,

Não compreendi qual efeito essa opção --class causa ao menos no SSH Forwarder do @lbsousa

No docker, tem comportamento semelhante ao SSH X11 Forwarder, não notei tal diferença, pedi para dar um review para se encontra como esperado, no aguardo.

Link para PR farribeiro/wscef-docker#39

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment