用lshell实现堡垒机(跳转机)功能

写一下怎么利用lshell这个工具把一台Linux系统变成一台堡垒机(跳转机)。

一、跳转机的基本功能

1、多用户权限管理 2、限制登录用户所处的目录 3、限制登录用户能使用的命令 4、记录登录用户执行的命令

基本上在堡垒机上只要能执行ls、scp、ssh、passwd等几个命令就行。

准备一台Linux服务器安装lshell工具,添加受限用户组和用户,设置好能执行的命令,做为堡垒机使用,然后在其它服务器上在/etc/hosts.allow中设置只能从这台堡垒机服务器上远程登录。

二、安装和启用lshell

2.1、安装Linux系统

可以安装一个最简单的CentOS系统,多余的东西都不要安装,后面需要什么再安装什么。 安装完,可以加强这台服务器的安全设置,可以禁用或删除各种不需要的服务、文件。 开防火墙 开SELinux

2.2 安装lshell工具

如果堡垒机没有联网,可以从别的地方下载安装文件,再复制过来。 文章后有提供下载地址。 如果是CentOS7,需要先安装一下依赖软件

#yum install *ncurses*
#pip install readline

#git clone https://github.com/ghantoos/lshell.git
#cd lshell
#python setup.py install

如果没报错,即安装完成。 可以直接执行lshell命令确认:

# lshell
You are in a limited shell.
Type '?' or 'help' to get the list of allowed commands
root:~$ 

出现上面的提示,说明安装成功。 如果有出现提示找不到lshell.conf文件时,我们需要把/etc/lshell.conf做个软链接过去。 FileNotFoundError: [Errno 2] No such file or directory: ‘/usr/local/python/etc/lshell.conf’ 做个软链接:

# mkdir /usr/local/python/etc/
#ln -s /etc/lshell.conf /usr/local/python/etc/lshell.conf

查看lshell安装后的路径,后面创建受限用户时需要:

#which lshell
/usr/bin/lshell

2.3 创建受限账号

根据不同的岗位创建不同用户组、不同的用户,每个人一个账号。 创建三个用户组: admin:运维人员 dba:数据库人员 web:开发

#groupadd admin
#groupadd dba
#groupadd web

创建受限用户: 根据不同用户的职责划分给不同的组中,并且可以在这里指定默认的shell为lshell

#useradd -g admin -s /usr/bin/lshell user1
#useradd -g dba -s /usr/bin/lshell user2
#useradd -g web -s /usr/bin/lshell user3

也可以在创建用户后,修改用户默认的shell 只有改变用户默认的shell,才能使lshell对用户生效。 直接修改/etc/passwd: user_name:x:504:504::/home/user_name:/bin/bash 把用户最后的/bin/bash修改成/usr/bin/lshell 或者使用chsh命令: # chsh -s /usr/bin/lshell user_name

三、配置lshell

3.1 开启日志

为了记录用户日志,需要创建相关目录 创建一个名为lshell的用户组 # groupadd lshell 创建保存日志的路径

# mkdir /var/log/lshell
# chown :lshell /var/log/lshell
# chmod 770 /var/log/lshell

把受限用户全部加到lshell这个组中: # usermod -aG lshell user_name

3.2 配置lshell.conf

通过配置lshell.conf这个文件,可以限制受限用户能执行哪些命令,不能执行哪些命令,能限制进入哪些目录中等。 /etc/lshell.conf中可以设置四个字段:

[global] -> lshell的系统配置,针对所有用户
[default] -> lshell的默认用户配置,针对所有用户
[user] -> 只针对某一个系统用户进行的特别配置
[grp:bar] -> 针对系统某一个用户组”bar”进行的特别配置

lshell.conf中默认只有[global]和[default]这两个字段,这两个字段中的配置是针对所有用户的,没办法区分不同的组。如果想根据不同的组进行设置,就需要根据组来进行设置。 1、开启日志:(在[global]段中进行设置)

[global]
logpath         : /var/log/lshell/
loglevel        : 4
logfilename     : %u-%y%m%d

受限用户登录后,所做的操作都会有记录

# cat /var/log/lshell/username-20190916.log
2019-09-16 14:47:02,207 (viewer): Logged in
2019-09-16 14:47:04,462 (viewer): CMD: " LD_PRELOAD=/usr/libexec/sudo_noexec.so ls"
2019-09-16 14:47:16,559 (viewer): CMD: " LD_PRELOAD=/usr/libexec/sudo_noexec.so ssh root@172.28.40.138"
2019-09-16 14:47:24,836 (viewer): Exited

2、根据用户组设置能执行的命令 在/etc/lshell.conf文件最后添加以下配置:(根据不同的组来进行设置)

[grp:dba] #设置一个组的权限
allowed         : ['ls','ssh', 'scp','passwd']
home_path       : '/home/lshell/'       #所有组用户登录后所在的目录

其它用户组根据上面的配置继续添加字段即可。

四、其它服务器上的设置

在其它服务器上的/etc/hosts.allow中设置只允许安装了lshell的那台服务器登录(可以准备多台)

#vim /etc/hosts.allow
sshd: 堡垒机IP
#vim /etc/hosts.deny
sshd:ALL

etc/lshell.conf配置详解:

四个小节:
[global] -> lshell的系统配置 (only 1)

[default] -> lshell的默认用户配置 (only 1)

[foo] -> 指定UNIX的系统用户"foo"的特别的配置

[grp:bar] -> 指定UNIX用户组"bar"的特别的配置

当加载参数的时候遵循以下顺序:
1- User configuration
2- Group configuration
3- Default configuration

[php]

[global]

#日志路径 (默认是/var/log/lshell/)
logpath

#日志记录级别
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

#一个允许执行的命令列表,或者设置成all,则允许在user PATH中的所有命令可用
allowed

#一个路径组成的列表,所有在路径中的可执行文件都被允许
allowed_cmd_path

#更新用户的环境变量PATH
env_path

#设置用户的环境变量
env_vars

#一个非法字符或者命令组成的列表
forbidden

#history的文件名
history_file
%u -> username (e.g. '/home/%u/.lhistory')

#history文件记录的maximum size (in lines)
history_size

#登录后所处目录
home_path (deprecated)
默认是$HOME,不赞成使用,下一版会取消
%u -> username (e.g. '/home/%u')

#在登陆时打印出入门信息
intro

#用户登陆时执行的脚本
login_script

#指定用户的密码 (default is empty)
passwd

#限制能访问的目录
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

#允许远程ssh直接执行的命令。默认是不能执行
over ssh (e.g. rsync, rdiff-backup, scp, etc.)

#允许或者禁止使用scp连接 - set to 1 or 0
scp

#强制文件通过scp传输到一个特定目录
scpforce

#设置成0,则禁止scp下载(default is 1)
scp_download

#设置成0,则禁止scp上传(default is 1)
scp_upload

#允许或者禁止使用sftp连接 - set to 1 or 0
sftp

#一组命令组成的列表,用户可以执行sudo
sudo_commands

会话维持的秒数
timer

strict
日志严格记录,如果设置成1,任何unknow的命令都被禁止,并且降低用户警告数,如果设置成0,unknow命令只是警告。 (i.e. *** unknown synthax)

#警告次数
warning_counter
如果用户达到该警告次数,则会被强制退出lshell,设置成-1,则禁止计数。