smolnar82 opened a new pull request #437:
URL: https://github.com/apache/knox/pull/437
## What changes were proposed in this pull request?
Saving the `token.id` claim (aka. tokenId or passcode) in a hashed form in
the database instead of plain text.
## How was this patch tested?
Updated JUnit tests using Derby DB. I also executed the following manual
steps with a Postgres DB configured as the token management backend. During my
tests, I did not declare hashing algorithm in `gateway-site.xml` so that the
default `HmacSha256` was used so I needed to configure an appropriate hashing
key.
0. Configuration:
```
bin/knoxcli.sh create-alias gateway_database_hash_key --value
sPj8FCgQhCEi6G18kBfpswxYSki33plbelGLs0hMSbk
```
1. Fetched a token using our tokengen application
(passcode/token.id=b1e78313-3635-4236-bd77-71886ef9a707)
```
2021-04-20 19:38:11,818 DEBUG knox.gateway
(GatewayFilter.java:doFilter(116)) - Received request: GET
/knoxtoken/api/v1/token
2021-04-20 19:38:11,907 INFO service.knoxtoken
(TokenResource.java:getAuthenticationToken(421)) - Knox Token service
(homepage) issued token eyJhbG...B9Ze9A (b1e78313...71886ef9a707)
2021-04-20 19:38:11,920 DEBUG token.state
(JDBCTokenStateService.java:addToken(82)) - Token b1e78313...71886ef9a707 has
been saved in the database; id = 4448b054-3467-4c29-9468-d4bddfdf5e00
2021-04-20 19:38:11,920 DEBUG token.state
(DefaultTokenStateService.java:addToken(144)) - Added token
b1e78313...71886ef9a707, expiration 2021-04-21T17:38:11.900Z
2021-04-20 19:38:11,927 DEBUG token.state
(JDBCTokenStateService.java:addMetadata(213)) - Updated metadata for
b1e78313...71886ef9a707 in the database
2021-04-20 19:38:11,927 DEBUG service.knoxtoken
(TokenResource.java:getAuthenticationToken(448)) - Knox Token service
(homepage) stored state for token eyJhbG...B9Ze9A (b1e78313...71886ef9a707)
postgres=# select * FROM KNOX_TOKENS;
id | token_id
| issue_time | expiration | max_lifetime | username |
comment
--------------------------------------+---------------------------------------------------------+---------------+---------------+---------------+----------+---------
4448b054-3467-4c29-9468-d4bddfdf5e00 |
[\x1A�\x15�w���\x04f\x7F+�S\x1D��\x06��\x1B�(3�س�\x1F�G | 1618940291911 |
1619026691900 | 1619545091911 | admin |
(1 row)
```
2. Renewed the token
```
$ curl -ku admin:admin-password -d "@token.txt" -X POST
https://localhost:8443/gateway/sandbox/knoxtoken/api/v1/token/renew
{
"renewed": "true",
"expires": "1619026870461"
}
2021-04-20 19:41:10,445 DEBUG knox.gateway
(GatewayFilter.java:doFilter(116)) - Received request: POST
/knoxtoken/api/v1/token/renew
2021-04-20 19:41:10,446 INFO knox.gateway
(KnoxLdapRealm.java:getUserDn(688)) - Computed userDn:
uid=admin,ou=people,dc=hadoop,dc=apache,dc=org using dnTemplate for principal:
admin
2021-04-20 19:41:10,476 DEBUG token.state
(JDBCTokenStateService.java:updateExpiration(135)) - Updated expiration for
b1e78313...71886ef9a707 in the database to 1,619,026,870,461
2021-04-20 19:41:10,477 DEBUG token.state
(DefaultTokenStateService.java:renewToken(219)) - Renewed token
b1e78313...71886ef9a707, expiration 2021-04-21T17:41:10.461Z
2021-04-20 19:41:10,477 INFO service.knoxtoken
(TokenResource.java:renew(282)) - Knox Token service (sandbox) renewed the
expiration for token eyJhbG...B9Ze9A (b1e78313...71886ef9a707) (renewer=admin)
postgres=# select * FROM KNOX_TOKENS;
id | token_id
| issue_time | expiration | max_lifetime | username |
comment
--------------------------------------+---------------------------------------------------------+---------------+---------------+---------------+----------+---------
4448b054-3467-4c29-9468-d4bddfdf5e00 |
[\x1A�\x15�w���\x04f\x7F+�S\x1D��\x06��\x1B�(3�س�\x1F�G | 1618940291911 |
1619026870461 | 1619545091911 | admin |
(1 row)
```
3. Used the token successfully (issued a WEBHDFS list command)
4. Revoked the token
```
$ curl -ku admin:admin-password -d "@token.txt" -X POST
https://localhost:8443/gateway/sandbox/knoxtoken/api/v1/token/revoke
{
"revoked": "true"
}
2021-04-20 19:44:32,405 DEBUG knox.gateway
(GatewayFilter.java:doFilter(116)) - Received request: POST
/knoxtoken/api/v1/token/revoke
2021-04-20 19:44:32,406 INFO knox.gateway
(KnoxLdapRealm.java:getUserDn(688)) - Computed userDn:
uid=admin,ou=people,dc=hadoop,dc=apache,dc=org using dnTemplate for principal:
admin
2021-04-20 19:44:32,440 DEBUG token.state
(DefaultTokenStateService.java:removeTokenState(290)) - Removed state for
tokens b1e78313...71886ef9a707
2021-04-20 19:44:32,440 DEBUG token.state
(JDBCTokenStateService.java:removeToken(186)) - Token b1e78313...71886ef9a707
has been removed from the database
2021-04-20 19:44:32,441 DEBUG token.state
(DefaultTokenStateService.java:revokeToken(244)) - Revoked token
b1e78313...71886ef9a707
2021-04-20 19:44:32,443 INFO service.knoxtoken
(TokenResource.java:revoke(329)) - Knox Token service (sandbox) revoked token
eyJhbG...B9Ze9A (b1e78313...71886ef9a707) (renewer=admin)
postgres=# select * FROM KNOX_TOKENS;
id | token_id | issue_time | expiration | max_lifetime | username | comment
----+----------+------------+------------+--------------+----------+---------
(0 rows)
```
5. Confirmed it cannot be used anymore (repeated step 3.):
```
$ curl -ku Passcode:b1e78313-3635-4236-bd77-71886ef9a707
https://localhost:8443/gateway/tokenbased/webhdfs/v1?op=LISTSTATUS
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>Error 401 Unknown token: b1e78313...71886ef9a707</title>
</head>
<body><h2>HTTP ERROR 401 Unknown token: b1e78313...71886ef9a707</h2>
<table>
<tr><th>URI:</th><td>/gateway/tokenbased/webhdfs/v1</td></tr>
<tr><th>STATUS:</th><td>401</td></tr>
<tr><th>MESSAGE:</th><td>Unknown token: b1e78313...71886ef9a707</td></tr>
<tr><th>SERVLET:</th><td>tokenbased-knox-gateway-servlet</td></tr>
</table>
</body>
</html>
2021-04-20 19:47:02,751 DEBUG knox.gateway
(GatewayFilter.java:doFilter(116)) - Received request: GET /webhdfs/v1
2021-04-20 19:47:02,761 ERROR token.state
(DefaultTokenStateService.java:validateToken(321)) - Unknown token
b1e78313...71886ef9a707
2021-04-20 19:47:02,772 ERROR token.state
(DefaultTokenStateService.java:validateToken(321)) - Unknown token
b1e78313...71886ef9a707
2021-04-20 19:47:02,772 WARN federation.jwt
(AbstractJWTFilter.java:validateToken(404)) - Unable to verify token
expiration:
org.apache.knox.gateway.services.security.token.UnknownTokenException: Unknown
token: b1e78313...71886ef9a707
org.apache.knox.gateway.services.security.token.UnknownTokenException:
Unknown token: b1e78313...71886ef9a707
at
org.apache.knox.gateway.services.token.impl.DefaultTokenStateService.validateToken(DefaultTokenStateService.java:322)
at
org.apache.knox.gateway.services.token.impl.JDBCTokenStateService.getTokenExpiration(JDBCTokenStateService.java:110)
at
org.apache.knox.gateway.services.token.impl.DefaultTokenStateService.getTokenExpiration(DefaultTokenStateService.java:175)
at
org.apache.knox.gateway.provider.federation.jwt.filter.AbstractJWTFilter.getServerManagedStateExpiration(AbstractJWTFilter.java:197)
at
org.apache.knox.gateway.provider.federation.jwt.filter.AbstractJWTFilter.tokenIsStillValid(AbstractJWTFilter.java:190)
at
org.apache.knox.gateway.provider.federation.jwt.filter.AbstractJWTFilter.validateToken(AbstractJWTFilter.java:391)
at
org.apache.knox.gateway.provider.federation.jwt.filter.JWTFederationFilter.doFilter(JWTFederationFilter.java:121)
```
--
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.
For queries about this service, please contact Infrastructure at:
[email protected]