Protección de datos almacenados en GNU/Linux

harddriveLos permisos estándar del sistema de ficheros de Linux  permiten protegerse de accesos no deseados. Sin embargo, en ocasiones, esta protección no es suficiente, dado que pueden existir ciertas situaciones que permitan a otros usuarios acceder a nuestros datos. Algunas de estas situaciones pueden ser:

  • En la utilización de un sistema de almacenamiento en una infraestructura externa, cualquier usuario con privilegios de superusuario puede acceder sin restricciones a cualquier información.
  • Cualquier tipo de acceso directo al disco duro desde un sistema operativo externo, montando el disco duro en otro ordenador.
  • La utilización de un live-cd en el arranque de un equipo, nos permite acceder a los datos cortocirtuitando todos los permisos de los ficheros.

La solución que proponemos en este articulo, es la encriptación de los datos como medida protección.

A continuación, detallamos como utilizar esta técnica en los diferentes niveles del sistema de ficheros:

1. Protección a nivel de fichero

La solución más simple y flexible para proteger un fichero sensible, es encriptarlo directamente, utilizando el comando bcrypt. Para realizar el encriptado realizamos los siguiente pasos:

Disponemos de un fichero no encriptado (public):

[root@linux ~]# cat public
Fichero con contenido publico.

CETA-CIEMAT

Se encripta el contenido del fichero public enviando el resultado a un nuevo fichero public.bfe, eliminando el fichero original public:

[root@linux ~]# bcrypt public
Encryption key:
Again:
[root@linux ~]# ls
public.bfe

Verificamos el contenido del nuevo fichero encriptado:

[root@linux ~]# cat public.bfe
T³òQr>.Íÿ«4ax_z¼ÃrzÈÝyì¦@ï'O>Sl`»º(âüQÉÊ´0ÅÁjÕ!XN0x¶ãR§zÆ0ǬG~}ù{ðSÑ´}ÚwòÜRä·Qææ,

Para visualizar el contenido de public.bfe sin desencriptarlo:

[root@linux ~]# bcrypt -r -o public.bfe
Encryption key:
Fichero con contenido publico.

CETA-CIEMAT

Para desencriptar el contenido del fichero public.bfe:

[root@linux ~]# bcrypt public.bfe
Encryption key:
[root@linux ~]# ls
public
[root@linux ~]# cat public
Fichero con contenido publico.

CETA-CIEMAT

El inconveniente de este método, es que el usuario está obligado desencriptar manualmente cada fichero que desee consultar, además de tener que volver a encriptar el fichero si realiza alguna modificación.

NOTA: La utilidad bcrypt se encuentra en el paquete bcrypt de los repositorios EPEL o RepoForge (antiguo RPMForge).

2.Protección a nivel de disco o partición

Otra solución es gestionar el encriptado directamente a nivel de bloques o de discos. En este sistema el acceso es transparente por parte del usuario, ya que es el sistema el que se encarga de encriptar los bloques en el momento de su escritura y desencriptarlos cuando se realiza la lectura.

Utilizaremos la utilidad cryptsetup para realizar la encriptación a nivel de disco.

yum install cryptsetup-luks

Inicializamos la partición /dev/sdb1  y establecemos la passphrase (a modo de contraseña):

[root@linux ~]#  cryptsetup -y -v luksFormat /dev/sdb1

WARNING!
========
This will overwrite data on /dev/sdb1 irrevocably.

Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase:
Verify passphrase:
Command successful.

La partición /dev/sdb1 no puede ser montada por los medios convencionales:

[root@linux ~]# mount /dev/sdb1 /mnt/data/
mount: unknown filesystem type 'crypto_LUKS'

Creamos un fichero especial de tipo bloque a partir de una partición encriptada. Para ello, es importante introducir la clave de encriptación:

[root@linux ~]# cryptsetup luksOpen /dev/sdb1 securedev
Enter passphrase for /dev/sdb1:

Damos formato ext4 al fichero de bloques:

[root@linux ~]# mkfs.ext4 /dev/mapper/securedev
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
524288 inodes, 2095962 blocks
104798 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2147483648
64 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 28 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

El fichero de bloques creado nos permite acceder a los datos desencriptados:

[root@linux ~]# mount /dev/mapper/securedev /mnt/data
[root@linux ~]# ls /mnt/data/
lost+found

El sistema de ficheros montado no permite saber que se trata de un soporte físico encriptado:

