¿Cómo asegurar la integridad del archivo criptográficamente?

2

Problema: tengo una colección de archivos (código fuente, por ejemplo) cuya integridad debe garantizarse. No me importa si los archivos están dañados (puedo hacer varias copias de seguridad fácilmente). Solo quiero asegurarme de que los archivos no están atenuados.

Supongamos que almaceno la colección en un sistema que ahora está (posiblemente) comprometido. Para garantizar que los archivos no estén atenuados, una cosa que puedo hacer es almacenar las sumas de comprobación (SHA256 por ejemplo) de los archivos de código fuente en un sistema externo. Cuando el sistema está realmente comprometido, transfiero los archivos (con mucho cuidado para que esto no se convierta en una violación de la seguridad) a otro sistema, y luego verifico las sumas de comprobación. Si las sumas de comprobación coinciden, los archivos son (lo más probable) seguros.

Sin embargo, este enfoque me obliga a tener un sistema externo seguro que almacene las sumas de comprobación. Peor aún, las sumas de control pueden ser moderadas. Si puedo asegurarme de que las sumas de comprobación no sean atenuadas, puedo almacenar todos los archivos en ese sistema externo (asumiendo que el espacio no es un problema) para que los archivos no sean atenuados.

¿Me perdí algo importante? ¿Puedo crear un sistema que garantice la integridad del archivo? Alternativamente, ¿es suficiente un cifrado simple de una colección de archivos?

    
pregunta tonychow0929 18.07.2018 - 13:54
fuente

4 respuestas

1

Primero que todo: desde una perspectiva de seguridad, los archivos corruptos y manipulados son los mismos. La integridad ya no se da. Período. En ambos casos necesitas copias de seguridad.

Las sumas de comprobación son un buen enfoque. Como notó, si el sistema de almacenamiento de sus archivos se ve comprometido, necesita un sistema externo (esto significa de confianza ) para garantizar que sus medidas de seguridad no se vean menoscabadas. En lugar de usar sumas de comprobación en un sistema externo, puede firmar los archivos y almacenar la firma con ellos o usar HMAC en lugar del SHA256 simple. Esto garantiza que un atacante no pueda falsificar una firma / suma de comprobación si realiza cambios en los archivos, por lo que notará cualquier tipo de manipulación.

En ambos casos, solo necesita almacenar un secreto (clave privada o clave HMAC) en una máquina externa. Además, se pueden realizar verificaciones de integridad desde cualquier máquina que tenga acceso al secreto (no necesita una lista de sumas de comprobación, ya que se pueden almacenar con los archivos mismos).

Hay varias implementaciones de HMAC (u otros algoritmos hash basados en clave) y algoritmos de firma. Lo que mejor se adapte a sus necesidades depende de su entorno.

    
respondido por el GxTruth 18.07.2018 - 14:02
fuente
1

Una solución simple sería almacenar las sumas de comprobación en un archivo firmado digitalmente en la misma ubicación.

Mientras mantengas el control de la clave privada utilizada para la firma, puedes verificar fácilmente la integridad de todo el conjunto de archivos sin tener acceso a esa clave.

Algo como esto es trivial de implementar con PGP .

    
respondido por el Stephane 18.07.2018 - 14:00
fuente
0

Si entiendo el requisito correctamente:

  1. Tienes una colección de archivos en la ubicación A
  2. Desea garantizar la integridad de los archivos a lo largo del tiempo en la ubicación A
  3. Tienes múltiples copias de seguridad de los archivos

La solución me parece obvia, lo que sugiere que tal vez me faltó algo en los requisitos. Pero ya tiene las copias de seguridad, por lo que ya tiene las sumas de comprobación (o puede calcularlas fácilmente a partir de las copias de seguridad).

Si la ubicación A se vio comprometida, ya no es necesario que lleve los archivos de la ubicación A (y compare sus sumas de comprobación). ¡Simplemente haga las copias de seguridad!

Por ejemplo, tengo un sitio web de wordpress (que es una colección de archivos php, archivos de imagen y un archivo de copia de seguridad .sql). Realizo copias de seguridad de los archivos todos los días a las 12 am. Si mi sitio está comprometido o infectado con malware, simplemente lo restauro desde la copia de seguridad.

