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