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