diff options
| author | Mimi Zohar <zohar@linux.vnet.ibm.com> | 2017-04-21 18:58:27 -0400 |
|---|---|---|
| committer | Mimi Zohar <zohar@linux.vnet.ibm.com> | 2017-06-21 14:37:12 -0400 |
| commit | 503ceaef8e2e7dbbdb04a867acc6fe4c548ede7f (patch) | |
| tree | 8657ab63e5546d352bdc1c4ffaa420d75b701d94 /security | |
| parent | 33ce9549cfa1e71d77bc91a2e67e65d693e2e53f (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')
| -rw-r--r-- | security/integrity/ima/ima_policy.c | 26 |
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 | ||
| 156 | static 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 | |||
| 156 | static LIST_HEAD(ima_default_rules); | 167 | static LIST_HEAD(ima_default_rules); |
| 157 | static LIST_HEAD(ima_policy_rules); | 168 | static LIST_HEAD(ima_policy_rules); |
| 158 | static LIST_HEAD(ima_temp_rules); | 169 | static 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 | ||
| 173 | static bool ima_use_appraise_tcb __initdata; | 184 | static bool ima_use_appraise_tcb __initdata; |
| 185 | static bool ima_use_secure_boot __initdata; | ||
| 174 | static int __init policy_setup(char *str) | 186 | static 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 | */ |
| 411 | void __init ima_init_policy(void) | 425 | void __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); |
