This is a idea for a security. Our employees shall have access to some commands on a linux server but not all. They shall e.g. have the possibility to access a log file (less logfile
) or start different commands (shutdown.sh
/ run.sh
).
Background information:
All employees access the server with the same user name: Our product runs with "normal" user permissions, no "installation" is needed. Just unzip it in your user dir and run it. We manage several servers where our application is "installed". On every machine there is a user johndoe
. Our employees sometimes need access to the application on command line to access and check log files or to restart the application by hand. Only some people shall have full command line access.
We are using ppk authentication on the server.
It would be great if employee1 can only access the logfile and employee2 can also do X etc...
Solution:
As a solution I'll use the command
option as stated in the accepted answer. I'll make my own little shell script that will be the only file that can be executed for some employees. The script will offer several commands that can be executed, but no others. I'll use the following parameters in authorized_keys
from as stated here:
command="/bin/myscript.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty
ssh-dss AAAAB3....o9M9qz4xqGCqGXoJw= user@host
This is enough security for us. Thanks, community!
You should acquire `rssh', the restricted shell
You can follow the restriction guides mentioned above, they're all rather self-explanatory, and simple to follow. Understand the terms `chroot jail', and how to effectively implement sshd/terminal configurations, and so on.
Being as most of your users access your terminals via sshd, you should also probably look into sshd_conifg, the SSH daemon configuration file, to apply certain restrictions via SSH. Be careful, however. Understand properly what you try to implement, for the ramifications of incorrect configurations are probably rather dire.
Another way of looking at this is using POSIX ACLs, it needs to be supported by your file system, however you can have fine-grained tuning of all commands in linux the same way you have the same control on Windows (just without the nicer UI). link
Another thing to look into is PolicyKit.
You'll have to do quite a bit of googling to get everything working as this is definitely not a strength of Linux at the moment.
Google is our friend. Among the first hits:
HTH
Why don't you write your own login-shell? It would be quite simple to use Bash for this, but you can use any language.
Example in Bash
Use your favorite editor to create the file
/root/rbash.sh
(this can be any name or path, but should bechown root:root
andchmod 700
):All you have to do is set this executable as your login shell. For example, edit your
/etc/passwd
file, and replace your current login shell of that user/bin/bash
with/root/rbash.sh
.This is just a simple example, but you can make it as advanced as you want, the idea is there. Be careful to not lock yourself out by changing login shell of your own and only user. And always test weird symbols and commands to see if it is actually secure.
You can test it with:
su -s /root/rbash.sh
.Beware, make sure to match the whole command, and be careful with wildcards! Better exclude Bash-symbols such as
;
,&
,&&
,||
,$
, and backticks to be sure.Depending on the freedom you give the user, it won't get much safer than this. I've found that often I only needed to make a user that has access to only a few relevant commands, and in that case this is really the better solution. However, do you wish to give more freedom, a jail and permissions might be more appropriate. Mistakes are easily made, and only noticed when it's already too late.
ssh
follows thersh
tradition by using the user's shell program from the password file to execute commands.This means that we can solve this without involving
ssh
configuration in any way.If you don't want the user to be able to have shell access, then simply replace that user's shell with a script. If you look in
/etc/passwd
you will see that there is a field which assigns a shell command interpreter to each user. The script is used as the shell both for their interactive loginssh user@host
as well as for commandsssh user@host command arg ...
.Here is an example. I created a user
foo
whose shell is a script. The script prints the messagemy arguments are:
followed by its arguments (each on a separate line and in angle brackets) and terminates. In the log in case, there are no arguments. Here is what happens:If the user tries to run a command, it looks like this:
Our "shell" receives a
-c
style invocation, with the entire command as one argument, just the same way that/bin/sh
would receive it.So as you can see, what we can do now is develop the script further so that it recognizes the case when it has been invoked with a
-c
argument, and then parses the string (say by pattern matching). Those strings which are allowed can be passed to the real shell by recursively invoking/bin/bash -c <string>
. The reject case can print an error message and terminate (including the case when-c
is missing).You have to be careful how you write this. I recommend writing only positive matches which allow only very specific things, and disallow everything else.
Note: if you are
root
, you can still log into this account by overriding the shell in thesu
command, like thissu -s /bin/bash foo
. (Substitute shell of choice.) Non-root cannot do this.Here is an example script: restrict the user into only using
ssh
forgit
access to repositories under/git
.Of course, we are trusting that these Git programs
git-upload-pack
andgit-receive-pack
don't have holes or escape hatches that will give users access to the system.That is inherent in this kind of restriction scheme. The user is authenticated to execute code in a certain security domain, and we are kludging in a restriction to limit that domain to a subdomain. For instance if you allow a user to run the
vim
command on a specific file to edit it, the user can just get a shell with:!sh[Enter]
.What you are looking for is called Restricted Shell. Bash provides such a mode in which users can only execute commands present in their home directories (and they cannot move to other directories), which might be good enough for you.
I've found this thread to be very illustrative, if a bit dated.