堡垒机介绍
什么是堡垒机
堡垒机,即在一个特定的网络环境下,为了保障网络和数据不受来自外部和内部用户的入侵和破坏,而运用各种技术手段实时收集和监控网络环境中每一个组成部分的系统状态、安全事件、网络活动,以便集中报警、及时处理及审计定责。
其从功能上讲,它综合了核心系统运维和安全审计管控两大主干功能,从技术实现上讲,通过切断终端计算机对网络和服务器资源的直接访问,而采用协议代理的方式,接管了终端计算机对网络和服务器的访问。形象地说,终端计算机对目标的访问,均需要经过运维安全审计的翻译。打一个比方,运维安全审计扮演着看门者的工作,所有对网络设备和服务器的请求都要从这扇大门经过。因此运维安全审计能够拦截非法访问,和恶意攻击,对不合法命令进行命令阻断,过滤掉所有对目标设备的非法访问行为,并对内部人员误操作和非法操作进行审计监控,以便事后责任追踪。
我们也把堡垒机称为跳板机,简易的跳板机功能简单,核心功能是远程登录服务器和日志审计,但堡垒机还有资产管理(CMDB)、监控及用户权限等功能。目前比较优秀的开源软件有Jumpserver、Teleport、GateOne、CrazyEye等;商业的堡垒机功能更为强大,有齐治、Citrix XenApp等。
搭建简易的堡垒机
接下来我们尝试搭建一个简易的堡垒机,主要功能是登录内网的服务器和日志审计。
搭建堡垒机的条件是,该机器有公网ip和内网ip,其中内网和其他机器互通。
设计堡垒机的思路:
对该机器做安全限制:端口限制、登录限制(SSH)、用户和命令限制;
客户机日志审计。
下载安装jailkit实现chroot:
Jailkit下载地址:https://olivier.sessink.nl/jailkit/
[root@jinkai02 ~]# cd /usr/local/src/
[root@jinkai02 src]# wget https://olivier.sessink.nl/jailkit/jailkit-2.21.tar.bz2
[root@jinkai02 src]# yum install -y bzip2
[root@jinkai02 src]# tar jvxf jailkit-2.21.tar.bz2
[root@jinkai02 src]# cd jailkit-2.21
[root@jinkai02 jailkit-2.21]# ./configure
[root@jinkai02 jailkit-2.21]# make && make install
创建虚拟系统根目录:
[root@jinkai02 jailkit-2.21]# mkdir /home/jail
shell相关命令、库文件
[root@jinkai02 jail]#jk_init -v -j /home/jail/ basicshel
vi及vim等编辑器
[root@jinkai02 jail]#jk_init -v -j /home/jail/ editors
网络相关
[root@jinkai02 jail]#jk_init -v -j /home/jail/ netutils
SSH登录相关,这几步是将常用命令复制到 /home/jail 中
[root@jinkai02 jail]#jk_init -v -j /home/jail/ ssh
添加测试用户:
[root@jinkai02 jail]# mkdir /home/jail/usr/sbin
[root@jinkai02 jail]# cp /usr/sbin/jk_lsh /home/jail/usr/sbin/jk_lsh //拷贝虚拟系统shell
[root@jinkai02 jail]# useradd zhangsan
[root@jinkai02 jail]# passwd zhangsan
更改用户 zhangsan 的密码 。
新的 密码:
无效的密码: 密码未通过字典检查 - 它基于字典单词
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@jinkai02 jail]# jk_jailuser -m -j /home/jail zhangsan
//创建虚拟系统中用户
[root@jinkai02 jail]# cat etc/passwd
root:x:0:0:root:/root:/bin/bash
zhangsan:x:1000:1000::/home/zhangsan:/usr/sbin/jk_lsh
把zhangsan那一行的/usr/sbin/jk_lsh改为/bin/bash才能登录该虚拟系统用户
[root@jinkai02 jail]# vim etc/passwd
使用xshell登录该虚拟用户:
WARNING! The remote SSH server rejected X11 forwarding request.
Last login: Sat Dec 26 16:56:49 2020 from 192.168.111.1
bash: /usr/bin/id: No such file or directory
bash: /usr/bin/id: No such file or directory
[zhangsan@jinkai02 ~]$
成功登录后,我们查看一下
[zhangsan@jinkai02 ~]$ ll /
bash: ll: command not found
[zhangsan@jinkai02 ~]$ ls -l /
total 0
lrwxrwxrwx. 1 root root 7 Dec 26 08:43 bin -> usr/bin
drwxr-xr-x. 2 root root 44 Dec 26 08:43 dev
drwxr-xr-x. 2 root root 240 Dec 26 08:50 etc
drwxr-xr-x. 3 root root 22 Dec 26 08:46 home
lrwxrwxrwx. 1 root root 9 Dec 26 08:43 lib64 -> usr/lib64
drwxr-xr-x. 7 root root 70 Dec 26 08:45 usr
[zhangsan@jinkai02 ~]$ 按两下tab键
Display all 116 possibilities? (y or n)
! cd do fgrep let readarray ssh unalias
./ chmod done fi ln readonly suspend unset
: command echo for local return sync until
[ compgen egrep function logout rm tar vi
[[ complete elif getopts ls rmdir test vim
]] compopt else grep mapfile rsync then wait
alias continue enable gunzip mkdir scp time wget
bash coproc esac gzip mktemp sed times while
bg cp eval hash more select touch zcat
bind cpio exec help mv set trap {
break date exit history popd sh true }
builtin dd export if printf shift type
caller declare false in pushd shopt typeset
case dirs fc jobs pwd sleep ulimit
cat disown fg kill read source umask
这些就是该虚拟用户所能执行的命令
限定SSH登录:
vim /etc/ssh/sshd_config
PasswordAuthentication no yes改成no,不允许密码登录
添加防火墙规则:
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
限定登录ip:
vim /etc/hosts.allow
sshd: 192.168.111.0/24 1.1.1.1 2.2.2.2
vim /etc/hosts.deny
sshd: ALL
上面允许的可以登录,其他所有均不允许登录
接下来还要做日志审计功能,这一步需要我们在所有被登陆的机器上操作。
这里我让jinkai02作为跳板机,jinkai01作为客户机,在jinkai01上操作。
[root@jinkai01 ~]#vim /etc/hosts.allow
sshd:192.168.100.137
[root@jinkai01 ~]#vim /etc/hosts.deny
sshd:ALL
这个时候用xshell重新打开一个jinkai01的窗口,发现已经无法登陆
[root@jinkai01 ~]# mkdir /usr/local/records
[root@jinkai01 ~]# chmod 777 !$
chmod 777 /usr/local/records
[root@jinkai01 ~]# chmod +t !$
chmod +t /usr/local/records
[root@jinkai01 ~]# vim /etc/profile
添加下面内容
if [ ! -d /usr/local/records/${LOGNAME} ]
then
mkdir -p /usr/local/records/${LOGNAME} #根据登录名创建同名子文件夹
chmod 300 /usr/local/records/${LOGNAME} #赋予300权限
fi
export HISTORY_FILE="/usr/local/records/${LOGNAME}/bash_history" #指定记录命令历史的文件
export PROMPT_COMMAND='{ date "+%Y-%m-%d %T ##### $(who am i |awk "{print $1" "$2" "$5}") #### $(history 1 | { read x cmd; echo "$cmd"; })"; } >>$HISTORY_FILE' #具体记录命令历史的格式
再用xshell连接一下这台机器,上面已经限制无法登陆,可以用跳板机SSH远程登录
[root@jinkai02 jail]# ssh 192.168.111.136
root@192.168.111.136's password:
Last login: Sat Dec 26 17:27:45 2020 from 192.168.111.137
[root@jinkai01 ~]# ls /usr/local/records/
root //已经产生root登录用户的文件夹
[root@jinkai01 ~]# ls /usr/local/records/root/
bash_history
[root@jinkai01 ~]# cat /usr/local/records/root/bash_history
2020-12-26 22:18:34 ##### root pts/1 (192.168.111.137) #### ls /usr/local/records/
2020-12-26 22:18:47 ##### root pts/1 (192.168.111.137) #### ls /usr/local/records/root/
远程的一切操作都会被记录到文件里面
2020-12-26 22:20:32 ##### root pts/1 (192.168.111.137) #### w
2020-12-26 22:22:57 ##### root pts/1 (192.168.111.137) #### ls
2020-12-26 22:23:04 ##### root pts/1 (192.168.111.137) #### cat /etc/passwd
在jinkai01上创建一个普通用户
[root@jinkai01 ~]# useradd admin
[root@jinkai01 ~]# passwd admin
更改用户 admin 的密码 。
新的 密码:
无效的密码: 密码包含用户名在某些地方
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@jinkai01 ~]#
在跳板机jinkai02上用admin身份登录
[root@jinkai02 jail]# ssh admin@192.168.111.136
admin@192.168.111.136's password:
[admin@jinkai01 ~]$ ls
[admin@jinkai01 ~]$ w
22:26:19 up 5:20, 2 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.111.1 17:07 1:39 0.06s 0.04s bash
admin pts/1 192.168.111.137 22:26 3.00s 0.00s 0.00s w
[admin@jinkai01 ~]$ ls -l /usr/local/records/admin/
ls: 无法打开目录/usr/local/records/admin/: 权限不够
上面设置了文件的300权限,文件无法读取
重新回到jinkai01上查看历史记录
[root@jinkai01 ~]# cat /usr/local/records/admin/bash_history
2020-12-26 22:26:06 ##### admin pts/1 (192.168.111.137) ####
2020-12-26 22:26:17 ##### admin pts/1 (192.168.111.137) #### ls
2020-12-26 22:26:19 ##### admin pts/1 (192.168.111.137) #### w
2020-12-26 22:27:17 ##### admin pts/1 (192.168.111.137) #### ls -l /usr/local/records/admin/
2020-12-26 22:29:30 ##### admin pts/1 (192.168.111.137) #### cat /usr/local/records/admin/
这里就简单是实现了堡垒机的功能,但是这种方法是不完美的,也是可以破解的。我们想要实现比较完善的堡垒机功能,还是需要借助一些专门的工具或软件。