Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

The authentication with ep_hash_auth does not work #8

Open
ghost opened this issue Sep 1, 2020 · 14 comments
Open

The authentication with ep_hash_auth does not work #8

ghost opened this issue Sep 1, 2020 · 14 comments

Comments

@ghost
Copy link

ghost commented Sep 1, 2020

Hello,
I have following issue, I set up an CentOS Server with nginx, nodejs and etherpad. Everything works fine but I struggle with the configuration of ep_hash auth.

I set it up like GitHub said and I can generate hashes with bcrypt. My Users are stored in /var/etherpad/users/username/.hash the Hash is in the .Hash file and the User who runs etherpad is the owner of that directory. In the Etherpad settings.json I changed the "requireAuthentication to true and made created the Usernames like GitHub said.

What I am doing is, I create the hash for a password create the directory and store the hash in the .hash file. Then I create the User in the etherpad settings.json like

"username": {"is_admin": true, "hash": "b'$2a$10$cyh661 ... Z9vyYFQbDK'"} is it correct to split the hash with dots or should I enter the full hash?

I also added this in my settings.json right under the point "users"

"ep_hash_auth": {
"hash_typ": "sha512",
"hash_dig": "hex",
"hash_dir": "/var/etherpad/users",
"hash_ext": "/.hash",
"hash_adm": false,
"displayname_ext": "/.displayname"
},

It would be really great if somebody could help me or maybe explain how he is working with the ep_hash_auth plugin.

Thank you in advance

@LaKing
Copy link
Contributor

LaKing commented Sep 1, 2020

It should be sufficient to create hash files, and then there is no need to additionally specify them in settings.json. The usual use case is you either specify it as a file or as an entry under the user's username. ...

The ep_hash_auth section of the config is not part of the users section! If placed under users it will assume an user called ep_hash_auth and won't configure the system. This is why your config is not working.

@JohnMcLear
Copy link
Member

Thanks @LaKing for taking time to help / advise. We're promoting ep_hash_auth to all users now on first run so it could be that usage goes up and ergo user issues so thanks for handling them! 👍

@ghost
Copy link
Author

ghost commented Sep 2, 2020

It should be sufficient to create hash files, and then there is no need to additionally specify them in settings.json. The usual use case is you either specify it as a file or as an entry under the user's username. ...

The ep_hash_auth section of the config is not part of the users section! If placed under users it will assume an user called ep_hash_auth and won't configure the system. This is why your config is not working.

Thank you for your answer but it doesn't work either.
Could you explain to me step by step what I have to do?

Could there be an issue with python3? Cause GitHub generates the hashes with python?

@nscomputing
Copy link

Running Etherpad-lite 1.8.4 with ep_hash_auth 3.0.1

I can confirm that user authentication using "ep_hash_auth" doesn't work.

With settins.json with 'ep_hash_auth' configuration, in logs I can see:

[2020-09-16 20:24:33.310] [INFO] console - You can access your Etherpad instance at http://127.0.0.1:9001/
[2020-09-16 20:24:33.310] [WARN] console - Admin username and password not set in settings.json. To access admin please uncomment and edit 'users' in settings.json
[2020-09-16 20:40:08.709] [INFO] console - Error: Failed authentication attempt for admin: no authentication found

When 'ep_hash_auth' is commented out and 'users' configuration is populated with users data in config.json everything is working as expected.

@JohnMcLear
Copy link
Member

I'm gonna try find time to bring ep_hash_auth into the Etherpad tests so we test functionality on commit.

@JohnMcLear
Copy link
Member

@nscomputing for now, try latest develop branch to see if it works

@nscomputing
Copy link

@nscomputing for now, try latest develop branch to see if it works

Thanks for reply.

Will try to find some time tomorrow to try etherpad-lite develop branch.

@nscomputing
Copy link

Just tried the latest etherpad-lite develop branch.

When users blob with hashes is in the settings.json authentication works.
If users hashes are in external files and config for ep_hash_auth is in settings.json I can see in console:

[2020-09-17 18:38:29.208] [WARN] console - Admin username and password not set in settings.json. To access admin please uncomment and edit 'users' in settings.json

and authentication failed.

@all-good-names-were-already-taken
Copy link

all-good-names-were-already-taken commented Nov 9, 2020

I have a similar issue of not understanding how this should be configured correctly.

It should be sufficient to create hash files, and then there is no need to additionally specify them in settings.json. The usual use case is you either specify it as a file or as an entry under the user's username. ...

If I do this I still get the console message about "Admin username and password not set in settings.json".

Also the only way I was able to get the whole thing to even allow me to login was to edit the following line in ep_hash_auth.js:

