Proteger com senha um serviço da Web (baseado em frascos) sem alterar seu código

0

Estou usando a interface de usuário da web de terceiros do beancount, fava. Basicamente, isso significa que eu executo um serviço da Web em uma determinada porta. Não há autenticação ou segurança para esse serviço da web. Caso seja importante, o fava usa python e flask.

Desejo acessar esse serviço da web pela Internet, e o encaminhamento de porta da porta apropriada no meu roteador permite que eu faça isso facilmente. No entanto, qualquer pessoa que conheça a porta poderá acessar esse serviço (ou seja, minha única segurança é a obscuridade de um número de porta alto).

Como posso proteger o serviço com senha, no mínimo? Melhor ainda, posso limitar o acesso ao serviço a determinados dispositivos (não a endereços IP), como o meu próprio smartphone (e o da minha esposa)?

Eu considerei o uso de tunelamento ssh em nossos telefones, mas isso provavelmente seria muito complexo / problemático para minha esposa usar. Idealmente, gostaria que ela apenas clicasse em um marcador em seu navegador para acessar o site (talvez com uma verificação de senha ao longo do caminho), em vez de precisar carregar o connectbot e clicar em conectar.

    
por Ng Oon-Ee 24.12.2016 / 01:34

1 resposta

1

Eu também precisava aplicar proteção mínima à fava. O que eu fiz foi para servir fava sobre FastCGI em vez de seu servidor http embutido. Aqui está um wrapper muito minimalista:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

def main():
    try:
        # In case you're running Python 2.x:  (untested with fava)
        from flup.server.fcgi import WSGIServer
    except ImportError:
        # For Python 3.x:
        from flipflop import WSGIServer

    from fava.application import app, load_file

    app.config['BEANCOUNT_FILES'] = ['/path/to/your/ledger.beancount',]
    load_file()
    WSGIServer(app).run()

if __name__ == '__main__':
    import sys as _sys
    _sys.exit(main())

Você certamente precisará do flipflop para o Python 3.x ou flup para o Python 2.x.

Para fazer com que o Apache carregue isso, você tem muitas opções. Aqui está 2:

  1. Salve o arquivo como "fava.fcgi", torne-o executável pelo ID do usuário do Apache e configure o Apache para servir arquivos .fcgi. Eu não fiz isso, porque eu não gosto que a extensão .fcgi esteja presente em meus URLs, e eu não queria me incomodar com regras de reescrita complicadas (IMHO).
  2. Minha abordagem mais simples: Salve o arquivo como "fava", torne-o executável pelo Apache e adicione essas linhas a um .htaccess para outro arquivo de configuração do servidor:

    <Files fava>
        # Use this with Debian package libapache2-mod-fastcgi
        SetHandler fastcgi-script
        # Or this with Debian package libapache2-mod-fcgid
        #SetHandler fcgid-script
    </Files>
    

Pode ser necessário executar a2enmod fastcgi ou a2enmod fcgid dependendo de qual módulo do Apache FastCGI você decidir usar.

E o mais importante, defina algum tipo de mecanismo de senha e você provavelmente precisará de SSL. Por exemplo: (pode haver uma maneira mais elegante de combinar essa seção Directory com a seção Files acima ...)

# Set this to whatever directory contains fava:
<Directory /path/to/dir/containing/fava/>
    Options +ExecCGI
    SSLOptions +StrictRequire
    SSLRequireSSL
    AuthType Basic
    AuthName "Mr. Coffee"
    AuthBasicProvider file
    AuthUserFile /etc/apache2/htpasswd.whatever
    Require valid-user
</Directory>

Notas finais: Em vez de FastCGI, outros mecanismos podem funcionar também, como WSGI , mas você precisará alterar (ou simplificar?) o meu script wrapper.

    
por 14.02.2017 / 21:07