]> git.ipfire.org Git - thirdparty/systemd.git/blob - docs/USER_RECORD.md
Merge pull request #14904 from ssahani/dhcp-server-force-renew
[thirdparty/systemd.git] / docs / USER_RECORD.md
1 ---
2 title: JSON User Records
3 category: Interfaces
4 layout: default
5 ---
6
7 # JSON User Records
8
9 systemd optionally processes user records that go beyond the classic UNIX (or
10 glibc NSS) `struct passwd`. Various components of systemd are able to provide
11 and consume records in a more extensible format of a dictionary of key/value
12 pairs, encoded as JSON. Specifically:
13
14 1. [`systemd-homed.service`](https://www.freedesktop.org/software/systemd/man/systemd-homed.service.html)
15 manages `human` user home directories and embeds these JSON records
16 directly in the home directory images (see [Home
17 Directories](https://systemd.io/HOME_DIRECTORY)) for details.
18
19 2. [`pam_systemd`](https://www.freedesktop.org/software/systemd/man/pam_systemd.html)
20 processes these JSON records for users that log in, and applies various
21 settings to the activated session, including environment variables, nice
22 levels and more.
23
24 3. [`systemd-logind.service`](https://www.freedesktop.org/software/systemd/man/systemd-logind.service.html)
25 processes these JSON records of users that log in, and applies various
26 resource management settings to the per-user slice units it manages. This
27 allows setting global limits on resource consumption by a specific user.
28
29 4. [`nss-systemd`](https://www.freedesktop.org/software/systemd/man/nss-systemd.html)
30 is a glibc NSS module that synthesizes classic NSS records from these JSON
31 records, providing full backwards compatibility with the classic UNIX APIs
32 both for look-up and enumeration.
33
34 5. The service manager (PID 1) exposes dynamic users (i.e. users synthesized as
35 effect of `DynamicUser=` in service unit files) as these advanced JSON
36 records, making them discoverable to the rest of the system.
37
38 6. [`systemd-userdbd.service`](https://www.freedesktop.org/software/systemd/man/systemd-userdbd.service.html)
39 is a small service that can translate UNIX/glibc NSS records to these JSON
40 user records. It also provides a unified [Varlink](https://varlink.org/) API
41 for querying and enumerating records of this type, optionally acquiring them
42 from various other services.
43
44 JSON user records may contain various fields that are not available in `struct
45 passwd`, and are extensible for other applications. For example, the record may
46 contain information about:
47
48 1. Additional security credentials (PKCS#11 security token information,
49 biometrical authentication information, SSH public key information)
50
51 2. Additional user metadata, such as a picture, email address, location string,
52 preferred language or timezone
53
54 3. Resource Management settings (such as CPU/IO weights, memory and tasks
55 limits, classic UNIX resource limits or nice levels)
56
57 4. Runtime parameters such as environment variables or the `nodev`, `noexec`,
58 `nosuid` flags to use for the home directory
59
60 5. Information about where to mount the home directory from
61
62 And various other things. The record is intended to be extensible, for example
63 the following extensions are envisioned:
64
65 1. Windows network credential information
66
67 2. Information about default IMAP, SMTP servers to use for this user
68
69 3. Parental control information to enforce on this user
70
71 4. Default parameters for backup applications and similar
72
73 Similar to JSON User Records there are also [JSON Group
74 Records](https://systemd.io/GROUP_RECORD) that encapsulate UNIX groups.
75
76 JSON User Records may be transferred or written to disk in various protocols
77 and formats. To inquire about such records defined on the local system use the
78 [User/Group Lookup API via Varlink](https://systemd.io/USER_GROUP_API).
79
80 ## Why JSON?
81
82 JSON is nicely extensible and widely used. In particular it's easy to
83 synthesize and process with numerous programming languages. It's particularly
84 popular in the web communities, which hopefully should make it easy to link
85 user credential data from the web and from local systems more closely together.
86
87 ## General Structure
88
89 The JSON user records generated and processed by systemd follow a general
90 structure, consisting of seven distinct "sections". Specifically:
91
92 1. Various fields are placed at the top-level of user record (the `regular`
93 section). These are generally fields that shall apply unconditionally to the
94 user in all contexts, are portable and not security sensitive.
95
96 2. A number of fields are located in the `privileged` section (a sub-object of
97 the user record). Fields contained in this object are security sensitive,
98 i.e. contain information that the user and the administrator should be able
99 to see, but other users should not. In many ways this matches the data
100 stored in `/etc/shadow` in classic Linux user accounts, i.e. includes
101 password hashes and more. Algorithmically, when a user record is passed to
102 an untrusted client, by monopolizing such sensitive records in a single
103 object field we can easily remove it from view.
104
105 3. A number of fields are located in objects inside the `perMachine` section
106 (an array field of the user record). Primarily these are resource
107 management-related fields, as those tend to make sense on a specific system
108 only, e.g. limiting a user's memory use to 1G only makes sense on a specific
109 system that has more than 1G of memory. Each object inside the `perMachine`
110 array comes with a `matchMachineId` or `matchHostname` field which indicate
111 which systems to apply the listed settings to. Note that many fields
112 accepted in the `perMachine` section can also be set at the top level (the
113 `regular` section), where they define the fallback if no matching object in
114 `perMachine` is found.
115
116 4. Various fields are located in the `binding` section (a sub-sub-object of the
117 user record; an intermediary object is inserted which is keyed by the
118 machine ID of the host). Fields included in this section "bind" the object
119 to a specific system. They generally include non-portable information about
120 paths or UID assignments, that are true on a specific system, but not
121 necessarily on others, and which are managed automatically by some user
122 record manager (such as `systemd-homed`). Data in this section is considered
123 part of the user record only in the local context, and is generally not
124 ported to other systems. Due to that it is not included in the reduced user
125 record the cryptographic signature defined in the `signature` section is
126 calculated on. In `systemd-homed` this section is also removed when the
127 user's record is stored in the `~/.identity` file in the home directory, so
128 that every system with access to the home directory can manage these
129 `binding` fields individually. Typically, the binding section is persisted
130 to the local disk.
131
132 5. Various fields are located in the `status` section (a sub-sub-object of the
133 user record, also with an intermediary object between that is keyed by the
134 machine ID, similar to the way the `binding` section is organized). This
135 section is augmented during runtime only, and never persisted to disk. The
136 idea is that this section contains information about current runtime
137 resource usage (for example: currently used disk space of the user), that
138 changes dynamically but is otherwise immediately associated with the user
139 record and for many purposes should be considered to be part of the user
140 record.
141
142 6. The `signature` section contains one or more cryptographic signatures of a
143 reduced version of the user record. This is used to ensure that only user
144 records defined by a specific source are accepted on a system, by validating
145 the signature against the set of locally accepted signature public keys. The
146 signature is calculated from the JSON user record with all sections removed,
147 except for `regular`, `privileged`, `perMachine`. Specifically, `binding`,
148 `status`, `signature` itself and `secret` are removed first and thus not
149 covered by the signature. This section is optional, and is only used when
150 cryptographic validation of user records is required (as it is by
151 `systemd-homed.service` for example).
152
153 7. The `secret` section contains secret user credentials, such as password or
154 PIN information. This data is never persisted, and never returned when user
155 records are inquired by a client, privileged or not. This data should only
156 be included in a user record very briefly, for example when certain very
157 specific operations are executed. For example, in tools such as
158 `systemd-homed` this section may be included in user records, when creating
159 a new home directory, as passwords and similar credentials need to be
160 provided to encrypt the home directory with.
161
162 Here's a tabular overview of the sections and their properties:
163
164 | Section | Included in Signature | Persistent | Security Sensitive | Contains Host-Specific Data |
165 |------------|-----------------------|------------|--------------------|-----------------------------|
166 | regular | yes | yes | no | no |
167 | privileged | yes | yes | yes | no |
168 | perMachine | yes | yes | no | yes |
169 | binding | no | yes | no | yes |
170 | status | no | no | no | yes |
171 | signature | no | yes | no | no |
172 | secret | no | no | yes | no |
173
174 Note that services providing user records to the local system are free to
175 manage only a subset of these sections and never include the others in
176 them. For example, a service that has no concept of signed records (for example
177 because the records it manages are inherently trusted anyway) does not have to
178 bother with the `signature` section. A service that only defines records in a
179 strictly local context and without signatures doesn't have to deal with the
180 `perMachine` or `binding` sections and can include its data exclusively in the
181 regular section. A service that uses a separate, private channel for
182 authenticating users (or that doesn't have a concept of authentication at all)
183 does not need to to be concerned with the `secret` section of user records, as
184 the fields included therein are only useful when executing authentication
185 operations natively against JSON user records.
186
187 The `systemd-homed` manager uses all seven sections for various
188 purposes. Inside the home directories (and if the LUKS2 backend is used, also
189 in the LUKS2 header) a user record containing the `regular`, `privileged`,
190 `perMachine` and `signature` sections is stored. `systemd-homed` also stores a
191 version of the record on the host, with the same four sections and augmented
192 with an additional, fifth `binding` section. When a local client enquires about
193 a user record managed by `systemd-homed` the service will add in some
194 additional information about the user and home directory in the `status`
195 section — this version is only transferred via IPC and never written to
196 disk. Finally the `secret` section is used during authentication operations via
197 IPC to transfer the user record along with its authentication tokens in one go.
198
199 ## Fields in the `regular` section
200
201 As mentioned, the `regular` section's fields are placed at the top level
202 object. The following fields are currently defined:
203
204 `userName` → The UNIX user name for this record. Takes a string with a valid
205 UNIX user name. This field is the only mandatory field, all others are
206 optional. Corresponds with the `pw_name` field of of `struct passwd` and the
207 `sp_namp` field of `struct spwd` (i.e. the shadow user record stored in
208 `/etc/shadow`).
209
210 `realm` → The "realm" a user is defined in. This concept allows distinguishing
211 users with the same name that originate in different organizations or
212 installations. This should take a string in DNS domain syntax, but doesn't have
213 to refer to an actual DNS domain (though it is recommended to use one for
214 this). The idea is that the user `lpoetter` in the `redhat.com` realm might be
215 distinct from the same user in the `poettering.hq` realm. User records for the
216 same user name that have different realm fields are considered referring to
217 different users. When updating a user record it is required that any new
218 version has to match in both `userName` and `realm` field. This field is
219 optional, when unset the user should not be considered part of any realm. A
220 user record with a realm set is never compatible (for the purpose of updates,
221 see above) with a user record without one set, even if the `userName` field matches.
222
223 `realName` → The real name of the user, a string. This should contain the user's
224 real ("human") name, and corresponds loosely to the GECOS field of classic UNIX
225 user records. When converting a `struct passwd` to a JSON user record this
226 field is initialized from GECOS (i.e. the `pw_gecos` field), and vice versa
227 when converting back. That said, unlike GECOS this field is supposed to contain
228 only the real name and no other information.
229
230 `emailAddress` → The email address of the user, formatted as
231 string. [`pam_systemd`](https://www.freedesktop.org/software/systemd/man/pam_systemd.html)
232 initializes the `$EMAIL` environment variable from this value for all login
233 sessions.
234
235 `iconName` → The name of an icon picked by the user, for example for the
236 purpose of an avatar. This must be a string, and should follow the semantics
237 defined in the [Icon Naming
238 Specification](https://standards.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html).
239
240 `location` → A free-form location string describing the location of the user,
241 if that is applicable. It's probably wise to use a location string processable
242 by geo-location subsystems, but this is not enforced nor required. Example:
243 `Berlin, Germany` or `Basement, Room 3a`.
244
245 `disposition` → A string, one of `intrinsic`, `system`, `dynamic`, `regular`,
246 `container`, `reserved`. If specified clarifies the disposition of the user,
247 i.e. the context it is defined in. For regular, "human" users this should be
248 `regular`, for system users (i.e. users that system services run under, and
249 similar) this should be `system`. The `intrinsic` disposition should be used
250 only for the two users that have special meaning to the OS kernel itself,
251 i.e. the `root` and `nobody` users. The `container` string should be used for
252 users that are used by an OS container, and hence will show up in `ps` listings
253 and such, but are only defined in container context. Finally `reserved` should
254 be used for any users outside of these use-cases. Note that this property is
255 entirely optional and applications are assumed to be able to derive the
256 disposition of a user automatically from a record even in absence of this
257 field, based on other fields, for example the numeric UID. By setting this
258 field explicitly applications can override this default determination.
259
260 `lastChangeUSec` → An unsigned 64bit integer value, referring to a timestamp in µs
261 since the epoch 1970, indicating when the user record (specifically, any of the
262 `regular`, `privileged`, `perMachine` sections) was last changed. This field is
263 used when comparing two records of the same user to identify the newer one, and
264 is used for example for automatic updating of user records, where appropriate.
265
266 `lastPasswordChangeUSec` → Similar, also an unsigned 64bit integer value,
267 indicating the point in time the password (or any authentication token) of the
268 user was last changed. This corresponds to the `sp_lstchg` field of `struct
269 spwd`, i.e. the matching field in the user shadow database `/etc/shadow`,
270 though provides finer resolution.
271
272 `shell` → A string, referring to the shell binary to use for terminal logins of
273 this user. This corresponds with the `pw_shell` field of `struct passwd`, and
274 should contain an absolute file system path. For system users not suitable for
275 terminal log-in this field should not be set.
276
277 `umask` → The `umask` to set for the user's login sessions. Takes an
278 integer. Note that usually on UNIX the umask is noted in octal, but JSON's
279 integers are generally written in decimal, hence in this context we denote it
280 umask in decimal too. The specified value should be in the valid range for
281 umasks, i.e. 0000…0777 (in octal as typical in UNIX), or 0…511 (in decimal, how
282 it actually appears in the JSON record). This `umask` is automatically set by
283 [`pam_systemd`](https://www.freedesktop.org/software/systemd/man/pam_systemd.html)
284 for all login sessions of the user.
285
286 `environment` → An array of strings, each containing an environment variable
287 and its value to set for the user's login session, in a format compatible with
288 [`putenv()`](http://man7.org/linux/man-pages/man3/putenv.3.html). Any
289 environment variable listed here is automatically set by
290 [`pam_systemd`](https://www.freedesktop.org/software/systemd/man/pam_systemd.html)
291 for all login sessions of the user.
292
293 `timeZone` → A string indicating a preferred timezone to use for the user. When
294 logging in
295 [`pam_systemd`](https://www.freedesktop.org/software/systemd/man/pam_systemd.html)
296 will automatically initialize the `$TZ` environment variable from this
297 string. The string should be a `tzdata` compatible location string, for
298 example: `Europe/Berlin`.
299
300 `preferredLanguage` → A string indicating the preferred language/locale for the
301 user. When logging in
302 [`pam_systemd`](https://www.freedesktop.org/software/systemd/man/pam_systemd.html)
303 will automatically initialize the `$LANG` environment variable from this
304 string. The string hence should be in a format compatible with this environment
305 variable, for example: `de_DE.UTF8`.
306
307 `niceLevel` → An integer value in the range -20…19. When logging in
308 [`pam_systemd`](https://www.freedesktop.org/software/systemd/man/pam_systemd.html)
309 will automatically initialize the login process' nice level to this value with,
310 which is then inherited by all the user's processes, see
311 [`setpriority()`](http://man7.org/linux/man-pages/man2/setpriority.2.html) for
312 more information.
313
314 `resourceLimits` → An object, where each key refers to a Linux resource limit
315 (such as `RLIMIT_NOFILE` and similar). Their values should be an object with
316 two keys `cur` and `max` for the soft and hard resource limit. When logging in
317 [`pam_systemd`](https://www.freedesktop.org/software/systemd/man/pam_systemd.html)
318 will automatically initialize the login process' resource limits to these
319 values, which is then inherited by all the user's processes, see
320 [`setrlimit()`](http://man7.org/linux/man-pages/man2/setrlimit.2.html) for more
321 information.
322
323 `locked` → A boolean value. If true the user account is locked, the user may
324 not log in. If this field is missing it should be assumed to be false,
325 i.e. logins are permitted. This field corresponds to the `sp_expire` field of
326 `struct spwd` (i.e. the `/etc/shadow` data for a user) being set to zero or
327 one.
328
329 `notBeforeUSec` → An unsigned 64bit integer value, indicating a time in µs since
330 the UNIX epoch (1970) before which the record should be considered invalid for
331 the purpose of logging in.
332
333 `notAfterUSec` → Similar, but indicates the point in time *after* which logins
334 shall not be permitted anymore. This corresponds to the `sp_expire` field of
335 `struct spwd`, when it is set to a value larger than one, but provides finer
336 granularity.
337
338 `storage` → A string, one of `classic`, `luks`, `directory`, `subvolume`,
339 `fscrypt`, `cifs`. Indicates the storage mechanism for the user's home
340 directory. If `classic` the home directory is a plain directory as in classic
341 UNIX. When `directory`, the home directory is a regular directory, but the
342 `~/.identity` file in it contains the user's user record, so that the directory
343 is self-contained. Similar, `subvolume` is a `btrfs` subvolume that also
344 contains a `~/.identity` user record; `fscrypt` is an `fscrypt`-encrypted
345 directory, also containing the `~/.identity` user record; `luks` is a per-user
346 LUKS volume that is mounted as home directory, and `cifs` a home directory
347 mounted from a Windows File Share. The five latter types are primarily used by
348 `systemd-homed` when managing home directories, but may be used if other
349 managers are used too. If this is not set `classic` is the implied default.
350
351 `diskSize` → An unsigned 64bit integer, indicating the intended home directory
352 disk space in bytes to assign to the user. Depending on the selected storage
353 type this might be implement differently: for `luks` this is the intended size
354 of the file system and LUKS volume, while for the others this likely translates
355 to classic file system quota settings.
356
357 `diskSizeRelative` → Similar to `diskSize` but takes a relative value, but
358 specifies a fraction of the available disk space on the selected storage medium
359 to assign to the user. This unsigned integer value is normalized to 2^32 =
360 100%.
361
362 `skeletonDirectory` → Takes a string with the absolute path to the skeleton
363 directory to populate a new home directory from. This is only used when a home
364 directory is first created, and defaults to `/etc/skel` if not defined.
365
366 `accessMode` → Takes an unsigned integer in the range 0…511 indicating the UNIX
367 access mask for the home directory when it is first created.
368
369 `tasksMax` → Takes an unsigned 64bit integer indicating the maximum number of
370 tasks the user may start in parallel during system runtime. This value is
371 enforced on all tasks (i.e. processes and threads) the user starts or that are
372 forked off these processes regardless if the change user identity (for example
373 by setuid binaries/`su`/`sudo` and
374 similar). [`systemd-logind.service`](https://www.freedesktop.org/software/systemd/man/systemd-logind.service.html)
375 enforces this by setting the `TasksMax` slice property for the user's slice
376 `user-$UID.slice`.
377
378 `memoryHigh`/`memoryMax` → These take unsigned 64bit integers indicating upper
379 memory limits for all processes of the user (plus all processes forked off them
380 that might have changed user identity), in bytes. Enforced by
381 [`systemd-logind.service`](https://www.freedesktop.org/software/systemd/man/systemd-logind.service.html),
382 similar to `tasksMax`.
383
384 `cpuWeight`/`ioWeight` → These take unsigned integers in the range 1…10000
385 (defaults to 100) and configure the CPU and IO scheduling weights for the
386 user's processes as a whole. Also enforced by
387 [`systemd-logind.service`](https://www.freedesktop.org/software/systemd/man/systemd-logind.service.html),
388 similar to `tasksMax`, `memoryHigh` and `memoryMax`.
389
390 `mountNoDevices`/`mountNoSuid`/`mountNoExecute` → Three booleans that control
391 the `nodev`, `nosuid`, `noexec` mount flags of the user's home
392 directories. Note that these booleans are only honored if the home directory
393 is managed by a subsystem such as `systemd-homed.service` that automatically
394 mounts home directories on login.
395
396 `cifsDomain` → A string indicating the Windows File Sharing domain (CIFS) to
397 use. This is generally useful, but particularly when `cifs` is used as storage
398 mechanism for the user's home directory, see above.
399
400 `cifsUserName` → A string indicating the Windows File Sharing user name (CIFS)
401 to associate this user record with. This is generally useful, but particularly
402 useful when `cifs` is used as storage mechanism for the user's home directory,
403 see above.
404
405 `cifsService` → A string indicating the Windows File Share service (CIFS) to
406 mount as home directory of the user on login.
407
408 `imagePath` → A string with an absolute file system path to the file, directory
409 or block device to use for storage backing the home directory. If the `luks`
410 storage is used this refers to the loopback file or block device node to store
411 the LUKS volume on. For `fscrypt`, `directory`, `subvolume` this refers to the
412 directory to bind mount as home directory on login. Not defined for `classic`
413 or `cifs`.
414
415 `homeDirectory` → A string with an absolute file system path to the home
416 directory. This is where the image indicated in `imagePath` is mounted to on
417 login and thus indicates the application facing home directory while the home
418 directory is active, and is what the user's `$HOME` environment variable is set
419 to during log-in. It corresponds to the `pw_dir` field of `struct passwd`.
420
421 `uid` → An unsigned integer in the range 0…4294967295: the numeric UNIX user ID (UID) to
422 use for the user. This corresponds to the `pw_uid` field of `struct passwd`.
423
424 `gid` → An unsigned integer in the range 0…4294967295: the numeric UNIX group
425 ID (GID) to use for the user. This corresponds to the `pw_gid` field of
426 `struct passwd`.
427
428 `memberOf` → An array of strings, each indicating a UNIX group this user shall
429 be a member of. The listed strings must be valid group names, but it is not
430 required that all groups listed exist in all contexts: any entry for which no
431 group exists should be silently ignored.
432
433 `fileSystemType` → A string, one of `ext4`, `xfs`, `btrfs` (possibly others) to
434 use as file system for the user's home directory. This is primarily relevant
435 when the storage mechanism used is `luks` as a file system to use inside the
436 LUKS container must be selected.
437
438 `partitionUuid` → A string containing a lower-case, text-formatted UUID, referencing
439 the GPT partition UUID the home directory is located in. This is primarily
440 relevant when the storage mechanism used is `luks`.
441
442 `luksUuid` → A string containing a lower-case, text-formatted UUID, referencing
443 the LUKS volume UUID the home directory is located in. This is primarily
444 relevant when the storage mechanism used is `luks`.
445
446 `fileSystemUuid` → A string containing a lower-case, text-formatted UUID,
447 referencing the file system UUID the home directory is located in. This is
448 primarily relevant when the storage mechanism used is `luks`.
449
450 `luksDiscard` → A boolean. If true and `luks` storage is used controls whether
451 the loopback block devices, LUKS and the file system on top shall be used in
452 `discard` mode, i.e. erased sectors should always be returned to the underlying
453 storage. If false and `luks` storage is used turns this behavior off. In
454 addition, depending on this setting an `FITRIM` or `fallocate()` operation is
455 executed to make sure the image matches the selected option.
456
457 `luksCipher` → A string, indicating the cipher to use for the LUKS storage mechanism.
458
459 `luksCipherMode` → A string, selecting the cipher mode to use for the LUKS storage mechanism.
460
461 `luksVolumeKeySize` → An unsigned integer, indicating the volume key length in
462 bytes to use for the LUKS storage mechanism.
463
464 `luksPbkdfHashAlgorithm` → A string, selecting the hash algorithm to use for
465 the PBKDF operation for the LUKS storage mechanism.
466
467 `luksPbkdfType` → A string, indicating the PBKDF type to use for the LUKS storage mechanism.
468
469 `luksPbkdfTimeCostUSec` → An unsigned 64bit integer, indicating the intended
470 time cost for the PBKDF operation, when the LUKS storage mechanism is used, in
471 µs.
472
473 `luksPbkdfMemoryCost` → An unsigned 64bit integer, indicating the intended
474 memory cost for the PBKDF operation, when LUKS storage is used, in bytes.
475
476 `luksPbkdfParallelThreads` → An unsigned 64bit integer, indicating the intended
477 required parallel threads for the PBKDF operation, when LUKS storage is used.
478
479 `service` → A string declaring the service that defines or manages this user
480 record. It is recommended to use reverse domain name notation for this. For
481 example, if `systemd-homed` manages a user a string of `io.systemd.Home` is
482 used for this.
483
484 `rateLimitIntervalUSec` → An unsigned 64bit integer that configures the
485 authentication rate limiting enforced on the user account. This specifies a
486 timer interval (in µs) within which to count authentication attempts. When the
487 counter goes above the value configured n `rateLimitIntervalBurst` log-ins are
488 temporarily refused until the interval passes.
489
490 `rateLimitIntervalBurst` → An unsigned 64bit integer, closely related to
491 `rateLimitIntervalUSec`, that puts a limit on authentication attempts within
492 the configured time interval.
493
494 `enforcePasswordPolicy` → A boolean. Configures whether to enforce the system's
495 password policy when creating the home directory for the user or changing the
496 user's password. By default the policy is enforced, but if this field is false
497 it is bypassed.
498
499 `autoLogin` → A boolean. If true the user record is marked as suitable for
500 auto-login. Systems are supposed to automatically log in a user marked this way
501 during boot, if there's exactly one user on it defined this way.
502
503 `stopDelayUSec` → An unsigned 64bit integer, indicating the time in µs the
504 per-user service manager is kept around after the user fully logged out. This
505 value is honored by
506 [`systemd-logind.service`](https://www.freedesktop.org/software/systemd/man/systemd-logind.service.html). If
507 set to zero the per-user service manager is immediately terminated when the
508 user logs out, and longer values optimize high-frequency log-ins as the
509 necessary work to set up and tear down a log-in is reduced if the service
510 manager stays running.
511
512 `killProcesses` → A boolean. If true all processes of the user are
513 automatically killed when the user logs out. This is enforced by
514 [`systemd-logind.service`](https://www.freedesktop.org/software/systemd/man/systemd-logind.service.html). If
515 false any processes left around when the user logs out are left running.
516
517 `passwordChangeMinUSec`/`passwordChangeMaxUSec` → An unsigned 64bit integer,
518 encoding how much time has to pass at least/at most between password changes of
519 the user. This corresponds with the `sp_min` and `sp_max` fields of `struct
520 spwd` (i.e. the `/etc/shadow` entries of the user), but offers finer
521 granularity.
522
523 `passwordChangeWarnUSec` → An unsigned 64bit integer, encoding how much time to
524 warn the user before their password expires, in µs. This corresponds with the
525 `sp_warn` field of `struct spwd`.
526
527 `passwordChangeInactiveUSec` → An unsigned 64bit integer, encoding how much
528 time has to pass after the password expired that the account is
529 deactivated. This corresponds with the `sp_inact` field of `struct spwd`.
530
531 `passwordChangeNow` → A boolean. If true the user has to change their password
532 on next login. This corresponds with the `sp_lstchg` field of `struct spwd`
533 being set to zero.
534
535 `pkcs11TokenUri` → An array of strings, each with an RFC 7512 compliant PKCS#11
536 URI referring to security token (or smart card) of some form, that shall be
537 associated with the user and may be used for authentication. The URI is used to
538 search for an X.509 certificate and associated private key that may be used to
539 decrypt an encrypted secret key that is used to unlock the user's account (see
540 below). It's undefined how precise the URI is: during log-in it is tested
541 against all plugged in security tokens and if there's exactly one matching
542 private key found with it it is used.
543
544 `privileged` → An object, which contains the fields of he `privileged` section
545 of the user record, see below.
546
547 `perMachine` → An array of objects, which contain the `perMachine` section of
548 the user record, and thus fields to apply on specific systems only, see below.
549
550 `binding` → An object, keyed by machine IDs formatted as strings, pointing
551 to objects that contain the `binding` section of the user record,
552 i.e. additional fields that bind the user record to a specific machine, see
553 below.
554
555 `status` → An object, keyed by machine IDs formatted as strings, pointing to
556 objects that contain the `status` section of the user record, i.e. additional
557 runtime fields that expose the current status of the user record on a specific
558 system, see below.
559
560 `signature` → An array of objects, which contain cryptographic signatures of
561 the user record, i.e. the fields of the `signature` section of the user record,
562 see below.
563
564 `secret` → An object, which contains the fields of the `secret` section of the
565 user record, see below.
566
567 ## Fields in the `privileged` section
568
569 As mentioned, the `privileged` section is encoded in a sub-object of the user
570 record top-level object, in the `privileged` field. Any data included in this
571 object shall only be visible to the administrator and the user themselves, and
572 be suppressed implicitly when other users get access to a user record. It thus
573 takes the role of the `/etc/shadow` records for each user, which has similarly
574 restrictive access semantics. The following fields are currently defined:
575
576 `passwordHint` → A user-selected password hint in free-form text. This should
577 be a string like "What's the name of your first pet?", but is entirely for the
578 user to choose.
579
580 `hashPassword` → An array of strings, each containing a hashed UNIX password
581 string, in the format
582 [`crypt(3)`](http://man7.org/linux/man-pages/man3/crypt.3.html) generates. This
583 corresponds with `sp_pwdp` field of `struct spwd` (and in a way the `pw_passwd`
584 field of `struct passwd`).
585
586 `sshAuthorizedKeys` → An array of strings, each listing an SSH public key that
587 is authorized to access the account. The strings should follow the same format
588 as the lines in the traditional `~/.ssh/authorized_key` file.
589
590 `pkcs11EncryptedKey` → An array of objects. Each element of the array should be
591 an object consisting of three string fields: `uri` shall contain a PKCS#11
592 security token URI, `data` shall contain a Base64 encoded encrypted key and
593 `hashedPassword` shall contain a UNIX password hash to test the key
594 against. Authenticating with a security token against this account shall work
595 as follows: the encrypted secret key is converted from its Base64
596 representation into binary, then decrypted with the PKCS#11 `C_Decrypt()`
597 function of the PKCS#11 module referenced by the specified URI, using the
598 private key found on the same token. The resulting decrypted key is then
599 Base64-encoded and tested against the specified UNIX hashed password. The
600 Base64-enceded decrypted key may also be used to unlock further resources
601 during log-in, for example the LUKS or `fscrypt` storage backend. It is
602 generally recommended that for each entry in `pkcs11EncryptedKey` there's also
603 a matching one in `pkcs11TokenUri` and vice versa, with the same URI, appearing
604 in the same order, but this should not be required by applications processing
605 user records.
606
607 ## Fields in the `perMachine` section
608
609 As mentioned, the `perMachine` section contains settings that shall apply to
610 specific systems only. This is primarily interesting for resource management
611 properties as they tend to require a per-system focus, however they may be used
612 for other purposes too.
613
614 The `perMachine` field in the top-level object is an array of objects. When
615 processing the user record first the various fields on the top-level object
616 should be used. Then this array should be iterated in order, and the various
617 settings be applied that match either the indicated machine ID or host
618 name. There may be multiple array entries that match a specific system, in
619 which case all the object's setting should be applied. If the same option is
620 set in the top-level object as in a per-machine object the latter wins and
621 entirely undoes the setting in the top-level object (i.e. no merging of
622 properties that are arrays themselves is done). If the same option is set in
623 multiple per-machine objects the one specified later in the array wins (and
624 here too no merging of individual fields is done, the later field always wins
625 in full).
626
627 The following fields are defined in this section:
628
629 `matchMachineId` → An array of strings with each a formatted 128bit ID in
630 hex. If any of the specified IDs match the system's local machine ID
631 (i.e. matches `/etc/machine-id`) the fields in this object are honored.
632
633 `matchHostname` → An array of string with a each a valid hostname. If any of
634 the specified hostnames match the system's local hostname, the fields in this
635 object are honored. If both `matchHostname` and `matchMachineId` are used
636 within the same array entry, the object is honored when either match succeeds,
637 i.e. the two match types are combined in OR, not in AND.
638
639 These two are the only two fields specific to this section. All other fields
640 that may be used in this section are identical to the equally named ones in the
641 `regular` section (i.e. at the top-level object). Specifically, these are:
642
643 `iconName`, `location`, `shell`, `umask`, `environment`, `timeZone`,
644 `preferredLanguage`, `niceLevel`, `resourceLimits`, `locked`, `notBeforeUSec`,
645 `notAfterUSec`, `storage`, `diskSize`, `diskSizeRelative`, `skeletonDirectory`,
646 `accessMode`, `tasksMax`, `memoryHigh`, `memoryMax`, `cpuWeight`, `ioWeight`,
647 `mountNoDevices`, `mountNoSuid`, `mountNoExecute`, `cifsDomain`,
648 `cifsUserName`, `cifsService`, `imagePath`, `uid`, `gid`, `memberOf`,
649 `fileSystemType`, `partitionUuid`, `luksUuid`, `fileSystemUuid`, `luksDiscard`,
650 `luksCipher`, `luksCipherMode`, `luksVolumeKeySize`, `luksPbkdfHashAlgorithm`,
651 `luksPbkdfType`, `luksPbkdfTimeCostUSec`, `luksPbkdfMemoryCost`,
652 `luksPbkdfParallelThreads`, `rateLimitIntervalUSec`, `rateLimitBurst`,
653 `enforcePasswordPolicy`, `autoLogin`, `stopDelayUSec`, `killProcesses`,
654 `passwordChangeMinUSec`, `passwordChangeMaxUSec`, `passwordChangeWarnUSec`,
655 `passwordChangeInactiveUSec`, `passwordChangeNow`, `pkcs11TokenUri`.
656
657 ## Fields in the `binding` section
658
659 As mentioned, the `binding` section contains additional fields about the user
660 record, that bind it to the local system. These fields are generally used by a
661 local user manager (such as `systemd-homed.service`) to add in fields that make
662 sense in a local context but not necessarily in a global one. For example, a
663 user record that contains no `uid` field in the regular section is likely
664 extended with one in the `binding` section to assign a local UID if no global
665 UID is defined.
666
667 All fields in the `binding` section only make sense in a local context and are
668 suppressed when the user record is ported between systems. The `binding` section
669 is generally persisted on the system but not in the home directories themselves
670 and the home directory is supposed to be fully portable and thus not contain
671 the information that `binding` is supposed to contain that binds the portable
672 record to a specific system.
673
674 The `binding` sub-object on the top-level user record object is keyed by the
675 machine ID the binding is intended for, which point to an object with the
676 fields of the bindings. These fields generally match fields that may also be
677 defined in the `regular` and `perMachine` sections, however override
678 both. Usually, the `binding` value should not contain settings different from
679 those set via `regular` or `perMachine`, however this might happen if some
680 settings are not supported locally (think: `fscrypt` is recorded as intended
681 storage mechanism in the `regular` section, but the local kernel does not
682 support `fscrypt`, hence `directory` was chosen as implicit fallback), or have
683 been changed in the `regular` section through updates (e.g. a home directory
684 was created with `luks` as storage mechanism but later the user record was
685 updated to prefer `subvolume`, which however doesn't change the actual storage
686 used already which is pinned in the `binding` section).
687
688 The following fields are defined in the `binding` section. They all have an
689 identical format and override their equally named counterparts in the `regular`
690 and `perMachine` sections:
691
692 `imagePath`, `homeDirectory`, `partitionUuid`, `luksUuid`, `fileSystemUuid`,
693 `uid`, `gid`, `storage`, `fileSystemType`, `luksCipher`, `luksCipherMode`,
694 `luksVolumeKeySize`.
695
696 ## Fields in the `status` section
697
698 As mentioned, the `status` section contains additional fields about the user
699 record that are exclusively acquired during runtime, and that expose runtime
700 metrics of the user and similar metadata that shall not be persisted but are
701 only acquired "on-the-fly" when requested.
702
703 This section is arranged similarly to the `binding` section: the `status`
704 sub-object of the top-level user record object is keyed by the machine ID,
705 which points to the object with the fields defined here. The following fields
706 are defined:
707
708 `diskUsage` → An unsigned 64bit integer. The currently used disk space of the
709 home directory in bytes. This value might be determined in different ways,
710 depending on the selected storage mechanism. For LUKS storage this is the file
711 size of the loopback file or block device size. For the
712 directory/subvolume/fscrypt storage this is the current disk space used as
713 reported by the file system quota subsystem.
714
715 `diskFree` → An unsigned 64bit integer, denoting the number of "free" bytes in
716 the disk space allotment, i.e. usually the difference between the disk size as
717 reported by `diskSize` and the used already as reported in `diskFree`, but
718 possibly skewed by metadata sizes, disk compression and similar.
719
720 `diskSize` → An unsigned 64bit integer, denoting the disk space currently
721 allotted to the user, in bytes. Depending on the storage mechanism this can mean
722 different things (see above). In contrast to the top-level field of the same
723 (or the one in the `perMachine` section), this field reports the current size
724 allotted to the user, not the intended one. The values may differ when user
725 records are updated without the home directory being re-sized.
726
727 `diskCeiling`/`diskFloor` → Unsigned 64bit integers indicating upper and lower
728 bounds when changing the `diskSize` value, in bytes. These values are typically
729 derived from the underlying data storage, and indicate in which range the home
730 directory may be re-sized in, i.e. in which sensible range the `diskSize` value
731 should be kept.
732
733 `state` → A string indicating the current state of the home directory. The
734 precise set of values exposed here are up to the service managing the home
735 directory to define (i.e. are up to the service identified with the `service`
736 field below). However, it is recommended to stick to a basic vocabulary here:
737 `inactive` for a home directory currently not mounted, `absent` for a home
738 directory that cannot be mounted currently because it does not exist on the
739 local system, `active` for a home directory that is currently mounted and
740 accessible.
741
742 `service` → A string identifying the service that manages this user record. For
743 example `systemd-homed.service` sets this to `io.systemd.Home` to all user
744 records it manages. This is particularly relevant to define clearly the context
745 in which `state` lives, see above. Note that this field also exists on the
746 top-level object (i.e. in the `regular` section), which it overrides. The
747 `regular` field should be used if conceptually the user record can only be
748 managed by the specified service, and this `status` field if it can
749 conceptually be managed by different managers, but currently is managed by the
750 specified one.
751
752 `signedLocally` → A boolean. If true indicates that the user record is signed
753 by a public key for which the private key is available locally. This means that
754 the user record may be modified locally as it can be re-signed with the private
755 key. If false indicates that the user record is signed by a public key
756 recognized by the local manager but whose private key is not available
757 locally. This means the user record cannot be modified locally as it couldn't
758 be signed afterwards.
759
760 `goodAuthenticationCounter` → An unsigned 64bit integer. This counter is
761 increased by one on every successful authentication attempt, i.e. an
762 authentication attempt where a security token of some form was presented and it
763 was correct.
764
765 `badAuthenticationCounter` → An unsigned 64bit integer. This counter is
766 increased by one on every unsuccessfully authentication attempt, i.e. an
767 authentication attempt where a security token of some form was presented and it
768 was incorrect.
769
770 `lastGoodAuthenticationUSec` → An unsigned 64bit integer, indicating the time
771 of the last successful authentication attempt in µs since the UNIX epoch (1970).
772
773 `lastBadAuthenticationUSec` → Similar, but the timestamp of the last
774 unsuccessfully authentication attempt.
775
776 `rateLimitBeginUSec` → An unsigned 64bit integer: the µs timestamp since the
777 UNIX epoch (1970) where the most recent rate limiting interval has been
778 started, as configured with `rateLimitIntervalUSec`.
779
780 `rateLimitCount` → An unsigned 64bit integer, counting the authentication
781 attempts in the current rate limiting interval, see above. If this counter
782 grows beyond the value configured in `rateLimitBurst` authentication attempts
783 are temporarily refused.
784
785 `removable` → A boolean value. If true the manager of this user record
786 determined the home directory being on removable media. If false it was
787 determined the home directory is in internal built-in media. (This is used by
788 `systemd-logind.service` to automatically pick the right default value for
789 `stopDelayUSec` if the field is not explicitly specified: for home directories
790 on removable media the delay is selected very low to minimize the chance the
791 home directory remains in unclean state if the storage device is removed from
792 the system by the user).
793
794 ## Fields in the `signature` section
795
796 As mentioned, the `signature` section of the user record may contain one or
797 more cryptographic signatures of the user record. Like all others, this section
798 is optional, and only used when cryptographic validation of user records shall
799 be used. Specifically, all user records managed by `systemd-homed.service` will
800 carry such signatures and the service refuses managing user records that come
801 without signature or with signatures not recognized by any locally defined
802 public key.
803
804 The `signature` field in the top-level user record object is an array of
805 objects. Each object encapsulates one signature and has two fields: `data` and
806 `key` (both are strings). The `data` field contains the actual signature,
807 encoded in base64, the `key` field contains a copy of the public key whose
808 private key was used to make the signature, in PEM format. Currently only
809 signatures with Ed25519 keys are defined.
810
811 Before signing the user record should be brought into "normalized" form,
812 i.e. the keys in all objects should be sorted alphabetically. All redundant
813 white-space and newlines should be removed and the JSON text then signed.
814
815 The signatures only cover the `regular`, `perMachine` and `privileged` sections
816 of the user records, all other sections (include `signature` itself), are
817 removed before the signature is calculated.
818
819 Rationale for signing and threat model: while a multi-user operating system
820 like Linux strives for being sufficiently secure even after a user acquired a
821 local login session reality tells us this is not the case. Hence it is
822 essential to restrict carefully which users may gain access to a system and
823 which ones shall not. A minimal level of trust must be established between
824 system, user record and the user themselves before a log-in request may be
825 permitted. In particular if the home directory is provided in its own LUKS2
826 encapsulated file system it is essential this trust is established before the
827 user logs in (and hence the file system mounted), since file system
828 implementations on Linux are well known to be relatively vulnerable to rogue
829 disk images. User records and home directories in many context are expected to
830 be something shareable between multiple systems, and the transfer between them
831 might not happen via exclusively trusted channels. Hence it's essential that
832 the user record is not manipulated between uses. Finally, resource management
833 (which may be done by the various fields of the user record) is security
834 sensitive, since it should forcefully lock the user into the assigned resource
835 usage and not allow them to use more. The requirement of being able to trust
836 the user record data combined with the potential transfer over untrusted
837 channels suggest a cryptographic signature mechanism where only user records
838 signed by a recognized key are permitted to log in locally.
839
840 Note that other mechanisms for establishing sufficient trust exist too, and are
841 perfectly valid as well. For example, systems like LDAP/ActiveDirectory
842 generally insist on user record transfer from trusted servers via encrypted TLS
843 channels only. Or traditional UNIX users created locally in `/etc/passwd` never
844 exist outside of the local trusted system, hence transfer and trust in the
845 source are not an issue. The major benefit of operating with signed user
846 records is that they are self-sufficiently trusted, not relying on a secure
847 channel for transfer, and thus being compatible with a more distributed model
848 of home directory transfer, including on USB sticks and such.
849
850 ## Fields in the `secret` section
851
852 As mentioned, the `secret` section of the user record should never be persisted
853 nor transferred across machines. It is only defined in short-lived operations,
854 for example when a user record is first created or registered, as the secret
855 key data needs to be available to derive encryption keys from and similar.
856
857 The `secret` field of the top-level user record contains the following fields:
858
859 `password` → an array of strings, each containing a plain text password.
860
861 `pkcs11Pin` → an array of strings, each containing a plain text PIN, suitable
862 for unlocking PKCS#11 security tokens that require that.
863
864 `pkcs11ProtectedAuthenticationPathPermitted` → a boolean. If set to true allows
865 the receiver to use the PKCS#11 "protected authentication path" (i.e. a
866 physical button/touch element on the security token) for authenticating the
867 user. If false or unset authentication this way shall not be attempted.
868
869 ## Mapping to `struct passwd` and `struct spwd`
870
871 When mapping classic UNIX user records (i.e. `struct passwd` and `struct spwd`)
872 to JSON user records the following mappings should be applied:
873
874 | Structure | Field | Section | Field | Condition |
875 |-----------------|-------------|--------------|------------------------------|----------------------------|
876 | `struct passwd` | `pw_name` | `regular` | `userName` | |
877 | `struct passwd` | `pw_passwd` | `privileged` | `password` | (See notes below) |
878 | `struct passwd` | `pw_uid` | `regular` | `uid` | |
879 | `struct passwd` | `pw_gid` | `regular` | `gid` | |
880 | `struct passwd` | `pw_gecos` | `regular` | `realName` | |
881 | `struct passwd` | `pw_dir` | `regular` | `homeDirectory` | |
882 | `struct passwd` | `pw_shell` | `regular` | `shell` | |
883 | `struct spwd` | `sp_namp` | `regular` | `userName` | |
884 | `struct spwd` | `sp_pwdp` | `privileged` | `password` | (See notes below) |
885 | `struct spwd` | `sp_lstchg` | `regular` | `lastPasswordChangeUSec` | (if `sp_lstchg` > 0) |
886 | `struct spwd` | `sp_lstchg` | `regular` | `passwordChangeNow` | (if `sp_lstchg` == 0) |
887 | `struct spwd` | `sp_min` | `regular` | `passwordChangeMinUSec` | |
888 | `struct spwd` | `sp_max` | `regular` | `passwordChangeMaxUSec` | |
889 | `struct spwd` | `sp_warn` | `regular` | `passwordChangeWarnUSec` | |
890 | `struct spwd` | `sp_inact` | `regular` | `passwordChangeInactiveUSec` | |
891 | `struct spwd` | `sp_expire` | `regular` | `locked` | (if `sp_expire` in [0, 1]) |
892 | `struct spwd` | `sp_expire` | `regular` | `notAfterUSec` | (if `sp_expire` > 1) |
893
894 At this time almost all Linux machines employ shadow passwords, thus the
895 `pw_passwd` field in `struct passwd` is set to `"x"`, and the actual password
896 is stored in the shadow entry `struct spwd`'s field `sp_pwdp`.
897
898 ## Extending These Records
899
900 User records following this specifications are supposed to be extendable for
901 various applications. In general, subsystems are free to introduce their own
902 keys, as long as:
903
904 * Care should be taken to place the keys in the right section, i.e. the most
905 appropriate for the data field.
906
907 * Care should be taken to avoid namespace clashes. Please prefix your fields
908 with a short identifier of your project to avoid ambiguities and
909 incompatibilities.
910
911 * This specification is supposed to be a living specification. If you need
912 additional fields, please consider submitting them upstream for inclusion in
913 this specification. If they are reasonably universally useful, it would be
914 best to list them here.
915
916 ## Examples
917
918 The shortest valid user record looks like this:
919
920 ```json
921 {
922 "userName" : "u"
923 }
924 ```
925
926 A reasonable user record for a system user might look like this:
927
928 ```json
929 {
930 "userName" : "httpd",
931 "uid" : 473,
932 "gid" : 473,
933 "disposition" : "system",
934 "locked" : true
935 }
936 ```
937
938 A fully featured user record associated with a home directory managed by
939 `systemd-homed.service` might look like this:
940
941 ```json
942 {
943 "autoLogin" : true,
944 "binding" : {
945 "15e19cf24e004b949ddaac60c74aa165" : {
946 "fileSystemType" : "ext4",
947 "fileSystemUuid" : "758e88c8-5851-4a2a-b88f-e7474279c111",
948 "gid" : 60232,
949 "homeDirectory" : "/home/grobie",
950 "imagePath" : "/home/grobie.home",
951 "luksCipher" : "aes",
952 "luksCipherMode" : "xts-plain64",
953 "luksUuid" : "e63581ba-79fb-4226-b9de-1888393f7573",
954 "luksVolumeKeySize" : 32,
955 "partitionUuid" : "41f9ce04-c827-4b74-a981-c669f93eb4dc",
956 "storage" : "luks",
957 "uid" : 60232
958 }
959 },
960 "disposition" : "regular",
961 "enforcePasswordPolicy" : false,
962 "lastChangeUSec" : 1565950024279735,
963 "memberOf" : [
964 "wheel"
965 ],
966 "privileged" : {
967 "hashedPassword" : [
968 "$6$WHBKvAFFT9jKPA4k$OPY4D4TczKN/jOnJzy54DDuOOagCcvxxybrwMbe1SVdm.Bbr.zOmBdATp.QrwZmvqyr8/SafbbQu.QZ2rRvDs/"
969 ]
970 },
971 "signature" : [
972 {
973 "data" : "LU/HeVrPZSzi3MJ0PVHwD5m/xf51XDYCrSpbDRNBdtF4fDVhrN0t2I2OqH/1yXiBidXlV0ptMuQVq8KVICdEDw==",
974 "key" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEA/QT6kQWOAMhDJf56jBmszEQQpJHqDsGDMZOdiptBgRk=\n-----END PUBLIC KEY-----\n"
975 }
976 ],
977 "userName" : "grobie",
978 "status" : {
979 "15e19cf24e004b949ddaac60c74aa165" : {
980 "goodAuthenticationCounter" : 16,
981 "lastGoodAuthenticationUSec" : 1566309343044322,
982 "rateLimitBeginUSec" : 1566309342340723,
983 "rateLimitCount" : 1,
984 "state" : "inactive",
985 "service" : "io.systemd.Home",
986 "diskSize" : 161118667776,
987 "diskCeiling" : 190371729408,
988 "diskFloor" : 5242880,
989 "signedLocally" : true
990 }
991 }
992 }
993 ```
994
995 When `systemd-homed.service` manages a home directory it will also include a
996 version of the user record in the home directory itself in the `~/.identity`
997 file. This version lacks the `binding` and `status` sections which are used for
998 local management of the user, but are not intended to be portable between
999 systems. It would hence look like this:
1000
1001 ```json
1002 {
1003 "autoLogin" : true,
1004 "disposition" : "regular",
1005 "enforcePasswordPolicy" : false,
1006 "lastChangeUSec" : 1565950024279735,
1007 "memberOf" : [
1008 "wheel"
1009 ],
1010 "privileged" : {
1011 "hashedPassword" : [
1012 "$6$WHBKvAFFT9jKPA4k$OPY4D4TczKN/jOnJzy54DDuOOagCcvxxybrwMbe1SVdm.Bbr.zOmBdATp.QrwZmvqyr8/SafbbQu.QZ2rRvDs/"
1013 ]
1014 },
1015 "signature" : [
1016 {
1017 "data" : "LU/HeVrPZSzi3MJ0PVHwD5m/xf51XDYCrSpbDRNBdtF4fDVhrN0t2I2OqH/1yXiBidXlV0ptMuQVq8KVICdEDw==",
1018 "key" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEA/QT6kQWOAMhDJf56jBmszEQQpJHqDsGDMZOdiptBgRk=\n-----END PUBLIC KEY-----\n"
1019 }
1020 ],
1021 "userName" : "grobie",
1022 }
1023 ```