GNU/Linux >> Linux の 問題 >  >> Linux

単一のLinuxファイルシステムを暗号化する方法

ファイルシステムを暗号化する理由はいくつかあります。たとえば、保存中に機密情報を保護する、ファイルシステム上の個々のファイルを暗号化することを心配する必要がない、などの理由があります。 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用にまだフォーマットしていません。 またはxfsmkfsと入力します 次にタブを押します このパーティションをフォーマットするためのオプションがいくつかあることを示しています:

# 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パスワードを使用してデータをロックする

Linux
  1. Linuxシステムリカバリにsystemd-nspawnを使用する方法

  2. LinuxでDM-CryptLUKSを使用してパーティションを暗号化する方法

  3. 1つのコマンドでKaliLinuxを更新する方法

  1. Linuxでgocryptfsを使用してファイルを暗号化する方法

  2. Linuxパーティションまたは論理ボリュームにファイルシステムを作成する方法

  3. Linux で Snapper コマンドを使用してファイルシステムのスナップショットを作成する方法

  1. LinuxファイルシステムでパーティションのUUIDを変更する方法

  2. Linuxでマウントされたファイルシステムタイプを見つける方法

  3. Linux –ファイルシステムキャッシュにRAMを与える方法は?