Sample Passenger/Rails policy for review

Dominick Grift domg472 at gmail.com
Thu Aug 19 14:03:19 UTC 2010


On 08/19/2010 03:26 PM, Moray Henderson wrote:
> 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?

see what happens when you label it with the passenger executable type.
httpd_myapp_script_exec_t.

The problem is that we do not want to have to extend httpd_t policy if
we do not have to.
> 
> 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 at lists.fedoraproject.org
> https://admin.fedoraproject.org/mailman/listinfo/selinux


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 261 bytes
Desc: OpenPGP digital signature
Url : http://lists.fedoraproject.org/pipermail/selinux/attachments/20100819/def2a5e0/attachment.bin 


More information about the selinux mailing list