From: "Vladimir 'φ-coder/phcoder' Serbinenko" <phcoder@gmail.com>
To: grub-devel@gnu.org
Subject: Re: [PATCH v3] Documentation cleanup in response to ML discussion.
Date: Thu, 24 Oct 2013 21:19:30 +0200 [thread overview]
Message-ID: <526972C2.9020509@gmail.com> (raw)
In-Reply-To: <1382397355-20609-1-git-send-email-jonmccune@google.com>
[-- Attachment #1: Type: text/plain, Size: 17348 bytes --]
Go ahead
On 22.10.2013 01:15, Jon McCune wrote:
> [v0] Accepted with modifications by phcoder@
> [v1] Introduce subsections within Security
> [v1] Correct errors regarding public key files not being automatically signature-checked in trust and verify_detached
> [v1] Replace check_signatures=enforce with check_signatures set to enforce
> [v1] Move detailed discussion of using signatures out of check_signatures environment variable description
> [v1] Use long form for option flags to security-relevant commands
> [v2] Explain the key fingerprint format for distrust and list_trusted.
> [v2] Eliminates references to grub-mkimage and UEFI Secure Boot.
> [v3] Updates in response to addition of --skip-sig to trust and verify_detached
>
> Signed-off-by: Jon McCune <jonmccune@google.com>
> ---
> docs/grub.texi | 197 ++++++++++++++++++++++++++++++++-------------------------
> 1 file changed, 112 insertions(+), 85 deletions(-)
>
> diff --git a/docs/grub.texi b/docs/grub.texi
> index 40eb9ed..8b0b76b 100644
> --- a/docs/grub.texi
> +++ b/docs/grub.texi
> @@ -98,8 +98,7 @@ This edition documents version @value{VERSION}.
> * Environment:: GRUB environment variables
> * Commands:: The list of available builtin commands
> * Internationalisation:: Topics relating to language support
> -* Security:: Authentication and authorisation
> -* Security and signatures:: Verifying digital signatures in GRUB
> +* Security:: Authentication, authorisation, and signatures
> * Platform limitations:: The list of platform-specific limitations
> * Platform-specific operations:: Platform-specific operations
> * Supported kernels:: The list of supported kernels
> @@ -3006,20 +3005,7 @@ chain-loaded system, @pxref{drivemap}.
> @subsection check_signatures
>
> This variable controls whether GRUB enforces digital signature
> -validation (@pxref{Security and signatures}) on all loaded files. If
> -@code{check_signatures=enforce}, then every attempt by the GRUB
> -@file{core.img} to load another file @file{foo} (e.g., a loadable
> -module, a configuration file, or a Linux kernel) implicitly invokes
> -@code{verify_detached foo foo.sig} (@pxref{verify_detached}).
> -@code{foo.sig} must contain a valid digital signature over the
> -contents of @code{foo}, which can be verified with a public key
> -currently trusted by GRUB (@pxref{list_trusted}, @pxref{trust}, and
> -@pxref{distrust}). If validation fails, then file @file{foo} cannot
> -be opened. This failure may halt or otherwise impact the boot
> -process. An initial trusted public key can be embedded within the
> -GRUB @file{core.img} using the @code{--pubkey} option to
> -@command{grub-mkimage} (@pxref{Invoking grub-install}).
> -
> +validation on loaded files. @xref{Using digital signatures}.
>
> @node chosen
> @subsection chosen
> @@ -3998,10 +3984,15 @@ but rather replaces it completely.
>
> @deffn Command distrust pubkey_id
> Remove public key @var{pubkey_id} from GRUB's keyring of trusted keys.
> -These keys are used to validate signatures when
> -@code{check_signatures=enforce} (@pxref{check_signatures}), and by some
> -invocations of @command{verify_detached} (@pxref{verify_detached}).
> -@xref{Security and signatures} for more information.
> +@var{pubkey_id} is the last four bytes (eight hexadecimal digits) of
> +the GPG v4 key id, which is also the output of @command{list_trusted}
> +(@pxref{list_trusted}). Outside of GRUB, the key id can be obtained
> +using @code{gpg --fingerprint}).
> +These keys are used to validate signatures when environment variable
> +@code{check_signatures} is set to @code{enforce}
> +(@pxref{check_signatures}), and by some invocations of
> +@command{verify_detached} (@pxref{verify_detached}). @xref{Using
> +digital signatures}, for more information.
> @end deffn
>
> @node drivemap
> @@ -4264,56 +4255,58 @@ This command is only available on x86 systems.
> @node list_env
> @subsection list_env
>
> -@deffn Command list_env [@option{-f} file]
> +@deffn Command list_env [@option{--file} file]
> List all variables in the environment block file. @xref{Environment block}.
>
> -The @option{-f} option overrides the default location of the environment
> -block.
> +The @option{--file} option overrides the default location of the
> +environment block.
> @end deffn
>
> @node list_trusted
> @subsection list_trusted
>
> @deffn Command list_trusted
> -List all public keys trusted by GRUB for validating signatures. These
> -public keys are used implicitly when environment variable
> -@code{check_signatures=enforce} (@pxref{check_signatures}), and by some
> -invocations of @command{verify_detached}. @xref{Security and
> -signatures} for more information.
> +List all public keys trusted by GRUB for validating signatures.
> +The output is in GPG's v4 key fingerprint format (i.e., the output of
> +@code{gpg --fingerprint}). The least significant four bytes (last
> +eight hexadecimal digits) can be used as an argument to
> +@command{distrust} (@pxref{distrust}).
> +@xref{Using digital signatures}, for more information about uses for
> +these keys.
> @end deffn
>
> @node load_env
> @subsection load_env
>
> -@deffn Command load_env [@option{-f} file] [@option{-s}] [whitelisted_variable_name] @dots{}
> +@deffn Command load_env [@option{--file} file] [@option{--skip-sig}] [whitelisted_variable_name] @dots{}
> Load all variables from the environment block file into the environment.
> @xref{Environment block}.
>
> -The @option{-f} option overrides the default location of the environment
> +The @option{--file} option overrides the default location of the environment
> block.
>
> -The @option{-s} (long form @option{--skip-sig}) option skips signature
> -checking even when the value of @code{check_signatures=enforce}
> -(@pxref{check_signatures}).
> +The @option{--skip-sig} option skips signature checking even when the
> +value of environment variable @code{check_signatures} is set to
> +@code{enforce} (@pxref{check_signatures}).
>
> If one or more variable names are provided as arguments, they are
> interpreted as a whitelist of variables to load from the environment
> block file. Variables set in the file but not present in the
> whitelist are ignored.
>
> -The @option{-s} option should be used with care, and should always be
> -used in concert with a whitelist of acceptable variables whose values
> -should be set. Failure to employ a carefully constructed whitelist
> -could result in reading a malicious value of critical environment
> -variables from the file, such as setting @code{check_signatures=no},
> -modifying @code{prefix} to boot from an unexpected location or not at
> -all, etc.
> +The @option{--skip-sig} option should be used with care, and should
> +always be used in concert with a whitelist of acceptable variables
> +whose values should be set. Failure to employ a carefully constructed
> +whitelist could result in reading a malicious value into critical
> +environment variables from the file, such as setting
> +@code{check_signatures=no}, modifying @code{prefix} to boot from an
> +unexpected location or not at all, etc.
>
> -When used with care, @option{-s} and the whitelist enable an
> +When used with care, @option{--skip-sig} and the whitelist enable an
> administrator to configure a system to boot only signed
> configurations, but to allow the user to select from among multiple
> configurations, and to enable ``one-shot'' boot attempts and
> -``savedefault'' behavior. @xref{Security and signatures} for more
> +``savedefault'' behavior. @xref{Using digital signatures}, for more
> information.
> @end deffn
>
> @@ -4558,22 +4551,22 @@ Remove a loaded @var{module}.
> @node save_env
> @subsection save_env
>
> -@deffn Command save_env [@option{-f} file] var @dots{}
> +@deffn Command save_env [@option{--file} file] var @dots{}
> Save the named variables from the environment to the environment block file.
> @xref{Environment block}.
>
> -The @option{-f} option overrides the default location of the environment
> +The @option{--file} option overrides the default location of the environment
> block.
>
> -This command will operate successfully even when
> -@code{check_signatures=enforce} (@pxref{check_signatures}), since it
> -writes to disk and does not alter the behavior of GRUB based on any
> -contents of disk that have been read. It is possible to modify a
> -digitally signed environment block file from within GRUB using this
> -command, such that its signature will no longer be valid on subsequent
> -boots. Care should be taken in such advanced configurations to avoid
> -rendering the system unbootable. @xref{Security and signatures} for
> -more information.
> +This command will operate successfully even when environment variable
> +@code{check_signatures} is set to @code{enforce}
> +(@pxref{check_signatures}), since it writes to disk and does not alter
> +the behavior of GRUB based on any contents of disk that have been
> +read. It is possible to modify a digitally signed environment block
> +file from within GRUB using this command, such that its signature will
> +no longer be valid on subsequent boots. Care should be taken in such
> +advanced configurations to avoid rendering the system
> +unbootable. @xref{Using digital signatures}, for more information.
> @end deffn
>
>
> @@ -4886,11 +4879,17 @@ as @code{if} and @code{while} (@pxref{Shell-like scripting}).
> @node trust
> @subsection trust
>
> -@deffn Command trust pubkey_file
> +@deffn Command trust [@option{--skip-sig}] pubkey_file
> Read public key from @var{pubkey_file} and add it to GRUB's internal
> list of trusted public keys. These keys are used to validate digital
> -signatures when @code{check_signatures=enforce}.
> -@xref{Security and signatures} for more information.
> +signatures when environment variable @code{check_signatures} is set to
> +@code{enforce}. Note that if @code{check_signatures} is set to
> +@code{enforce} when @command{trust} executes, then @var{pubkey_file}
> +must itself be properly signed. The @option{--skip-sig} option can be
> +used to disable signature-checking when reading @var{pubkey_file}
> +itself. It is expected that @option{--skip-sig} is useful for testing
> +and manual booting. @xref{Using digital signatures}, for more
> +information.
> @end deffn
>
>
> @@ -4922,20 +4921,21 @@ only on PC BIOS platforms.
> @node verify_detached
> @subsection verify_detached
>
> -@deffn Command verify_detached file signature_file [pubkey_file]
> +@deffn Command verify_detached [@option{--skip-sig}] file signature_file [pubkey_file]
> Verifies a GPG-style detached signature, where the signed file is
> @var{file}, and the signature itself is in file @var{signature_file}.
> Optionally, a specific public key to use can be specified using
> -@var{pubkey_file}. Otherwise, public keys from GRUB's trusted keys
> +@var{pubkey_file}. When environment variable @code{check_signatures}
> +is set to @code{enforce}, then @var{pubkey_file} must itself be
> +properly signed by an already-trusted key. An unsigned
> +@var{pubkey_file} can be loaded by specifying @option{--skip-sig}.
> +If @var{pubkey_file} is omitted, then public keys from GRUB's trusted keys
> (@pxref{list_trusted}, @pxref{trust}, and @pxref{distrust}) are
> -tried. Note that, when @code{check_signatures=enforce}, an explicitly
> -identified @var{pubkey_file} must itself be signed by an
> -already-trusted key.
> +tried.
>
> Exit code @code{$?} is set to 0 if the signature validates
> successfully. If validation fails, it is set to a non-zero value.
> -
> -@xref{Security and signatures} for more information.
> +@xref{Using digital signatures}, for more information.
> @end deffn
>
> @node videoinfo
> @@ -5234,7 +5234,15 @@ test from coreutils.
> environment variables and commands are listed in the same order.
>
> @node Security
> -@chapter Authentication and authorisation
> +@chapter Security
> +
> +@menu
> +* Authentication and authorisation:: Users and access control
> +* Using digital signatures:: Booting digitally signed code
> +@end menu
> +
> +@node Authentication and authorisation
> +@section Authentication and authorisation in GRUB
>
> By default, the boot loader interface is accessible to anyone with physical
> access to the console: anyone can select and edit any menu entry, and anyone
> @@ -5301,17 +5309,34 @@ generating configuration files with authentication. You can use
> adding @kbd{set superusers=} and @kbd{password} or @kbd{password_pbkdf2}
> commands.
>
> -@node Security and signatures
> -@chapter Security considerations when using digital signatures
> -
> -GRUB's @file{core.img} can optionally provide enforcement that all
> -files subsequently read from disk are covered by a valid digital
> -signature. This includes GRUB configuration files, the GRUB
> -environment block, GRUB loadable modules and their dependency files,
> -and loaded operating system files such as a Linux kernel. This
> -document does @strong{not} cover how to ensure that your platform's
> -firmware (e.g., Coreboot) validates
> -@file{core.img}.
> +@node Using digital signatures
> +@section Using digital signatures in GRUB
> +
> +GRUB's @file{core.img} can optionally provide enforcement that all files
> +subsequently read from disk are covered by a valid digital signature.
> +This document does @strong{not} cover how to ensure that your
> +platform's firmware (e.g., Coreboot) validates @file{core.img}.
> +
> +If environment variable @code{check_signatures}
> +(@pxref{check_signatures}) is set to @code{enforce}, then every
> +attempt by the GRUB @file{core.img} to load another file @file{foo}
> +implicitly invokes @code{verify_detached foo foo.sig}
> +(@pxref{verify_detached}). @code{foo.sig} must contain a valid
> +digital signature over the contents of @code{foo}, which can be
> +verified with a public key currently trusted by GRUB
> +(@pxref{list_trusted}, @pxref{trust}, and @pxref{distrust}). If
> +validation fails, then file @file{foo} cannot be opened. This failure
> +may halt or otherwise impact the boot process.
> +
> +@comment Unfortunately --pubkey is not yet supported by grub-install,
> +@comment but we should not bring up internal detail grub-mkimage here
> +@comment in the user guide (as opposed to developer's manual).
> +
> +@comment An initial trusted public key can be embedded within the GRUB
> +@comment @file{core.img} using the @code{--pubkey} option to
> +@comment @command{grub-mkimage} (@pxref{Invoking grub-install}). Presently it
> +@comment is necessary to write a custom wrapper around @command{grub-mkimage}
> +@comment using the @code{--grub-mkimage} flag to @command{grub-install}.
>
> GRUB uses GPG-style detached signatures (meaning that a file
> @file{foo.sig} will be produced when file @file{foo} is signed), and
> @@ -5353,10 +5378,11 @@ See also: @ref{check_signatures}, @ref{verify_detached}, @ref{trust},
> @ref{list_trusted}, @ref{distrust}, @ref{load_env}, @ref{save_env}.
>
> Note that internally signature enforcement is controlled by setting
> -the environment variable @code{check_signatures=enforce}. Passing one
> -or more @code{--pubkey} options to @command{grub-mkimage} implicitly
> -sets @code{check_signatures=enforce} in @file{core.img} prior to
> -processing any configuration files.
> +the environment variable @code{check_signatures} equal to
> +@code{enforce}. Passing one or more @code{--pubkey} options to
> +@command{grub-mkimage} implicitly defines @code{check_signatures}
> +equal to @code{enforce} in @file{core.img} prior to processing any
> +configuration files.
>
> Note that signature checking does @strong{not} prevent an attacker
> with (serial, physical, ...) console access from dropping manually to
> @@ -5366,12 +5392,13 @@ the GRUB console and executing:
> set check_signatures=no
> @end example
>
> -To prevent this, password-protection (@pxref{Security}) is essential.
> -Note that even with GRUB password protection, GRUB itself cannot
> -prevent someone with physical access to the machine from altering that
> -machine's firmware (e.g., Coreboot or BIOS) configuration to cause
> -the machine to boot from a different (attacker-controlled) device.
> -GRUB is at best only one link in a secure boot chain.
> +To prevent this, password-protection (@pxref{Authentication and
> +authorisation}) is essential. Note that even with GRUB password
> +protection, GRUB itself cannot prevent someone with physical access to
> +the machine from altering that machine's firmware (e.g., Coreboot
> +or BIOS) configuration to cause the machine to boot from a different
> +(attacker-controlled) device. GRUB is at best only one link in a
> +secure boot chain.
>
> @node Platform limitations
> @chapter Platform limitations
>
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 291 bytes --]
prev parent reply other threads:[~2013-10-24 19:19 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-10-21 23:15 [PATCH v3] Documentation cleanup in response to ML discussion Jon McCune
2013-10-24 19:19 ` Vladimir 'φ-coder/phcoder' Serbinenko [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=526972C2.9020509@gmail.com \
--to=phcoder@gmail.com \
--cc=grub-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).