using sudo?, Re: [PATCH v2 8/8] test/py: efi_secboot: add test for intermediate certificates

2020-07-08 Thread AKASHI Takahiro
Hi Tom,

I'd like to make sure of your policy about usage of "sudo" on CI.
Do you think that we should always avoid using "sudo" in testing?

I remember that you had allowed us to run sudo in (python)
test scripts on Travis CI when I requested this (for FAT filesystem?).

-Takahiro Akashi

On Tue, Jul 07, 2020 at 12:42:35PM +0200, Heinrich Schuchardt wrote:
> On 16.06.20 07:26, AKASHI Takahiro wrote:
> > In this test case, an image may have a signature with additional
> > intermediate certificates. A chain of trust will be followed and all
> > the certificates in the middle of chain must be verified before loading.
> >
> > Signed-off-by: AKASHI Takahiro 
> > ---
> >  test/py/tests/test_efi_secboot/conftest.py| 138 +-
> >  test/py/tests/test_efi_secboot/defs.py|  11 +-
> >  test/py/tests/test_efi_secboot/openssl.cnf|  48 ++
> >  .../test_efi_secboot/test_signed_intca.py | 134 +
> >  4 files changed, 328 insertions(+), 3 deletions(-)
> >  create mode 100644 test/py/tests/test_efi_secboot/openssl.cnf
> >  create mode 100644 test/py/tests/test_efi_secboot/test_signed_intca.py
> >
> > diff --git a/test/py/tests/test_efi_secboot/conftest.py 
> > b/test/py/tests/test_efi_secboot/conftest.py
> > index 34abcd79ae00..e5ac2a2a21b7 100644
> > --- a/test/py/tests/test_efi_secboot/conftest.py
> > +++ b/test/py/tests/test_efi_secboot/conftest.py
> > @@ -37,7 +37,7 @@ def efi_boot_env(request, u_boot_config):
> >  global HELLO_PATH
> >
> >  image_path = u_boot_config.persistent_data_dir
> > -image_path = image_path + '/' + EFI_SECBOOT_IMAGE_NAME
> > +image_path = image_path + '/' + EFI_SECBOOT_IMAGE_NAME + '.img'
> >  image_size = EFI_SECBOOT_IMAGE_SIZE
> >  part_size = EFI_SECBOOT_PART_SIZE
> >  fs_type = EFI_SECBOOT_FS_TYPE
> > @@ -46,7 +46,7 @@ def efi_boot_env(request, u_boot_config):
> >  HELLO_PATH = u_boot_config.build_dir + 
> > '/lib/efi_loader/helloworld.efi'
> >
> >  try:
> > -mnt_point = u_boot_config.persistent_data_dir + '/mnt_efisecure'
> > +mnt_point = u_boot_config.persistent_data_dir + MNTPNT
> >  check_call('mkdir -p {}'.format(mnt_point), shell=True)
> >
> >  # create a disk/partition
> > @@ -170,3 +170,137 @@ def efi_boot_env(request, u_boot_config):
> >  yield image_path
> >  finally:
> >  call('rm -f %s' % image_path, shell=True)
> > +
> > +#
> > +# Fixture for UEFI secure boot test of intermediate certificates
> 
> Thanks for adding a test.
> 
> 
> > +#
> > +@pytest.fixture(scope='session')
> > +def efi_boot_env_intca(request, u_boot_config):
> > +"""Set up a file system to be used in UEFI secure boot test
> > +of intermediate certificates.
> > +
> > +Args:
> > +request: Pytest request object.
> > +   u_boot_config: U-boot configuration.
> > +
> > +Return:
> > +A path to disk image to be used for testing
> > +"""
> > +global HELLO_PATH
> > +
> > +image_path = u_boot_config.persistent_data_dir
> > +image_path = image_path + '/' + EFI_SECBOOT_IMAGE_NAME + '_intca.img'
> > +image_size = EFI_SECBOOT_IMAGE_SIZE
> > +part_size = EFI_SECBOOT_PART_SIZE
> > +fs_type = EFI_SECBOOT_FS_TYPE
> > +
> > +if HELLO_PATH == '':
> > +HELLO_PATH = u_boot_config.build_dir + 
> > '/lib/efi_loader/helloworld.efi'
> > +
> > +try:
> > +mnt_point = u_boot_config.persistent_data_dir + MNTPNT
> > +check_call('mkdir -p {}'.format(mnt_point), shell=True)
> > +
> > +# create a disk/partition
> > +check_call('dd if=/dev/zero of=%s bs=1MiB count=%d'
> > +% (image_path, image_size), shell=True)
> > +check_call('sgdisk %s -n 1:0:+%dMiB'
> > +% (image_path, part_size), shell=True)
> > +# create a file system
> > +check_call('dd if=/dev/zero of=%s.tmp bs=1MiB count=%d'
> > +% (image_path, part_size), shell=True)
> > +check_call('mkfs -t %s %s.tmp' % (fs_type, image_path), shell=True)
> > +check_call('dd if=%s.tmp of=%s bs=1MiB seek=1 count=%d 
> > conv=notrunc'
> > +% (image_path, image_path, 1), shell=True)
> > +check_call('rm %s.tmp' % image_path, shell=True)
> > +loop_dev = check_output('sudo losetup -o 1MiB --sizelimit %dMiB 
> > --show -f %s | tr -d "\n"'
> > +% (part_size, image_path), 
> > shell=True).decode()
> > +check_output('sudo mount -t %s -o umask=000 %s %s'
> > +% (fs_type, loop_dev, mnt_point), 
> > shell=True)
> 
> Can we use virt-make-fs to avoid sudo, please. Package libguestfs-tools
> has been added to the Docker image for Gitlab recently.
> 
> > +
> > +# Create signature database
> > +## PK
> > +check_call('cd %s; openssl req -x509 -sha256 -newkey rsa:2048 
> > -subj /CN=TEST_PK/ -keyout PK.key -out PK.c

Re: using sudo?, Re: [PATCH v2 8/8] test/py: efi_secboot: add test for intermediate certificates

2020-07-08 Thread Tom Rini
On Thu, Jul 09, 2020 at 09:58:03AM +0900, AKASHI Takahiro wrote:

> Hi Tom,
> 
> I'd like to make sure of your policy about usage of "sudo" on CI.
> Do you think that we should always avoid using "sudo" in testing?
> 
> I remember that you had allowed us to run sudo in (python)
> test scripts on Travis CI when I requested this (for FAT filesystem?).

So, the best practices at this time are to have the code try and use
guestmount (or similar tools) when possible and fall back to sudo, as
Ubuntu breaks guestmount (and similar tools) by default.

-- 
Tom


signature.asc
Description: PGP signature


Re: using sudo?, Re: [PATCH v2 8/8] test/py: efi_secboot: add test for intermediate certificates

2020-07-08 Thread AKASHI Takahiro
Tom,

On Wed, Jul 08, 2020 at 11:15:26PM -0400, Tom Rini wrote:
> On Thu, Jul 09, 2020 at 09:58:03AM +0900, AKASHI Takahiro wrote:
> 
> > Hi Tom,
> > 
> > I'd like to make sure of your policy about usage of "sudo" on CI.
> > Do you think that we should always avoid using "sudo" in testing?
> > 
> > I remember that you had allowed us to run sudo in (python)
> > test scripts on Travis CI when I requested this (for FAT filesystem?).
> 
> So, the best practices at this time are to have the code try and use
> guestmount (or similar tools) when possible and fall back to sudo, as
> Ubuntu breaks guestmount (and similar tools) by default.

See the commands log (on my ubuntu 19.10) below:

===8<===
<< try 1 >>
tmp$ mkdir tmpdir
tmp$ virt-make-fs -t vfat -s +1M --partition=gpt ./tmpdir tmp.img
libguestfs: error: /usr/bin/supermin exited with error status 1.
To see full error messages you may need to enable debugging.
Do:
  export LIBGUESTFS_DEBUG=1 LIBGUESTFS_TRACE=1
and run the command again.  For further information, read:
  http://libguestfs.org/guestfs-faq.1.html#debugging-libguestfs
You can also run 'libguestfs-test-tool' and post the *complete* output
into a bug report or message to the libguestfs mailing list.

<< try 2 >>
tmp$ LIBGUESTFS_DEBUG=1 virt-make-fs -t vfat -s +1M --partition=gpt ./tmpdir 
tmp.img
...
supermin: kernel: kernel_version 5.3.0-62-generic
supermin: kernel: modpath /lib/modules/5.3.0-62-generic
cp: cannot open '/boot/vmlinuz-5.3.0-62-generic' for reading: Permission denied
supermin: cp -p '/boot/vmlinuz-5.3.0-62-generic' 
'/var/tmp/.guestfs-1000/appliance.d.op62psoy/kernel': command failed, see 
earlier errors
libguestfs: error: /usr/bin/supermin exited with error status 1, see debug 
messages above
...

<< try 3 >>
tmp$ sudo chmod a+rw /boot/vmlinuz-5.3.0-62-generic 
tmp$ LIBGUESTFS_DEBUG=1 virt-make-fs -t vfat -s +1M --partition=gpt ./tmpdir 
tmp.img
...
tmp$ ls -l tmp.img
-rw-r--r-- 1 akashi akashi 1341440 Jul  9 13:50 tmp.img
===>8===

As you can see, virt-make-fs will fail on *standard* ubuntu.
You have to change the permission of the current kernel's binary.

While I can't make sure, we will have the same issue with guestmount
as it will also create a minimum virtual machine before execution.

What does it mean?
You must change the permission every time when you re-install the OS
or re-bump the kernel version. Obviously, I can't do that from my own
test script (without sudo).
So if you don't have any way (or workaround) to deal with it,
libguestfs-tools or guestmount cannot be a solution here.

-Takahiro Akashi






> -- 
> Tom




Re: using sudo?, Re: [PATCH v2 8/8] test/py: efi_secboot: add test for intermediate certificates

2020-07-09 Thread Tom Rini
On Thu, Jul 09, 2020 at 02:33:49PM +0900, AKASHI Takahiro wrote:
> Tom,
> 
> On Wed, Jul 08, 2020 at 11:15:26PM -0400, Tom Rini wrote:
> > On Thu, Jul 09, 2020 at 09:58:03AM +0900, AKASHI Takahiro wrote:
> > 
> > > Hi Tom,
> > > 
> > > I'd like to make sure of your policy about usage of "sudo" on CI.
> > > Do you think that we should always avoid using "sudo" in testing?
> > > 
> > > I remember that you had allowed us to run sudo in (python)
> > > test scripts on Travis CI when I requested this (for FAT filesystem?).
> > 
> > So, the best practices at this time are to have the code try and use
> > guestmount (or similar tools) when possible and fall back to sudo, as
> > Ubuntu breaks guestmount (and similar tools) by default.
> 
> See the commands log (on my ubuntu 19.10) below:
> 
> ===8<===
> << try 1 >>
> tmp$ mkdir tmpdir
> tmp$ virt-make-fs -t vfat -s +1M --partition=gpt ./tmpdir tmp.img
> libguestfs: error: /usr/bin/supermin exited with error status 1.
> To see full error messages you may need to enable debugging.
> Do:
>   export LIBGUESTFS_DEBUG=1 LIBGUESTFS_TRACE=1
> and run the command again.  For further information, read:
>   http://libguestfs.org/guestfs-faq.1.html#debugging-libguestfs
> You can also run 'libguestfs-test-tool' and post the *complete* output
> into a bug report or message to the libguestfs mailing list.
> 
> << try 2 >>
> tmp$ LIBGUESTFS_DEBUG=1 virt-make-fs -t vfat -s +1M --partition=gpt ./tmpdir 
> tmp.img
> ...
> supermin: kernel: kernel_version 5.3.0-62-generic
> supermin: kernel: modpath /lib/modules/5.3.0-62-generic
> cp: cannot open '/boot/vmlinuz-5.3.0-62-generic' for reading: Permission 
> denied
> supermin: cp -p '/boot/vmlinuz-5.3.0-62-generic' 
> '/var/tmp/.guestfs-1000/appliance.d.op62psoy/kernel': command failed, see 
> earlier errors
> libguestfs: error: /usr/bin/supermin exited with error status 1, see debug 
> messages above
> ...
> 
> << try 3 >>
> tmp$ sudo chmod a+rw /boot/vmlinuz-5.3.0-62-generic 
> tmp$ LIBGUESTFS_DEBUG=1 virt-make-fs -t vfat -s +1M --partition=gpt ./tmpdir 
> tmp.img
> ...
> tmp$ ls -l tmp.img
> -rw-r--r-- 1 akashi akashi 1341440 Jul  9 13:50 tmp.img
> ===>8===
> 
> As you can see, virt-make-fs will fail on *standard* ubuntu.
> You have to change the permission of the current kernel's binary.

Yes, exactly.  This is an intentional behavior in Ubuntu (and not
Debian) and why we cannot rely on the various virt tools working.

I fixed the current tests over in
http://patchwork.ozlabs.org/project/uboot/patch/20200707155309.24770-1-tr...@konsulko.com/
but need to follow up and try what Stephen was saying to clean it up
more still.

> While I can't make sure, we will have the same issue with guestmount
> as it will also create a minimum virtual machine before execution.
> 
> What does it mean?
> You must change the permission every time when you re-install the OS
> or re-bump the kernel version. Obviously, I can't do that from my own
> test script (without sudo).
> So if you don't have any way (or workaround) to deal with it,
> libguestfs-tools or guestmount cannot be a solution here.

Well, just like the test_fs tests, we try guestmount, if it doesn't work
we fall back to just sudo'ing what we need to run directly.  I think
Ubuntu did something very stupid here.  I just don't know if moving CI
to be Debian based (and I guess Travis is just working-around the issue
by default for us, given the fs tests run there today) is good enough as
it will leave everyone else's Ubuntu-based setups broken.

-- 
Tom


signature.asc
Description: PGP signature