[apparmor] [patch 5/6] rewrite apparmor.vim generation and integrate into build
John Johansen
john.johansen at canonical.com
Thu Mar 22 18:53:30 UTC 2012
On 03/22/2012 10:06 AM, Steve Beattie wrote:
> This patch replaces the apparmor.vim generating script with a python
> version that eliminates the need for using the replace tool from the
> mysql-server package. It makes use of the automatically generated
> lists of capabilities and network protocols provided by the build
> infrastructure. I did not capture all the notes and TODOs that
> Christian had in the shell script; I can do so if desired.
>
> It also hooks the generation of the apparmor.vim file into the utils/
> build and clean stages.
>
> [Note: the patch doesn't reflect the deletion of the script or the
> apparmor.vim file in the utils/ directory as handling deletions in
> quilt is problematic. But it's intended that the actual commits into
> bzr will also remove these files.]
>
So I am good with this (tentative Ack) but I want to hear from Christian first.
> ---
> utils/Makefile | 2
> utils/vim/Makefile | 17 +++++-
> utils/vim/create-apparmor.vim.py | 108 +++++++++++++++++++++++++++++++++++++++
> 3 files changed, 125 insertions(+), 2 deletions(-)
>
> Index: b/utils/Makefile
> ===================================================================
> --- a/utils/Makefile
> +++ b/utils/Makefile
> @@ -37,6 +37,7 @@ MANPAGES = ${TOOLS:=.8} logprof.conf.5
>
> all: ${MANPAGES} ${HTMLMANPAGES}
> $(MAKE) -C po all
> + $(MAKE) -C vim all
>
> # need some better way of determining this
> DESTDIR=/
> @@ -67,6 +68,7 @@ clean: _clean
> rm -f core core.* *.o *.s *.a *~
> rm -f Make.rules
> $(MAKE) -C po clean
> + $(MAKE) -C vim clean
>
> # ${CAPABILITIES} is defined in common/Make.rules
> .PHONY: check_severity_db
> Index: b/utils/vim/Makefile
> ===================================================================
> --- a/utils/vim/Makefile
> +++ b/utils/vim/Makefile
> @@ -1,5 +1,18 @@
> -apparmor.vim: apparmor.vim.in Makefile create-apparmor.vim.sh
> - sh create-apparmor.vim.sh
> +COMMONDIR=../../common/
> +
> +all:
> +include common/Make.rules
> +
> +COMMONDIR_EXISTS=$(strip $(shell [ -d ${COMMONDIR} ] && echo true))
> +ifeq ($(COMMONDIR_EXISTS), true)
> +common/Make.rules: $(COMMONDIR)/Make.rules
> + ln -sf $(COMMONDIR) .
> +endif
> +
> +all: apparmor.vim
> +
> +apparmor.vim: apparmor.vim.in Makefile create-apparmor.vim.py
> + python create-apparmor.vim.py > $@
>
> clean:
> rm -f apparmor.vim
> Index: b/utils/vim/create-apparmor.vim.py
> ===================================================================
> --- /dev/null
> +++ b/utils/vim/create-apparmor.vim.py
> @@ -0,0 +1,108 @@
> +#!/usr/bin/python
> +#
> +# Copyright (C) 2012 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.
> +#
> +# Written by Steve Beattie <steve at nxnw.org>, based on work by
> +# Christian Boltz <apparmor at cboltz.de>
> +
> +import os
> +import re
> +import subprocess
> +import sys
> +
> +# dangerous capabilities
> +danger_caps=["audit_control",
> + "audit_write",
> + "mac_override",
> + "mac_admin",
> + "set_fcap",
> + "sys_admin",
> + "sys_module",
> + "sys_rawio"]
> +
> +aa_network_types=r'\s+tcp|\s+udp|\s+icmp'
> +
> +aa_flags=r'(complain|audit|attach_disconnect|no_attach_disconnected|chroot_attach|chroot_no_attach|chroot_relative|namespace_relative)'
> +
> +def cmd(command, input = None, stderr = subprocess.STDOUT, stdout = subprocess.PIPE, stdin = None, timeout = None):
> + '''Try to execute given command (array) and return its stdout, or
> + return a textual error if it failed.'''
> +
> + try:
> + sp = subprocess.Popen(command, stdin=stdin, stdout=stdout, stderr=stderr, close_fds=True)
> + except OSError, e:
> + return [127, str(e)]
> +
> + out, outerr = sp.communicate(input)
> +
> + # Handle redirection of stdout
> + if out == None:
> + out = ''
> + # Handle redirection of stderr
> + if outerr == None:
> + outerr = ''
> + return [sp.returncode,out+outerr]
> +
> +# get capabilities list
> +(rc, output) = cmd(['make', '-s', '--no-print-directory', 'list_capabilities'])
> +if rc != 0:
> + print >>sys.stderr, ("make list_capabilities failed: " + output)
> + exit(rc)
> +
> +capabilities = re.sub('CAP_', '', output.strip()).lower().split(" ")
> +benign_caps =[]
> +for cap in capabilities:
> + if cap not in danger_caps:
> + benign_caps.append(cap)
> +
> +# get network protos list
> +(rc, output) = cmd(['make', '-s', '--no-print-directory', 'list_af_names'])
> +if rc != 0:
> + print >>sys.stderr, ("make list_af_names failed: " + output)
> + exit(rc)
> +
> +af_names = []
> +af_pairs = re.sub('AF_', '', output.strip()).lower().split(",")
> +for af_pair in af_pairs:
> + af_name = af_pair.lstrip().split(" ")[0]
> + # skip max af name definition
> + if len(af_name) > 0 and af_name != "max":
> + af_names.append(af_name)
> +
> +# TODO: does a "debug" flag exist? Listed in apparmor.vim.in sdFlagKey,
> +# but not in aa_flags...
> +# -> currently (2011-01-11) not, but might come back
> +
> +aa_regex_map = {
> + 'FILE': r'\v^\s*(audit\s+)?(deny\s+)?(owner\s+)?(\/|\@\{\S*\})\S*\s+',
> + 'DENYFILE': r'\v^\s*(audit\s+)?deny\s+(owner\s+)?(\/|\@\{\S*\})\S*\s+',
> + 'auditdenyowner': r'(audit\s+)?(deny\s+)?(owner\s+)?',
> + 'auditdeny': r'(audit\s+)?(deny\s+)?',
> + 'FILENAME': r'(\/|\@\{\S*\})\S*',
> + 'EOL': r'\s*,(\s*$|(\s*#.*$)\@=)',
> + 'TRANSITION': r'(\s+-\>\s+\S+)?',
> + 'sdKapKey': " ".join(benign_caps),
> + 'sdKapKeyDanger': " ".join(danger_caps),
> + 'sdKapKeyRegex': "|".join(capabilities),
> + 'sdNetworkType': aa_network_types,
> + 'sdNetworkProto': "|".join(af_names),
> + 'flags': r'((flags\s*\=\s*)?\(\s*' + aa_flags + r'(\s*,\s*' + aa_flags + r')*\s*\)\s+)',
> +}
> +
> +def my_repl(matchobj):
> + #print matchobj.group(1)
> + if matchobj.group(1) in aa_regex_map:
> + return aa_regex_map[matchobj.group(1)]
> +
> + return matchobj.group(0)
> +
> +regex = "@@(" + "|".join(aa_regex_map) + ")@@"
> +
> +with file("apparmor.vim.in") as template:
> + for line in template:
> + line = re.sub(regex, my_repl, line.rstrip())
> + print line
>
>
> -- AppArmor mailing list AppArmor at lists.ubuntu.com Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/apparmor
>
More information about the AppArmor
mailing list