見出し画像

331.3 暗号化ファイルシステム


課題 331: 暗号化
331.3 暗号化ファイルシステム

LPIC303の試験範囲である主題331~335まであるうちの「331 暗号化」から「331.3 暗号化ファイルシステム」についてのまとめ

  • 総重量:3

  • 説明:
    暗号化ファイルシステムを構築し設定できる。

  • 主要な知識範囲:

    • ブロックデバイスとファイルシステム暗号化を理解する。

    • ブロックデバイスを暗号化するために、LUKS1によるdm-cryptを利用する。

    • ファイルシステムを暗号化するために、eCryptfsを利用する。これには、ホームディレクトリとPAM統合を含まれる。

    • plainモードのdm-cryptの知識

    • LUKS2機能の知識

    • LUKSデバイスのClevisと、TMP2とNetwork Bound Disk Encryption (NBDE)/TangのClevis PINの概念的な理解。

  • 重要なファイル、用語、ユーティリティ:

    • cryptsetup (関連するサブコマンドを含む)

    • cryptmount

    • /etc/crypttab

    • ecryptfsd

    • ecryptfs-* commands

    • mount.ecryptfs, umount.ecryptfs

    • pam_ecryptfs


(補足)必要なパッケージ

RockyLinux9

  • cryptsetup:cryptsetup パッケージをインストール

  • cryptmount:ソースからインストールする

  • ecryptfsd:ELRepoリポジトリから ecryptfs-utils パッケージをインストール

  • clevis:clevis パッケージをインストール
    clevis LUKS:clevis-luks パッケージをインストール
    clevic Tang:clevis パッケージをインストール
    clevis TPM2:clevis-pin-tpm2 パッケージをインストール

