Análisis de scripts y servicios relacionados con AppArmor (2)

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.

Supongo que te gusta

Origin blog.csdn.net/phmatthaus/article/details/130863424
Recomendado
Clasificación