| <!--#include virtual="header.txt"--> |
| |
| <h1>SELinux</h1> |
| |
| <p>Starting with version 21.08, Slurm includes support for setting an SELinux |
| context for jobs as a technology preview. The implementation may change in |
| future releases, and support for it is not enabled by default.</p> |
| |
| <h2 id="ARCHITECTURE">Architecture |
| <a class="slurm_link" href="#ARCHITECTURE"></a> |
| </h2> |
| |
| <p>When enabled, the Slurm job submission commands — salloc, sbatch, and |
| srun — will automatically set a field with the current operating context. |
| This field can be overwritten by the <span class="commandline">--context</span> |
| command line option.</p> |
| |
| <p>It is important to note that this value can be directly manipulated by the |
| end-user, and it is up to site-specific scripts to validate and control access |
| to these contexts. At this time MUNGE, which Slurm users to security identify |
| users and hosts on the cluster, does not provide an SELinux context field, and |
| as such there is no secure mechanism to send the current context to the Slurm |
| controller. Thus the context, as provided at job submission time, <b>must</b> |
| be validated by a job_submit plugin running within the slurmctld.</p> |
| |
| <p>Without such a script, no context is set or managed for a user's job.</p> |
| |
| <h2 id="INSTALLATION">Installation |
| <a class="slurm_link" href="#INSTALLATION"></a> |
| </h2> |
| |
| <h3 id="pmix">Source:<a class="slurm_link" href="#pmix"></a></h3> |
| |
| <p>SELinux support is disabled by default and must be enabled at configure time. |
| It requires the libselinux1 library and development headers to build.</p> |
| |
| <pre>configure --enable-selinux</pre> |
| |
| <h2 id="SETUP">Setup<a class="slurm_link" href="#SETUP"></a></h2> |
| |
| <p>Once a version of Slurm that supports SELinux is installed, you will need to |
| enable and create a job_submit plugin that will perform verification of the |
| SELinux context, before passing it along to the slurmctld. At this time, there |
| is not a reliable and secure way to get/verify contexts internally so you MUST |
| create this script and perform verification in the job_submit plugin.</p> |
| |
| <p>Example:</p> |
| <pre> |
| function slurm_job_submit(job_desc, part_list, submit_uid) |
| if job_desc.req_context then |
| local element = 0 |
| for str in string.gmatch(job_desc.req_context, "([^:]+)") do |
| if element == 0 and str ~= "unconfined_u" then |
| slurm.log_user("Error: invalid SELinux context") |
| return slurm.ERROR |
| elseif element == 1 and str ~= "unconfined_r" then |
| slurm.log_user("Error: %s is not a valid SELinux role") |
| return slurm.ERROR |
| end |
| element = element + 1 |
| end |
| job_desc.selinux_context = job_desc.req_context |
| else |
| -- Force a specific context if one wasn't requested |
| job_desc.selinux_context = unconfined_u:unconfined_r:slurm_t:s0 |
| end |
| return slurm.SUCCESS |
| end |
| </pre> |
| |
| <p>Note that <b>job_desc.selinux_context</b> is set based on the contents of |
| <b>job_desc.req_context</b> if they are considered valid. |
| <b>job_desc.selinux_context</b> is what set the context that will be used.</p> |
| |
| <h2 id="INITIAL_TESTING">Initial Testing |
| <a class="slurm_link" href="#INITIAL_TESTING"></a> |
| </h2> |
| |
| <p>id is very useful for showing what context a user is currently in. As a test |
| to make sure that we are switching contexts, you can run a quick test with srun. |
| </p> |
| |
| <pre> |
| mcmult@master:~$ srun id |
| uid=1000(mcmult) gid=1000(mcmult) groups=1000(mcmult),27(sudo) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 |
| mcmult@master:~$ srun --context=unconfined_u:unconfined_r:unconfined_t:s0 id |
| uid=1000(mcmult) gid=1000(mcmult) groups=1000(mcmult),27(sudo) context=unconfined_u:unconfined_r:unconfined_t:s0 |
| </pre> |
| |
| <h2 id="ACCOUNTING">Accounting<a class="slurm_link" href="#ACCOUNTING"></a></h2> |
| |
| <p>There is currently no support for tracking the SELinux context in Slurm's |
| accounting. This may change as support evolves in future releases. |
| If you need to keep track of the SELinux Context, it is possible to store it in |
| the admin comment field as part of your job_submit plugin as is show in the |
| example below.</p> |
| |
| <p>Example:</p> |
| <pre> |
| function slurm_job_submit(job_desc, part_list, submit_uid) |
| if job_desc.req_context then |
| local element = 0 |
| for str in string.gmatch(job_desc.req_context, "([^:]+)") do |
| if element == 0 and str ~= "unconfined_u" then |
| slurm.log_user("Error: invalid SELinux context") |
| return slurm.ERROR |
| elseif element == 1 and str ~= "unconfined_r" then |
| slurm.log_user("Error: %s is not a valid SELinux role") |
| return slurm.ERROR |
| end |
| element = element + 1 |
| end |
| job_desc.selinux_context = job_desc.req_context |
| else |
| -- Force a specific context if one wasn't requested |
| job_desc.selinux_context = unconfined_u:unconfined_r:slurm_t:s0 |
| end |
| <b>job_desc.admin_comment = "SELinuxContext=" .. job_desc.selinux_context</b> |
| return slurm.SUCCESS |
| end |
| </pre> |
| |
| <p>Note the addition of setting "job_desc.admin_comment" before returning. This |
| will set the admin comment to show what context we will try to set for the job. |
| </p> |
| |
| <h2 id="NOTES">Notes<a class="slurm_link" href="#NOTES"></a></h2> |
| |
| <p>If you wish to use pam_slurm_adopt with SELinux, see the |
| <a href=pam_slurm_adopt.html>pam_slurm_adopt</a> documentation for hints on how |
| to get this working. Note that that when using this feature and |
| pam_slurm_adopt at the same time that the ssh session may not land in the same |
| context as the job.</p> |
| |
| <p style="text-align:center;">Last modified 22 September 2023</p> |
| |
| <!--#include virtual="footer.txt"--> |