GNU/Linux >> Znalost Linux >  >> Linux

Jak zašifrovat jeden souborový systém Linux

Existuje několik různých důvodů, proč byste mohli chtít šifrovat souborový systém, jako je ochrana citlivých informací, když jsou v klidu, nemusíte se starat o šifrování jednotlivých souborů v souborovém systému nebo jiné důvody. Chcete-li ručně zašifrovat souborový systém v Red Hat Enterprise Linux (RHEL), můžete použít cryptsetup příkaz. Tento článek vás provede tím, jak to udělat pomocí Ansible pro server RHEL 8.

Než se pustíme do používání Ansible k automatizaci tohoto procesu, projdeme si nejprve kroky k ručnímu vytvořit šifrovaný souborový systém, abychom lépe porozuměli tomu, co požadujeme od Ansible udělat. V RHEL jsou nativní příkazy, které vám umožňují vytvořit šifrovaný souborový systém, a my je použijeme v našem návodu.

[ Mohlo by se vám také líbit čtení: Konfigurace LUKS:Linux Unified Key Setup ]

Ručně vytvořte šifrovaný oddíl

Pro začátek se podíváme na zařízení, na které dám oddíl:

[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):

Vidíme, že můj /dev/vdc již má oddíl, ale stále je volné místo pro další oddíl. Vytvořím svůj /dev/vdc2 oddíl:

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 ~]#

Nyní mám oddíl /dev/vdc2 o velikosti 7G. Dále naformátuji tento oddíl pro 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 ~]#

K otevření zašifrovaného svazku používám luksOpen argument pro cryptsetup , a řeknu mu jméno, které chci, aby můj cíl byl 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 ~]#

Po otevření ji mohu skutečně použít. V tomto příkladu tam vložím skupinu svazků:

[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 ~]#

Mám skupinu svazků, manual_luks_vg , takže jsem nyní schopen vložit logický svazek dovnitř:

[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 příkaz zadal název mého nového logického svazku, manual_luks_logvol , jeho velikost, 5G, a že logický svazek by měl být ve skupině svazků manual_luks_vg .

V tuto chvíli mám logický svazek, ale ještě jsem ho nenaformátoval pro ext nebo xfs . Zadáním mkfs a poté stiskněte Tab ukazuje mi, že existuje několik možností, jak naformátovat tento oddíl:

# mkfs
mkfs         mkfs.cramfs  mkfs.ext2    mkfs.ext3    mkfs.ext4    mkfs.minix   mkfs.xfs

Zde použiji 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

Mám to naformátované, ale nenamontované. Chcete-li jej připojit, vytvořím nový adresář a poté spustím mount příkaz:

[root@ansibleclient ~]# mkdir /manual_luks
[root@ansibleclient ~]# mount /dev/manual_luks_vg/manual_luks_logvol /manual_luks

K ověření, že to fungovalo, mohu použít mount a pak tam zapsat do nového souboru:

[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 ~]#

Abych umožnil systému připojit šifrovaný oddíl při spouštění, musím aktualizovat /etc/crypttab soubor. Formát souboru je název vašeho luks zařízení, fyzický oddíl a pak soubor, jehož jediným obsahem je heslo pro tento luks zařízení:

# cat /etc/crypttab
manualluks /dev/vdc2 /root/manualluks.txt

V souboru /root/manualluks.txt , mám pouze prosté heslo pro můj luks zařízení.

Používám luksAddKey argument pro přidání klíče do zařízení:

# cryptsetup luksAddKey /dev/vdc2 /root/manualluks.txt

Chcete-li připojit souborový systém při spouštění, upravte /etc/fstab soubor, takže existuje záznam pro logický svazek a jeho bod připojení:

/dev/manual_luks_vg/manual_luks_logvol /manual_luks xfs defaults 0 0

Poté, co provedete ruční kroky pro vytvoření oddílu a zápis do něj, restartujte systém, abyste ověřili, že nastavení jsou trvalá a systém se restartuje podle očekávání.

Nyní, když rozumíme tomu, co musíme udělat pro ruční vytvoření šifrovaného oddílu, víme, co musíme udělat, abychom tento proces zautomatizovali.

Automatizujte vytváření šifrovaného oddílu

Skript hostovaný na https://people.redhat.com/pgervase/sysadmin/partition.yml poskytuje jeden příklad, jak použít Ansible, abyste vzali prázdný disk a prošli kroky k vytvoření šifrovaného oddílu, jeho připojení a pak napište do toho. Stejně jako mnoho věcí s technologií existuje několik různých způsobů, jak toho dosáhnout, ale tento přístup také ukáže některé příklady proměnných, získávání faktů a použití bloku a záchrany.

---
- 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

V horní části příručky umístím základní informace a deklaruji několik proměnných. Spíše než mít parametry napevno zakódované v playbooku tím, že je budu mít definovány jako proměnné, mohu je přepsat při spuštění hry a umožnit použití úloh pro jiné účely.

 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

Prvních několik úloh, které se spustí, získá informace o mém cílovém systému a ujistí se, že nepřepíšu existující oddíl. Poté zkopíruji soubor klíče na můj vzdálený systém. Tento soubor klíče obsahuje přístupovou frázi, která bude použita, když vytvořím kontejner LUKS. Ne všechny systémy budou mít cryptsetup balíček nainstalován, takže další věcí, kterou musíte udělat, je nainstalovat RPM, pokud ještě není nainstalováno.

   - 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 }}'