[root@linux ~]# mount
/dev/mapper/VolGroup00-LogVol00 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda3 on /boot type ext4 (rw)
/dev/mapper/VolGroup00-LogVol01 on /var/log type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/mapper/securedev on /mnt/data type ext4 (rw)

Por último, podemos conocer el estado con el siguiente comando:

[root@linux ~]# cryptsetup -v status securedev
/dev/mapper/securedev is active and is in use.
  type:  LUKS1
  cipher:  aes-cbc-essiv:sha256
  keysize: 256 bits
  device:  /dev/sdb1
  offset:  4096 sectors
  size:    16767701 sectors
  mode:    read/write
Command successful.

3. Protección a nivel de sistema de ficheros

El mejor compromiso entre la flexibilidad y la eficiencia lo aporta la encriptación a nivel del sistema de ficheros.  La solución mas extendida para realizar este tipo de encriptación es ecryptfs.

La idea es utilizar un directorio, generalmente oculto, para almacenar en él los datos encriptados. Este directorio podrá montarse como un sistema de ficheros ecryptfs. Cualquier operación de montaje debe validarse mediante una contraseña (passphrase).

La utilidad ecrytfs podemos encontrarla en el paquete ecryptfs-utils:

[root@linux ~]# yum install ecryptfs-utils

Creamos el directorio .data:

[root@linux ~]# mkdir .data

Realizamos el encriptado del directorio .data utilizando el punto de montaje /data:

[root@linux ~]# mount -t ecryptfs .data /data
Select key type to use for newly created files:
 1) tspi
 2) passphrase
 3) openssl
Selection: 2
Passphrase:
Select cipher:
 1) aes: blocksize = 16; min keysize = 16; max keysize = 32 (not loaded)
 2) blowfish: blocksize = 16; min keysize = 16; max keysize = 56 (not loaded)
 3) des3_ede: blocksize = 8; min keysize = 24; max keysize = 24 (not loaded)
 4) cast6: blocksize = 16; min keysize = 16; max keysize = 32 (not loaded)
 5) cast5: blocksize = 8; min keysize = 5; max keysize = 16 (not loaded)
Selection [aes]:
Select key bytes:
 1) 16
 2) 32
 3) 24
Selection [16]:
Enable plaintext passthrough (y/n) [n]:
Enable filename encryption (y/n) [n]:
Attempting to mount with the following options:
  ecryptfs_unlink_sigs
  ecryptfs_key_bytes=16
  ecryptfs_cipher=aes
  ecryptfs_sig=c8e1036f4a06f430
WARNING: Based on the contents of [/root/.ecryptfs/sig-cache.txt],
it looks like you have never mounted with this key
before. This could mean that you have typed your
passphrase wrong.

Would you like to proceed with the mount (yes/no)? : yes
Would you like to append sig [c8e1036f4a06f430] to
[/root/.ecryptfs/sig-cache.txt]
in order to avoid this warning in the future (yes/no)? : yes
Successfully appended new sig to user sig cache file
Mounted eCryptfs

Comprobamos que el montaje se ha realizado correctamente:

[root@linux /]# mount
/dev/mapper/VolGroup00-LogVol00 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda3 on /boot type ext4 (rw)
/dev/mapper/VolGroup00-LogVol01 on /var/log type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/root/.data on /data type ecryptfs (rw,ecryptfs_sig=c8e1036f4a06f430,ecryptfs_cipher=aes,ecryptfs_key_bytes=16,ecryptfs_unlink_sigs)

Creamos un fichero en el sistema de ficheros montado:

[root@linux ~]# cd /data
[root@linux data]# echo "Mensaje de prueba" > file.txt
[root@linux data]# cat file.txt
Mensaje de prueba

Si desmontamos e intentamos visualizar el fichero creado:

[root@linux /]# cd
[root@linux ~]# umount /data
[root@linux ~]# cd .data
[root@linux .data]# ls
file.txt
[root@linux .data]# cat file.txt
éRÕ §"3DUfw`ùY0aé©Å6Á8|Ií_CONSOLEÈáoJô0|#^~&`½!þcgÿäõ×ïïN].z¼ZÄsìsÛ
                                                                   õ.é#!ÉÍøfÜVÏß©2x6ôK)æ²ãF´æ!`×tú"ÓË+GBä
