]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw/auth: Validate accepted roles on service token user
authorTobias Urdin <tobias.urdin@binero.se>
Wed, 27 Apr 2022 08:47:22 +0000 (08:47 +0000)
committerTobias Urdin <tobias.urdin@binero.se>
Wed, 21 Sep 2022 20:33:29 +0000 (20:33 +0000)
Signed-off-by: Tobias Urdin <tobias.urdin@binero.com>
src/rgw/rgw_auth_keystone.cc

index 88fc62639e617da92b34615716763048ceb54c82..3fe732677d9c78e3044cf7464e74807cfadf706a 100644 (file)
@@ -214,6 +214,14 @@ TokenEngine::authenticate(const DoutPrefixProvider* dpp,
     std::vector<std::string> admin;
   } roles(cct);
 
+  static const struct ServiceTokenRolesCacher {
+    explicit ServiceTokenRolesCacher(CephContext* const cct) {
+      get_str_vec(cct->_conf->rgw_keystone_service_token_accepted_roles, plain);
+    }
+
+    std::vector<std::string> plain;
+  } service_token_roles(cct);
+
   if (! is_applicable(token)) {
     return result_t::deny();
   }
@@ -274,15 +282,25 @@ TokenEngine::authenticate(const DoutPrefixProvider* dpp,
         return result_t::deny(-EPERM);
       }
 
-      /* TODO(tobias-urdin): Verify role on service user with corresponding config option */
+      /* Check for necessary roles for service token. */
+      for (const auto& role : service_token_roles.plain) {
+        if (st->has_role(role) == true) {
+          /* Service token is valid so we allow using an expired token for
+           * this request. */
+          ldpp_dout(dpp, 20) << "allowing expired tokens because service_token_id="
+                         << service_token_id
+                         << " is valid, role: "
+                         << role << dendl;
+          allow_expired = true;
+          token_cache.add(service_token_id, *st);
+          break;
+        }
+      }
 
-      /* Service token is valid so we allow using an expired token for
-       * this request. */
-      ldpp_dout(dpp, 20) << "allowing expired tokens because service_token_id="
-                     << service_token_id
-                     << " is valid" << dendl;
-      allow_expired = true;
-      token_cache.add(service_token_id, *st);
+      if (!allow_expired) {
+        ldpp_dout(dpp, 0) << "service token user does not hold a matching role; required roles: "
+                  << g_conf()->rgw_keystone_service_token_accepted_roles << dendl;
+      }
     }
   }