Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
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 commented Mar 30, 2017 edited

[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>'

Owner

lbssousa commented Mar 30, 2017 edited

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 commented Mar 30, 2017 edited

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

Owner

lbssousa commented Mar 30, 2017

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

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 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.

Owner

lbssousa commented Mar 31, 2017

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 commented Mar 31, 2017

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

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 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
Owner

lbssousa commented Mar 31, 2017

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 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 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 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... :-/

Owner

lbssousa commented Mar 31, 2017

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: mitchellh/vagrant#4894

Se funcionar pra você, podemos incluir aqui.

Owner

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 commented Apr 5, 2017 edited

@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á.

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

Owner

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 commented Apr 25, 2017 edited

@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

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

@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

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