[fe5682f] | 1 | OVERVIEW |
---|
| 2 | |
---|
[80f6450] | 3 | ABAC proves attributes about principals. |
---|
| 4 | |
---|
[fe5682f] | 5 | libabac is comprised of three main types of objects: credentials, roles, |
---|
| 6 | and contexts. |
---|
| 7 | |
---|
[80f6450] | 8 | A typical use of ABAC is: |
---|
| 9 | |
---|
| 10 | - create a context |
---|
| 11 | - load some certificates |
---|
| 12 | - add more certificates, possibly presented by another party |
---|
| 13 | - make a query 'does principal B have the role A.r1?' |
---|
[9806e76] | 14 | or a query 'is object B part of the oset A.o1?' |
---|
[80f6450] | 15 | |
---|
[fe5682f] | 16 | CREDENTIAL |
---|
| 17 | |
---|
[9806e76] | 18 | An ABAC credential is the most basic unit of an ABAC proof. |
---|
| 19 | |
---|
| 20 | It is a signed assertion by a principal A that some other entity has a |
---|
| 21 | role r1. Abstractly, it is one of the following (A, B principals; |
---|
| 22 | r1, r2, r3 roles): |
---|
[fe5682f] | 23 | |
---|
| 24 | A.r1 <- B |
---|
| 25 | A.r1 <- B.r2 |
---|
| 26 | A.r1 <- B.r2.r3 |
---|
| 27 | |
---|
[9806e76] | 28 | It is a signed assertion by a principal A that some other entity is |
---|
| 29 | an object of oset o1. (A, B principals; r1 role; o1, o2 osets; O object): |
---|
| 30 | |
---|
| 31 | A.o1 <- O |
---|
| 32 | A.o1 <- B.o2 |
---|
| 33 | A.o1 <- B.r1.o2 |
---|
| 34 | |
---|
| 35 | |
---|
[fe5682f] | 36 | When interacting with libabac, a credential is represented by an X509 |
---|
| 37 | attribute certificates and the associated issuer X509 identity |
---|
| 38 | certificate. |
---|
| 39 | |
---|
[80f6450] | 40 | A principal is represented by the SHA1 hash of the public key of its |
---|
| 41 | identity certificate. Therefore when a credential is encoded in an |
---|
| 42 | attribute certificate, it will look something along the lines of: |
---|
| 43 | |
---|
| 44 | e65aace9237833ec775253cfde97f59a0af5bc3d.frobnicate <- |
---|
| 45 | e93547826455a80d9488825a1d083ef6ef264107 |
---|
| 46 | |
---|
[fe5682f] | 47 | ROLE |
---|
| 48 | |
---|
| 49 | ABAC roles are the atomic units that form the head and tail of a |
---|
| 50 | credential. The head will always be a proper role, which is to say it |
---|
| 51 | takes form: |
---|
| 52 | |
---|
| 53 | A.r1 |
---|
| 54 | |
---|
| 55 | As seen in the CREDENTIAL section, the tail of a role can take one of |
---|
| 56 | three forms: |
---|
| 57 | |
---|
| 58 | principal: B |
---|
| 59 | role: B.r2 |
---|
| 60 | linking role: B.r2.r3 |
---|
| 61 | |
---|
| 62 | For more information about the different types of roles, refer to |
---|
| 63 | [Li03rt]. |
---|
| 64 | |
---|
[9806e76] | 65 | OSET |
---|
| 66 | |
---|
| 67 | ABAC osets are the atomic units that form the head and tail of a |
---|
| 68 | credential. The head will always be a proper oset, which is to say it |
---|
| 69 | takes form: |
---|
| 70 | |
---|
| 71 | A.o1 |
---|
| 72 | |
---|
| 73 | As seen in the CREDENTIAL section, the tail of a oset can take one of |
---|
| 74 | three forms: |
---|
| 75 | |
---|
| 76 | object: O |
---|
| 77 | oset: B.o2 |
---|
| 78 | linking oset: B.r2.o3 |
---|
| 79 | |
---|
| 80 | |
---|
[fe5682f] | 81 | CONTEXT |
---|
| 82 | |
---|
| 83 | An ABAC context object encapsulates a set of ABAC credentials and its |
---|
[9806e76] | 84 | associated YAP clause db. The context supports the following operations: |
---|
[fe5682f] | 85 | |
---|
| 86 | - load X509 identity certificate |
---|
| 87 | - load X509 attribute certificate |
---|
| 88 | - list all the credentials (attribute identity certificate pairs) |
---|
| 89 | - query whether a principal has a given role |
---|
[9502c50] | 90 | - query whether an object belongs to a given o-set |
---|
[fe5682f] | 91 | |
---|
[3529e2d] | 92 | RT2 |
---|
| 93 | |
---|
| 94 | RT2 is an more expressive logic than the original RT0 logic that ABAC |
---|
| 95 | supported. |
---|
| 96 | |
---|
| 97 | The RT2 specification extends the existing RT0 notation in 5 ways: |
---|
| 98 | |
---|
| 99 | * More general principal specification to allow room for other |
---|
| 100 | identity providers |
---|
| 101 | * Explicit syntax for specifying RT2 objects |
---|
| 102 | * Explicit type information to differentiate roles and o-sets. |
---|
| 103 | * Explicit type information for RT1 and RT2 parameters |
---|
| 104 | * Syntax for constraints |
---|
| 105 | |
---|
| 106 | These additions make the syntax both much less terse and much less |
---|
| 107 | ambiguous. |
---|
| 108 | |
---|
| 109 | A few words about RT1 and RT2 before we describe syntax. RT1 parameterizes |
---|
| 110 | roles, that is, it attaches ordered, typed data to roles. It also adds |
---|
| 111 | matching requirements to role derivations, including constraints. The |
---|
| 112 | RT1 rule |
---|
| 113 | |
---|
| 114 | A.r(?x, ?y) <- A.s(1, ?y:[1..3]) & A.t(?y, ?x) |
---|
| 115 | |
---|
| 116 | requires that all instances of ?x and ?y on the right side have the same |
---|
| 117 | type and that the constraints on ?y in the first term are valid for that |
---|
| 118 | type. There's no explicit typing in the rule notation of the papers, |
---|
| 119 | which this specification addresses. |
---|
| 120 | |
---|
| 121 | The data types in the papers inlcude integers, floats, dates, closed |
---|
| 122 | enumerations, and open enumerations. Closed enumerations are things |
---|
| 123 | like C or C++ enums, with boolean being a specific example. Open |
---|
| 124 | enumerations include things like principals. For tractability we're |
---|
| 125 | going to want to define a specific set of data types, which we do |
---|
| 126 | below. |
---|
| 127 | |
---|
| 128 | RT2 allows principals to label data in the same way that they label |
---|
| 129 | principals. The ABAC authors helpfully use the exact same syntax for |
---|
| 130 | assigining a label to a data object as they do for assigning a role to a |
---|
| 131 | principal, but the semantics are slightly different. We add syntax |
---|
| 132 | that clarfies when data is being labelled and when principals are being |
---|
| 133 | labelled. These "data roles" are called o-sets. |
---|
| 134 | |
---|
| 135 | On with the specification, from the basic chunks up to rules. |
---|
| 136 | |
---|
| 137 | Principal Names |
---|
| 138 | |
---|
| 139 | We've been using self-signed X.509 identity certificates as identities, |
---|
| 140 | and that's been a useful way to get started, but it would be nice to be |
---|
| 141 | able to use other identities in the future. Now a principal name is not |
---|
| 142 | marked in the representation at all. New principal IDs will be of the |
---|
| 143 | form: [idtype:A]. The idtype will define what valid characters in A |
---|
| 144 | will be, but in any event "]" must be escaped with a backslash. |
---|
| 145 | |
---|
| 146 | The current id's will be of idtype 'keyid', so only applying the |
---|
| 147 | principal extensions, the role A.r would be written [keyid:A].r, where A |
---|
| 148 | is the sha1 hash of the public key. keyid principal names can include |
---|
| 149 | [0-9a-fA-F] (hex digits). |
---|
| 150 | |
---|
| 151 | I'm going to continue to use [keyid:A] here so not everything runs off |
---|
| 152 | the page. |
---|
| 153 | |
---|
| 154 | Data Objects |
---|
| 155 | |
---|
| 156 | The RT1 and RT2 parameters are loosely data objects. RT1 allows one to |
---|
| 157 | reason about them, RT2 adds the ability to have principals make |
---|
| 158 | statements about these data objects. Just as we need to represent |
---|
| 159 | principals including their type, we need to represent objects with their |
---|
| 160 | type. We support following types: |
---|
| 161 | |
---|
| 162 | int: 32-bit signed integers |
---|
| 163 | float: floats in the range of an IEEE float. |
---|
| 164 | time: a time expressed as yyyymmddThhmmss where the lower case |
---|
| 165 | letters are digits and the T is a T. Zulu time, |
---|
| 166 | everything after the T is optional |
---|
| 167 | boolean: true or false |
---|
| 168 | urn: a resource named by a URN |
---|
| 169 | string: a UTF-8 string. This is a free space for people to |
---|
| 170 | define local free-form attributes |
---|
| 171 | |
---|
| 172 | A particular object is specified by: |
---|
| 173 | |
---|
| 174 | [ type: name] |
---|
| 175 | |
---|
| 176 | Objects are always specified this way, because rules and assignments may |
---|
[9502c50] | 177 | come from many places and the typing information must mesh. |
---|
[3529e2d] | 178 | |
---|
| 179 | Examples: |
---|
| 180 | |
---|
| 181 | [boolean: true] |
---|
| 182 | [int: 3454] |
---|
| 183 | [float: -323.0] also [ float: 1] |
---|
[7727f26] | 184 | [time: 20111109T122300] also [ time: 20101010T] |
---|
[3529e2d] | 185 | [urn:"file:///usr/local/bin/ls"] |
---|
| 186 | [urn:"uuid://106c0cdd-0afb-11e1-90d8-14feb5e4012d"] |
---|
| 187 | [string:"a string"] |
---|
| 188 | |
---|
[7727f26] | 189 | Roles and O-Sets |
---|
[3529e2d] | 190 | |
---|
| 191 | In the ABAC papers, roles and o-sets look exactly alike, and one may |
---|
| 192 | have trouble understanding that they are different. This spec |
---|
| 193 | explicitly types them for clarity. Roles are prefixed by "role:" and |
---|
[9502c50] | 194 | o-sets by "oset:". |
---|
[3529e2d] | 195 | |
---|
| 196 | The rule that places principal P in role A.r is written in the paper as |
---|
| 197 | |
---|
| 198 | A.r <- P |
---|
| 199 | |
---|
| 200 | In our notation: |
---|
| 201 | |
---|
| 202 | [keyid:A].role:r <- [keyid:P] |
---|
| 203 | |
---|
| 204 | The rule that places file P in o-set A.r is written in the paper as |
---|
| 205 | |
---|
| 206 | A.r <- P |
---|
| 207 | |
---|
| 208 | In our notation: |
---|
| 209 | |
---|
| 210 | [keyid:A].oset:r <- ["urn:file://P"] |
---|
| 211 | |
---|
| 212 | Similarly derivation rules like: |
---|
| 213 | |
---|
| 214 | A.r <- B.r |
---|
| 215 | |
---|
| 216 | become |
---|
| 217 | |
---|
| 218 | [keyid:A].role:r <- [keyid:B].role:r |
---|
| 219 | |
---|
| 220 | or |
---|
| 221 | |
---|
| 222 | [keyid:A].oset:r <- [keyid:B].oset:r |
---|
| 223 | |
---|
[7727f26] | 224 | depending on their intent. It is an error to try (or probably to think): |
---|
[3529e2d] | 225 | |
---|
| 226 | [keyid:A].oset:r <- [keyid:B].role:r |
---|
| 227 | |
---|
| 228 | Note also that |
---|
| 229 | |
---|
[7727f26] | 230 | [keyid:A].oset:os <- [keyid:B].role:r.oset:os |
---|
[3529e2d] | 231 | |
---|
| 232 | Is the only valid linking credential for assigning o-sets. |
---|
| 233 | [keyid:B].role:r is a set of principals that may have defined an o-set |
---|
| 234 | (oset:os), but the members of an o-set could not have done so. |
---|
| 235 | |
---|
| 236 | Variables |
---|
| 237 | |
---|
[9502c50] | 238 | Both RT1 and RT2 allow rules defining roles or o-sets to match |
---|
[3529e2d] | 239 | parameters using variable bindings. We illustrate with roles here, |
---|
[9502c50] | 240 | though all of this holds for o-sets. The variables may be named to |
---|
[3529e2d] | 241 | specify connections between the role to be defined and the roles used to |
---|
| 242 | define it. |
---|
| 243 | |
---|
| 244 | For example the rule (in paper notation): |
---|
| 245 | |
---|
| 246 | A.evaluatorOf(?x) <- A.managerOf(?x) |
---|
| 247 | |
---|
| 248 | means that if |
---|
| 249 | |
---|
| 250 | A.managerOf(mikeryan) <- faber |
---|
| 251 | |
---|
| 252 | then |
---|
| 253 | |
---|
| 254 | A.evaluatorOf(mikeryan) <- faber |
---|
| 255 | |
---|
| 256 | is also true. The two ?x es bind to the same thing. For more complex |
---|
| 257 | rules, we have to make sure that the types are also consistent: |
---|
| 258 | |
---|
| 259 | A.example(?x) <- A.isInteger(?x) & A.isFloat(?x) |
---|
| 260 | |
---|
| 261 | ?x is not allowed to match an integer-typed data object in the first |
---|
| 262 | clause and a float-typed one in the second. The papers say this is an |
---|
| 263 | invalid rule, but without knowing the types of the parameters it cannot |
---|
| 264 | be checked. |
---|
| 265 | |
---|
| 266 | We adopt the same variable naming convention, but require them to be |
---|
[9502c50] | 267 | prefixed with the types above. Variable names start with a ? can |
---|
| 268 | contain [_\-a-zA-Z0-9], that is, alphanumerics, underscore and |
---|
| 269 | the hyphens. ? is a valid anonymous variable name. Multiple instances |
---|
| 270 | of ? in the same rule can bind to different types. |
---|
[3529e2d] | 271 | |
---|
[7727f26] | 272 | This is OK: |
---|
| 273 | |
---|
| 274 | [keyid:A].role:weird([urn:?x]) <- [keyid:B].role:a([urn:?x], [int:?]) & |
---|
| 275 | [keyid:C].role:b([urn:?x], [boolean:?]) |
---|
[3529e2d] | 276 | |
---|
| 277 | Other examples: |
---|
| 278 | |
---|
| 279 | [keyid:A].role:example([int:?x]) <- [keyid:A].role:isInteger([int:?x]) & |
---|
| 280 | [keyid:A].role:isFloat([int:?x]) |
---|
| 281 | |
---|
| 282 | is valid |
---|
| 283 | |
---|
| 284 | [keyid:A].role:example([int:?x]) <- [keyid:A].role:isInteger([int:?x]) & |
---|
| 285 | [keyid:A].role:isFloat([float:?x]) |
---|
| 286 | |
---|
[9502c50] | 287 | is not, because the types of ?x are different. |
---|
[3529e2d] | 288 | |
---|
| 289 | |
---|
| 290 | In addition to the data object types, the "principal" type is allowed as |
---|
| 291 | well, indicating that the variable must match an ABAC principal. The |
---|
| 292 | first example in this section is written: |
---|
| 293 | |
---|
| 294 | [keyid:A].role:evaluatorOf([principal:?x]) <- |
---|
| 295 | [keyid:A].role:managerOf([principal:?x]) |
---|
| 296 | |
---|
| 297 | Constraints |
---|
| 298 | |
---|
| 299 | A constraint is a static (RT1) or dynamic (RT2) set of valid choices for |
---|
| 300 | a parameter. There are two kinds of constraint sets, static and |
---|
[9502c50] | 301 | dynamic. A dynamic constraint set is an o-set or role. Static |
---|
[3529e2d] | 302 | constraint sets are a list of valid values. Constraints are separated |
---|
| 303 | from a variable name by a colon (:). |
---|
| 304 | |
---|
| 305 | We specify a static set by enclosing the values in [] separated by |
---|
[9502c50] | 306 | commas. Because the set is bound to a typed variable, the values |
---|
| 307 | in the set can omit the [type:], so we write: |
---|
[3529e2d] | 308 | |
---|
| 309 | [keyid:A].role:r([int:?x:[1,3,5]) |
---|
| 310 | |
---|
| 311 | not |
---|
| 312 | |
---|
[9502c50] | 313 | [keyid:A].role:r([int:?x:[[int:1],[int:3],[int:5]]]) |
---|
[3529e2d] | 314 | |
---|
[7727f26] | 315 | For ordered sets like integers, floats and dates, the .. sequence |
---|
| 316 | specifies a range: |
---|
[3529e2d] | 317 | |
---|
| 318 | [keyid:A].role:r(int:?x:[1..5]) |
---|
| 319 | |
---|
| 320 | in static constraint sets, commas, elipses (..), and the bracket |
---|
| 321 | characters [, ] must be escaped using a backslash (\) prefix. |
---|
| 322 | |
---|
[9502c50] | 323 | The constraint can also be an o-set (for objects) or a role (for a principal). |
---|
[3529e2d] | 324 | |
---|
[7727f26] | 325 | [keyid:A].role:r([principal:?x:[[keyid:A].role:r1]) |
---|
| 326 | [keyid:A].role:r([urn:?x:[[keyid:A].oset:o1]) |
---|
[3529e2d] | 327 | |
---|
| 328 | A Complex Example |
---|
| 329 | |
---|
| 330 | The example on p. 10 of "Design of a Role-Based Trust Management |
---|
| 331 | Framework" starts with the rule |
---|
| 332 | |
---|
| 333 | Alpha.fileAc(read, ?F:Alpha.documents(?proj)) <- Alpha.team(?proj) |
---|
| 334 | |
---|
| 335 | and says that given |
---|
| 336 | |
---|
| 337 | Alpha.documents(proj1) <- fileA |
---|
| 338 | Alpha.team(proj1) <- Bob |
---|
| 339 | |
---|
| 340 | one can conclude |
---|
| 341 | |
---|
| 342 | Alpha.fileAc(read, fileA) <- Bob |
---|
| 343 | |
---|
| 344 | In our notation the initial rule is encoded (note the mingling of o-sets |
---|
| 345 | and roles) |
---|
| 346 | |
---|
| 347 | [keyid:Alpha].role:fileAc([string:"read"], |
---|
[7727f26] | 348 | [string:?F:[keyid:Alpha].oset:documents([string:?proj])]) |
---|
[3529e2d] | 349 | <- [keyid:Alpha].role:team([string:?proj]) |
---|
| 350 | |
---|
| 351 | and given |
---|
| 352 | |
---|
[7727f26] | 353 | [keyid:Alpha].oset:documents([string:"proj1"]) <- [string:"fileA"] |
---|
[3529e2d] | 354 | [keyid:Alpha].role:team([string:"proj1"]) <- [keyid:Bob] |
---|
| 355 | |
---|
| 356 | one can conclude |
---|
| 357 | |
---|
| 358 | [keyid:Alpha].role:fileAc([string:"read"], [string:"fileA"]) <- [keyid:Bob] |
---|
| 359 | |
---|
| 360 | It is more verbose, but draws out the different roles and o-sets in |
---|
| 361 | play. |
---|
| 362 | |
---|
[fe5682f] | 363 | REFERENCES |
---|
| 364 | |
---|
| 365 | [Li03rt] |
---|
| 366 | Li, N. and Mitchell, J. C. RT: A role-based trust-management |
---|
| 367 | framework. In Proceedings of the Third DARPA Information |
---|
| 368 | Survivability Conference and Exposition. IEEE Computer Society |
---|
| 369 | Press, 201212. |
---|
[22414c9] | 370 | |
---|
[9806e76] | 371 | |
---|
| 372 | |
---|
[22414c9] | 373 | http://groups.geni.net/geni/wiki/TIEDABACModel |
---|
| 374 | |
---|
| 375 | http://groups.geni.net/geni/wiki/TIEDABACDemo |
---|