V tuto chvíli mám systém, který je připraven a vhodný k rozdělení. Pro své vlastní účely protokolování mám úlohu, která vytiskne informace, které se parted vrací pro mé cílové zařízení, /dev/sdb . Oddíly by zde měly být prázdné, protože jsem již selhal, když ansible_devices.vdb.partitions.vdb1 je definován, takže toto je pouze pro ověření. Dále používám parted k vytvoření mého oddílu. Abych zachytil případné chyby v tomto kroku – možná je mé cílové zařízení příliš malé nebo se stalo něco jiného – používám blok a záchranu k registraci výstupu parted a poté to zobrazte v selhání součást mé záchranné sekce.

    - 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 }}"

Nyní, když mám oddíl a cryptsetup nainstalovaný, musím provést část LUKS a souborový systém mého nastavení. Prvním krokem je použití luks_device modulu spolu se souborem klíče které jsem zkopíroval. Poté, co mám kontejner LUKS, vytvořím skupinu svazků, poté logický svazek a poté souborový systém.

       - 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

Poté, co tam mám souborový systém, připojím souborový systém a napíšu testovací soubor, abych ověřil, že vše funguje správně. Posledním krokem je vytvoření /etc/crypttab soubor, aby systém mohl připojit můj souborový systém, když se restartuje.

[ Chcete se dozvědět více o zabezpečení? Podívejte se na kontrolní seznam zabezpečení IT a dodržování předpisů. ] 

Sbalit

Proces ruční konfigurace šifrovaného oddílu není nijak zvlášť obtížný nebo dokonce časově náročný. Tyto úkoly však Ansible dokonale zvládne za vás a pomůže zajistit konzistentní, bezpečné a reprodukovatelné konfigurace.

Další informace o zařízeních LUKS naleznete na adrese:

  • Jak vytvořit bitovou kopii šifrovanou LUKS a připojit ji při spouštění
  • Šifrování blokových zařízení pomocí LUKS
  • Uzamykání dat pomocí hesla LUKS ve webové konzoli RHEL

Linux
  1. Jak šifrovat soubory pomocí gocryptfs na Linuxu

  2. Jak vytvořit souborový systém na linuxovém oddílu nebo logickém svazku

  3. Jak zašifrovat oddíl pomocí DM-Crypt LUKS na Linuxu

  1. Jak používat systemd-nspawn pro obnovu systému Linux

  2. Linux – Jak dát Ram do mezipaměti souborového systému?

  3. Jak aktualizovat Kali Linux jediným příkazem

  1. Jak změnit UUID oddílu v systému souborů Linux

  2. Jak najít typ připojeného souborového systému v Linuxu

  3. Jak vytvořit snímky systému souborů pomocí příkazu Snapper v systému Linux