Continuación del artículo anterior: Análisis de scripts y servicios relacionados con AppArmor (1)
El artículo anterior habló sobre la función __apparmor_restart en el proceso de recarga en /lib/apparmor/apparmor.systemd. Este artículo continúa analizando.
El núcleo de la función __apparmor_restart es la siguiente declaración:
parse_profiles reload
La función parse_profiles está en /lib/apparmor/rc.apparmor.functions, el código es el siguiente:
parse_profiles() {
# get parser arg
case "$1" in
load)
PARSER_CMD="--add"
PARSER_MSG="Loading AppArmor profiles "
;;
reload)
PARSER_CMD="--replace"
PARSER_MSG="Reloading AppArmor profiles "
;;
*)
aa_log_failure_msg "required 'load' or 'reload'"
exit 1
;;
esac
aa_log_action_start "$PARSER_MSG"
# run the parser on all of the apparmor profiles
if [ ! -f "$PARSER" ]; then
aa_log_failure_msg "AppArmor parser not found"
exit 1
fi
for profile_dir in $PROFILE_DIRS; do
__parse_profiles_dir "$PARSER_CMD" "$profile_dir" || STATUS=$?
done
aa_log_action_end "$STATUS"
return "$STATUS"
}
PARSER está en el mismo archivo (/lib/apparmor/rc.apparmor.functions), de la siguiente manera:
PARSER=/sbin/apparmor_parser
Apparmor_parser existe en el sistema del autor, como se muestra a continuación:
$ ls /sbin/apparmor_parser
/sbin/apparmor_parser
PROFILES_DIRS también está en el mismo archivo (/lib/apparmor/rc.apparmor.functions), de la siguiente manera:
if [ -d /etc/apparmor.d ] ; then
PROFILE_DIRS=/etc/apparmor.d
else
aa_log_warning_msg "Unable to find profiles directory, installation problem?"
fi
/etc/apparmor.d existe en el sistema del autor, de la siguiente manera:
$ ls -d /etc/apparmor.d
/etc/apparmor.d
A continuación, ejecute el siguiente fragmento de código:
for profile_dir in $PROFILE_DIRS; do
__parse_profiles_dir "$PARSER_CMD" "$profile_dir" || STATUS=$?
done
Este fragmento de código se expande de la siguiente manera:
for profile_dir in /etc/apparmor.d; do
__parse_profiles_dir --replace $profile_dir || STATUS=$?
done
El resultado de ejecución real del autor es (después de la impresión):
__parse_profiles_dir --replace /etc/apparmor.d
__parse_profiles_dir está en el mismo archivo (/lib/apparmor/rc.apparmor.functions), el código es el siguiente:
__parse_profiles_dir() {
local parser_cmd="$1"
local profile_dir="$2"
local status=0
if [ ! -d "$profile_dir" ]; then
aa_log_failure_msg "Profile directory not found: $profile_dir"
return 1
fi
if [ -z "$(ls "$profile_dir"/)" ]; then
aa_log_failure_msg "No profiles found in $profile_dir"
return 1
fi
# shellcheck disable=SC2086
if ! "$PARSER" $PARSER_OPTS "$parser_cmd" -- "$profile_dir"; then
status=1
aa_log_failure_msg "At least one profile failed to load"
fi
return "$status"
}
"$PARSER" $PARSER_OPTS "$parser_cmd" -- "$profile_dir" se expande a:
/sbin/apparmor_parser --replace -- /etc/apparmor.d
El resto se seguirá analizando en artículos posteriores.