「Systemd-homed」の版間の差分
(ページの作成:「{{lowercase title}} Category:セキュリティ en:Systemd-homed {{Related articles start}} {{Related|fscrypt}} {{Related|セキュリティ}} {{Related|PAM}} {{R…」) |
Kusanaginoturugi (トーク | 投稿記録) (→参照: update TranslationStatus.) |
||
(6人の利用者による、間の40版が非表示) | |||
1行目: | 1行目: | ||
− | {{ |
+ | {{Lowercase title}} |
[[Category:セキュリティ]] |
[[Category:セキュリティ]] |
||
[[en:Systemd-homed]] |
[[en:Systemd-homed]] |
||
+ | [[pt:Systemd-homed]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
+ | {{Related|ユーザーとグループ}} |
||
{{Related|fscrypt}} |
{{Related|fscrypt}} |
||
{{Related|セキュリティ}} |
{{Related|セキュリティ}} |
||
{{Related|PAM}} |
{{Related|PAM}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
− | '''systemd-homed''' は現在のシステム構成に依存しないポータブルなユーザーアカウントを提供する [[systemd]] サービスです。 |
||
+ | {{man|8|systemd-homed}} は、現在のシステム構成に依存しないポータブルなユーザーアカウントを提供する [[systemd]] サービスです。 |
||
− | ポータビリティを実現するために、systemd-homed は全てのユーザー関連情報をストレージメディアに移動して、可能であれば暗号化を行い、ユーザーに関する署名済み情報 (パスワードやユーザーが属するグループ、UID/GID、その他 {{ic|/}} に散在する情報) を含む {{ic|~/.identity}} ファイルを作成します。 |
||
+ | ポータビリティを実現するために、systemd-homed は全てのユーザー関連情報をストレージメディアに移動して、オプションで暗号化を行い、ユーザーに関する署名済み情報 (パスワードやユーザーが属するグループ、UID/GID、その他 {{ic|/}} に散在する情報) を含む {{ic|~/.identity}} ファイルを作成します。 |
||
− | ポータブルなホームディレクトリを可能にするだけではなく、ログイン時に {{ic|/home}} を暗号化しシステムの停止時にフォルダに施錠するという管理を自動化することでセキュリティも確保されます。 |
||
+ | |||
+ | ポータブルなホームディレクトリを可能にするだけではなく、自動的にログイン時にホームディレクトリの暗号化を管理し、システムのサスペンド時にフォルダにロックすることでセキュリティも確保されます。 |
||
== インストール == |
== インストール == |
||
− | ''systemd-homed'' は {{Pkg|systemd}} に含まれています。 |
+ | ''systemd-homed'' は {{Pkg|systemd}} に含まれています。{{Pkg|pambase}} パッケージのバージョン 20200721.1-2 以降には、systemd-homed のユーザーセッションで必要となる [[PAM#設定|PAMの設定]] が付属しています。 |
− | == |
+ | == 使い方 == |
+ | {{ic|systemd-homed.service}} サービスを [[起動/有効化]] します。 |
||
− | === homectl === |
||
+ | === ユーティリティ === |
||
− | homectl を使うことでユーザーを作成・更新・調査して、ホームディレクトリと systemd-homed サービスで管理される {{ic|~/.identity}} を作成することができます。 |
||
+ | ==== homectl ==== |
||
− | 最初の空 UID を使用して、'archie' という名前のユーザーを作成 (同じ名前のグループを作成して GID と UID を同じにして ''archie'' をグループのメンバーに設定し、デフォルトシェルを {{ic|/bin/bash}} に設定): |
||
+ | ''homectl'' は、homed で使用する主なユーティリティです。このユーティリティを使えば、ユーザ、ホームディレクトリ、{{man|8|systemd-homed}} サービスによって管理されている {{ic|~/.identity}} ファイルを作成、更新、調査することができます。 |
||
− | # homectl create archie |
||
+ | ''homectl'' の最も単純な使用例は: |
||
− | 上記のコマンドでホームディレクトリのマウントポイントは {{ic|/home/archie}} に設定されます。ストレージ方式は次の順番で選択されます (例えば LUKS がサポートされている場合 LUKS が選ばれます): '''LUKS''', '''サブボリューム''', '''ディレクトリ'''。'''LUKS''' のイメージパスは {{ic|/home/archie.home}} に、'''ディレクトリ'''のディレクトリパスは {{ic|/home/archie.homedir}} に設定されます。 |
||
+ | # homectl create ''username'' |
||
− | シェルを [[zsh]] に設定してユーザーを作成する例: |
||
+ | このコマンドはユーザを作成します。ユーザ名は ''username'' で、UID は [https://systemd.io/UIDS-GIDS/ 60001–60513 の範囲]で使用されていないものになります。さらに、同じ名前のグループを作成し、GID は先の UID と同じになり、作成したユーザはこのグループに追加されます。そして、ユーザのデフォルトシェルは {{ic|/bin/bash}} に設定されます。 |
||
− | # homectl create archie --shell='/usr/bin/zsh' |
||
+ | ホームディレクトリのマウントポイントは {{ic|/home/''username''}} に設定されます。ストレージ方式は以下の順番で選択されます: |
||
− | 作成したユーザー 'archie' を 'wheel' グループに追加する場合: |
||
+ | # {{ic|luks}}: サポートされている場合。 |
||
− | # homectl update archie -G wheel |
||
+ | # {{ic|subvolume}}: LUKS がサポートされておらず、サブボリュームはサポートされている場合。 |
||
+ | # {{ic|directory}}: 上記のいずれもサポートされておらず、手動で他のオプションも指定されていない場合。 |
||
+ | LUKS 方式でのイメージのパスは、{{ic|/home/''username''.home}} に設定されます。ディレクトリ方式でのディレクトリのパスは、{{ic|/home/''username''.homedir}} に設定されます。 |
||
− | {{Note| '''homectl''' はグループの作成・削除は管理しません。古典的なツールを使ってください。}} |
||
+ | {{Note|''homectl'' は、systemd-homed によって管理されているユーザの名前と ID に一致するユーザ以外は、グループの作成や削除を管理しません。}} |
||
− | {{Warning|{{ic|~/.identity}} ファイルは署名されるためテキストエディタを使って直接編集してはありません。署名が破壊され不正なファイルとなってしまいます。編集するときは {{ic|1=homectl update --identity=/path/to/.identity}} を使ってください。}} |
||
+ | {{Warning|{{ic|~/.identity}} ファイルは署名されているため、テキストエディタを使って直接編集してはいけません。署名が破壊され不正なファイルとなってしまいます。編集するときは {{ic|1=homectl update --identity=/path/to/.identity}} を使ってください。}} |
||
− | === userdbctl === |
||
+ | ==== userdbctl ==== |
||
− | 古典的な Unix によるユーザー管理と [[systemd-homed]] によるユーザー管理、両方によるユーザー・グループ・グループ属性を調査するための問い合わせツール。 |
||
+ | 古典的な UNIX のユーザー管理機構と [[systemd-homed]] の両方によって提供されているユーザー、グループ、グループのメンバーを調査するためのクエリツール。 |
||
− | == ストレージ方式 == |
||
+ | === ストレージ方式 === |
||
− | === ディレクトリまたは [[btrfs]] サブボリューム === |
||
+ | ==== LUKS ホームディレクトリ ==== |
||
− | ユーザーのホームディレクトリは {{ic|/home/user.homedir}} に保存され、ログイン時にバインド[[マウント]]を使って {{ic|/home/user}} にマウントされます。この方式では暗号化は行われません。 この方式を使う際は {{ic|1=--storage=directory}} または {{ic|1=--storage=subvolume}} を '''homectl''' に指定してください。 |
||
+ | ユーザーのホームディレクトリは、ループバックファイルあるいはリムーバルメディア内の暗号化された [[LUKS]] (''Linux Unified Key Setup'') ボリューム内の Linux [[ファイルシステム]]に保存されます。この方式を使う際は {{ic|1=--storage=luks}} を ''homectl'' で指定してください。 |
||
− | === [[fscrypt]] ディレクトリ === |
||
+ | |||
+ | リムーバルメディアを使う場合は以下の条件を満たす必要があります: |
||
+ | |||
+ | * イメージには GPT パーティションテーブルが含まれていること。現在のところ、イメージに含まれるパーティションは1つだけである必要があり、かつそのパーティションのタイプ UUID は {{ic|773f91ef-66d4-49b5-bd83-d683bf40ad16}} でなければなりません。そのパーティションのラベルはユーザ名と同じでなければなりません。 |
||
+ | |||
+ | * パーティションには LUKS2 ボリュームが必要で、ラベルがユーザー名と一致している必要があります。LUKS2 ボリュームには systemd-homed タイプの LUKS2 トークンフィールドが必要です。このトークンの JSON データには base64 でエンコードされたデータを含むレコードフィールドが必要です。このデータは JSON のユーザーレコードであり、暗号化されてはいますが、{{ic|~/.identity}} と同じようにシリアライズ化されています。このトークンの JSON データには iv フィールドも必要で、暗号化のための base64 でエンコードされたバイナリ初期化ベクタが含まれていなければなりません。LUKS2 ボリュームが使用するのと同じ暗号化が使われ、同じボリュームキーで解錠されますが、自己の IV を使います。 |
||
+ | * LUKS2 ボリュームの中は [[ext4]]、[[btrfs]]、[[XFS]] のいずれかの Linux ファイルシステムである必要があり、ファイルシステムのラベルはユーザー名と同じでなければなりません。 |
||
+ | * このファイルシステムにはユーザーと同じ名前のディレクトリが含まれている必要があります。このディレクトリがログイン時にユーザーのホームディレクトリになります。他のストレージ方式と同じように {{ic|~/.identity}} ファイルにユーザーレコードのコピーを保持します。 |
||
+ | |||
+ | {{Warning| 強制的または予期せぬシャットダウンや停電の場合、ループバックファイルが汚れた状態で残される可能性があり、これによりユーザーが永久にロックアウトされることがあります。詳細は[[# ホームディレクトリが汚い状態にある]]を参照してください。}} |
||
+ | |||
+ | ==== fscrypt ディレクトリ ==== |
||
+ | |||
+ | 上記の方法と同じようにユーザーのホームディレクトリが保存されますが、ファイルシステムネイティブの暗号化が使われます。この方式を使う場合は {{ic|1=--storage=fscrypt}} を ''homectl'' で指定してください。 |
||
{{Tip|fscrypt をサポートしているファイルシステムには [[ext4]] や [[F2FS]] があります。}} |
{{Tip|fscrypt をサポートしているファイルシステムには [[ext4]] や [[F2FS]] があります。}} |
||
− | 上記の方法と同じようにユーザーのホームディレクトリが保存されますが、ファイルシステムネイティブの暗号化が使われます。この方式を使う場合は {{ic|1=--storage=fscrypt}} を '''homectl''' に指定してください。 |
||
− | === |
+ | ==== ディレクトリまたは Btrfs サブボリューム ==== |
− | ユーザーのホームディレクトリは |
+ | ユーザーのホームディレクトリは {{ic|/home/''username''.homedir}} に保存され、アンロック時にバインド[[マウント]]を使って {{ic|/home/''username''}} にマウントされます。この方式では暗号化は行われません。この方式を使う際は {{ic|1=--storage=directory}} または {{ic|1=--storage=subvolume}} を ''homectl'' で指定してください。 |
+ | ==== CIFS サーバー ==== |
||
− | リムーバルメディアを使う場合は以下の条件を満たす必要があります: |
||
+ | この方式では、ホームディレクトリはログイン時に CIFS (''Common Internet File System'') サーバからマウントされます。この CIFS は [[Samba]] プロトコルによって実装されています。この方式を使う際は {{ic|1=--storage=cifs}} を ''homectl'' コマンドラインで指定して下さい。ユーザのローカルパスワードが CIFS サービスへのログインで使用されます。 |
||
− | * イメージには GPT パーティションテーブルが必要です。現在のところ、そのパーティションひとつだけで、パーティションのタイプが {{ic|UUID 773f91ef-66d4-49b5-bd83-d683bf40ad16}} である必要があります。また、パーティションのラベルがユーザーの名前でなくてはなりません。 |
||
+ | === ユーザーレコードの属性 === |
||
− | * パーティションには LUKS2 ボリュームが必要で、ラベルがユーザー名と一致している必要があります。LUKS2 ボリュームには systemd-homed タイプの LUKS2 トークンフィールドが必要です。このトークンの JSON データには base64 でエンコードされたデータを含むレコードフィールドが必要です。このデータは JSON のユーザーレコードであり、{{ic|~/.identity}} と同じようにシリアライゼーションされています。このトークンの JSON データには iv フィールドも必要で、暗号化のための base64 でエンコードされたバイナリ初期化ベクタを記述します。LUKS2 ボリュームが使用するのと同じ暗号化が使われ、同じボリュームキーで解錠されますが、自己の IV を使います。 |
||
+ | ユーザーレコードを見るには次のようにします: |
||
− | * LUKS2 ボリュームの中は [[ext4]], [[btrfs]], [[XFS]] のいずれかの Linux ファイルシステムである必要があり、ファイルシステムのラベルはユーザー名でなければなりません。 |
||
+ | # homectl inspect ''username'' |
||
− | * ファイルシステムにはユーザーと同じ名前のディレクトリが必要です。このディレクトリがログイン時にユーザーのホームディレクトリになります。他のストレージ方式と同じように {{ic|~/.identity}} ファイルにユーザーレコードのコピーを保持します。 |
||
+ | また、変更、追加したい場合は次のようにします: |
||
− | == PAM モジュールの有効化 == |
||
− | ''systemd-homed'' のユーザーは伝統的な UNIX の NSS データベース ({{ic|/etc/passwd}}, {{ic|/etc/shadow}}, {{ic|/etc/group}} など) にレコードを記録しないため、デフォルトの {{ic|pam_unix.so}} モジュールではログインができません。提供されている [[PAM]] モジュールを使う必要があります。 |
||
+ | # homectl update ''username'' --''property''=''VALUE'' |
||
− | 例: |
||
− | {{hc|head=/etc/pam.d/system-auth|output=#%PAM-1.0 |
||
+ | オプションの詳細は {{man|1|homectl}} を参照してください。 |
||
− | auth sufficient pam_unix.so try_first_pass nullok |
||
− | -auth sufficient pam_systemd_home.so |
||
− | auth optional pam_permit.so |
||
− | auth required pam_env.so |
||
− | auth required pam_deny.so |
||
+ | === ユーザを管理する === |
||
− | account sufficient pam_unix.so |
||
− | -account sufficient pam_systemd_home.so |
||
− | account optional pam_permit.so |
||
− | account required pam_time.so |
||
+ | ==== 作成 ==== |
||
− | -password sufficient pam_systemd_home.so |
||
− | password sufficient pam_unix.so try_first_pass nullok sha512 shadow |
||
− | password optional pam_permit.so |
||
+ | LUKS の暗号化を使ってユーザを作成する: |
||
− | session required pam_limits.so |
||
− | -session optional pam_systemd_home.so |
||
− | session required pam_unix.so |
||
− | session optional pam_permit.so}} |
||
− | {{Tip|オプションについて詳しくは {{man|8|pam_systemd_home}} を参照。}} |
||
+ | # homectl create ''username'' --storage=luks |
||
− | == 例 == |
||
+ | fscrypt の暗号化を使ってユーザを作成する (fscrypt が[[fscrypt#ファイルシステム|ファイルシステムで有効化されている]]ことを確認してください): |
||
− | 以下は '''homectl''' の使用例です。 |
||
+ | # homectl create ''username'' --storage=fscrypt |
||
− | === fscrypt を使ってユーザー archie を作成 === |
||
+ | 特定の UID、シェル、グループのユーザを作成する: |
||
− | # homectl create archie --storage=fscrypt |
||
+ | # homectl create ''username'' --shell=/usr/bin/zsh --uid=60100 --member-of=wheel,adm,uucp |
||
− | === UID とシェル、グループを指定してユーザー alan を作成 === |
||
+ | 他のオプションは {{man|1|homectl|USER RECORD PROPERTIES}} で見られます。 |
||
− | # homectl create alan --shell=/bin/zsh --uid=1001 -G wheel,storage,games |
||
+ | {{Note|[[ユーザーとグループ#ユーザー管理]]で説明されている注意点が適用されます: ログインシェルは {{ic|/etc/shells}} にリストされているもののうちの一つでなければなりません。}} |
||
− | === |
+ | ==== 削除 ==== |
+ | |||
− | {{Warning|ユーザーの削除は即座に実行されます。注意してください。}} |
||
+ | {{Warning|ユーザの削除は即座に実行されます。注意してください。}} |
||
− | # homectl remove archie |
||
+ | |||
+ | 複数のユーザを同時に削除することができます: |
||
+ | |||
+ | # homectl remove ''username'' ''username2'' |
||
+ | |||
+ | == ヒントとテクニック == |
||
+ | |||
+ | === Forget key on suspend === |
||
+ | |||
+ | {{Warning|[[PAM]] の設定を間違えると、システムの認証が壊れてしまい ''root'' にすらログインできなくなる可能性があります。変更を加える前に、既存の設定ファイルをバックアップすることが推奨されます。}} |
||
+ | |||
+ | {{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] を読んでください。 |
||
+ | |||
+ | === SSH リモートアンロック === |
||
+ | |||
+ | ''systemd-homed'' はパスワードを使用してホームディレクトリを暗号化します。なので、公開鍵認証で設定された SSH ではホームディレクトリをマウントできず、{{ic|authorized_keys}} も読み込めません。可能な解決策としては、authorized keys をあなたのユーザレコードに追加し、認証のために公開鍵とパスワードの両方を要求するというものがあります。以下を {{ic|/etc/ssh/sshd_config}} に追加してください: |
||
+ | |||
+ | {{hc|/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'' フレームワークの外からそのディレクトリを復号する必要があります。緊急時のために[https://bbs.archlinux.org/viewtopic.php?id=258152 フォーラム]からこの解決策のテキストファイルやスクリプトをレスキューディスクに保存しておくと良いでしょう: |
||
+ | |||
+ | # 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 からログアウトした後もホームディレクトリがアクティブなままになる === |
||
+ | |||
+ | [[Plasma]] からログアウトした後もアクティブなユーザプロセス (例: ''dbus-daemon'') が残ることがあります。そのようなプロセスがホームディレクトリのアクティブ化解除を妨げてしまいます。 |
||
+ | |||
+ | これは、[[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 を介して通常どおりに再認証を試みます。