「Systemd-homed」の版間の差分
Kusanaginoturugi (トーク | 投稿記録) (→ユーザマスクが無視される: 記事を更新) |
Kusanaginoturugi (トーク | 投稿記録) (→参照: update TranslationStatus.) |
||
212行目: | 212行目: | ||
* https://systemd.io/HOME_DIRECTORY/ |
* https://systemd.io/HOME_DIRECTORY/ |
||
− | {{TranslationStatus|systemd-homed| |
+ | {{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 を介して通常どおりに再認証を試みます。