Bem, isso deve ser um começo, se você ainda não o consultou: link
Por razões inconvenientes que vão além do escopo desta questão, eu tenho que executar tcpdump
dentro de um script Python. Eu atualmente apenas chamo subprocess.Popen(['tcpdump', ...)
e tudo funciona bem. No entanto, quando eu uso ferramentas como o pyInstaller para empacotar o script em um executável e executá-lo (como root), recebo o seguinte erro:
tcpdump: error while loading shared libraries: libcrypto.so.0.9.8: "failed to map segment from shared object: Permission denied"
Como eu descobri, isso é choramingar no AppArmor. Agora, posso facilmente substituir minha chamada para o tcpdump com o seguinte:
subprocess.call(['aa-complain', '/usr/sbin/tcpdump'])
pcap = subprocess.Popen(['tcpdump', ...)
subprocess.call(['aa-enforce', '/usr/sbin/tcpdump'])
Agora, imprime duas linhas de informação (sobre a mudança para o modo de reclamação / imposição) e executa o tcpdump sem mais reclamações.
As pessoas que executarão esse script o executarão como root quando quiserem fazer capturas de pacotes, portanto, não vejo como isso é um problema de segurança. Ao mesmo tempo, o acima parece hackish para mim. Então, para os especialistas do AppArmor entre vocês: esta é a maneira canônica de lidar com isso?
PS. Eu também sou grato por links para uma boa e rápida introdução ao AppArmor em geral, já que esta é a primeira vez que estou encontrando isso.
Bem, isso deve ser um começo, se você ainda não o consultou: link