systemd-homed

提供: ArchWiki
2024年4月18日 (木) 20:53時点におけるKusanaginoturugi (トーク | 投稿記録)による版 (→‎削除: 英語版にあわせて削除)
ナビゲーションに移動 検索に移動

関連記事

systemd-homed(8) は、現在のシステム構成に依存しないポータブルなユーザーアカウントを提供する systemd サービスです。

ポータビリティを実現するために、systemd-homed は全てのユーザー関連情報をストレージメディアに移動して、オプションで暗号化を行い、ユーザーに関する署名済み情報 (パスワードやユーザーが属するグループ、UID/GID、その他 / に散在する情報) を含む ~/.identity ファイルを作成します。

ポータブルなホームディレクトリを可能にするだけではなく、自動的にログイン時にホームディレクトリの暗号化を管理し、システムのサスペンド時にフォルダにロックすることでセキュリティも確保されます。

インストール

systemd-homedsystemd に含まれています。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 に設定されます。ストレージ方式は以下の順番で選択されます:

  1. luks: サポートされている場合。
  2. subvolume: LUKS がサポートされておらず、サブボリュームはサポートされている場合。
  3. directory: 上記のいずれもサポートされておらず、手動で他のオプションも指定されていない場合。

LUKS 方式でのイメージのパスは、/home/username.home に設定されます。ディレクトリ方式でのディレクトリのパスは、/home/username.homedir に設定されます。

ノート: homectl は、systemd-homed によって管理されているユーザの名前と ID に一致するユーザ以外は、グループの作成や削除を管理しません。
警告: ~/.identity ファイルは署名されているため、テキストエディタを使って直接編集してはいけません。署名が破壊され不正なファイルとなってしまいます。編集するときは homectl update --identity=/path/to/.identity を使ってください。

userdbctl

古典的な UNIX のユーザー管理機構と systemd-homed の両方によって提供されているユーザー、グループ、グループのメンバーを調査するためのクエリツール。

ストレージ方式

LUKS ホームディレクトリ

ユーザーのホームディレクトリは、ループバックファイルあるいはリムーバルメディア内の暗号化された LUKS (Linux Unified Key Setup) ボリューム内の Linux ファイルシステムに保存されます。この方式を使う際は --storage=lukshomectl で指定してください。

リムーバルメディアを使う場合は以下の条件を満たす必要があります:

  • イメージには GPT パーティションテーブルが含まれていること。現在のところ、イメージに含まれるパーティションは1つだけである必要があり、かつそのパーティションのタイプ UUID は 773f91ef-66d4-49b5-bd83-d683bf40ad16 でなければなりません。そのパーティションのラベルはユーザ名と同じでなければなりません。
  • パーティションには LUKS2 ボリュームが必要で、ラベルがユーザー名と一致している必要があります。LUKS2 ボリュームには systemd-homed タイプの LUKS2 トークンフィールドが必要です。このトークンの JSON データには base64 でエンコードされたデータを含むレコードフィールドが必要です。このデータは JSON のユーザーレコードであり、暗号化されてはいますが、~/.identity と同じようにシリアライズ化されています。このトークンの JSON データには iv フィールドも必要で、暗号化のための base64 でエンコードされたバイナリ初期化ベクタが含まれていなければなりません。LUKS2 ボリュームが使用するのと同じ暗号化が使われ、同じボリュームキーで解錠されますが、自己の IV を使います。
  • LUKS2 ボリュームの中は ext4btrfsXFS のいずれかの Linux ファイルシステムである必要があり、ファイルシステムのラベルはユーザー名と同じでなければなりません。
  • このファイルシステムにはユーザーと同じ名前のディレクトリが含まれている必要があります。このディレクトリがログイン時にユーザーのホームディレクトリになります。他のストレージ方式と同じように ~/.identity ファイルにユーザーレコードのコピーを保持します。
