From: Luke Kenneth Casson Leighton <lkcl@lkcl.net>
To: Russell Coker <russell@coker.com.au>,
Joshua Brindle <jbrindle@tresys.com>, Greg KH <greg@kroah.com>,
SE Linux <selinux@tycho.nsa.gov>,
fedora-selinux-list@redhat.com
Subject: Re: Fedora and udev
Date: Tue, 24 Aug 2004 17:01:26 +0100 [thread overview]
Message-ID: <20040824160126.GA19197@lkcl.net> (raw)
In-Reply-To: <20040824141828.GA4698@lkcl.net>
[-- Attachment #1: Type: text/plain, Size: 2872 bytes --]
On Tue, Aug 24, 2004 at 03:18:28PM +0100, Luke Kenneth Casson Leighton wrote:
> On Tue, Aug 24, 2004 at 08:06:41PM +1000, Russell Coker wrote:
> > On Tue, 24 Aug 2004 19:28, Luke Kenneth Casson Leighton <lkcl@lkcl.net> wrote:
> > > 2) it ONLY set the permissions on the inode NOT on any symlinks and NOT
> > > on any directories or subdirectories created.
> >
> > This part is OK. We have moved to using device_t (the default) as the context
> > for all directories and sym-links under /dev.
>
> great, then the policy modifications i've made will be of some
> value in pointing you in the right direction, i'll endeavour to
> clean them up, sort them out [dammit i just did that and ended
> up accidentally deleting it, i _must_ try to stop the habit of
> reusing filenames f g h x y and z]
>
> i'm attaching also my modified /etc/init.d/udev file.
>
> as you can see it calls /sbin/restoredevicefiles (sent earlier)
> after the make_extra_nodes() call has been made.
well you _could_ if i attached it.
okay, also attached the most historically horrible "ItWorksForMe(tm)"
udev-device-t-patch for selinux.
note that there are some awful hacks in here such as
allow hotplug_t device_t:file { ioctl read write };
the reason for this horrible hack is because, i believe, i am
running /bin/ls from inside my horrible hack script
/sbin/restoredevicefiles.
during the setup phase, no program should endeavour to access
/dev/null.
less obvious ones are:
allow init_t device_t:fifo_file { getattr read write };
to access /dev/initctl
now, this _could_ be due to a mistake that i made, because strictly
speaking, /dev/initctl should be in /dev as in a _real_ /dev on
a _real_ ext2 persistent filesystem.
stephen's explanation about setfiles not traversing mount points
including --rbind moved mountpoints _could_ explain why i was
having the above difficulties, namely that if /.dev was not being
relabelled, then /.dev/initctl would be as the default device_t
type, such that on an initial boot (prior to /dev getting --rbind
mount moved to /dev by /etc/init.d/udev) the filecontext was
incorrect.
but, like i said earlier, i believe that setfiles was _not_ doing
a proper job of ignoring --rbind mountpoints, and consequently
a make relabel or a setfiles / resulted in /.dev _deliberately_
being set to something it should not have been set to.
which reminds me to suggest that for this reason, it might be
necessary to add /.dev to the make relabel rule in setfiles.
oh, and of course to add in /.?u?dev [or a better regexp] to every
single line in the file contexts thing.
at this point i have to confess that i am getting a little confused
because there is so much that i have just ridden slip-shod over in
the past few weeks and approximately 100 reboots in order to
get a working system: priority of time and running out of cash.
l.
[-- Attachment #2: udev --]
[-- Type: text/plain, Size: 3238 bytes --]
#!/bin/sh -e
PATH="/sbin:/bin"
UDEVSTART=/sbin/udevstart
# default maximum size of the /dev tmpfs
tmpfs_size="1M"
[ -x $UDEVSTART ] || exit 0
. /etc/udev/udev.conf
case "$(uname -r)" in
2.[012345].*)
echo "udev requires a 2.6.x kernel, not started."
exit 0
;;
esac
if ! grep -q '[[:space:]]tmpfs$' /proc/filesystems; then
echo "udev requires tmpfs support, not started."
exit 0
fi
if [ ! -e /proc/sys/kernel/hotplug ]; then
echo "udev requires hotplug support, not started."
exit 0
fi
if [ "$udev_root" != "/dev/" ]; then
echo "udev_root != /dev/, not started. Please check /etc/udev/udev.conf."
exit 0
fi
##############################################################################
# we need to unmount /dev/pts/ and remount it later over the tmpfs
unmount_devpts() {
if mountpoint -q /dev/pts/; then
umount -l /dev/pts/
fi
if mountpoint -q /dev/shm/; then
umount -l /dev/shm/
fi
}
# mount a tmpfs over /dev, if somebody did not already do it
mount_tmpfs() {
if grep -E -q "^[^[:space:]]+ /dev tmpfs" /proc/mounts; then
return 0
fi
# /.dev is used by /sbin/MAKEDEV to access the real /dev directory.
# if you don't like it just remove it.
[ -d /.dev ] && mount --bind /dev /.dev
echo -n "Mounting a tmpfs over /dev..."
mount -n -o fscontext=system_u:object_r:device_t,size=$tmpfs_size,mode=0755 -t tmpfs none /dev
echo "done."
}
# I hate this hack. -- Md
make_extra_nodes () {
grep '^[^#]' /etc/udev/links.conf | \
while read type name arg1; do
[ "$type" -a "$name" -a ! -e "/dev/$name" -a ! -L "/dev/$name" ] ||continue
case "$type" in
L)
ln -s $arg1 /dev/$name
;;
D)
mkdir -p /dev/$name
;;
M)
mknod --mode=600 /dev/$name $arg1
;;
*)
echo "unparseable line ($type $name $arg1)"
;;
esac
done
}
# When modifying this script, do not forget that between the time that
# the new /dev has been mounted and udevstart has been run there will be
# no /dev/null. This also means that you cannot use the "&" shell command.
##############################################################################
case "$1" in
start)
unmount_devpts
mount_tmpfs
ACTION=add
echo -n "Creating initial device nodes..."
$UDEVSTART
make_extra_nodes
# all extra nodes created we must do the security contexts on them, oh dear.
if [ -x /sbin/restoredevicefiles ]; then
/sbin/restoredevicefiles
fi
echo "done."
;;
remove)
# I'm not sure this is useful
ACTION=remove
echo -n "Removing device nodes..."
old_synthesize_events
echo "done."
;;
stop)
start-stop-daemon --stop --exec /sbin/udevd --oknodo --quiet
unmount_devpts
echo -n "Unmounting /dev..."
# unmounting with -l should never fail
if umount -l /dev; then
echo "done."
umount -l /.dev || true
/etc/init.d/mountvirtfs start
else
echo "failed."
fi
;;
restart|force-reload)
echo -n "Recreating device nodes..."
ACTION=add
$UDEVSTART
make_extra_nodes
echo "done."
;;
*)
echo "Usage: /etc/init.d/udev {start|stop|restart|force-reload}"
exit 1
;;
esac
exit 0
[-- Attachment #3: udev --]
[-- Type: text/plain, Size: 9841 bytes --]
diff -Naur
--- default.1.14/domains/misc/horrible_hacks.te 1970-01-01 01:00:00.000000000 +0100
+++ current/domains/misc/horrible_hacks.te 2004-08-22 18:15:37.000000000 +0100
@@ -0,0 +1,201 @@
+# this is to deal with restorecon devices being associated with udev's
+# mounting of /dev as a fscontext=device_t. help, help, gloop!
+
+# this is to allow /etc/init.d/udev to do its horrible hacks
+# if it wasn't done in /etc/init.d or it wasn't device_t under which
+# /dev was mounted (mount ... -o fscontext=....device_t) then this
+# would be different or not there:
+
+allow initrc_t device_t:dir { create setattr };
+ #EXE=/bin/mkdir NAME=pts : create
+ #EXE=/bin/touch NAME=/ : setattr
+
+allow initrc_t device_t:lnk_file { create };
+ #EXE=/bin/ln NAME=fd : create
+
+allow initrc_t device_t:blk_file { getattr };
+ #EXE=/bin/ls PATH=/dev/ram0 : getattr
+
+allow initrc_t device_t:chr_file { getattr read write };
+ #EXE=/bin/bash NAME=tty : read write
+ #EXE=/bin/ls PATH=/dev/ptmx : getattr
+
+# not sure about this one
+
+allow initrc_t fixed_disk_device_t:blk_file { getattr };
+ #EXE=/bin/bash PATH=/dev/ram0 : getattr
+
+
+allow init_t device_t:fifo_file { getattr read write };
+ #EXE=/sbin/init PATH=/dev/initctl : getattr
+ #EXE=/sbin/init NAME=initctl : read write
+
+allow hotplug_t device_t:file { ioctl read write };
+ #EXE=/bin/bash NAME=null : read
+ #EXE=/bin/bash NAME=null : write
+ #EXE=/bin/bash PATH=/dev/null : ioctl
+
+allow initrc_t memory_device_t:chr_file { getattr };
+ #EXE=/bin/ls PATH=/dev/port : getattr
+
+allow initrc_t random_device_t:chr_file { getattr };
+ #EXE=/bin/ls PATH=/dev/random : getattr
+
+allow initrc_t romfs_t:dir { search };
+ #EXE=/bin/dash : search
+
+allow initrc_t usbfs_t:dir { getattr read search };
+ #EXE=/bin/dash : search
+ #EXE=/bin/dash PATH=/proc/bus/usb : getattr
+ #EXE=/bin/ls : read
+
+allow udev_t device_t:file { getattr unlink };
+ #EXE=/sbin/udev PATH=/dev/null : getattr
+ #EXE=/sbin/udev NAME=null : unlink
+
+allow udev_t etc_runtime_t:file { relabelfrom relabelto };
+ #EXE=/bin/cp NAME=ifstate.hotplug : relabelfrom
+ #EXE=/bin/cp NAME=ifstate.hotplug : relabelto
+
+allow udev_t self:file { write };
+ #EXE=/sbin/udev NAME=fscreate : write
+
+allow udev_t self:process { setfscreate };
+ #EXE=/sbin/udev : setfscreate
+
+
+allow initrc_t usbfs_t:file { getattr read };
+ #EXE=/bin/dash PATH=/proc/bus/usb/devices : getattr
+ #EXE=/bin/grep NAME=devices : read
+
+allow insmod_t hotplug_etc_t:dir { getattr search };
+ #EXE=/bin/dash PATH=/etc/hotplug : getattr
+ #EXE=/bin/dash NAME=hotplug : search
+
+allow device_t device_t:filesystem { associate };
+ #EXE=/bin/bash NAME=null : associate
+ #EXE=/sbin/udev NAME=snd : associate
+
+allow hotplug_t device_t:dir { add_name write };
+ #EXE=/bin/bash : write
+ #EXE=/bin/bash NAME=null : add_name
+
+allow hotplug_t device_t:file { create };
+ #EXE=/bin/bash NAME=null : create
+
+allow initctl_t device_t:filesystem { associate };
+ #EXE=/sbin/init NAME=initctl : associate
+
+allow initrc_t root_t:dir { remove_name write };
+ #EXE=/bin/rm : write
+ #EXE=/bin/rm NAME=fastboot : remove_name
+
+allow initrc_t root_t:file { unlink };
+ #EXE=/bin/rm NAME=fastboot : unlink
+
+allow initrc_t usbfs_t:file { getattr read };
+ #EXE=/bin/dash PATH=/proc/bus/usb/devices : getattr
+ #EXE=/bin/grep NAME=devices : read
+
+allow initrc_t zero_device_t:chr_file { getattr };
+ #EXE=/bin/ls PATH=/dev/zero : getattr
+
+
+
+
+
+allow udev_tbl_t device_t:filesystem { associate };
+ #EXE=/sbin/udev NAME=.udev.tdb : associate
+
+
+
+
+
+allow mount_t tmpfs_t:filesystem { relabelfrom };
+ #EXE=/bin/mount : relabelfrom
+
+
+allow devlog_t device_t:filesystem { associate };
+ #EXE=/sbin/syslogd NAME=log : associate
+
+allow sshd_t device_t:filesystem { getattr };
+ #EXE=/usr/sbin/sshd NAME=/ : getattr
+ #EXE=/usr/sbin/sshd NAME=/ : getattr
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff -Naur
--- default.1.14/domains/program/init.te 2004-08-02 08:28:37.000000000 +0100
+++ current/domains/program/init.te 2004-08-15 15:35:27.000000000 +0100
@@ -131,6 +131,9 @@
allow init_t devtty_t:chr_file { read write };
allow init_t ramfs_t:dir search;
')
+
r_dir_file(init_t, sysfs_t)
+r_dir_file(init_t, tmpfs_t)
r_dir_file(init_t, selinux_config_t)
+
diff -Naur
--- default.1.14/domains/program/initrc.te 2004-08-02 08:28:37.000000000 +0100
+++ current/domains/program/initrc.te 2004-08-22 18:09:23.000000000 +0100
@@ -312,3 +312,27 @@
#
allow initrc_t security_t:dir { getattr search };
allow initrc_t security_t:file { getattr read };
+
+allow initrc_t device_t:filesystem { getattr };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff -Naur
--- default.1.14/domains/program/mount.te 2004-08-02 08:28:37.000000000 +0100
+++ current/domains/program/mount.te 2004-08-21 19:12:19.000000000 +0100
@@ -16,7 +16,7 @@
role sysadm_r types mount_t;
role system_r types mount_t;
-allow mount_t { initrc_devpts_t console_device_t }:chr_file { read write };
+allow mount_t { initrc_devpts_t console_device_t tty_device_t }:chr_file { read write };
domain_auto_trans(initrc_t, mount_exec_t, mount_t)
allow mount_t init_t:fd use;
@@ -49,11 +49,12 @@
allow mount_t usbdevfs_t:dir mounton;
allow mount_t sysfs_t:dir { mounton };
allow mount_t nfs_t:dir mounton;
+allow mount_t security_t:dir mounton;
allow mount_t nfs_t:dir { search };
# nfsv4 has a filesystem to mount for its userspace daemons
allow mount_t var_lib_nfs_t:dir { mounton };
-# On some RedHat systems, /boot is a mount point
+# On some RedHat and Debian systems, /boot is a mount point
allow mount_t boot_t:dir mounton;
allow mount_t device_t:dir mounton;
# mount binfmt_misc on /proc/sys/fs/binfmt_misc
diff -Naur
--- default.1.14/domains/program/restorecon.te 2004-08-02 08:28:37.000000000 +0100
+++ current/domains/program/restorecon.te 2004-08-06 15:54:12.000000000 +0100
@@ -59,3 +59,6 @@
r_dir_file(restorecon_t, selinux_config_t)
r_dir_file(restorecon_t, file_context_t)
+allow restorecon_t udev_tbl_t:file { read write };
+ #EXE=/sbin/restorecon PATH=/dev/.udev.tdb : read write
+
diff -Naur
--- default.1.14/domains/program/udev.te 2004-08-02 08:28:37.000000000 +0100
+++ current/domains/program/udev.te 2004-08-06 19:20:29.000000000 +0100
@@ -18,6 +18,7 @@
type udev_helper_exec_t, file_type, sysadmfile, exec_type;
r_dir_file(udev_t, udev_helper_exec_t)
can_exec(udev_t, udev_helper_exec_t)
+#domain_auto_trans(udev_t, udev_helper_exec_t, hotplug_t)
#
# Rules used for udev
@@ -33,6 +34,7 @@
allow udev_t device_t:chr_file create_file_perms;
allow udev_t device_t:sock_file create_file_perms;
allow udev_t device_t:lnk_file create_file_perms;
+allow udev_t device_t:dir create_dir_perms;
allow udev_t etc_t:file { getattr read };
allow udev_t { bin_t sbin_t }:dir r_dir_perms;
allow udev_t bin_t:lnk_file read;
@@ -70,6 +72,8 @@
ifdef(`hotplug.te', `
r_dir_file(udev_t, hotplug_etc_t)
+domain_auto_trans(udev_t, hotplug_exec_t, hotplug_t)
+can_exec(udev_t, hotplug_exec_t)
')
allow udev_t var_log_t:dir { search };
@@ -79,3 +83,15 @@
domain_auto_trans(udev_t, ifconfig_exec_t, ifconfig_t)
dontaudit udev_t file_t:dir search;
+
+# hacked stuff...
+
+can_ps(udev_t, domain)
+
+# for /etc/dev.d/net/hotplug.dev
+
+allow udev_t etc_runtime_t:file { append lock write };
+can_exec(udev_t hotplug_etc_t)
+
+
+r_dir_file(udev_t, selinux_config_t)
diff -Naur
--- default.1.14/file_contexts/program/udev.fc 2004-08-02 08:28:37.000000000 +0100
+++ current/file_contexts/program/udev.fc 2004-08-06 15:18:35.000000000 +0100
@@ -4,5 +4,8 @@
/sbin/udevd -- system_u:object_r:udev_exec_t
/etc/dev.d(/.*)? system_u:object_r:udev_helper_exec_t
/etc/hotplug.d/default/udev.* system_u:object_r:udev_helper_exec_t
+/etc/udev/cdsymlinks.sh system_u:object_r:udev_helper_exec_t
+/etc/udev/ide-devfs.sh system_u:object_r:udev_helper_exec_t
+/etc/udev/scsi-devfs.sh system_u:object_r:udev_helper_exec_t
/dev/udev.tbl -- system_u:object_r:udev_tbl_t
/dev/\.udev\.tdb -- system_u:object_r:udev_tbl_t
diff -Naur
--- default.1.14/macros/base_user_macros.te 2004-08-02 08:28:37.000000000 +0100
+++ current/macros/base_user_macros.te 2004-08-14 22:59:48.000000000 +0100
@@ -80,6 +80,16 @@
allow $1_t privfd:fd use;
allow $1_t $1_tty_device_t:chr_file { setattr rw_file_perms };
+
+
+
+# needed for udev-mounted (/dev) tmpfs
+allow $1_tty_device_t device_t:filesystem { associate };
+
+# to allow users to run df on udev-mounted (/dev) tmpfs
+allow $1_t device_t:filesystem { getattr };
+ #EXE=/bin/df NAME=/ : getattr
+
# Use the type when relabeling terminal devices.
type_change $1_t tty_device_t:chr_file $1_tty_device_t;
diff -Naur
--- default.1.14/types/file.te 2004-08-02 08:28:37.000000000 +0100
+++ current/types/file.te 2004-08-09 19:52:49.000000000 +0100
@@ -259,12 +259,23 @@
#
allow { file_type device_type } fs_t:filesystem associate;
+#
+# Allow device types to be associated with a udev-mounted
+# file system where the -o mount option "fscontext=....device_t"
+# has been added. if it was fscontext=...something_else_t
+# then it would be allow .... something_else_t:filesystem here:
+#
+allow { device_type } device_t:filesystem associate;
+
# Allow the pty to be associated with the file system.
allow devpts_t devpts_t:filesystem associate;
type tmpfs_t, file_type, sysadmfile, fs_type, root_dir_type;
allow { tmpfs_t tmp_t } tmpfs_t:filesystem associate;
+
+
+
type usbdevfs_t, fs_type, root_dir_type, noexattrfile, sysadmfile;
allow usbdevfs_t usbdevfs_t:filesystem associate;
next prev parent reply other threads:[~2004-08-24 15:51 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-08-22 11:25 Fedora and udev Russell Coker
2004-08-22 14:40 ` Luke Kenneth Casson Leighton
2004-08-22 15:29 ` Joshua Brindle
2004-08-22 16:23 ` Luke Kenneth Casson Leighton
2004-08-23 13:04 ` Stephen Smalley
2004-08-22 15:05 ` Joshua Brindle
2004-08-22 17:34 ` Luke Kenneth Casson Leighton
[not found] ` <20040823224444.GI4694@kroah.com>
2004-08-23 22:50 ` Joshua Brindle
2004-08-24 9:28 ` Luke Kenneth Casson Leighton
2004-08-24 10:06 ` Russell Coker
2004-08-24 14:18 ` Luke Kenneth Casson Leighton
2004-08-24 16:01 ` Luke Kenneth Casson Leighton [this message]
2004-08-24 22:23 ` Luke Kenneth Casson Leighton
2004-08-24 11:50 ` Stephen Smalley
2004-08-24 9:41 ` Luke Kenneth Casson Leighton
[not found] ` <20040824163048.GA1715@kroah.com>
2004-08-26 13:57 ` Daniel J Walsh
2004-08-26 13:59 ` Joshua Brindle
[not found] ` <orzn4nuval.fsf@livre.redhat.lsd.ic.unicamp.br>
2004-08-23 2:09 ` Russell Coker
2004-08-23 8:56 ` Luke Kenneth Casson Leighton
2004-08-23 12:04 ` Luke Kenneth Casson Leighton
[not found] ` <1093286952.4101.47.camel@bree.local.net>
2004-08-24 7:25 ` Russell Coker
2004-08-23 2:33 ` James Morris
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20040824160126.GA19197@lkcl.net \
--to=lkcl@lkcl.net \
--cc=fedora-selinux-list@redhat.com \
--cc=greg@kroah.com \
--cc=jbrindle@tresys.com \
--cc=russell@coker.com.au \
--cc=selinux@tycho.nsa.gov \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.