├── .gitignore ├── docs ├── CNAME ├── _config.yml ├── CHANGELOG.md └── index.md ├── rootfs ├── usr │ └── local │ │ └── bin │ │ ├── epoint.sh │ │ ├── startbrowser.sh │ │ └── banner.sh └── etc │ └── systemd │ └── system.control │ ├── xvfb.service │ ├── banner.service │ ├── chromium.service │ ├── xfwm.service │ ├── novnc.service │ └── vnc.service ├── README.md ├── Makefile └── Dockerfile /.gitignore: -------------------------------------------------------------------------------- 1 | .history -------------------------------------------------------------------------------- /docs/CNAME: -------------------------------------------------------------------------------- 1 | dockerbb.morimoto.net.br -------------------------------------------------------------------------------- /docs/_config.yml: -------------------------------------------------------------------------------- 1 | #theme: jekyll-theme-dinky 2 | timezone: America/Sao_Paulo 3 | remote_theme: pmarsceill/just-the-docs -------------------------------------------------------------------------------- /rootfs/usr/local/bin/epoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -xe 2 | 3 | groupadd -g $USER_GID user 4 | useradd -u $USER_UID -g $USER_GID -ms /bin/bash user 5 | chown -R user.user /home/user 6 | 7 | exec /sbin/init 8 | -------------------------------------------------------------------------------- /rootfs/etc/systemd/system.control/xvfb.service: -------------------------------------------------------------------------------- 1 | [Service] 2 | ExecStart=/usr/bin/Xvfb :20 -screen 0 1366x900x16 3 | Restart=on-failure 4 | ExecStartPre=/bin/sleep 5 5 | 6 | [Install] 7 | WantedBy=multi-user.target 8 | 9 | -------------------------------------------------------------------------------- /rootfs/usr/local/bin/startbrowser.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -xe 2 | 3 | /usr/bin/dpkg -D10 -i /w.deb 4 | service warsaw restart 5 | 6 | runuser -l user -c "DISPLAY=:20 /usr/bin/chromium-browser --disable-dev-shm-usage --start-maximized" 7 | -------------------------------------------------------------------------------- /rootfs/etc/systemd/system.control/banner.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Requires=chromium.service 3 | After=chromium.service 4 | 5 | [Service] 6 | Type=oneshot 7 | ExecStart=/usr/local/bin/banner.sh 8 | RemainAfterExit=yes 9 | 10 | [Install] 11 | WantedBy=multi-user.target 12 | -------------------------------------------------------------------------------- /rootfs/etc/systemd/system.control/chromium.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Requires=novnc.service 3 | After=novnc.service 4 | 5 | [Service] 6 | ExecStart=/usr/local/bin/startbrowser.sh 7 | Restart=always 8 | #User=user 9 | #Group=user 10 | 11 | [Install] 12 | WantedBy=multi-user.target 13 | -------------------------------------------------------------------------------- /rootfs/etc/systemd/system.control/xfwm.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Requires=xvfb.service 3 | After=xvfb.service 4 | 5 | [Service] 6 | Environment=DISPLAY=:20 7 | ExecStart=/usr/bin/xfwm4 8 | Restart=on-failure 9 | ExecStartPre=/bin/sleep 5 10 | 11 | [Install] 12 | WantedBy=multi-user.target 13 | -------------------------------------------------------------------------------- /rootfs/etc/systemd/system.control/novnc.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Requires=vnc.service 3 | After=vnc.service 4 | 5 | [Service] 6 | ExecStart=/usr/share/novnc/utils/launch.sh --vnc 127.0.0.1:5900 7 | Restart=on-failure 8 | User=user 9 | Group=user 10 | ExecStartPre=/bin/sleep 5 11 | 12 | [Install] 13 | WantedBy=multi-user.target -------------------------------------------------------------------------------- /rootfs/usr/local/bin/banner.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo " 3 | === 4 | 5 | Componentes iniciados! 6 | Em seu navegador, acesse (CTRL+Click do mouse aqui no terminal): 7 | 8 | http://localhost:6080/vnc_auto.html 9 | 10 | O navegador dentro deste container será sempre reiniciado. 11 | 12 | Para desligar definitivamente, lembre-se de parar o container dockerbb: 13 | 14 | docker stop dockerbb 15 | 16 | " > /dev/pts/0 17 | -------------------------------------------------------------------------------- /rootfs/etc/systemd/system.control/vnc.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Requires=xfwm.service 3 | After=xfwm.service 4 | 5 | [Service] 6 | #ExecStart=/usr/bin/x11vnc -passwd $VNC_PASSWORD --rfbport 5900 -display $DISPLAY -N -forever 7 | ExecStart=/usr/bin/x11vnc --rfbport 5900 -display :20 -N -forever -ncache 8 | Restart=on-failure 9 | User=user 10 | Group=user 11 | ExecStartPre=/bin/sleep 5 12 | 13 | [Install] 14 | WantedBy=multi-user.target 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # dockerbb 2 | 3 | > ATENÇÃO! Repositório arquivado, sem previsão para atualizações futuras. Foi uma ótima experiência. Gratidão a todos que colaboraram! 🙏 4 | 5 | **Protótipo** de imagem Docker com Chromium Browser e Warsaw instalados para acessar o Banco do Brasil. Possibilita acesso ao Internet Banking do Banco do Brasil usando um navegador isolado dentro de um contêiner Docker, sem instalar o módulo de segurança em sua estação de trabalho. 6 | 7 | ## Documentação 8 | 9 | Confira instruções para construção e utilização na documentação completa. 10 | 11 | 👉 https://dockerbb.morimoto.net.br 12 | 13 | OBS: Até 13/jun/2021, a documentação era hospedada no domínio dockerbb.juliohm.com.br. A partir de então, o endereço foi alterado para https://dockerbb.morimoto.net.br. 14 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | IMG=juliohm/dockerbb:3.10-beta 2 | 3 | DOCKERCMD=sudo docker 4 | 5 | .PHONY: docs 6 | 7 | USER_UID = $(shell id -u $(USER)) 8 | USER_GID = $(shell id -g $(USER)) 9 | ifeq ($(shell uname),Darwin) 10 | USER_GID = $(shell id -u $(USER)) 11 | endif 12 | 13 | build: 14 | $(DOCKERCMD) build -t dockerbb . 15 | 16 | push: build 17 | $(DOCKERCMD) tag dockerbb $(IMG) 18 | $(DOCKERCMD) push $(IMG) 19 | 20 | start: IMG=dockerbb 21 | start: 22 | -$(DOCKERCMD) stop dockerbb 23 | -$(DOCKERCMD) rm -f dockerbb 24 | #rm -rf ~/dockerbb-data/.config/chromium/Singleton* 25 | $(DOCKERCMD) run -d --rm -it --privileged --name dockerbb \ 26 | -e USER_UID=$(USER_UID) \ 27 | -e USER_GID=$(USER_GID) \ 28 | -p 127.0.0.1:6080:6080 \ 29 | -v "$(HOME)/dockerbb-data:/home/user" \ 30 | $(IMG) www.bb.com.br 31 | $(DOCKERCMD) logs -f dockerbb 32 | 33 | stop: 34 | #rm -rf ~/dockerbb-data/.config/chromium/Singleton* 35 | -$(DOCKERCMD) stop dockerbb 36 | -$(DOCKERCMD) rm -f dockerbb 37 | @echo 38 | @echo OK! dockerbb foi desligado 39 | @echo 40 | 41 | logs: 42 | $(DOCKERCMD) logs -f dockerbb 43 | 44 | shell: 45 | $(DOCKERCMD) exec -it dockerbb bash 46 | remove: 47 | -$(DOCKERCMD) image rm dockerbb 48 | 49 | docs: 50 | git add docs; git commit -m 'docs'; git push 51 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:18.04 2 | 3 | ENV DEBIAN_FRONTEND=noninteractive \ 4 | CHROME_VERSION=112 \ 5 | XFCE_VERSION=4 \ 6 | XFWM4_VERSION=4 \ 7 | X11VNC_VERSION=0.9.13-3 \ 8 | XVFB_VERSION=2:1.19.6 \ 9 | NOVNC_VERSION=1:0.4 \ 10 | OPENSSL_VERSION=1 \ 11 | container=docker 12 | 13 | RUN apt-get update && apt-get install -y \ 14 | libnss3-tools \ 15 | zenity \ 16 | libgtk2.0-0 \ 17 | dbus-x11 \ 18 | yad \ 19 | libcurl3 \ 20 | libdbus-1.3 \ 21 | sudo gosu \ 22 | libxss1 \ 23 | lsb-release \ 24 | wget \ 25 | xdg-utils \ 26 | net-tools \ 27 | openssl=${OPENSSL_VERSION}* \ 28 | xfce4=${XFCE_VERSION}* \ 29 | xfwm4=${XFWM4_VERSION}* \ 30 | x11vnc=${X11VNC_VERSION}* \ 31 | xvfb=${XVFB_VERSION}* \ 32 | novnc=${NOVNC_VERSION}* \ 33 | chromium-browser=${CHROME_VERSION}* \ 34 | && dpkg -l | awk '{print "|" $2 "|" $3 "|"}' > /installed-packages.txt 35 | 36 | RUN apt-get install -y vim less 37 | 38 | ENV USER_UID=1000 39 | ENV USER_GID=1000 40 | 41 | ADD https://cloud.gastecnologia.com.br/cef/warsaw/install/GBPCEFwr64.deb /w.deb 42 | 43 | RUN mkdir -p /var/run/dbus 44 | 45 | COPY rootfs / 46 | 47 | STOPSIGNAL SIGRTMIN+3 48 | 49 | RUN systemctl enable xvfb \ 50 | && systemctl enable xfwm \ 51 | && systemctl enable vnc \ 52 | && systemctl enable novnc \ 53 | && systemctl enable chromium \ 54 | && systemctl enable banner \ 55 | && echo OK 56 | 57 | ENTRYPOINT [ "/usr/local/bin/epoint.sh" ] 58 | -------------------------------------------------------------------------------- /docs/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Histórico de Versões 2 | 3 | ## 3.8 (03/nov/2021) 4 | 5 | * Atualiza Chromium Browser para 95 6 | * Cria variável de ambiente `container=docker` para systemd se comportar com o host. 7 | * Generaliza versão do openssl para 1.x mais recente. 8 | 9 | ## 3.7 (28/jul/2021) 10 | 11 | * Atualiza Chromium Browser para 92 12 | 13 | ## 3.6 (07/jul/2021) 14 | 15 | * Atualiza Chromium Browser para 91.0.4472.114 16 | 17 | ## 3.5 (15/mar/2021) 18 | 19 | * Atualiza Chromium Browser para 89.0.4389.90 20 | * Notas sobre o docker rootless 21 | 22 | ## 3.4 (23/out/2020) 23 | 24 | * Atualiza Chromium Browser para 86.0.4240.75 25 | 26 | ## 3.3 (10/out/2020) 27 | 28 | * Atualiza Chromium Browser para 85.0.4183.121 29 | * Atualiza Warsaw para 1.15.1-1 30 | * Altera inicialização dos componentes para funcionar com warsaw 1.15.x 31 | 32 | ## 3.2 (09/ago/2020) 33 | 34 | * Atualiza Chromium para 84.0.4147.105 35 | 36 | ## 3.1 (22/jul/2020) 37 | 38 | * Atualiza Chromium para 83.0.4103.61 39 | * Substitui `wait.sh` por uma alternativa mais robusta: `banner.service` iniciado depois do chromium. 40 | * Usa flag `--disable-dev-shm-usage` do chromium para evitar que abas morram com falta de memória SHM. 41 | * Usa flag `--start-maximized` do chromium para iniciar navegador já maximizado. 42 | * Define `Restart=always` no `chromium.service` para um restart automático do navegador. 43 | * Define `STOPSIGNAL` com valor `SIGRTMIN+3` para que o comando `docker stop` consiga desligar o `/sbin/init` com sucesso. 44 | 45 | ## 3.0 (11/mai/2020) 46 | 47 | * Merge com PR #2 (@marcocspc) melhora suporte ao MacOS 48 | * Melhorias em cima da PR #2 para ficar mais simples 49 | * Remove Firefox, substitui pelo Chromium Browser (81) 50 | * Inclui nos docs uma lista completa de todos os pacotes instalados. 51 | * Atualiza documentação 52 | 53 | ## 2.3 (05/abr/2020) 54 | 55 | * Modifica entrypoint para /sbin/init e configura todos os serviços com systemctl. 56 | * Atualiza warsaw para 1.14.1-10 57 | * Atualiza Firefox para 74.0.1 58 | * Remove senha do VNC - para segurança, expor a porta 6080 apenas em localhost na hora de executar o container. 59 | 60 | ## 2.1 (12/jul/2019) 61 | 62 | * Melhorias no entrypoint para manter o x11vnc e xfwm sempre executando em plano de fundo. 63 | 64 | ## 2.0 (10/jul/2019) 65 | 66 | * Remove necessidade de compartilhar ambiente X11 com host. Utiliza Xfce4 e Firefox instalados dentro da imagem. 67 | * Acesso via web vnc através de 68 | 69 | Versões de componentes: 70 | 71 | * Firefox: 67.0.4 72 | * Warsaw 1.13.1-2 73 | * xfwm4 4.12.5 74 | 75 | ## v1.0 (30/nov/2018) 76 | 77 | Versões de componentes: 78 | 79 | * Google Chrome 70.0.3538.110 80 | * Warsaw 1.12.13-8 81 | -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | ## ‼ LEIA ANTES DE CONTINUAR ‼ 2 | 3 | ***O conteúdo deste repositório é um protótipo de uso pessoal independente e não possui vínculo com o Banco do Brasil ou qualquer instituição relacionada***. 4 | 5 | ***Sua utilização presume conhecimentos técnicos avançados e se dá por sua própria conta e risco, sem qualquer garantia de suporte ou segurança.*** 6 | 7 | ***Por questões de segurança NUNCA UTILIZE QUALQUER IMAGEM DOCKER PRÉ-CONSTRUÍDA DESTE PROJETO. Obtenha uma cópia do código fonte, confira o conteúdo e contrua sua própria imagem.*** 8 | 9 | ***Caso não saiba como proceder com as instruções abaixo, esta solução certamente não é para você.*** 10 | 11 | ## Histórico de Versões 12 | 13 | A partir da versão 3.0, o Firefox é substituído pelo Chromium Browser. Ao momento, por ser o navegador majoritário do mercado, oferece maior compatibilidade. Mesmo sendo executado dentro de um container, alguns usuários já encontraram dificuldades usando o dockerbb no MacOS. 14 | 15 | > Agradecimentos ao [@marcocspc](https://github.com/marcocspc) pela ajuda 👍 16 | 17 | Começando com a versão `2.x`, componentes necessários para o Xfce4 e VNC são iniciados dentro do container, mantendo tudo ainda mais isolado. Caso precise consultar a documentação das versões antigas, confira o histórico [na tag `1.x`](https://github.com/juliohm1978/dockerbb/tree/v1.0). 18 | 19 | ### Alteração de domínio 20 | 21 | Até 13/jun/2021, esta documentação era hospedada no domínio **dockerbb.juliohm.com.br**. A partir de então, o endereço foi alterado para **https://dockerbb.morimoto.net.br**. 22 | 23 | ### Versão atual 3.9 (29/mai/2023): 24 | 25 | * Chromium Browser: 112 26 | * Warsaw 2.21.3-1 27 | 28 | Confira histórico de versões em [CHANGELOG.md](CHANGELOG.md). 29 | 30 | ## Problemas Conhecidos 31 | 32 | ### Stop Signal 33 | 34 | Mesmo que o container seja iniciado com `docker run -it` dando ao terminal um console interativo, o comando CTRL+C enviado para dentro do container não consegue matar o processo 1 (`/sbin/init`). Este precisa de outro sinal para terminar com sucesso `SIGRTMIN+3`, agora definido como `STOPSIGNAL` no `Dockerfile`. 35 | 36 | Para conseguir parar o container, é preciso usar `docker stop dockerbb`. 37 | 38 | ### Docker Rootless 39 | 40 | Com maior segurança em mente, a utilização do Docker em modo _rootless_ tem se tornado popular, especialmente no ambiente Desktop. Isto evita que usuários comuns tenham acesso ao Docker Daemon do usuário _root_. 41 | 42 | Infelizmente, esta imagem não funciona bem no modo rootless ou `ubuntu:20.04` devido à forma como o `/sbin/init` se comporta. 43 | 44 | ## Construção Local da Imagem 45 | 46 | Com Git e Docker instalados, execute: 47 | 48 | ```bash 49 | git clone https://github.com/juliohm1978/dockerbb.git 50 | cd dockerbb 51 | make 52 | ``` 53 | 54 | O build é demorado. Portanto, vá tomar um café. O resultado será uma imagem chamada `dockerbb`. 55 | 56 | ## Como Usar 57 | 58 | Há um target no `Makefile` preparado para executar um container. 59 | 60 | ```bash 61 | make start 62 | ``` 63 | 64 | Isto deve criar um container chamado `dockerbb` com volume montado em `$HOME/dockerbb-data`. Este diretório em seu computador representa o diretório `$HOME` do usuário dentro do container. 65 | 66 | > Algumas distribuições Linux (e mesmo MacOS da Apple) podem manter um UID:GID diferente para o seu usuário na estação de trabalho. O `Makefile` tenta deduzir os valores. Em caso de problemas, confira adiante como alterá-los. 67 | 68 | Após alguns instantes, os componentes internos serão inicializados e uma instância do navegador estará executando dentro do container. O acesso estará disponível quando aparecer a mensagem abaixo: 69 | 70 | ```text 71 | Componentes iniciados! 72 | Em seu navegador, acesse (CTRL+Click do mouse aqui no terminal): 73 | 74 | http://localhost:6080/vnc_auto.html 75 | 76 | Quando terminar, lembre-se de desligar o dockerbb: 77 | 78 | docker stop dockerbb 79 | ``` 80 | 81 | O acesso pode ser feito através do seu navegador preferido, mas **sempre e somente em sua estação de trabalho** (localhost/127.0.0.1). O endereço lhe dará acesso a uma sessão VNC dentro do container. Lá dentro, outra instância do navegador Chromium estará disponível. 82 | 83 | > INCEPTION: Utilize o navegador dentro do seu navegador para acessar o site do banco. 84 | 85 | Ao terminar, lembre-se de finalizar o container para desligar todos os serviços iniciados: 86 | 87 | ```bash 88 | make stop 89 | ``` 90 | 91 | O container será completamente removido, mas o diretório `$HOME/dockerbb-data` será mantido em sua estação de trabalho. 92 | 93 | Toda vez que o dockerbb for iniciado, uma nova instalação do pacote Warsaw é realizada. Isto deve renovar as chaves e certificados do componente sempre que o `dockerbb` for executado. 94 | 95 | ## Usuário dentro do container 96 | 97 | O `Makefile` deste projeto está preparado para deduzir o `UID:GID` de sua estação de trabalho e repassá-los ao container. Caso precise usar outros valores de `UID:GID`, pode defeiní-los passando variáveis de ambiente diretamente ao container: `USER_UID` e `USER_GID`. 98 | 99 | Com estes valores devidamente ajustados, o diretório `$HOME/dockerbb-data` e todo seu conteúdo terão as permissões do seu usuário. Fora este diretório, o navegador Chromium não possui acesso à sua estação de trabalho. Para transferir arquivos dentro e fora do container, utilize o diretório `$HOME/dockerbb-data`. 100 | 101 | ## Algumas notas finais 102 | 103 | Sendo uma imgem Docker com base `FROM ubuntu:18.04`, segue-se que o `dockerbb` foi criado especialmente para ambientes Linux. Nenhum suporte foi idealizado para o Windows. Nada foi testado no [WSL da Microsoft](https://docs.microsoft.com/pt-br/windows/wsl/install-win10). 104 | 105 | Para que funcione, vários processos são gerenciados dentro do container pelo `/sbin/init`, comum em várias distribuições. Isto quebra o paradigma "*um processo por container*", mas faz-se necessário nos moldes desta solução. 106 | 107 | Dentro do container, um usuário comum é configurado em tempo de execução. Alguns componentes, como Warsaw e o navegador são executados com este usuário. Outros, por serem necessários ao gerenciamento de processos do Linux, são executados como `root`. 108 | --------------------------------------------------------------------------------