ファイルシステムを暗号化する理由はいくつかあります。たとえば、保存中に機密情報を保護する、ファイルシステム上の個々のファイルを暗号化することを心配する必要がない、などの理由があります。 Red Hat Enterprise Linux(RHEL)でファイルシステムを手動で暗号化するには、cryptsetup
を使用できます。 指図。この記事では、Ansibleを使用してRHEL8サーバーでこれを行う方法について説明します。
Ansibleを使用してそのプロセスを自動化する前に、まず手動の手順を実行しましょう。 暗号化されたファイルシステムを作成して、Ansibleに何を求めているかをよりよく理解できるようにします。 RHELには、暗号化されたファイルシステムを作成できるネイティブコマンドがあり、ウォークスルーでそれらを使用します。
[読むこともお楽しみいただけます:LUKSの構成:Linux Unified Key Setup]
暗号化されたパーティションを手動で作成する
まず、パーティションを配置するデバイスを見ていきます。
[root@ansibleclient ~]# fdisk /dev/vdc
Welcome to fdisk (util-linux 2.32.1).
Changes will remain only in memory until you decide to write them.
Be careful before using the write command.
Command (m for help): p
Disk /dev/vdc: 30 GiB, 32212254720 bytes, 62914560 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x803e8b19
Device Boot Start End Sectors Size Id Type
/dev/vdc1 2048 6291455 6289408 3G 83 Linux
Command (m for help):
私の/dev/vdc
すでにパーティションがありますが、別のパーティションに使用できるスペースがまだあります。 /dev/vdc2
を作成します パーティション:
Command (m for help): n
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p):
Using default response p.
Partition number (2-4, default 2):
First sector (6291456-62914559, default 6291456):
Last sector, +sectors or +size{K,M,G,T,P} (6291456-62914559, default 62914559): +7G
Created a new partition 2 of type 'Linux' and of size 7 GiB.
Command (m for help): p
Disk /dev/vdc: 30 GiB, 32212254720 bytes, 62914560 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x803e8b19
Device Boot Start End Sectors Size Id Type
/dev/vdc1 2048 6291455 6289408 3G 83 Linux
/dev/vdc2 6291456 20971519 14680064 7G 83 Linux
Command (m for help): w
The partition table has been altered.
Syncing disks.
[root@ansibleclient ~]# partprobe /dev/vdc
[root@ansibleclient ~]#
これで、パーティション/dev/vdc2
ができました。 サイズ7Gの。次に、そのパーティションをluks
用にフォーマットします :
[root@ansibleclient ~]# cryptsetup luksFormat /dev/vdc2
WARNING!
========
This will overwrite data on /dev/vdc2 irrevocably.
Are you sure? (Type uppercase yes): YES
Enter passphrase for /dev/vdc2:
Verify passphrase:
[root@ansibleclient ~]#
暗号化されたボリュームを開くには、luksOpen
を使用します cryptsetup
の引数 、ターゲットにmanualluks
にしたい名前を指定します :
[root@ansibleclient ~]# cryptsetup luksOpen /dev/vdc2 manualluks
Enter passphrase for /dev/vdc2:
[root@ansibleclient ~]# ls /dev/mapper/
control examplevg-examplelv manualluks mycrypt rhel-root rhel-swap
[root@ansibleclient ~]#
開封後は実際に使ってみます。この例では、ボリュームグループをそこに配置します:
[root@ansibleclient ~]# vgcreate manual_luks_vg /dev/mapper/manualluks
Physical volume "/dev/mapper/manualluks" successfully created.
Volume group "manual_luks_vg" successfully created
[root@ansibleclient ~]# vgdisplay manual_luks_vg
--- Volume group ---
VG Name manual_luks_vg
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size 6.98 GiB
PE Size 4.00 MiB
Total PE 1787
Alloc PE / Size 0 / 0
Free PE / Size 1787 / 6.98 GiB
VG UUID bjZ7FM-9jNw-pdfs-Dd5y-5IsF-tEdK-CpVqH4
[root@ansibleclient ~]#
ボリュームグループmanual_luks_vg
があります 、これで論理ボリュームを内部に配置できるようになりました:
[root@ansibleclient ~]# lvcreate -n manual_luks_logvol -L +5G manual_luks_vg
Logical volume "manual_luks_logvol" created.
[root@ansibleclient ~]# lvdisplay manual_luks_vg
--- Logical volume ---
LV Path /dev/manual_luks_vg/manual_luks_logvol
LV Name manual_luks_logvol
VG Name manual_luks_vg
LV UUID nR5UKo-jRvR-97L0-60YF-dbSp-D0pc-l8W3Td
LV Write Access read/write
LV Creation host, time ansibleclient.usersys.redhat.com, 2020-12-03 10:15:03 -0500
LV Status available
# open 0
LV Size 5.00 GiB
Current LE 1280
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:5
[root@ansibleclient ~]#
lvcreate
コマンドは、新しい論理ボリュームの名前manual_luks_logvol
を指定しました 、そのサイズ、5G、および論理ボリュームはmanual_luks_vg
のボリュームグループに含まれている必要があります 。
この時点で、論理ボリュームがありますが、ext
用にまだフォーマットしていません。 またはxfs
。 mkfs
と入力します 次にタブを押します このパーティションをフォーマットするためのオプションがいくつかあることを示しています:
# mkfs
mkfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4 mkfs.minix mkfs.xfs
ここでは、mkfs.xfs
を使用します :
[root@ansibleclient ~]# mkfs.xfs /dev/manual_luks_vg/manual_luks_logvol
meta-data=/dev/manual_luks_vg/manual_luks_logvol isize=512 agcount=4, agsize=327680 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=1310720, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
フォーマットしましたが、マウントしていません。マウントするには、新しいディレクトリを作成してから、mount
を実行します コマンド:
[root@ansibleclient ~]# mkdir /manual_luks
[root@ansibleclient ~]# mount /dev/manual_luks_vg/manual_luks_logvol /manual_luks
それが機能したことを確認するために、mount
を使用できます 単独で、そこに新しいファイルを書き込みます:
[root@ansibleclient ~]# mount | grep luks
/dev/mapper/manual_luks_vg-manual_luks_logvol on /manual_luks type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
[root@ansibleclient ~]# date > /manual_luks/testing
[root@ansibleclient ~]# cat /manual_luks/testing
Thu Dec 3 10:24:42 EST 2020
[root@ansibleclient ~]#
システムが起動時に暗号化されたパーティションをマウントできるようにするには、/etc/crypttab
を更新する必要があります ファイル。ファイルの形式は、luks
の名前です。 デバイス、物理パーティション、そしてその内容がそのluks
のパスワードのみであるファイル デバイス:
# cat /etc/crypttab
manualluks /dev/vdc2 /root/manualluks.txt
/root/manualluks.txt
内 、luks
のプレーンテキストパスワードだけを持っています デバイス。
luksAddKey
を使用しています デバイスにキーを追加するための引数:
# cryptsetup luksAddKey /dev/vdc2 /root/manualluks.txt
起動時にファイルシステムをマウントするには、/etc/fstab
を編集します ファイルであるため、論理ボリュームとそのマウントポイントのエントリがあります:
/dev/manual_luks_vg/manual_luks_logvol /manual_luks xfs defaults 0 0
パーティションを作成して書き込むための手動の手順を実行した後、システムを再起動して、設定が永続的であり、システムが期待どおりに再起動することを確認します。
暗号化されたパーティションを手動で作成するために何をする必要があるかを理解したので、そのプロセスを自動化するために何をする必要があるかがわかりました。
暗号化されたパーティションの作成を自動化する
https://people.redhat.com/pgervase/sysadmin/partition.ymlでホストされているスクリプトは、Ansibleを使用して空のディスクを取得し、暗号化されたパーティションを作成してマウントしてから、手順を実行する方法の一例を示しています。それに書き込みます。テクノロジーに関する多くのことと同様に、これを達成するためのいくつかの異なる方法がありますが、このアプローチでは、変数、事実の取得、ブロックとレスキューの使用の例もいくつか示されます。
---
- name: pb to create partition
hosts: all
become: true
vars:
target_size: 3GiB
target_device: /dev/vdc
myvg: examplevg
mylv: examplelv
keyfile: /root/mylukskey.yml
mycrypt: mycrypt
プレイブックの上部に、いくつかの基本的な情報を配置し、いくつかの変数を宣言します。プレイブックにパラメーターをハードコーディングするのではなく、パラメーターを変数として定義することで、プレイの実行時にパラメーターをオーバーライドして、タスクを他の目的に使用できるようにすることができます。
tasks:
- name: block for doing basic setup and verification for target system
block:
- name: get facts for "{{ target_device }}"
parted:
device: "{{ target_device }}"
register: target_facts
- name: print facts for "{{ target_device }}"
debug:
msg: "{{ target_facts }}"
- name: check to see if there are any facts for /dev/vdb1. this means there are existing partitions that we would overwrite, so fail
debug:
msg: "{{ target_facts }}.partitions"
failed_when: ansible_devices.vdb.partitions.vdb1 is defined ### if vdb1 is defined, there's already a partition there, so abort.
- name: print size for the disk
debug:
msg: "the size is {{ target_facts['disk']['size'] }} kib"
- name: copy keyfile to remote system
copy:
src: mylukskey.yml
dest: "{{ keyfile }}"
- name: make sure cryptsetup is installed
yum:
name: cryptsetup
state: installed
実行される最初のいくつかのタスクは、ターゲットシステムに関する情報を取得し、既存のパーティションを上書きしないことを確認します。次に、キーファイルをコピーします 私のリモートシステムに。このキーファイル LUKSコンテナを作成するときに使用されるパスフレーズが含まれています。すべてのシステムにcryptsetup
があるわけではありません パッケージがインストールされているので、次に行うことは、RPMがまだインストールされていない場合はそのRPMをインストールすることです。
- name: block to attempt to get info on what my destination device will become
block:
- name: task to attempt to get info on what my destination device will be
parted:
device: "{{ target_device}}"
number: 1
state: info
register: info_output
- name: print info_output
debug:
msg: "{{ info_output }}"
- name: block to attempt parted
block:
- name: use parted in block to create new partition
parted:
device: "{{ target_device }}"
number: 1
state: present
part_end: "{{ target_size }}"
register: parted_output
rescue:
- name: parted failed
fail:
msg: 'parted failed: {{ parted_output }}'
この時点で、パーティション化の準備ができて適切なシステムができました。私自身のロギングの目的で、parted
の情報を出力するタスクがあります ターゲットデバイス/dev/sdb
に返されます 。 ansible_devices.vdb.partitions.vdb1 のときにすでに失敗しているため、ここのパーティションは空白になっているはずです。 が定義されているので、これは単に検証用です。次に、parted
を使用します パーティションを作成します。このステップでエラーをキャッチするために(宛先デバイスが小さすぎるか、何か他のことが起こった可能性があります)、ブロックとレスキューを使用してparted
の出力を登録します 次に、それを失敗に表示します 私のレスキューセクションの一部です。
- name: block for LUKS and filesystem tasks
block:
- name: create LUKS container with passphrase
luks_device:
device: "{{ target_device }}1"
state: present
name: "{{ mycrypt }}"
keyfile: "{{ keyfile }}"
- name: open luks container
luks_device:
device: "{{ target_device }}1"
state: opened
name: "{{ mycrypt }}"
keyfile: "{{ keyfile }}"
- name: create a new volgroup in that partition
lvg:
vg: "{{ myvg }}"
pvs: "/dev/mapper/{{ mycrypt }}"
- name: create a logvol in my new vg
lvol:
vg: "{{ myvg }}"
lv: "{{ mylv }}"
size: +100%FREE`
- name: create a filesystem
filesystem:
fstype: xfs
dev: "/dev/mapper/{{ myvg }}-{{ mylv }}"
これで、パーティションとcryptsetup
ができました。 インストールしたら、セットアップのLUKSとファイルシステムの部分を実行する必要があります。最初のステップは、luks_device
を使用することです モジュールとキーファイル コピーしました。 LUKSコンテナーを作成したら、ボリュームグループ、論理ボリューム、ファイルシステムの順に作成します。
- name: mount device
mount:
path: /mnt
src: "/dev/mapper/{{ myvg }}-{{ mylv }}"
state: mounted
fstype: xfs
- name: put some content in my new filesystem
copy:
content: "this is secure content!"
dest: /mnt/newcontent.txt
- name: set content in /etc/crypttab so I can mount the partition on reboot
copy:
content: "{{ mycrypt }} {{ target_device }}1 {{ keyfile }}"
dest: /etc/crypttab
owner: root
group: root
mode: 0644
そこにファイルシステムができたら、ファイルシステムをマウントしてテストファイルを作成し、すべてが正しく機能していることを確認します。最後のステップは、/etc/crypttab
を作成することです。 ファイルを再起動したときにシステムがファイルシステムをマウントできるようにします。
[セキュリティについてもっと知りたいですか? ITセキュリティとコンプライアンスのチェックリストを確認してください。 ]
まとめ
暗号化されたパーティションを手動で構成するプロセスは、特に難しくはなく、時間もかかりません。ただし、このようなタスクはAnsibleが処理するのに最適であり、一貫性があり、安全で、再現性のある構成を保証するのに役立ちます。
LUKSデバイスの詳細については、次のURLを参照してください。
- LUKSで暗号化されたイメージを作成して起動時にマウントする方法
- LUKSを使用したブロックデバイスの暗号化
- RHELWebコンソールでLUKSパスワードを使用してデータをロックする