7©¯àüegò¡Xg)NñX&ÛaLÃoôSj83Ñ[\ä©?i`W<&ùC·«#´~³¯0\VéܱtYªö7m°qTÝÕÁva.-JѶ>U
)köæ°T¯Þºx×í_wS<Zl$B9êöD¿ÇØK¯zmY=Ϥã»ö©dÕW
                                          ¿j ùYÓ0pút¡"&@_ìÂVÙ·÷Sýæcscbyt5]ß`¯t`qux½ÿÿÈi÷ð«ú9Ã+<µø=9pqv
                               ú'*÷,¼SpoA-ûĽÏ>!`[wÜZü4×}4ö½
±ÎdZVoâØ´âY'wsoÖGNôÓe0÷niÏl|Ѥl*"Qªíd\ÜÌýòиWu·)­¼E{  ,¾3añ2+lÀ+41þ(á#ÿtu(!îÁ´K+úÛòerÃj¥Ú{
î¨ÁùeÇ^R±Ø=Úät±s|Ó1µEg
                      2Åd
                         Ò~à"¾ío×EcyÛÝ[kïÓ;ÅÜÉïÒã>2o|gÒH:æfSÄ{f×Y"û}*¤´]Sûw!¹_º&nbsp;ñO4±o¶7#ȧ&nbsp;+ìÈ=qÚòí·ô<ß°¡³J¾3ÙÅýÂy
_¦#¸®°ÐÎÝþLñX/Vö7Õ)ÈûRqcÿsé´]iàÇZ'·âÔA©.B'þfªøTvµU÷!®Áä)Ã
                                                          mxà¬Å;U9Äy_ÿaj¸úéµ;¥T |Ékûù¢
               mSTxýô
                     Ií_ôîëx¡µg§¥n÷äYîü3p®d.SH&nbsp;'0Ñì§x6VÁùâ&¤ÐÒH4Ó+l[7ð<ü±ö
   .#`,H¬Î¡C¹íßJÚ¼X«î)¨×#©ç¡'ìt&éoÜZGákÆè+ðs]wAxe_cÊ[óx*ß×
1R/HÖ`  ©(sd\g\MÁpÀ¼Ú
 ¬&!Úù²*Ä¢½£IÇ{=c¾PO©0Àýý÷¨q
ÐlPtB\ÅHT×Ë^o<Öòè+ï"M7¢f%IC«OrªH²VIù7]ÅÑ_]àÙ¶ápµ#v8t­:jÿ0pOX/hùÃû+Z8u[]-coieQ¯§ÀÑÃ;ó°ñÀ¢«é[rÌáGÔòî¾WôC¬®ÚÐÞùpíEEâOQr7ɹ¾ácÂÜô5¬3w°ëÉÍ/á,°Üq1q!®Q      ë¥SÈjþê»":í¸þwå>Há¶:âÐûL_dÈêàlPqäZ¸39È`hØuPHʨWo!Äc¾[¼ìSöÒZ2hk¶h«Sú
    ²   Æ¥:©¬ì¬¿é(ç|(uÐx¬R¥TqØ¡ÕôRq{¦h¡Ù½çP+`ñ¡Z÷¢µ?Éá6oT¯Jسæ' Z˧icßC¤\>:aæÕbgðÈCOØгÁ}Êg§½çåõ/knÒåã_ðÅ4ñ$xHu3ÌøMÕwPÌuW¼ÝÁ t^6Å(ÂÛ´ V¬5ÿ#Í3R*³,¦~E±Úf·1µù9òa<.ù]&nbsp;Jô.YZìpce2&Ïï\´áµÿeýBëò½mX!¼Îûw/%xü¯Õî]
cuOÏ
+1çêçÆÒ~à_Í
           ]õÊP2r>­§a5[ú¾±æ5¸ÄO&nbsp;A4ïCÏßÍn¹°f
jKØ!+!¶söv¶·ª©
              Ì2ªVÇô°¢EUx
                         ýyÑJï
                              x£¶ù     Ré?Ä×:oon2y=väÁ§ù¼?`:á>J¹TJCÎÝër$wó\]±Ï
&5Ù4ßnFKáw:E7]M%ì}>Ñ,?ªdU¶©ëàÄ¢éqLÊãÖ-¦Ï ×.ɯJ
  æÑ
    BfâW¹~ê¤Vf&nbsp;w®Ù4_ºø¬°ºgݦ\ÔtÜp=é3(H»Çϲ«NãÉð%Õ|Z³Ã¦OÝbb[U8ç>-{Ü2º¿\±pƼ¼TÛ­Dé!¤ÓË)¡GÊeB4²(Î$M}
6÷Á
Øg¨Ü&nbsp;]"wÍ¡UKÝT]©©Áý+&nbsp;UÚÉ(ýiÇ¥ _áb³caÿΰ¿
                                        `ªgÞgÃ2>vIöݨ"1 ÷gÎÉPblÅfâd5×)°á×X %6-cS
         Õ_SühþaÔ¨©p¨¤>fåsÙ(ßNõÐj0ßc¯QHÖ(þÇ&Í`&fßQiH£îÚúù!áÒÝfTÕA»ËÑqÃcª®¼[ÓA|À;Ü2¸VIY7¸ØcêÖM]å<)
»÷:0ràxµlEÎÃ÷äðK'Ä´?öË6 Kÿ»!oýÍþû¨1î&nbsp;.:&nbsp;°ÜÙîÙ'rØøQr~6[ºSRÆy7`8õ ä°Û_xËX
                            {"
þCT+!Üvþ]¦ÍZ%aâæ¿Cáðâ7fò.a4³üIí#4¦ÁÓâ&ô²Kä3}É°g@æâFbäâ0ôB/K¡f'Õ`Agq8O}ôÞ«.QÞñl¦ÅÀ·|ø2»(        ø)Ôê_ÕÚìÂqÌk»âuÑ
                                        bRÈ^M|ÂbTÊÆipô­ÓÅ1xRhz§_ûæR%ùõÎÖ+zBð
     'ßÍf¸/÷þ\~±§«ù¾õ   Wð@6Üà}¨O÷ÚiøT¢°æó¡¹Ä½ÓÞk%ãôÎyÏt+Hï8Ù¾àjÊ}áã¯øçÄ^nxèar^þ®©_ê®dÒæÐ~Mëª%øשû;ÊäÛå36©·¼ùRµwÁ¹ø5%
                                              ©VhPT­[ðñ6^ú¸ì¼¢àÏ*@Fv5óĹSPVS9_o_ª~u÷x.±÷)Ð]ÂÙ4γoËÝq~I4f¿pa¤@°Õ
