348 lines
12 KiB
Diff
348 lines
12 KiB
Diff
|
|
From aa072b84261eec2f4c1faaf1f8ba177313fa0e37 Mon Sep 17 00:00:00 2001
|
|||
|
|
From: jinlun <jinlun@huawei.com>
|
|||
|
|
Date: Thu, 28 Nov 2024 14:05:53 +0800
|
|||
|
|
Subject: fix some bugs
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
secconf/check/check_dim | 8 +++-
|
|||
|
|
secconf/check/check_secure_boot | 36 ++++++++++++--
|
|||
|
|
secconf/dim.go | 6 +--
|
|||
|
|
secconf/gen/gen_dim | 19 ++++----
|
|||
|
|
secconf/gen/gen_ima | 4 +-
|
|||
|
|
secconf/gen/gen_secure_boot | 10 ++--
|
|||
|
|
secconf/gen_comm.sh | 85 +++++++++++++++++++--------------
|
|||
|
|
7 files changed, 107 insertions(+), 61 deletions(-)
|
|||
|
|
|
|||
|
|
diff --git a/secconf/check/check_dim b/secconf/check/check_dim
|
|||
|
|
index 3c392fa..bfad32d 100644
|
|||
|
|
--- a/secconf/check/check_dim
|
|||
|
|
+++ b/secconf/check/check_dim
|
|||
|
|
@@ -23,6 +23,10 @@ dim_comm()
|
|||
|
|
return 1
|
|||
|
|
fi
|
|||
|
|
elif [ "{{.}}" == "kernel" ]; then
|
|||
|
|
+ if [ ! -f /etc/dim/digest_list/kernel.hash ]; then
|
|||
|
|
+ echo "Error! The policy file doesn't match the configuration file!"
|
|||
|
|
+ return 1
|
|||
|
|
+ fi
|
|||
|
|
grep "measure obj=KERNEL_TEXT" /etc/dim/policy &> /dev/null
|
|||
|
|
if [ $? -ne 0 ]; then
|
|||
|
|
echo "Error! The policy file doesn't match the configuration file!"
|
|||
|
|
@@ -55,9 +59,9 @@ dim_comm()
|
|||
|
|
echo "Environment doesn't support tpm, measure_pcr configuration is invalid!"
|
|||
|
|
fi
|
|||
|
|
{{end}}{{ if .Signature }}
|
|||
|
|
- get_usr_input "openssl is about to installed?【Y/N】"
|
|||
|
|
+ check_rpm_package openssl
|
|||
|
|
if [ $? -eq 1 ]; then
|
|||
|
|
- yum install -y openssl || exit 1
|
|||
|
|
+ return 1
|
|||
|
|
fi
|
|||
|
|
echo "Checking whether the certificate is configured..."
|
|||
|
|
if [ -f /etc/keys/x509_dim.der ]; then
|
|||
|
|
diff --git a/secconf/check/check_secure_boot b/secconf/check/check_secure_boot
|
|||
|
|
index 905c2e0..22d5590 100644
|
|||
|
|
--- a/secconf/check/check_secure_boot
|
|||
|
|
+++ b/secconf/check/check_secure_boot
|
|||
|
|
@@ -5,15 +5,15 @@ secure_boot_comm()
|
|||
|
|
get_usr_input "The current system doesn't support secure boot!"
|
|||
|
|
return 1
|
|||
|
|
fi
|
|||
|
|
- get_usr_input "Pesign is about to be installed?【Y/N】"
|
|||
|
|
+ check_rpm_package pesign
|
|||
|
|
if [ $? -eq 1 ]; then
|
|||
|
|
- yum install -y pesign || exit 1
|
|||
|
|
+ return 1
|
|||
|
|
fi
|
|||
|
|
- get_usr_input "Mokutil is about to be installed?【Y/N】"
|
|||
|
|
+ check_rpm_package mokutil
|
|||
|
|
if [ $? -eq 1 ]; then
|
|||
|
|
- yum install -y mokutil || exit 1
|
|||
|
|
+ return 1
|
|||
|
|
fi
|
|||
|
|
- if [ ! -f /boot/efi/EFI/secure_boot.der ]; then
|
|||
|
|
+ if [ ! -s /boot/efi/EFI/secure_boot.der ]; then
|
|||
|
|
get_usr_input "Secure Boot certificate of openeuler is about to be downloaded?【Y/N】"
|
|||
|
|
if [ $? -eq 1 ]; then
|
|||
|
|
wget -O /boot/efi/EFI/secure_boot.der https://www.openeuler.org/certificates/openEuler-x509ca.cer.der --no-check-certificate &> /dev/null
|
|||
|
|
@@ -34,6 +34,32 @@ secure_boot_comm()
|
|||
|
|
return 1
|
|||
|
|
fi
|
|||
|
|
done
|
|||
|
|
+ if [ -s /boot/vmlinuz-"$(uname -r)" ]; then
|
|||
|
|
+ check_rpm_package gzip
|
|||
|
|
+ if [ $? -eq 1 ]; then
|
|||
|
|
+ return 1
|
|||
|
|
+ fi
|
|||
|
|
+ if [ $(arch) == "aarch64" ]; then
|
|||
|
|
+ cp -ar /boot/vmlinuz-"$(uname -r)" ./vmlinuz-"$(uname -r)".gz
|
|||
|
|
+ gzip -df vmlinuz-"$(uname -r)".gz
|
|||
|
|
+ if [ $? -ne 0 ]; then
|
|||
|
|
+ echo "failed to gzip vmlinuz, stop check"
|
|||
|
|
+ rm -f vmlinuz-"$(uname -r)".gz
|
|||
|
|
+ return 1
|
|||
|
|
+ fi
|
|||
|
|
+ else
|
|||
|
|
+ cp -ar /boot/vmlinuz-"$(uname -r)" ./vmlinuz-"$(uname -r)"
|
|||
|
|
+ fi
|
|||
|
|
+ pesigcheck -i vmlinuz-"$(uname -r)" -n 0 -c /boot/efi/EFI/secure_boot.der
|
|||
|
|
+ if [ $? -ne 0 ]; then
|
|||
|
|
+ echo "$vmlinuz-"$(uname -r)" signature verification failed!"
|
|||
|
|
+ else
|
|||
|
|
+ echo "The kernel of the current version has been verified"
|
|||
|
|
+ fi
|
|||
|
|
+ rm -f vmlinuz-"$(uname -r)"
|
|||
|
|
+ else
|
|||
|
|
+ echo "The vmlinuz was not found, please check the signature manually"
|
|||
|
|
+ fi
|
|||
|
|
|
|||
|
|
mokutil --db | grep "Issuer: CN=CA, OU=Infra, O=openEuler, L=ShenZhen, ST=GuangDong, C=CN"
|
|||
|
|
if [ $? -ne 0 ]; then
|
|||
|
|
diff --git a/secconf/dim.go b/secconf/dim.go
|
|||
|
|
index 220abde..a37915b 100644
|
|||
|
|
--- a/secconf/dim.go
|
|||
|
|
+++ b/secconf/dim.go
|
|||
|
|
@@ -15,12 +15,12 @@ type Dim struct {
|
|||
|
|
DimIsEnable bool `default:"false" yaml:"enable"`
|
|||
|
|
MeasureList []string `yaml:"measure_list"`
|
|||
|
|
BaselineIsEnable bool `default:"false" yaml:"auto_baseline"`
|
|||
|
|
- MeasureLogCapacity uint64 `default:"100000" yaml:"log_cap"`
|
|||
|
|
+ MeasureLogCapacity uint32 `default:"100000" yaml:"log_cap"`
|
|||
|
|
MeasureHash string `default:"sha256" yaml:"hash"`
|
|||
|
|
CorePcr uint16 `default:"0" yaml:"core_pcr"`
|
|||
|
|
MonitorPcr uint16 `default:"0" yaml:"monitor_pcr"`
|
|||
|
|
- MeasureSchedule uint64 `default:"0" yaml:"schedule"`
|
|||
|
|
- MeasureInterval uint64 `default:"0" yaml:"interval"`
|
|||
|
|
+ MeasureSchedule uint32 `default:"0" yaml:"schedule"`
|
|||
|
|
+ MeasureInterval uint32 `default:"0" yaml:"interval"`
|
|||
|
|
Signature bool `default:"false" yaml:"signature"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
diff --git a/secconf/gen/gen_dim b/secconf/gen/gen_dim
|
|||
|
|
index b310eaf..9174a92 100644
|
|||
|
|
--- a/secconf/gen/gen_dim
|
|||
|
|
+++ b/secconf/gen/gen_dim
|
|||
|
|
@@ -1,9 +1,9 @@
|
|||
|
|
dim_comm()
|
|||
|
|
{
|
|||
|
|
{{ with .Dim }}{{if .DimIsEnable}}
|
|||
|
|
- get_usr_input "dim is about to install?【Y/N】"
|
|||
|
|
+ check_rpm_package dim
|
|||
|
|
if [ $? -eq 1 ]; then
|
|||
|
|
- yum install -y dim || exit 1
|
|||
|
|
+ return 1
|
|||
|
|
fi
|
|||
|
|
get_usr_input "New static baseline file and policy will be created at /etc/dim?【Y/N】"
|
|||
|
|
if [ $? -eq 1 ]; then
|
|||
|
|
@@ -19,14 +19,15 @@ dim_comm()
|
|||
|
|
return 1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
- get_usr_input "dim_tools is about to install?【Y/N】"
|
|||
|
|
+ check_rpm_package dim_tools
|
|||
|
|
if [ $? -eq 1 ]; then
|
|||
|
|
- yum install -y dim_tools || exit 1
|
|||
|
|
+ return 1
|
|||
|
|
fi
|
|||
|
|
+ dimHash={{.MeasureHash}}
|
|||
|
|
{{range .MeasureList}}
|
|||
|
|
if [ -f "{{.}}" ] ; then
|
|||
|
|
echo "Establishing static baseline:" {{.}}
|
|||
|
|
- dim_gen_baseline {{.}} -o /etc/dim/digest_list/$(basename {{.}}).hash
|
|||
|
|
+ dim_gen_baseline {{.}} -o /etc/dim/digest_list/$(basename {{.}}).hash -a $dimHash
|
|||
|
|
if [ $? -ne 0 ]; then
|
|||
|
|
echo "Error! Static baseline establishment failed" {{.}}
|
|||
|
|
return 1
|
|||
|
|
@@ -34,7 +35,7 @@ dim_comm()
|
|||
|
|
echo "measure obj=BPRM_TEXT path={{.}}" >> /etc/dim/policy
|
|||
|
|
elif [ "{{.}}" == "kernel" ]; then
|
|||
|
|
echo "measure obj=KERNEL_TEXT" >> /etc/dim/policy
|
|||
|
|
- dim_gen_baseline -k "$(uname -r)" -o /etc/dim/digest_list/test.hash /boot/vmlinuz-6*
|
|||
|
|
+ dim_gen_baseline -k "$(uname -r)" -o /etc/dim/digest_list/kernel.hash /boot/vmlinuz-6* -a $dimHash
|
|||
|
|
if [ $? -ne 0 ]; then
|
|||
|
|
echo "Kernel static baseline establishment failed"
|
|||
|
|
return 1
|
|||
|
|
@@ -48,7 +49,7 @@ dim_comm()
|
|||
|
|
xz -d -k $moduleFilePath
|
|||
|
|
moduleFilePath=${moduleFilePath%.*}
|
|||
|
|
fi
|
|||
|
|
- dim_gen_baseline $moduleFilePath -o /etc/dim/digest_list/$module.hash
|
|||
|
|
+ dim_gen_baseline $moduleFilePath -o /etc/dim/digest_list/$module.hash -a $dimHash
|
|||
|
|
if [ $? -ne 0 ]; then
|
|||
|
|
echo "Static baseline establishment failed" {{.}}
|
|||
|
|
return 1
|
|||
|
|
@@ -73,9 +74,9 @@ dim_comm()
|
|||
|
|
return 1
|
|||
|
|
fi
|
|||
|
|
{{if .Signature}}
|
|||
|
|
- get_usr_input "openssl is about to install?【Y/N】"
|
|||
|
|
+ check_rpm_package openssl
|
|||
|
|
if [ $? -eq 1 ]; then
|
|||
|
|
- yum install -y openssl || exit 1
|
|||
|
|
+ return 1
|
|||
|
|
fi
|
|||
|
|
get_usr_input "Generate keys and certificates automatically?【Y/N】"
|
|||
|
|
if [ $? -eq 1 ]; then
|
|||
|
|
diff --git a/secconf/gen/gen_ima b/secconf/gen/gen_ima
|
|||
|
|
index 0657cdf..84d1b4b 100644
|
|||
|
|
--- a/secconf/gen/gen_ima
|
|||
|
|
+++ b/secconf/gen/gen_ima
|
|||
|
|
@@ -16,9 +16,9 @@ measure_list+=({{.}})
|
|||
|
|
needReboot=false
|
|||
|
|
packages=("ima-evm-utils" "digest-list-tools")
|
|||
|
|
for pkg in "${packages[@]}"; do
|
|||
|
|
- get_usr_input "${pkg} is about to installed?【Y/N】"
|
|||
|
|
+ check_rpm_package ${pkg}
|
|||
|
|
if [ $? -eq 1 ]; then
|
|||
|
|
- yum install -y ${pkg} || exit 1
|
|||
|
|
+ return 1
|
|||
|
|
fi
|
|||
|
|
done
|
|||
|
|
|
|||
|
|
diff --git a/secconf/gen/gen_secure_boot b/secconf/gen/gen_secure_boot
|
|||
|
|
index 4decd48..a1e0d36 100644
|
|||
|
|
--- a/secconf/gen/gen_secure_boot
|
|||
|
|
+++ b/secconf/gen/gen_secure_boot
|
|||
|
|
@@ -3,26 +3,26 @@ secure_boot_comm()
|
|||
|
|
{{ with .SecureBoot }}
|
|||
|
|
{{if .SecureBootIsEnable}}
|
|||
|
|
if [ ! -d /sys/firmware/efi ]; then
|
|||
|
|
- get_usr_input "Error! The current environment does not support secure boot."
|
|||
|
|
+ get_usr_input "The current environment does not support secure boot."
|
|||
|
|
return 1
|
|||
|
|
fi
|
|||
|
|
- get_usr_input "mokutil is about to install?【Y/N】"
|
|||
|
|
+ check_rpm_package mokutil
|
|||
|
|
if [ $? -eq 1 ]; then
|
|||
|
|
- yum install -y mokutil || exit 1
|
|||
|
|
+ return 1
|
|||
|
|
fi
|
|||
|
|
mokutil --sb | grep enabled
|
|||
|
|
if [ $? -ne 0 ]; then
|
|||
|
|
mokutil --db | grep "Issuer: CN=CA, OU=Infra, O=openEuler, L=ShenZhen, ST=GuangDong, C=CN"
|
|||
|
|
if [ $? -ne 0 ]; then
|
|||
|
|
echo "Secure boot certificate is not saved in DB!"
|
|||
|
|
- if [ -f /boot/efi/EFI/secure_boot.der ]; then
|
|||
|
|
+ if [ -s /boot/efi/EFI/secure_boot.der ]; then
|
|||
|
|
echo "The file already exists. Please restart and import the file to the BIOS."
|
|||
|
|
else
|
|||
|
|
get_usr_input "Download the openeuler secure boot certificate right now?【Y/N】"
|
|||
|
|
if [ $? -eq 1 ]; then
|
|||
|
|
wget -O /boot/efi/EFI/secure_boot.der https://www.openeuler.org/certificates/openEuler-x509ca.cer.der --no-check-certificate
|
|||
|
|
if [ $? -ne 0 ]; then
|
|||
|
|
- echo "Error! Certificate downloaded failed. Please obtain the certificate manually!"
|
|||
|
|
+ echo "Certificate downloaded failed. Please obtain the certificate manually!"
|
|||
|
|
return 1
|
|||
|
|
fi
|
|||
|
|
echo "The certificate download is successful. Please restart later and enter the bios, then import the certificate into the DB!"
|
|||
|
|
diff --git a/secconf/gen_comm.sh b/secconf/gen_comm.sh
|
|||
|
|
index f28dba7..ec19cf5 100644
|
|||
|
|
--- a/secconf/gen_comm.sh
|
|||
|
|
+++ b/secconf/gen_comm.sh
|
|||
|
|
@@ -1,52 +1,67 @@
|
|||
|
|
set_skip_usr_input=0
|
|||
|
|
set_reboot=0
|
|||
|
|
|
|||
|
|
+check_rpm_package()
|
|||
|
|
+{
|
|||
|
|
+ rpm -q $1 &> /dev/null
|
|||
|
|
+ if [ $? -ne 0 ]; then
|
|||
|
|
+ get_usr_input "$1 is about to install?【Y/N】"
|
|||
|
|
+ if [ $? -eq 1 ]; then
|
|||
|
|
+ yum install -y $1 || exit 1
|
|||
|
|
+ else
|
|||
|
|
+ echo "The $1 does not exit, skip."
|
|||
|
|
+ return 1
|
|||
|
|
+ fi
|
|||
|
|
+ fi
|
|||
|
|
+ return 0
|
|||
|
|
+}
|
|||
|
|
+
|
|||
|
|
get_usr_input()
|
|||
|
|
{
|
|||
|
|
- echo $1
|
|||
|
|
- if [ $set_skip_usr_input -eq 0 ]; then
|
|||
|
|
- read -r userInput
|
|||
|
|
- else
|
|||
|
|
- userInput=Y
|
|||
|
|
- fi
|
|||
|
|
+ echo $1
|
|||
|
|
+ if [ $set_skip_usr_input -eq 0 ]; then
|
|||
|
|
+ read -r userInput
|
|||
|
|
+ else
|
|||
|
|
+ userInput=Y
|
|||
|
|
+ fi
|
|||
|
|
|
|||
|
|
- if [ "$userInput" != 'Y' ] && [ "$userInput" != 'y' ]; then
|
|||
|
|
- return 0
|
|||
|
|
- else
|
|||
|
|
- return 1
|
|||
|
|
- fi
|
|||
|
|
+ if [ "$userInput" != 'Y' ] && [ "$userInput" != 'y' ]; then
|
|||
|
|
+ return 0
|
|||
|
|
+ else
|
|||
|
|
+ return 1
|
|||
|
|
+ fi
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
usage()
|
|||
|
|
{
|
|||
|
|
- echo "Usage: $(basename $0) [OPTION]"
|
|||
|
|
- echo " -s, --skip 设置跳过询问"
|
|||
|
|
- echo " -r, --run 正常执行"
|
|||
|
|
- echo " -h, --help 显示帮助信息"
|
|||
|
|
+ echo "Usage: $(basename $0) [OPTION]"
|
|||
|
|
+ echo " -s, --skip 设置跳过询问"
|
|||
|
|
+ echo " -r, --run 正常执行"
|
|||
|
|
+ echo " -h, --help 显示帮助信息"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
while true
|
|||
|
|
do
|
|||
|
|
- case "$1" in
|
|||
|
|
- -s|--skip)
|
|||
|
|
- set_skip_usr_input=1
|
|||
|
|
-{{range .ShellFuns}} {{.}}
|
|||
|
|
+ case "$1" in
|
|||
|
|
+ -s|--skip)
|
|||
|
|
+ set_skip_usr_input=1
|
|||
|
|
+{{range .ShellFuns}} {{.}}
|
|||
|
|
{{ end }}
|
|||
|
|
- exit 0
|
|||
|
|
- ;;
|
|||
|
|
- -r|--run)
|
|||
|
|
-{{range .ShellFuns}} {{.}}
|
|||
|
|
+ exit 0
|
|||
|
|
+ ;;
|
|||
|
|
+ -r|--run)
|
|||
|
|
+{{range .ShellFuns}} {{.}}
|
|||
|
|
{{ end }}
|
|||
|
|
- exit 0
|
|||
|
|
- ;;
|
|||
|
|
- -h|--help)
|
|||
|
|
- usage
|
|||
|
|
- exit $?
|
|||
|
|
- ;;
|
|||
|
|
- *)
|
|||
|
|
- echo -e "Need Correct Arguments!\n"
|
|||
|
|
- usage
|
|||
|
|
- exit $LA_ERR
|
|||
|
|
- ;;
|
|||
|
|
- esac
|
|||
|
|
+ exit 0
|
|||
|
|
+ ;;
|
|||
|
|
+ -h|--help)
|
|||
|
|
+ usage
|
|||
|
|
+ exit $?
|
|||
|
|
+ ;;
|
|||
|
|
+ *)
|
|||
|
|
+ echo -e "Need Correct Arguments!\n"
|
|||
|
|
+ usage
|
|||
|
|
+ exit $LA_ERR
|
|||
|
|
+ ;;
|
|||
|
|
+ esac
|
|||
|
|
done
|
|||
|
|
--
|
|||
|
|
2.33.0
|
|||
|
|
|