Como usar senhas sem escreve-las nos scripts

Introdução

As vezes precisamos usar alguma senha/Token/Key para rodar um código, como por exemplo ao usar uma API que solicita autenticação. Mas isso significa que devemos escrever a senha no próprio script .R, por exemplo?

Não! Inclusive isso é um pouco perigoso. Imagina armazenar a senha para um serviço pago, esquecer e disponibilizar o script no GitHub? É receita para receber uma notificação do cartão de crédito cobrando algo que nem usamos… É, já ouvi casos assim!

Então neste post trago algumas dicas para evitar salvar as senhas nos scripts quando estiver programando.

Variáveis de ambiente

Uma forma de fazer isso é com as variáveis de ambiente (environment variables). Não vou detalhar o conceito de ambientes mas deixei um link nas referências, ao final do post.

Simplificando, as variáveis de ambientes são objetos que são carregados ao iniciar a sessão do R. Então eles ficarão disponíveis para uso, apesar de não aparecer no painel Environment do RStudio.

Uma forma de saber quais são as nossas variáveis de ambiente é usando a função Sys.getenv() sem argumentos. Atenção, várias variáveis de configuração irão aparecer no output e não recomendo alterá-las.

A função Sys.setenv() permite que você salve a senha/token nas variáveis de ambiente. Cuidado, rode essa etapa no console e não salve no script (pois justamente queremos não armazenar as senhas no script, certo?).

Sys.setenv(MINHA_SENHA = 1234)

Para buscar o valor salvo na variável, pode usar a função Sys.getenv(). Essa função podemos usar no nosso script sem problemas!

Sys.getenv("MINHA_SENHA")
## [1] "1234"

Indo além com a ajuda do usethis

As variáveis de ambiente podem ser vinculadas ao .Rproj ativo, ou ao usuário do computador. Elas ficam salvas no arquivo .Renviron. Para abrir o arquivo e ver as variáveis de ambiente salvas, você pode usar a função usethis::edit_r_environ():

# Abre as variáveis de ambiente para o usuário do computador
usethis::edit_r_environ(scope = "user")
#> • Modify '/Users/beatrizmilz/.Renviron'
#> • Restart R for changes to take effect

# Abre as variáveis de ambiente para o projeto ativo
usethis::edit_r_environ(scope = "project")
#> ✔ Setting active project to '/Users/beatrizmilz/Documents/GitHub/blog-en'
#> • Modify '.Renviron'
#> • Restart R for changes to take effect

O padrão para armazenar variáveis neste arquivo é:

NOME_VAR='SENHAAQUI12345'

Atenção! Depois de alterar o arquivo .Renviron, é necessário reiniciar o R para que as mudanças sejam consideradas. Isso porque esse arquivo é carregado ao iniciar o R.

Atenção 2: Caso você use um arquivo .Renviron vinculado ao seu projeto .Rproj, cuidado ao subir esse arquivo para o GitHub, é perigoso pois pessoas poderão ver suas senhas. Se o seu repositório for público, é essencial que você adicione ele no .gitignore, assim ele será ignorado pelo Git. A função usethis::use_git_ignore() pode nos ajudar nisso:

usethis::use_git_ignore(".Renviron")
#> ✔ Adding '.Renviron' to '.gitignore'

Solicitar a senha

E quando queremos que a pessoa usuária possa sempre escrever a senha? Existe uma função para isso: rstudioapi::askForPassword(). Podemos inclusive escrever a frase que será mostrada ao perguntar a senha. A senha digitada será retornada como um texto, e podemos salvar em um objeto para utilizar posteriormente no que for necessário.

senha_informada <- rstudioapi::askForPassword(
  "Escreva sua senha por favor!"
)

Pop up feito pela função askForPassword.

GitHub Actions

E quando precisamos usar senhas em códigos rodados com GitHub Actions (GHA)? Se você não conhece nada sobre GHA, eu tenho alguns posts sobre isso!

Quando estamos usando GHA, podemos adicionar senhas na sessão SECRETS do GitHub. Assim ninguém (exceto você, quando cria um SECRETS), verá a senha/credenciais.

Isso fica nas configurações do repositório, e o link usa esse padrão:

https://github.com/SEU-USUARIO/SEU-REPOSITORIO/settings/secrets/actions

Exemplo de um repositório privado meu:

Print screen da página de secrets.

Também é preciso adaptar o código do action para buscar essa variável no Secrets. Exemplo de código:

      - name: Execute Script
        env:
          GITHUB_PAT: ${{ secrets.GITHUB_PAT }}
          NOME_VAR: ${{ secrets.NOME_VAR }}
        run: |
          Rscript "seu_script.R"

Com isso é possível acessar essas variáveis com senha, no script usando a função Sys.getenv('NOME_VAR') que mostrei acima.

Mais camadas de segurança

Para mais camadas de segurança, recomendo a leitura da documentação do pacote httr2, no trecho sobre Secret management. Nesse trecho, além de apresentar a opção utilizando a função usethis::edit_r_environ(), também é apresentado as funções httr2::secret_encrypt() e htt2::secret_decrypt().

Eu ainda não testei essas funções pois o pacote httr2 é bem recente. Segundo o autor do pacote (o Hadley Wickham), com essas funções é possível usar criptografia para lidar com as senhas/tokens.

Conclusão

Esperamos que este post seja interessante para você, e que as suas senhas estejam sempre protegidas! Bons estudos e até a próxima!

Agradecimentos

  • Julio Trecenti, pela leitura prévia e sugestões feitas no texto.

  • Tive a ideia de escrever esse post ao responder uma pergunta feita pela aluna Mari Ribeiro, em um curso da Curso-R. Obrigada Mari!

comments powered by Disqus