itbane opened a new issue, #12995:
URL: https://github.com/apache/apisix/issues/12995

   ### Description
   
   As a User, I want to store basic auth credentials in a hashed way, to not 
leak credentials to other admin users.
   
   Hi, we are manaiging APISIX with a team of people using the apisix-dashboard.
   
   There is a different set of users that have authenticated access to some 
APIs exposed via APISIX (not the admin API). We use consumers and a combination 
of `basic-auth` and `restrict-consumers`-plugins to restrict access. We have 
noticed, that all basic-auth credentials of consumers are stored in a readable 
format for admins (i.e. if you go to `consumers` -> `<consumer>` -> 
`credentials` -> `<basic-auth-credential>`, you can see the plain password for 
this user.
   
   This allows for trivial impersonation of people and API access for admin 
users. Thus, I would like to see at least the option to store `basic-auth` 
passwords in a hashed way. Sane defaults would be to use SHA512 or bcrypt 
(depending on which algorithms are supported by lua), with a defined salt, e.g. 
SHA512(USERNAME.PASSWORD).
   
   The same is true for `key-auth` API keys.
   
   I am open to help with both code fragments, testing and QA, although I am 
not very familiar with lua.
   
   The schema for configuration would be something like:
   
   ~~~json
   # user config
   {
     "username": "testuser",
     "plugins": {
       "basic-auth": {
          "username": "my-basic-credential",  # existing
          "password": "my-password",            # existing
          "hashed_password": "<hash>",        # mutually exclusive to password, 
allows outside hashing     
          "hash": "sha512"                               # sane default, 
future-proofing if algorithm needs to be changed
       }
     }
   }
   ~~~
   
   Regarding implementation, there need to be 2 sections:
     - saving new credentials - didn't find that in a quick search. There needs 
to be some logic for differentation between `password`and `hashed_password` 
parameter
     - checking the credentials (pseudocode, `plugins/basic-auth.lua:151`)
   
   ~~~lua
   # snippet of basic-auth.lua
   # import library
   local hash = require("lua-hash")
   
   ...
   
   # within find_consumer(ctx), before line 151
      if cur_consumer.auth_conf.hash != "" then
        local password_to_check = hash.oneshot(cur_consumer.auth_conf.hash, 
username .. password)
      else
        local password_to_check = password
      fi
      if cur_consumer.auth_conf.password ~= password_to_check then
   ~~~
   
   Please let me know what you think of the idea. Let me know if you need any 
more information; as I said, I can contribute code as well, but I will need 
some pointers in regards to boilerplate (requirements, tests, ...) that need to 
be implented.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to