compareHashes(password, contents, function(hashType) {

to:

compareHashes(password, contents.trim(), function(hashType) {

Because no matter whichever way I tried to add hashes to .hash, they would always appear with a newline when compared, which caused the authentication to fail. I could use truncate -s -1 .hash but then if I had a lot of users, that would get tedious. So, if you could share how you add hashes to .hash that would be most appreciated. I've tried redirection. Copy and pasting. I've gone into vim and assured there were no more than one line but the newline would still appear when compared.

If I try to login as a user and purposely enter the wrong password I see:

[2020-11-09 09:22:09.785] [INFO] http - Failed authentication from IP 192.168.0.101 - no such user

This happens for all users except admin. For admin it either gives 'no such user' or 'incorrect password' I don't know why sometimes it is one and sometimes the other..

I also don't understand how to only allow one user to be admin and the rest not to be. If I set hash_adm to true then everyone is admin and if I set it to false no one is admin. The only way I can think of would be to edit ep_hash_auth.js some more to either check if a user is named admin to change hash_adm to true.

I don't know why I get these issues and others do not. I'm obviously doing something very wrong but I don't know what that is. Thanks for any help that can be provided.

@hawkinsw
Copy link

hawkinsw commented May 6, 2021

I have a similar issue of not understanding how this should be configured correctly.

It should be sufficient to create hash files, and then there is no need to additionally specify them in settings.json. The usual use case is you either specify it as a file or as an entry under the user's username. ...

If I do this I still get the console message about "Admin username and password not set in settings.json".

Also the only way I was able to get the whole thing to even allow me to login was to edit the following line in ep_hash_auth.js:

compareHashes(password, contents, function(hashType) {

to:

compareHashes(password, contents.trim(), function(hashType) {

Because no matter whichever way I tried to add hashes to .hash, they would always appear with a newline when compared, which caused the authentication to fail. I could use truncate -s -1 .hash but then if I had a lot of users, that would get tedious. So, if you could share how you add hashes to .hash that would be most appreciated. I've tried redirection. Copy and pasting. I've gone into vim and assured there were no more than one line but the newline would still appear when compared.

If I try to login as a user and purposely enter the wrong password I see:

[2020-11-09 09:22:09.785] [INFO] http - Failed authentication from IP 192.168.0.101 - no such user

This happens for all users except admin. For admin it either gives 'no such user' or 'incorrect password' I don't know why sometimes it is one and sometimes the other..

I also don't understand how to only allow one user to be admin and the rest not to be. If I set hash_adm to true then everyone is admin and if I set it to false no one is admin. The only way I can think of would be to edit ep_hash_auth.js some more to either check if a user is named admin to change hash_adm to true.

I don't know why I get these issues and others do not. I'm obviously doing something very wrong but I don't know what that is. Thanks for any help that can be provided.

I am getting the exact same issues and going to submit a PR for this right now.

@hawkinsw
Copy link

hawkinsw commented May 6, 2021

I don't know why I get these issues and others do not. I'm obviously doing something very wrong but I don't know what that is. Thanks for any help that can be provided.

I am getting the exact same issues and going to submit a PR for this right now.

I have found the source of the problem. I was doing two (2) different things in order to create the .hash file and both of them were subtly wrong.

  1. Using vi/m
  2. Using echo

vi/m will append try to a newline to the end of the data in the file. You can confirm this by using hexdump to look at the contents of the .hash file: $ hexdump -C .hash will show a 0a at the end, a \n.

echo by default will include a newline at the end of the string that you echo so that echo "hash" > .hash will result in a .hash file with a newline at the end.

The solution is to use the -n flag to echo: echo -n "hash" > .hash.

Let me know if that helps!

Will

@FWDekker
Copy link

Your mistake is that you use sha512 in your configuration, but use a bcrypt hash. The README is somewhat unclear about this, because it does not explain how to change which type of hash to use, but it does show how to generate various hashes, but does not show how to generate a sha512 hash.

At the same time, @hawkinsw is also right that it's important to make sure the .hash file does not have a trailing newline. With nano, you can simply do nano -L .hash to prevent the addition of a trailing newline. (Though to be honest, I think the comparison function should trim the hash file's input.)

@FWDekker
Copy link

FWDekker commented Apr 5, 2022

Even considering the above comments on ensuring that the hash is created on a password without a newline, and matching the configured hash function with the actually-used hash function, I am still experiencing issues with ep_hash_auth.

If I put the hash with the user's settings in settings.json, everything works as intended. However, if I remove the password from settings.json and put the hash in users/florine/.hash, then authentication works in pads but not on the admin page, which only gives me "Forbidden" when I try to access the page. The log states that the login is successful, but the (debug) log states that I am not an admin, even though I have very clearly set is_admin to true in settings.json.

@milnomada
Copy link

I've been following this thread to solve my issues with ep_hash_auth plugin.
Posting a configuration that works:

Having the following configured in settings.json:

"users": {
  "admin": {
    "password": "${ADMIN_PASSWORD:null}",
    "is_admin": true
  }
},

"ep_hash_auth": {
  "hash_typ": "sha512",
  "hash_dig": "hex",
  "hash_dir": "/opt/etherpad-lite/users",
  "hash_ext": "/.hash",
  "hash_adm": false,
  "displayname_ext": "/.displayname"
},

For example, for user gus:

  1. Generate hash using python:

Do not add a trailing .decode() of any form to gensalt method.

python -c 'import bcrypt; print(bcrypt.hashpw(b"password", bcrypt.gensalt(rounds=10, prefix=b"2a")))'

Output:

b'$2a$10$ttmrfYu7414jsKsUPiyOmOW2OXivLfr5ZHAbSOIU8HyjT0j9E/49e'
  1. Copy everything but the starting b character (include the single quotes) and redirect it to ${path}/gus/.hash, where path is configured in the hash_dir option. As mentioned by @hawkinsw, use echo -n to avoid any \n characters to be written into the file but, mind the single quotes here.
echo -n '$2a$10$ttmrfYu7414jsKsUPiyOmOW2OXivLfr5ZHAbSOIU8HyjT0j9E/49e' /opt/etherpad-lite/users/gus/.hash

The important thing about the single quotes is that they do not resolve any character within the string.

If you use double quotes:

echo -n "$2a$10$ttmrfYu7414jsKsUPiyOmOW2OXivLfr5ZHAbSOIU8HyjT0j9E/49e"

the hash gets re-encoded, and the output would look like:

a0/lByWLFeTJJSH4eIZYYcCE15aUlBpAQNA9xQYaa

which alters the hash structure and the auth triggers a Failed authentication from IP error.

As you can see, the user gus is not listed in the users object in settings.json file.
I hope this helps.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants