e73d3c3162fbed2ed4e816450a370916.png

运维人员管理服务器基本上都是先统一登录到跳板机上,然后再由跳板机登录到服务器上进行操作。跳板机会对用户进行身份认证、账户管理、授权控制及安全审计等。

在实际工作中,我们一般会使用开源组件来部署跳板机,但是今天通过介绍下使用自建跳板机管理Linux服务器的过程,来了解Linux服务器不光可以只跑服务,如果运用得当,也可以作为我们日常使用的管理工具。

跳板机工作方式

1.用户先ssh登录到跳板机;

2.在跳板机上,通过ssh登录到目标服务器;

以上两步需要输入两遍账户,第一遍登录跳板机时输入,第二遍在登录目标服务器时输入。

注意:

所有的目标服务器需要通过防火墙或tcp wrapper只允许跳板机ssh,其他默认禁止。

88f9e7864079b0bd9fc8aabc2e83504c.png

跳板机功能

1.跳板机只提供ssh、ls等基本命令,禁止scp、sftp、管道等以防数据传输到本地,但是可以自行添加;

2.跳板机将其登录用户锁定在特定的目录下,防止用户浏览服务器数据;

3.磁盘限额,设置用户的空间,防止用户回传数据,保证跳板机只可用跳转;

4.目标服务器端操作日志审计;

跳板机实现思路

1.磁盘限额及锁定用户目录

(1)磁盘限额可以限制用户传输数据大小,因此磁盘限额必须是针对独立的适合的额定大小的新磁盘分区,而不是根目录或其他,否则配置磁盘限额没有效果;

(2)ssh的chroot功能:"ChrootDirectory"定义了用户通过认证以后的chroot目录(此目录及其所有子目录的属主必须是root,且这些目录只有root帐号可以进行写操作,其他任何组和帐号都不可写);chroot以后,sshd会将用户的工作目录转到chroot目录中用户自己的主目录。如果ChrootDirectory定义的目录下没有相应的/home/username目录,则会直接转到chroot的/目录下。

我们利用ssh的chroot及独立的磁盘分区,可以将用户限制在独立分区下,防止用户切换到其他目录操作。

2.基础命令

默认情况下的chroot目录是没有命令的,需要拷贝有限基础命令到相应的目录下,来实现不同命令的开放。

3.操作日志审计

使用logger及rsyslog,将每台服务器上的每个用户执行的命令、执行时间、登录时间、主机ip、当前切换用户等信息保存到本地文件并实时传输至日志服务器进行异地备份。

713b557f1b769fb26d09bb6c6d498949.png

跳板机实现

一、chroot环境

1.建立chroot目录中用户主目录

mkdir -p /var/chroot/home/testchown -R test.test /var/chroot/home/testchmod 700 /var/chroot/home/test

2.创建用户

useradd -d /var/chroot/home/test testpasswd test

3.chroot环境配置

chroot环境至少需要一个shell(例如sh,bash)和一些必要的系统设备文件(例如/dev/null,/dev/zero),如果要允许用户执行一些命令,那么还要准备相应的命令可执行文件和命令依赖的库文件。

mkdir -p /var/chrootcd /var/chrootmkdir {bin,dev,lib64,etc,home}mknod dev/null c 1 3mknod dev/zero c 1 5#ssh命令需要,如缺少会报告:PRNG is not seededmknod dev/random c 1 8mknod dev/urandom c 1 9#ssh命令需要,如缺少会报告:Host key verification failedmknod dev/tty c 5 0#修改/var/chroot及其子目录的属主,并修改权限chown -R root.root /var/chrootchmod -R 755 /var/chroot#允许用户写这些设备文件,不可写会有些命令报错chmod 0666 dev/{null,zero,tty}#复制/etc/passwd和/etc/group文件到/var/chroot/etc中,并删除用户自己和root以外的所有帐号。如果没有这两个文件,用登录以后会报“I have no name!”cp -p /etc/passwd  /var/chroot/etc/cp -p /etc/group  /var/chroot/etc/cat /var/chroot/etc/grouproot:x:0:test:x:516:cat /var/chroot/etc/passwd root:x:0:0:root:/root:/bin/bashtest:x:516:516::/home/test:/bin/bash#执行完毕后,test目录需重新授权chown -R test.test /var/chroot/home/testchmod 700 /var/chroot/home/test

