TransWikia.com

Como ocultar informações sensíveis no Django?

Stack Overflow em Português Asked by Vinicius Bussola on January 15, 2021

No meu projeto Django tenho algumas variáveis sensíveis, as quais preciso ‘escondê-las’.
No geral, as salvo em um arquivo .env e as leio com
DADO_SENSIVEL = os.environ.get("DADO_SENSIVEL", default="")..

Gostaria de entender qual a diferença entre eu salvar essas variáveis no .env, no .bashrc e no .bash_profile

A resposta depende do uso do Docker? Se sim, qual seria a diferença usando e não usando o docker?

3 Answers

Não entendi completamente a pergunta, por exemplo: não consigo ver o relacionamento do django com o docker nesse contexto, mas vou tentar responder. Se entendi, o que vc quer é ocultar informações sensíveis em um projeto django. Considerando que seja isso vou explicar a minha abordagem (Eu uso linux):

Primeiro eu crio um arquivo do tipo .yaml que pode ser "parseado" pelo pacote PyYAML, nesse arquivo coloco as informaçẽos sensiveis para serem lidas no setttings.py do django, abaixo um exemplo:

db:
    default:
        ENGINE: 'django.db.backends.postgresql_psycopg2'
        NAME: 'nome-banco'
        USER: 'user-name'
        PASSWORD: 'change-me'
        HOST: 'localhost'
        PORT: '5432'
        OPTIONS: {}

email:
    email_host: 'smtp.<config>.com'
    email_port:  587
    email_host_user: 'no_reply@<email.com>'
    email_host_password: '<your_password>'
    use_tls: True

key: sdn2-%Hey-Jude_take-a-sad-song_and_make-it-better 

Veja que nesse arquivo são colocadas as informações sobre o banco de dados, envio de email e a chave para a criação de tokens.

Então escolha um lugar para colocar esse arquivo, por exemplo em /etc/name-app/config.yaml

Crie uma variável de ambiente que aponte para o local onde esse arquivo estará armazenado (no servidor, faço isso no gunicorn), no ambiente de desenvolvimento, no meu caso isso pode ser feito com o comando export:

export VARNAME='/path/to/file' 

Esse comando pode ser colocado no seu arquivo ~/.bashrc, que vc cita.

Então no arquivo settings.py do django, primeiro tento ver se a variável existe no sistema, se sim, carrego o arquivo a partir do caminho que ela aponta e atribuo os valores às variaveis, assim:

CONFIG = os.environ.get('VARNAME')
try:
    with open(CONFIG, 'r') as f:
        settings = yaml.safe_load(f)
except IOError as e:
    print("I/O error({0}): {1}".format(e.errno, e.strerror))
    raise
except:
    print("Erro inesperado", sys.exc_info())
    print("Erro inesperado", sys.exc_info()[0])
    raise

# To send email
EMAIL_HOST = settings['email_host']
EMAIL_PORT = settings['email_port']
EMAIL_HOST_USER = settings['email_host_user']
EMAIL_FROM = settings['email_host_user']
EMAIL_HOST_PASSWORD = settings['email_host_password']
EMAIL_USE_TLS = settings['use_tls']

SECRET_KEY = settings['key']
DATABASES = settings['db']

Essencialmente, é isso, não importa se seu servidor ou ambiente de desenvolvimento está na maquina fisica, em uma máquina virtual ou em um container docker.

Se não estiver claro, diga que tento melhorar a resposta.

Correct answer by Sidon on January 15, 2021

Você pode usar o python-decouple, com ele é possivel inserir os dados no settings.py.. puxando dados de um arquivo externo .env ou .ini na qual você declara strings constantes como no exemplo abaixo:

#nome_do_projeto/setting.py
from decouple import config
DEBUG = config('DEBUG', default=False, cast=bool)#a opção cast declara o tipo.
SECRET_KEY = config('SECRET_KEY')

ao invés de:

DEBUG=TRUE
SECRET_KEY = "sejalqualforakey"

e dentro do arquivo .env:

#raiz_do_projeto/.env:
DEBUG=TRUE
SECRET_KEY=sejalqualforakey

e caso você precise inserir uma lista por exemplo em ALLOWED_HOSTS:

ALLOWED_HOSTS = config('ALLOWED_HOSTS', default=[], cast=Csv())

aqui o cast contem um método Csv que precisa ser importado em:

from decouple import config, Csv

e no .env:

ALLOWED_HOSTS=127.0.0.1, .localhost

Answered by José Augusto on January 15, 2021

Gosto de usar o python decouple pra fazer isso

Tem um tutorial aqui

Answered by Italo Lemos on January 15, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP