1.. _pgpguide: 2 3=========================== 4Kernel Maintainer PGP guide 5=========================== 6 7:Author: Konstantin Ryabitsev <konstantin@linuxfoundation.org> 8 9This document is aimed at Linux kernel developers, and especially at 10subsystem maintainers. It contains a subset of information discussed in 11the more general "`Protecting Code Integrity`_" guide published by the 12Linux Foundation. Please read that document for more in-depth discussion 13on some of the topics mentioned in this guide. 14 15.. _`Protecting Code Integrity`: https://github.com/lfit/itpol/blob/master/protecting-code-integrity.md 16 17The role of PGP in Linux Kernel development 18=========================================== 19 20PGP helps ensure the integrity of the code that is produced by the Linux 21kernel development community and, to a lesser degree, establish trusted 22communication channels between developers via PGP-signed email exchange. 23 24The Linux kernel source code is available in two main formats: 25 26- Distributed source repositories (git) 27- Periodic release snapshots (tarballs) 28 29Both git repositories and tarballs carry PGP signatures of the kernel 30developers who create official kernel releases. These signatures offer a 31cryptographic guarantee that downloadable versions made available via 32kernel.org or any other mirrors are identical to what these developers 33have on their workstations. To this end: 34 35- git repositories provide PGP signatures on all tags 36- tarballs provide detached PGP signatures with all downloads 37 38.. _devs_not_infra: 39 40Trusting the developers, not infrastructure 41------------------------------------------- 42 43Ever since the 2011 compromise of core kernel.org systems, the main 44operating principle of the Kernel Archives project has been to assume 45that any part of the infrastructure can be compromised at any time. For 46this reason, the administrators have taken deliberate steps to emphasize 47that trust must always be placed with developers and never with the code 48hosting infrastructure, regardless of how good the security practices 49for the latter may be. 50 51The above guiding principle is the reason why this guide is needed. We 52want to make sure that by placing trust into developers we do not simply 53shift the blame for potential future security incidents to someone else. 54The goal is to provide a set of guidelines developers can use to create 55a secure working environment and safeguard the PGP keys used to 56establish the integrity of the Linux kernel itself. 57 58.. _pgp_tools: 59 60PGP tools 61========= 62 63Use GnuPG v2 64------------ 65 66Your distro should already have GnuPG installed by default, you just 67need to verify that you are using version 2.x and not the legacy 1.4 68release -- many distributions still package both, with the default 69``gpg`` command invoking GnuPG v.1. To check, run:: 70 71 $ gpg --version | head -n1 72 73If you see ``gpg (GnuPG) 1.4.x``, then you are using GnuPG v.1. Try the 74``gpg2`` command (if you don't have it, you may need to install the 75gnupg2 package):: 76 77 $ gpg2 --version | head -n1 78 79If you see ``gpg (GnuPG) 2.x.x``, then you are good to go. This guide 80will assume you have the version 2.2 of GnuPG (or later). If you are 81using version 2.0 of GnuPG, then some of the commands in this guide will 82not work, and you should consider installing the latest 2.2 version of 83GnuPG. Versions of gnupg-2.1.11 and later should be compatible for the 84purposes of this guide as well. 85 86If you have both ``gpg`` and ``gpg2`` commands, you should make sure you 87are always using GnuPG v2, not the legacy version. You can enforce this 88by setting the appropriate alias:: 89 90 $ alias gpg=gpg2 91 92You can put that in your ``.bashrc`` to make sure it's always the case. 93 94Configure gpg-agent options 95~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 97The GnuPG agent is a helper tool that will start automatically whenever 98you use the ``gpg`` command and run in the background with the purpose 99of caching the private key passphrase. There are two options you should 100know in order to tweak when the passphrase should be expired from cache: 101 102- ``default-cache-ttl`` (seconds): If you use the same key again before 103 the time-to-live expires, the countdown will reset for another period. 104 The default is 600 (10 minutes). 105- ``max-cache-ttl`` (seconds): Regardless of how recently you've used 106 the key since initial passphrase entry, if the maximum time-to-live 107 countdown expires, you'll have to enter the passphrase again. The 108 default is 30 minutes. 109 110If you find either of these defaults too short (or too long), you can 111edit your ``~/.gnupg/gpg-agent.conf`` file to set your own values:: 112 113 # set to 30 minutes for regular ttl, and 2 hours for max ttl 114 default-cache-ttl 1800 115 max-cache-ttl 7200 116 117.. note:: 118 119 It is no longer necessary to start gpg-agent manually at the 120 beginning of your shell session. You may want to check your rc files 121 to remove anything you had in place for older versions of GnuPG, as 122 it may not be doing the right thing any more. 123 124.. _protect_your_key: 125 126Protect your PGP key 127==================== 128 129This guide assumes that you already have a PGP key that you use for Linux 130kernel development purposes. If you do not yet have one, please see the 131"`Protecting Code Integrity`_" document mentioned earlier for guidance 132on how to create a new one. 133 134You should also make a new key if your current one is weaker than 2048 135bits (RSA). 136 137Understanding PGP Subkeys 138------------------------- 139 140A PGP key rarely consists of a single keypair -- usually it is a 141collection of independent subkeys that can be used for different 142purposes based on their capabilities, assigned at their creation time. 143PGP defines four capabilities that a key can have: 144 145- **[S]** keys can be used for signing 146- **[E]** keys can be used for encryption 147- **[A]** keys can be used for authentication 148- **[C]** keys can be used for certifying other keys 149 150The key with the **[C]** capability is often called the "master" key, 151but this terminology is misleading because it implies that the Certify 152key can be used in place of any of other subkey on the same chain (like 153a physical "master key" can be used to open the locks made for other 154keys). Since this is not the case, this guide will refer to it as "the 155Certify key" to avoid any ambiguity. 156 157It is critical to fully understand the following: 158 1591. All subkeys are fully independent from each other. If you lose a 160 private subkey, it cannot be restored or recreated from any other 161 private key on your chain. 1622. With the exception of the Certify key, there can be multiple subkeys 163 with identical capabilities (e.g. you can have 2 valid encryption 164 subkeys, 3 valid signing subkeys, but only one valid certification 165 subkey). All subkeys are fully independent -- a message encrypted to 166 one **[E]** subkey cannot be decrypted with any other **[E]** subkey 167 you may also have. 1683. A single subkey may have multiple capabilities (e.g. your **[C]** key 169 can also be your **[S]** key). 170 171The key carrying the **[C]** (certify) capability is the only key that 172can be used to indicate relationship with other keys. Only the **[C]** 173key can be used to: 174 175- add or revoke other keys (subkeys) with S/E/A capabilities 176- add, change or revoke identities (uids) associated with the key 177- add or change the expiration date on itself or any subkey 178- sign other people's keys for web of trust purposes 179 180By default, GnuPG creates the following when generating new keys: 181 182- One subkey carrying both Certify and Sign capabilities (**[SC]**) 183- A separate subkey with the Encryption capability (**[E]**) 184 185If you used the default parameters when generating your key, then that 186is what you will have. You can verify by running ``gpg --list-secret-keys``, 187for example:: 188 189 sec rsa2048 2018-01-23 [SC] [expires: 2020-01-23] 190 000000000000000000000000AAAABBBBCCCCDDDD 191 uid [ultimate] Alice Dev <adev@kernel.org> 192 ssb rsa2048 2018-01-23 [E] [expires: 2020-01-23] 193 194The long line under the ``sec`` entry is your key fingerprint -- 195whenever you see ``[fpr]`` in the examples below, that 40-character 196string is what it refers to. 197 198Ensure your passphrase is strong 199-------------------------------- 200 201GnuPG uses passphrases to encrypt your private keys before storing them on 202disk. This way, even if your ``.gnupg`` directory is leaked or stolen in 203its entirety, the attackers cannot use your private keys without first 204obtaining the passphrase to decrypt them. 205 206It is absolutely essential that your private keys are protected by a 207strong passphrase. To set it or change it, use:: 208 209 $ gpg --change-passphrase [fpr] 210 211Create a separate Signing subkey 212-------------------------------- 213 214Our goal is to protect your Certify key by moving it to offline media, 215so if you only have a combined **[SC]** key, then you should create a 216separate signing subkey:: 217 218 $ gpg --quick-addkey [fpr] ed25519 sign 219 220.. note:: ECC support in GnuPG 221 222 GnuPG 2.1 and later has full support for Elliptic Curve 223 Cryptography, with ability to combine ECC subkeys with traditional 224 RSA keys. The main upside of ECC cryptography is that it is much 225 faster computationally and creates much smaller signatures when 226 compared byte for byte with 2048+ bit RSA keys. Unless you plan on 227 using a smartcard device that does not support ECC operations, we 228 recommend that you create an ECC signing subkey for your kernel 229 work. 230 231 Note, that if you plan to use a hardware device that does not 232 support ED25519 ECC keys, you should choose "nistp256" instead or 233 "ed25519." 234 235 236Back up your Certify key for disaster recovery 237---------------------------------------------- 238 239The more signatures you have on your PGP key from other developers, the 240more reasons you have to create a backup version that lives on something 241other than digital media, for disaster recovery reasons. 242 243The best way to create a printable hardcopy of your private key is by 244using the ``paperkey`` software written for this very purpose. See ``man 245paperkey`` for more details on the output format and its benefits over 246other solutions. Paperkey should already be packaged for most 247distributions. 248 249Run the following command to create a hardcopy backup of your private 250key:: 251 252 $ gpg --export-secret-key [fpr] | paperkey -o /tmp/key-backup.txt 253 254Print out that file (or pipe the output straight to lpr), then take a 255pen and write your passphrase on the margin of the paper. **This is 256strongly recommended** because the key printout is still encrypted with 257that passphrase, and if you ever change it you will not remember what it 258used to be when you had created the backup -- *guaranteed*. 259 260Put the resulting printout and the hand-written passphrase into an envelope 261and store in a secure and well-protected place, preferably away from your 262home, such as your bank vault. 263 264.. note:: 265 266 Your printer is probably no longer a simple dumb device connected to 267 your parallel port, but since the output is still encrypted with 268 your passphrase, printing out even to "cloud-integrated" modern 269 printers should remain a relatively safe operation. 270 271Back up your whole GnuPG directory 272---------------------------------- 273 274.. warning:: 275 276 **!!!Do not skip this step!!!** 277 278It is important to have a readily available backup of your PGP keys 279should you need to recover them. This is different from the 280disaster-level preparedness we did with ``paperkey``. You will also rely 281on these external copies whenever you need to use your Certify key -- 282such as when making changes to your own key or signing other people's 283keys after conferences and summits. 284 285Start by getting a small USB "thumb" drive (preferably two!) that you 286will use for backup purposes. You will need to encrypt them using LUKS 287-- refer to your distro's documentation on how to accomplish this. 288 289For the encryption passphrase, you can use the same one as on your 290PGP key. 291 292Once the encryption process is over, re-insert the USB drive and make 293sure it gets properly mounted. Copy your entire ``.gnupg`` directory 294over to the encrypted storage:: 295 296 $ cp -a ~/.gnupg /media/disk/foo/gnupg-backup 297 298You should now test to make sure everything still works:: 299 300 $ gpg --homedir=/media/disk/foo/gnupg-backup --list-key [fpr] 301 302If you don't get any errors, then you should be good to go. Unmount the 303USB drive, distinctly label it so you don't blow it away next time you 304need to use a random USB drive, and put in a safe place -- but not too 305far away, because you'll need to use it every now and again for things 306like editing identities, adding or revoking subkeys, or signing other 307people's keys. 308 309Remove the Certify key from your homedir 310---------------------------------------- 311 312The files in our home directory are not as well protected as we like to 313think. They can be leaked or stolen via many different means: 314 315- by accident when making quick homedir copies to set up a new workstation 316- by systems administrator negligence or malice 317- via poorly secured backups 318- via malware in desktop apps (browsers, pdf viewers, etc) 319- via coercion when crossing international borders 320 321Protecting your key with a good passphrase greatly helps reduce the risk 322of any of the above, but passphrases can be discovered via keyloggers, 323shoulder-surfing, or any number of other means. For this reason, the 324recommended setup is to remove your Certify key from your home directory 325and store it on offline storage. 326 327.. warning:: 328 329 Please see the previous section and make sure you have backed up 330 your GnuPG directory in its entirety. What we are about to do will 331 render your key useless if you do not have a usable backup! 332 333First, identify the keygrip of your Certify key:: 334 335 $ gpg --with-keygrip --list-key [fpr] 336 337The output will be something like this:: 338 339 pub rsa2048 2018-01-24 [SC] [expires: 2020-01-24] 340 000000000000000000000000AAAABBBBCCCCDDDD 341 Keygrip = 1111000000000000000000000000000000000000 342 uid [ultimate] Alice Dev <adev@kernel.org> 343 sub rsa2048 2018-01-24 [E] [expires: 2020-01-24] 344 Keygrip = 2222000000000000000000000000000000000000 345 sub ed25519 2018-01-24 [S] 346 Keygrip = 3333000000000000000000000000000000000000 347 348Find the keygrip entry that is beneath the ``pub`` line (right under the 349Certify key fingerprint). This will correspond directly to a file in your 350``~/.gnupg`` directory:: 351 352 $ cd ~/.gnupg/private-keys-v1.d 353 $ ls 354 1111000000000000000000000000000000000000.key 355 2222000000000000000000000000000000000000.key 356 3333000000000000000000000000000000000000.key 357 358All you have to do is simply remove the .key file that corresponds to 359the Certify key keygrip:: 360 361 $ cd ~/.gnupg/private-keys-v1.d 362 $ rm 1111000000000000000000000000000000000000.key 363 364Now, if you issue the ``--list-secret-keys`` command, it will show that 365the Certify key is missing (the ``#`` indicates it is not available):: 366 367 $ gpg --list-secret-keys 368 sec# rsa2048 2018-01-24 [SC] [expires: 2020-01-24] 369 000000000000000000000000AAAABBBBCCCCDDDD 370 uid [ultimate] Alice Dev <adev@kernel.org> 371 ssb rsa2048 2018-01-24 [E] [expires: 2020-01-24] 372 ssb ed25519 2018-01-24 [S] 373 374You should also remove any ``secring.gpg`` files in the ``~/.gnupg`` 375directory, which are left over from earlier versions of GnuPG. 376 377If you don't have the "private-keys-v1.d" directory 378~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 379 380If you do not have a ``~/.gnupg/private-keys-v1.d`` directory, then your 381secret keys are still stored in the legacy ``secring.gpg`` file used by 382GnuPG v1. Making any changes to your key, such as changing the 383passphrase or adding a subkey, should automatically convert the old 384``secring.gpg`` format to use ``private-keys-v1.d`` instead. 385 386Once you get that done, make sure to delete the obsolete ``secring.gpg`` 387file, which still contains your private keys. 388 389.. _smartcards: 390 391Move the subkeys to a dedicated crypto device 392============================================= 393 394Even though the Certify key is now safe from being leaked or stolen, the 395subkeys are still in your home directory. Anyone who manages to get 396their hands on those will be able to decrypt your communication or fake 397your signatures (if they know the passphrase). Furthermore, each time a 398GnuPG operation is performed, the keys are loaded into system memory and 399can be stolen from there by sufficiently advanced malware (think 400Meltdown and Spectre). 401 402The best way to completely protect your keys is to move them to a 403specialized hardware device that is capable of smartcard operations. 404 405The benefits of smartcards 406-------------------------- 407 408A smartcard contains a cryptographic chip that is capable of storing 409private keys and performing crypto operations directly on the card 410itself. Because the key contents never leave the smartcard, the 411operating system of the computer into which you plug in the hardware 412device is not able to retrieve the private keys themselves. This is very 413different from the encrypted USB storage device we used earlier for 414backup purposes -- while that USB device is plugged in and mounted, the 415operating system is able to access the private key contents. 416 417Using external encrypted USB media is not a substitute to having a 418smartcard-capable device. 419 420Available smartcard devices 421--------------------------- 422 423Unless all your laptops and workstations have smartcard readers, the 424easiest is to get a specialized USB device that implements smartcard 425functionality. There are several options available: 426 427- `Nitrokey Start`_: Open hardware and Free Software, based on FSI 428 Japan's `Gnuk`_. One of the few available commercial devices that 429 support ED25519 ECC keys, but offer fewest security features (such as 430 resistance to tampering or some side-channel attacks). 431- `Nitrokey Pro 2`_: Similar to the Nitrokey Start, but more 432 tamper-resistant and offers more security features. Pro 2 supports ECC 433 cryptography (NISTP). 434- `Yubikey 5`_: proprietary hardware and software, but cheaper than 435 Nitrokey Pro and comes available in the USB-C form that is more useful 436 with newer laptops. Offers additional security features such as FIDO 437 U2F, among others, and now finally supports NISTP and ED25519 ECC 438 keys. 439 440`LWN has a good review`_ of some of the above models, as well as several 441others. Your choice will depend on cost, shipping availability in your 442geographical region, and open/proprietary hardware considerations. 443 444.. note:: 445 446 If you are listed in MAINTAINERS or have an account at kernel.org, 447 you `qualify for a free Nitrokey Start`_ courtesy of The Linux 448 Foundation. 449 450.. _`Nitrokey Start`: https://shop.nitrokey.com/shop/product/nitrokey-start-6 451.. _`Nitrokey Pro 2`: https://shop.nitrokey.com/shop/product/nkpr2-nitrokey-pro-2-3 452.. _`Yubikey 5`: https://www.yubico.com/products/yubikey-5-overview/ 453.. _Gnuk: https://www.fsij.org/doc-gnuk/ 454.. _`LWN has a good review`: https://lwn.net/Articles/736231/ 455.. _`qualify for a free Nitrokey Start`: https://www.kernel.org/nitrokey-digital-tokens-for-kernel-developers.html 456 457Configure your smartcard device 458------------------------------- 459 460Your smartcard device should Just Work (TM) the moment you plug it into 461any modern Linux workstation. You can verify it by running:: 462 463 $ gpg --card-status 464 465If you see full smartcard details, then you are good to go. 466Unfortunately, troubleshooting all possible reasons why things may not 467be working for you is way beyond the scope of this guide. If you are 468having trouble getting the card to work with GnuPG, please seek help via 469usual support channels. 470 471To configure your smartcard, you will need to use the GnuPG menu system, as 472there are no convenient command-line switches:: 473 474 $ gpg --card-edit 475 [...omitted...] 476 gpg/card> admin 477 Admin commands are allowed 478 gpg/card> passwd 479 480You should set the user PIN (1), Admin PIN (3), and the Reset Code (4). 481Please make sure to record and store these in a safe place -- especially 482the Admin PIN and the Reset Code (which allows you to completely wipe 483the smartcard). You so rarely need to use the Admin PIN, that you will 484inevitably forget what it is if you do not record it. 485 486Getting back to the main card menu, you can also set other values (such 487as name, sex, login data, etc), but it's not necessary and will 488additionally leak information about your smartcard should you lose it. 489 490.. note:: 491 492 Despite having the name "PIN", neither the user PIN nor the admin 493 PIN on the card need to be numbers. 494 495.. warning:: 496 497 Some devices may require that you move the subkeys onto the device 498 before you can change the passphrase. Please check the documentation 499 provided by the device manufacturer. 500 501Move the subkeys to your smartcard 502---------------------------------- 503 504Exit the card menu (using "q") and save all changes. Next, let's move 505your subkeys onto the smartcard. You will need both your PGP key 506passphrase and the admin PIN of the card for most operations:: 507 508 $ gpg --edit-key [fpr] 509 510 Secret subkeys are available. 511 512 pub rsa2048/AAAABBBBCCCCDDDD 513 created: 2018-01-23 expires: 2020-01-23 usage: SC 514 trust: ultimate validity: ultimate 515 ssb rsa2048/1111222233334444 516 created: 2018-01-23 expires: never usage: E 517 ssb ed25519/5555666677778888 518 created: 2017-12-07 expires: never usage: S 519 [ultimate] (1). Alice Dev <adev@kernel.org> 520 521 gpg> 522 523Using ``--edit-key`` puts us into the menu mode again, and you will 524notice that the key listing is a little different. From here on, all 525commands are done from inside this menu mode, as indicated by ``gpg>``. 526 527First, let's select the key we'll be putting onto the card -- you do 528this by typing ``key 1`` (it's the first one in the listing, the **[E]** 529subkey):: 530 531 gpg> key 1 532 533In the output, you should now see ``ssb*`` on the **[E]** key. The ``*`` 534indicates which key is currently "selected." It works as a *toggle*, 535meaning that if you type ``key 1`` again, the ``*`` will disappear and 536the key will not be selected any more. 537 538Now, let's move that key onto the smartcard:: 539 540 gpg> keytocard 541 Please select where to store the key: 542 (2) Encryption key 543 Your selection? 2 544 545Since it's our **[E]** key, it makes sense to put it into the Encryption 546slot. When you submit your selection, you will be prompted first for 547your PGP key passphrase, and then for the admin PIN. If the command 548returns without an error, your key has been moved. 549 550**Important**: Now type ``key 1`` again to unselect the first key, and 551``key 2`` to select the **[S]** key:: 552 553 gpg> key 1 554 gpg> key 2 555 gpg> keytocard 556 Please select where to store the key: 557 (1) Signature key 558 (3) Authentication key 559 Your selection? 1 560 561You can use the **[S]** key both for Signature and Authentication, but 562we want to make sure it's in the Signature slot, so choose (1). Once 563again, if your command returns without an error, then the operation was 564successful:: 565 566 gpg> q 567 Save changes? (y/N) y 568 569Saving the changes will delete the keys you moved to the card from your 570home directory (but it's okay, because we have them in our backups 571should we need to do this again for a replacement smartcard). 572 573Verifying that the keys were moved 574~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 576If you perform ``--list-secret-keys`` now, you will see a subtle 577difference in the output:: 578 579 $ gpg --list-secret-keys 580 sec# rsa2048 2018-01-24 [SC] [expires: 2020-01-24] 581 000000000000000000000000AAAABBBBCCCCDDDD 582 uid [ultimate] Alice Dev <adev@kernel.org> 583 ssb> rsa2048 2018-01-24 [E] [expires: 2020-01-24] 584 ssb> ed25519 2018-01-24 [S] 585 586The ``>`` in the ``ssb>`` output indicates that the subkey is only 587available on the smartcard. If you go back into your secret keys 588directory and look at the contents there, you will notice that the 589``.key`` files there have been replaced with stubs:: 590 591 $ cd ~/.gnupg/private-keys-v1.d 592 $ strings *.key | grep 'private-key' 593 594The output should contain ``shadowed-private-key`` to indicate that 595these files are only stubs and the actual content is on the smartcard. 596 597Verifying that the smartcard is functioning 598~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 599 600To verify that the smartcard is working as intended, you can create a 601signature:: 602 603 $ echo "Hello world" | gpg --clearsign > /tmp/test.asc 604 $ gpg --verify /tmp/test.asc 605 606This should ask for your smartcard PIN on your first command, and then 607show "Good signature" after you run ``gpg --verify``. 608 609Congratulations, you have successfully made it extremely difficult to 610steal your digital developer identity! 611 612Other common GnuPG operations 613----------------------------- 614 615Here is a quick reference for some common operations you'll need to do 616with your PGP key. 617 618Mounting your safe offline storage 619~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 620 621You will need your Certify key for any of the operations below, so you 622will first need to mount your backup offline storage and tell GnuPG to 623use it:: 624 625 $ export GNUPGHOME=/media/disk/foo/gnupg-backup 626 $ gpg --list-secret-keys 627 628You want to make sure that you see ``sec`` and not ``sec#`` in the 629output (the ``#`` means the key is not available and you're still using 630your regular home directory location). 631 632Extending key expiration date 633~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 634 635The Certify key has the default expiration date of 2 years from the date 636of creation. This is done both for security reasons and to make obsolete 637keys eventually disappear from keyservers. 638 639To extend the expiration on your key by a year from current date, just 640run:: 641 642 $ gpg --quick-set-expire [fpr] 1y 643 644You can also use a specific date if that is easier to remember (e.g. 645your birthday, January 1st, or Canada Day):: 646 647 $ gpg --quick-set-expire [fpr] 2020-07-01 648 649Remember to send the updated key back to keyservers:: 650 651 $ gpg --send-key [fpr] 652 653Updating your work directory after any changes 654~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 655 656After you make any changes to your key using the offline storage, you will 657want to import these changes back into your regular working directory:: 658 659 $ gpg --export | gpg --homedir ~/.gnupg --import 660 $ unset GNUPGHOME 661 662Using gpg-agent over ssh 663~~~~~~~~~~~~~~~~~~~~~~~~ 664 665You can forward your gpg-agent over ssh if you need to sign tags or 666commits on a remote system. Please refer to the instructions provided 667on the GnuPG wiki: 668 669- `Agent Forwarding over SSH`_ 670 671It works more smoothly if you can modify the sshd server settings on the 672remote end. 673 674.. _`Agent Forwarding over SSH`: https://wiki.gnupg.org/AgentForwarding 675 676.. _pgp_with_git: 677 678Using PGP with Git 679================== 680 681One of the core features of Git is its decentralized nature -- once a 682repository is cloned to your system, you have full history of the 683project, including all of its tags, commits and branches. However, with 684hundreds of cloned repositories floating around, how does anyone verify 685that their copy of linux.git has not been tampered with by a malicious 686third party? 687 688Or what happens if a backdoor is discovered in the code and the "Author" 689line in the commit says it was done by you, while you're pretty sure you 690had `nothing to do with it`_? 691 692To address both of these issues, Git introduced PGP integration. Signed 693tags prove the repository integrity by assuring that its contents are 694exactly the same as on the workstation of the developer who created the 695tag, while signed commits make it nearly impossible for someone to 696impersonate you without having access to your PGP keys. 697 698.. _`nothing to do with it`: https://github.com/jayphelps/git-blame-someone-else 699 700Configure git to use your PGP key 701--------------------------------- 702 703If you only have one secret key in your keyring, then you don't really 704need to do anything extra, as it becomes your default key. However, if 705you happen to have multiple secret keys, you can tell git which key 706should be used (``[fpr]`` is the fingerprint of your key):: 707 708 $ git config --global user.signingKey [fpr] 709 710**IMPORTANT**: If you have a distinct ``gpg2`` command, then you should 711tell git to always use it instead of the legacy ``gpg`` from version 1:: 712 713 $ git config --global gpg.program gpg2 714 $ git config --global gpgv.program gpgv2 715 716How to work with signed tags 717---------------------------- 718 719To create a signed tag, simply pass the ``-s`` switch to the tag 720command:: 721 722 $ git tag -s [tagname] 723 724Our recommendation is to always sign git tags, as this allows other 725developers to ensure that the git repository they are pulling from has 726not been maliciously altered. 727 728How to verify signed tags 729~~~~~~~~~~~~~~~~~~~~~~~~~ 730 731To verify a signed tag, simply use the ``verify-tag`` command:: 732 733 $ git verify-tag [tagname] 734 735If you are pulling a tag from another fork of the project repository, 736git should automatically verify the signature at the tip you're pulling 737and show you the results during the merge operation:: 738 739 $ git pull [url] tags/sometag 740 741The merge message will contain something like this:: 742 743 Merge tag 'sometag' of [url] 744 745 [Tag message] 746 747 # gpg: Signature made [...] 748 # gpg: Good signature from [...] 749 750If you are verifying someone else's git tag, then you will need to 751import their PGP key. Please refer to the 752":ref:`verify_identities`" section below. 753 754.. note:: 755 756 If you get "``gpg: Can't check signature: unknown pubkey 757 algorithm``" error, you need to tell git to use gpgv2 for 758 verification, so it properly processes signatures made by ECC keys. 759 See instructions at the start of this section. 760 761Configure git to always sign annotated tags 762~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 764Chances are, if you're creating an annotated tag, you'll want to sign 765it. To force git to always sign annotated tags, you can set a global 766configuration option:: 767 768 $ git config --global tag.forceSignAnnotated true 769 770How to work with signed commits 771------------------------------- 772 773It is easy to create signed commits, but it is much more difficult to 774use them in Linux kernel development, since it relies on patches sent to 775the mailing list, and this workflow does not preserve PGP commit 776signatures. Furthermore, when rebasing your repository to match 777upstream, even your own PGP commit signatures will end up discarded. For 778this reason, most kernel developers don't bother signing their commits 779and will ignore signed commits in any external repositories that they 780rely upon in their work. 781 782However, if you have your working git tree publicly available at some 783git hosting service (kernel.org, infradead.org, ozlabs.org, or others), 784then the recommendation is that you sign all your git commits even if 785upstream developers do not directly benefit from this practice. 786 787We recommend this for the following reasons: 788 7891. Should there ever be a need to perform code forensics or track code 790 provenance, even externally maintained trees carrying PGP commit 791 signatures will be valuable for such purposes. 7922. If you ever need to re-clone your local repository (for example, 793 after a disk failure), this lets you easily verify the repository 794 integrity before resuming your work. 7953. If someone needs to cherry-pick your commits, this allows them to 796 quickly verify their integrity before applying them. 797 798Creating signed commits 799~~~~~~~~~~~~~~~~~~~~~~~ 800 801To create a signed commit, you just need to pass the ``-S`` flag to the 802``git commit`` command (it's capital ``-S`` due to collision with 803another flag):: 804 805 $ git commit -S 806 807Configure git to always sign commits 808~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 809 810You can tell git to always sign commits:: 811 812 git config --global commit.gpgSign true 813 814.. note:: 815 816 Make sure you configure ``gpg-agent`` before you turn this on. 817 818.. _verify_identities: 819 820 821How to work with signed patches 822------------------------------- 823 824It is possible to use your PGP key to sign patches sent to kernel 825developer mailing lists. Since existing email signature mechanisms 826(PGP-Mime or PGP-inline) tend to cause problems with regular code 827review tasks, you should use the tool kernel.org created for this 828purpose that puts cryptographic attestation signatures into message 829headers (a-la DKIM): 830 831- `Patatt Patch Attestation`_ 832 833.. _`Patatt Patch Attestation`: https://pypi.org/project/patatt/ 834 835Installing and configuring patatt 836~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 838Patatt is packaged for many distributions already, so please check there 839first. You can also install it from pypi using "``pip install patatt``". 840 841If you already have your PGP key configured with git (via the 842``user.signingKey`` configuration parameter), then patatt requires no 843further configuration. You can start signing your patches by installing 844the git-send-email hook in the repository you want:: 845 846 patatt install-hook 847 848Now any patches you send with ``git send-email`` will be automatically 849signed with your cryptographic signature. 850 851Checking patatt signatures 852~~~~~~~~~~~~~~~~~~~~~~~~~~ 853 854If you are using ``b4`` to retrieve and apply patches, then it will 855automatically attempt to verify all DKIM and patatt signatures it 856encounters, for example:: 857 858 $ b4 am 20220720205013.890942-1-broonie@kernel.org 859 [...] 860 Checking attestation on all messages, may take a moment... 861 --- 862 ✓ [PATCH v1 1/3] kselftest/arm64: Correct buffer allocation for SVE Z registers 863 ✓ [PATCH v1 2/3] arm64/sve: Document our actual ABI for clearing registers on syscall 864 ✓ [PATCH v1 3/3] kselftest/arm64: Enforce actual ABI for SVE syscalls 865 --- 866 ✓ Signed: openpgp/broonie@kernel.org 867 ✓ Signed: DKIM/kernel.org 868 869.. note:: 870 871 Patatt and b4 are still in active development and you should check 872 the latest documentation for these projects for any new or updated 873 features. 874 875.. _kernel_identities: 876 877How to verify kernel developer identities 878========================================= 879 880Signing tags and commits is easy, but how does one go about verifying 881that the key used to sign something belongs to the actual kernel 882developer and not to a malicious imposter? 883 884Configure auto-key-retrieval using WKD and DANE 885----------------------------------------------- 886 887If you are not already someone with an extensive collection of other 888developers' public keys, then you can jumpstart your keyring by relying 889on key auto-discovery and auto-retrieval. GnuPG can piggyback on other 890delegated trust technologies, namely DNSSEC and TLS, to get you going if 891the prospect of starting your own Web of Trust from scratch is too 892daunting. 893 894Add the following to your ``~/.gnupg/gpg.conf``:: 895 896 auto-key-locate wkd,dane,local 897 auto-key-retrieve 898 899DNS-Based Authentication of Named Entities ("DANE") is a method for 900publishing public keys in DNS and securing them using DNSSEC signed 901zones. Web Key Directory ("WKD") is the alternative method that uses 902https lookups for the same purpose. When using either DANE or WKD for 903looking up public keys, GnuPG will validate DNSSEC or TLS certificates, 904respectively, before adding auto-retrieved public keys to your local 905keyring. 906 907Kernel.org publishes the WKD for all developers who have kernel.org 908accounts. Once you have the above changes in your ``gpg.conf``, you can 909auto-retrieve the keys for Linus Torvalds and Greg Kroah-Hartman (if you 910don't already have them):: 911 912 $ gpg --locate-keys torvalds@kernel.org gregkh@kernel.org 913 914If you have a kernel.org account, then you should `add the kernel.org 915UID to your key`_ to make WKD more useful to other kernel developers. 916 917.. _`add the kernel.org UID to your key`: https://korg.wiki.kernel.org/userdoc/mail#adding_a_kernelorg_uid_to_your_pgp_key 918 919Web of Trust (WOT) vs. Trust on First Use (TOFU) 920------------------------------------------------ 921 922PGP incorporates a trust delegation mechanism known as the "Web of 923Trust." At its core, this is an attempt to replace the need for 924centralized Certification Authorities of the HTTPS/TLS world. Instead of 925various software makers dictating who should be your trusted certifying 926entity, PGP leaves this responsibility to each user. 927 928Unfortunately, very few people understand how the Web of Trust works. 929While it remains an important aspect of the OpenPGP specification, 930recent versions of GnuPG (2.2 and above) have implemented an alternative 931mechanism called "Trust on First Use" (TOFU). You can think of TOFU as 932"the SSH-like approach to trust." With SSH, the first time you connect 933to a remote system, its key fingerprint is recorded and remembered. If 934the key changes in the future, the SSH client will alert you and refuse 935to connect, forcing you to make a decision on whether you choose to 936trust the changed key or not. Similarly, the first time you import 937someone's PGP key, it is assumed to be valid. If at any point in the 938future GnuPG comes across another key with the same identity, both the 939previously imported key and the new key will be marked as invalid and 940you will need to manually figure out which one to keep. 941 942We recommend that you use the combined TOFU+PGP trust model (which is 943the new default in GnuPG v2). To set it, add (or modify) the 944``trust-model`` setting in ``~/.gnupg/gpg.conf``:: 945 946 trust-model tofu+pgp 947 948Using the kernel.org web of trust repository 949-------------------------------------------- 950 951Kernel.org maintains a git repository with developers' public keys as a 952replacement for replicating keyserver networks that have gone mostly 953dark in the past few years. The full documentation for how to set up 954that repository as your source of public keys can be found here: 955 956- `Kernel developer PGP Keyring`_ 957 958If you are a kernel developer, please consider submitting your key for 959inclusion into that keyring. 960 961.. _`Kernel developer PGP Keyring`: https://korg.docs.kernel.org/pgpkeys.html 962