{"id":130143,"date":"2025-06-25T01:17:05","date_gmt":"2025-06-25T01:17:05","guid":{"rendered":"\/tutorials\/?p=130143"},"modified":"2026-03-10T09:26:16","modified_gmt":"2026-03-10T09:26:16","slug":"what-is-selinux","status":"publish","type":"post","link":"\/ca\/tutorials\/what-is-selinux","title":{"rendered":"What is SELinux? How does it enhance Linux security?"},"content":{"rendered":"<?xml encoding=\"utf-8\" ?><p>Security-Enhanced Linux (SELinux) is a security module that adds an extra layer of protection to your system. It enforces strict access control between processes and system resources, allowing only explicitly permitted actions.<\/p><p>SELinux helps maintain strong and reliable Linux server security by preventing unauthorized access and limiting the impact of compromised services.<\/p><p>This makes it especially useful for production-grade VPS setups or enterprise-scale deployments where strict policy enforcement is critical.<\/p><p>In this guide, you&rsquo;ll learn what SELinux is, how it works, how to configure it, and how to use it to secure your system effectively.<\/p><p>\n\n\n\n<\/p><h2 class=\"wp-block-heading\" id=\"h-what-is-selinux\"><strong>What is SELinux?<\/strong><\/h2><p>SELinux is a security module integrated into the Linux kernel that enforces access control policies to govern how processes interact with system resources.<\/p><p>The United States National Security Agency (NSA) developed SELinux and released it to the open-source community in 2000.<\/p><p>Its architecture is based on the Linux Security Modules (LSM) framework, which adds hooks to the kernel to enforce security decisions.<\/p><p>This setup lets SELinux intercept and evaluate access requests at the kernel level, so that every operation complies with the defined security policies.<\/p><p>SELinux is commonly used in Red Hat Enterprise Linux (RHEL), CentOS, Fedora, and other RHEL-based distros.<\/p><p>That&rsquo;s because these systems provide full support for SELinux, making it easier to configure and manage compared to Debian and its derivatives, which limit or don&rsquo;t enable SELinux support by default.<\/p><h3 class=\"wp-block-heading\" id=\"h-how-does-selinux-work\"><strong>How does SELinux work?<\/strong><\/h3><p>SELinux assigns a security context to every interaction between processes (subjects) and system resources (objects). Each security context includes details like the user, role, type, and, optionally, a sensitivity level.<\/p><p>When a process tries to access a resource, the SELinux policy engine checks the security contexts of both the subject and the object against the defined policy rules.<\/p><p>If the policy allows the action, SELinux grants access. If not, it blocks the action and &ndash; depending on the mode &ndash; logs the event to the audit log for review.<\/p><p>This mechanism ensures that processes run with only the minimum privileges they need, following the principle of least privilege. It maintains system integrity and reduces the risk of damage from compromised or misbehaving apps.<\/p><h3 class=\"wp-block-heading\" id=\"h-what-is-mandatory-access-control-mac-in-selinux\"><strong>What is mandatory access control (MAC) in SELinux?<\/strong><\/h3><p>Mandatory access control (MAC) is a security framework that enforces strict policies on how subjects, such as user apps or system services, interact with objects like files, directories, and network ports in a Linux system.<\/p><p>Unlike discretionary access control (DAC), where users can set permissions on the files they own, MAC policies are centrally defined and enforced by the system &ndash; meaning even privileged users can&rsquo;t override them.<\/p><p>For example, under DAC, a system administrator might accidentally grant a web server process read and write access to a sensitive configuration file.<\/p><p>With MAC in place, the SELinux policy can explicitly prevent that process from writing to system files, even if DAC permissions allow it.<\/p><p>In other words, if DAC and MAC rules conflict, SELinux applies the most restrictive rule. This strict control is one key reason why SELinux provides such a powerful layer of defense in Linux environments.<\/p><h3 class=\"wp-block-heading\" id=\"h-what-are-selinux-policies\"><strong>What are SELinux policies?<\/strong><\/h3><p>SELinux policies are collections of access rules that define the permissions granted to subjects over objects. These policies form the core of SELinux&rsquo;s implementation of MAC.<\/p><p>For example, a policy might allow a process labeled <strong>httpd_t<\/strong> to read files with the <strong>httpd_sys_content_t<\/strong> label but deny access to those marked as <strong>user_home_t<\/strong>.<\/p><p>Administrators typically write these policies in a specific policy language, and then compile them into a binary format that the SELinux kernel module can load and enforce.<\/p><p>They use tools like <strong>semanage<\/strong> to manage policy components, and <strong>audit2allow<\/strong> to generate custom policy modules based on audit logs.<\/p><p>These tools help tailor SELinux policies to meet the specific security requirements of different environments, ensuring both flexibility and strong system protection.<\/p><h3 class=\"wp-block-heading\" id=\"h-what-are-the-different-selinux-modes\"><strong>What are the different SELinux modes?<\/strong><\/h3><p>There are three different SELinux modes: <strong>enforcing<\/strong>, <strong>permissive<\/strong>, and <strong>disabled<\/strong>. Each mode dictates how security policies are applied on Linux systems.<\/p><p><strong>Enforcing mode<\/strong><\/p><p>In enforcing mode, SELinux actively applies its security policies. It blocks any action that violates the policy and logs a corresponding denial message. This mode provides the highest level of security and is recommended for production environments.<\/p><p>For instance, if a web server process tries to access a configuration file it shouldn&rsquo;t, SELinux in enforcing mode denies the access and logs the event &ndash; helping prevent potential security breaches.<\/p><p><strong>Permissive mode<\/strong><\/p><p>Permissive mode allows all actions, even those that violate SELinux policies, but logs any that would&rsquo;ve been denied in enforcing mode. This mode is helpful for troubleshooting and policy development, as it provides visibility without interference.<\/p><p>For example, when configuring a new app, an administrator switches SELinux to permissive mode to identify and adjust policy violations so that the final setup works smoothly without triggering enforcement issues.<\/p><p><strong>Disabled mode<\/strong><\/p><p>Disabled mode means SELinux is turned off entirely &ndash; no policies are enforced or logged. This mode is generally discouraged because it removes SELinux&rsquo;s added layer of protection.<\/p><p>Re-enabling SELinux after it has been disabled requires relabeling the file system to apply policies correctly.<\/p><p>A common use case for this mode is a system running legacy apps that are incompatible with SELinux. In such cases, an administrator temporarily disables SELinux, fully aware of the associated security risks.<\/p><h2 class=\"wp-block-heading\" id=\"h-how-to-configure-selinux\"><strong>How to configure SELinux?<\/strong><\/h2><p>To configure SELinux, start by opening a terminal app &ndash; you&rsquo;ll need it to run <a href=\"\/ca\/tutorials\/linux-commands\">Linux commands<\/a> and apply configuration changes. On a personal computer, simply power it on and launch the app.<\/p><p>If you use a virtual private server (VPS), you&rsquo;ll need SSH access to connect to your server. For <a href=\"\/ca\/vps\/centos-hosting\">Hostinger&rsquo;s CentOS hosting users<\/a>, find your SSH credentials by going to <strong>hPanel &rarr; VPS &rarr; Manage &rarr; Overview &rarr; VPS details<\/strong>.<\/p><div class=\"wp-block-image\"><figure data-wp-context='{\"imageId\":\"69e1f6ee723f6\"}' data-wp-interactive=\"core\/image\" class=\"aligncenter size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"406\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.hostinger.com\/tutorials\/wp-content\/uploads\/sites\/2\/2025\/06\/hpanel-vps-overview-vps-details-ssh-username-ipv4-highlighted-1024x406.png\" alt=\"The SSH credentials in hPanel's VPS Overview page\" class=\"wp-image-130144\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><button class=\"lightbox-trigger\" type=\"button\" aria-haspopup=\"dialog\" aria-label=\"Enlarge\" data-wp-init=\"callbacks.initTriggerButton\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-style--right=\"state.imageButtonRight\" data-wp-style--top=\"state.imageButtonTop\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewbox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\"><\/path>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure><\/div><p>Hostinger CentOS VPS users can also use the <strong>browser terminal<\/strong> feature, which lets you execute commands directly from a browser tab. This is especially useful if you don&rsquo;t have a terminal app installed or prefer not to use one.<\/p><p>To access it, hit the designated button in the top-right corner of your <strong>VPS Overview<\/strong> page.<\/p><div class=\"wp-block-image\"><figure data-wp-context='{\"imageId\":\"69e1f6ee749b2\"}' data-wp-interactive=\"core\/image\" class=\"aligncenter size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"366\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.hostinger.com\/tutorials\/wp-content\/uploads\/sites\/2\/2025\/06\/hpanel-vps-overview-browser-terminal-highlighted-1024x366.png\" alt=\"The Browser terminal button in hPanel's VPS Overview page\" class=\"wp-image-130145\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><button class=\"lightbox-trigger\" type=\"button\" aria-haspopup=\"dialog\" aria-label=\"Enlarge\" data-wp-init=\"callbacks.initTriggerButton\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-style--right=\"state.imageButtonRight\" data-wp-style--top=\"state.imageButtonTop\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewbox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\"><\/path>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure><\/div><p>Once everything is set up, you&rsquo;re ready to change SELinux modes and add custom policy modules to your system.<\/p><?xml encoding=\"utf-8\" ?><figure class=\"wp-block-image size-large\"><a class=\"hgr-tutorials-cta hgr-tutorials-cta-vps-hosting\" href=\"\/ca\/vps-hosting\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"300\" src=\"https:\/\/www.hostinger.com\/tutorials\/wp-content\/uploads\/sites\/2\/2023\/02\/VPS-hosting-banner-1024x300.png\" alt=\"\" class=\"wp-image-77934\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><h3 class=\"wp-block-heading\" id=\"h-how-to-set-selinux-modes\"><strong>How to set SELinux modes?<\/strong><\/h3><p>Let&rsquo;s go over how to check your system&rsquo;s current SELinux mode, change it temporarily for the current session, or set it permanently.<\/p><p><strong>Check the current SELinux mode<\/strong><\/p><p>Before making any changes, check the current SELinux mode:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">getenforce<\/pre><p>This command returns the current mode:<\/p><div class=\"wp-block-image\"><figure data-wp-context='{\"imageId\":\"69e1f6ee78979\"}' data-wp-interactive=\"core\/image\" class=\"aligncenter size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"980\" height=\"288\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.hostinger.com\/tutorials\/wp-content\/uploads\/sites\/2\/2025\/06\/terminal-getenforce-disabled.png\" alt=\"A terminal output shows the disabled SELinux mode\" class=\"wp-image-130146\"  sizes=\"auto, (max-width: 980px) 100vw, 980px\" \/><button class=\"lightbox-trigger\" type=\"button\" aria-haspopup=\"dialog\" aria-label=\"Enlarge\" data-wp-init=\"callbacks.initTriggerButton\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-style--right=\"state.imageButtonRight\" data-wp-style--top=\"state.imageButtonTop\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewbox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\"><\/path>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure><\/div><p><strong>Temporarily change SELinux mode<\/strong><\/p><p>You can switch the SELinux mode for the current session, but the chosen mode won&rsquo;t persist after a reboot.<\/p><ul class=\"wp-block-list\">\n<li>Set to permissive mode:<\/li>\n<\/ul><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo setenforce 0<\/pre><ul class=\"wp-block-list\">\n<li>Set to enforcing mode:<\/li>\n<\/ul><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo setenforce 1<\/pre><p><div><p class=\"important\"><strong>Important!<\/strong> You can&rsquo;t disable SELinux using the <strong>setenforce<\/strong> command. To disable it, you must edit the configuration file and reboot the system.<\/p><\/div>\n\n\n\n<\/p><p><strong>Permanently change SELinux mode<\/strong><\/p><p>If you want to make the change permanent, follow these steps:<\/p><ol class=\"wp-block-list\">\n<li>Open the SELinux configuration file using a text editor like <strong>vi<\/strong>:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo vi \/etc\/selinux\/config<\/pre><ol start=\"2\" class=\"wp-block-list\">\n<li>Press <strong>I<\/strong> to enter insert mode. Then, modify the SELINUX directive by replacing the existing value with your preferred mode:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># This file controls the state of SELinux on the system.\n# SELINUX= can take one of these three values:\n#     enforcing - SELinux security policy is enforced.\n#     permissive - SELinux prints warnings instead of enforcing.\n#     disabled - No SELinux policy is loaded.\n...\nSELINUX=enforcing<\/pre><div class=\"wp-block-image\"><figure data-wp-context='{\"imageId\":\"69e1f6ee7b65b\"}' data-wp-interactive=\"core\/image\" class=\"aligncenter size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"318\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.hostinger.com\/tutorials\/wp-content\/uploads\/sites\/2\/2025\/06\/terminal-vi-config-selinux-enforcing-highlighted-1024x318.png\" alt=\"The SELinux configuration file's directive value in the vi text editor\" class=\"wp-image-130147\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><button class=\"lightbox-trigger\" type=\"button\" aria-haspopup=\"dialog\" aria-label=\"Enlarge\" data-wp-init=\"callbacks.initTriggerButton\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-style--right=\"state.imageButtonRight\" data-wp-style--top=\"state.imageButtonTop\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewbox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\"><\/path>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure><\/div><ol start=\"3\" class=\"wp-block-list\">\n<li>Save your changes and exit <strong>vi<\/strong> by pressing <strong>Esc<\/strong>, typing <strong>:wq<\/strong>, and hitting <strong>Enter<\/strong>.<\/li>\n\n\n\n<li>Reboot the system to apply the new mode:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo reboot<\/pre><p>After rebooting, verify the new SELinux mode using the same <strong>getenforce<\/strong> command.<\/p><p><div class=\"protip\">\n                    <h4 class=\"title\">&#128161;Relabeling the file system<\/h4>\n                    <p>If SELinux was previously disabled and you&rsquo;re enabling it again, you need to relabel the file system to assign proper security contexts. To trigger a full relabel on the next reboot, run:<br>\n<strong>sudo touch \/.autorelabel<\/strong><br>\n<strong>sudo reboot<\/strong><\/p>\n                <\/div>\n\n\n\n<\/p><h3 class=\"wp-block-heading\" id=\"h-how-to-manage-selinux-policies\"><strong>How to manage SELinux policies?<\/strong><\/h3><p>You can manage SELinux policies by creating, editing, and loading policy modules to customize access controls for apps and services.<\/p><p>SELinux policies are modular, which means you can add or modify rules through individual policy modules without changing the entire policy set.<\/p><p><strong>Create a custom policy module<\/strong><\/p><p>When SELinux denies an action that should be permitted, you can generate a custom policy module to allow it:<\/p><ol class=\"wp-block-list\">\n<li>Check the audit log for denied operations:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo ausearch -m avc -ts recent<\/pre><p>This displays all access vector cache (AVC) denial messages from the audit log since the last boot.<\/p><div class=\"wp-block-image\"><figure data-wp-context='{\"imageId\":\"69e1f6ee7dd4c\"}' data-wp-interactive=\"core\/image\" class=\"aligncenter size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"181\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.hostinger.com\/tutorials\/wp-content\/uploads\/sites\/2\/2025\/06\/terminal-ausearch-avc-1024x181.png\" alt=\"A terminal output shows the AVC denial messages\" class=\"wp-image-130148\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><button class=\"lightbox-trigger\" type=\"button\" aria-haspopup=\"dialog\" aria-label=\"Enlarge\" data-wp-init=\"callbacks.initTriggerButton\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-style--right=\"state.imageButtonRight\" data-wp-style--top=\"state.imageButtonTop\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewbox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\"><\/path>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure><\/div><ol start=\"2\" class=\"wp-block-list\">\n<li>Use <strong>audit2allow<\/strong> to create a module based on all recent AVC denials. Replace <strong>my_custom_policy<\/strong> with a name of your choice:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo audit2allow -a -M my_custom_policy<\/pre><p>This command generates two files:<\/p><ul class=\"wp-block-list\">\n<li><strong>my_custom_policy.te<\/strong> &ndash; the source policy.<\/li>\n\n\n\n<li><strong>my_custom_policy.pp<\/strong> &ndash; the compiled module.<\/li>\n<\/ul><div class=\"wp-block-image\"><figure data-wp-context='{\"imageId\":\"69e1f6ee80765\"}' data-wp-interactive=\"core\/image\" class=\"aligncenter size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"286\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.hostinger.com\/tutorials\/wp-content\/uploads\/sites\/2\/2025\/06\/terminal-audit2allow-my-custom-policy-pp-1024x286.png\" alt=\"A terminal output shows the generated policy module\" class=\"wp-image-130149\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><button class=\"lightbox-trigger\" type=\"button\" aria-haspopup=\"dialog\" aria-label=\"Enlarge\" data-wp-init=\"callbacks.initTriggerButton\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-style--right=\"state.imageButtonRight\" data-wp-style--top=\"state.imageButtonTop\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewbox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\"><\/path>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure><\/div><ol start=\"3\" class=\"wp-block-list\">\n<li>Load the compiled module into SELinux:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo semodule -i my_custom_policy.pp<\/pre><p>After installation, the new rules take effect immediately, allowing the previously denied actions.<\/p><p><strong>Edit and manage policy modules<\/strong><\/p><p>To customize or refine policies further, edit the source policy file:<\/p><ol class=\"wp-block-list\">\n<li>Open <strong>my_custom_policy.te<\/strong> in <strong>vi<\/strong> and modify the rules:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo vi my_custom_policy.te<\/pre><p>Save your changes when you&rsquo;re done.<\/p><ol start=\"2\" class=\"wp-block-list\">\n<li>Convert the edited source into a module:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">checkmodule -M -m -o my_custom_policy.mod my_custom_policy.te<\/pre><ol start=\"3\" class=\"wp-block-list\">\n<li>Create a <strong>.pp<\/strong> file from the compiled module:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">semodule_package -o my_custom_policy.pp -m my_custom_policy.mod<\/pre><ol start=\"4\" class=\"wp-block-list\">\n<li>Install the updated module:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo semodule -i my_custom_policy.pp<\/pre><p><strong>Manage existing policy modules<\/strong><\/p><p>Use the <strong>semodule<\/strong> command to view or remove SELinux policy modules.<\/p><ul class=\"wp-block-list\">\n<li>List all installed modules:<\/li>\n<\/ul><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">semodule -l<\/pre><div class=\"wp-block-image\"><figure data-wp-context='{\"imageId\":\"69e1f6ee82f65\"}' data-wp-interactive=\"core\/image\" class=\"aligncenter size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"538\" height=\"1024\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.hostinger.com\/tutorials\/wp-content\/uploads\/sites\/2\/2025\/06\/terminal-semodule-538x1024.png\" alt=\"A terminal output shows the installed policy modules\" class=\"wp-image-130150\"  sizes=\"auto, (max-width: 538px) 100vw, 538px\" \/><button class=\"lightbox-trigger\" type=\"button\" aria-haspopup=\"dialog\" aria-label=\"Enlarge\" data-wp-init=\"callbacks.initTriggerButton\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-style--right=\"state.imageButtonRight\" data-wp-style--top=\"state.imageButtonTop\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewbox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\"><\/path>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure><\/div><ul class=\"wp-block-list\">\n<li>Remove a specific policy module:<\/li>\n<\/ul><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo semodule -r my_custom_policy<\/pre><h3 class=\"wp-block-heading\" id=\"h-what-tools-are-available-for-selinux-troubleshooting\"><strong>What tools are available for SELinux troubleshooting?<\/strong><\/h3><p>Several tools are available to diagnose and resolve SELinux denial issues. Two of the most commonly used are <strong>sealert<\/strong> and <strong>audit2allow<\/strong>.<\/p><p><strong>sealert: Analyze SELinux denials<\/strong><\/p><p>The <strong>sealert<\/strong> tool, part of the <strong>setroubleshoot<\/strong> package, provides human-readable summaries of SELinux denial messages. It interprets logs from <strong>\/var\/log\/audit\/audit.log<\/strong> and offers suggestions for resolving issues.<\/p><p>First, install <strong>setroubleshoot<\/strong> if it&rsquo;s not already installed:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo dnf install setroubleshoot<\/pre><p>Then, analyze recent SELinux denials:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo sealert -a \/var\/log\/audit\/audit.log<\/pre><div class=\"wp-block-image\"><figure data-wp-context='{\"imageId\":\"69e1f6ee85604\"}' data-wp-interactive=\"core\/image\" class=\"aligncenter size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"591\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.hostinger.com\/tutorials\/wp-content\/uploads\/sites\/2\/2025\/06\/terminal-sealert-audit-log-1024x591.png\" alt=\"A terminal output shows the recent SELinux denials from the audit log\" class=\"wp-image-130151\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><button class=\"lightbox-trigger\" type=\"button\" aria-haspopup=\"dialog\" aria-label=\"Enlarge\" data-wp-init=\"callbacks.initTriggerButton\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-style--right=\"state.imageButtonRight\" data-wp-style--top=\"state.imageButtonTop\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewbox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\"><\/path>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure><\/div><p>This scans the audit log and provides detailed information about denials, including possible solutions such as adjusting file contexts or enabling specific SELinux booleans.<\/p><p><strong>audit2allow: Generate custom policy modules<\/strong><\/p><p>When SELinux denies legitimate operations &ndash; and adjusting booleans or relabeling files isn&rsquo;t enough &ndash; <strong>audit2allow<\/strong> can help. It reads denial messages from the audit log and generates custom policy modules that allow specific actions.<\/p><p>    <p class=\"warning\">\n        <strong>Warning!<\/strong> Use <strong>audit2allow<\/strong> carefully. Automatically allowing all denied actions can introduce security vulnerabilities. Always review the generated policy file before installing it.    <\/p>\n    \n\n\n\n<\/p><p>You can generate a module by collecting AVC denial messages with <strong>ausearch<\/strong>, then passing them to <strong>audit2allow<\/strong> to create a custom policy module, as shown in the previous section.<\/p><p>Alternatively, combine it with the <a href=\"\/ca\/tutorials\/grep-command-in-linux\">grep command<\/a> to create a policy in one go:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo grep \"avc:  denied\"\/var\/log\/audit\/audit.log | audit2allow -M my_custom_policy<\/pre><p>This command filters denial messages using <strong>grep<\/strong>, then pipes them into <strong>audit2allow<\/strong>, which generates the policy module. Then, you can install the generated module as usual.<\/p><p><strong>Additional troubleshooting tips<\/strong><\/p><ul class=\"wp-block-list\">\n<li><strong>Check file contexts<\/strong> &ndash; incorrect file labeling is a common cause of denials. Use <strong>restorecon<\/strong> to reset file contexts:<\/li>\n<\/ul><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo restorecon -Rv \/path\/to\/directory<\/pre><ul class=\"wp-block-list\">\n<li><strong>Enable necessary booleans<\/strong> &ndash; some services require specific SELinux booleans to function properly. For example, to allow Apache to access user home directories:<\/li>\n<\/ul><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo setsebool -P httpd_enable_homedirs on<\/pre><ul class=\"wp-block-list\">\n<li><strong>Review audit logs manually<\/strong> &ndash; to inspect detailed logs directly:<\/li>\n<\/ul><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo less \/var\/log\/audit\/audit.log<\/pre><h2 class=\"wp-block-heading\" id=\"h-differences-between-selinux-and-apparmor\"><strong>Differences between SELinux and AppArmor<\/strong><\/h2><p>The main difference between these modules is that SELinux uses a label-based access control that assigns security contexts to every process and file, while AppArmor relies on a path-based model that applies policies to specific file paths.<\/p><p>Here&rsquo;s a comparison table to help you understand how these Linux security modules stack up:<\/p><figure tabindex=\"0\" class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Feature<\/strong><\/td><td><strong>SELinux<\/strong><\/td><td><strong>AppArmor<\/strong><\/td><\/tr><tr><td>Access control model<\/td><td>Label-based (uses security contexts)<\/td><td>Path-based (uses file paths)<\/td><\/tr><tr><td>Policy enforcement<\/td><td>Deny by default; requires explicit permissions<\/td><td>Allow by default; restricts using profile rules<\/td><\/tr><tr><td>Granularity<\/td><td>High; supports Multi-level security (MLS) and multi-category security (MCS)<\/td><td>Moderate; doesn&rsquo;t support MLS\/MCS<\/td><\/tr><tr><td>Ease of use<\/td><td>Complex; steeper learning curve<\/td><td>Easier to configure and manage<\/td><\/tr><tr><td>Default distros<\/td><td>RHEL, CentOS, Fedora<\/td><td>Ubuntu, Debian, SUSE<\/td><\/tr><tr><td>Tooling<\/td><td>Rich toolset, such as <strong>audit2allow<\/strong>, <strong>semanage<\/strong>, and <strong>sestatus<\/strong><\/td><td>Simpler toolset; profiles managed via flat files<\/td><\/tr><\/tbody><\/table><\/figure><p><strong>When to choose SELinux vs AppArmor?<\/strong><\/p><ul class=\"wp-block-list\">\n<li>Pick <strong>SELinux<\/strong> for fine-grained, enterprise-grade security with detailed policy control &ndash; especially in environments that require compliance, strict isolation, or MLS\/MCS, such as government, military, or large-scale enterprise systems running RHEL or CentOS.<\/li>\n\n\n\n<li>Go with <strong>AppArmor<\/strong> if you want a simpler, faster setup with easier profile management. It&rsquo;s ideal for development environments, cloud-based deployments, or Ubuntu\/Debian systems where usability and flexibility matter more than strict policy enforcement.<\/li>\n<\/ul><h2 class=\"wp-block-heading\" id=\"h-what-are-the-benefits-of-using-selinux\"><strong>What are the benefits of using SELinux?<\/strong><\/h2><p>The benefits of using SELinux are listed below:<\/p><ul class=\"wp-block-list\">\n<li><strong>Stronger system security<\/strong> &ndash; by implementing MAC, SELinux ensures that processes and users can access only the resources explicitly permitted by policy.<\/li>\n\n\n\n<li><strong>Granular access control<\/strong> &ndash; with its label-based system, SELinux lets administrators define fine-grained access permissions for files, processes, and other system resources.<\/li>\n\n\n\n<li><strong>Improved compliance<\/strong> &ndash; SELinux helps meet regulatory compliance requirements, such as PCI-DSS and HIPAA, by enforcing strict access controls and maintaining detailed audit logs.<\/li>\n\n\n\n<li><strong>Containment of compromised services<\/strong> &ndash; even if a service is compromised, SELinux limits potential damage by restricting the service&rsquo;s access to only what it truly needs.<\/li>\n\n\n\n<li><strong>Detailed auditing and logging<\/strong> &ndash; SELinux provides comprehensive logging of access attempts and policy violations, making it easier to monitor, troubleshoot, and conduct forensic analysis.<\/li>\n\n\n\n<li><strong>Flexible policy management<\/strong> &ndash; administrators can customize SELinux policies to meet specific organizational needs, supporting a wide range of operational requirements.<\/li>\n<\/ul><h2 class=\"wp-block-heading\" id=\"h-conclusion\"><strong>Conclusion<\/strong><\/h2><p>SELinux enforces strict access control on your Linux system through clearly defined policies and a label-based security model that assigns specific permissions to each process and resource based on context.<\/p><p>While configuration is a bit complex, the security benefits far outweigh the learning curve &ndash; especially in enterprise and VPS environments.<\/p><p>To further strengthen your system&rsquo;s security, review active SELinux booleans with <strong>getsebool -a<\/strong> and enable only those relevant to your setup.<\/p><p>You can also pair SELinux with tools like <strong>firewalld<\/strong> for network-level protection or <a href=\"\/ca\/tutorials\/fail2ban-configuration\">configure fail2ban<\/a> to block brute-force SSH attacks.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Security-Enhanced Linux (SELinux) is a security module that adds an extra layer of protection to your system. It enforces strict access control between processes and system resources, allowing only explicitly permitted actions. SELinux helps maintain strong and reliable Linux server security by preventing unauthorized access and limiting the impact of compromised services. This makes it [&#8230;]<\/p>\n<p><a class=\"btn btn-secondary understrap-read-more-link\" href=\"\/ca\/tutorials\/what-is-selinux\">Read More&#8230;<\/a><\/p>\n","protected":false},"author":411,"featured_media":139090,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"rank_math_title":"What is SELinux?","rank_math_description":"Learn what SELinux is, how it works, and why it\u2019s essential for Linux security. Explore its benefits, modes, policies, and setup tips.","rank_math_focus_keyword":"what is selinux","footnotes":""},"categories":[22703,22699],"tags":[],"class_list":["post-130143","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-managing-monitoring-and-security","category-vps"],"hreflangs":[{"locale":"en-US","link":"https:\/\/www.hostinger.com\/tutorials\/what-is-selinux","default":0},{"locale":"en-CA","link":"https:\/\/www.hostinger.com\/ca\/tutorials\/what-is-selinux","default":0},{"locale":"en-UK","link":"https:\/\/www.hostinger.com\/uk\/tutorials\/what-is-selinux","default":0},{"locale":"en-PH","link":"https:\/\/www.hostinger.com\/ph\/tutorials\/what-is-selinux","default":0},{"locale":"en-MY","link":"https:\/\/www.hostinger.com\/my\/tutorials\/what-is-selinux","default":0},{"locale":"en-IN","link":"https:\/\/www.hostinger.com\/in\/tutorials\/what-is-selinux","default":0},{"locale":"en-AU","link":"https:\/\/www.hostinger.com\/au\/tutorials\/what-is-selinux","default":0},{"locale":"en-NG","link":"https:\/\/www.hostinger.com\/ng\/tutorials\/what-is-selinux","default":0}],"_links":{"self":[{"href":"https:\/\/www.hostinger.com\/ca\/tutorials\/wp-json\/wp\/v2\/posts\/130143","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.hostinger.com\/ca\/tutorials\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hostinger.com\/ca\/tutorials\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hostinger.com\/ca\/tutorials\/wp-json\/wp\/v2\/users\/411"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hostinger.com\/ca\/tutorials\/wp-json\/wp\/v2\/comments?post=130143"}],"version-history":[{"count":6,"href":"https:\/\/www.hostinger.com\/ca\/tutorials\/wp-json\/wp\/v2\/posts\/130143\/revisions"}],"predecessor-version":[{"id":136975,"href":"https:\/\/www.hostinger.com\/ca\/tutorials\/wp-json\/wp\/v2\/posts\/130143\/revisions\/136975"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.hostinger.com\/ca\/tutorials\/wp-json\/wp\/v2\/media\/139090"}],"wp:attachment":[{"href":"https:\/\/www.hostinger.com\/ca\/tutorials\/wp-json\/wp\/v2\/media?parent=130143"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hostinger.com\/ca\/tutorials\/wp-json\/wp\/v2\/categories?post=130143"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hostinger.com\/ca\/tutorials\/wp-json\/wp\/v2\/tags?post=130143"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}