Re: SELinux Bootstrap - without chroot

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 2008-06-17 at 10:52 -0400, Vikram Ambrose wrote:
> Stephen Smalley wrote:
> > On Tue, 2008-06-17 at 09:52 -0400, Vikram Ambrose wrote:
> >   
> >> Stephen Smalley wrote:
> >>     
> >>> On Mon, 2008-06-16 at 17:35 -0400, Vikram Ambrose wrote:
> >>>   
> >>>       
> >>>> Stephen Smalley wrote:
> >>>>     
> >>>>         
> >>>>> On Mon, 2008-06-16 at 13:56 -0400, Vikram Ambrose wrote:
> >>>>>   
> >>>>>       
> >>>>>           
> >>>>>> Stephen Smalley wrote:
> >>>>>>     
> >>>>>>         
> >>>>>>             
> >>>>>>> Note that they get installed to $DESTDIR/usr/share/selinux/$SELINUXTYPE
> >>>>>>> by make install.  In Fedora, they are packaged as such, then when you
> >>>>>>> install the package on the target host, they are unpacked
> >>>>>>> to /usr/share/selinux/$SELINUXTYPE by the package manager and then a %
> >>>>>>> post scriptlet runs semodule on them to install them under /etc/selinux
> >>>>>>> and load them.
> >>>>>>>
> >>>>>>>   
> >>>>>>>       
> >>>>>>>           
> >>>>>>>               
> >>>>>> In Fedora, does anaconda chroot into the sysroot and call semodule 
> >>>>>> during installation?
> >>>>>>     
> >>>>>>         
> >>>>>>             
> >>>>> Some combination of anaconda and rpm, yes.  semodule runs from a %post
> >>>>> scriptlet in the selinux-policy-targeted package at package install
> >>>>> time.
> >>>>>
> >>>>>   
> >>>>>       
> >>>>>           
> >>>>>>> Options for you might include:
> >>>>>>> 1) Run semodule_link and semodule_expand at build time to link and
> >>>>>>> expand the modules to a kernel policy up front.  Then you can just put
> >>>>>>> the files into place without running semodule later.
> >>>>>>>   
> >>>>>>>       
> >>>>>>>           
> >>>>>>>               
> >>>>>> I will investigate this option further, thank you.
> >>>>>>     
> >>>>>>         
> >>>>>>             
> >>>>> Ok.  You can see an example of it in the 'make validate' target,
> >>>>> although that is just to check that they will link and expand
> >>>>> successfully; it isn't used to install the policy normally and likely
> >>>>> doesn't keep the final result around.
> >>>>>
> >>>>>   
> >>>>>       
> >>>>>           
> >>>> I am getting a bit confused between "modular" and "monolithic", in both 
> >>>> cases a policy.X file is needed to load the policy into the kernel, right?
> >>>>
> >>>> and in the modular case, the policy.X file simply points to the various 
> >>>> .pp files and in the monolithic case everything is in the policy.X file? 
> >>>> Analogous to shared library and static library link (modular/monolithic)?
> >>>>     
> >>>>         
> >>> In either case, we ultimately need a complete policy.N file that
> >>> contains all of the information for loading into the kernel.  The kernel
> >>> only knows about the policy.N format; it knows nothing of policy
> >>> modules.
> >>>
> >>> The difference is whether we need to compile a complete set of policy
> >>> sources directly into the policy.N file, or whether we can separately
> >>> compile and package each policy module into a .pp file and then later
> >>> link and expand the set of installed policy modules to create a policy.N
> >>> file.
> >>>
> >>> The modular policy support was introduced later (first appeared in
> >>> Fedora Core 5), to allow for local customization of policy without
> >>> requiring complete policy sources and to enable third party policy and
> >>> decomposition of distribution policy among the packages.
> >>>
> >>> In a monolithic policy build, you take the entire set of policy sources,
> >>> apply various preprocessing steps, combine the result into a single
> >>> policy.conf file, and then feed that to the checkpolicy program to
> >>> generate the policy.N file for the kernel.  And you likewise preprocess
> >>> and combine the .fc files to form the complete file_contexts
> >>> configuration.  Later if you want to add more policy, you drop it into
> >>> the policy source tree and repeat the entire process.
> >>>
> >>> In the modular policy build, you take each policy module's sources (.te
> >>> file), apply various preprocessing steps, feed the result to the
> >>> checkmodule program to generate a binary module (.mod) file, then feed
> >>> the .mod file and the .fc file to semodule_package to generate the
> >>> policy package (.pp) file.  Then you ship the .pp files to the target
> >>> host, run semodule to insert them into the policy module store, link
> >>> them together, and expand them into a policy.N file on that host.  Later
> >>> if you want to add more policy, you compile it as a module separately,
> >>> ship the resulting .pp file to the target host, and then run semodule on
> >>> it, which will add it to the policy store and generate an updated
> >>> policy.N file.
> >>>
> >>>   
> >>>       
> >> hmm, that somewhat explains it, but the terminology used across man 
> >> pages and the internet doesn't seem to be consistent so it's a bit 
> >> difficult to understand whats what.
> >> So to avoid semodule's affinity for /etc/selinux i can get  away with 
> >> semodule_link and semodule_expand?
> >> I don't understand what the output of each command is. I did a 
> >> semodule_link of all my .pp files and then did a senodule_expand of that 
> >> file into another file, and then cat'ed that into /selinux/load and i 
> >> got an error about a map.
> >>
> >> [600793.305757] security: ebitmap: truncated map
> >>
> >> Also, once the policy.X file is loaded, does the system need access to 
> >> /etc/selinux/$POLICY ?
> >>     
> >
> > You can do that, but I'm still not clear on why you are doing it.  It
> > seems like you should be doing one of the following instead:
> > 1) run semodule on the target system to install the .pp files and load
> > the resulting policy rather than trying to do it all on the build host,
> > -or-
> >   
> Yes this works, however i'd like to have it running out of the box 
> without this step.

