]> git.proxmox.com Git - ceph.git/blame - ceph/src/rgw/rgw_sts.h
import 15.2.0 Octopus source
[ceph.git] / ceph / src / rgw / rgw_sts.h
CommitLineData
11fdf7f2 1// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
9f95a23c 2// vim: ts=8 sw=2 smarttab ft=cpp
11fdf7f2
TL
3
4#ifndef CEPH_RGW_STS_H
5#define CEPH_RGW_STS_H
6
7#include "rgw_role.h"
8#include "rgw_auth.h"
9#include "rgw_web_idp.h"
10
11namespace STS {
12
13class AssumeRoleRequestBase {
14protected:
15 static constexpr uint64_t MIN_POLICY_SIZE = 1;
16 static constexpr uint64_t MAX_POLICY_SIZE = 2048;
17 static constexpr uint64_t DEFAULT_DURATION_IN_SECS = 3600;
18 static constexpr uint64_t MIN_DURATION_IN_SECS = 900;
19 static constexpr uint64_t MIN_ROLE_ARN_SIZE = 2;
20 static constexpr uint64_t MAX_ROLE_ARN_SIZE = 2048;
21 static constexpr uint64_t MIN_ROLE_SESSION_SIZE = 2;
22 static constexpr uint64_t MAX_ROLE_SESSION_SIZE = 64;
23 uint64_t MAX_DURATION_IN_SECS;
24 uint64_t duration;
9f95a23c 25 string err_msg;
11fdf7f2
TL
26 string iamPolicy;
27 string roleArn;
28 string roleSessionName;
29public:
30 AssumeRoleRequestBase(const string& duration,
31 const string& iamPolicy,
32 const string& roleArn,
33 const string& roleSessionName);
34 const string& getRoleARN() const { return roleArn; }
35 const string& getRoleSessionName() const { return roleSessionName; }
36 const string& getPolicy() const {return iamPolicy; }
37 static const uint64_t& getMaxPolicySize() { return MAX_POLICY_SIZE; }
38 void setMaxDuration(const uint64_t& maxDuration) { MAX_DURATION_IN_SECS = maxDuration; }
39 const uint64_t& getDuration() const { return duration; }
40 int validate_input() const;
41};
42
43class AssumeRoleWithWebIdentityRequest : public AssumeRoleRequestBase {
44 static constexpr uint64_t MIN_PROVIDER_ID_LEN = 4;
45 static constexpr uint64_t MAX_PROVIDER_ID_LEN = 2048;
46 string providerId;
47 string iamPolicy;
48 string iss;
49 string sub;
50 string aud;
51public:
52 AssumeRoleWithWebIdentityRequest( const string& duration,
53 const string& providerId,
54 const string& iamPolicy,
55 const string& roleArn,
56 const string& roleSessionName,
57 const string& iss,
58 const string& sub,
59 const string& aud)
60 : AssumeRoleRequestBase(duration, iamPolicy, roleArn, roleSessionName),
61 providerId(providerId), iss(iss), sub(sub), aud(aud) {}
62 const string& getProviderId() const { return providerId; }
63 const string& getIss() const { return iss; }
64 const string& getAud() const { return aud; }
65 const string& getSub() const { return sub; }
66 int validate_input() const;
67};
68
69class AssumeRoleRequest : public AssumeRoleRequestBase {
70 static constexpr uint64_t MIN_EXTERNAL_ID_LEN = 2;
71 static constexpr uint64_t MAX_EXTERNAL_ID_LEN = 1224;
72 static constexpr uint64_t MIN_SERIAL_NUMBER_SIZE = 9;
73 static constexpr uint64_t MAX_SERIAL_NUMBER_SIZE = 256;
74 static constexpr uint64_t TOKEN_CODE_SIZE = 6;
75 string externalId;
76 string serialNumber;
77 string tokenCode;
78public:
79 AssumeRoleRequest(const string& duration,
80 const string& externalId,
81 const string& iamPolicy,
82 const string& roleArn,
83 const string& roleSessionName,
84 const string& serialNumber,
85 const string& tokenCode)
86 : AssumeRoleRequestBase(duration, iamPolicy, roleArn, roleSessionName),
87 externalId(externalId), serialNumber(serialNumber), tokenCode(tokenCode){}
88 int validate_input() const;
89};
90
91class GetSessionTokenRequest {
92protected:
93 static constexpr uint64_t MIN_DURATION_IN_SECS = 900;
94 static constexpr uint64_t DEFAULT_DURATION_IN_SECS = 3600;
95 uint64_t duration;
96 string serialNumber;
97 string tokenCode;
98
99public:
100 GetSessionTokenRequest(const string& duration, const string& serialNumber, const string& tokenCode);
101
102 const uint64_t& getDuration() const { return duration; }
103 static const uint64_t& getMinDuration() { return MIN_DURATION_IN_SECS; }
104};
105
106class AssumedRoleUser {
107 string arn;
108 string assumeRoleId;
109public:
110 int generateAssumedRoleUser( CephContext* cct,
9f95a23c 111 rgw::sal::RGWRadosStore *store,
11fdf7f2 112 const string& roleId,
eafe8130 113 const rgw::ARN& roleArn,
11fdf7f2
TL
114 const string& roleSessionName);
115 const string& getARN() const { return arn; }
116 const string& getAssumeRoleId() const { return assumeRoleId; }
117 void dump(Formatter *f) const;
118};
119
120struct SessionToken {
121 string access_key_id;
122 string secret_access_key;
123 string expiration;
124 string policy;
125 string roleId;
126 rgw_user user;
127 string acct_name;
128 uint32_t perm_mask;
129 bool is_admin;
130 uint32_t acct_type;
131
132 SessionToken() {}
133
134 void encode(bufferlist& bl) const {
135 ENCODE_START(1, 1, bl);
136 encode(access_key_id, bl);
137 encode(secret_access_key, bl);
138 encode(expiration, bl);
139 encode(policy, bl);
140 encode(roleId, bl);
141 encode(user, bl);
142 encode(acct_name, bl);
143 encode(perm_mask, bl);
144 encode(is_admin, bl);
145 encode(acct_type, bl);
146 ENCODE_FINISH(bl);
147 }
148
149 void decode(bufferlist::const_iterator& bl) {
150 DECODE_START(1, bl);
151 decode(access_key_id, bl);
152 decode(secret_access_key, bl);
153 decode(expiration, bl);
154 decode(policy, bl);
155 decode(roleId, bl);
156 decode(user, bl);
157 decode(acct_name, bl);
158 decode(perm_mask, bl);
159 decode(is_admin, bl);
160 decode(acct_type, bl);
161 DECODE_FINISH(bl);
162 }
163};
164WRITE_CLASS_ENCODER(SessionToken)
165
166class Credentials {
167 static constexpr int MAX_ACCESS_KEY_LEN = 20;
168 static constexpr int MAX_SECRET_KEY_LEN = 40;
169 string accessKeyId;
170 string expiration;
171 string secretAccessKey;
172 string sessionToken;
173public:
174 int generateCredentials(CephContext* cct,
175 const uint64_t& duration,
176 const boost::optional<string>& policy,
177 const boost::optional<string>& roleId,
178 boost::optional<rgw_user> user,
179 rgw::auth::Identity* identity);
180 const string& getAccessKeyId() const { return accessKeyId; }
181 const string& getExpiration() const { return expiration; }
182 const string& getSecretAccessKey() const { return secretAccessKey; }
183 const string& getSessionToken() const { return sessionToken; }
184 void dump(Formatter *f) const;
185};
186
187struct AssumeRoleResponse {
188 int retCode;
189 AssumedRoleUser user;
190 Credentials creds;
191 uint64_t packedPolicySize;
192};
193
194struct AssumeRoleWithWebIdentityResponse {
195 AssumeRoleResponse assumeRoleResp;
196 string aud;
197 string providerId;
198 string sub;
199};
200
201using AssumeRoleResponse = struct AssumeRoleResponse ;
202using GetSessionTokenResponse = std::tuple<int, Credentials>;
203using AssumeRoleWithWebIdentityResponse = struct AssumeRoleWithWebIdentityResponse;
204
205class STSService {
206 CephContext* cct;
9f95a23c 207 rgw::sal::RGWRadosStore *store;
11fdf7f2
TL
208 rgw_user user_id;
209 RGWRole role;
210 rgw::auth::Identity* identity;
211 int storeARN(string& arn);
212public:
213 STSService() = default;
9f95a23c 214 STSService(CephContext* cct, rgw::sal::RGWRadosStore *store, rgw_user user_id, rgw::auth::Identity* identity) : cct(cct), store(store), user_id(user_id), identity(identity) {}
11fdf7f2
TL
215 std::tuple<int, RGWRole> getRoleInfo(const string& arn);
216 AssumeRoleResponse assumeRole(AssumeRoleRequest& req);
217 GetSessionTokenResponse getSessionToken(GetSessionTokenRequest& req);
218 AssumeRoleWithWebIdentityResponse assumeRoleWithWebIdentity(AssumeRoleWithWebIdentityRequest& req);
219};
220}
221#endif /* CEPH_RGW_STS_H */
222