{"id":2841,"date":"2014-04-13T15:40:29","date_gmt":"2014-04-13T15:40:29","guid":{"rendered":"http:\/\/blog.shineservers.com\/?p=2841"},"modified":"2014-04-13T15:40:29","modified_gmt":"2014-04-13T15:40:29","slug":"set-mod_security-apache-debianubuntu","status":"publish","type":"post","link":"https:\/\/www.shineservers.com\/2014\/04\/13\/set-mod_security-apache-debianubuntu\/","title":{"rendered":"How To Set Up mod_security with Apache on Debian\/Ubuntu"},"content":{"rendered":"<h2>Installing mod_security<\/h2>\n<hr \/>\n<p>Modsecurity is available in the Debian\/Ubuntu repository:<\/p>\n<pre><code>apt-get install libapache2-modsecurity\n<\/code><\/pre>\n<p>Verify if the mod_security module was loaded.<\/p>\n<pre><code>apachectl -M | grep --color security\n<\/code><\/pre>\n<p>You should see a module named\u00a0<code>security2_module (shared)<\/code>\u00a0which indicates that the module was loaded.<\/p>\n<p>Modsecurity&#8217;s installation includes a recommended configuration file which has to be renamed:<\/p>\n<pre><code>mv \/etc\/modsecurity\/modsecurity.conf{-recommended,}\n<\/code><\/pre>\n<p>Reload Apache<\/p>\n<pre><code>service apache2 reload\n<\/code><\/pre>\n<p>You&#8217;ll find a new log file for mod_security in the Apache log directory:<\/p>\n<pre><code>root@droplet:~# ls -l \/var\/log\/apache2\/modsec_audit.log\n-rw-r----- 1 root root 0 Oct 19 08:08 \/var\/log\/apache2\/modsec_audit.log\n<\/code><\/pre>\n<div data-unique=\"Configuringmod_security\"><\/div>\n<h2>Configuring mod_security<\/h2>\n<hr \/>\n<p>Out of the box, modsecurity doesn&#8217;t do anything as it needs rules to work. The default configuration file is set to\u00a0DetectionOnly\u00a0which logs requests according to rule matches and doesn&#8217;t block anything. This can be changed by editing the\u00a0<code>modsecurity.conf<\/code>\u00a0file:<\/p>\n<pre><code>nano \/etc\/modsecurity\/modsecurity.conf\n<\/code><\/pre>\n<p>Find this line<\/p>\n<pre><code>SecRuleEngine DetectionOnly\n<\/code><\/pre>\n<p>and change it to:<\/p>\n<pre><code>SecRuleEngine On\n<\/code><\/pre>\n<p>If you&#8217;re trying this out on a production server, change this directive only after testing all your rules.<\/p>\n<p>Another directive to modify is\u00a0<code>SecResponseBodyAccess<\/code>. This configures whether response bodies are buffered (i.e. read by modsecurity). This is only neccessary if data leakage detection and protection is required. Therefore, leaving it\u00a0<em>On<\/em>\u00a0will use up droplet resources and also increase the logfile size.<\/p>\n<p>Find this<\/p>\n<pre><code>SecResponseBodyAccess On\n<\/code><\/pre>\n<p>and change it to:<\/p>\n<pre><code>SecResponseBodyAccess Off\n<\/code><\/pre>\n<p>Now we&#8217;ll limit the maximum data that can be posted to your web application. Two directives configure these:<\/p>\n<pre><code>SecRequestBodyLimit\nSecRequestBodyNoFilesLimit\n<\/code><\/pre>\n<p>The\u00a0<code>SecRequestBodyLimit<\/code>\u00a0directive specifies the maximum POST data size. If anything larger is sent by a client the server will respond with a\u00a0413 Request Entity Too Large\u00a0error. If your web application doesn&#8217;t have any file uploads this value can be greatly reduced.<\/p>\n<p>The value mentioned in the configuration file is<\/p>\n<pre><code>SecRequestBodyLimit 13107200\n<\/code><\/pre>\n<p>which is 12.5MB.<\/p>\n<p>Similar to this is the\u00a0<code>SecRequestBodyNoFilesLimit<\/code>\u00a0directive. The only difference is that this directive limits the size of POST data minus file uploads&#8211; this value should be &#8220;as low as practical.&#8221;<\/p>\n<p>The value in the configuration file is<\/p>\n<pre><code>SecRequestBodyNoFilesLimit 131072\n<\/code><\/pre>\n<p>which is 128KB.<\/p>\n<p>Along the lines of these directives is another one which affects server performance:\u00a0<code>SecRequestBodyInMemoryLimit<\/code>. This directive is pretty much self-explanatory; it specifies how much of &#8220;request body&#8221; data (POSTed data) should be kept in the memory (RAM), anything more will be placed in the hard disk (just like\u00a0swapping). Since droplets use SSDs, this is not much of an issue; however, this can be set a decent value if you have RAM to spare.<\/p>\n<pre><code>SecRequestBodyInMemoryLimit 131072\n<\/code><\/pre>\n<p>This is the value (128KB) specified in the configuration file.<\/p>\n<div data-unique=\"TestingSQLInjection\"><\/div>\n<h2>Testing SQL Injection<\/h2>\n<hr \/>\n<p>Before going ahead with configuring rules, we will create a PHP script which is vulnerable to SQL injection and try it out. Please note that this is just a basic\u00a0PHP login script\u00a0with no session handling. Be sure to change the MySQL password in the script below so that it will connect to the database:<\/p>\n<p><code>\/var\/www\/login.php<\/code><\/p>\n<pre><code>&lt;html&gt;\n&lt;body&gt;\n&lt;?php\n    if(isset($_POST['login']))\n    {\n        $username = $_POST['username'];\n        $password = $_POST['password'];\n        $con = mysqli_connect('localhost','root','password','sample');\n        $result = mysqli_query($con, \"SELECT * FROM `users` WHERE username='$username' AND password='$password'\");\n        if(mysqli_num_rows($result) == 0)\n            echo 'Invalid username or password';\n        else\n            echo '&lt;h1&gt;Logged in&lt;\/h1&gt;&lt;p&gt;A Secret for you....&lt;\/p&gt;';\n    }\n    else\n    {\n?&gt;\n        &lt;form action=\"\" method=\"post\"&gt;\n            Username: &lt;input type=\"text\" name=\"username\"\/&gt;&lt;br \/&gt;\n            Password: &lt;input type=\"password\" name=\"password\"\/&gt;&lt;br \/&gt;\n            &lt;input type=\"submit\" name=\"login\" value=\"Login\"\/&gt;\n        &lt;\/form&gt;\n&lt;?php\n    }\n?&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;\n<\/code><\/pre>\n<p>This script will display a login form. Entering the right credentials will display a message &#8220;A Secret for you.&#8221;<\/p>\n<p>We need credentials in the database. Create a MySQL database and a table, then insert usernames and passwords.<\/p>\n<pre><code>mysql -u root -p\n<\/code><\/pre>\n<p>This will take you to the\u00a0<code>mysql&gt;<\/code>\u00a0prompt<\/p>\n<pre><code>create database sample;\nconnect sample;\ncreate table users(username VARCHAR(100),password VARCHAR(100));\ninsert into users values('jesin','pwd');\ninsert into users values('alice','secret');\nquit;\n<\/code><\/pre>\n<p>Open your browser, navigate to\u00a0<code>http:\/\/yourwebsite.com\/login.php<\/code>\u00a0and enter the right pair of credentials.<\/p>\n<pre><code>Username: jesin\nPassword: pwd\n<\/code><\/pre>\n<p>You&#8217;ll see a message that indicates successful login. Now come back and enter a wrong pair of credentials&#8211; you&#8217;ll see the message\u00a0Invalid username or password.<\/p>\n<p>We can confirm that the script works right. The next job is to try our hand with SQL injection to bypass the login page. Enter the following for the\u00a0usernamefield:<\/p>\n<pre><code>' or true -- \n<\/code><\/pre>\n<p>Note that there should be a space after\u00a0<code>--<\/code>\u00a0this injection won&#8217;t work without that space. Leave the\u00a0password\u00a0field empty and hit the login button.<\/p>\n<p>Voila! The script shows the message meant for authenticated users.<\/p>\n<div data-unique=\"SettingUpRules\"><\/div>\n<h2>Setting Up Rules<\/h2>\n<hr \/>\n<p>To make your life easier, there are a lot of rules which are already installed along with mod_security. These are called CRS (Core Rule Set) and are located in<\/p>\n<pre><code>root@droplet:~# ls -l \/usr\/share\/modsecurity-crs\/\ntotal 40\ndrwxr-xr-x 2 root root  4096 Oct 20 09:45 activated_rules\ndrwxr-xr-x 2 root root  4096 Oct 20 09:45 base_rules\ndrwxr-xr-x 2 root root  4096 Oct 20 09:45 experimental_rules\ndrwxr-xr-x 2 root root  4096 Oct 20 09:45 lua\n-rw-r--r-- 1 root root 13544 Jul  2  2012 modsecurity_crs_10_setup.conf\ndrwxr-xr-x 2 root root  4096 Oct 20 09:45 optional_rules\ndrwxr-xr-x 3 root root  4096 Oct 20 09:45 util\n<\/code><\/pre>\n<p>The documentation is available at<\/p>\n<pre><code>root@droplet1:~# ls -l \/usr\/share\/doc\/modsecurity-crs\/\ntotal 40\n-rw-r--r-- 1 root root   469 Jul  2  2012 changelog.Debian.gz\n-rw-r--r-- 1 root root 12387 Jun 18  2012 changelog.gz\n-rw-r--r-- 1 root root  1297 Jul  2  2012 copyright\ndrwxr-xr-x 3 root root  4096 Oct 20 09:45 examples\n-rw-r--r-- 1 root root  1138 Mar 16  2012 README.Debian\n-rw-r--r-- 1 root root  6495 Mar 16  2012 README.gz\n<\/code><\/pre>\n<p>To load these rules, we need to tell Apache to look into these directories. Edit the\u00a0<code>mod-security.conf<\/code>\u00a0file.<\/p>\n<pre><code>nano \/etc\/apache2\/mods-enabled\/mod-security.conf\n<\/code><\/pre>\n<p>Add the following directives inside\u00a0<code>&lt;IfModule security2_module&gt; &lt;\/IfModule&gt;<\/code>:<\/p>\n<pre><code>Include \"\/usr\/share\/modsecurity-crs\/*.conf\"\nInclude \"\/usr\/share\/modsecurity-crs\/activated_rules\/*.conf\"\n<\/code><\/pre>\n<p>The\u00a0<code>activated_rules<\/code>\u00a0directory is similar to Apache&#8217;s\u00a0<code>mods-enabled<\/code>\u00a0directory. The rules are available in directories:<\/p>\n<pre><code>\/usr\/share\/modsecurity-crs\/base_rules\n\/usr\/share\/modsecurity-crs\/optional_rules\n\/usr\/share\/modsecurity-crs\/experimental_rules\n<\/code><\/pre>\n<p>Symlinks must be created inside the\u00a0<code>activated_rules<\/code>\u00a0directory to activate these. Let us activate the SQL injection rules.<\/p>\n<pre><code>cd \/usr\/share\/modsecurity-crs\/activated_rules\/\nln -s \/usr\/share\/modsecurity-crs\/base_rules\/modsecurity_crs_41_sql_injection_attacks.conf .\n<\/code><\/pre>\n<p>Apache has to be reloaded for the rules to take effect.<\/p>\n<pre><code>service apache2 reload\n<\/code><\/pre>\n<p>Now open the login page we created earlier and try using the SQL injection query on the username field. If you had changed the\u00a0<code>SecRuleEngine<\/code>\u00a0directive toOn, you&#8217;ll see a\u00a0403 Forbidden\u00a0error. If it was left to the\u00a0DetectionOnly\u00a0option, the injection will be successful but the attempt would be logged in the\u00a0<code>modsec_audit.log<\/code>\u00a0file.<\/p>\n<div data-unique=\"WritingYourOwnmod_securityRules\"><\/div>\n<h2>Writing Your Own mod_security Rules<\/h2>\n<hr \/>\n<p>In this section, we&#8217;ll create a rule chain which blocks the request if certain &#8220;spammy&#8221; words are entered in a HTML form. First, we&#8217;ll create a PHP script which gets the input from a textbox and displays it back to the user.<\/p>\n<p><code>\/var\/www\/form.php<\/code><\/p>\n<pre><code>&lt;html&gt;\n    &lt;body&gt;\n        &lt;?php\n            if(isset($_POST['data']))\n                echo $_POST['data'];\n            else\n            {\n        ?&gt;\n                &lt;form method=\"post\" action=\"\"&gt;\n                        Enter something here:&lt;textarea name=\"data\"&gt;&lt;\/textarea&gt;\n                        &lt;input type=\"submit\"\/&gt;\n                &lt;\/form&gt;\n        &lt;?php\n            }\n        ?&gt;\n    &lt;\/body&gt;\n&lt;\/html&gt;\n<\/code><\/pre>\n<p>Custom rules can be added to any of the configuration files or placed in modsecurity directories. We&#8217;ll place our rules in a separate new file.<\/p>\n<pre><code>nano \/etc\/modsecurity\/modsecurity_custom_rules.conf\n<\/code><\/pre>\n<p>Add the following to this file:<\/p>\n<pre><code>SecRule REQUEST_FILENAME \"form.php\" \"id:'400001',chain,deny,log,msg:'Spam detected'\"\nSecRule REQUEST_METHOD \"POST\" chain\nSecRule REQUEST_BODY \"@rx (?i:(pills|insurance|rolex))\"\n<\/code><\/pre>\n<p>Save the file and reload Apache. Open\u00a0<code>http:\/\/yourwebsite.com\/form.php<\/code>\u00a0in the browser and enter text containing any of these words: pills, insurance, rolex.<\/p>\n<p>You&#8217;ll either see a 403 page and a log entry or only a log entry based on\u00a0<code>SecRuleEngine<\/code>\u00a0setting. The syntax for\u00a0SecRule\u00a0is<\/p>\n<pre><code>SecRule VARIABLES OPERATOR [ACTIONS]\n<\/code><\/pre>\n<p>Here we used the\u00a0chain\u00a0action to match variables\u00a0REQUEST_FILENAME\u00a0withform.php,\u00a0REQUEST_METHOD\u00a0with\u00a0POST\u00a0and\u00a0REQUEST_BODY\u00a0with the regular expression (@rx) string\u00a0(pills|insurance|rolex). The\u00a0?i:\u00a0does a case insensitive match. On a successful match of all these three rules, the\u00a0<em>ACTION<\/em>is to\u00a0deny\u00a0and\u00a0log\u00a0with the msg &#8220;Spam detected.&#8221; The\u00a0<em>chain<\/em>\u00a0action simulates the logical AND to match all the three rules.<\/p>\n<div data-unique=\"ExcludingHostsandDirectories\"><\/div>\n<h2>Excluding Hosts and Directories<\/h2>\n<hr \/>\n<p>Sometimes it makes sense to exclude a particular directory or a domain name if it is running an application like\u00a0phpMyAdmin\u00a0as modsecurity and will block SQL queries. It is also better to exclude admin backends of CMS applications like WordPress.<\/p>\n<p>To disable modsecurity for a complete VirtualHost place the following<\/p>\n<pre><code>&lt;IfModule security2_module&gt;\n    SecRuleEngine Off\n&lt;\/IfModule&gt;\n<\/code><\/pre>\n<p>inside the\u00a0<code>&lt;VirtualHost&gt;<\/code>\u00a0section.<\/p>\n<p>For a particular directory:<\/p>\n<pre><code>&lt;Directory \"\/var\/www\/wp-admin\"&gt;\n    &lt;IfModule security2_module&gt;\n        SecRuleEngine Off\n    &lt;\/IfModule&gt;\n&lt;\/Directory&gt;\n<\/code><\/pre>\n<p>If you don&#8217;t want to completely disable modsecurity, use the\u00a0<code>SecRuleRemoveById<\/code>\u00a0directive to remove a particular rule or rule chain by specifying its ID.<\/p>\n<pre><code>&lt;LocationMatch \"\/wp-admin\/update.php\"&gt;\n    &lt;IfModule security2_module&gt;\n        SecRuleRemoveById 981173\n    &lt;\/IfModule&gt;\n&lt;\/LocationMatch&gt;\n<\/code><\/pre>\n<div data-unique=\"FurtherReading\"><\/div>\n<h2>Further Reading<\/h2>\n<hr \/>\n<p>Official modsecurity documentation<a href=\"https:\/\/github.com\/SpiderLabs\/ModSecurity\/wiki\/Reference-Manual\">https:\/\/github.com\/SpiderLabs\/ModSecurity\/wiki\/Reference-Manual<\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h3 class=\"zemanta-related-title\" style=\"margin: 0 0 10px 0; padding: 0; clear: both;\">Related articles across the web<\/h3>\n<ul class=\"zemanta-article-ul zemanta-article-ul-image\" style=\"margin: 0; padding: 0; overflow: hidden;\">\n<li class=\"zemanta-article-ul-li-image zemanta-article-ul-li\" style=\"padding: 0; background: none; list-style: none; display: block; float: left; vertical-align: top; text-align: left; width: 104px; font-size: 12px; margin: 0 5px 10px 0;\"><a style=\"padding: 2px; display: block; text-decoration: none;\" href=\"http:\/\/blog.shineservers.com\/protect-apache-using-mod_security-on-rhelcentos-fedora\/\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" style=\"border-radius: 3px; box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); padding: 0; margin: 0; border: 0; display: block; width: 100px; max-width: 100%;\" alt=\"\" src=\"http:\/\/i.zemanta.com\/239656353_150_150.jpg\" \/><\/a><a style=\"display: block; overflow: hidden; text-decoration: none; line-height: 12pt; height: 80px; padding: 5px 2px 0 2px;\" href=\"http:\/\/blog.shineservers.com\/protect-apache-using-mod_security-on-rhelcentos-fedora\/\" target=\"_blank\" rel=\"noopener noreferrer\">Protect Apache using Mod_Security on RHEL\/CentOS &amp; Fedora<\/a><\/li>\n<li class=\"zemanta-article-ul-li-image zemanta-article-ul-li\" style=\"padding: 0; background: none; list-style: none; display: block; float: left; vertical-align: top; text-align: left; width: 104px; font-size: 12px; margin: 0 5px 10px 0;\"><a style=\"padding: 2px; display: block; text-decoration: none;\" href=\"http:\/\/blog.shineservers.com\/protect-apache-using-mod_evasive-rhelcentos-fedora\/\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" style=\"border-radius: 3px; box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); padding: 0; margin: 0; border: 0; display: block; width: 100px; max-width: 100%;\" alt=\"\" src=\"http:\/\/i.zemanta.com\/239656351_150_150.jpg\" \/><\/a><a style=\"display: block; overflow: hidden; text-decoration: none; line-height: 12pt; height: 80px; padding: 5px 2px 0 2px;\" href=\"http:\/\/blog.shineservers.com\/protect-apache-using-mod_evasive-rhelcentos-fedora\/\" target=\"_blank\" rel=\"noopener noreferrer\">Protect Apache using Mod_evasive on RHEL\/CentOS &amp; Fedora<\/a><\/li>\n<li class=\"zemanta-article-ul-li-image zemanta-article-ul-li\" style=\"padding: 0; background: none; list-style: none; display: block; float: left; vertical-align: top; text-align: left; width: 104px; font-size: 12px; margin: 0 5px 10px 0;\"><a style=\"padding: 2px; display: block; text-decoration: none;\" href=\"http:\/\/blog.shineservers.com\/set-multiple-ssl-certificates-one-ip-apache-ubuntu-12-04\/\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" style=\"border-radius: 3px; box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); padding: 0; margin: 0; border: 0; display: block; width: 100px; max-width: 100%;\" alt=\"\" src=\"http:\/\/i.zemanta.com\/232740919_150_150.jpg\" \/><\/a><a style=\"display: block; overflow: hidden; text-decoration: none; line-height: 12pt; height: 80px; padding: 5px 2px 0 2px;\" href=\"http:\/\/blog.shineservers.com\/set-multiple-ssl-certificates-one-ip-apache-ubuntu-12-04\/\" target=\"_blank\" rel=\"noopener noreferrer\">How To Set Up Multiple SSL Certificates on One IP with Apache on Ubuntu 12.04<\/a><\/li>\n<li class=\"zemanta-article-ul-li-image zemanta-article-ul-li\" style=\"padding: 0; background: none; list-style: none; display: block; float: left; vertical-align: top; text-align: left; width: 104px; font-size: 12px; margin: 0 5px 10px 0;\"><a style=\"padding: 2px; display: block; text-decoration: none;\" href=\"http:\/\/blog.shineservers.com\/use-nginx-reverse-proxy-server\/\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" style=\"border-radius: 3px; box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); padding: 0; margin: 0; border: 0; display: block; width: 100px; max-width: 100%;\" alt=\"\" src=\"http:\/\/i.zemanta.com\/262894551_150_150.jpg\" \/><\/a><a style=\"display: block; overflow: hidden; text-decoration: none; line-height: 12pt; height: 80px; padding: 5px 2px 0 2px;\" href=\"http:\/\/blog.shineservers.com\/use-nginx-reverse-proxy-server\/\" target=\"_blank\" rel=\"noopener noreferrer\">How To Use Nginx As Reverse Proxy Server<\/a><\/li>\n<li class=\"zemanta-article-ul-li-image zemanta-article-ul-li\" style=\"padding: 0; background: none; list-style: none; display: block; float: left; vertical-align: top; text-align: left; width: 104px; font-size: 12px; margin: 0 5px 10px 0;\"><a style=\"padding: 2px; display: block; text-decoration: none;\" href=\"http:\/\/blog.shineservers.com\/linux-static-ip-address-configuration\/\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" style=\"border-radius: 3px; box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); padding: 0; margin: 0; border: 0; display: block; width: 100px; max-width: 100%;\" alt=\"\" src=\"http:\/\/i.zemanta.com\/253498455_150_150.jpg\" \/><\/a><a style=\"display: block; overflow: hidden; text-decoration: none; line-height: 12pt; height: 80px; padding: 5px 2px 0 2px;\" href=\"http:\/\/blog.shineservers.com\/linux-static-ip-address-configuration\/\" target=\"_blank\" rel=\"noopener noreferrer\">Linux Static IP Address Configuration<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Installing mod_security Modsecurity is available in the Debian\/Ubuntu repository: apt-get install libapache2-modsecurity Verify if the mod_security module was loaded. apachectl -M | grep &#8211;color security You should see a module named\u00a0security2_module (shared)\u00a0which indicates that the module was loaded. Modsecurity&#8217;s installation includes a recommended configuration file which has to be renamed: mv \/etc\/modsecurity\/modsecurity.conf{-recommended,} Reload Apache service [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[60],"tags":[202],"class_list":["post-2841","post","type-post","status-publish","format-standard","hentry","category-linux","tag-how-to-install-mod_security-on-ubuntu-12-04"],"acf":[],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.shineservers.com\/wp-json\/wp\/v2\/posts\/2841","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.shineservers.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.shineservers.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.shineservers.com\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.shineservers.com\/wp-json\/wp\/v2\/comments?post=2841"}],"version-history":[{"count":0,"href":"https:\/\/www.shineservers.com\/wp-json\/wp\/v2\/posts\/2841\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.shineservers.com\/wp-json\/wp\/v2\/media?parent=2841"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.shineservers.com\/wp-json\/wp\/v2\/categories?post=2841"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.shineservers.com\/wp-json\/wp\/v2\/tags?post=2841"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}