4.配置ssh

vim /etc/ssh/sshd_config#在最后添加如下行,否则会报错Match User testChrootDirectory /var/chroot#重启sshservice sshd restart

重启ssh后,ssh仍会登录不成功。因为用户登陆后必须有一个可用的shell,因此我们需要拷贝基础命令/bin/bash,还有其他命令如ls、mkdir等。

二、拷贝基础命令

1.基础命令

 #通过一下方式查看基础命令所用的库文件 ldd /bin/ls | awk '{ print $3 }' | grep "/lib" | sort | uniq/lib64/libacl.so.1/lib64/libattr.so.1/lib64/libcap.so.2/lib64/libc.so.6/lib64/libdl.so.2/lib64/libpcre.so.1/lib64/libpthread.so.0/lib64/libselinux.so.1

通过上述方式查询,我们可以将相关基础命令拷贝到用户目录下。

2.拷贝基础命令

此处拷贝bash、ls、cp、mkdir、rm、ssh、id等基础命令

#执行拷贝命令脚本#!/bin/bash#comment:用于ssh登陆chroot后,给用户添加命令 # 要允许执行的文件列表 cmdlist="/bin/bash /usr/bin/ls /usr/bin/cp /usr/bin/mkdir /usr/bin/mv /usr/bin/rm /usr/bin/rmdir /usr/bin/ssh /usr/bin/id" # chroot路径 chroot_path="/var/chroot" # 判断依赖的库文件 lib_1=`ldd $cmdlist | awk '{ print $1 }' | grep "/lib" | sort | uniq` lib_2=`ldd $cmdlist | awk '{ print $3 }' | grep "/lib" | sort | uniq` # 复制命令文件 for i in $cmdlist do   if [ ! -d `dirname ${chroot_path}$i` ];then        mkdir -p `dirname ${chroot_path}$i`   fi   cp -a $i ${chroot_path}$i && echo "$i done" done # 复制依赖的库文件(因为是i386,所以是lib,如果是x86_64,则是lib64,) for j in $lib_1 do   if [ ! -d `dirname ${chroot_path}$j` ];then        mkdir -p `dirname ${chroot_path}$j`   fi   cp -f $j ${chroot_path}$j && echo "$j done" done for k in $lib_2 do   if [ ! -d `dirname ${chroot_path}$k` ];then        mkdir -p `dirname ${chroot_path}$k`   fi   cp -f $k ${chroot_path}$k && echo "$k done" done

拷贝完命令后,我们就可以登录了。如下:

ssh test@10.16.2.100test@110.16.2.100's password: Last login: Mon Mar 16 15:04:53 2020 from 10.16.2.102-bash-4.2$ ls#没有ll命令-bash-4.2$ ll-bash: ll: command not found-bash-4.2$ ssh root@10.16.2.133No user exists for uid 1005

此时ssh命令却无法使用,报这个错意味着系统无法通过用户数据库(可能的类型有 /etcp/passwd, /etc/group,/etc/shadow,/etc/gshadow)校验用户名是否正确。通常的解决方法是复制对应的文件到chroot目录中,将/lib64/libnss_* 等文件复制到chroot目录下的对应目录。

解决方法:

cp /lib64/libnss_* /var/chroot/lib64

另外通过以上我们看到test用户登陆后默认为”bash-4.2$”,这是由于环境配置文件导致,我们可以通过以下更改:

cp /etc/bashrc /var/chroot/etc/#复制其他用户的.bashrc 和 .bash_profilecp /home/xxx/.bashrc /var/chroot/home/test/cp /home/xxx/.bash_profile /var/chroot/home/test/
2c7c4d841fbf9fc5d75938fb34eae8e9.png