Up to you, of course, but note that at least in Fedora, this happens
naturally via a %post scriptlet in the selinux-policy packages and isn't
fundamentally different than other %post actions performed for system
setup when a package is installed.

> > 2) run semodule within a chroot on the build system to install the .pp
> > files and create the kernel policy.  Eric Paris has been getting such
> > builds to work for Fedora live CD creation.
> >   
> I'm not a fan of the chroot environment, but now that i have learned 
> that i can manually semodule_link/expand to create my policy.X file, i 
> can do the whole operation without using /etc/, this makes 
> packaging/building out of the target system much easier, as well as 
> deployment is a simple:
> 1. untar the .pp files to /usr/share/selinux/policy/ for devs to use
> 2. refpolicy make install, stuff untar'ed to 
> /etc/selinux/policy/contexts  and
> 3. copy my policy.X file that was produced by link/expand (also from the 
> build host), to /etc/selinux/policy/policy
> 4. edit semanage.conf and selinux.conf, throw in load_policy into 
> sysvinit and i'm done!

You may also need to manually generate the file_contexts file and put it
into place, as semodule_link/expand doesn't presently handle that for
you.

> > -or-
> > 3) perform a monolithic policy build in the first place and thus avoid
> > the entire indirection of modules and semodule in the first place.
> >
> > Also, you said you didn't want to load the policy on the build host so
> > I'm not sure why you are trying to do that. The reason that it is
> > failing is not that the policy is invalid but because the cat program
> > writes it in fixed size chunks rather than atomically in one write call,
> > and /selinux/load requires that the entire policy be fed to it in a
> > single write call.  The load_policy program does this by opening the
> > policy file, fstat'ing it to get the size, mmap'ing it into memory, and
> > then write'ing the entire memory region to /selinux/load in a single
> > write() call.  You can see that logic in libselinux/src/load_policy.c;
> > it was once directly implemented in the load_policy program but later
> > moved into the library and further encapsulated.
> >
> >   
> Yes i just found out myself too. so I used dd with a big block size and 
> it worked beautifully.

Ok, a useful workaround to know.

> > semodule_link/expand are developer tools for manually applying the link
> > +expand phases, and thus will operate on whatever inputs you provide
> > rather than only operating on a policy store under /etc/selinux.
> >
> > The kernel doesn't care where the policy originates; it is only
> > userspace that has the convention that it lives under /etc/selinux.
> >
> >   
> thanks Stephen. I think I have found my solution.


-- 
Stephen Smalley
National Security Agency


--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@xxxxxxxxxxxxx with
the words "unsubscribe selinux" without quotes as the message.

[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux