On Mon, Nov 16, 2015 at 3:10 PM, Mimi Zohar <zo...@linux.vnet.ibm.com> wrote: > On Mon, 2015-11-02 at 00:32 +0200, Petko Manolov wrote: >> This option creates IMA MOK and blacklist keyrings. IMA MOK is an >> intermediate keyring that sits between .system and .ima keyrings, >> effectively forming a simple CA hierarchy. To successfully import a key >> into .ima_mok it must be signed by a key which CA is in .system keyring. >> On turn any key that needs to go in .ima keyring must be signed by CA in >> either .system or .ima_mok keyrings. IMA MOK is empty at kernel boot. >> >> IMA blacklist keyring contains all revoked IMA keys. It is consulted >> before any other keyring. If the search is successful the requested >> operation is rejected and error is returned to the caller. > > Adding a key to the black list will prevent any new file integrity > verification from succeeding. This does not address files that have > already been verified and the results are already in the iint cache. > > The iint is a red-black tree. One method would be to walk the entire > tree clearing the cache info. Another method would be to include a > timestamp in the iint and lazily clear the iint cache info when next > accessed. Are there any other solutions? > > Mimi >
It would be possible compare verification timestamp to "blacklist" update timestamp. And if it was updated after, invalidate file verification.... Dmitry > >> Signed-off-by: Petko Manolov <pet...@mip-labs.com> >> --- >> crypto/asymmetric_keys/x509_public_key.c | 2 ++ >> include/keys/system_keyring.h | 24 ++++++++++++++ >> security/integrity/digsig_asymmetric.c | 14 +++++++++ >> security/integrity/ima/Kconfig | 18 +++++++++++ >> security/integrity/ima/Makefile | 1 + >> security/integrity/ima/ima_mok.c | 54 >> ++++++++++++++++++++++++++++++++ >> 6 files changed, 113 insertions(+) >> create mode 100644 security/integrity/ima/ima_mok.c >> >> diff --git a/crypto/asymmetric_keys/x509_public_key.c >> b/crypto/asymmetric_keys/x509_public_key.c >> index 1970966..66dcf30 100644 >> --- a/crypto/asymmetric_keys/x509_public_key.c >> +++ b/crypto/asymmetric_keys/x509_public_key.c >> @@ -319,6 +319,8 @@ static int x509_key_preparse(struct >> key_preparsed_payload *prep) >> goto error_free_cert; >> } else if (!prep->trusted) { >> ret = x509_validate_trust(cert, get_system_trusted_keyring()); >> + if (ret) >> + ret = x509_validate_trust(cert, get_ima_mok_keyring()); >> if (!ret) >> prep->trusted = 1; >> } >> diff --git a/include/keys/system_keyring.h b/include/keys/system_keyring.h >> index b20cd88..39fd38c 100644 >> --- a/include/keys/system_keyring.h >> +++ b/include/keys/system_keyring.h >> @@ -35,4 +35,28 @@ extern int system_verify_data(const void *data, unsigned >> long len, >> enum key_being_used_for usage); >> #endif >> >> +#ifdef CONFIG_IMA_MOK_KEYRING >> +extern struct key *ima_mok_keyring; >> +extern struct key *ima_blacklist_keyring; >> + >> +static inline struct key *get_ima_mok_keyring(void) >> +{ >> + return ima_mok_keyring; >> +} >> +static inline struct key *get_ima_blacklist_keyring(void) >> +{ >> + return ima_blacklist_keyring; >> +} >> +#else >> +static inline struct key *get_ima_mok_keyring(void) >> +{ >> + return NULL; >> +} >> +static inline struct key *get_ima_blacklist_keyring(void) >> +{ >> + return NULL; >> +} >> +#endif /* CONFIG_IMA_MOK_KEYRING */ >> + >> + >> #endif /* _KEYS_SYSTEM_KEYRING_H */ >> diff --git a/security/integrity/digsig_asymmetric.c >> b/security/integrity/digsig_asymmetric.c >> index 4fec181..5ade2a7 100644 >> --- a/security/integrity/digsig_asymmetric.c >> +++ b/security/integrity/digsig_asymmetric.c >> @@ -17,6 +17,7 @@ >> #include <linux/key-type.h> >> #include <crypto/public_key.h> >> #include <keys/asymmetric-type.h> >> +#include <keys/system_keyring.h> >> >> #include "integrity.h" >> >> @@ -32,9 +33,22 @@ static struct key *request_asymmetric_key(struct key >> *keyring, uint32_t keyid) >> >> pr_debug("key search: \"%s\"\n", name); >> >> + key = get_ima_blacklist_keyring(); >> + if (key) { >> + key_ref_t kref; >> + >> + kref = keyring_search(make_key_ref(key, 1), >> + &key_type_asymmetric, name); >> + if (!IS_ERR(kref)) { >> + pr_err("Key '%s' is in ima_blacklist_keyring\n", name); >> + return ERR_PTR(-EKEYREJECTED); >> + } >> + } >> + >> if (keyring) { >> /* search in specific keyring */ >> key_ref_t kref; >> + >> kref = keyring_search(make_key_ref(keyring, 1), >> &key_type_asymmetric, name); >> if (IS_ERR(kref)) >> diff --git a/security/integrity/ima/Kconfig b/security/integrity/ima/Kconfig >> index 59e215f..a489340 100644 >> --- a/security/integrity/ima/Kconfig >> +++ b/security/integrity/ima/Kconfig >> @@ -142,6 +142,24 @@ config IMA_TRUSTED_KEYRING >> This option requires that all keys added to the .ima >> keyring be signed by a key on the system trusted keyring. >> >> +config IMA_MOK_KEYRING >> + bool "Create IMA machine owner keys (MOK) and blacklist keyrings" >> + select SYSTEM_TRUSTED_KEYRING >> + select IMA_TRUSTED_KEYRING >> + default y >> + help >> + This option creates IMA MOK and blacklist keyrings. IMA MOK is an >> + intermediate keyring that sits between .system and .ima keyrings, >> + effectively forming a simple CA hierarchy. To successfully import a >> + key into .ima_mok it must be signed by a key which CA is in .system >> + keyring. On turn any key that needs to go in .ima keyring must be >> + signed by CA in either .system or .ima_mok keyrings. IMA MOK is >> empty >> + at kernel boot. >> + >> + IMA blacklist keyring contains all revoked IMA keys. It is >> consulted >> + before any other keyring. If the search is successful the requested >> + operation is rejected and error is returned to the caller. >> + >> config IMA_LOAD_X509 >> bool "Load X509 certificate onto the '.ima' trusted keyring" >> depends on IMA_TRUSTED_KEYRING >> diff --git a/security/integrity/ima/Makefile >> b/security/integrity/ima/Makefile >> index d79263d..a8539f9 100644 >> --- a/security/integrity/ima/Makefile >> +++ b/security/integrity/ima/Makefile >> @@ -8,3 +8,4 @@ obj-$(CONFIG_IMA) += ima.o >> ima-y := ima_fs.o ima_queue.o ima_init.o ima_main.o ima_crypto.o ima_api.o \ >> ima_policy.o ima_template.o ima_template_lib.o >> ima-$(CONFIG_IMA_APPRAISE) += ima_appraise.o >> +obj-$(CONFIG_IMA_MOK_KEYRING) += ima_mok.o >> diff --git a/security/integrity/ima/ima_mok.c >> b/security/integrity/ima/ima_mok.c >> new file mode 100644 >> index 0000000..18e37f5 >> --- /dev/null >> +++ b/security/integrity/ima/ima_mok.c >> @@ -0,0 +1,54 @@ >> +/* >> + * Copyright (C) 2015 Juniper Networks, Inc. >> + * >> + * Author: >> + * Petko Manolov <petko.mano...@konsulko.com> >> + * >> + * This program is free software; you can redistribute it and/or >> + * modify it under the terms of the GNU General Public License as >> + * published by the Free Software Foundation, version 2 of the >> + * License. >> + * >> + */ >> + >> +#include <linux/export.h> >> +#include <linux/kernel.h> >> +#include <linux/sched.h> >> +#include <linux/cred.h> >> +#include <linux/err.h> >> +#include <linux/module.h> >> +#include <keys/asymmetric-type.h> >> + >> + >> +struct key *ima_mok_keyring; >> +struct key *ima_blacklist_keyring; >> + >> +/* >> + * Allocate the IMA MOK and blacklist keyrings >> + */ >> +__init int ima_mok_init(void) >> +{ >> + pr_notice("Allocating IMA MOK and blacklist keyrings.\n"); >> + >> + ima_mok_keyring = keyring_alloc(".ima_mok", >> + KUIDT_INIT(0), KGIDT_INIT(0), current_cred(), >> + (KEY_POS_ALL & ~KEY_POS_SETATTR) | >> + KEY_USR_VIEW | KEY_USR_READ | >> + KEY_USR_WRITE | KEY_USR_SEARCH, >> + KEY_ALLOC_NOT_IN_QUOTA, NULL); >> + >> + ima_blacklist_keyring = keyring_alloc(".ima_blacklist", >> + KUIDT_INIT(0), KGIDT_INIT(0), current_cred(), >> + (KEY_POS_ALL & ~KEY_POS_SETATTR) | >> + KEY_USR_VIEW | KEY_USR_READ | >> + KEY_USR_WRITE | KEY_USR_SEARCH, >> + KEY_ALLOC_NOT_IN_QUOTA, NULL); >> + >> + if (IS_ERR(ima_mok_keyring) || IS_ERR(ima_blacklist_keyring)) >> + panic("Can't allocate IMA MOK or blacklist keyrings."); >> + set_bit(KEY_FLAG_TRUSTED_ONLY, &ima_mok_keyring->flags); >> + set_bit(KEY_FLAG_TRUSTED_ONLY, &ima_blacklist_keyring->flags); >> + return 0; >> +} >> + >> +module_init(ima_mok_init); > > -- Thanks, Dmitry -- To unsubscribe from this list: send the line "unsubscribe linux-security-module" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html