三、操作日志审计

1.配置PROMP_COMMAND

vim /etc/bashrc readonly PROMPT_COMMAND='logger -p local3.notice -t bash "$(ifconfig | grep -E "eth|em|ens" -A 1 | grep "10.16" | grep -oP "(?<=inet )[d.]+")  $(who am i |awk "{print $1" "$2" "$3" "$4" "$5}") [`pwd`] currentuser=$(whoami) command=$(history 1 | { read x cmd; echo "$cmd"; })"'source /etc/bashrc

其中:

#使我们自定义的设备,用于rsyslog调用;local3.notice #每行打印的信息打印的tag;bash #获取服务器的ipifconfig | grep -E "eth|em|ens" -A 1 | grep "10.16" | grep -oP "(?<=inet )[d.]+"#获取我们当前用户的登录信息who am i |awk "{print $1" "$2" "$3" "$4" "$5}"#列出当前所在的目录pwd#用于获取当前切换的执行命令的用户,例如我们从test 用户 sudo -i,执行命令的用户为root,但是登录的用户test,方便我们区分;whoami#用户执行的命令command

注意:

1.在/etc/bashrc或/etc/profile中添加环境变量,将应用于所有用户;

2.如果将PROMPT_COMMAND导出到用户工作区,那么对于有经验的用户就可以做赋值操作 export PROMPT_COMMAND="",这将导致记录功能当前session端不可用,所以PROMPT_COMMAND必须设置成只读的属性,readonly PROMPT_COMMAND;

2.配置rsyslog客户端

记录操作日志到本地文件

vim /etc/rsyslog.conf#添加如下行#添加local3.none*.info;mail.none;authpriv.none;cron.none;local3.none                /var/log/messages#通过local3保存到本地的文件local3.notice /var/log/audit.log#远程日志服务器,可用于同步备份#local3.notice @10.16.99.1#重启service rsyslog restart

其中:

1.local3.notice 是在logger中定义的设备,rsyslog调用并将打印信息输出至指定文件;

2.添加local3.none是避免日志写入/var/log/messages;

3.配置轮储日志

vim /etc/logrotate.d/rsyslog/var/log/audit.log{    daily    rotate 4    missingok    notifempty    nocompress    create    dateext    sharedscripts    postrotate        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true    endscript}#强制轮转logrotate -vf /etc/logrotate.d/rsyslog#查看ls /var/log|grep auditaudit.log  audit.log-20200316 vim /var/log/audit.logMar 16 16:13:11 test100 bash: 10.16.2.100  root pts/0 2020-03-16 14:23 (10.16.2.102) [/var/chroot/home] currentuser=root command=logrotate -vf /etc/logrotate.d/rsyslogMar 16 16:13:42 test100 bash: 10.16.2.100  root pts/0 2020-03-16 14:23 (10.16.2.102) [/var/chroot/home] currentuser=root command=vim /etc/logrotate.d/rsyslogMar 17 07:25:33 test100 bash: 10.16.2.100  root pts/0 2020-03-17 07:25 (10.16.2.102) [/root] currentuser=root command=vim /etc/logrotate.d/rsyslogMar 17 07:25:34 test100 bash: 10.16.2.100  root pts/0 2020-03-17 07:25 (10.16.2.102) [/root] currentuser=root command=lsMar 17 07:25:34 test100 bash: 10.16.2.100  root pts/0 2020-03-17 07:25 (10.16.2.102) [/root] currentuser=root command=ls

如果我们审计日志需要异地备份,可以设置rsyslog远程日志服务器即可,在此不多做介绍。

总结

从上述部署过程中我们可以看到,整个过程非常繁琐而且为了适配各种版本操作系统还需要修改脚本,明显已经不能作为当前运维工具的实现方式了。但是我们可以通过本次部署了解到Linux系统中的一些小操作,如chroot、磁盘限额、操作审计、日志轮储等,或许会在我们以后的运维道路上用到。

dc7e5982c046496b4931268e96954fd3.png
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