19
REPRODUCE AND VERIFY FILESYSTEMS Vincent Batts @vbatts

REPRODUCE AND VERIFY FILESYSTEMS...Ruby *.gem (tar(1) archive of tar(1) archives) Container Images (tar(1) archives) CONTENT ADDRESSIBILITY ... same objects, but variation in compression

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: REPRODUCE AND VERIFY FILESYSTEMS...Ruby *.gem (tar(1) archive of tar(1) archives) Container Images (tar(1) archives) CONTENT ADDRESSIBILITY ... same objects, but variation in compression

REPRODUCE AND VERIFYFILESYSTEMS

Vincent Batts @vbatts

Page 2: REPRODUCE AND VERIFY FILESYSTEMS...Ruby *.gem (tar(1) archive of tar(1) archives) Container Images (tar(1) archives) CONTENT ADDRESSIBILITY ... same objects, but variation in compression

$> finger $(whoami)Login: vbatts Name: Vincent BattsDirectory: /home/vbatts Shell: /bin/bashSuch mail.Plan:OHMAN$> id -Gndevel opencontainers docker appc redhat golang slackware

Page 3: REPRODUCE AND VERIFY FILESYSTEMS...Ruby *.gem (tar(1) archive of tar(1) archives) Container Images (tar(1) archives) CONTENT ADDRESSIBILITY ... same objects, but variation in compression

PackagingContent AddressibilityCompression!Reproducible ArchivesVerify at rest filesystems

AGENDA

Page 4: REPRODUCE AND VERIFY FILESYSTEMS...Ruby *.gem (tar(1) archive of tar(1) archives) Container Images (tar(1) archives) CONTENT ADDRESSIBILITY ... same objects, but variation in compression

PACKAGINGtar archives

Slackware packages ( archives)tar(1)Debian *.deb ( archive of archives)ar(1) tar(1)

Red Hat *.rpm (custom key/value binary and )cpio(1)Java *.jar and *.war ( archive)zip(1)

Ruby *.gem ( archive of archives)tar(1) tar(1)Container Images ( archives)tar(1)

Page 5: REPRODUCE AND VERIFY FILESYSTEMS...Ruby *.gem (tar(1) archive of tar(1) archives) Container Images (tar(1) archives) CONTENT ADDRESSIBILITY ... same objects, but variation in compression

CONTENT ADDRESSIBILITY

Opaque Object storagechanged object = new object

cryptographic assurance

Page 6: REPRODUCE AND VERIFY FILESYSTEMS...Ruby *.gem (tar(1) archive of tar(1) archives) Container Images (tar(1) archives) CONTENT ADDRESSIBILITY ... same objects, but variation in compression

COMPRESSION!

inflate/deflate (RFC1951)

same objects, but variation in compression

Gzip (RFC1952)`gzip` vs Golang `compress/gzip` vs Zlib

ideally compress for transfer and storage, but not for identity

Page 7: REPRODUCE AND VERIFY FILESYSTEMS...Ruby *.gem (tar(1) archive of tar(1) archives) Container Images (tar(1) archives) CONTENT ADDRESSIBILITY ... same objects, but variation in compression

COMPRESSION!#!/bin/shdd if=/dev/urandom of=rando.img bs=1M count=2cat rando.img | gzip -n > rando.img.gzcat rando.img | gzip -n -9 > rando.img.9.gzcat rando.img | xz > rando.img.xzcat rando.img | xz -9 > rando.img.9.xzsha1sum rando.img* > SHA1

cat rando.img | gzip -n > rando.img.gzcat rando.img | gzip -n -9 > rando.img.9.gzcat rando.img | xz > rando.img.xzcat rando.img | xz -9 > rando.img.9.xzsha1sum -c ./SHA1

Page 8: REPRODUCE AND VERIFY FILESYSTEMS...Ruby *.gem (tar(1) archive of tar(1) archives) Container Images (tar(1) archives) CONTENT ADDRESSIBILITY ... same objects, but variation in compression

COMPRESSION!

#!/usr/bin/env ruby

require 'zlib'include Zlib

input = File.open(ARGV.first)GzipWriter.open(ARGV.first + '.gz', DEFAULT_COMPRESSION, HUFFMAN_ONLY) do |gz| gz.write(IO.binread(input))endinput.flush()input.close()

Page 9: REPRODUCE AND VERIFY FILESYSTEMS...Ruby *.gem (tar(1) archive of tar(1) archives) Container Images (tar(1) archives) CONTENT ADDRESSIBILITY ... same objects, but variation in compression

COMPRESSION!package main import ( "compress/gzip" "io" "os" )

func main() { input, err := os.Open(os.Args[1]) if err != nil { println(err.Error()) os.Exit(1)

} output, err := os.Create(os.Args[1] + ".gz") if err != nil { println(err.Error()) os.Exit(1)

} gz := gzip.NewWriter(output) if _, err := io.Copy(gz, input); err != nil { println(err.Error()) os.Exit(1)

}}

