有时候想限制用户登陆系统后在shell中能使用的系统命令,普通的bash没有这些定制功能,听说360自己定制了bash,无奈咱暂时没那功底啊,不过前段时间偶然发现了lshell这个东西,是从free bsd上移植过来的,看了一下功能,完全就是我想要的东西啊,下面具体介绍一下这个东西怎么用
lshell提供了一个针对每个用户可配置的限制性shell,lshell的配置文件非常的简单,可以和ssh的authorized_keys或者/etc/shell、/etc/passwd耦合使用,lshell可以很容易的严格限制用户可以访问哪些命令
下面看看lshell的使用方法:
OPTIONS
--config <FILE>
指定配置文件
--log <DIR>
指定日志目录
--<param> <value>
param可以是配置文件中的任何一个参数
-h, --help
显示帮助信息
--version
显示版本信息
CONFIGURATION
你也可以在配置文件中对lshell进行配置:
On Linux -> /etc/lshell.conf
lshell的配置文件有四个小节:
[global] -> lshell的系统配置 (only 1)
[default] -> lshell的默认用户配置 (only 1)
[foo] -> 指定UNIX的系统用户"foo"的特别的配置
[grp:bar] -> 指定UNIX用户组"bar"的特别的配置
当加载参数的时候遵循以下顺序:
1- User configuration
2- Group configuration
3- Default configuration
[global]
logpath
日志路径 (默认是/var/log/lshell/)
loglevel
0, 1, 2, 3 or 4 (0: no logs -> 4: logs everything) 日志记录级别
logfilename
- 如果设置成syslog关键字,则表示日志记录到syslog中
- 如果设置成一个文件名, e.g. %u-%y%m%d (i.e foo-20091009.log):
%u -> username
%d -> day [1..31]
%m -> month [1..12]
%y -> year [00..99]
%h -> time [00:00..23:59]
syslogname
如果你打算记录进syslog中,则要设置你的syslog名称,默认是lshell
[default] 或者 [username] 或者 [grp:groupname] 三个小节可用的配置项
aliases
命令别名
allowed
一个允许执行的命令列表,或者设置成all,则允许在user PATH中的所有命令可用
allowed_cmd_path
一个路径组成的列表,所有在路径中的可执行文件都被允许
env_path
更新用户的环境变量PATH
env_vars
设置用户的环境变量
forbidden
一个非法字符或者命令组成的列表
history_file
history的文件名
%u -> username (e.g. '/home/%u/.lhistory')
history_size
history文件记录的maximum size (in lines)
home_path (deprecated)
默认是$HOME,不赞成使用,下一版会取消
%u -> username (e.g. '/home/%u')
intro
在登陆时打印出入门信息
login_script
用户登陆时执行的脚本
passwd
指定用户的密码 (default is empty)
path
严格限制用户可以去的地理位置,可以使用通配符list of path to restrict the user geographically. It is possible to use wildcards (e.g. '/var/log/ap*').
prompt
设置用户的prompt格式(default: username)
%u -> username
%h -> hostname
prompt_short
set sort prompt current directory update - set to 1 or 0 overssh list of command allowed to execute over ssh (e.g. rsync, rdiff-
backup, scp, etc.)
scp
允许或者禁止使用scp连接 - set to 1 or 0
scpforce
强制文件通过scp传输到一个特定目录
scp_download
设置成0,则禁止scp下载(default is 1)
scp_upload
设置成0,则禁止scp上传(default is 1)
sftp
允许或者禁止使用sftp连接 - set to 1 or 0
sudo_commands
一组命令组成的列表,用户可以执行sudo
timer
会话维持的秒数
strict
日志严格记录,如果设置成1,任何unknow的命令都被禁止,并且降低用户警告数,如果设置成0,unknow命令只是警告。 (i.e. *** unknown synthax)
warning_counter
警告次数,如果用户达到该警告次数,则会被强制退出lshell,设置成-1,则禁止计数。
SHELL BUILTIN COMMANDS
下面是一些lshell始终可用的命令:
clear
清屏
help, ?
打印可用命令
history
打印命令历史
lpath
列出所有允许和禁止的路径
lsudo
列出所有允许sudo的命令
EXAMPLES
$ lshell
default ${PREFIX}/etc/lshell.conf as configuration file.
$ lshell --config /path/to/myconf.file --log /path/to/mylog.log
USE CASE
User foo:
- must be able to access /usr and /var but not /usr/local
- user all command in his PATH but 'su'
- has a warning counter set to 5
- has his home path set to '/home/users'
User bar:
- must be able to access /etc and /usr but not /usr/local
- is allowed default commands plus 'ping' minus 'ls'
- strictness is set to 1 (meaning he is not allowed to type an unknown command)
In this case, my configuration file will look something like this:
# CONFIURATION START
[global]
logpath : /var/log/lshell/
loglevel : 2
[default]
allowed : ['ls','pwd']
forbidden : [';', '&', '|']
warning_counter : 2
timer : 0
path : ['/etc', '/usr']
env_path : ':/sbin:/usr/bin/'
scp : 1 # or 0
sftp : 1 # or 0
overssh : ['rsync','ls']
aliases : {'ls':'ls --color=auto','ll':'ls -l'}
[grp:users]
warning_counter : 5
overssh : - ['ls']
[foo]
allowed : 'all' - ['su']
path : ['/var', '/usr'] - ['/usr/local']
home_path : '/home/users'
[bar]
allowed : + ['ping'] - ['ls']
path : - ['/usr/local']
strict : 1
scpforce : '/home/bar/uploads/'
NOTES
为了记录用户日志,需要创建相关目录
# addgroup --system lshell
# mkdir /var/log/lshell
# chown :lshell /var/log/lshell
# chmod 770 /var/log/lshell
然后增加用户到lshell group:
# usermod -aG lshell user_name
改变用户默认shell,使用lshell作为默认shell:
On Linux:
# chsh -s /usr/bin/lshell user_name