summaryrefslogtreecommitdiffstats
path: root/security/integrity
diff options
context:
space:
mode:
authorMimi Zohar <zohar@linux.vnet.ibm.com>2017-04-21 18:58:27 -0400
committerMimi Zohar <zohar@linux.vnet.ibm.com>2017-06-21 14:37:12 -0400
commit503ceaef8e2e7dbbdb04a867acc6fe4c548ede7f (patch)
tree8657ab63e5546d352bdc1c4ffaa420d75b701d94 /security/integrity
parent33ce9549cfa1e71d77bc91a2e67e65d693e2e53f (diff)
ima: define a set of appraisal rules requiring file signatures
The builtin "ima_appraise_tcb" policy should require file signatures for at least a few of the hooks (eg. kernel modules, firmware, and the kexec kernel image), but changing it would break the existing userspace/kernel ABI. This patch defines a new builtin policy named "secure_boot", which can be specified on the "ima_policy=" boot command line, independently or in conjunction with the "ima_appraise_tcb" policy, by specifing ima_policy="appraise_tcb | secure_boot". The new appraisal rules requiring file signatures will be added prior to the "ima_appraise_tcb" rules. Signed-off-by: Mimi Zohar <zohar@linux.vnet.ibm.com> Changelog: - Reference secure boot in the new builtin policy name. (Thiago Bauermann)
Diffstat (limited to 'security/integrity')
-rw-r--r--security/integrity/ima/ima_policy.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/security/integrity/ima/ima_policy.c b/security/integrity/ima/ima_policy.c
index 0ddc41389a9c..3653c86c70df 100644
--- a/security/integrity/ima/ima_policy.c
+++ b/security/integrity/ima/ima_policy.c
@@ -153,6 +153,17 @@ static struct ima_rule_entry default_appraise_rules[] __ro_after_init = {
153#endif 153#endif
154}; 154};
155 155
156static struct ima_rule_entry secure_boot_rules[] __ro_after_init = {
157 {.action = APPRAISE, .func = MODULE_CHECK,
158 .flags = IMA_FUNC | IMA_DIGSIG_REQUIRED},
159 {.action = APPRAISE, .func = FIRMWARE_CHECK,
160 .flags = IMA_FUNC | IMA_DIGSIG_REQUIRED},
161 {.action = APPRAISE, .func = KEXEC_KERNEL_CHECK,
162 .flags = IMA_FUNC | IMA_DIGSIG_REQUIRED},
163 {.action = APPRAISE, .func = POLICY_CHECK,
164 .flags = IMA_FUNC | IMA_DIGSIG_REQUIRED},
165};
166
156static LIST_HEAD(ima_default_rules); 167static LIST_HEAD(ima_default_rules);
157static LIST_HEAD(ima_policy_rules); 168static LIST_HEAD(ima_policy_rules);
158static LIST_HEAD(ima_temp_rules); 169static LIST_HEAD(ima_temp_rules);
@@ -171,6 +182,7 @@ static int __init default_measure_policy_setup(char *str)
171__setup("ima_tcb", default_measure_policy_setup); 182__setup("ima_tcb", default_measure_policy_setup);
172 183
173static bool ima_use_appraise_tcb __initdata; 184static bool ima_use_appraise_tcb __initdata;
185static bool ima_use_secure_boot __initdata;
174static int __init policy_setup(char *str) 186static int __init policy_setup(char *str)
175{ 187{
176 char *p; 188 char *p;
@@ -182,6 +194,8 @@ static int __init policy_setup(char *str)
182 ima_policy = DEFAULT_TCB; 194 ima_policy = DEFAULT_TCB;
183 else if (strcmp(p, "appraise_tcb") == 0) 195 else if (strcmp(p, "appraise_tcb") == 0)
184 ima_use_appraise_tcb = 1; 196 ima_use_appraise_tcb = 1;
197 else if (strcmp(p, "secure_boot") == 0)
198 ima_use_secure_boot = 1;
185 } 199 }
186 200
187 return 1; 201 return 1;
@@ -410,12 +424,14 @@ void ima_update_policy_flag(void)
410 */ 424 */
411void __init ima_init_policy(void) 425void __init ima_init_policy(void)
412{ 426{
413 int i, measure_entries, appraise_entries; 427 int i, measure_entries, appraise_entries, secure_boot_entries;
414 428
415 /* if !ima_policy set entries = 0 so we load NO default rules */ 429 /* if !ima_policy set entries = 0 so we load NO default rules */
416 measure_entries = ima_policy ? ARRAY_SIZE(dont_measure_rules) : 0; 430 measure_entries = ima_policy ? ARRAY_SIZE(dont_measure_rules) : 0;
417 appraise_entries = ima_use_appraise_tcb ? 431 appraise_entries = ima_use_appraise_tcb ?
418 ARRAY_SIZE(default_appraise_rules) : 0; 432 ARRAY_SIZE(default_appraise_rules) : 0;
433 secure_boot_entries = ima_use_secure_boot ?
434 ARRAY_SIZE(secure_boot_rules) : 0;
419 435
420 for (i = 0; i < measure_entries; i++) 436 for (i = 0; i < measure_entries; i++)
421 list_add_tail(&dont_measure_rules[i].list, &ima_default_rules); 437 list_add_tail(&dont_measure_rules[i].list, &ima_default_rules);
@@ -434,6 +450,14 @@ void __init ima_init_policy(void)
434 break; 450 break;
435 } 451 }
436 452
453 /*
454 * Insert the appraise rules requiring file signatures, prior to
455 * any other appraise rules.
456 */
457 for (i = 0; i < secure_boot_entries; i++)
458 list_add_tail(&secure_boot_rules[i].list,
459 &ima_default_rules);
460
437 for (i = 0; i < appraise_entries; i++) { 461 for (i = 0; i < appraise_entries; i++) {
438 list_add_tail(&default_appraise_rules[i].list, 462 list_add_tail(&default_appraise_rules[i].list,
439 &ima_default_rules); 463 &ima_default_rules);