「Systemd-homed」の版間の差分
細 (→ユーティリティ: 英語版に合わせて修正。) |
Kusanaginoturugi (トーク | 投稿記録) (→参照: update TranslationStatus.) |
||
(4人の利用者による、間の36版が非表示) | |||
1行目: | 1行目: | ||
− | {{ |
+ | {{Lowercase title}} |
[[Category:セキュリティ]] |
[[Category:セキュリティ]] |
||
[[en:Systemd-homed]] |
[[en:Systemd-homed]] |
||
10行目: | 10行目: | ||
{{Related articles end}} |
{{Related articles end}} |
||
− | + | {{man|8|systemd-homed}} は、現在のシステム構成に依存しないポータブルなユーザーアカウントを提供する [[systemd]] サービスです。 |
|
− | ポータビリティを実現するために、systemd-homed は全てのユーザー関連情報をストレージメディアに移動して、 |
+ | ポータビリティを実現するために、systemd-homed は全てのユーザー関連情報をストレージメディアに移動して、オプションで暗号化を行い、ユーザーに関する署名済み情報 (パスワードやユーザーが属するグループ、UID/GID、その他 {{ic|/}} に散在する情報) を含む {{ic|~/.identity}} ファイルを作成します。 |
− | ポータブルなホームディレクトリを可能にするだけではなく、ログイン時に |
+ | ポータブルなホームディレクトリを可能にするだけではなく、自動的にログイン時にホームディレクトリの暗号化を管理し、システムのサスペンド時にフォルダにロックすることでセキュリティも確保されます。 |
== インストール == |
== インストール == |
||
− | ''systemd-homed'' は {{Pkg|systemd}} に含まれています。 |
+ | ''systemd-homed'' は {{Pkg|systemd}} に含まれています。{{Pkg|pambase}} パッケージのバージョン 20200721.1-2 以降には、systemd-homed のユーザーセッションで必要となる [[PAM#設定|PAMの設定]] が付属しています。 |
− | == |
+ | == 使い方 == |
+ | {{ic|systemd-homed.service}} サービスを [[起動/有効化]] します。 |
||
− | === homectl === |
||
+ | === ユーティリティ === |
||
− | homectl を使うことでユーザーを作成・更新・調査して、ホームディレクトリと {{man|8|systemd-homed}} サービスで管理される {{ic|~/.identity}} を作成することができます。 |
||
+ | ==== homectl ==== |
||
− | 最初の空きの UID を使用して、'username' という名前のユーザーを作成 (同じ名前のグループを作成して GID と UID を同じにして ''username'' をグループのメンバーに設定し、デフォルトシェルを {{ic|/bin/bash}} に設定): |
||
+ | ''homectl'' は、homed で使用する主なユーティリティです。このユーティリティを使えば、ユーザ、ホームディレクトリ、{{man|8|systemd-homed}} サービスによって管理されている {{ic|~/.identity}} ファイルを作成、更新、調査することができます。 |
||
− | # homectl create username |
||
+ | ''homectl'' の最も単純な使用例は: |
||
− | 上記のコマンドでホームディレクトリのマウントポイントは {{ic|/home/''username''}} に設定されます。ストレージ方式は次の順番で選択されます: |
||
+ | # homectl create ''username'' |
||
− | # {{ic|luks}}: LUKS がサポートされている場合。 |
||
− | # {{ic|サブボリューム}}: LUKS がサポートされておらず、サブボリュームはサポートされている場合。 |
||
− | # {{ic|ディレクトリ}}: 上のいずれもサポートされておらず他のマニュアルのオプションでも指定されていない場合。 |
||
+ | このコマンドはユーザを作成します。ユーザ名は ''username'' で、UID は [https://systemd.io/UIDS-GIDS/ 60001–60513 の範囲]で使用されていないものになります。さらに、同じ名前のグループを作成し、GID は先の UID と同じになり、作成したユーザはこのグループに追加されます。そして、ユーザのデフォルトシェルは {{ic|/bin/bash}} に設定されます。 |
||
− | '''LUKS''' のイメージパスは {{ic|/home/''username''.home}} に、'''ディレクトリ'''のディレクトリパスは {{ic|/home/''username''.homedir}} に設定されます。 |
||
+ | ホームディレクトリのマウントポイントは {{ic|/home/''username''}} に設定されます。ストレージ方式は以下の順番で選択されます: |
||
− | {{Note| '''homectl''' は systemd-homedが管理し該当する名前とユーザーの ID 以外には、グループの作成・削除を管理しません。古典的なツールを使ってください。}} |
||
+ | # {{ic|luks}}: サポートされている場合。 |
||
− | {{Warning|{{ic|~/.identity}} ファイルは署名されるためテキストエディタを使って直接編集してはありません。署名が破壊され不正なファイルとなってしまいます。編集するときは {{ic|1=homectl update --identity=/path/to/.identity}} を使ってください。}} |
||
+ | # {{ic|subvolume}}: LUKS がサポートされておらず、サブボリュームはサポートされている場合。 |
||
+ | # {{ic|directory}}: 上記のいずれもサポートされておらず、手動で他のオプションも指定されていない場合。 |
||
+ | LUKS 方式でのイメージのパスは、{{ic|/home/''username''.home}} に設定されます。ディレクトリ方式でのディレクトリのパスは、{{ic|/home/''username''.homedir}} に設定されます。 |
||
− | === userdbctl === |
||
− | + | {{Note|''homectl'' は、systemd-homed によって管理されているユーザの名前と ID に一致するユーザ以外は、グループの作成や削除を管理しません。}} |
|
+ | {{Warning|{{ic|~/.identity}} ファイルは署名されているため、テキストエディタを使って直接編集してはいけません。署名が破壊され不正なファイルとなってしまいます。編集するときは {{ic|1=homectl update --identity=/path/to/.identity}} を使ってください。}} |
||
− | == ストレージ方式 == |
||
+ | ==== userdbctl ==== |
||
− | === [[LUKS]] ホームディレクトリ === |
||
+ | 古典的な UNIX のユーザー管理機構と [[systemd-homed]] の両方によって提供されているユーザー、グループ、グループのメンバーを調査するためのクエリツール。 |
||
− | ユーザーのホームディレクトリはループバックファイルあるいはリムーバルメディアの [[LUKS]] ボリューム内の Linux [[ファイルシステム]]に保存されます。この方式を使う際は {{ic|1=--storage=luks}} を '''homectl''' に指定してください。 |
||
+ | |||
+ | === ストレージ方式 === |
||
+ | |||
+ | ==== LUKS ホームディレクトリ ==== |
||
+ | |||
+ | ユーザーのホームディレクトリは、ループバックファイルあるいはリムーバルメディア内の暗号化された [[LUKS]] (''Linux Unified Key Setup'') ボリューム内の Linux [[ファイルシステム]]に保存されます。この方式を使う際は {{ic|1=--storage=luks}} を ''homectl'' で指定してください。 |
||
リムーバルメディアを使う場合は以下の条件を満たす必要があります: |
リムーバルメディアを使う場合は以下の条件を満たす必要があります: |
||
− | * イメージには GPT パーティションテーブルが |
+ | * イメージには GPT パーティションテーブルが含まれていること。現在のところ、イメージに含まれるパーティションは1つだけである必要があり、かつそのパーティションのタイプ UUID は {{ic|773f91ef-66d4-49b5-bd83-d683bf40ad16}} でなければなりません。そのパーティションのラベルはユーザ名と同じでなければなりません。 |
− | * パーティションには LUKS2 ボリュームが必要で、ラベルがユーザー名と一致している必要があります。LUKS2 ボリュームには systemd-homed タイプの LUKS2 トークンフィールドが必要です。このトークンの JSON データには base64 でエンコードされたデータを含むレコードフィールドが必要です。このデータは JSON のユーザーレコードであり、{{ic|~/.identity}} と同じようにシリアライ |
+ | * パーティションには LUKS2 ボリュームが必要で、ラベルがユーザー名と一致している必要があります。LUKS2 ボリュームには systemd-homed タイプの LUKS2 トークンフィールドが必要です。このトークンの JSON データには base64 でエンコードされたデータを含むレコードフィールドが必要です。このデータは JSON のユーザーレコードであり、暗号化されてはいますが、{{ic|~/.identity}} と同じようにシリアライズ化されています。このトークンの JSON データには iv フィールドも必要で、暗号化のための base64 でエンコードされたバイナリ初期化ベクタが含まれていなければなりません。LUKS2 ボリュームが使用するのと同じ暗号化が使われ、同じボリュームキーで解錠されますが、自己の IV を使います。 |
+ | * LUKS2 ボリュームの中は [[ext4]]、[[btrfs]]、[[XFS]] のいずれかの Linux ファイルシステムである必要があり、ファイルシステムのラベルはユーザー名と同じでなければなりません。 |
||
+ | * このファイルシステムにはユーザーと同じ名前のディレクトリが含まれている必要があります。このディレクトリがログイン時にユーザーのホームディレクトリになります。他のストレージ方式と同じように {{ic|~/.identity}} ファイルにユーザーレコードのコピーを保持します。 |
||
+ | {{Warning| 強制的または予期せぬシャットダウンや停電の場合、ループバックファイルが汚れた状態で残される可能性があり、これによりユーザーが永久にロックアウトされることがあります。詳細は[[# ホームディレクトリが汚い状態にある]]を参照してください。}} |
||
− | * LUKS2 ボリュームの中は [[ext4]], [[btrfs]], [[XFS]] のいずれかの Linux ファイルシステムである必要があり、ファイルシステムのラベルはユーザー名でなければなりません。 |
||
+ | ==== fscrypt ディレクトリ ==== |
||
− | * ファイルシステムにはユーザーと同じ名前のディレクトリが必要です。このディレクトリがログイン時にユーザーのホームディレクトリになります。他のストレージ方式と同じように {{ic|~/.identity}} ファイルにユーザーレコードのコピーを保持します。 |
||
+ | 上記の方法と同じようにユーザーのホームディレクトリが保存されますが、ファイルシステムネイティブの暗号化が使われます。この方式を使う場合は {{ic|1=--storage=fscrypt}} を ''homectl'' で指定してください。 |
||
− | === [[fscrypt]] ディレクトリ === |
||
{{Tip|fscrypt をサポートしているファイルシステムには [[ext4]] や [[F2FS]] があります。}} |
{{Tip|fscrypt をサポートしているファイルシステムには [[ext4]] や [[F2FS]] があります。}} |
||
− | 上記の方法と同じようにユーザーのホームディレクトリが保存されますが、ファイルシステムネイティブの暗号化が使われます。この方式を使う場合は {{ic|1=--storage=fscrypt}} を '''homectl''' に指定してください。 |
||
− | === ディレクトリまたは |
+ | ==== ディレクトリまたは Btrfs サブボリューム ==== |
− | ユーザーのホームディレクトリは {{ic|/home/''username''.homedir}} に保存され、ロ |
+ | ユーザーのホームディレクトリは {{ic|/home/''username''.homedir}} に保存され、アンロック時にバインド[[マウント]]を使って {{ic|/home/''username''}} にマウントされます。この方式では暗号化は行われません。この方式を使う際は {{ic|1=--storage=directory}} または {{ic|1=--storage=subvolume}} を ''homectl'' で指定してください。 |
− | === CIFS サーバー === |
+ | ==== CIFS サーバー ==== |
− | この方式では、ホームディレクトリはログイン時に CIFS (''Common Internet File System'') サーバからマウントされます。この CIFS は [[Samba]] プロトコルによって実装されています。この方式を使う際は {{ic|1=--storage=cifs}} を |
+ | この方式では、ホームディレクトリはログイン時に CIFS (''Common Internet File System'') サーバからマウントされます。この CIFS は [[Samba]] プロトコルによって実装されています。この方式を使う際は {{ic|1=--storage=cifs}} を ''homectl'' コマンドラインで指定して下さい。ユーザのローカルパスワードが CIFS サービスへのログインで使用されます。 |
− | == ユーザーレコードの属性 == |
+ | === ユーザーレコードの属性 === |
ユーザーレコードを見るには次のようにします: |
ユーザーレコードを見るには次のようにします: |
||
87行目: | 94行目: | ||
オプションの詳細は {{man|1|homectl}} を参照してください。 |
オプションの詳細は {{man|1|homectl}} を参照してください。 |
||
− | == ユーザ |
+ | === ユーザを管理する === |
− | === |
+ | ==== 作成 ==== |
− | LUKS |
+ | LUKS の暗号化を使ってユーザを作成する: |
# homectl create ''username'' --storage=luks |
# homectl create ''username'' --storage=luks |
||
− | fscrypt を使ってユーザ |
+ | fscrypt の暗号化を使ってユーザを作成する (fscrypt が[[fscrypt#ファイルシステム|ファイルシステムで有効化されている]]ことを確認してください): |
# homectl create ''username'' --storage=fscrypt |
# homectl create ''username'' --storage=fscrypt |
||
− | + | 特定の UID、シェル、グループのユーザを作成する: |
|
− | # homectl create ''username'' --shell=/bin/zsh --uid=60100 --member-of=wheel,adm,uucp |
+ | # homectl create ''username'' --shell=/usr/bin/zsh --uid=60100 --member-of=wheel,adm,uucp |
− | 他のオプションは {{man|1|homectl|USER RECORD PROPERTIES}} |
+ | 他のオプションは {{man|1|homectl|USER RECORD PROPERTIES}} で見られます。 |
+ | {{Note|[[ユーザーとグループ#ユーザー管理]]で説明されている注意点が適用されます: ログインシェルは {{ic|/etc/shells}} にリストされているもののうちの一つでなければなりません。}} |
||
− | === |
+ | ==== 削除 ==== |
− | {{Warning|ユーザーの削除は即座に実行されます。注意してください。}} |
||
+ | {{Warning|ユーザの削除は即座に実行されます。注意してください。}} |
||
− | 複数のユーザーを同時に削除することができます。次のコマンドを実行することで 2 ユーザーが即座に削除されます: |
||
+ | |||
+ | 複数のユーザを同時に削除することができます: |
||
# homectl remove ''username'' ''username2'' |
# homectl remove ''username'' ''username2'' |
||
== ヒントとテクニック == |
== ヒントとテクニック == |
||
− | |||
=== Forget key on suspend === |
=== Forget key on suspend === |
||
+ | {{Warning|[[PAM]] の設定を間違えると、システムの認証が壊れてしまい ''root'' にすらログインできなくなる可能性があります。変更を加える前に、既存の設定ファイルをバックアップすることが推奨されます。}} |
||
− | {{Warning|Mistakes in [[PAM]] configuration can break the system authorization up to not being able to login even as ''root''. Backing up existing configuration files is recommended before making any changes.}} |
||
+ | {{ic|/etc/pam.d/}} 内のファイルで {{ic|suspend}} オプションを {{ic|pam_systemd_home.so}} エントリと一緒に使うことにより、forget key on suspend を有効化できます。現状では、この機能をサポートするセッションマネージャは'''存在しません'''。さらに、TTY セッションはこの再認証メカニズムをサポートしていません。なので、セッションマネージャがこの機能をサポートし始めたら、そのようなセッションマネージャに対してのみ suspend オプションを有効化すべきです。詳細は {{man|8|pam_systemd_home}} と [https://github.com/linux-pam/linux-pam/blob/master/doc/sag/Linux-PAM_SAG.xml Linux-PAM System Administrators' Guide] を読んでください。 |
||
− | The {{ic|suspend}} option can be used with {{ic|pam_systemd_home.so}} entries in the files in {{ic|/etc/pam.d/}} to enable forget key on suspend. No session manager at the moment supports this feature. Furthermore, TTY sessions do not support the reathentication mechanism. So, when session managers start supporting this feature, the suspend option should only be enabled for them. Read {{man|8|pam_systemd_home}} and the [http://www.linux-pam.org/Linux-PAM-html/Linux-PAM_SAG.html Linux-PAM System Administrators' Guide] for more details. |
||
− | === SSH |
+ | === SSH リモートアンロック === |
+ | ''systemd-homed'' はパスワードを使用してホームディレクトリを暗号化します。なので、公開鍵認証で設定された SSH ではホームディレクトリをマウントできず、{{ic|authorized_keys}} も読み込めません。可能な解決策としては、authorized keys をあなたのユーザレコードに追加し、認証のために公開鍵とパスワードの両方を要求するというものがあります。以下を {{ic|/etc/ssh/sshd_config}} に追加してください: |
||
− | ''systemd-homed'' encrypts your home directory using your password, so SSH configured for public key authentication cannot mount it or read {{ic|authorized_keys}}. A possible solution is to add authorized keys to your user record and require both public key and password for authentication. Add the following to {{ic|sshd_config}}: |
||
+ | {{hc|/etc/ssh/sshd_config| |
||
− | AuthenticationMethods publickey,password |
||
+ | PasswordAuthentication yes |
||
− | AuthorizedKeysCommand /usr/bin/userdbctl ssh-authorized-keys %u |
||
+ | PubkeyAuthentication yes |
||
− | AuthorizedKeysCommandUser root |
||
+ | AuthenticationMethods publickey,password |
||
+ | AuthorizedKeysCommand /usr/bin/userdbctl ssh-authorized-keys %u |
||
+ | AuthorizedKeysCommandUser root |
||
+ | }} |
||
+ | ユーザがアンロックされている間、以下を使って authorized keys でユーザレコードを更新してください: |
||
− | Make sure that you have not disabled password authentication: |
||
+ | # homectl update ''username'' --ssh-authorized-keys=@/path/to/mounted/home/.ssh/authorized_keys |
||
− | #PasswordAuthentication yes |
||
+ | これで、鍵による認証を終えた後に SSH はあなたのパスワードを尋ねてくるようになります。''systemd-homed'' はそのパスワードをホームディレクトリのマウントのために使用します。 |
||
− | Update your user record with your authorized keys using: |
||
+ | === 暗号化されたホームディレクトリをレスキュー時にマウントする === |
||
− | # homectl update ''username'' --ssh-authorized-keys=@/path/to/.ssh/authorized_keys |
||
+ | ''systemd-homed'' で暗号化されたディレクトリをレスキューディスクや他のマシンからマウントする必要がある場合、''systemd-homed'' フレームワークの外からそのディレクトリを復号する必要があります。緊急時のために[https://bbs.archlinux.org/viewtopic.php?id=258152 フォーラム]からこの解決策のテキストファイルやスクリプトをレスキューディスクに保存しておくと良いでしょう: |
||
− | From now on, SSH will ask you to enter your password after completing key-based authentication. ''systemd-homed'' will use it to unlock and mount your home directory. |
||
+ | |||
+ | # losetup -fP --show ''username''.home |
||
+ | # cryptsetup open /dev/''loopXpY'' ''mappername'' |
||
+ | # mount /dev/mapper/''mappername'' ''/mnt/mountpoint'' |
||
+ | |||
+ | * {{ic|''username''.home}} は {{ic|/home}} ディレクトリ内にあるファイルです。ファイル名はユーザ名と拡張子 ''.home'' です。 |
||
+ | * {{ic|''loopXpY''}} は {{ic|/dev}} ディレクトリ内のデバイスです。ファイル名は、前のステップで作成したループバックデバイスのループ番号と、関連するパーティションのパーティション番号です (おそらく {{ic|/dev/loop0p1}})。 |
||
+ | * {{ic|''mappername''}} は、マップされたデバイスを受け入れる任意のエイリアスです (例: {{ic|user_oldhome}})。 |
||
+ | * {{ic|''/mnt/mountpoint''}} は、復号されたホームディレクトリをマウントする任意のマウントポイントです。 |
||
+ | |||
+ | === 認証と暗号化のために FIDO2 hmac-secret でユーザをセットアップする === |
||
+ | |||
+ | このセットアップでは FIDO2 セキュリティデバイスが必要で、ログインとホームディレクトリの復号に pin を尋ねてきます: |
||
+ | |||
+ | # homectl create ''username'' --storage=fscrypt --fido2-device=auto --fido2-with-client-pin=yes --fido2-with-user-presence=no --recovery-key=yes |
||
+ | |||
+ | デバイスが紛失あるいは破損した場合に備えて、リカバリキーをセットアップしておくことが推奨されます。リカバリキーは、ユーザとファイルにアクセスするためにパスワードのように使用されます。デバイス pin を使うのではなく、ユーザの存在だけを尋ねるだけにすることも可能です。この場合、セキュリティデバイスに触れる必要があります。 |
||
+ | 現在、''homectl'' では、代替のログインとしてユーザのパスワードも設定する必要があります。これはバックアップの秘密の質問としても機能します。 |
||
== トラブルシューティング == |
== トラブルシューティング == |
||
+ | === Plasma からログアウトした後もホームディレクトリがアクティブなままになる === |
||
− | === SDDM がユーザーをリストしない === |
||
+ | [[Plasma]] からログアウトした後もアクティブなユーザプロセス (例: ''dbus-daemon'') が残ることがあります。そのようなプロセスがホームディレクトリのアクティブ化解除を妨げてしまいます。 |
||
− | こちらを参照してください: [[SDDM#ユーザーが greeter に表示されない]]。 |
||
+ | |||
+ | これは、[[KDE#systemd による起動|Plasma の systemd スタートアップを有効化する]]ことで解決できます。 |
||
+ | |||
+ | === ユーザマスクが無視される === |
||
+ | |||
+ | {{ic|/etc/login.defs}} には常に [[umask]] が設定されているため、[[#homectl|homectl]] を通じて設定されたユーザー自身の umask は現在無視されています。詳細は [https://github.com/systemd/systemd/issues/23007 systemd issue 23007] を参照してください。 |
||
+ | |||
+ | これを解決するには、[[コマンドラインシェル#ログインシェル|ログインシェル]]のスタートアップファイル (例えば {{ic|~/.bash_profile}} や {{ic|~/.zprofile}}) で umask を設定してください。 |
||
+ | |||
+ | === ホームディレクトリが汚い状態にある === |
||
+ | |||
+ | 強制的または予期しないシャットダウンや停電が発生した場合、ホーム ディレクトリが汚い状態のままになる可能性があります。この場合、ユーザーはロックアウトされ、ホームディレクトリへの認証に手動介入が ''必要になる場合があります。'' 次の手順では、[[LUKS|LUKS2]] 暗号化ループバックファイルストレージメカニズムが使用されており、基盤となるファイルシステムで [[fsck]] を使用して修復できることを前提としています。 |
||
+ | |||
+ | まず、ループバックファイルが ''汚い'' 状態がであることを確認し、ユーザーのループバックファイルのパスを決定します: |
||
+ | |||
+ | $ homectl inspect ''username'' |
||
+ | |||
+ | 次に、ループバックファイルのパスを使用して、[[systemd-homed#暗号化されたホームディレクトリをレスキュー時にマウントする]] の手順に従います。 |
||
+ | |||
+ | {{Note|この時点で LUKS2 デバイスを開くことができた場合、''fsck'' 使用後の潜在的なリスクを最小限に抑えるために、マウントされたデバイス内のデータをすべて回復することが賢明です。}} |
||
+ | |||
+ | 最後に、開いた LUKS2 デバイス上で ''fsck'' を使用してファイルシステムの修復を試みます: |
||
+ | |||
+ | # fsck /dev/mapper/''mappername'' |
||
+ | |||
+ | {{Warning|''fsck'' を実行する前に、{{ic|/dev/mapper/''mappername''}} のマウントポイントが存在しないことを確認してください。}} |
||
+ | |||
+ | この時点で修復が成功した場合は、LUKS2 コンテナを [[dm-crypt/デバイスの暗号化#デバイスマッパーで LUKS パーティションのロックを解除・マップ|閉じて]] ループバックデバイスを切断し、systemd-homed service を介して通常どおりに再認証を試みます。 |
||
+ | |||
+ | {{Expansion|Add links to bug reports for the issues mentioned in the note.}} |
||
+ | |||
+ | {{Note|ループバックファイル自体が破損している場合など、その他の場合には、回復が不可能となり、ユーザーが '''永久''' にロックアウトされる可能性があります。さらに、homectl は現在、汚い状態から回復するためのネイティブコマンドを提供していません。これが懸念される場合は、ホーム ディレクトリの定期的なバックアップを準備するか、systemd-homed の使用を完全に控えてください。}} |
||
== 参照 == |
== 参照 == |
||
+ | * https://systemd.io/CONVERTING_TO_HOMED/ |
||
* https://systemd.io/HOME_DIRECTORY/ |
* https://systemd.io/HOME_DIRECTORY/ |
||
+ | |||
+ | {{TranslationStatus|systemd-homed|2024-4-18|806352}} |
2024年4月18日 (木) 20:59時点における最新版
systemd-homed(8) は、現在のシステム構成に依存しないポータブルなユーザーアカウントを提供する systemd サービスです。
ポータビリティを実現するために、systemd-homed は全てのユーザー関連情報をストレージメディアに移動して、オプションで暗号化を行い、ユーザーに関する署名済み情報 (パスワードやユーザーが属するグループ、UID/GID、その他 /
に散在する情報) を含む ~/.identity
ファイルを作成します。
ポータブルなホームディレクトリを可能にするだけではなく、自動的にログイン時にホームディレクトリの暗号化を管理し、システムのサスペンド時にフォルダにロックすることでセキュリティも確保されます。
インストール
systemd-homed は systemd に含まれています。pambase パッケージのバージョン 20200721.1-2 以降には、systemd-homed のユーザーセッションで必要となる PAMの設定 が付属しています。
使い方
systemd-homed.service
サービスを 起動/有効化 します。
ユーティリティ
homectl
homectl は、homed で使用する主なユーティリティです。このユーティリティを使えば、ユーザ、ホームディレクトリ、systemd-homed(8) サービスによって管理されている ~/.identity
ファイルを作成、更新、調査することができます。
homectl の最も単純な使用例は:
# homectl create username
このコマンドはユーザを作成します。ユーザ名は username で、UID は 60001–60513 の範囲で使用されていないものになります。さらに、同じ名前のグループを作成し、GID は先の UID と同じになり、作成したユーザはこのグループに追加されます。そして、ユーザのデフォルトシェルは /bin/bash
に設定されます。
ホームディレクトリのマウントポイントは /home/username
に設定されます。ストレージ方式は以下の順番で選択されます:
luks
: サポートされている場合。subvolume
: LUKS がサポートされておらず、サブボリュームはサポートされている場合。directory
: 上記のいずれもサポートされておらず、手動で他のオプションも指定されていない場合。
LUKS 方式でのイメージのパスは、/home/username.home
に設定されます。ディレクトリ方式でのディレクトリのパスは、/home/username.homedir
に設定されます。
userdbctl
古典的な UNIX のユーザー管理機構と systemd-homed の両方によって提供されているユーザー、グループ、グループのメンバーを調査するためのクエリツール。
ストレージ方式
LUKS ホームディレクトリ
ユーザーのホームディレクトリは、ループバックファイルあるいはリムーバルメディア内の暗号化された LUKS (Linux Unified Key Setup) ボリューム内の Linux ファイルシステムに保存されます。この方式を使う際は --storage=luks
を homectl で指定してください。
リムーバルメディアを使う場合は以下の条件を満たす必要があります:
- イメージには GPT パーティションテーブルが含まれていること。現在のところ、イメージに含まれるパーティションは1つだけである必要があり、かつそのパーティションのタイプ UUID は
773f91ef-66d4-49b5-bd83-d683bf40ad16
でなければなりません。そのパーティションのラベルはユーザ名と同じでなければなりません。
- パーティションには LUKS2 ボリュームが必要で、ラベルがユーザー名と一致している必要があります。LUKS2 ボリュームには systemd-homed タイプの LUKS2 トークンフィールドが必要です。このトークンの JSON データには base64 でエンコードされたデータを含むレコードフィールドが必要です。このデータは JSON のユーザーレコードであり、暗号化されてはいますが、
~/.identity
と同じようにシリアライズ化されています。このトークンの JSON データには iv フィールドも必要で、暗号化のための base64 でエンコードされたバイナリ初期化ベクタが含まれていなければなりません。LUKS2 ボリュームが使用するのと同じ暗号化が使われ、同じボリュームキーで解錠されますが、自己の IV を使います。 - LUKS2 ボリュームの中は ext4、btrfs、XFS のいずれかの Linux ファイルシステムである必要があり、ファイルシステムのラベルはユーザー名と同じでなければなりません。
- このファイルシステムにはユーザーと同じ名前のディレクトリが含まれている必要があります。このディレクトリがログイン時にユーザーのホームディレクトリになります。他のストレージ方式と同じように
~/.identity
ファイルにユーザーレコードのコピーを保持します。
fscrypt ディレクトリ
上記の方法と同じようにユーザーのホームディレクトリが保存されますが、ファイルシステムネイティブの暗号化が使われます。この方式を使う場合は --storage=fscrypt
を homectl で指定してください。
ディレクトリまたは Btrfs サブボリューム
ユーザーのホームディレクトリは /home/username.homedir
に保存され、アンロック時にバインドマウントを使って /home/username
にマウントされます。この方式では暗号化は行われません。この方式を使う際は --storage=directory
または --storage=subvolume
を homectl で指定してください。
CIFS サーバー
この方式では、ホームディレクトリはログイン時に CIFS (Common Internet File System) サーバからマウントされます。この CIFS は Samba プロトコルによって実装されています。この方式を使う際は --storage=cifs
を homectl コマンドラインで指定して下さい。ユーザのローカルパスワードが CIFS サービスへのログインで使用されます。
ユーザーレコードの属性
ユーザーレコードを見るには次のようにします:
# homectl inspect username
また、変更、追加したい場合は次のようにします:
# homectl update username --property=VALUE
オプションの詳細は homectl(1) を参照してください。
ユーザを管理する
作成
LUKS の暗号化を使ってユーザを作成する:
# homectl create username --storage=luks
fscrypt の暗号化を使ってユーザを作成する (fscrypt がファイルシステムで有効化されていることを確認してください):
# homectl create username --storage=fscrypt
特定の UID、シェル、グループのユーザを作成する:
# homectl create username --shell=/usr/bin/zsh --uid=60100 --member-of=wheel,adm,uucp
他のオプションは homectl(1) § USER RECORD PROPERTIES で見られます。
削除
複数のユーザを同時に削除することができます:
# homectl remove username username2
ヒントとテクニック
Forget key on suspend
/etc/pam.d/
内のファイルで suspend
オプションを pam_systemd_home.so
エントリと一緒に使うことにより、forget key on suspend を有効化できます。現状では、この機能をサポートするセッションマネージャは存在しません。さらに、TTY セッションはこの再認証メカニズムをサポートしていません。なので、セッションマネージャがこの機能をサポートし始めたら、そのようなセッションマネージャに対してのみ suspend オプションを有効化すべきです。詳細は pam_systemd_home(8) と Linux-PAM System Administrators' Guide を読んでください。
SSH リモートアンロック
systemd-homed はパスワードを使用してホームディレクトリを暗号化します。なので、公開鍵認証で設定された SSH ではホームディレクトリをマウントできず、authorized_keys
も読み込めません。可能な解決策としては、authorized keys をあなたのユーザレコードに追加し、認証のために公開鍵とパスワードの両方を要求するというものがあります。以下を /etc/ssh/sshd_config
に追加してください:
/etc/ssh/sshd_config
PasswordAuthentication yes PubkeyAuthentication yes AuthenticationMethods publickey,password AuthorizedKeysCommand /usr/bin/userdbctl ssh-authorized-keys %u AuthorizedKeysCommandUser root
ユーザがアンロックされている間、以下を使って authorized keys でユーザレコードを更新してください:
# homectl update username --ssh-authorized-keys=@/path/to/mounted/home/.ssh/authorized_keys
これで、鍵による認証を終えた後に SSH はあなたのパスワードを尋ねてくるようになります。systemd-homed はそのパスワードをホームディレクトリのマウントのために使用します。
暗号化されたホームディレクトリをレスキュー時にマウントする
systemd-homed で暗号化されたディレクトリをレスキューディスクや他のマシンからマウントする必要がある場合、systemd-homed フレームワークの外からそのディレクトリを復号する必要があります。緊急時のためにフォーラムからこの解決策のテキストファイルやスクリプトをレスキューディスクに保存しておくと良いでしょう:
# losetup -fP --show username.home # cryptsetup open /dev/loopXpY mappername # mount /dev/mapper/mappername /mnt/mountpoint
username.home
は/home
ディレクトリ内にあるファイルです。ファイル名はユーザ名と拡張子 .home です。loopXpY
は/dev
ディレクトリ内のデバイスです。ファイル名は、前のステップで作成したループバックデバイスのループ番号と、関連するパーティションのパーティション番号です (おそらく/dev/loop0p1
)。mappername
は、マップされたデバイスを受け入れる任意のエイリアスです (例:user_oldhome
)。/mnt/mountpoint
は、復号されたホームディレクトリをマウントする任意のマウントポイントです。
認証と暗号化のために FIDO2 hmac-secret でユーザをセットアップする
このセットアップでは FIDO2 セキュリティデバイスが必要で、ログインとホームディレクトリの復号に pin を尋ねてきます:
# homectl create username --storage=fscrypt --fido2-device=auto --fido2-with-client-pin=yes --fido2-with-user-presence=no --recovery-key=yes
デバイスが紛失あるいは破損した場合に備えて、リカバリキーをセットアップしておくことが推奨されます。リカバリキーは、ユーザとファイルにアクセスするためにパスワードのように使用されます。デバイス pin を使うのではなく、ユーザの存在だけを尋ねるだけにすることも可能です。この場合、セキュリティデバイスに触れる必要があります。 現在、homectl では、代替のログインとしてユーザのパスワードも設定する必要があります。これはバックアップの秘密の質問としても機能します。
トラブルシューティング
Plasma からログアウトした後もホームディレクトリがアクティブなままになる
Plasma からログアウトした後もアクティブなユーザプロセス (例: dbus-daemon) が残ることがあります。そのようなプロセスがホームディレクトリのアクティブ化解除を妨げてしまいます。
これは、Plasma の systemd スタートアップを有効化することで解決できます。
ユーザマスクが無視される
/etc/login.defs
には常に umask が設定されているため、homectl を通じて設定されたユーザー自身の umask は現在無視されています。詳細は systemd issue 23007 を参照してください。
これを解決するには、ログインシェルのスタートアップファイル (例えば ~/.bash_profile
や ~/.zprofile
) で umask を設定してください。
ホームディレクトリが汚い状態にある
強制的または予期しないシャットダウンや停電が発生した場合、ホーム ディレクトリが汚い状態のままになる可能性があります。この場合、ユーザーはロックアウトされ、ホームディレクトリへの認証に手動介入が 必要になる場合があります。 次の手順では、LUKS2 暗号化ループバックファイルストレージメカニズムが使用されており、基盤となるファイルシステムで fsck を使用して修復できることを前提としています。
まず、ループバックファイルが 汚い 状態がであることを確認し、ユーザーのループバックファイルのパスを決定します:
$ homectl inspect username
次に、ループバックファイルのパスを使用して、systemd-homed#暗号化されたホームディレクトリをレスキュー時にマウントする の手順に従います。
最後に、開いた LUKS2 デバイス上で fsck を使用してファイルシステムの修復を試みます:
# fsck /dev/mapper/mappername
この時点で修復が成功した場合は、LUKS2 コンテナを 閉じて ループバックデバイスを切断し、systemd-homed service を介して通常どおりに再認証を試みます。