Hi Nick,

right – we need to differentiate between passwords for user authentication (and 
potentially pass-thru) and passwords part of connection configuration. 
Passwords in connection configuration must be decryptable, but as the key is 
also some configuration you can argue whether the encryption adds security.

But why are user passwords encrypted rather than using a one-way-function?

Actually I am not affected at all as I am using my own extension with zero 
persistence.

Best Regards, Joachim

 

Von: Nick Couchman <vn...@apache.org> 
Gesendet: Friday, 17 July 2020 17:27
An: user@guacamole.apache.org
Betreff: Re: securing connection passwords

 

 

 

On Fri, Jul 17, 2020 at 11:09 AM Joachim Lindenberg <joac...@lindenberg.one 
<mailto:joac...@lindenberg.one> > wrote:

>Guacamole need to know the password at connection time (in clear-text)
True.
> Even if the password is encrypted in the DB, it must be decryptable...
False (in general)
The user needs to enter the password anyway, thus it can be used to validate 
against salted/hashed/whatever version of password in database while also 
passing it in clear text to guacd (e.g. as password for RDP connection).
You only need to have a decryptable version if you use some other 
authentication (e.g. certificates) and need the clear text password to 
establish the connection.
Best Regards,
Joachim

 

We need to be clear about which passwords we're talking about, here.  For user 
accounts stored in the database so that users can log in to Guacamole, the 
passwords are already AES256 encrypted and salted.  You can see this if you 
look at the database.

 

For password for specific connections, they are stored in plain-text, and they 
absolutely do need to be decrypt-able - these passwords will not always match 
the user who is logging in, the user won't always know the passwords for the 
connections, and they won't necessarily be entering them directly when making a 
connection.  Thus, they do have to be stored in some format which can be 
reversed into the plain-text password that can be sent along to the remote 
connection.  Encrypting these within the database itself does not make a lot of 
sense, unless you somehow tie that encryption to something that only a user 
logging in has (the user password, a certificate, etc.).  However, if you do 
that, you have to come up with a way to manage that encryption over time - that 
is, if the user changes their password, you have to be able to rotate that 
encryption to match the new password.  Also, you run into issues if multiple 
users are going to be sharing a connection, because the password then has to 
either be stored with an encryption key that can be shared, or has to be stored 
multiple times for each user...

 

...which brings us to the real solution, which is support for credential 
vaults.  Mike has already started working on this - there's a pull request out 
there to support the Azure Key Vault - and that should be able to extend to 
other similar credential vaults in a way that allows these types of services to 
be leveraged.  Whether it's an external server or implementing some sort of 
internal credential storage, this, combined with the Prompt support that is on 
the way, are really the ways to deal with storing and accessing connection 
passwords, and not a sort of make-shift solution that would store the passwords 
with completely reversible encryption or hashing within the database.

 

-Nick

Reply via email to