[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# which cryptsetup
/usr/sbin/cryptsetup
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# rpm -qf /usr/sbin/cryptsetup
cryptsetup-2.6.0-3.el9.x86_64
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# 
[root@lpic303-rocky34 ~]# dnf install elrepo-release
[root@lpic303-rocky34 ~]# dnf install ecryptfs-utils
[root@lpic303-rocky34 ~]#

[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# ecryptfs
ecryptfs-add-passphrase                          ecryptfs-rewrite-file
ecryptfs-find                                    ecryptfs-setup-private
ecryptfs-generate-tpm-key                        ecryptfs-setup-swap
ecryptfs-insert-wrapped-passphrase-into-keyring  ecryptfs-stat
ecryptfs-manager                                 ecryptfs-umount-private
ecryptfs-migrate-home                            ecryptfs-unwrap-passphrase
ecryptfs-mount-private                           ecryptfs-verify
ecryptfs-recover-private                         ecryptfs-wrap-passphrase
ecryptfs-rewrap-passphrase                       ecryptfsd
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# which ecryptfsd
/usr/bin/ecryptfsd
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# rpm -qf /usr/bin/ecryptfsd
ecryptfs-utils-111-21.1.el9.elrepo.x86_64
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# rpm -qa | grep -i clevis | sort
clevis-18-112.el9.x86_64
clevis-luks-18-112.el9.x86_64
clevis-pin-tpm2-0.5.1-2.el9.x86_64
[root@lpic303-rocky34 ~]#

参考
cryptmountコマンドの使い方 #centos8 - Qiita

Ubuntu22.04

  • cryptsetup:cryptsetup パッケージをインストール

  • cryptmount:cryptmount パッケージをインストール

  • ecryptfs:ecryptfsd パッケージをインストール

  • clevice:clevis パッケージをインストール
    clevis LUKS:clevis-luks パッケージをインストール
    clevis Tang:clevis パッケージをインストール
    clevis TPM2:clevis-tpm2 パッケージをインストール

root@lpic303-ubuntu35:~#
root@lpic303-ubuntu35:~# which cryptsetup
/usr/sbin/cryptsetup
root@lpic303-ubuntu35:~#
root@lpic303-ubuntu35:~# dpkg -S /usr/sbin/cryptsetup
dpkg-query: パターン /usr/sbin/cryptsetup に一致するパスが見つかりません
root@lpic303-ubuntu35:~#
root@lpic303-ubuntu35:~#
root@lpic303-ubuntu35:~# which cryptmount
/usr/bin/cryptmount
root@lpic303-ubuntu35:~#
root@lpic303-ubuntu35:~# dpkg -S /usr/bin/cryptmount
cryptmount: /usr/bin/cryptmount
root@lpic303-ubuntu35:~#
root@lpic303-ubuntu35:~#
root@lpic303-ubuntu35:~# which ecryptfsd
/usr/bin/ecryptfsd
root@lpic303-ubuntu35:~#
root@lpic303-ubuntu35:~# dpkg -S /usr/bin/ecryptfsd
ecryptfs-utils: /usr/bin/ecryptfsd
root@lpic303-ubuntu35:~#
root@lpic303-ubuntu35:~#
root@lpic303-ubuntu35:~# clevis
clevis                        clevis-luks-common-functions
clevis-decrypt                clevis-luks-edit
clevis-decrypt-sss            clevis-luks-list
clevis-decrypt-tang           clevis-luks-pass
clevis-decrypt-tpm2           clevis-luks-regen
clevis-encrypt-sss            clevis-luks-report
clevis-encrypt-tang           clevis-luks-unbind
clevis-encrypt-tpm2           clevis-luks-unlock
clevis-luks-bind
root@lpic303-ubuntu35:~# 

root@lpic303-ubuntu35:~#
root@lpic303-ubuntu35:~# which clevis
/usr/bin/clevis
root@lpic303-ubuntu35:~#
root@lpic303-ubuntu35:~# dpkg -S /usr/bin/clevis
clevis: /usr/bin/clevis
root@lpic303-ubuntu35:~#

root@lpic303-ubuntu35:~#
root@lpic303-ubuntu35:~# which clevis-decrypt-tang
/usr/bin/clevis-decrypt-tang
root@lpic303-ubuntu35:~#
root@lpic303-ubuntu35:~# dpkg -S /usr/bin/clevis-decrypt-tang
clevis: /usr/bin/clevis-decrypt-tang
root@lpic303-ubuntu35:~#

root@lpic303-ubuntu35:~#
root@lpic303-ubuntu35:~# which clevis-decrypt-tpm2
/usr/bin/clevis-decrypt-tpm2
root@lpic303-ubuntu35:~#
root@lpic303-ubuntu35:~# dpkg -S /usr/bin/clevis-decrypt-tpm2
clevis-tpm2: /usr/bin/clevis-decrypt-tpm2
root@lpic303-ubuntu35:~#

ブロックデバイスとファイルシステム暗号化

ブロックデバイスの暗号化

  • 暗号化の対象:ブロックデバイス

  • カーネルが提供する dm-crypt を使う

  • 暗号化ツールには cryptsetup や cryptmount がある

  • 暗号化オプションに plainモード と LUKS(Linux Unified Key Setup)モード がある。

  • LUKSには LUKS1 と LUKS2 がある

ファイルシステムの暗号化

  • 暗号化の対象:特定のディレクトリ

  • ファイルシステム上に暗号化するディレクトリを作成しマウントして使う

  • 暗号化ツールには eCryptfs や EncFs がある


(補足)LUKSとは

LUKS の機能
LUKS は、ブロックデバイス全体を暗号化するため、脱着可能なストレージメディアやノート PC のディスクドライブといった、モバイルデバイスのコンテンツを保護するのに適しています。
・暗号化されたブロックデバイスの基本的な内容は任意であり、スワップデバイスの暗号化に役立ちます。また、とりわけデータストレージ用にフォーマットしたブロックデバイスを使用する特定のデータベースに関しても有用です。
・LUKS は、既存のデバイスマッパーのカーネルサブシステムを使用します。
・LUKS はパスフレーズのセキュリティーを強化し、辞書攻撃から保護します。
・LUKS デバイスには複数のキースロットが含まれ、ユーザーはこれを使用してバックアップキーやパスフレーズを追加できます。

LUKS が 行わない こと
LUKS などのディスク暗号化ソリューションは、システムの停止時にしかデータを保護しません。システムの電源がオンになり、LUKS がディスクを復号すると、そのディスクのファイルは、通常、そのファイルにアクセスできるすべてのユーザーが使用できます。
・LUKS は、多くのユーザーが、同じデバイスにアクセスする鍵をそれぞれ所有することが必要となるシナリオには適していません。LUKS1 形式は鍵スロットを 8 個提供し、LUKS2 形式は鍵スロットを最大 32 個提供します。
・LUKS は、ファイルレベルの暗号化を必要とするアプリケーションには適していません。

16.13. LUKS を使用したブロックデバイスの暗号化 Red Hat Enterprise Linux 8 | Red Hat Customer Portal

LUKS1によるdm-cryptを利用

コマンド(LUKSモード)

  • cryptsetup luksFormat <device> <name>
    LUKSとして初期化する

  • cryptsetup luksOpen <device> <name>
    LUKSパーティションを開く

  • cryptsetup luksClose <name>
    cryptsetup close <name>
    LUKSパーティションを閉じる

  • cryptsetup luksAddKey <device> <keyfile>
    パスフレーズを追加する

  • cryptsetup luksKillSlot <device> <keyslotnum>
    cryptsetup luksDelKey <device> <keyslotnum>
    パスフレーズを削除する

  • cryptsetup luksDump <device>
    ステータスを表示する

  • cryptsetup isLuks <device>
    LUKSパーティションかどうかを確認する

手順

  1. ブロックデバイスを追加する

  2. `fdisk` でパーティションを作成する

  3. `cryptsetup luksFormat <device>`で初期化する

  4. `cryptsetup open --type luks <device> <name>`
    または
    `cryptsetup luksOpen <device> <name>`
    で暗号化ディスクを開く

  5. `vgcreate` でボリュームグループ(VG)を作成する

  6. `lvcreate` で論理ボリューム(LV)を作成する

  7. `mkfs` でファイルシステムを作成する

  8. `mount` でマウントする

起動時にマウントさせる手順

  1. パスフレーズをテキストファイルに平文で保存しておく

  2. `cryptsetup luksAddKey <device> [<key file with new key>]` で暗号化ディスクにアクセスするためのパスフレーズ追加する

  3. "/etc/crypttab" にデバイス名とパスフレーズファイルの対応を記述する

  4. "/etc/fstab" にデバイス名とマウントポイントの対応を記述する

参考


plainモードのdm-cryptの知識

plain モードの暗号化オプション
dm-crypt の plain モードでは、デバイスのマスター鍵が存在せず、セットアップも必要ありません。代わりに、直接暗号化オプションを使用して暗号ディスクと名前付きデバイスのマッピングを作成します。パーティションやデバイス全体に対してマッピングを作成できます。後者の場合、パーティションテーブルも不要です。

dm-crypt/デバイスの暗号化 - ArchWiki

コマンド(plainモード)

  • cryptsetup open <device> <name> --type plain
    cryptsetup create <name> <device>
    デバイス名と暗号名を対応付けする

  • cryptsetup close <name>
    cryptsetup remove <name>
    デバイス名と暗号名を対応付けを削除する

  • cryptsetup resize <name>
    サイズを変更する

  • cryptsetup status <name>
    ステータスを表示する


LUKS2機能の知識

LUSK1とLUKS2の違い

  • 鍵スロットの数
    LUKS1:8個
    LUKS2:32個

  • 最小の暗号化単位=セクター
    LUKS1:512 バイトに固定
    LUKS2:調整可能、デフォルトで最大 4KiB

  • そのた
    LUKS2:内部的にメタデータに JSON テキスト形式を使用し、メタデータの冗長性を提供し、メタデータの破損を検出し、メタデータのコピーから自動的に修復します。


cryptmount

コマンドオプション

  • -m | --mount
    マウントする

  • -u | --unmount
    アンマウントする

  • -S | --status
    ステータスを確認する

  • -l | --list
    一覧表示

  • -s | --swapon
    スワップの有効化

  • -x | --swapoff
    スワップの無効化

  • -p | --prepare
    デバイスの準備

  • -r | --release
    デバイスの開放

  • -c | --change-password
    パスワードの変更

  • -g | --generate-key size
    復号キーの作成


LUKSデバイスのClevisと、TPM2、Network Bound Disk Encryption (NBDE)、TangのClevis PINの概念的な理解


Clevis

暗号化を自動化するフレームワーク
暗号化をする際、復号化する際 それぞれパスフレーズの入力を求められるが、Clevisを使うことで自動化できる。
また、ClevisにはPINというプラグインによりtang、tpm2、nbde、sssなどの手段が選択できる。

Clevis PIN : TPM2

$ clevis encrypt tpm2 '{}' < input-plain.txt > secret.jwe
$ clevis encrypt tpm2 '{"hash":"sha256","key":"rsa"}' < input-plain.txt > secret.jwe
$ clevis decrypt < secret.jwe > output-plain.txt

Clevis PIN : Network Bound Disk Encryption (NBDE)

Implement Network Bound Disk Encryption with the NBDE client and server RHEL System Roles

Clevis PIN : Tang

https://github.com/latchset/tang

$ clevis encrypt tang '{"url":"http://tang.srv:port"}' < input-plain.txt > secret.jwe
$ curl -sfg http://tang.srv:port/adv -o adv.jws
$ echo 'hello' | clevis encrypt tang '{"url":"http://tang.srv:port","adv":"adv.jws"}'
$ clevis decrypt < secret.jwe > output-plain.txt

eCryptfsを利用する

特徴

  • ディレクトリを暗号化する

  • 暗号化ディレクトリはユーザーごとに一つだけ作成できる

  • ホームディレクトリか任意のディレクトリを暗号化できる
    ユーザーごとの暗号化ディレクトリは ~/.Private/ になる
    ホームディレクトリを暗号化した場合は /home/.ecryptfs/$USER/.Private/  になる

  • パスフレーズにはログインパスフレーズとマウントパスフレーズがある。
    ログインパスフレーズ:ユーザーのログインパスワードと同じにする
    マウントパスワード:自動生成可→ ~/.ecryptfs/wrapped-passphraseに保存される

  • pam_ecryptfs.soをロードしておくと、ユーザーのログイン/ログアウト操作に応じて自動マウント/自動アンマウントができる

コマンド

  • mount -t ecryptfs <SRC DIR> <DST DIR> -o <OPTIONS>
    mount.ecryptfs 
    暗号化ディレクトリをマウントする

  • umount <dir>
    umount.ecryptfs 
    暗号化ディレクトリをアンマウントする

  • ecryptfs-add-passphrase
    パスフレーズを追加する

  • ecryptfs-migrate-home
    ホームディレクトリを暗号化する

  • ecryptfs-setup-private
    データディレクトリを暗号化する
    --nopwcheck:
    --noautomount:自動マウントをしない

  • ecryptfs-mount-private
    暗号化したディレクトリをマウントする

  • ecryptfs-umount-private
    暗号化したディレクトリをアンマウントする

  • ecryptfs-recover-private

  • ecryptfs-find
    暗号化されたファイル名から、暗号化前のファイル名を取り出す

  • ecryptfs-wrap-passphrase
    ~/.ecryptfs/wrapped-passphraseにマウントパスフレーズを登録する

  • ecryptfs-unwrap-passphrase
    ~/.ecryptfs/wrapped-passphraseのマウントパスフレーズを確認する

参考


参考文献


この記事が気に入ったらサポートをしてみませんか?