Come controllare la firma digitale del software

Massimo Gravino
INFN - Sezione di Padova
19 settembre 2011

Sommario

Nessun sito e` affidabile

Da molti giorni ormai kernel.org, http://linux.com e http://www.linuxfoundation.org sono inaccessibilii per manutenzione a causa di problemi di security.

In un articolo su The Register, si racconta che negli ultimi tempi ci sono state intrusioni anche in altri autorevoli siti che distribuiscono software open source come apache.org, violato in aprile 2010, e savannah.gnu.org, repository di GNU, violato nel dicembre 2010.

Questo significa che e` importante controllare l'autenticita` del software anche quando lo si scarica da siti autorevoli e percio` considerati sicuri. Quasi sempre il software distribuito da questi siti e` dotato di firma digitale: bisogna controllarla usando gpg.

Come controllare la firma digitale di un file

Il caso piu` frequente e` che la firma sia in un file separato rispetto al software, con estensione .asc. Per verificare la firma devo scaricare anche questo file:

   wget http://sito.autorevole.ma.meglio.controllare/pacchetto.software
   wget http://sito.autorevole.ma.meglio.controllare/pacchetto.software.asc    

A questo punto per verificare la firma:

   gpg --verify software.pkg.asc

Se non avete mai scaricato la chiave pubblica di chi ha firmato il software otterrete:

   gpg: Signature made Fri 09 Sep 2011 04:34:49 PM CEST using RSA key ID nnn
   gpg: Can't check signature: public key not found

In questo caso si deve scaricare la chiave pubblica con ID nnn da un qualunque keyserver:

   gpg --keyserver nome.di.un.keyserver --recv-keys nnn

Poi si usa di nuovo il comando precedente:

   gpg --verify software.pkg.asc

Se tutto va bene dovremmo ottenere il responso "Good signature" (oltre ad altre informazioni).

I keyserver sono sincronizzati tra loro, quindi uno vale l'altro. Ecco da wikipedia l'elenco dei piu` usati (notare che a volte il protocollo e` hkp, ma comunque pare che funzioni anche senza specificarlo):

Esiste anche il keyserver italiano del PLUG: http://keyserver.linux.it.

Ecco un esempio reale:

   $ wget http://apache.bfeel.it//httpd/httpd-2.2.21.tar.gz
   ....
   2011-09-19 10:35:06 (9.81 MB/s) - `httpd-2.2.21.tar.gz' saved

   $ wget http://apache.bfeel.it//httpd/httpd-2.2.21.tar.gz.asc
   ....
   2011-09-19 10:35:31 (11.0 MB/s) - `httpd-2.2.21.tar.gz.asc' saved

   $ gpg --verify httpd-2.2.21.tar.gz.asc
   gpg: Signature made Fri 09 Sep 2011 04:34:49 PM CEST using RSA key ID 60C5442D
   gpg: Can't check signature: public key not found

   $ gpg --keyserver pgp.mit.edu --recv-keys 60C5442D
   gpg: requesting key 60C5442D from hkp server pgp.mit.edu
   gpg: key B55D9977: public key "William A. Rowe, Jr. <wrowe@rowe-clan.net>" imported
   gpg: 3 marginal(s) needed, 1 complete(s) needed, classic trust model
   gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
   gpg: Total number processed: 1
   gpg:               imported: 1  (RSA: 1)

   $ gpg --verify httpd-2.2.21.tar.gz.asc
   gpg: Signature made Fri 09 Sep 2011 04:34:49 PM CEST using RSA key ID 60C5442D
   gpg: Good signature from "William A. Rowe, Jr. <wrowe@rowe-clan.net>"
   gpg:                 aka "William A. Rowe, Jr. <wrowe@apache.org>"
   gpg:                 aka "William A. Rowe, Jr. <wrowe@vmware.com>"
   gpg:                 aka "William A. Rowe, Jr. <william.rowe@springsource.com>"
   gpg: WARNING: This key is not certified with a trusted signature!
   gpg:          There is no indication that the signature belongs to the owner.
   Primary key fingerprint: B1B9 6F45 DFBD CCF9 7401  9235 193F 180A B55D 9977
        Subkey fingerprint: 627B E9D7 D7C6 9D30 A2F5  B008 5593 BCA9 60C5 442D   
Vediamo che la firma digitale e` valida (Good signature), anche se la chiave pubblica non e` garantita da una certification authority o da un'altra firma che consideriamo affidabile.

Come controllare la firma digitale di un pacchetto rpm

