string condition = "aws:userid";
string value = role.id + ":" + role_session_name;
s->env.emplace(condition, value);
+
+ s->token_claims.emplace_back("sts");
+ for (auto& it : token_claims) {
+ s->token_claims.emplace_back(it);
+ }
}
rgw::auth::Engine::result_t
const rgw_user user_id;
string token_policy;
string role_session_name;
+ std::vector<string> token_claims;
public:
const Role& role,
const rgw_user& user_id,
const string& token_policy,
- const string& role_session_name)
+ const string& role_session_name,
+ const std::vector<string>& token_claims)
: role(role),
user_id(user_id),
token_policy(token_policy),
- role_session_name(role_session_name) {}
+ role_session_name(role_session_name),
+ token_claims(token_claims) {}
uint32_t get_perms_from_aclspec(const DoutPrefixProvider* dpp, const aclspec_t& aclspec) const override {
return 0;
const rgw::auth::RoleApplier::Role& role_name,
const rgw_user& user_id,
const std::string& token_policy,
- const std::string& role_session) const = 0;
+ const std::string& role_session,
+ const std::vector<string>& token_claims) const = 0;
};
};
const rgw::auth::RoleApplier::Role& role,
const rgw_user& user_id,
const std::string& token_policy,
- const std::string& role_session_name) const override {
+ const std::string& role_session_name,
+ const std::vector<string>& token_claims) const override {
auto apl = rgw::auth::add_sysreq(cct, ctl, s,
- rgw::auth::RoleApplier(cct, role, user_id, token_policy, role_session_name));
+ rgw::auth::RoleApplier(cct, role, user_id, token_policy, role_session_name, token_claims));
return aplptr_t(new decltype(apl)(std::move(apl)));
}
/// optional coroutine context
optional_yield yield{null_yield};
+ //token claims from STS token for ops log (can be used for Keystone token also)
+ std::vector<string> token_claims;
+
req_state(CephContext* _cct, RGWEnv* e, rgw::sal::RGWUser* u, uint64_t id);
~req_state();
formatter->close_section();
}
formatter->dump_string("trans_id", entry.trans_id);
+ if (entry.token_claims.size() > 0) {
+ if (entry.token_claims[0] == "sts") {
+ formatter->open_object_section("sts_token_claims");
+ for (const auto& iter: entry.token_claims) {
+ auto pos = iter.find(":");
+ if (pos != string::npos) {
+ formatter->dump_string(iter.substr(0, pos), iter.substr(pos + 1));
+ }
+ }
+ formatter->close_section();
+ }
+ }
+
formatter->close_section();
}
entry.op = op_name;
+ if (! s->token_claims.empty()) {
+ entry.token_claims = std::move(s->token_claims);
+ }
+
/* custom header logging */
if (rest) {
if (rest->log_x_headers()) {
string bucket_id;
headers_map x_headers;
string trans_id;
+ std::vector<string> token_claims;
void encode(bufferlist &bl) const {
- ENCODE_START(10, 5, bl);
+ ENCODE_START(11, 5, bl);
encode(object_owner.id, bl);
encode(bucket_owner.id, bl);
encode(bucket, bl);
encode(bucket_owner, bl);
encode(x_headers, bl);
encode(trans_id, bl);
+ encode(token_claims, bl);
ENCODE_FINISH(bl);
}
void decode(bufferlist::const_iterator &p) {
- DECODE_START_LEGACY_COMPAT_LEN(10, 5, 5, p);
+ DECODE_START_LEGACY_COMPAT_LEN(11, 5, 5, p);
decode(object_owner.id, p);
if (struct_v > 3)
decode(bucket_owner.id, p);
if (struct_v >= 10) {
decode(trans_id, p);
}
+ if (struct_v >= 11) {
+ decode(token_claims, p);
+ }
DECODE_FINISH(p);
}
void dump(ceph::Formatter *f) const;
get_creds_info(token));
return result_t::grant(std::move(apl), completer_factory(boost::none));
} else if (token.acct_type == TYPE_ROLE) {
- auto apl = role_apl_factory->create_apl_role(cct, s, r, user_id, token.policy, token.role_session);
+ auto apl = role_apl_factory->create_apl_role(cct, s, r, user_id, token.policy, token.role_session, token.token_claims);
return result_t::grant(std::move(apl), completer_factory(token.secret_access_key));
} else { // This is for all local users of type TYPE_RGW or TYPE_NONE
string subuser;
const boost::optional<string>& policy,
const boost::optional<string>& roleId,
const boost::optional<string>& role_session,
+ const boost::optional<std::vector<string>> token_claims,
boost::optional<rgw_user> user,
rgw::auth::Identity* identity)
{
token.user = u;
}
+ if (token_claims) {
+ token.token_claims = std::move(*token_claims);
+ }
+
if (identity) {
token.acct_name = identity->get_acct_name();
token.perm_mask = identity->get_perm_mask();
{
AssumeRoleWithWebIdentityResponse response;
response.assumeRoleResp.packedPolicySize = 0;
+ std::vector<string> token_claims;
if (req.getProviderId().empty()) {
response.providerId = req.getIss();
response.aud = req.getAud();
response.sub = req.getSub();
+ token_claims.emplace_back(string("iss") + ":" + req.getIss());
+ token_claims.emplace_back(string("aud") + ":" + req.getAud());
+ token_claims.emplace_back(string("sub") + ":" + req.getSub());
+
//Get the role info which is being assumed
boost::optional<rgw::ARN> r_arn = rgw::ARN::parse(req.getRoleARN());
if (r_arn == boost::none) {
response.assumeRoleResp.retCode = response.assumeRoleResp.creds.generateCredentials(cct, req.getDuration(),
req.getPolicy(), roleId,
req.getRoleSessionName(),
+ token_claims,
user_id, nullptr);
if (response.assumeRoleResp.retCode < 0) {
return response;
response.retCode = response.creds.generateCredentials(cct, req.getDuration(),
req.getPolicy(), roleId,
req.getRoleSessionName(),
+ boost::none,
user_id, nullptr);
if (response.retCode < 0) {
return response;
boost::none,
boost::none,
boost::none,
+ boost::none,
user_id,
identity); ret < 0) {
return make_tuple(ret, cred);
bool is_admin;
uint32_t acct_type;
string role_session;
+ std::vector<string> token_claims;
SessionToken() {}
void encode(bufferlist& bl) const {
- ENCODE_START(2, 1, bl);
+ ENCODE_START(3, 1, bl);
encode(access_key_id, bl);
encode(secret_access_key, bl);
encode(expiration, bl);
encode(is_admin, bl);
encode(acct_type, bl);
encode(role_session, bl);
+ encode(token_claims, bl);
ENCODE_FINISH(bl);
}
void decode(bufferlist::const_iterator& bl) {
- DECODE_START(2, bl);
+ DECODE_START(3, bl);
decode(access_key_id, bl);
decode(secret_access_key, bl);
decode(expiration, bl);
if (struct_v >= 2) {
decode(role_session, bl);
}
+ if (struct_v >= 3) {
+ decode(token_claims, bl);
+ }
DECODE_FINISH(bl);
}
};
const boost::optional<string>& policy,
const boost::optional<string>& roleId,
const boost::optional<string>& role_session,
+ const boost::optional<std::vector<string> > token_claims,
boost::optional<rgw_user> user,
rgw::auth::Identity* identity);
const string& getAccessKeyId() const { return accessKeyId; }