Siempre y cuando tenga un historial razonable de copias de seguridad (~ 30 días, por ejemplo), siempre puedo retroceder más en el tiempo que la infección. Por ejemplo, los atacantes comprometidos por el archivo index.php . Podría regresar y ver el historial de archivos durante 30 días para averiguar cuándo tuvo lugar la infección y restaurar desde la última copia de seguridad "buena" conocida.

El problema en su pregunta inicial era que estaba tratando de establecer la integridad de los archivos en un sistema local utilizando solo ese sistema local.

    
respondido por el keithRozario 18.07.2018 - 16:03
fuente
0

Creo que lo que te falta en el razonamiento es la importancia de la redundancia. Usted dice que si necesita confiar en un sistema externo o en un medio externo en el que confía para almacenar las sumas de comprobación, ¿por qué no almacenar los archivos allí y olvidarse de la integridad, ya que ese sistema o medio será de confianza de todos modos? La cuestión es que no tiene que confiar en un sistema o en un medio, sino que debe confiar en la "redundancia", es decir, el hecho de que es menos probable que los datos se comprometan al mismo tiempo en varios sistemas diferentes o medios de comunicación.

Entonces, lo que tienes que hacer es esto:

  1. Tenga sus archivos y sus sumas de comprobación en el sistema o medio A.
  2. Tenga sus archivos y sus sumas de comprobación en otros sistemas o medios, B, C, D, etc. como copias de seguridad, tantas como desee. Cuantas más copias de seguridad tenga, más redundancia y mayor será la probabilidad de detectar alteraciones. Tenga en cuenta que necesita reducir la probabilidad de que todos los datos se vean comprometidos al mismo tiempo, por ejemplo, podría mantener A y B en diferentes lugares, etc.
  3. Para verificar la integridad en A, calcule las sumas de comprobación de todos los archivos y luego haga un diff computed_checksums.txt stored_checksums.txt . Si la integridad está bien, diff no debe reportar diferencias. Haga lo mismo con los otros sistemas o medios, B, C, etc.
  4. Ahora acaba de verificar la integridad simplemente confiando en las sumas de comprobación almacenadas en el mismo sistema o medio. Pero, ¿cómo puede asegurarse de que las sumas de comprobación sean confiables? Fácil: solo calcule la suma de comprobación de las sumas de comprobación almacenadas en A (como sha256sum checksums_stored_on_A.txt ), luego haga lo mismo en B, C, etc. Si la suma de comprobación resultante es la misma, significa que todos los archivos de la suma de comprobación son iguales. Se puede confiar en ellos porque confía en el hecho de que es poco probable que todos se hayan comprometido de la misma manera en diferentes sistemas o en diferentes medios. Si una o más de las sumas de comprobación resultantes son diferentes de las demás, entonces, por supuesto, debe averiguar qué copias de seguridad son realmente seguras y cuáles han sido comprometidas.

Un par de notas:

Sistemas infectados. No se garantiza que este método funcione en teoría si está utilizando un sistema infectado para administrar sus archivos, conectar medios externos, calcular sumas de comprobación, etc. La razón es que en teoría no se puede confiar en el sistema infectado, por lo que incluso el comando sha256sum podría verse comprometido, o cp , o bash en general, etc. Para reducir la probabilidad de problemas relacionados con un sistema infectado, puede verificar la integridad en diferentes sistemas, tal vez incluso ejecutando diferentes sistemas operativos, etc.

Verificación de sumas de comprobación. ¿Por qué verifico las sumas de comprobación utilizando diff computed_checksums.txt stored_checksums.txt , en lugar de sha256sum -c stored_checksums.txt ? Esto se debe a que sha256sum -c stored_checksums.txt solo verificará los archivos enumerados en stored_checksums.txt y no se asegurará de que cada archivo en su copia de seguridad tenga una suma de comprobación correspondiente para verificar. En otras palabras, si un archivo malicioso se agrega a su copia de seguridad, con sha256sum -c stored_checksums.txt nunca lo sabrá. Por otro lado, si utiliza mi método con diff , el archivo agregado se mostrará: estará en las sumas de control calculadas, pero no en las sumas de comprobación almacenadas.

    
respondido por el reed 18.07.2018 - 23:14
fuente

Lea otras preguntas en las etiquetas