Allowing web-user on apache server to run scripts as root
If you are new to this, you might be wondering, what the hell is a web user anyways?
So let’s say that you need a server which hosts a simple web page and does a particular task based on data entered into that web-page.
The normal way of doing this is to navigate to /var/www/html and place the web page you want to host here.
You also need to put your php script in this folder so that it is accessible from the website.
This php script will take in the data from your web-page and run the necessary commands that you need to be executed on the server.( I am assuming you are not using “The Real Dev Language” for now. :p )
I will be using a simple web page and script that I have made for this post.
This is basically a web page with some inputText widgets which accept response and send it to a php file named test.php on the server via an AJAX post.
This php script will call a bash script which in turns an email to me with the user’s timestamp as the subject.
Well, here is where the problem arises, as I am trying to run the bash file as root.
You might wonder as to why is this such a big issue?
Why can’t we do that?
Well, we can surely do that on the server but the point to be noted here is that we are not running this script directly from the server.
We are running it from a web page which is hosted on a server.
So our user here is a web user aka www-data rather than being a root user.
The web user is not provided root access by default, but there are ways to get this done.
Solution 1 :
Allow the web user to run only specific scripts as root.
Please note that this is not a ideal workaround.
Ideally your web user should not have root access in any case.
Since that’s cleared up, lets proceed.
This can be done by editing your sudoers list and adding www-data to it.
Open up your terminal and enter the following command.
Next up, navigate to the end of the file and add the following command there
www-data = (root) NOPASSWD: /path/to/script.sh
In case you have to execute one script as root which in turn executes some more scripts as root, you don’t need to set the path to all of them over here.
Doing it only for the parent script will do the job.
Solution 2 :
DigitalOcean blog has a very good article on how to execute python scripts as root via the web user through cgi.
You can go through the article here : https://www.digitalocean.com/community/tutorials/how-to-use-suexec-in-apache-to-run-cgi-scripts-on-an-ubuntu-vps
Well, that was all about my findings on properly handling sudo requirements for your web user on your apache server.
I’ll be adding more solutions as I find them along the way.
Meanwhile feel free to comment below your thoughts, suggestions and queries.