8.2.34 | Linux | www-data (uid:33)
👁 View: apparmor_status
📁 /snap/core18/2999/usr/sbin/apparmor_status
#! /usr/bin/python3 # ------------------------------------------------------------------ # # Copyright (C) 2005-2006 Novell/SUSE # Copyright (C) 2011 Canonical Ltd. # # This program is free software; you can redistribute it and/or # modify it under the terms of version 2 of the GNU General Public # License published by the Free Software Foundation. # # ------------------------------------------------------------------ import re, os, sys, errno, json # PLEASE NOTE: we try to keep aa-status as minimal as possible, for # environments where installing all of the python utils and python # apparmor module may not make sense. Please think carefully before # importing anything from apparmor; see how the apparmor.fail import is # handled below. # setup exception handling try: from apparmor.fail import enable_aa_exception_handler enable_aa_exception_handler() except ImportError: # just let normal python exceptions happen (LP: #1480492) pass def cmd_enabled(): '''Returns error code if AppArmor is not enabled''' if get_profiles() == {}: sys.exit(2) def cmd_profiled(): '''Prints the number of loaded profiles''' profiles = get_profiles() sys.stdout.write("%d\n" % len(profiles)) if profiles == {}: sys.exit(2) def cmd_enforced(): '''Prints the number of loaded enforcing profiles''' profiles = get_profiles() sys.stdout.write("%d\n" % len(filter_profiles(profiles, 'enforce'))) if profiles == {}: sys.exit(2) def cmd_complaining(): '''Prints the number of loaded non-enforcing profiles''' profiles = get_profiles() sys.stdout.write("%d\n" % len(filter_profiles(profiles, 'complain'))) if profiles == {}: sys.exit(2) def cmd_verbose(): '''Displays multiple data points about loaded profile set''' global verbose verbose = True profiles = get_profiles() processes = get_processes(profiles) stdmsg("%d profiles are loaded." % len(profiles)) for status in ('enforce', 'complain'): filtered_profiles = filter_profiles(profiles, status) stdmsg("%d profiles are in %s mode." % (len(filtered_profiles), status)) for item in filtered_profiles: stdmsg(" %s" % item) stdmsg("%d processes have profiles defined." % len(processes)) for status in ('enforce', 'complain', 'unconfined'): filtered_processes = filter_processes(processes, status) if status == 'unconfined': stdmsg("%d processes are unconfined but have a profile defined." % len(filtered_processes)) else: stdmsg("%d processes are in %s mode." % (len(filtered_processes), status)) # Sort by name, and then by pid filtered_processes.sort(key=lambda x: int(x[0])) filtered_processes.sort(key=lambda x: x[1]) for (pid, process) in filtered_processes: stdmsg(" %s (%s) " % (process, pid)) if profiles == {}: sys.exit(2) def cmd_json(pretty_output=False): '''Outputs multiple data points about loaded profile set in a machine-readable JSON format''' global verbose profiles = get_profiles() processes = get_processes(profiles) i = { 'version': '1', 'profiles': {}, 'processes': {} } for status in ('enforce', 'complain'): filtered_profiles = filter_profiles(profiles, status) for item in filtered_profiles: i['profiles'][item] = status for status in ('enforce', 'complain', 'unconfined'): filtered_processes = filter_processes(processes, status) for (pid, process) in filtered_processes: if process not in i['processes']: i['processes'][process] = [] i['processes'][process].append({ 'pid': pid, 'status': status }) if pretty_output: sys.stdout.write(json.dumps(i, sort_keys=True, indent=4, separators=(',', ': '))) else: sys.stdout.write(json.dumps(i)) def cmd_pretty_json(): cmd_json(True) def get_profiles(): '''Fetch loaded profiles''' profiles = {} if os.path.exists("/sys/module/apparmor"): stdmsg("apparmor module is loaded.") else: errormsg("apparmor module is not loaded.") sys.exit(1) apparmorfs = find_apparmorfs() if not apparmorfs: errormsg("apparmor filesystem is not mounted.") sys.exit(3) apparmor_profiles = os.path.join(apparmorfs, "profiles") try: f = open(apparmor_profiles) except IOError as e: if e.errno == errno.EACCES: errormsg("You do not have enough privilege to read the profile set.") else: errormsg("Could not open %s: %s" % (apparmor_profiles, os.strerror(e.errno))) sys.exit(4) for p in f.readlines(): match = re.search("^([^\(]+)\s+\((\w+)\)$", p) profiles[match.group(1)] = match.group(2) f.close() return profiles def get_processes(profiles): '''Fetch process list''' processes = {} contents = os.listdir("/proc") for filename in contents: if filename.isdigit(): try: for p in open("/proc/%s/attr/current" % filename).readlines(): match = re.search("^([^\(]+)\s+\((\w+)\)$", p) if match: processes[filename] = { 'profile' : match.group(1), \ 'mode' : match.group(2) } elif os.path.realpath("/proc/%s/exe" % filename) in profiles: # keep only unconfined processes that have a profile defined processes[filename] = { 'profile' : os.path.realpath("/proc/%s/exe" % filename), \ 'mode' : 'unconfined' } except: pass return processes def filter_profiles(profiles, status): '''Return a list of profiles that have a particular status''' filtered = [] for key, value in list(profiles.items()): if value == status: filtered.append(key) filtered.sort() return filtered def filter_processes(processes, status): '''Return a list of processes that have a particular status''' filtered = [] for key, value in list(processes.items()): if value['mode'] == status: filtered.append([key, value['profile']]) return filtered def find_apparmorfs(): '''Finds AppArmor mount point''' for p in open("/proc/mounts","rb").readlines(): if p.split()[2].decode() == "securityfs" and \ os.path.exists(os.path.join(p.split()[1].decode(), "apparmor")): return os.path.join(p.split()[1].decode(), "apparmor") return False def errormsg(message): '''Prints to stderr if verbose mode is on''' global verbose if verbose: sys.stderr.write(message + "\n") def stdmsg(message): '''Prints to stdout if verbose mode is on''' global verbose if verbose: sys.stdout.write(message + "\n") def print_usage(): '''Print usage information''' sys.stdout.write('''Usage: %s [OPTIONS] Displays various information about the currently loaded AppArmor policy. OPTIONS (one only): --enabled returns error code if AppArmor not enabled --profiled prints the number of loaded policies --enforced prints the number of loaded enforcing policies --complaining prints the number of loaded non-enforcing policies --json displays multiple data points in machine-readable JSON format --pretty-json same data as --json, formatted for human consumption as well --verbose (default) displays multiple data points about loaded policy set --help this message ''' % sys.argv[0]) # Main global verbose verbose = False if len(sys.argv) > 2: sys.stderr.write("Error: Too many options.\n") print_usage() sys.exit(1) elif len(sys.argv) == 2: cmd = sys.argv.pop(1) else: cmd = '--verbose' # Command dispatch: commands = { '--enabled' : cmd_enabled, '--profiled' : cmd_profiled, '--enforced' : cmd_enforced, '--complaining' : cmd_complaining, '--json' : cmd_json, '--pretty-json' : cmd_pretty_json, '--verbose' : cmd_verbose, '-v' : cmd_verbose, '--help' : print_usage, '-h' : print_usage } if cmd in commands: commands[cmd]() sys.exit(0) else: sys.stderr.write("Error: Invalid command.\n") print_usage() sys.exit(1)
← Back
💻 Terminal
📤 Upload
📂
Click or Drag & Drop
📁 /snap/core18/2999/usr/sbin
NameSizePermModifiedActions
aa-remove-unknown2.9K07552023-06-13 14:19👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
aa-status8.4K07552023-06-13 14:19👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
add-shell860B07552017-12-30 18:15👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
addgroup36.4K07552017-12-05 16:57👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
adduser36.4K07552017-12-05 16:57👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
apparmor_status8.4K07552023-06-13 14:19👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
arpd54K07552021-01-26 13:33👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
chgpasswd57.8K07552024-02-06 12:31👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
chmem42.1K07552020-09-16 18:43👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
chpasswd53.9K07552024-02-06 12:31👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
chroot38.2K07552018-01-18 09:43👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
cpgr56K07552024-02-06 12:31👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
cppw56K07552024-02-06 12:31👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
delgroup16.1K07552017-12-05 16:57👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
deluser16.1K07552017-12-05 16:57👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
e2freefrag14.1K07552022-06-02 14:37👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
e4crypt22.1K07552022-06-02 14:37👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
e4defrag26K07552022-06-02 14:37👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
faillock14K07552024-03-19 15:24👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
fdformat30.1K07552020-09-16 18:43👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
filefrag14K07552022-06-02 14:37👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
genl58.1K07552021-01-26 13:33👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
groupadd61.9K07552024-02-06 12:31👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
groupdel70.4K07552024-02-06 12:31👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
groupmems57.9K07552024-02-06 12:31👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
groupmod68.2K07552024-02-06 12:31👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
grpck53.8K07552024-02-06 12:31👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
grpconv49.7K07552024-02-06 12:31👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
grpunconv49.7K07552024-02-06 12:31👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
iconvconfig30.3K07552026-01-30 08:03👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
invoke-rc.d15.7K07552017-10-25 15:38👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
ip6tables-apply6.9K07552023-05-09 18:42👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
iptables-apply6.9K07552023-05-09 18:42👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
ldattach30.1K07552020-09-16 18:43👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
mklost+found10K07552022-06-02 14:37👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
netplan798B07552021-09-07 15:19👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
newusers82.4K07552024-02-06 12:31👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
nfnl_osf14K07552023-05-09 18:42👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
nologin6K07552024-02-06 12:31👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
pam-auth-update19.4K07552020-07-21 23:40👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
pam_getenv2.8K07552018-08-23 23:37👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
pam_timestamp_check10K07552024-03-19 15:24👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
pwck49.8K07552024-02-06 12:31👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
pwconv45.7K07552024-02-06 12:31👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
pwunconv45.7K07552024-02-06 12:31👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
readprofile18.1K07552020-09-16 18:43👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
remove-shell904B07552017-12-30 18:15👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
rfkill46.1K07552020-09-16 18:43👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
rmt58.4K07552023-12-05 05:18👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
rmt-tar58.4K07552023-12-05 05:18👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
rtcwake42.1K07552020-09-16 18:43👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
service9K07552017-10-25 15:38👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
sshd772.4K07552025-02-18 13:44👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
tarcat936B07552023-12-05 05:18👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
tzconfig106B07552025-04-02 12:18👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
update-ca-certificates5.3K07552024-09-25 18:06👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
update-mime8.8K07552016-07-15 12:06👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
update-passwd30.4K07552017-09-12 21:48👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
update-rc.d16.1K07552017-10-25 15:38👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
useradd123.3K07552024-02-06 12:31👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
userdel82.5K07552024-02-06 12:31👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
usermod123.1K07552024-02-06 12:31👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
vigr60.2K07552024-02-06 12:31👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
vipw60.2K07552024-02-06 12:31👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
visudo208.8K07552025-06-25 20:14👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del
zic54.1K07552026-01-30 08:03👁 View ✏️ Edit 📝 Rename 📦 Move 🗑 Del