Nel caso si utilizzino i packages di redhat, il controllo della firma si fa con rpm -K nome_package. Se la chiave non e` presente nel database di rpm, si deve scaricarla da un keyserver e importarla con rmp --import nomefile.

Ecco un esempio:

   $ wget ftp://fr2.rpmfind.net/linux/dag/fedora/3/en/i386/dag/RPMS/xosview-1.8.3-1.fc3.rf.i386.rpm
   ......
   11:56:54 (894.58 KB/s) - `xosview-1.8.3-1.fc3.rf.i386.rpm' saved [101763]

   $ rpm -K xosview-1.8.3-1.fc3.rf.i386.rpm
   xosview-1.8.3-1.fc3.rf.i386.rpm: (SHA1) DSA sha1 md5 (GPG) NOT OK (MISSING KEYS: GPG#6b8d79e6) 

A questo punto si deve andare col browser su un keyserver dotato di interfaccia web (ad es. http://keyserver.linux.it/) e estrarre la chiave 6b8d79e6, copiandola in un file. Va fatta attenzione ad anteporre 0x all'ID esadecimale della chiave da inserire nella maschera di ricerca.
In genere il risultato della ricerca propone un link che punta alla chiave in formato pem:

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: SKS 1.1.1

mQGiBD9JMT0RBAC9Q2B0AloUMTxaK73sD0cOu1MMdD8yuDagbMlDtUYA1aGeJVO6TV02JLGr
67OBY+UkYuC1c3PUwmb3+jakZd5bW1L8E2L705wS0129xQOZPz6J+alF5rTzVkiefg8ch1yE
cMayK20NdyOmhDGXQXNQS8OJFLTIC6bJs+7MZL83/wCg3cG33q7MWHm3IpJb+6QKpB9YH58D
/2WjPDK+7YIky/JbFBT4JPgTSBy611+bLqHA6PXq39tzY6un8KDznAMNtm+NAsr6FEG8PHe4
06+tbgd7tBkecz3HPX8nR5v0JtDT+gzN8fM3kAiAzjCHUAFWVAMAZLr5TXuoq4lGTTxvZbwT
jZfyjCm7gIieCu8+qnPWh6hm30NgA/0ZyEHG6I4rOWqPks4vZuD+wlp5XL8moBXEKfEVOMh2
MCNDRGnvVHu1P3eDoHOooVMt9sWrGcgxpYuupPNL4Uf6B6smiLlH6D4tEg+qCxC17zABI557
2XJTJ170JklZJrPGtnkPrrKMamnN9MU4RjGmjh9JZPa7rKjZHyWP/z/CBrQ1RGFnIFdpZWVy
cyAoRGFnIEFwdCBSZXBvc2l0b3J5IHYxLjApIDxkYWdAd2llZXJzLmNvbT6IRgQQEQIABgUC
P0kxYAAKCRCiPaJc+qeZ6+c4AJ9FBpqB4xwRIdUTX5FK4/e3E9S+gQCgkC04eieD7dLNU1Jk
uf+Dv8uN/D6IRgQQEQIABgUCQDGJEwAKCRA08qm92SVBjTq7AJ9BB+z/KfUrGbCxRk+DXMmB
C+x/tgCdHt3Zk163FW5TuLLhvCD5Q/8Tf0uIRgQQEQIABgUCQDJX3wAKCRCMYHtXouNMgGY8
AKCHc62MIHpOAtDRCKt4BqwOOYu0AQCfS7WCaAFGdQXlr8fuEP+qB7y6HwiIRgQSEQIABgUC
QMklswAKCRCgOnFnLIp2kfHoAJoCf+b0VT6gWjC1ZEDqDTPOi2GJbACePFdwnFmhQvIF7A5h
o90r5+nGfOCIWQQTEQIAGQUCP0kxPQQLBwMCAxUCAwMWAgECHgECF4AACgkQog5SFGuNeeYv
DQCeKHSThIq/WzFBXtJOnQkJGSqAoHoAnRtsJVWYmzYKHqzkRx1qAzL18Sd0uQENBD9JMT8Q
BACj1QzRptL6hbpWl5DdQ2T+3ekEjJGtllCwt4Mwt/yOHDhzLe8SzUNyYxTXUL4TPfFvVW9/
j8WOkNGvffbs7g84k7a5h/+lIJTTlP9V9NruDt1dlrBe+mWF6eCY55OFHjb6nOIkcJwKxRd3
nGlWnLsz0ce9Hjrg6lMrn0lPsMV6swADBQP9H42sss6mlqnJEFA97Fl3V9s+7UVJoAIA5uSV
XxEOwVohVq7uECQRvWzif6tzOY+vHkUxOBRvD6oIU6tlmuG3WByKyA1d0MTqMr3eWieSYf/L
n5VA9NuD7NwjFA1kLkoDwfSbsF51LppTMkUggzwgvwE46MB6yyuqAVI1kReAWw+IRgQYEQIA
BgUCP0kxPwAKCRCiDlIUa4155oktAKDAzm9QYbDpk6SrQhkSFy016BjEBACeJU1hpElFnUZC
L4yKj4EuLnlo8kc=
=hCEn
-----END PGP PUBLIC KEY BLOCK-----

Si copia la chiave in un file (es. chiave.pem) e poi, da root, si usa rpm --import chiave.pem per importare la chiave. A questo punto si puo` controllare la firma digitale:

$ rpm -K xosview-1.8.3-1.fc3.rf.i386.rpm 
xosview-1.8.3-1.fc3.rf.i386.rpm: (sha1) dsa sha1 md5 gpg OK

Come si vede, adesso anche la chiave gpg risulta ok.

Come controllare la firma digitale con yum

Nel caso di un pacchetto scaricato da un repository di yum le cose sono in parte automatizzate: nelle definizioni del repository (si vedano i files .repo in /etc/yum.repos.d/) si puo` richiedere il controllo della firma gpg (gpgcheck=1) e possono essere indicate delle URL o dei file che contengono le chiavi da importare nel database RPM (gpgkey url-list).

Peccato che sia i repository di scientific linux, sia epel e atrpms, che sono spesso da noi utilizzati, fino a SL 5 per default abbiano impostato gpgcheck=0, che quindi andrebbe cambiato a mano nei file *.repo in /etc/yum.repos.d/

Per fortuna da SL 6 il default e` forzare il controllo.