Tất cả những gì bạn cần được mô tả ở đây
KUEL MODULE ĐĂNG KÝ CƠ SỞ
NỘI DUNG
- Tổng quat.
- Cấu hình ký mô-đun.
- Tạo khóa ký.
- Khóa công khai trong kernel.
- Ký các mô-đun thủ công.
- Các mô-đun đã ký và tước.
- Đang tải các mô-đun đã ký.
- Chữ ký không hợp lệ và các mô-đun không dấu.
- Quản trị / bảo vệ khóa riêng.
TỔNG QUAT
Cơ sở ký kết mô-đun hạt nhân ký mã hóa các mô-đun trong khi cài đặt và sau đó kiểm tra chữ ký khi tải mô-đun. Điều này cho phép tăng cường bảo mật hạt nhân bằng cách không cho phép tải các mô-đun không dấu hoặc mô-đun được ký với khóa không hợp lệ. Việc ký mô-đun tăng tính bảo mật bằng cách làm cho việc tải mô-đun độc hại vào kernel khó hơn. Việc kiểm tra chữ ký mô-đun được thực hiện bởi kernel để không cần thiết phải có các bit không gian người dùng đáng tin cậy.
Cơ sở này sử dụng chứng chỉ tiêu chuẩn X.509 ITU-T để mã hóa các khóa công khai có liên quan. Các chữ ký không được mã hóa trong bất kỳ loại tiêu chuẩn công nghiệp. Cơ sở hiện chỉ hỗ trợ tiêu chuẩn mã hóa khóa công khai RSA (mặc dù nó có thể cắm được và cho phép người khác sử dụng). Các thuật toán băm có thể có thể được sử dụng là SHA-1, SHA-224, SHA-256, SHA-384 và SHA-512 (thuật toán được chọn bởi dữ liệu trong chữ ký).
XÁC NHẬN MODULE MODULE
Tiện ích ký mô-đun được bật bằng cách đi tới phần "Bật hỗ trợ mô-đun có thể tải" của cấu hình kernel và bật
CONFIG_MODULE_SIG "Module signature verification"
Điều này có một số tùy chọn có sẵn:
"Yêu cầu các mô-đun được ký hợp lệ" (CONFIG_MODULE_SIG_FORCE)
Điều này xác định cách kernel sẽ xử lý một mô-đun có chữ ký mà khóa không được biết hoặc mô-đun không được ký.
Nếu điều này bị tắt (nghĩa là "cho phép"), thì các mô-đun không có khóa và các mô-đun không được phép được cho phép, nhưng hạt nhân sẽ được đánh dấu là bị ô nhiễm và các mô-đun liên quan sẽ được đánh dấu là bị nhòe, được hiển thị với ký tự 'E'.
Nếu điều này được bật (tức là "hạn chế"), chỉ các mô-đun có chữ ký hợp lệ có thể được xác minh bằng khóa chung trong quyền sở hữu của hạt nhân mới được tải. Tất cả các mô-đun khác sẽ tạo ra một lỗi.
Bất kể cài đặt ở đây, nếu mô-đun có khối chữ ký không thể phân tích cú pháp, nó sẽ bị loại khỏi tầm tay.
"Tự động ký tất cả các mô-đun" (CONFIG_MODULE_SIG_ALL)
Nếu điều này được bật thì các mô-đun sẽ được tự động ký trong giai đoạn mô-đun cài đặt. Nếu điều này bị tắt, thì các mô-đun phải được ký thủ công bằng cách sử dụng:
scripts/sign-file
"Những thuật toán băm nào nên được ký kết với?"
Điều này trình bày một lựa chọn trong đó thuật toán băm mà giai đoạn cài đặt sẽ ký các mô-đun với:
CONFIG_MODULE_SIG_SHA1 "Sign modules with SHA-1"
CONFIG_MODULE_SIG_SHA224 "Sign modules with SHA-224"
CONFIG_MODULE_SIG_SHA256 "Sign modules with SHA-256"
CONFIG_MODULE_SIG_SHA384 "Sign modules with SHA-384"
CONFIG_MODULE_SIG_SHA512 "Sign modules with SHA-512"
Thuật toán được chọn ở đây cũng sẽ được tích hợp vào kernel (chứ không phải là một mô-đun) để các mô-đun được ký với thuật toán đó có thể được kiểm tra chữ ký của chúng mà không gây ra vòng lặp phụ thuộc.
"Tên tệp hoặc PKCS # 11 URI của khóa ký mô-đun" (CONFIG_MODULE_SIG_KEY)
Đặt tùy chọn này thành một cái gì đó không phải là "certs / sign_key.pem" mặc định của nó sẽ vô hiệu hóa việc tự động tạo các khóa ký và cho phép các mô-đun hạt nhân được ký bằng một khóa bạn chọn. Chuỗi được cung cấp phải xác định một tệp chứa cả khóa riêng và chứng chỉ X.509 tương ứng của nó ở dạng PEM hoặc - trên các hệ thống có OpenSSL Engine_pkcs11 hoạt động - URI PKCS # 11 như được xác định bởi RFC7512. Trong trường hợp sau, URI PKCS # 11 phải tham chiếu cả chứng chỉ và khóa riêng.
Nếu tệp PEM chứa khóa riêng được mã hóa hoặc nếu mã thông báo PKCS # 11 yêu cầu mã PIN, thì mã này có thể được cung cấp tại thời điểm xây dựng bằng biến KBUILD_SIGN_PIN.
"Các khóa X.509 bổ sung cho khóa hệ thống mặc định" (CONFIG_SYIUS_TRUSTED_KEYS)
Tùy chọn này có thể được đặt thành tên tệp của tệp được mã hóa PEM có chứa các chứng chỉ bổ sung sẽ được bao gồm trong khóa hệ thống theo mặc định.
Lưu ý rằng việc cho phép ký mô-đun thêm một phụ thuộc vào các gói phát triển OpenSSL vào các quy trình xây dựng hạt nhân cho công cụ thực hiện việc ký.
TẠO KHÓA ĐĂNG KÝ
Cần có khóa mã hóa để tạo và kiểm tra chữ ký. Khóa riêng được sử dụng để tạo chữ ký và khóa chung tương ứng được sử dụng để kiểm tra. Khóa riêng chỉ cần trong quá trình xây dựng, sau đó có thể xóa hoặc lưu trữ an toàn. Khóa công khai được tích hợp vào kernel để có thể sử dụng nó để kiểm tra chữ ký khi các mô-đun được tải.
Trong điều kiện bình thường, khi CONFIG_MODULE_SIG_KEY không thay đổi so với mặc định của nó, việc xây dựng kernel sẽ tự động tạo ra một cặp khóa mới bằng cách sử dụng openssl nếu không tồn tại trong tệp:
certs/signing_key.pem
trong quá trình xây dựng vmlinux (phần công khai của khóa cần được xây dựng thành vmlinux) bằng cách sử dụng các tham số trong:
certs/x509.genkey
tập tin (cũng được tạo ra nếu nó chưa tồn tại).
Chúng tôi khuyên bạn nên cung cấp tệp x509.genkey của riêng bạn.
Đáng chú ý nhất, trong tệp x509.genkey, phần req_distinguished_name nên được thay đổi từ mặc định:
[ req_distinguished_name ]
#O = Unspecified company
CN = Build time autogenerated kernel key
#emailAddress = unspecified.user@unspecified.company
Kích thước khóa RSA được tạo cũng có thể được đặt bằng:
[ req ]
default_bits = 4096
Cũng có thể tự tạo các tệp riêng tư / công khai bằng cách sử dụng tệp cấu hình tạo khóa x509.genkey trong nút gốc của cây nguồn Linux và lệnh openssl. Sau đây là một ví dụ để tạo các tệp khóa công khai / riêng tư:
openssl req -new -nodes -utf8 -sha256 -days 36500 -batch -x509 \
-config x509.genkey -outform PEM -out kernel_key.pem \
-keyout kernel_key.pem
Tên đường dẫn đầy đủ cho tệp kernel_key.pem kết quả sau đó có thể được chỉ định trong tùy chọn CONFIG_MODULE_SIG_KEY, và chứng chỉ và khóa trong đó sẽ được sử dụng thay cho khóa ghép tự động.
KHÓA CÔNG CỘNG TẠI KernEL
Nhân chứa một vòng các khóa công khai có thể được xem bằng root. Họ đang ở trong một khóa gọi là ".system_keyring" có thể được nhìn thấy bởi:
[root@deneb ~]# cat /proc/keys
...
223c7853 I------ 1 perm 1f030000 0 0 keyring .system_keyring: 1
302d2d52 I------ 1 perm 1f010000 0 0 asymmetri Fedora kernel signing key: d69a84e6bce3d216b979e9505b3e3ef9a7118079: X509.RSA a7118079 []
...
Ngoài khóa công khai được tạo riêng cho việc ký mô-đun, các chứng chỉ tin cậy bổ sung có thể được cung cấp trong tệp được mã hóa PEM được tham chiếu bởi tùy chọn cấu hình CONFIG_SYIUS_TRUSTED_KEYS.
Hơn nữa, mã kiến trúc có thể lấy các khóa công khai từ một cửa hàng phần cứng và thêm chúng vào (ví dụ từ cơ sở dữ liệu khóa UEFI).
Cuối cùng, có thể thêm các khóa công khai bổ sung bằng cách thực hiện:
keyctl padd asymmetric "" [.system_keyring-ID] <[key-file]
ví dụ:
keyctl padd asymmetric "" 0x223c7853 <my_public_key.x509
Tuy nhiên, lưu ý rằng hạt nhân sẽ chỉ cho phép các khóa được thêm vào .system_keyring nếu trình bao bọc X.509 của khóa mới được ký hợp lệ bởi một khóa đã tồn tại trong .system_keyring tại thời điểm khóa được thêm vào.
MÔ HÌNH ĐĂNG KÝ MANUALLY
Để ký một mô-đun theo cách thủ công, hãy sử dụng công cụ tập lệnh / tập tin đăng nhập có sẵn trong cây nguồn Linux. Kịch bản yêu cầu 4 đối số:
1. The hash algorithm (e.g., sha256)
2. The private key filename or PKCS#11 URI
3. The public key filename
4. The kernel module to be signed
Sau đây là một ví dụ để ký một mô-đun hạt nhân:
scripts/sign-file sha512 kernel-signkey.priv \
kernel-signkey.x509 module.ko
Thuật toán băm được sử dụng không phải phù hợp với thuật toán được cấu hình, nhưng nếu không, bạn nên đảm bảo rằng thuật toán băm được tích hợp vào kernel hoặc có thể được tải mà không cần chính nó.
Nếu khóa riêng yêu cầu mật khẩu hoặc mã PIN, nó có thể được cung cấp trong biến môi trường $ KBUILD_SIGN_PIN.
CÁC MÔ HÌNH VÀ DẤU HIỆU
Một mô-đun đã ký có chữ ký số được thêm vào cuối. Chuỗi "~ Chữ ký mô-đun được nối thêm ~." ở cuối tập tin của mô-đun xác nhận rằng có chữ ký nhưng nó không xác nhận rằng chữ ký đó là hợp lệ!
Các mô-đun đã ký là BRITTLE vì chữ ký nằm ngoài vùng chứa ELF đã xác định. Do đó, chúng KHÔNG THỂ bị tước bỏ khi chữ ký được tính và đính kèm. Lưu ý toàn bộ mô-đun là tải trọng đã ký, bao gồm bất kỳ và tất cả thông tin gỡ lỗi có tại thời điểm ký.
LOADING MODULES ĐĂNG KÝ
Các mô-đun được tải với insmod, modprobe, init_module () hoặc finit_module (), chính xác như đối với các mô-đun không dấu vì không xử lý được thực hiện trong không gian người dùng. Việc kiểm tra chữ ký là tất cả được thực hiện trong kernel.
CÁC KÝ HIỆU KHÔNG CÓ GIÁ TRỊ VÀ CÁC PHƯƠNG THỨC KHÔNG ĐƯỢC KÝ
Nếu CONFIG_MODULE_SIG_FORCE được bật hoặc execcemodulesig = 1 được cung cấp trên dòng lệnh kernel, kernel sẽ chỉ tải các mô-đun được ký hợp lệ mà nó có khóa chung. Nếu không, nó cũng sẽ tải các mô-đun không dấu. Bất kỳ mô-đun nào mà kernel có khóa, nhưng chứng tỏ có sự không phù hợp chữ ký sẽ không được phép tải.
Bất kỳ mô-đun nào có chữ ký không thể nhìn thấy sẽ bị từ chối.
QUẢN TRỊ / BẢO VỆ KHÓA RIÊNG TƯ
Vì khóa riêng được sử dụng để ký các mô-đun, vi-rút và phần mềm độc hại có thể sử dụng khóa riêng để ký các mô-đun và thỏa hiệp hệ điều hành. Khóa riêng phải được hủy hoặc di chuyển đến một vị trí an toàn và không được giữ trong nút gốc của cây nguồn kernel.