Run command as not-root
Hi everyone
At work, I have to run a command in an AWS instance. In that particular instance only exists the root user. The command should not be executed with root privileges (it executes mpirun, which is not recommended to run as sudo or the machine might break), so I was wondering if there is a way to block or disable the sudo privileges while the command is running. As mentioned, the only user existing there is root, so I suppose “sudo -u” is not an option.
Does anyone know how to do it? Thanks in advance!
Forgot to mention that creating a new user brings a lot of problems because of how that machine is configured and all the tools that would need to be added the new user’s permission. In theory it would eventually work after some time working on it, but I’d like to know if there’s a way to do it without creating users (or if it’s impossible, so I can just go on with that only option)
@linux
You can run commands as the new user from the root account.
su -c 'command' username
Enter the password for the new user when prompted.
This way at least the main account is still root and the command is being run without root privileges on the new users account.
@Rustmilian yeah, already tried it. The problem is that all of the apps in the instance are only installed for the root user (e.g. python and all it’s libraries. So, when I use su -c all I get is a lot of command not found messages that would take a lot to solve. Besides I expect a lot more problems when the command needs access to some files and some processes (like a sql database) that would require me to do a lot of stuff to grant permissions to the new user. That would eventually work but given the work it requires I thought that some kind of “anti sudo” command or something like that could exist so I can still be the root user but pretend I am not a superadmin
There’s a source that says something about using the AWS Systems Manager Session Manager by ““Configuring the necessary IAM permissions for your user or role to access the instance using Session Manager 1
Open the AWS Systems Manager console, navigate to the “Session Manager” page, and select the instance you want to access
Click on the “Start session” button to initiate the session with the instance.
Once the session is established, you can run commands as the root user without the need for sudo””
I’m unsure if this achieves exactly what you need though.
@Rustmilian Just did that and that is exactly what I needed, but in this case it didn’t work. In this page https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-prerequisites.html they explain that what the manager does is creating another root account in the instance, and that new account is the one that can disable its own permissions. So, I ended up with the same problem of having to configure everything for the new user. However I’m done with the laziness and I’m gonna do it lol, everyone else pointed out that not having a regular user is a security issue and they are right. If I had configured the instance from the beginning with the SSM, I could have skipped all that work, but the reality is that I have to do it
After I’m done configuring everything, I think I’ll set up the rest of the instances to work with the SSM so that I don’t have to go through all that again
Thanks for the help!
There’s no way to run a command as another user if that user is not created.
https://linux.die.net/man/1/runuser
Edit:sudo is also an option but I like runuser for your use-case
@Oisteink in another comment (https://social.vivaldi.net/users/nirogu/statuses/111342629815373353) I explained why I’d prefer not to create another user, as it would require a lot of work to configure everything again for that command to work (it’s a big process). I was thinking of hiding my sudo permissions from the program or something like that, if possible, because many things in the instance are only configured to be used with the root user, even if they don’t require sudo. Anyway, I’m seeing that it might not be possible so creating a new user could be the only option 🙁
Read your other post and it seems to me that a rebuild of the system to accommodate non-root users would be my preferred solution. Trying to “work around“ issues like this are prone to break as the system is updated/changed. And you’re back to trying to figure out what’s changed and makes your script break.
@Oisteink yep, that seems the right thing to do. Honestly, most of the real problem was lazyness to reconfigure everything, and that’s why I published the question. But now I’m convinced that that’s the only way lol
Thanks for the help!
Laziness sparks innovation, and there could possibly be some other way to drop privileges. There’s loads of stuff I learn about Linux still - and my first install was summer 94
Keep at it!
You’re not wrong for trying to find another solution. Unfortunately, I think, in this case, your up against fundamental Linux permissions. One possibility would be running the work in a container with reduced capabilities but, it really is going to depend on what behaviors you’re trying to avoid.
Overall, it’s likely a better idea to re-install because noone should be running stuff directly as root in the majority of production scenarios.
Linux privilege only understands user id’s and group id’s. These are mapped through /etc/passwd and /etc/groups. You will see in passwd that the root user has UID 0. Any account you create with UID 0 will have root privileges. So running the command specifying any user with UID!=0 will run without those privileges.
It’s also possible to set user on execution with setuid - but that won’t work on scripts only binary executables.
https://en.wikipedia.org/wiki/Setuid
https://en.wikipedia.org/wiki/User_identifier
https://en.wikipedia.org/wiki/Group_identifier