Page 10: REPRODUCE AND VERIFY FILESYSTEMS...Ruby *.gem (tar(1) archive of tar(1) archives) Container Images (tar(1) archives) CONTENT ADDRESSIBILITY ... same objects, but variation in compression

REPRODUCIBLE ARCHIVE

reproducible-builds.orgprocessed checksum of tar archive ( )see deprecated Docker TarSum

keep around the original *.tar?re-assemble the original *.tar

github.com/vbatts/tar-split

Page 11: REPRODUCE AND VERIFY FILESYSTEMS...Ruby *.gem (tar(1) archive of tar(1) archives) Container Images (tar(1) archives) CONTENT ADDRESSIBILITY ... same objects, but variation in compression

REPRODUCIBLE ARCHIVE

go install github.com/vbatts/tar-split/cmd/tar-split

tar cf demo.tar *.shsha1sum demo.tar | tee SHA1

tar-split disasm --no-stdout ./demo.tarls -lh tar-data.json.gz

rm -f demo.tartar-split asm --output demo.tar --path .sha1sum -c ./SHA1

Page 12: REPRODUCE AND VERIFY FILESYSTEMS...Ruby *.gem (tar(1) archive of tar(1) archives) Container Images (tar(1) archives) CONTENT ADDRESSIBILITY ... same objects, but variation in compression

VERIFY AT REST FILESYSTEMS

Regardless of transport, ensure resulting filesystem(*.tar archive, rsync, bittorrent, IPFS, etc)

`rpm -qV <package>` functionality

Future hopes could be IMA/EVM

Passive validation of directory hierarchiesBSD mtree(8)

Page 13: REPRODUCE AND VERIFY FILESYSTEMS...Ruby *.gem (tar(1) archive of tar(1) archives) Container Images (tar(1) archives) CONTENT ADDRESSIBILITY ... same objects, but variation in compression

VERIFY AT REST FILESYSTEMS

FreeBSD mtree(8)

mtree-port (for linux)

go-mtree (golang cli and library)

libarchive-formats(5)

Page 14: REPRODUCE AND VERIFY FILESYSTEMS...Ruby *.gem (tar(1) archive of tar(1) archives) Container Images (tar(1) archives) CONTENT ADDRESSIBILITY ... same objects, but variation in compression

VERIFY AT REST FILESYSTEMS

#!/usr/bin/env python

import libarchive

with libarchive.file_writer('../demo.mtree', 'mtree') as a: a.add_files('./')

with packages: libarchive and python-libarchive-c

NOTICE: libarchive uses older mtree format

Page 15: REPRODUCE AND VERIFY FILESYSTEMS...Ruby *.gem (tar(1) archive of tar(1) archives) Container Images (tar(1) archives) CONTENT ADDRESSIBILITY ... same objects, but variation in compression

VERIFY AT REST FILESYSTEMS

mtree -c -p ./ -K sha256digest | tee /tmp/demo.mtree

mtree -f /tmp/demo.mtree -p ./echo $?

read

touch $0 # SCANDALOUSmtree -f /tmp/demo.mtree -p ./

Page 16: REPRODUCE AND VERIFY FILESYSTEMS...Ruby *.gem (tar(1) archive of tar(1) archives) Container Images (tar(1) archives) CONTENT ADDRESSIBILITY ... same objects, but variation in compression

VERIFY AT REST FILESYSTEMS

go get -u github.com/vbatts/go-mtree/cmd/gomtreegomtree -c -p ./ -K sha256digest | tee /tmp/demo.mtree

gomtree -f /tmp/demo.mtree -p ./echo $?

read

touch $0 # SCANDALOUSgomtree -f /tmp/demo.mtree -p ./

Directory Path

Page 17: REPRODUCE AND VERIFY FILESYSTEMS...Ruby *.gem (tar(1) archive of tar(1) archives) Container Images (tar(1) archives) CONTENT ADDRESSIBILITY ... same objects, but variation in compression

VERIFY AT REST FILESYSTEMS

tar cf /tmp/demo.tar .gomtree -c -T /tmp/demo.tar -K sha256digest | tee /tmp/demo.mtree

gomtree -f /tmp/demo.mtree -T /tmp/demo.tarecho $?

read

gomtree -f /tmp/demo.mtree -p ./echo $?

touch $0 # SCANDALOUSgomtree -f /tmp/demo.mtree -p ./

Tar Archive Support

Page 18: REPRODUCE AND VERIFY FILESYSTEMS...Ruby *.gem (tar(1) archive of tar(1) archives) Container Images (tar(1) archives) CONTENT ADDRESSIBILITY ... same objects, but variation in compression

CALL TO ACTION

You have the need to store archives, whole and extracted,

check out github.com/vbatts/tar-split

You have the need to verify, or restore, a filesystem regardless ofhow it was distributed, check out orother mtree projects

github.com/vbatts/go-mtree

Page 19: REPRODUCE AND VERIFY FILESYSTEMS...Ruby *.gem (tar(1) archive of tar(1) archives) Container Images (tar(1) archives) CONTENT ADDRESSIBILITY ... same objects, but variation in compression

THANK YOU!

VINCENT BATTS

@VBATTS| [email protected]