警告: 強制的または予期せぬシャットダウンや停電の場合、ループバックファイルが汚れた状態で残される可能性があり、これによりユーザーが永久にロックアウトされることがあります。詳細は# ホームディレクトリが汚い状態にあるを参照してください。

fscrypt ディレクトリ

上記の方法と同じようにユーザーのホームディレクトリが保存されますが、ファイルシステムネイティブの暗号化が使われます。この方式を使う場合は --storage=fscrypthomectl で指定してください。

ヒント: fscrypt をサポートしているファイルシステムには ext4F2FS があります。

ディレクトリまたは Btrfs サブボリューム

ユーザーのホームディレクトリは /home/username.homedir に保存され、アンロック時にバインドマウントを使って /home/username にマウントされます。この方式では暗号化は行われません。この方式を使う際は --storage=directory または --storage=subvolumehomectl で指定してください。

CIFS サーバー

この方式では、ホームディレクトリはログイン時に CIFS (Common Internet File System) サーバからマウントされます。この CIFS は Samba プロトコルによって実装されています。この方式を使う際は --storage=cifshomectl コマンドラインで指定して下さい。ユーザのローカルパスワードが 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 で見られます。

ノート: ユーザーとグループ#ユーザー管理で説明されている注意点が適用されます: ログインシェルは /etc/shells にリストされているもののうちの一つでなければなりません。

削除

警告: ユーザの削除は即座に実行されます。注意してください。

複数のユーザを同時に削除することができます:

# homectl remove username username2

ヒントとテクニック

Forget key on suspend

警告: PAM の設定を間違えると、システムの認証が壊れてしまい root にすらログインできなくなる可能性があります。変更を加える前に、既存の設定ファイルをバックアップすることが推奨されます。

/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/profileumask が設定されている場合、homectl によって設定された独自の umask は無視されます。systemd issue 23007 を見てください。

これを解決するには、ログインシェルのスタートアップファイル (例えば ~/.bash_profile~/.zprofile) で umask を設定してください。

ホームディレクトリが汚い状態にある

強制的または予期しないシャットダウンや停電が発生した場合、ホーム ディレクトリが汚い状態のままになる可能性があります。この場合、ユーザーはロックアウトされ、ホームディレクトリへの認証に手動介入が 必要になる場合があります。 次の手順では、LUKS2 暗号化ループバックファイルストレージメカニズムが使用されており、基盤となるファイルシステムで fsck を使用して修復できることを前提としています。

まず、ループバックファイルが 汚い 状態がであることを確認し、ユーザーのループバックファイルのパスを決定します:

$ homectl inspect username

次に、ループバックファイルのパスを使用して、systemd-homed#暗号化されたホームディレクトリをレスキュー時にマウントする の手順に従います。

ノート: この時点で LUKS2 デバイスを開くことができた場合、fsck 使用後の潜在的なリスクを最小限に抑えるために、マウントされたデバイス内のデータをすべて回復することが賢明です。

最後に、開いた LUKS2 デバイス上で fsck を使用してファイルシステムの修復を試みます:

# fsck /dev/mapper/mappername
警告: fsck を実行する前に、/dev/mapper/mappername のマウントポイントが存在しないことを確認してください。

この時点で修復が成功した場合は、LUKS2 コンテナを 閉じて ループバックデバイスを切断し、systemd-homed service を介して通常どおりに再認証を試みます。

この記事またはセクションは加筆を必要としています。
理由: Add links to bug reports for the issues mentioned in the note. (議論: トーク:Systemd-homed#)
ノート: ループバックファイル自体が破損している場合など、その他の場合には、回復が不可能となり、ユーザーが 永久 にロックアウトされる可能性があります。さらに、homectl は現在、汚い状態から回復するためのネイティブコマンドを提供していません。これが懸念される場合は、ホーム ディレクトリの定期的なバックアップを準備するか、systemd-homed の使用を完全に控えてください。

参照

翻訳ステータス: このページは en:systemd-homed の翻訳バージョンです。最後の翻訳日は 2023-12-09 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。