On October 22, 2019 1:41 pm, Tim Marx wrote:
> Joining a little late into this, but I would vote for an option where we 
> inform the client that this endpoint needs some sort of re-authentication to 
> be accessible, similar to what Thomas already proposed. I discussed this a 
> little bit with Thomas (off-list), but for me the only remaining difference 
> between the api token and the ticket is the fixed expiration, which brings up 
> why we would need both internally, but we didn't find a consent on this for 
> now and as it does not add any immediate value I just mentioned it here for 
> documenting purpose. During our discussion we came up with the idea to inform 
> the user e.g. via mail when a certain action like a ticket creation is 
> performed to mitigate scenarios where a malicious app asks a user for their 
> password (e.g. because the endpoint needs more than a token) and uses it to 
> generate a ticket in the background with all the user privileges while the 
> user still thinks the app has only the restricted subset from the actual api 
> token.

what we tell the client is a bit orthogonal to how we decide that we 
want to tell the client something ;) but yes, having a schema property 
makes it easy to get unified handling without much extra overhead, 
compared to manually checking and raising a specific exception/...

tickets and tokens have a bit different properties..

tickets:
- generated at specific time
- valid for a fixed, short period starting at generation
- verifiable as www-data (RSA signature check only needs public key)
- renewable
- stored client-side only, no state on server
- stored/transferred (by default) in/via cookie, thus susceptible to CSRF
- intended usage: interactive sessions, like our GUI
- no revocation possible without invalidating all tickets for the whole cluster

API tokens:
- creation time irrevelant
- valid for long period (optional expiration timestamp!)
- verifiable as root only (access to token shadow file[1])
- not renewable using just token (as long as token API is marked notoken)
- stored client-side and server-side, with full state on server
- transferred via header, storage up to client (no CSRF)
- intended usage: non-interactive API clients, integration into 
  devops/CI/...
- revocation of individual tokens

I'd keep it simple for API tokens 'v1'. we don't need to throw out 
tickets altogether just because we have tokens now - they serve 
different purposes. for those usage scenarios that I have in mind, it's 
perfectly fine to be limited to almost all actions instead of all 
actions.

API methods that are marked notoken are like that for a reason. e.g., 
it's perfectly okay to require a regular, full user to login and 
configure a token before you paste that token into your ansible vault or 
wherever ;) that's a one-time setup step, and not something that you 
need on an on-going basis. if we ever have demand for managing users or 
tokens while authenticated with a token, we can introduce a privilege 
for that and adapt the 'notoken' check to honor it.

I am not sure what you mean by "need both internally" - we pass it along 
when proxying requests, but currently we don't use the token internally 
anywhere ;) I can see some future use-cases (but those depend on other 
functionality that is not yet there) where we could benefit from tokens 
for cross-cluster communication, but the current stuff (cluster join) is 
a one-off thing that is perfectly fine with interactive login/ticket. 

maybe you could expand a bit what you discussed? notifications on ticket 
creation would only be possible for 'new' tickets (those created with 
user+password, not with an existing ticket), and that does not really 
solve the issue at hand I guess.

1: but see comment on patch regarding how to make this usable for 
regular pveproxy as well

>> Thomas Lamprecht <t.lampre...@proxmox.com> hat am 17. Oktober 2019 17:21 
>> geschrieben:
>> 
>>  
>> On 10/17/19 4:59 PM, Fabian Grünbichler wrote:
>> > sure - I don't care about the name at all, and a positively-named option 
>> > with a default of 1 is also okay :)
>> > 
>> > I am not sure whether we even really need such a schema option - we 
>> > could also just have a helper in PVE::RPCEnvironment or 
>> > PVE::AccessControl and call that directly at the start of the API 
>> > methods. in the end, it probably comes down to how many such API methods 
>> > there are.
>> 
>> I'd rather have it encoded in the schema, so API docs are annotated,
>> also the schematic way to define such things is nicer, if possible.
>> 
>> Only issue would be if we have to guard API endpoints depending on
>> the parameters or their value, but we could naturally still have both
>> like now with the permission checks.
>> 
>> 
>> _______________________________________________
>> pve-devel mailing list
>> pve-devel@pve.proxmox.com
>> https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
> 

_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to