Skip to content

Commit 2b60c0e

Browse files
nramasmimizohar
authored andcommitted
IMA: Read keyrings= option from the IMA policy
Read "keyrings=" option, if specified in the IMA policy, and store in the list of IMA rules when the configured IMA policy is read. This patch defines a new policy token enum namely Opt_keyrings and an option flag IMA_KEYRINGS for reading "keyrings=" option from the IMA policy. Updated ima_parse_rule() to parse "keyrings=" option in the policy. Updated ima_policy_show() to display "keyrings=" option. The following example illustrates how key measurement can be verified. Sample "key" measurement rule in the IMA policy: measure func=KEY_CHECK uid=0 keyrings=.ima|.evm template=ima-buf Display "key" measurement in the IMA measurement list: cat /sys/kernel/security/ima/ascii_runtime_measurements 10 faf3...e702 ima-buf sha256:27c915b8ddb9fae7214cf0a8a7043cc3eeeaa7539bcb136f8427067b5f6c3b7b .ima 308202863082...4aee Verify "key" measurement data for a key added to ".ima" keyring: cat /sys/kernel/security/integrity/ima/ascii_runtime_measurements | grep -m 1 "\.ima" | cut -d' ' -f 6 | xxd -r -p |tee ima-cert.der | sha256sum | cut -d' ' -f 1 The output of the above command should match the template hash of the first "key" measurement entry in the IMA measurement list for the key added to ".ima" keyring. The file namely "ima-cert.der" generated by the above command should be a valid x509 certificate (in DER format) and should match the one that was used to import the key to the ".ima" keyring. The certificate file can be verified using openssl tool. Signed-off-by: Lakshmi Ramasubramanian <[email protected]> Signed-off-by: Mimi Zohar <[email protected]>
1 parent e9085e0 commit 2b60c0e

File tree

1 file changed

+28
-1
lines changed

1 file changed

+28
-1
lines changed

security/integrity/ima/ima_policy.c

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#define IMA_EUID 0x0080
3535
#define IMA_PCR 0x0100
3636
#define IMA_FSNAME 0x0200
37+
#define IMA_KEYRINGS 0x0400
3738

3839
#define UNKNOWN 0
3940
#define MEASURE 0x0001 /* same as IMA_MEASURE */
@@ -820,7 +821,8 @@ enum {
820821
Opt_uid_gt, Opt_euid_gt, Opt_fowner_gt,
821822
Opt_uid_lt, Opt_euid_lt, Opt_fowner_lt,
822823
Opt_appraise_type, Opt_appraise_flag,
823-
Opt_permit_directio, Opt_pcr, Opt_template, Opt_err
824+
Opt_permit_directio, Opt_pcr, Opt_template, Opt_keyrings,
825+
Opt_err
824826
};
825827

826828
static const match_table_t policy_tokens = {
@@ -856,6 +858,7 @@ static const match_table_t policy_tokens = {
856858
{Opt_permit_directio, "permit_directio"},
857859
{Opt_pcr, "pcr=%s"},
858860
{Opt_template, "template=%s"},
861+
{Opt_keyrings, "keyrings=%s"},
859862
{Opt_err, NULL}
860863
};
861864

@@ -1105,6 +1108,23 @@ static int ima_parse_rule(char *rule, struct ima_rule_entry *entry)
11051108
result = 0;
11061109
entry->flags |= IMA_FSNAME;
11071110
break;
1111+
case Opt_keyrings:
1112+
ima_log_string(ab, "keyrings", args[0].from);
1113+
1114+
if ((entry->keyrings) ||
1115+
(entry->action != MEASURE) ||
1116+
(entry->func != KEY_CHECK)) {
1117+
result = -EINVAL;
1118+
break;
1119+
}
1120+
entry->keyrings = kstrdup(args[0].from, GFP_KERNEL);
1121+
if (!entry->keyrings) {
1122+
result = -ENOMEM;
1123+
break;
1124+
}
1125+
result = 0;
1126+
entry->flags |= IMA_KEYRINGS;
1127+
break;
11081128
case Opt_fsuuid:
11091129
ima_log_string(ab, "fsuuid", args[0].from);
11101130

@@ -1480,6 +1500,13 @@ int ima_policy_show(struct seq_file *m, void *v)
14801500
seq_puts(m, " ");
14811501
}
14821502

1503+
if (entry->flags & IMA_KEYRINGS) {
1504+
if (entry->keyrings != NULL)
1505+
snprintf(tbuf, sizeof(tbuf), "%s", entry->keyrings);
1506+
seq_printf(m, pt(Opt_keyrings), tbuf);
1507+
seq_puts(m, " ");
1508+
}
1509+
14831510
if (entry->flags & IMA_PCR) {
14841511
snprintf(tbuf, sizeof(tbuf), "%d", entry->pcr);
14851512
seq_printf(m, pt(Opt_pcr), tbuf);

0 commit comments

Comments
 (0)