õ0OæG¶xxpxºûxl+½KÜFà4ÜU%y^ÎòÑab@tibJS&nbsp; =Ì.iAÀÑ2m¾~RG`Î&B&I&W_Oá{Î~.ÇàvÑߧZÇó±_ïÚ-¾É:%é±>ÐX6HÃ2ͽ¾ëÌDÍÍfߦÍ|@ýÁ7Ø5ݺrä0ÖEò~@-ãHLk_SÜÂ&nbsp;\vZ··#&Ò:{ÕåR8¦_ÍO»­HàÕqK"b Åâ»Ãí¨<ÖÍZ×%ó2hZØ¡&nbsp; a8<ŬóΤ_º¯ùêmv·Êö:      6%lmGѧ£¿ÈÄ|£Åv»õzD[ªnJ©a&®P÷ËÞÒÞ«EÉ>±V>Ï6c8Тk0:ÊdÌSÊ&nbsp;50,ö³Ø½úâñÞÐ5^ù.ãó9HqSTSB#, ÏvXlkGáOG}º/t%8Ѻ=7QS®ZVE²r4½å°ÿ2w]4ÛبÒXrêeTÕ¸.&nbsp;¶eKLmlÁhHÛwM¸çä<åÙBbÎx1âû´,ö{WÿyZàiùq´IÒ|        éb«#ó$H¶9R!)
                                            <þúÄ-àRRVÖhKÒ-:Çï©=eÈ}Ô|£þc9Î~t,í®ýmUªúð^C³^ÒóµùA6|"k\&ÛI¤?aáØDsvqSë&Òxß´§ù¸lïZ»µqîÒO(äFÜËRj|ð
                                                                   ÎÕ,¹ÛN/Ëc_Ä
       rnÏþµf®³åΰ£Ø®   Ê\ñÛmh+ýÆKÎEx&nbsp;
®rmÔXÒE/Ý|yóyà]´À6öØUÏ(®àÉ°&nbsp;·º
                              IÙUB¾a¡´'ø¨
                                         ¢<'DqâaÔöY M8¹yíRëÜëJ¿7¯o¥ÉÉ}7Uæ3äö.+Ë)îZ° ¨dZ`o-ûèKWaMýäìéûxéæ¦Ké8m,&ìô"7À,¸þ|ì(Ï»cÎÞ&nbsp;yTSfÐ?²Ãn+1àù×ÛImfñnÉÕTåþrpPÆIæPvÊÛ#
                       ñÆÞº¢æ²=*ÎÞõÊ>