Dominick Grift wrote: >> I still get denials when apache starts or stops: >> >> type=AVC msg=audit(1282212879.945:6710639): avc: denied { fowner } for >> pid=10440 comm="chmod" capability=3 scontext=user_u:system_r:httpd_t:s0 >> tcontext=user_u:system_r:httpd_t:s0 tclass=capability >> type=SYSCALL msg=audit(1282212879.945:6710639): arch=40000003 syscall=15 >> success=no exit=-1 a0=91d95ec a1=9c0 a2=8051614 a3=0 items=0 ppid=10439 >> pid=10440 auid=500 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 >> fsgid=0 tty=pts0 ses=404 comm="chmod" exe="/bin/chmod" >> subj=user_u:system_r:httpd_t:s0 key=(null) >> type=AVC msg=audit(1282212879.946:6710640): avc: denied { fowner } for >> pid=10440 comm="chmod" capability=3 scontext=user_u:system_r:httpd_t:s0 >> tcontext=user_u:system_r:httpd_t:s0 tclass=capability >> type=SYSCALL msg=audit(1282212879.946:6710640): arch=40000003 syscall=15 >> success=no exit=-1 a0=91d96a4 a1=9c0 a2=8051614 a3=0 items=0 ppid=10439 >> pid=10440 auid=500 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 >> fsgid=0 tty=pts0 ses=404 comm="chmod" exe="/bin/chmod" >> subj=user_u:system_r:httpd_t:s0 key=(null) > >So something running in the httpd_t domain wants to change file >ownership of some object. > >Still wondering what is running in the httpd_t domain that ran chmod, >and on which object did it run it. I think I've found it. It's in the mod_passenger library, which is currently -rwxrwxr-x root root system_u:object_r:httpd_modules_t /usr/lib/httpd/modules/mod_passenger.so There are a couple of functions there that deal with creation and deletion of FIFOs and mention chmod. As it's loaded by the master apache daemon, I didn't think we could tweak its permissions. Everything seems to work - is there a problem? static void createNonWritableFifo(const string &filename) { int ret, e; bool ignoreChmodErrors = false; do { ret = mkfifo(filename.c_str(), 0); } while (ret == -1 && errno == EINTR); if (ret == -1) { if (errno == EEXIST) { /* The FIFO file was likely created by root, but after lowering * privilege createPassengerTempDir() is called again, and this * time we won't be able to set permissions. So in this case * we'll want to ignore any chmod errors. */ ignoreChmodErrors = geteuid() != 0; } else { e = errno; throw FileSystemException("Cannot create FIFO file " + filename, e, filename); } } do { ret = chmod(filename.c_str(), 0); } while (ret == -1 && errno == EINTR); if (ret == -1 && !ignoreChmodErrors) { e = errno; throw FileSystemException("Cannot set permissions on file " + filename, e, filename); } } void removeDirTree(const string &path) { char command[PATH_MAX + 30]; int result; snprintf(command, sizeof(command), "chmod -R u+rwx \"%s\" 2>/dev/null", path.c_str()); command[sizeof(command) - 1] = '\0'; do { result = system(command); } while (result == -1 && errno == EINTR); snprintf(command, sizeof(command), "rm -rf \"%s\"", path.c_str()); command[sizeof(command) - 1] = '\0'; do { result = system(command); } while (result == -1 && errno == EINTR); if (result == -1) { char message[1024]; int e = errno; snprintf(message, sizeof(message) - 1, "Cannot remove directory '%s'", path.c_str()); message[sizeof(message) - 1] = '\0'; throw FileSystemException(message, e, path); } } >> but I can dontaudit those. I've also changed the labelling so that only >> the passenger executable is labelled with the entry type; all other >> passenger files are content type. The policy becomes: >> >> #### myapp.te #### >> policy_module(myapp,1.0) >> >> apache_content_template(myapp); >> >> kernel_read_kernel_sysctls(httpd_myapp_script_t); >> miscfiles_read_certs(httpd_myapp_script_t); >> term_use_all_user_ptys(httpd_myapp_script_t); >> >> dontaudit httpd_t self:capability { fowner }; >> allow httpd_t httpd_myapp_script_t:unix_stream_socket rw_socket_perms; >> allow httpd_t httpd_myapp_script_rw_t:fifo_file manage_file_perms; >> allow httpd_t httpd_myapp_script_rw_t:sock_file { setattr unlink }; >> >> allow httpd_myapp_script_t self:capability { chown dac_override >> dac_read_search fowner fsetid setgid setuid }; >> allow httpd_myapp_script_t httpd_t:unix_stream_socket { read write }; >> >> #### myapp.fc #### >> /usr/lib/ruby/gems/1.9.1/gems/passenger-2.2.15/lib/phusion_passenger/App >> licationPoolServerExecutable -- >> gen_context(system_u:object_r:httpd_myapp_script_exec_t, s0) >> /usr/lib/ruby/gems/1.9.1/gems/passenger-2.2.15(/.*)? >> gen_context(system_u:object_r:httpd_myapp_content_t, s0) >> /usr/local/lib/myapp(/.*)? >> gen_context(system_u:object_r:httpd_myapp_content_t, s0) >> /var/run/passenger(/.*)? >> gen_context(system_u:object_r:httpd_myapp_script_rw_t, s0) >> >> >> Thanks for your reply on the documentation, too. I'll take time to work >> through it properly. Moray. "To err is human. To purr, feline" -- selinux mailing list selinux@xxxxxxxxxxxxxxxxxxxxxxx https://admin.fedoraproject.org/mailman/listinfo/selinux