]>
Commit | Line | Data |
---|---|---|
1 | <?xml version='1.0'?> | |
2 | <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" | |
3 | "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"> | |
4 | <!-- SPDX-License-Identifier: LGPL-2.1+ --> | |
5 | ||
6 | <refentry id="homectl" conditional='ENABLE_HOMED' | |
7 | xmlns:xi="http://www.w3.org/2001/XInclude"> | |
8 | ||
9 | <refentryinfo> | |
10 | <title>homectl</title> | |
11 | <productname>systemd</productname> | |
12 | </refentryinfo> | |
13 | ||
14 | <refmeta> | |
15 | <refentrytitle>homectl</refentrytitle> | |
16 | <manvolnum>1</manvolnum> | |
17 | </refmeta> | |
18 | ||
19 | <refnamediv> | |
20 | <refname>homectl</refname> | |
21 | <refpurpose>Create, remove, change or inspect home directories</refpurpose> | |
22 | </refnamediv> | |
23 | ||
24 | <refsynopsisdiv> | |
25 | <cmdsynopsis> | |
26 | <command>homectl</command> | |
27 | <arg choice="opt" rep="repeat">OPTIONS</arg> | |
28 | <arg choice="req">COMMAND</arg> | |
29 | <arg choice="opt" rep="repeat">NAME</arg> | |
30 | </cmdsynopsis> | |
31 | </refsynopsisdiv> | |
32 | ||
33 | <refsect1> | |
34 | <title>Description</title> | |
35 | ||
36 | <para><command>homectl</command> may be used to create, remove, change or inspect a user's home | |
37 | directory. It's primarily a command interfacing with | |
38 | <citerefentry><refentrytitle>systemd-homed.service</refentrytitle><manvolnum>8</manvolnum></citerefentry> | |
39 | which manages home directories of users.</para> | |
40 | ||
41 | <para>Home directories managed by <filename>systemd-homed.service</filename> are self-contained, and thus | |
42 | include the user's full metadata record in the home's data storage itself, making them easy to migrate | |
43 | between machines. In particular, a home directory describes a matching user record, and every user record | |
44 | managed by <filename>systemd-homed.service</filename> also implies existence and encapsulation of a home | |
45 | directory. The user account and home directory become the same concept.</para> | |
46 | ||
47 | <para>The following backing storage mechanisms are supported:</para> | |
48 | ||
49 | <itemizedlist> | |
50 | <listitem><para>An individual LUKS2 encrypted loopback file for a user, stored in | |
51 | <filename>/home/*.home</filename>. At login the file system contained in this files is mounted, after | |
52 | the LUKS2 encrypted volume has been attached. The user's password is identical to the encryption | |
53 | passphrase of the LUKS2 volume. Access to data without preceeding user authentication is thus not | |
54 | possible, even for the system administrator. This storage mechanism provides the strongest data | |
55 | security and is thus recommended.</para></listitem> | |
56 | ||
57 | <listitem><para>Similar, but the LUKS2 encrypted file system is located on regular block device, such | |
58 | as an USB storage stick. In this mode home directories and all data they include are nicely migratable | |
59 | between machines, simply by plugging the USB stick into different systems at different | |
60 | times.</para></listitem> | |
61 | ||
62 | <listitem><para>An encrypted directory using <literal>fscrypt</literal> on file systems that support it | |
63 | (at the moment this is primarily <literal>ext4</literal>), located in | |
64 | <filename>/home/*.homedir</filename>. This mechanism also provides encryption, but substantially | |
65 | weaker than LUKS2, as most file system metadata is unprotected. Moreover | |
66 | it currently does not support changing user passwords once the home directory has been | |
67 | created.</para></listitem> | |
68 | ||
69 | <listitem><para>A <literal>btrfs</literal> subvolume for each user, also located in | |
70 | <filename>/home/*.homedir</filename>. This provides no encryption, but good quota | |
71 | support.</para></listitem> | |
72 | ||
73 | <listitem><para>A regular directory for each user, also located in | |
74 | <filename>/home/*.homedir</filename>. This provides no encryption, but is a suitable fallback | |
75 | available on all machines, even where LUKS2, <literal>fscrypt</literal> or <literal>btrfs</literal> | |
76 | support is not available.</para></listitem> | |
77 | ||
78 | <listitem><para>An individual Windows file share (CIFS) for each user.</para></listitem> | |
79 | </itemizedlist> | |
80 | ||
81 | <para>Note that <filename>systemd-homed.service</filename> and <command>homectl</command> will not manage | |
82 | "classic" UNIX user accounts as created with <citerefentry | |
83 | project='man-pages'><refentrytitle>useradd</refentrytitle><manvolnum>8</manvolnum></citerefentry> or | |
84 | similar tools. In particular, this functionality is not suitable for managing system users (i.e. users | |
85 | with a UID below 1000) but is exclusive to regular ("human") users.</para> | |
86 | ||
87 | <para>Note that users/home directories managed via <command>systemd-homed.service</command> do not show | |
88 | up in <filename>/etc/passwd</filename> and similar files, they are synthesized via glibc NSS during | |
89 | runtime. They are thus resolvable and may be enumerated via the <citerefentry | |
90 | project='man-pages'><refentrytitle>getent</refentrytitle><manvolnum>1</manvolnum></citerefentry> | |
91 | tool.</para> | |
92 | ||
93 | <para>This tool interfaces directly with <filename>systemd-homed.service</filename>, and may execute | |
94 | specific commands on the home directories it manages. Since every home directory managed that way also | |
95 | defines a JSON user and group record these home directories may also be inspected and enumerated via | |
96 | <citerefentry><refentrytitle>userdbctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>.</para> | |
97 | ||
98 | <para>Home directories managed by <filename>systemd-homed.service</filename> are usually in one of two | |
99 | states, or in a transition state between them: when <literal>active</literal> they are unlocked and | |
100 | mounted, and thus accessible to the system and its programs; when <literal>inactive</literal> they are | |
101 | not mounted and thus not accessible. Activation happens automatically at login of the user and usually | |
102 | can only complete after a password (or other authentication token) has been supplied. Deactivation | |
103 | happens after the user fully logged out. A home directory remains active as long as the user is logged in | |
104 | at least once, i.e. has at least one login session. When the user logs in a second time simultaneously | |
105 | the home directory remains active. It is deactivated only after the last of the user's sessions | |
106 | ends.</para> | |
107 | </refsect1> | |
108 | ||
109 | <refsect1> | |
110 | <title>Options</title> | |
111 | ||
112 | <para>The following general options are understood (further options that control the various properties | |
113 | of user records managed by <filename>systemd-homed.service</filename> are documented further | |
114 | down):</para> | |
115 | ||
116 | <variablelist> | |
117 | ||
118 | <varlistentry> | |
119 | <term><option>--identity=</option><replaceable>FILE</replaceable></term> | |
120 | ||
121 | <listitem><para>Read the user's JSON record from the specified file. If passed as | |
122 | <literal>-</literal> reads the user record from standard input. The supplied JSON object must follow | |
123 | the structure documented on <ulink url="https://systemd.io/USER_RECORDS">JSON User | |
124 | Records</ulink>. This option may be used in conjunction with the <command>create</command> and | |
125 | <command>update</command> commands (see below), where it allows configuring the user record in JSON | |
126 | as-is, instead of setting the individual user record properties (see below).</para></listitem> | |
127 | </varlistentry> | |
128 | ||
129 | <varlistentry> | |
130 | <term><option>--json=</option><replaceable>FORMAT</replaceable></term> | |
131 | <term><option>-J</option></term> | |
132 | ||
133 | <listitem><para>Controls whether to output the user record in JSON format, if the | |
134 | <command>inspect</command> command (see below) is used. Takes one of <literal>pretty</literal>, | |
135 | <literal>short</literal> or <literal>off</literal>. If <literal>pretty</literal> human-friendly | |
136 | whitespace and newlines are inserted in the output to make the JSON data more readable. If | |
137 | <literal>short</literal> all superfluous whitespace is suppressed. If <literal>off</literal> (the | |
138 | default) the user information is not shown in JSON format but in a friendly human readable formatting | |
139 | instead. The <option>-J</option> option picks <literal>pretty</literal> when run interactively and | |
140 | <literal>short</literal> otherwise.</para></listitem> | |
141 | </varlistentry> | |
142 | ||
143 | <varlistentry> | |
144 | <term><option>--export-format=</option><replaceable>FORMAT</replaceable></term> | |
145 | <term><option>-E</option></term> | |
146 | <term><option>-EE</option></term> | |
147 | ||
148 | <listitem><para>When used with the <command>inspect</command> verb in JSON mode (see above) may be | |
149 | used to suppress certain aspects of the JSON user record on output. Specifically, if | |
150 | <literal>stripped</literal> format is used the binding and runtime fields of the record are | |
151 | removed. If <literal>minimal</literal> format is used the cryptographic signature is removed too. If | |
152 | <literal>full</literal> format is used the full JSON record is shown (this is the default). This | |
153 | option is useful for copying an existing user record to a different system in order to create a | |
154 | similar user there with the same settings. Specifically: <command>homectl inspect -EE | ssh | |
155 | root@othersystem homectl create -i-</command> may be used as simple command line for replicating a | |
156 | user on another host. <option>-E</option> is equivalent to <option>-j --export-format=stripped</option>, | |
157 | <option>-EE</option> to <option>-j --export-format=minimal</option>. Note that when replicating user | |
158 | accounts user records acquired in <literal>stripped</literal> mode will retain the original | |
159 | cryptographic signatures and thus may only be modified when the private key to update them is available | |
160 | on the destination machine. When replicating users in <literal>minimal</literal> mode, the signature | |
161 | is removed during the replication and thus the record will be implicitly signed with the key of the destination | |
162 | machine and may be updated there without any private key replication.</para></listitem> | |
163 | </varlistentry> | |
164 | ||
165 | <xi:include href="user-system-options.xml" xpointer="host" /> | |
166 | <xi:include href="user-system-options.xml" xpointer="machine" /> | |
167 | ||
168 | <xi:include href="standard-options.xml" xpointer="no-pager" /> | |
169 | <xi:include href="standard-options.xml" xpointer="no-legend" /> | |
170 | <xi:include href="standard-options.xml" xpointer="no-ask-password" /> | |
171 | <xi:include href="standard-options.xml" xpointer="help" /> | |
172 | <xi:include href="standard-options.xml" xpointer="version" /> | |
173 | </variablelist> | |
174 | </refsect1> | |
175 | ||
176 | <refsect1> | |
177 | <title>User Record Properties</title> | |
178 | ||
179 | <para>The following options control various properties of the user records/home directories that | |
180 | <filename>systemd-homed.service</filename> manages. These switches may be used in conjunction with the | |
181 | <command>create</command> and <command>update</command> commands for configuring various aspects of the | |
182 | home directory and the user account:</para> | |
183 | ||
184 | <variablelist> | |
185 | ||
186 | <varlistentry> | |
187 | <term><option>--real-name=</option><replaceable>NAME</replaceable></term> | |
188 | <term><option>-c</option> <replaceable>NAME</replaceable></term> | |
189 | ||
190 | <listitem><para>The real name for the user. This corresponds with the GECOS field on classic UNIX NSS | |
191 | records.</para></listitem> | |
192 | </varlistentry> | |
193 | ||
194 | <varlistentry> | |
195 | <term><option>--realm=</option><replaceable>REALM</replaceable></term> | |
196 | ||
197 | <listitem><para>The realm for the user. The realm associates a user with a specific organization or | |
198 | installation, and allows distuingishing users of the same name defined in different contexts. The | |
199 | realm can be any string that also qualifies as valid DNS domain name, and it is recommended to use | |
200 | the organization's or installation's domain name for this purpose, but this is not enforced nor | |
201 | required. On each system only a single user of the same name may exist, and if a user with the same | |
202 | name and realm is seen it is assumed to refer to the same user while a user with the same name but | |
203 | different realm is considered a different user. Note that this means that two users sharing the same | |
204 | name but with distinct realms are not allowed on the same system. Assigning a realm to a user is | |
205 | optional.</para></listitem> | |
206 | </varlistentry> | |
207 | ||
208 | <varlistentry> | |
209 | <term><option>--email-address=</option><replaceable>EMAIL</replaceable></term> | |
210 | ||
211 | <listitem><para>Takes an electronic mail address to associate with the user. On log-in the | |
212 | <varname>$EMAIL</varname> environment variable is initialized from this value.</para></listitem> | |
213 | </varlistentry> | |
214 | ||
215 | <varlistentry> | |
216 | <term><option>--location=</option><replaceable>TEXT</replaceable></term> | |
217 | ||
218 | <listitem><para>Takes location specification for this user. This is free-form text, which might or | |
219 | might not be usable by geo-location applications. Example: <option>--location="Berlin, | |
220 | Germany"</option> or <option>--location="Basement, Room 3a"</option></para></listitem> | |
221 | </varlistentry> | |
222 | ||
223 | <varlistentry> | |
224 | <term><option>--icon-name=</option><replaceable>ICON</replaceable></term> | |
225 | ||
226 | <listitem><para>Takes an icon name to associate with the user, following the scheme defined by the <ulink | |
227 | url="https://standards.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html">Icon Naming | |
228 | Specification</ulink>.</para></listitem> | |
229 | </varlistentry> | |
230 | ||
231 | <varlistentry> | |
232 | <term><option>--home-dir=</option><replaceable>PATH</replaceable></term> | |
233 | <term><option>-d</option><replaceable>PATH</replaceable></term> | |
234 | ||
235 | <listitem><para>Takes a path to use as home directory for the user. Note that this is the directory | |
236 | the user's home directory is mounted to while the user is logged in. This is not where the user's | |
237 | data is actually stored, see <option>--image-path=</option> for that. If not specified defaults to | |
238 | <filename>/home/$USER</filename>.</para></listitem> | |
239 | </varlistentry> | |
240 | ||
241 | <varlistentry> | |
242 | <term><option>--uid=</option><replaceable>UID</replaceable></term> | |
243 | ||
244 | <listitem><para>Takes a preferred numeric UNIX UID to assign this user. If a user is to be created | |
245 | with the specified UID and it is already taken by a different user on the local system then creation | |
246 | of the home directory is refused. Note though, if after creating the home directory it is used on a | |
247 | different system and the configured UID is taken by another user there, then | |
248 | <command>systemd-homed</command> may assign the user a different UID on that system. The specified | |
249 | UID must be outside of the system user range. It is recommended to use the 60001…60513 UID range for | |
250 | this purpose. If not specified the UID is automatically picked. When logging in and the home | |
251 | directory is found to be owned by a UID not matching the user's assigned one the home directory and | |
252 | all files and directories inside it will have their ownership changed automatically before login | |
253 | completes.</para> | |
254 | ||
255 | <para>Note that users managed by <command>systemd-homed</command> always have a matching group | |
256 | associated with the same name as well as a GID matching the UID of the user. Thus, configuring the | |
257 | GID separately is not permitted.</para></listitem> | |
258 | </varlistentry> | |
259 | ||
260 | <varlistentry> | |
261 | <term><option>--member-of=</option><replaceable>GROUP</replaceable></term> | |
262 | <term><option>-G</option> <replaceable>GROUP</replaceable></term> | |
263 | ||
264 | <listitem><para>Takes a comma-separated list of auxiliary UNIX groups this user shall belong | |
265 | to. Example: <option>--member-of=wheel</option> to provide the user with administrator | |
266 | privileges. Note that <command>systemd-homed</command> does not manage any groups besides a group | |
267 | matching the user in name and numeric UID/GID. Thus any groups listed here must be registered | |
268 | independently, for example with <citerefentry | |
269 | project='man-pages'><refentrytitle>groupadd</refentrytitle><manvolnum>8</manvolnum></citerefentry>. If | |
270 | non-existant groups that are listed there are ignored. This option may be used more than once, in | |
271 | which case all specified group lists are combined.</para></listitem> | |
272 | </varlistentry> | |
273 | ||
274 | <varlistentry> | |
275 | <term><option>--skel=</option><replaceable>PATH</replaceable></term> | |
276 | ||
277 | <listitem><para>Takes a file system path to a directory. Specifies the skeleton directory to | |
278 | initialize the home directory with. All files and directories in the specified are copied into any | |
279 | newly create home directory. If not specified defaults to | |
280 | <filename>/etc/skel/</filename>.</para></listitem> | |
281 | </varlistentry> | |
282 | ||
283 | <varlistentry> | |
284 | <term><option>--shell=</option><replaceable>SHELL</replaceable></term> | |
285 | ||
286 | <listitem><para>Takes a file system path. Specifies the shell binary to execute on terminal | |
287 | logins. If not specified defaults to <filename>/bin/bash</filename>.</para></listitem> | |
288 | </varlistentry> | |
289 | ||
290 | <varlistentry> | |
291 | <term><option>--setenv=</option><replaceable>VARIABLE</replaceable>=<replaceable>VALUE</replaceable></term> | |
292 | ||
293 | <listitem><para>Takes an environment variable assignment to set for all user processes. Note that a | |
294 | number of other settings also result in environment variables to be set for the user, including | |
295 | <option>--email=</option>, <option>--timezone=</option> and <option>--language=</option>. May be used | |
296 | multiple times to set multiple environment variables.</para></listitem> | |
297 | </varlistentry> | |
298 | ||
299 | <varlistentry> | |
300 | <term><option>--timezone=</option><replaceable>TIMEZONE</replaceable></term> | |
301 | ||
302 | <listitem><para>Takes a timezone specification as string that sets the timezone for the specified | |
303 | user. Expects a `tzdata` location string. When the user logs in the <varname>$TZ</varname> | |
304 | environment variable is initialized from this setting. Example: | |
305 | <option>--timezone=Europe/Amsterdam</option> will result in the environment variable | |
306 | <literal>TZ=:Europe/Amsterdam</literal>.</para></listitem> | |
307 | </varlistentry> | |
308 | ||
309 | <varlistentry> | |
310 | <term><option>--language=</option><replaceable>LANG</replaceable></term> | |
311 | ||
312 | <listitem><para>Takes a specifier indicating the preferred language of the user. The | |
313 | <varname>$LANG</varname> environment variable is initialized from this value on login, and thus a | |
314 | value suitable for this environment variable is accepted here, for example | |
315 | <option>--language=de_DE.UTF8</option></para></listitem> | |
316 | </varlistentry> | |
317 | ||
318 | <varlistentry> | |
319 | <term><option>--ssh-authorized-keys=</option><replaceable>KEYS</replaceable></term> | |
320 | <listitem><para>Either takes a SSH authorized key line to associate with the user record or a | |
321 | <literal>@</literal> character followed by a path to a file to read one or more such lines from. SSH | |
322 | keys configured this way are made available to SSH to permit access to this home directory and user | |
323 | record. This option may be used more than once to configure multiple SSH keys.</para></listitem> | |
324 | </varlistentry> | |
325 | ||
326 | <varlistentry> | |
327 | <term><option>--pkcs11-token-uri=</option><replaceable>URI</replaceable></term> | |
328 | <listitem><para>Takes an RFC 7512 PKCS#11 URI referencing a security token (e.g. YubiKey or PIV | |
329 | smartcard) that shall be able to unlock the user account. The security token URI should reference a | |
330 | security token with exactly one pair of X.509 certificate and private key. A random secret key is | |
331 | then generated, encrypted with the public key of the X.509 certificate, and stored as part of the | |
332 | user record. At login time it is decrypted with the PKCS#11 module and then used to unlock the | |
333 | account and associated resources. See below for an example how to set up authentication with security | |
334 | token.</para></listitem> | |
335 | </varlistentry> | |
336 | ||
337 | <varlistentry> | |
338 | <term><option>--locked=</option><replaceable>BOOLEAN</replaceable></term> | |
339 | ||
340 | <listitem><para>Takes a boolean argument. Specifies whether this user account shall be locked. If | |
341 | true logins into this account are prohibited, if false (the default) they are permitted (of course, | |
342 | only if authorization otherwise succeeds).</para></listitem> | |
343 | </varlistentry> | |
344 | ||
345 | <varlistentry> | |
346 | <term><option>--not-before=</option><replaceable>TIMESTAMP</replaceable></term> | |
347 | <term><option>--not-after=</option><replaceable>TIMESTAMP</replaceable></term> | |
348 | ||
349 | <listitem><para>These options take a timestamp string, in the format documented in | |
350 | <citerefentry><refentrytitle>systemd.time</refentrytitle><manvolnum>7</manvolnum></citerefentry> and | |
351 | configures points in time before and after logins into this account are not | |
352 | permitted.</para></listitem> | |
353 | </varlistentry> | |
354 | ||
355 | <varlistentry> | |
356 | <term><option>--rate-limit-interval=</option><replaceable>SECS</replaceable></term> | |
357 | <term><option>--rate-limit-burst=</option><replaceable>NUMBER</replaceable></term> | |
358 | ||
359 | <listitem><para>Configures a rate limit on authentication attempts for this user. If the user | |
360 | attempts to authenticate more often than the specified number, on a specific system, within the | |
361 | specified time interval authentication is refused until the time interval passes. Defaults to 10 | |
362 | times per 1min.</para></listitem> | |
363 | </varlistentry> | |
364 | ||
365 | <varlistentry> | |
366 | <term><option>--password-hint=</option><replaceable>TEXT</replaceable></term> | |
367 | ||
368 | <listitem><para>Takes a password hint to store alongside the user record. This string is stored | |
369 | accessible only to privileged users and the user itself and may not be queried by other users. | |
370 | Example: <option>--password-hint="My first pet's name"</option></para></listitem> | |
371 | </varlistentry> | |
372 | ||
373 | <varlistentry> | |
374 | <term><option>--enforce-password-policy=</option><replaceable>BOOL</replaceable></term> | |
375 | <term><option>-P</option></term> | |
376 | ||
377 | <listitem><para>Takes a boolean argument. Configures whether to enforce the system's password policy | |
378 | for this user, regarding quality and strength of selected passwords. Defaults to | |
379 | on. <option>-P</option> is short for | |
380 | <option>---enforce-password-policy=no</option>.</para></listitem> | |
381 | </varlistentry> | |
382 | ||
383 | <varlistentry> | |
384 | <term><option>--password-change-now=</option><replaceable>BOOL</replaceable></term> | |
385 | ||
386 | <listitem><para>Takes a boolean argument. If true the user is asked to change their password on next | |
387 | login.</para></listitem> | |
388 | </varlistentry> | |
389 | ||
390 | <varlistentry> | |
391 | <term><option>--password-change-min=</option><replaceable>TIME</replaceable></term> | |
392 | <term><option>--password-change-max=</option><replaceable>TIME</replaceable></term> | |
393 | <term><option>--password-change-warn=</option><replaceable>TIME</replaceable></term> | |
394 | <term><option>--password-change-inactive=</option><replaceable>TIME</replaceable></term> | |
395 | ||
396 | <listitem><para>Each of these options takes a time span specification as argument (in the syntax | |
397 | documented in | |
398 | <citerefentry><refentrytitle>systemd.time</refentrytitle><manvolnum>5</manvolnum></citerefentry>) and | |
399 | configure various aspects of the user's password expiration policy. Specifically, | |
400 | <option>--password-change-min=</option> configures how much time has to pass after changing the | |
401 | password of the user until the password may be changed again. If the user tries to change their | |
402 | password before this time passes the attempt is refused. <option>--password-change-max=</option> | |
403 | configures how much time has to pass after the the password is changed until the password expires and | |
404 | needs to be changed again. After this time passes any attempts to log in may only proceed after the | |
405 | password is changed. <option>--password-change-warn=</option> specifies how much earlier than then | |
406 | the time configured with <option>--password-change-max=</option> the user is warned at login to | |
407 | change their password as it will expire soon. Finally <option>--password-change-inactive=</option> | |
408 | configures the time which has to pass after the password as expired until the user is not permitted | |
409 | to log in or change the password anymore. Note that these options only apply to password | |
410 | authentication, and do not apply to other forms of authentication, for example PKCS#11-based security | |
411 | token authentication.</para></listitem> | |
412 | </varlistentry> | |
413 | ||
414 | <varlistentry> | |
415 | <term><option>--disk-size=</option><replaceable>BYTES</replaceable></term> | |
416 | <listitem><para>Either takes a size in bytes as argument (possibly using the usual K, M, G, … | |
417 | suffixes for 1024 base values), or a percentage value and configures the disk space to assign to the | |
418 | user. If a percentage value is specified (i.e. the argument suffixed with <literal>%</literal>) it is | |
419 | taken relative to the available disk space of the backing file system. If the LUKS2 backend is used | |
420 | this configures the size of the loopback file and file system contained therein. For the other | |
421 | storage backends configures disk quota using the filesystem's native quota logic, if available. If | |
422 | not specified, defaults to 85% of the available disk space for the LUKS2 backend and to no quota for | |
423 | the others.</para></listitem> | |
424 | </varlistentry> | |
425 | ||
426 | <varlistentry> | |
427 | <term><option>--access-mode=</option><replaceable>MODE</replaceable></term> | |
428 | ||
429 | <listitem><para>Takes a UNIX file access mode written in octal. Configures the access mode of the | |
430 | home directory itself. Note that this is only used when the directory is first created, and the user | |
431 | may change this any time afterwards. Example: | |
432 | <option>--access-mode=0700</option></para></listitem> | |
433 | </varlistentry> | |
434 | ||
435 | <varlistentry> | |
436 | <term><option>--umask=</option><replaceable>MASK</replaceable></term> | |
437 | ||
438 | <listitem><para>Takes the access mode mask (in octal syntax) to apply to newly created files and | |
439 | directories of the user ("umask"). If set this controls the initial umask set for all login sessions of | |
440 | the user, possibly overriding the system's defaults.</para></listitem> | |
441 | </varlistentry> | |
442 | ||
443 | <varlistentry> | |
444 | <term><option>--nice=</option><replaceable>NICE</replaceable></term> | |
445 | ||
446 | <listitem><para>Takes the numeric scheduling priority ("nice level") to apply to the processes of the user at login | |
447 | time. Takes a numeric value in the range -20 (highest priority) to 19 (lowest priority).</para></listitem> | |
448 | </varlistentry> | |
449 | ||
450 | <varlistentry> | |
451 | <term><option>--rlimit=</option><replaceable>LIMIT</replaceable>=<replaceable>VALUE</replaceable><optional>:<replaceable>VALUE</replaceable></optional></term> | |
452 | ||
453 | <listitem><para>Allows configuration of resource limits for processes of this user, see <citerefentry | |
454 | project='man-pages'><refentrytitle>getrlimit</refentrytitle><manvolnum>2</manvolnum></citerefentry> | |
455 | for details. Takes a resource limit name (e.g. <literal>LIMIT_NOFILE</literal>) followed by an equal | |
456 | sign, followed by a numeric limit. Optionally, separated by colon a second numeric limit may be | |
457 | specified. If two are specified this refers to the soft and hard limits, respectively. If only one | |
458 | limit is specified the setting sets both limits in one.</para></listitem> | |
459 | </varlistentry> | |
460 | ||
461 | <varlistentry> | |
462 | <term><option>--tasks-max=</option><replaceable>TASKS</replaceable></term> | |
463 | ||
464 | <listitem><para>Takes a non-zero unsigned integer as argument. Configures the maximum numer of tasks | |
465 | (i.e. processes and threads) the user may have at any given time. This limit applies to all tasks | |
466 | forked off the user's sessions, even if they change user identity via <citerefentry | |
467 | project='man-pages'><refentrytitle>su</refentrytitle><manvolnum>1</manvolnum></citerefentry> or a | |
468 | similar tool. Use <option>--rlimit=LIMIT_NPROC=</option> to place a limit on the tasks actually | |
469 | running under the UID of the user, thus excluding any child processes that might have changed user | |
470 | identity. This controls the <varname>TasksMax=</varname> settting of the per-user systemd slice unit | |
471 | <filename>user-$UID.slice</filename>. See | |
472 | <citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>5</manvolnum></citerefentry> | |
473 | for further details.</para></listitem> | |
474 | </varlistentry> | |
475 | ||
476 | <varlistentry> | |
477 | <term><option>--memory-high=</option><replaceable>BYTES</replaceable></term> | |
478 | <term><option>--memory-max=</option><replaceable>BYTES</replaceable></term> | |
479 | ||
480 | <listitem><para>Set a limit on the memory a user may take up on a system at any given time in bytes | |
481 | (the usual K, M, G, … suffixes are supported, to the base of 1024). This includes all memory used by | |
482 | the user itself and all processes they forked off that changed user credentials. This controls the | |
483 | <varname>MemoryHigh=</varname> and <varname>MemoryMax=</varname> settings of the per-user systemd | |
484 | slice unit <filename>user-$UID.slice</filename>. See | |
485 | <citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>5</manvolnum></citerefentry> | |
486 | for further details.</para></listitem> | |
487 | </varlistentry> | |
488 | ||
489 | <varlistentry> | |
490 | <term><option>--cpu-weight=</option><replaceable>WEIGHT</replaceable></term> | |
491 | <term><option>--io-weight=</option><replaceable>WEIGHT</replaceable></term> | |
492 | ||
493 | <listitem><para>Set a CPU and IO scheduling weights of the processes of the user, including those of | |
494 | processes forked off by the user that changed user credentials. Takes a numeric value in the range | |
495 | 1…10000. This controls the <varname>CPUWeight=</varname> and <varname>IOWeight=</varname> settings of | |
496 | the per-user systemd slice unit <filename>user-$UID.slice</filename>. See | |
497 | <citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>5</manvolnum></citerefentry> | |
498 | for further details.</para></listitem> | |
499 | </varlistentry> | |
500 | ||
501 | <varlistentry> | |
502 | <term><option>--storage=</option><replaceable>STORAGE</replaceable></term> | |
503 | ||
504 | <listitem><para>Selects the storage mechanism to use for this home directory. Takes one of | |
505 | <literal>luks</literal>, <literal>fscrypt</literal>, <literal>directory</literal>, | |
506 | <literal>subvolume</literal>, <literal>cifs</literal>. For details about these mechanisms, see | |
507 | above. If a new home directory is created and the storage type is not specifically specified defaults | |
508 | to <literal>luks</literal> if supported, <literal>subvolume</literal> as first fallback if supported, | |
509 | and <literal>directory</literal> if not.</para></listitem> | |
510 | </varlistentry> | |
511 | ||
512 | <varlistentry> | |
513 | <term><option>--image-path=</option><replaceable>PATH</replaceable></term> | |
514 | ||
515 | <listitem><para>Takes a file system path. Configures where to place the user's home directory. When | |
516 | LUKS2 storage is used refers to the path to the loopback file, otherwise to the path to the home | |
517 | directory. When unspecified defaults to <filename>/home/$USER.home</filename> when LUKS storage is | |
518 | used and <filename>/home/$USER.homedir</filename> for the other storage mechanisms. Not defined for | |
519 | the <literal>cifs</literal> storage mechanism. To use LUKS2 storage on a regular block device (for | |
520 | example a USB stick) pass the path to the block device here.</para></listitem> | |
521 | </varlistentry> | |
522 | ||
523 | <varlistentry> | |
524 | <term><option>--fs-type=</option><replaceable>TYPE</replaceable></term> | |
525 | ||
526 | <listitem><para>When LUKS2 storage is used configures the file system type to use inside the home | |
527 | directory LUKS2 container. One of <literal>ext4</literal>, <literal>xfs</literal>, | |
528 | <literal>btrfs</literal>. If not specified defaults to <literal>ext4</literal>. Note that | |
529 | <literal>xfs</literal> is not recommended as its support for file system resizing is too | |
530 | limited.</para></listitem> | |
531 | </varlistentry> | |
532 | ||
533 | <varlistentry> | |
534 | <term><option>--luks-discard=</option><replaceable>BOOL</replaceable></term> | |
535 | ||
536 | <listitem><para>When LUKS2 storage is used configures whether to enable the | |
537 | <literal>discard</literal> feature of the file system. If enabled the file system on top of the LUKS2 | |
538 | volume will report empty block information to LUKS2 and the loopback file below, ensuring that empty | |
539 | space in the home directory is returned to the backing file system below the LUKS2 volume, resulting | |
540 | in a "sparse" loopback file. This option mostly defaults to off, since this permits over-committing | |
541 | home directories which results in I/O errors if the underlying file system runs full while the upper | |
542 | file system wants to allocate a block. Such I/O errors are generally not handled well by file systems | |
543 | nor applications. When LUKS2 storage is used on top of regular block devices (instead of on top a | |
544 | loopback file) the discard logic defaults to on.</para></listitem> | |
545 | </varlistentry> | |
546 | ||
547 | <varlistentry> | |
548 | <term><option>--luks-cipher=</option><replaceable>CIPHER</replaceable></term> | |
549 | <term><option>--luks-cipher-mode=</option><replaceable>MODE</replaceable></term> | |
550 | <term><option>--luks-volume-key-size=</option><replaceable>BITS</replaceable></term> | |
551 | <term><option>--luks-pbkdf-type=</option><replaceable>TYPE</replaceable></term> | |
552 | <term><option>--luks-pbkdf-hash-algorithm=</option><replaceable>ALGORITHM</replaceable></term> | |
553 | <term><option>--luks-pbkdf-time-cost=</option><replaceable>SECONDS</replaceable></term> | |
554 | <term><option>--luks-pbkdf-memory-cost=</option><replaceable>BYTES</replaceable></term> | |
555 | <term><option>--luks-pbkdf-parallel-threads=</option><replaceable>THREADS</replaceable></term> | |
556 | ||
557 | <listitem><para>Configures various cryptographic parameters for the LUKS2 storage mechanism. See | |
558 | <citerefentry | |
559 | project='man-pages'><refentrytitle>cryptsetup</refentrytitle><manvolnum>8</manvolnum></citerefentry> | |
560 | for details on the specific attributes.</para></listitem> | |
561 | </varlistentry> | |
562 | ||
563 | <varlistentry> | |
564 | <term><option>--nosuid=</option><replaceable>BOOL</replaceable></term> | |
565 | <term><option>--nodev=</option><replaceable>BOOL</replaceable></term> | |
566 | <term><option>--noexec=</option><replaceable>BOOL</replaceable></term> | |
567 | ||
568 | <listitem><para>Configures the <literal>nosuid</literal>, <literal>nodev</literal> and | |
569 | <literal>noexec</literal> mount options for the home directories. By default <literal>nodev</literal> | |
570 | and <literal>nosuid</literal> are on, while <literal>noexec</literal> is off. For details about these | |
571 | mount options see <citerefentry | |
572 | project='man-pages'><refentrytitle>mount</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para></listitem> | |
573 | </varlistentry> | |
574 | ||
575 | <varlistentry> | |
576 | <term><option>--cifs-domain=</option><replaceable>DOMAIN</replaceable></term> | |
577 | <term><option>--cifs-user-name=</option><replaceable>USER</replaceable></term> | |
578 | <term><option>--cifs-service=</option><replaceable>SERVICE</replaceable></term> | |
579 | ||
580 | <listitem><para>Configures the Windows File Sharing (CIFS) domain and user to associate with the home | |
581 | directory/user account, as well as the file share ("service") to mount as directory. The latter is used when | |
582 | <literal>cifs</literal> storage is selected.</para></listitem> | |
583 | </varlistentry> | |
584 | ||
585 | <varlistentry> | |
586 | <term><option>--stop-delay=</option><replaceable>SECS</replaceable></term> | |
587 | ||
588 | <listitem><para>Configures the time the per-user service manager shall continue to run after the all | |
589 | sessions of the user ended. The default is configured in | |
590 | <citerefentry><refentrytitle>logind.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry> (for | |
591 | home directories of LUKS2 storage located on removable media this defaults to 0 though). A longer | |
592 | time makes sure quick, repetitive logins are more efficient as the user's service manager doesn't | |
593 | have to be started every time.</para></listitem> | |
594 | </varlistentry> | |
595 | ||
596 | <varlistentry> | |
597 | <term><option>--kill-processes=</option><replaceable>BOOL</replaceable></term> | |
598 | ||
599 | <listitem><para>Configures whether to kill all processes of the user on logout. The default is | |
600 | configured in | |
601 | <citerefentry><refentrytitle>logind.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>.</para></listitem> | |
602 | </varlistentry> | |
603 | ||
604 | <varlistentry> | |
605 | <term><option>--auto-login=</option><replaceable>BOOL</replaceable></term> | |
606 | ||
607 | <listitem><para>Takes a boolean argument. Configures whether the graphical UI of the system should | |
608 | automatically log this user in if possible. Defaults to off. If less or more than one user is marked | |
609 | this way automatic login is disabled.</para></listitem> | |
610 | </varlistentry> | |
611 | </variablelist> | |
612 | </refsect1> | |
613 | ||
614 | <refsect1> | |
615 | <title>Commands</title> | |
616 | ||
617 | <para>The following commands are understood:</para> | |
618 | ||
619 | <variablelist> | |
620 | ||
621 | <varlistentry> | |
622 | <term><command>list</command></term> | |
623 | ||
624 | <listitem><para>List all home directories (along with brief details) currently managed by | |
625 | <filename>systemd-homed.service</filename>. This command is also executed if none is specified on the | |
626 | command line. (Note that the list of users shown by this command does not include users managed by | |
627 | other subsystems, such as system users or any traditional users listed in | |
628 | <filename>/etc/passwd</filename>.)</para></listitem> | |
629 | </varlistentry> | |
630 | ||
631 | <varlistentry> | |
632 | <term><command>activate</command> <replaceable>USER</replaceable> [<replaceable>USER…</replaceable>]</term> | |
633 | ||
634 | <listitem><para>Activate one or more home directories. The home directories of each listed user will | |
635 | be activated and made available under their mount points (typically in | |
636 | <filename>/home/$USER</filename>). Note that any home activated this way stays active indefinitely, | |
637 | until it is explicitly deactivated again (with <command>deactivate</command>, see below), or the user | |
638 | logs in and out again and it thus is deactivated due to the automatic deactivation-on-logout | |
639 | logic.</para> | |
640 | ||
641 | <para>Activation of a home directory involves various operations that depend on the selected storage | |
642 | mechanism. If the LUKS2 mechanism is used, this generally involves: inquiring the user for a | |
643 | password, setting up a loopback device, validating and activating the LUKS2 volume, checking the file | |
644 | system, mounting the file system, and potentiatlly changing the ownership of all included files to | |
645 | the correct UID/GID.</para></listitem> | |
646 | </varlistentry> | |
647 | ||
648 | <varlistentry> | |
649 | <term><command>deactivate</command> <replaceable>USER</replaceable> [<replaceable>USER…</replaceable>]</term> | |
650 | ||
651 | <listitem><para>Deactivate one or more home directories. This undoes the effect of | |
652 | <command>activate</command>.</para></listitem> | |
653 | </varlistentry> | |
654 | ||
655 | <varlistentry> | |
656 | <term><command>inspect</command> <replaceable>USER</replaceable> [<replaceable>USER…</replaceable>]</term> | |
657 | ||
658 | <listitem><para>Show various details about the specified home directories. This shows various | |
659 | information about the home directory and its user account, including runtime data such as current | |
660 | state, disk use and similar. Combine with <option>--json=</option> to show the detailed JSON user | |
661 | record instead, possibly combined with <option>--export-format=</option> to suppress certain aspects | |
662 | of the output.</para></listitem> | |
663 | </varlistentry> | |
664 | ||
665 | <varlistentry> | |
666 | <term><command>authenticate</command> <replaceable>USER</replaceable> [<replaceable>USER…</replaceable>]</term> | |
667 | ||
668 | <listitem><para>Validate authentication credentials of a home directory. This queries the caller for | |
669 | a password (or similar) and checks that it correctly unlocks the home directory. This leaves the home | |
670 | directory in the state it is in, i.e. it leaves the home directory in inactive state if it was | |
671 | inactive before, and in active state if it was active before.</para></listitem> | |
672 | </varlistentry> | |
673 | ||
674 | <varlistentry> | |
675 | <term><command>create</command> <replaceable>USER</replaceable></term> | |
676 | <term><command>create</command> <option>--identity=</option><replaceable>PATH</replaceable> <optional><replaceable>USER</replaceable></optional></term> | |
677 | ||
678 | <listitem><para>Create a new home directory/user account of the specified name. Use the various | |
679 | user record property options (as documented above) to control various aspects of the home directory | |
680 | and its user accounts.</para> | |
681 | ||
682 | <para>The specified user name should follow the strict syntax described on <ulink | |
683 | url="https://systemd.io/USER_NAMES">User/Group Name Syntax</ulink>.</para></listitem> | |
684 | </varlistentry> | |
685 | ||
686 | <varlistentry> | |
687 | <term><command>remove</command> <replaceable>USER</replaceable></term> | |
688 | ||
689 | <listitem><para>Remove a home directory/user account. This will remove both the home directory's user | |
690 | record and the home directory itself, and thus delete all files and directories owned by the | |
691 | user.</para></listitem> | |
692 | </varlistentry> | |
693 | ||
694 | <varlistentry> | |
695 | <term><command>update</command> <replaceable>USER</replaceable></term> | |
696 | <term><command>update</command> <option>--identity=</option><replaceable>PATH</replaceable> <optional><replaceable>USER</replaceable></optional></term> | |
697 | ||
698 | <listitem><para>Update a home directory/user account. Use the various user record property options | |
699 | (as documented above) to make changes to the account, or alternatively provide a full, updated JSON | |
700 | user record via the <option>--identity=</option> option.</para> | |
701 | ||
702 | <para>Note that changes to user records not signed by a cryptographic private key available locally | |
703 | are not permitted, unless <option>--identity=</option> is used with a user record that is already | |
704 | correctly signed by a recognized private key.</para></listitem> | |
705 | </varlistentry> | |
706 | ||
707 | <varlistentry> | |
708 | <term><command>passwd</command> <replaceable>USER</replaceable></term> | |
709 | ||
710 | <listitem><para>Change the password of the specified home direcory/user account.</para></listitem> | |
711 | </varlistentry> | |
712 | ||
713 | <varlistentry> | |
714 | <term><command>resize</command> <replaceable>USER</replaceable> <replaceable>BYTES</replaceable></term> | |
715 | ||
716 | <listitem><para>Change the disk space assigned to the specified home directory. If the LUKS2 storage | |
717 | mechanism is used this will automatically resize the loopback file and the file system contained | |
718 | within. Note that if <literal>ext4</literal> is used inside of the LUKS2 volume, it is necessary to | |
719 | deactivate the home directory before shrinking it (i.e the user has to log out). Growing can be done | |
720 | while the home directory is active. If <literal>xfs</literal> is used inside of the LUKS2 volume the | |
721 | home directory may not be shrunk whatsoever. On all three of <literal>ext4</literal>, | |
722 | <literal>xfs</literal> and <literal>btrfs</literal> the home directory may be grown while the user is | |
723 | logged in, and on the latter also shrunk while the user is logged in. If the | |
724 | <literal>subvolume</literal>, <literal>directory</literal>, <literal>fscrypt</literal> storage | |
725 | mechanisms are used, resizing will change file system quota.</para></listitem> | |
726 | </varlistentry> | |
727 | ||
728 | <varlistentry> | |
729 | <term><command>lock</command> <replaceable>USER</replaceable></term> | |
730 | ||
731 | <listitem><para>Temporarily suspend access to the user's home directory and remove any associated | |
732 | cryptographic keys from memory. Any attempts to access the user's home directory will stall until the | |
733 | home directory is unlocked again (i.e. re-authenticated). This functionality is primarily intended to | |
734 | be used during system suspend to make sure the user's data cannot be accessed until the user | |
735 | re-authenticates on resume. This operation is only defined for home directories that use the LUKS2 | |
736 | storage mechanism.</para></listitem> | |
737 | </varlistentry> | |
738 | ||
739 | <varlistentry> | |
740 | <term><command>unlock</command> <replaceable>USER</replaceable></term> | |
741 | ||
742 | <listitem><para>Resume access to the user's home directory again, undoing the effect of | |
743 | <command>lock</command> above. This requires authentication of the user, as the cryptographic keys | |
744 | required for access to the home directory need to be reacquired.</para></listitem> | |
745 | </varlistentry> | |
746 | ||
747 | <varlistentry> | |
748 | <term><command>lock-all</command></term> | |
749 | ||
750 | <listitem><para>Execute the <command>lock</command> command on all suitable home directories at | |
751 | once. This operation is generally executed on system suspend (i.e. by <command>systemctl | |
752 | suspend</command> and related commands), to ensure all active user's cryptographic keys for accessing | |
753 | their home directories are removed from memory.</para></listitem> | |
754 | </varlistentry> | |
755 | ||
756 | <varlistentry> | |
757 | <term><command>with</command> <replaceable>USER</replaceable> <replaceable>COMMAND…</replaceable></term> | |
758 | ||
759 | <listitem><para>Activate the specified user's home directory, run the specified command (under the | |
760 | caller's identity, not the specified user's) and deactivate the home directory afterwards again | |
761 | (unless the user is logged in otherwise). This command is useful for running privileged backup | |
762 | scripts and such, but requires authentication with the user's credentials in order to be able to | |
763 | unlock the user's home directory.</para></listitem> | |
764 | </varlistentry> | |
765 | </variablelist> | |
766 | </refsect1> | |
767 | ||
768 | <refsect1> | |
769 | <title>Exit status</title> | |
770 | ||
771 | <para>On success, 0 is returned, a non-zero failure code otherwise.</para> | |
772 | </refsect1> | |
773 | ||
774 | <xi:include href="less-variables.xml" /> | |
775 | ||
776 | <refsect1> | |
777 | <title>Examples</title> | |
778 | ||
779 | <example> | |
780 | <title>Create a user <literal>waldo</literal> in the administrator group <literal>wheel</literal>, and | |
781 | assign 500 MiB disk space to them.</title> | |
782 | ||
783 | <programlisting>homectl create waldo --real-name="Waldo McWaldo" -G wheel --disk-size=500M</programlisting> | |
784 | </example> | |
785 | ||
786 | <example> | |
787 | <title>Create a user <literal>wally</literal> on a USB stick, and assign a maximum of 500 concurrent | |
788 | tasks to them.</title> | |
789 | ||
790 | <programlisting>homectl create wally --real-name="Wally McWally" --image-path=/dev/disk/by-id/usb-SanDisk_Ultra_Fit_476fff954b2b5c44-0:0 --tasks-max=500</programlisting> | |
791 | </example> | |
792 | ||
793 | <example> | |
794 | <title>Change nice level of user <literal>odlaw</literal> to +5 and make sure the environment variable | |
795 | <varname>$SOME</varname> is set to the string <literal>THING</literal> for them on login.</title> | |
796 | ||
797 | <programlisting>homectl update odlaw --nice=5 --setenv=SOME=THING</programlisting> | |
798 | </example> | |
799 | ||
800 | <example> | |
801 | <title>Set up authentication with a YubiKey security token:</title> | |
802 | ||
803 | <programlisting># Clear the Yubikey from any old keys (careful!) | |
804 | ykman piv reset | |
805 | ||
806 | # Generate a new private/public key pair on the device, store the public key in 'pubkey.pem'. | |
807 | ykman piv generate-key -a RSA2048 9d pubkey.pem | |
808 | ||
809 | # Create a self-signed certificate from this public key, and store it on the device. | |
810 | ykman piv generate-certificate --subject "Knobelei" 9d pubkey.pem | |
811 | ||
812 | # We don't need the publibc key on disk anymore | |
813 | rm pubkey.pem | |
814 | ||
815 | # Check if the newly create key on the Yubikey shows up as token in PKCS#11. Have a look at the output, and | |
816 | # copy the resulting token URI to the clipboard. | |
817 | p11tool --list-tokens | |
818 | ||
819 | # Allow the security token referenced by the determined PKCS#11 URI to unlock the account of user | |
820 | # 'lafcadio'. (Replace the '…' by the URI from the clipboard.) | |
821 | homectl update lafcadio --pkcs11-token-uri=…</programlisting> | |
822 | </example> | |
823 | </refsect1> | |
824 | ||
825 | <refsect1> | |
826 | <title>See Also</title> | |
827 | <para> | |
828 | <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>, | |
829 | <citerefentry><refentrytitle>systemd-homed.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>, | |
830 | <citerefentry><refentrytitle>userdbctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>, | |
831 | <citerefentry project='man-pages'><refentrytitle>useradd</refentrytitle><manvolnum>8</manvolnum></citerefentry>, | |
832 | <citerefentry project='man-pages'><refentrytitle>cryptsetup</refentrytitle><manvolnum>8</manvolnum></citerefentry> | |
833 | </para> | |
834 | </refsect1> | |
835 | ||
836 | </refentry> |