余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

Linux趣玩之自建跳板机

xiyangw 2023-05-14 11:19 12 浏览 0 评论


Linux趣玩之自建跳板机

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

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

跳板机工作方式

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

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

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

注意:

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

跳板机功能

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、当前切换用户等信息保存到本地文件并实时传输至日志服务器进行异地备份。

跳板机实现

一、chroot环境

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

mkdir -p /var/chroot/home/test
chown -R test.test /var/chroot/home/test
chmod 700 /var/chroot/home/test

2.创建用户

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

3.chroot环境配置

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

mkdir -p /var/chroot
cd /var/chroot
mkdir {bin,dev,lib64,etc,home}
mknod dev/null c 1 3
mknod dev/zero c 1 5
#ssh命令需要,如缺少会报告:PRNG is not seeded
mknod dev/random c 1 8
mknod dev/urandom c 1 9
#ssh命令需要,如缺少会报告:Host key verification failed
mknod dev/tty c 5 0
#修改/var/chroot及其子目录的属主,并修改权限
chown -R root.root /var/chroot
chmod -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/group
root:x:0:
test:x:516:
cat /var/chroot/etc/passwd 
root:x:0:0:root:/root:/bin/bash
test:x:516:516::/home/test:/bin/bash

#执行完毕后,test目录需重新授权
chown -R test.test /var/chroot/home/test
chmod 700 /var/chroot/home/test

4.配置ssh

vim /etc/ssh/sshd_config
#在最后添加如下行,否则会报错
Match User test
ChrootDirectory /var/chroot

#重启ssh
service 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.100
test@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.133
No 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_profile
cp /home/xxx/.bashrc /var/chroot/home/test/
cp /home/xxx/.bash_profile /var/chroot/home/test/

三、操作日志审计

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 
#获取服务器的ip
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
#用于获取当前切换的执行命令的用户,例如我们从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 audit
audit.log  audit.log-20200316 
vim /var/log/audit.log
Mar 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/rsyslog
Mar 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/rsyslog
Mar 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/rsyslog
Mar 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
Mar 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、磁盘限额、操作审计、日志轮储等,或许会在我们以后的运维道路上用到。

相关推荐

辞旧迎新,新手使用Containerd时的几点须知

相信大家在2020年岁末都被Kubernetes即将抛弃Docker的消息刷屏了。事实上作为接替Docker运行时的Containerd在早在Kubernetes1.7时就能直接与Kubelet集成使...

分布式日志系统ELK+skywalking分布式链路完整搭建流程

开头在分布式系统中,日志跟踪是一件很令程序员头疼的问题,在遇到生产问题时,如果是多节点需要打开多节点服务器去跟踪问题,如果下游也是多节点且调用多个服务,那就更麻烦,再者,如果没有分布式链路,在生产日志...

Linux用户和用户组管理

1、用户账户概述-AAA介绍AAA指的是Authentication、Authorization、Accounting,即认证、授权和审计。?认证:验证用户是否可以获得权限,是3A的第一步,即验证身份...

linux查看最后N条日志

其实很简单,只需要用到tail这个命令tail-100catalina.out输入以上命令,就能列出catalina.out的最后100行。...

解决linux系统日志时间错误的问题

今天发现一台虚拟机下的系统日志:/var/log/messages,文件时间戳不对,跟正常时间差了12个小时。按网上说的执行了servicersyslogrestart重启syslog服务,还是不...

全程软件测试(六十二):软件测试工作如何运用Linux—读书笔记

从事过软件测试的小伙们就会明白会使用Linux是多么重要的一件事,工作时需要用到,面试时会被问到,简历中需要写到。对于软件测试人员来说,不需要你多么熟练使用Linux所有命令,也不需要你对Linux...

Linux运维之为Nginx添加错误日志(error_log)配置

Nginx错误日志信息介绍配置记录Nginx的错误信息是调试Nginx服务的重要手段,属于核心功能模块(nginx_core_module)的参数,该参数名字为error_log,可以放在不同的虚机主...

Linux使用swatchdog实时监控日志文件的变化

1.前言本教程主要讲解在Linux系统中如何使用swatchdog实时监控日志文件的变化。swatchdog(SimpleWATCHDOG)是一个简单的Perl脚本,用于监视类Unix系统(比如...

syslog服务详解

背景:需求来自于一个客户想将服务器的日志转发到自己的日志服务器上,所以希望我们能提供这个转发的功能,同时还要满足syslog协议。1什么是syslog服务1.1syslog标准协议如下图这里的fa...

linux日志文件的管理、备份及日志服务器的搭建

日志文件存放目录:/var/log[root@xinglog]#cd/var/log[root@xinglog]#lsmessages:系统日志secure:登录日志———————————...

运维之日志管理简介

日志简介在运维过程中,日志是必不可少的东西,通过日志可以快速发现问题所在。日志分类日志分类,对不同的日志进行不同维度的分析。操作系统日志操作系统是基础,应用都是在其之上;操作系统日志的分析,可以反馈出...

Apache Log4j 爆核弹级漏洞,Spring Boot 默认日志框架就能完美躲过

这两天沸沸扬扬的Log4j2漏洞门事件炒得热火朝天:突发!ApacheLog4j2报核弹级漏洞。。赶紧修复!!|Java技术栈|Java|SpringBoot|Spring...

Linux服务器存在大量log日志,如何快速定位错误?

来源:blog.csdn.net/nan1996jiang/articlep/details/109550303针对大量log日志快速定位错误地方tail/head简单命令使用:附加针对大量log日志...

Linux中查看日志文件的正确姿势,求你别tail走天下了!

作为一个后端开发工程师,在Linux中查看查看文件内容是基本操作了。尤其是通常要分析日志文件排查问题,那么我们应该如何正确打开日志文件呢?对于我这种小菜鸡来说,第一反应就是cat,tail,vi(或...

分享几款常用的付费日志系统,献给迷茫的你!

概述在前一篇文章中,我们分享了几款免费的日志服务器。他们各有各的特点,但是大家有不同的需求,有时免费的服务器不能满足大家的需要,下面推荐几款付费的日志服务器。1.Nagios日志服务器Nagio...

取消回复欢迎 发表评论: