apache2 dbd autorização sem autenticação

2

Eu gostaria de autorizar os usuários apenas pelo nome de usuário, ignorando as senhas. Nome de usuário é um ID de licença. Se você tiver, você pode acessar o site caso contrário não.

O sistema funciona agora no Apache 2.2 com mod_auth_mysql configurando AuthMySQLNoPasswd On .

Agora estou tentando atualizar para o Apache 2.4 e usar mod_authz_dbd . Eu não quero fazer nenhuma autenticação dbd , então eu pensei em usar mod_authn_anon para autenticar qualquer usuário e então fazer autorização com dbd . Aqui está a configuração:

AuthType basic
AuthName "Please use license ID as user name, password is irrelevant"
AuthBasicProvider anon
Anonymous_NoUserID on

# "authorized" is the name of an imaginary group that is returned by AuthzDBDQuery
# when username matches license ID in the database
Require dbd-group authorized
AuthzDBDQuery "select 'authorized' from user_info where user_name = %s"

E aqui está a parte relevante do log:

mod_authz_core.c(809): AH01626: authorization result of Require dbd-group authorized: denied (no authenticated user yet)
mod_authz_core.c(809): AH01626: authorization result of <RequireAny>: denied (no authenticated user yet)
auth_basic:error] AH01618: user id not found: /protected/

Parece que anon não autentica os usuários para serem disponibilizados para a autorização dbd .

Eu sei sobre mod_wsgi , mas gostaria de uma solução com módulos padrão do apache2. Eu não quero instalar o Python.

    
por andi 10.01.2017 / 14:30

2 respostas

2

AFAIK esta funcionalidade simplesmente não está disponível nos módulos padrão atuais.

Então, se você não quiser instalar o python, provavelmente terá que alterar o código um pouco.

Se você quiser autenticar usuários apenas pelo nome de usuário, você pode fazê-lo editando mod_authn_dbd.c.

Este arquivo é avaialable na conta do Apache Github e aqui está o link para ele: mod_authn_dbd.c .

Deve haver as linhas 183-187 destacadas:

    rv = apr_password_validate(password, dbd_password);

    if (rv != APR_SUCCESS) {
      return AUTH_DENIED;
    }

Você desejará comentar / excluir todos eles. Permitindo que você use QUALQUER senha (incluindo deixar a caixa em branco) para autenticação.

Então, depois de salvar e aplicar as alterações no arquivo. Você precisará compilá-lo.

Isso é feito usando o comando: apxs2 no unix.

    sudo apxs2 -iac mod_authn_dbd.c

Ele irá compilar e automaticamente ativá-lo depois.

Se você está tendo problemas para executar este comando, provavelmente você está perdendo o httpd-devel (centos) ou o apache2-dev (ubuntu).

Agora, no seu arquivo de configuração, exclua:

   AuthBasicProvider anon
   Anonymous_NoUserID on

adicione:

AuthBasicProvider dbd
Require valid-user

 # mod_authn_dbd SQL query to authenticate a user
 AuthDBDUserPWQuery "select user_name from user_info where user_name = %s"

Assim, a configuração que você postou acima deve ficar assim:

AuthType basic
AuthName "Please use license ID as user name, password is irrelevant"
AuthBasicProvider dbd
Require valid-user 

# mod_authn_dbd SQL query to authenticate a user
 AuthDBDUserPWQuery "select user_name from user_info where user_name = %s"

# "authorized" is the name of an imaginary group that is returned by AuthzDBDQuery
# when username matches license ID in the database 
Require dbd-group authorized
AuthzDBDQuery "select 'authorized' from user_info where user_name = %s"

Você poderá autenticar seu usuário apenas com o número de licença dele e fazer o que for necessário com o authz.

No entanto, eu realmente espero que haja outra solução menos complicada e mais conveniente.

Tenha em mente que, ao fazer isso, se você precisar deste módulo para funcionar corretamente, você terá outro, ou o mesmo problema para resolver, mais uma vez.

Boa sorte!

    
por 13.01.2017 / 23:03
1

Eu diria que você também precisa de algo nesse sentido:

AuthDBDUserPWQuery "SELECT '' FROM authn WHERE user = %s AND login = 'true'"

Require dbd-login
AuthzDBDQuery "UPDATE authn SET login = 'true' WHERE user = %s"
    
por 13.01.2017 / 23:05